Печатать книгуПечатать книгу

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

Сайт: Профильное обучение
Курс: Інфарматыка. 10 клас (Павышаны ўзровень)
Книга: § 16. Тып даных структура (struct)
Напечатано:: Гость
Дата: Пятница, 3 Май 2024, 20:46

16.1. Апісанне структур

Прыкладам структуры можа паслужыць любы аб’ект, які вызначаецца наборам сваіх характарыстык. Напрыклад, пункт на плоскасці вызначаецца абсцысай і ардынатай, дата — днём, месяцам і годам, для кнігі такімі характарыстыкамі могуць быць: аўтар, назва, год выдання, колькасць старонак і г. д. Для апісання такіх аб’ектаў на мове праграміравання С++ выкарыстоўваецца ключавое слова struct (структура).

Структура ўяўляе сабой складаны тып даных, складзены з простых тыпаў, які дазваляе выкарыстоўваць групу звязаных паміж сабой даных як адзінае цэлае. Асобны элемент структуры называюць полем.

Агульная форма аб’яўлення структуры:

struct імя_тыпу

{

  тып_1  элемент_1;

  тып_2  элемент_2;

  тып_n  элемент_n;

};

Апісваецца структура да функцыі main. Пасля закрывальнай фігурнай дужкі «}» у аб’яве структуры абавязкова ставіцца кропка з коскай.

У прыкладзе 16.1 прыведзена апісанне структур. Апісанне структуры стварае новы тып даных. Для таго каб выкарыстоўваць структуру, трэба апісаць пераменную адпаведнага тыпу (прыклад 16.2).

Ініцыялізаваць структуру можна, прысвоіўшы яе пераменным значэнні з дапамогай сінтаксісу ініцыялізацыі  (аналагічна ініцыялізацыі масіваў): у фігурных дужках перадаюцца значэнні для элементаў структуры ў тым парадку, у якім яны апісаны (прыклад 16.3).

Для структур вызначана адзіная аперацыя — прысвойванне. Усе астатнія дзеянні пры апрацоўцы структур адбываюцца з яе палямі. Зварот да поля структуры адбываецца праз кропку «.» (прыклад 16.4). З палямі структуры можна выконваць усе  дзеянні, вызначаныя для тыпу, якім апісана поле.

У якасці поля структуры можа быць выкарыстана іншая структура. Яна павінна быць апісана да таго, як выкарыстоўваецца  (прыклад 16.5). Пры выкарыстанні структур асяроддзе праграміравання выводзіць падказку са спісам усіх палёў структуры пасля таго, як карыстальнік паставіць кропку. Імя поля можна выбраць са спіса (прыклад 16.6).

Структуры могуць перадавацца ў функцыі як параметры. Функцыя можа вяртаць значэнне ў выглядзе структуры.

Прыклад 16.1. Апісанне структур.

Структура для апісання пункта на плоскасці:

struct tchk

{

  double x, y;

};

 Структура для апісання даты:

struct date

{

  int d, m, g;

};

Структура для апісання кнігі:

struct kniga

{

  string avt, nazv;

  int str, god;

};

Структура, што апісвае студэнта, які паступіў у ВНУ па выніках ЦТ:

struct student

{

  string fam, gorod;

  int god_r;

  vector <int> otm = vector<int>(3);

  int sr_bal;

};

У дадзеным прыкладзе для кожнага студэнта захоўваецца яго прозвішча (fam), горад, з якога ён прыехаў (gorod), год нараджэння (god_r). У вектары otmх[1] захоўваюцца тры адзнакі, атрыманыя на ЦТ, поле sr_bal прызначана для захоўвання сярэдняга бала атэстата.

Прыклад 16.2. Апісанне пераменных тыпу структура.

tchk A, B;

date d1, d2;

kniga K;

vector <student> gruppa (30);

Тут апісаны пераменныя А і В тыпу tchk (два пункты); пераменныя d1 і d2 тыпу date (дзве даты); пераменная K тыпу kniga і пераменная gruppa, што з’яўляецца масівам, які змяшчае апісанне для 30 студэнтаў.

Прыклад 16.3. Ініцыялізацыя структуры:

= {3.2, -4.1};

= {"Н.Я.Виленкин", "Комбинаторика", 400, 2013};

Пункт А мае каардынаты (3.2; –4.1): кніга K — «Комбинаторика», аўтар — Н. Я. Виленкин, у ёй 400 старонак, выдадзена ў 2013 г.

Прыклад 16.4. Зварот да палёў структуры.

B.= 1; B.= -1;

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

if (K.str > 100);

