§ 16. Тып даных структура (struct)

16.3. Выкарыстанне структур для апісання даты і часу

Прыклад 16.12. Бягучы час зададзены ў гадзінах, мінутах і секундах. Колькі часу будзе праз k секунд?

Этапы выканання задання

I. Зыходныя даныя: v — структура, якая апісвае час, k — колькасць секунд.

II. Вынік: новы час.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Створым дзве функцыі: tm_to_sek і sek_to_tm для пераводу часу ў секунды і секунд у фармат часу (гадзіны, мінуты, секунды)
.

2.1.Перавядзём бягучы час у секунды. Для гэтага падсумуем колькасць гадзін, памножаную на 3600 (колькасць секунд у гадзіне), колькасць мінут, памножаную на 60, і колькасць секунд.
2.2. Павялічым секунды
2.3. Перавядзём секунды ў фармат часу. Секунды — гэта астача ад дзялення на 60 агульнай колькасці секунд. Мінуты — гэта астача ад дзялення колькасці мінут на 60.

3. Вывад выніку.

IV. Апісанне пераменных: k – int, v – struct.

Прыклад 16.13. Зададзены дзве даты. Вызначыць колькасць дзён паміж імі.

Этапы выканання задання

I. Зыходныя даныя: d1, d2 — структуры, якія апісваюць даты.

II. Вынік: колькасць дзён паміж двума датамі.

III. Алгарытм рашэння задачы.

  1. Увод зыходных даных.
  2. Шмат у якіх праграмах (напрыклад, у Excel) дата захоўваецца ў выглядзе ліку. Гэты лік — колькасць дзён, якія прайшлі ад якой-небудзь пачатковай даты. Часта за пачатак адліку бярэцца дата 01.01.1900. Перавядзём кожную дату ў цэлы лік. Разлік будзем весці ад 01.01.1900. Тады парадкавы нумар дня (d.m.g) можна палічыць па формуле:

begin mathsize 18px style straight N space equals space straight d space plus space straight d subscript 1 space plus space straight d subscript 2 space plus space... space plus space straight d subscript straight m space minus space 1 end subscript space plus space left parenthesis straight g space minus space 1900 right parenthesis space asterisk times space 365 space plus space left parenthesis straight g space – space 1900 right parenthesis divided by 4 comma end style

дзе d  — нумар дня ў даце,  d1, d2, ... dm – 1 — колькасць дзён у месяцах, якія папярэднічаюць зададзенаму, (y – 1900) * 365  — колькасць дзён за поўны мінулы год да бягучай даты, (g – 1900)/4 — колькасць дзён, якія трэба дабавіць за мінулыя высакосныя гады. Формула будзе правільнай для дат ад 01.01.1900 да 28.02.2100. (2100 год не з’яўляецца высакосным, паколькі 2100 дзеліцца на 100, але не дзеліцца на 400).

3. Створым функцыю date_to_int.
4. Вылічым парадкавыя нумары для кожнай даты
.
5. Знойдзем рознасць паміж двума парадкавымі нумарамі
.
6. Вывад выніку
.

IV. Апісанне пераменных: d1, d2 – struct.

Прыклад 16.12.

V. Праграма:

#include <iostream>

 

using namespace std;

 

struct vremja

{

  int ch, m, s;

};

 

int vr_to_sek(vremja t)

{

  int N;

  N = t.ch * 3600 +t.*60 + t.s;

  return N;

}

 

vremja sek_to_vr (int N)

{

  vremja t;

  t.= N % 60;

  t.= N / 60 %60;

  t.ch = N / 3600 % 24;

  return t;

}

 

int main()

{

  vremja v;

  cout << "vremja" << endl;

  cin >> v.ch >> v.>> v.s;

  int k;

  cout << "k = ";

  cin >> k;

  int sek = vr_to_sek(v);

  sek += k;

  vremja v1 = sek_to_vr(sek);

  cout << v1.ch << ":";

  cout << v1.<< ":";

  cout << v1.<< endl;

  return 0;

}

 VI. Тэсціраванне.

Прыклад 16.13.

V. Праграма:

#include <iostream>

#include <vector>

 

using namespace std;

 

struct date

{

  int d, m ,g;

};

int date_to_int(date t)

{

  vector <int> d = {31, 28, 31, 30, 
     31, 30, 31, 31, 30, 31, 30, 31};

  int N = t.;

  for (int i = 0; i < t.- 1; i++)

    N += d[i];

  N += (t.- 1900) * 365; 

  N += (t.- 1900) / 4;

  if (t.!= 1900 && t.% 4 == 0 &&

   (t.== 1 || t.==2 && t.< 29))

    N--;

  return N;

}

 

int main()

{

  date d1, d2;

  cout << "1 data" << endl;

  cin >> d1.>> d1.>> d1.g;

  cout << "2 data" << endl;

  cin >> d2.>> d2.>> d2.g;

  int n_d1 = date_to_int(d1);

  int n_d2 = date_to_int(d2);

  int k = abs(n_d1 - n_d2);

  cout << " mezdu datami " ;

  cout << k <<  " dnei" << endl;

  return 0;

}

 VI. Тэсціраванне.

У функцыі пераўтварэння неабходна дадатковая праверка для выпадку, калі бягучы год з’яўляецца высакосным. Тады дадатковы нумар павінен быць дабаўлены толькі да дат пасля 28 лютага. 1900 г. выключаецца, паколькі ён не з’яўляецца высакосным.