cout << gruppa[2].otm[1]

Прыклад 16.5. Апісанне структуры для захоўвання адрэзка, канцы якога з’яўляюцца пунктамі.

struct otrezok

{

  tchk beg, en;

};

Выкарыстанне:

otrezok AB;

AB.beg.= 0;

AB.beg.= 0;

AB.en.= 2;

AB.en.= -3;

Або так

tchk A = {0,0}, B = {2, -3};

otrezok AB = {A, B};

Прыклад 16.6. Падказка сістэмы.



[1] Пры апісанні вектара ў якасці поля структуры нельга ініцыялізаваць элементы даных адразу ў дужках (vector <int> otm(3)), трэба прысвоіць полю ініцыялізуемае значэнне.

16.2. Выкарыстанне структур для апісання геаметрычных аб’ектаў

Самым простым геаметрычным аб’ектам на плоскасці з’яўляецца пункт, які задаецца сваімі каардынатамі. Пункт апісаны ў прыкладзе 16.1. Пары пунктаў на плоскасці вызначае адрэзак, які апісаны ў прыкладзе 16.5.

Яшчэ адным важным геаметрычным аб’ектам на плоскасці з’яўляецца прамая. У матэматыцы выкарыстоўваюць розныя спосабы апісаць прамую з дапамогай ураўненняў. Ураўненне прамой на плоскасці ў прамавугольнай сістэме каардынат — гэта некаторае ўраўненне з дзвюма пераменнымі x і y, якое ператвараецца ў тоеснасць пры падстаноўцы ў яго каардынат любога пункта гэтай прамой. Любая форма ўраўнення прамой мае параметры. Выкарыстоўваючы параметры ўраўнення, можна апісаць адпаведную структуру (прыклад 16.7). Розныя формы ўраўнення прамой (у большасці выпадкаў) могуць быць прыведзены адна да адной, паколькі яны апісваюць адзін і той жа аб’ект. Выкарыстанне той ці іншай формы ўраўнення прамой залежыць ад задачы. Ураўненне прамой у агульным выглядзе з’яўляецца найбольш універсальным. Любая іншая форма ўраўнення прамой заўсёды можа быць прыведзена да агульнага ўраўнення прамой.

Прыклад 16.8. Вядомы каардынаты двух пунктаў, праз якія праходзіць прамая. Атрымаць запіс ураўнення гэтай прамой у агульным выглядзе.

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

I. Зыходныя даныя: пераменная p1 (структура, якая апісвае ўраўненне прамой, што праходзіць праз два пункты).

II. Вынік: пераменная p2 (структура, якая апісвае ўраўненне прамой у агульным выглядзе).

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

  1. Увод зыходных даных. Уводзім каардынаты двух пунктаў і ствараем з іх структуру  p1.
  2. Для таго каб з адной структуры атрымаць іншую, створым функцыю tchk_to_pr.
  3. Для атрымання адпаведных каэфіцыентаў выканаем наступныя тоесныя пераўтварэнні ўраўнення прамой, якая праходзіць праз два пункты.

begin mathsize 18px style left parenthesis x space – space x subscript 1 right parenthesis left parenthesis y subscript 2 – space y subscript 1 right parenthesis space equals space left parenthesis y space – space y subscript 1 right parenthesis left parenthesis x subscript 2 space – space x subscript 1 right parenthesis space left right double arrow
left right double arrow left parenthesis y subscript 2 – space y subscript 1 right parenthesis x space minus left parenthesis y subscript 2 space minus space y subscript 1 right parenthesis space x subscript 1 space minus space left parenthesis x subscript 2 minus space x subscript 1 right parenthesis space y space plus space left parenthesis x subscript 2 minus space x subscript 1 right parenthesis space y subscript 1 equals 0 end style

begin mathsize 18px style A space equals space y subscript 2 space minus space y subscript 1 semicolon space space space B space equals space x subscript 1 space minus space x subscript 2 semicolon space space C space equals space space y subscript 1 x subscript 2 space minus space x subscript 1 y subscript 2 end style

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

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

Прыклад 16.9. Вядомы каардынаты пункта і каэфіцыенты ўраўнення прамой у агульным выглядзе. Вызначыць, ці належыць пункт прамой.

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

I. Зыходныя даныя: пераменная AB (структура, якая апісвае ўраўненне прамой у агульным выглядзе), A(структура, якая апісвае пункт).

II. Вынік: паведамленне «так» або «не».

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

  1. Увод зыходных даных.
  2. Для таго каб праверыць, ці ляжыць пункт на прамой, створым функцыю tchk_na_pr.
  3. Пункт ляжыць на прамой, калі пры падстаноўцы яе каардынат ва ўраўненне прамой атрымаем правільную роўнасць (для агульнага ўраўнення павінны атрымаць 0). Паколькі вылічэнні праходзяць у рэчаісных ліках, то будзем правяраць, што атрыманае значэнне па модулі меншае, чым 10-6. Такой дакладнасці на практыцы звычайна бывае дастаткова.
  4. Вывад выніку.

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

Прыклад 16.10. Вядомы каардынаты канцоў адрэзка і каэфіцыенты ўраўнення прамой у агульным выглядзе. Вызначыць, ці маюць прамая і адрэзак агульныя пункты.

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

I. Зыходныя даныя: пераменная CD (структура, якая апісвае ўраўненне прамой у агульным выглядзе), АB (структура, якая апісвае адрэзак).

II. Вынік: паведамленне «так» або «не».

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

  1. Увод зыходных даных. Структуру AB ствараем па ўведзеных каардынатах двух пунктаў.
  2. Для таго каб праверыць, ці маюць прамая і адрэзак агульныя пункты, створым функцыю  otr_na_pr.
  3. Адрэзак мае з прамой агульныя пункты, калі выконваецца адна з умоў:

3.1. Адзін з канцоў адрэзка ляжыць на прамой.
3.2. Абодва канцы адрэзка ляжаць на прамой.
3.3. Прамая перасякае адрэзак.

  1. Калі пункт ляжыць на прамой, то пры падстаноўцы яго каардынат ва ўраўненне ў левай частцы агульнага ўраўнення прамой атрымліваем 0. Калі пункт не належыць прамой, то атрымліваем адну з дзвюх няроўнасцей: begin mathsize 16px style A x space plus space B y space plus space C space less than space 0 end style  або A x space plus space B y space plus space C space greater than space 0. Кожная з няроўнасцей вызначае паўплоскасць адносна зададзенай прамой. Прамая перасякае адрэзак, калі яго канцы знаходзяцца ў розных паўплоскасцях адносна зададзенай прамой.
  2. Паколькі вылічэнні праходзяць у рэчаісных ліках, то будзем правяраць, што атрыманае значэнне па модулі меншае, чым 10-6. Такой дакладнасці на практыцы звычайна бывае дастаткова.
  3. Вывад выніку.

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

Прыклад 16.11. Многавугольнік зададзены спісам сваіх вяршынь у парадку абходу. Для кожнай вяршыні вядомы яе каардынаты на плоскасці. Знайсці перыметр многавугольніка.

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

I. Зыходныя даныя: n — колькасць пунктаў, a — масіў пунктаў.

II. Вынік: перыметр многавугольніка.

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

  1. Увод зыходных даных. Ствараем масіў з пунктаў і ўводзім каардынаты.
  2. Кожная старана многавугольніка — гэта адрэзак, які злучае вяршыні з суседнімі нумарамі. Для таго каб не апрацоўваць асобна старану, якая злучае апошнюю вяршыню з пачатковай, дададзім каардынаты пачатковай вяршыні ў канец вектара.
  3. Для вылічэння перыметра створым функцыю, якая будзе вылічаць даўжыню адрэзка.
  4. У цыкле перабяром пары суседніх вяршынь і вылічым іх даўжыні. Сума даўжынь — шуканы перыметр.
  5. Вывад выніку. 

IV. Апісанне пераменных: n – int, a – vector<tchk>.

Прыклад 16.7. Формы запісу ўраўнення прамой і адпаведныя ім апісанні структур.

Ураўненне прамой з вуглавым каэфіцыентам: y = kx + l. Уравнение не позволяет описать прямую, параллельную оси OY.

struct pr_ugl_kf

{

  double k, l;

};

Ураўненне прамой у адрэзках: begin mathsize 16px style x over a space plus space y over b space equals space 1. end style Параметры а і b — велічыні адрэзкаў, якія адсякаюцца прамой на восях каардынат. Ураўненне не дазваляе апісаць прамую, якая праходзіць праз пачатак каардынат.

struct pr_v_otr

{

  double a, b;

};

Ураўненне прамой, якая праходзіць праз два пункты begin mathsize 16px style A left parenthesis x subscript 1 comma space space y subscript 1 right parenthesis end style) і  B left parenthesis x subscript 2 comma space space y subscript 2 right parenthesis:

begin mathsize 16px style left parenthesis x space minus space x subscript 1 right parenthesis left parenthesis y subscript 2 space minus space y subscript 1 right parenthesis space equals space left parenthesis y space minus space y subscript 1 right parenthesis left parenthesis x subscript 2 space minus space x subscript 1 right parenthesis end style

struct pr_2_tchk

{

  tchk A, B; 

};

Агульнае ўраўненне прамой:

struct pr

{

  double A, B, C;

};

Прыклад 16.8.

V. Праграма:

#include <iostream>

 

using namespace std;

 

struct tchk

{

  double x, y;

};

 

struct pr_2_tchk

{

    tchk A, B;

};

 

struct pr

{

    double A, B, C;

};

 

pr tchk_to_pr(pr_2_tchk t)

{

  pr t1;

  t1.= t.B.- t.A.y;

  t1.= t.A.- t.B.x;

  t1.= t.A.* t.B.- t.A.* t.B.y;

  return t1;

}

 

int main()

{

  tchk A, B;

  cout << "x1, y1" << endl;

  cin >> A.>> A.y;

  cout << "x2, y2" << endl;

  cin >> B.>> B.y;

  pr_2_tchk p1 = {A, B};

  pr p2 = tchk_to_pr (p1);

  cout << "obschee uravnenie: ";

  cout << p2.<< "x + ";

  cout << p2.<< "y + " << p2.C;

  cout << " = 0" << endl;

  return 0;

}

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

Прыклад 16.9.

V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

struct tchk

{

  double x, y;

};

 

struct pr

{

  double A, B, C;

};

 

bool tchk_na_pr(pr p, tchk t)

{

  double z = p.* t.+ p.* t.+ p.C;

  return (abs(z) <= 0.000001);

}

 

int main()

{

  tchk A;

  cout << "koord x, y" << endl;

  cin >> A.>> A.y;

  pr AB;

  cout << "koef A, B, C" << endl;

  cin >> AB.>> AB.>> AB.C;

  if (tchk_na_pr(AB, A))

    cout << "da" << endl;

  else

    cout << "net" << endl;

  return 0;

}

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

Прыклад 16.10.

V. Праграмма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

struct tchk

{

  double x, y;

};

 

struct otrezok

{

  tchk beg, en;

};

 

struct pr

{

  double A, B, C;

};

 

bool otr_na_pr(pr p, otrezok t)

{

  double z1, z2;

  z1 = p.* t.beg.+ p.* t.beg.+ p.C;

  z2 = p.* t.en.+ p.* t.en.+ p.C;

  return (z1 * z2 < 0 ||

        abs(z1 * z2) <= 0.000001);

}

 

int main()

{

  tchk A, B;

  cout << "koord x1, y1" << endl;

  cin >> A.>> A.y;

  cout << "koord x2, y2" << endl;

  cin >> B.>> B.y;

  otrezok AB = {A, B};

  pr CD;

  cout << "koef A, B, C" << endl;

  cin >> CD.>> CD.>> CD.C;

  if (otr_na_pr(CD, AB))

    cout << "da" << endl;

  else

    cout << "net" << endl;

  return 0;

}

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

Адрэзак цалкам ляжыць на прамой.

Адзін канец адрэзка ляжыць на прамой.

Прамая перасякае адрэзак.

Няма агульных пунктаў.

Прыклад 16.11.

V. Праграма:

#include <iostream>

#include <vector>

#include <cmath>

 

using namespace std;

 

struct tchk

{

  double x, y;

};

 

double dlina (tchk A, tchk B)

{

  double dl;

  dl = sqrt((A.- B.x) * (A.- B.x) +

            (A.- B.y) * (A.- B.y));

  return dl;

}

 

int main()

{

  int n;

  cout << "n = ";

  cin >> n;

  vector <tchk> a(n);

  for (int i = 0; i < n; i++)

    cin >> a[i].>> a[i].y;

  a.push_back(a[0]);

  double p = 0;

  for (int i = 0; i < n; i++)

    p += dlina(a[i], a[+ 1]);

  cout << "p = " << p << endl;

  return 0;

}

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

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 г. выключаецца, паколькі ён не з’яўляецца высакосным. 

Пытанні к параграфу

1. Які тып даных называюць структурай?

2. Як называецца асобны элемент структуры?

3. Як апісваюцца структуры?

4. Якія структуры можна выкарыстоўваць для апісання геаметрычных аб’ектаў?

5. Якія структуры можна выкарыстоўваць для апісання даты і часу?

Практыкаванні

    

1. Напішыце праграму, якая пераўтварае ўраўненне прамой у адрэзках у агульнае ўраўненне прамой.

2. Напішыце праграму, якая пераўтварае агульнае ўраўненне прамой ва ўраўненне прамой з вуглавым каэфіцыентам. Прадугледзець праверку выпадку, калі гэта зрабіць немагчыма.

3. Напішыце праграму, якая пераўтварае ўраўненне прамой, што праходзіць праз два пункты, ва ўраўненне прамой з вуглавым каэфіцыентам. Калі гэта немагчыма, то атрымаць ураўненне ў выглядзе х = х0.

4. Напішыце праграму, якая вызначыць узаемнае размяшчэнне пункта з каардынатамі (x0, y0) і прамой у = kx + b.

5. Напішыце праграму, якая вызначыць узаемнае размяшчэнне пунктаў з каардынатамі (x1, y1), (x2, y2) і прамой Ax + By + C = 0.

6. Напішыце праграму, якая вызначыць узаемнае размяшчэнне пункта з каардынатамі (x0, y0) і дзвюх паралельных прамых Ax + By + C1 = 0  і Ax + By + C2 = 0.

7. Многавугольнік зададзены спісам сваіх вяршынь у парадку абходу. Для кожнай вяршыні вядомы яе каардынаты на плоскасці. Знайдзіце даўжыню самай кароткай дыяганалі многавугольніка.

8. Многавугольнік зададзены спісам сваіх вяршынь у парадку абходу. Для кожнай вяршыні вядомы яе каардынаты на плоскасці. Атрымайце масіў прамых, зададзеных ураўненнем прамой, якая праходзіць праз два пункты. Кожная прамая праходзіць праз старану многавугольніка. Пераўтварыце кожнае ўраўненне ў агульнае ўраўненне прамой. Выведзіце гэтыя ўраўннні. * Ці ёсць у многавугольніка дзве розныя стараны, якія ляжаць на адной прамой (гэта можа быць у нявыпуклага многавугольніка)?

9. Для праверкі таго, што пункт (x0, y0) ляжыць унутры трохвугольніка, зададзенага вяршынямі (x1, y1), (x2, y2), (x3, y3), можна выкарыстаць наступны алгарытм:

    1. Правесці прамую праз пункты (x1, y1), (x2, y2).
    2. Калі пункты (x0, y0) і (x3, y3) ляжаць у розных паўплоскасцях адносна гэтай прамой, то пункт (x0, y0) ляжыць звонку.
    3. Калі пункты (x0, y0) і (x3, y3) ляжаць у адной паўплоскасці, то выканаць аналагічныя праверкі для астатніх вяршынь.
    4. Калі для ўсіх трох прамых пункт (x0, y0) і астатняя вяршыня ляжаць у адной паўплоскасці, то пункт (x0, y0) унутры трохвугольніка

Реализовать описанный выше алгоритм.

10*. Напісаць праграму для праверкі, ці ляжыць пункт (x0, y0) унутры выпуклага многавугольніка.

11. Уводзяцца два значэнні часу: гадзіны, мінуты, секунды. Колькі секунд прайшло паміж імі? Час паказаны ў межах адных сутак.

12. Уводзяцца два значэнні часу: гадзіны, мінуты, секунды. Паміж імі магло прайсці больш за суткі (але не больш за двое сутак). Колькі прайшло часу паміж імі? Адказ атрымаць у гадзінах, мінутах і секундах.

13. Уводзіцца дата: дзень, месяц, год. Паменшыць уведзеную дату на t дзён.

14. Дадзена дата. Вывесці, колькі дзён да яе засталося (або колькі дзён прайшло).

15. Уводзіцца дата: месяц, год. Вызначыць дзень тыдня. Для вызначэння дня тыдня можна выкарыстаць наступныя формулы:

a = (14 − месяц) / 12
y = год − a
m = месяц + 12 * a − 2
Дзень Тыдня = (дзень + y + y / 4 − y / 100 + y / 400 + (31 * m) / 12) % 7
Усе дзяленні цэлалікавыя. Вынік: 0 — нядзеля, 1 — панядзелак і г. д.

16. Дадзена дата. Згенерыраваць расклад з гэтай даты на t дзён па такім прынцыпе: суткі праз трое. Калі рабочы дзень прыпадае на нядзелю, то ён пераносіцца на панядзелак. У выніку паказаць даты рабочых дзён.

17*.  Дадзены рэжым работы інтэрнэт-магазіна. ПН 9:00 — 21:00, АЎТ 9:00 — 21:00, С 9:00 — 21:00, ЧЦ 9:00 — 21:00, ПТ 9:00 — 21:00, СБ 10:00 — 18:00, Н 10:00 — 18:00. І дадзены дата і час. Вызначыць, ці працуе ў гэты час магазін і колькі мінут да канца рабочай змены.