неділя, 5 травня 2019 р.

Алгоритми дій з лінійними масивами


https://inf8klas.blogspot.com/2018/03/a-pascal.html

Слова, зміст яких є синонімічними 
з точки зору мови програмування Pascal:
рядок чисел=лінійний масив=вектор з координатами

Практична робота 1. 
Алгоритми дій з лінійними масивами мовою Pascal

program Vector1;     {Алгоритм підрахунків координат лінійної комбінації трьох векторів(напрямлених відрізків) або дії з  елементами числового масиву}
const  n=2;    var a, b,c,d: array [1..n] of  real;    i: integer;   
sk1, sk4, sk2, sk3real;
begin   writeln ( 'Вводяться    ', n,  '-i   випадкові коорд-ти для трьох векторів:');
 for   i:=1  to  n   do  begin  
a[i]:=-40*random(4+i);  write(' а[', i, ']=: 'a[i]);  writeln('     ');  writeln; 
b[i]:=50*random(5+i);  write(' b[', i, ']=: ', b[i]);  writeln('     ');  writeln;
c[i]:=-60*random(6+i);  write(' c[', i, ']=: ', c[i]);  writeln('   '); writeln;  end;
 writeln(' ***  ');
writeln; writeln ( 'Це ', n,  ' –i  координати нового вектора d=-5*а+8*b-4*c:');
  d[1]:=0; d[2]:=0;       for i:=1 to n do  begin  d[i]:=-5*a[i]+8*b[i]-4*c[i];
 write('d[', i, ']= ', d[i]);  write('   '); end; writeln('***');
writeln( 'Це  модулі(або довжини) векторів ab,d,c:');
  sk1:=sqrt(a[1]*a[1]+a[2]*a[2]);  writeln('довжина |a| = ', sk1); 
  sk2:=sqrt(b[1]*b[1]+b[2]*b[2]);   writeln(' довжина |b| = ', sk2);
  sk4:=sqrt(d[1]*d[1]+d[2]*d[2]);   writeln(' довжина |d| = ', sk4); 
  sk3:=sqrt(c[1]*c[1]+c[2]*c[2]);   writeln(' довжина |с| = ', sk3);  writeln(' ***  ');
writeln;
 writeln ( 'Це 4 різні скалярні добутки для таких пар векторів: ab, ас, сb, ad:');
  sk1:=a[1]*b[1]+a[2]*b[2];  writeln(' ab = ', sk1);  writeln('   ');
  sk2:=a[1]*c[1]+a[2]*c[2];   writeln(' ас = ', sk2);  writeln('   ');
  sk3:=b[1]*c[1]+b[2]*c[2];   writeln(' bс = ', sk3);  writeln('   ');
  sk4:=d[1]*a[1]+d[2]*a[2];   writeln(' ad = ', sk4);  writeln('   '); writeln('  ****  ');
writeln;
writeln ( 'Це косинус кута між  такими парами векторів  a та b:');
  sk1:=sk1/((a[1]*a[1]+a[2]*a[2])*(b[1]*b[1]+b[2]*b[2]));
writeln(' cos(a,b)= ', 10000*sk1);
if sk1>0 then writeln('кут(a,b) - гострий'); 
if sk1=0 then writeln('кут(a,b) - прямий'); 
if sk1<0 then writeln('кут(a,b) - тупий'); 
writeln ( 'Це косинус кута між  такими парами векторів с та b:');
  sk3:=sk3/((c[1]*c[1]+c[2]*c[2])*(b[1]*b[1]+b[2]*b[2]));
writeln(' cos(c,b)= ', 10000*sk3);
if sk3>0 then writeln('кут(с,b) - гострий');
if sk3=0 then writeln('кут(с,b) - прямий');
if sk3<0 then writeln('кут(с,b) - тупий');
writeln ( 'Це косинус кута між  такими парами векторів а  i с:');
  sk2:=sk2/((a[1]*a[1]+a[2]*a[2])*(c[1]*c[1]+c[2]*c[2]));
writeln(' cos(a,c)= ', 10000*sk2);
if sk2>0 then writeln('кут(a,с) - гострий');
if sk2=0 then writeln('кут(a,с) - прямий');
if sk2<0 then writeln('кут(a,с) - тупий');
writeln('  ****  ');
writeln; end.

****************************

program SORT10;{Швидке сортування лінійного масиву по зростанню}
var a: array [1..10] of integer; {Масив елементів}
    n: integer;

procedure QuickSort (L, R: Integer); {Швидке сортування масиву A []}
var i, j, x, y: integer;
begin
  i:=l; j:=r;
  x:=a[(l+r) div 2];
  repeat
    while (A[i]<x) do i:=i+1;;
    while (x<A[j]) do j:=j-1;
    if (i<=j) then
    begin
      y:=A[i]; a[i]:=a[j]; a[j]:=y;
      i:=i+1; j:=j-1;
    end;
  until(i>j);
  if (l<j) then QuickSort(l,j);
  if (i<r) then QuickSort(i,r);
end;

begin
     writeln('введіть 10 елементів масиву:');
     for n:=1 to 10 do {readln(a [n]);} a[n]:=random(200);
     writeln('Початкове розташування елементів в масиві A'); writeln;
     for n:=1 to 10 do write('a[',n, ']:=', a[n],'   '); writeln;
     QuickSort(1, 10); {На вході: ліва і права межа сортування}
     writeln('вигляд масиву А після сортування:'); writeln;
     for n:=1 to 10 do write('a[',n, ']:=', a[n],'    ');
end.

*****************************************

Практична робота 2.
 Алгоритми з  лінійними масивами мовою Pascal

program Vector2;     {Алгоритм підрахунків координат лінійних комбінацій  двох векторів(напрямлених відрізків) або дії з  елементами числового масиву}
const  n=2;    var tp,w,v,h: array [1..n] of  real;   s, i: integer;   
s1, s4, s2, s3real;
begin   writeln ( 'Вводяться    ', n,  '-i   випадкові коорд-ти для трьох векторів:');
 for   i:=1  to  n   do  begin  
t[i]:=-90*random(11);  write(' t[', i, ']=: ', t[i]);  writeln('     ');  writeln; 
p[i]:=30*random(10);  write(' p[', i, ']=: ', p[i]);  writeln('     ');  writeln;
w[i]:=-70*random(8);  write(' w[', i, ']=: ', w[i]);  writeln('   '); writeln;  end;
 writeln(' ***  '); writeln;
writeln ( 'Це ', n,  ' –i  координати 1-ого нового вектора h=2.6t/9+3.85p/7-5.25w/17:');
  h[1]:=0; h[2]:=0;       for i:=1 to n do  begin  h[i]:=2.6*t[i]/9+3.85*p[i]/7-5.25*w[i]/17;
 write('h[', i, ']= ', h[i]);  write('   '); end; writeln('***');
writeln(' ***  '); writeln;
writeln ( 'Це ', n,  ' –i  координати 2-ого нового вектора v=(t+p-w)(2.8h/1.5+6.5w/6.9):');
  v[1]:=0; v[2]:=0;   for i:=1 to n do  begin  v[i]:=(t[i]+p[i]-w[i])(2.8*h[i]/1.5+6.5*w[i]/6.9);
 write('v[', i, ']= ', v[i]);  write('   '); end; writeln('***');
writeln( 'Це  модулі(або довжини) векторів tp,w,h:');
  s1:=sqrt(t[1]*t[1]+t[2]*t[2]);  writeln('довжина |t| = ', s1); 
  s2:=sqrt(p[1]*p[1]+p[2]*p[2]);   writeln(' довжина |p| = ', s2);
  s4:=sqrt(w[1]*w[1]+w[2]*w[2]);   writeln(' довжина |w| = ', s4); 
  s3:=sqrt(h[1]*h[1]+h[2]*h[2]);   writeln(' довжина |h| = ', s3);  writeln(' ***  ');
writeln;
 writeln ( 'Це три  скалярні добутки для таких пар векторів: tptwwp, hv:');
  s1:=t[1]*p[1]+t[2]*p[2];  writeln(' tp = ', s1);  writeln('   ');
  s2:=t[1]*w[1]+t[2]*w[2];   writeln(' tw = ', s2);  writeln('   ');
  s3:=w[1]*p[1]+w[2]*p[2];   writeln(' wp = ', s3);  writeln('   ');
  s4:=h[1]*v[1]+h[2]*v[2];   writeln(' hv = ', s4);  writeln('   '); writeln('  ****  ');
writeln;
writeln ( 'Це косинус кута між  такими парами векторів  t та p:');
  s1:=s1/((t[1]*t[1]+t[2]*t[2])*(p[1]*p[1]+p[2]*p[2]));
writeln(' cos(t,p)= ', 10000*s1);
if s1>0 then writeln('кут(t,p) - гострий'); if s1=0 then writeln('кут(t,p) - прямий'); 
if s1<0 then writeln('кут(t,p) - тупий'); 
writeln ( 'Це косинус кута між  такими парами векторів w та p:');
  s3:=s3/((w[1]*w[1]+w[2]*w[2])*(p[1]*p[1]+p[2]*p[2]));
writeln(' cos(w,p)= ', 10000*s3);
if s3>0 then writeln('кут(w,p) - гострий'); if s3=0 then writeln('кут(w,p) - прямий');
if s3<0 then writeln('кут(w,p) - тупий');
writeln ( 'Це косинус кута між  такими парами векторів h  i v:');
  s4:=s4/((h[1]*h[1]+h[2]*h[2])*(v[1]*v[1]+v[2]*v[2]));
writeln(' cos(a,c)= ', 10000*s4);
if s4>0 then writeln('кут(h,v) - гострий'); if s4=0 then writeln('кут(h,v) - прямий');
if s4<0 then writeln('кут(h,v) - тупий');
writeln('  ****  ');
writeln; end.
************************
************************************


Практична робота 3 
Реалізація алгоритмів на нелінійних масивах.

Завдання 1. Реалізувати алгоритм(програму) мовою Pascal, в якій елементи двовимірного масиву [1 .. n , 1 .. m ] (таблиці чисел) формується (або генеруються) випадковим чином. Виводиться масив чисел на екран. Виводяться кількісні характеристики чисел у масиві, а саме кількість як непарних, так і парних чисел, та  елементів масиву, що кратні: 3;5;17;18. Вивести суми усіх парних чисел масиву, та окремі суми усіх елементів масиву, що кратні:  3;5;17;18. Вивести суму усіх чисел масиву, НСК усіх чисел масиву, НСД усіх чисел масиву.
program MassivPARAMETR;
const h = 4 ;  y = 4 ;    {Оголошення констант цілих чисел для рядків і для стовпців}
var a: array [ 1. .h, 1. .y] of integer ;  {Оголошення динамічного масиву цілих чисел}
var i, j,m,n,k,p,q, sm, sn, sk, sp, sq, sum,a,b: integer; {оголошення змінних, які визначає індекс (и) елемента}
function NOD(x, y:integer):integer;    {Функція пошуку найб. НСД}
begin  if x <> 0 then NOD:=NOD(y mod x, x) else NOD:=y; end;
function NOK(x, y:integer):integer;     {Функція пошуку наймен. НСК}
begin NOK:=(x div NOD(x, y))*y;  end;
begin   randomize; {настройка генератора випадкових чисел}
for i:=1 to
h do begin  {цикл для формування рядків масиву}
for j:=1 to y do { цикл для формування стовпців масиву} begin
 a[i, j]:=-100 +7*random (200); {генерація випадкових чисел}
 write (a[i, j], '       ' ); {виведення масиву  на екран чергового рядка масиву}
 end ;     writeln; end ;   readln;  { Затримка екрану }
 m:=0; n:=0; k:=0; p:=0; q:=0; a:=1; b:=1;
sum=0; sm:=0; sn:=0; sk:=0; sp:=0; sq:=0;
for i:=1 to h do begin    {цикл для індексування елементів по рядкам масиву}
for j:=1 to y do begin   {цикл для індексування елементів по стовпцям масиву}
if a[i, j] mod 2 =0 then begin m:=m+1; sm:=sm+a[i, j]; end;  { сумування парних елементів масиву}
if a[i, j] mod 3 =0 then begin n:=n+1; sn:=sn+a[i, j]; end;      { сумування елементів масиву, що / на 3}
if a[i, j] mod 5 =0 then begin k:=k+1; sk:=sk+a[i, j]; end; { сумування елементів масиву, що / на 5}
if a[i, j] mod 17 =0 then begin p:=p+1; sp:=sp+a[i, j]; end;  { сумування елементів масиву, що / на 17}
if a[i, j] mod 18 =0 then begin q:=q+1; sq:=sq+a[i, j]; end;   { сумування елементів масиву, що / на 18}
sum=sum+a[i, j];   { сумування усіх елементів масиву} end; end;
for i:=1 to h do begin 
for i:=1 to y do begin 
a:=NOD(abs(a[i,j]), a);   {Пошук НСД}   
b:=NOK(abs(a[i,j]), b);  {Пошук НСK}     
  end;  end;
writeln('НСД усіх елементів масиву =', a);
   writeln('НСК усіх  елементів масиву =', b);   
writeln(m, ' -  це кількість парних чисел в масиві;  сума = ', sm);
writeln(n, ' -  це кількість чисел в масиві, що кратні 3; сума = ', sn);
writeln(k, ' -  це кількість чисел в масиві, що кратні 5;  сума = ', sk);
writeln(p, ' -  це кількість чисел в масиві, що кратні 17;  сума = ', sp);
writeln(q, ' -  це кількість чисел в масиві, що кратні 18;  сума = ', sq);
writeln(h*y-m, ' -  це кількість непарних чисел в масиві;  сума = ', sum-sm);
writeln(sum, ' -   це сума усіх елементів масиву;  ' );
writeln(m, ' -        ' );
end.
Завдання 2. Реалізувати алгоритм(програму) мовою Pascal, в якій елементи двовимірного масиву [1 .. 4 , 1 .. 5] (таблиці чисел) формується (або генеруються) випадковим чином. Виводиться масив чисел на екран. Виводяться кількісні характеристики чисел у масиві, а саме кількість як непарних, так і парних чисел, та  елементів масиву, що кратні: 9;15;37;78. Вивести суми усіх парних чисел масиву, та окремі суми усіх елементів масиву, що кратні: 9;15;37;78. Вивести суму усіх чисел масиву, НСК усіх чисел масиву, НСД усіх чисел масиву.
************************************

Практична робота 4 
Лінійні алгоритми


Завдання 1. Cтворити та реалізувати мовою програмування Pascal випадкове трицифрове число і розділити його на цифри. Оскільки ми користуємося позиційною десятковою системою, то поділ числа на цифри виконується цілочисельним діленням даного числа на 10. Для цього використовуємо операції DIV та MOD.
Program PROBA_01;
var a:integer;
begin   a:=1+random(999);
writeln(a div 100, '  ' , (a mod 100) div 10,'  ',a mod 10);  end.
Завдання 2. Cтворити та реалізувати мовою програмування Pascal, що знаходить найменшу кількість розрізів куба розміром АхВхС, де 1 ≤ А, B, C ≤ 200000.  на одиничні кубики розміром 1х1х1. Найменша кількість  розрізів не залежить від вибору порядку прорізання сторін і обчислюється за формулою. Виведемо її. Почнемо розрізати по стороні А і одразу проріжемо на максимальну кількість частин. Отримаємо А частин розміру 1*В*С і виконаємо А-1 розрізів. Далі ріжемо кожен з отриманих кусків по стороні В. Отримаємо А*В кусків розмірами 1*1*С, виконавши при цьому всього А*(В-1) розріз. Залишається виконати розрізання по стороні С. Буде виконано А*В*(С-1) розрізів. Усього маємо (А-1)+А*(В-1)+А*В*(С-1)=А-1+А*В-А+А*В*С-А*В=А*В*С-1 розрізів.
Program PROBA_02;
var a,b,c: integer;   begin      a:=abs(random(99999));
 b:=abs(random(999999));   c:=abs(random(99999));
writeln(abs((a*b*c)-1));  end.
Завдання 3.  Cтворити та реалізувати мовою програмування Pascal, що знаходить найбільшу кількість точок із цілочисельними координатами на аркуші в клітинку можна накрити квадратом зі стороною N клітинок(1 N 10000).  Накреслимо на папері в клітинку квадратики зі сторонами 1, 2, 3, ... клітинок. У першому випадку ми закриємо 4 точки, у другому – 9, у третьому – 16... Як бачимо, ми отримуємо числа, що є точними квадратами: 2^2, 3^2, 4^2... Тому для введеного числа А потрібно вивести квадрат наступного числа.
Program PROBA_03;
var a: integer;
begin   a:=abs(random(999999));   writeln((a+1)*(a+1)); end.  
Завдання 4.  N будинків вишикувані в ряд. Cтворити та реалізувати мовою програмування Pascal, що знаходить кількість способів поселити Віку та Юлю в різні будинки так, щоб ці будинки не були сусідніми.
Program PROBA_04;
var a: integer;
begin a:=abs(random(999999));  
writeln((a-2)*(a-1));  end.

***********************
********************************


Практична робота 5
  Задачі на програмування. Алгоритми розгалуження.

Задача 1. Василько та Юлія грають в таку гру. Спочатку кожен записує на папері свій прогноз – число від 1 до 6. Потім вони кидають гральний кубик з числами від 1 до 6 на гранях. Чий прогноз виявляється ближчим до того числа, що випало, той і переміг. Треба написати програму для визначення переможця.
Технічні умови. Програма Forа  читає з пристрою стандартного введення три числа через пропуски (пробіли) – прогноз Василька, Юлі та результат кидання кубика. Програма виводить “V”, якщо переміг Василько, “J” якщо Юлія або ”D” – якщо прогноз обох однаково близький до результату (тобто переможця виявити неможливо.
Програма мовою Pascal
program fora;                                               {оголошення назви алгоритму}
var a,b,c : integer;                            {оголошення змінних цілих величин  a,b,c}
begin  writeln;                              {оголошення початку роботи алгоритму}
readln(a);  readln(b);  readln(c);      {оголошення про введення величин  a, b, c}
if ( (abs(c-a)) > (abs(c-b)) )  then write('j');  {якщо | c-a |>| c-b |, тоді написати j}
if ( (abs(c-a)) < (abs(c-b)) )  then write('v'); {якщо | c-a |>| c-b|, тоді написати v}
if ( (abs(c-a)) = (abs(c-b)) )  then write('d'); {якщо | c-a |>| c-b|, тоді написати  d}
end.
Протестувати алгоритм на правильність на прикладах:
1)Введення    3  4  5  Виведення J; 2) Введення: 1  6  2 Виведення  V; 3) Введення: 4  4  3 Виведення  D;  4)Введення    6  5  2  Виведення J;  5) Введення: 1  6  2  Виведення  V.
Завдання 3. Відомо, що книжкова полиця вміщає k однакових товстих книг, але k+1-а книга вже не влазить. Так само на неї можна поставити m однакових тонких книг, а m+1 -а вже не влізе. Скласти алгоритм, який знаходить можливість, щоб на полиці помістилися одночасно: n товстих та p тонких книг.
Розв’язання.  Якщо числовий вираз  n/k + p/m <=1, то можна, якщо  числовий  n/k + p/m > 1, то не можна помістити одночасно книги на полицю.
Алгоритм мовою Pascal (використовує повне розгалуження, «якщо-то, інакше»)
program BIBLIO;    var k,m,n,p,h:real;    begin
writeln('введіть число товстих книг 2<k<109  k='); readln(k);
writeln('введіть число тонких книг 2<m<109  m='); readln(m);
writeln('введіть даних товстих книг 2<n<109  n='); readln(n);
writeln('введіть даних тонких книг 2<p<109  p='); readln(p);  h:=(n/k)+(p/m);
 if  (h<1) or (h=1) then write(' кнгиги можна помістити') {розгалуження для виводу результату}
else  write('не можна помістити книги');  {інакше то вивід результату не можна} writeln('h=', h); end.
Протестувати алгоритм на правильність на прикладах:
1)Введення    3  4  5  6  Виведення ? 2) Введення: 1  6  2 8 Виведення  ?; 3) Введення: 4  4  3 9 Виведення  ?;  4)Введення    6  5  2  10  Виведення  ?;  5) Введення: 2  6  7  9  Виведення  ?
Завдання 4. Самостійно скласти і реалізувати алгоритм впорядкування виразів: (n/k)+(p/m)-(m/p)-(k/m); та (р/k)+(n/m)-(k/n)-(n/p) в порядку зростання для дробових чисел k,m,n,p.
Протестувати алгоритм на правильність на прикладах:
1)Введення    3  4  5  6  Виведення ? 2) Введення: 1  6  2 8 Виведення  ?; 3) Введення: 4  4  3 9 Виведення  ?;  4)Введення    6  5  2  10  Виведення  ?;  5) Введення: 2  6  7  9  Виведення  ?
Завдання 5. Самостійно скласти і реалізувати алгоритм впорядкування виразів: (1/k)+(1/m)-1/p)-(1/n); та (1/k)+(1/p)-(1/m)-(1/n) в порядку зростання для дробових чисел k,m,n,p.
Протестувати алгоритм на правильність на прикладах:
1)Введення    3  4  5  6  Виведення ? 2) Введення: 1  6  2 8 Виведення  ?; 3) Введення: 4  4  3 9 Виведення  ?;  4)Введення    6  5  2  10  Виведення  ?;  5) Введення: 2  6  7  9  Виведення  ?


Практична робота 6 
Aлгоритми мовою Pascal

Завдання 1.  На конференцію приїхали рівно по k представників від m(не менше ніж 2) фірм-конкурентів по виробництву гри "Саmрf", при цьому, усі представники різних фірм є конкурентами. Відомо, що у кожного учасника конференції рівно  n конкурентів серед усіх інших учасників.  Скласти алгоритм, який знаходить найбільшу кількість учасників  та найменшу кількість фірм-конкурентів в конференції?
 Розв’язання.  Кількість учасників конференції дорівнює km осіб. З іншого боку, кількість конкурентів у одного представника дорівнює k(m-1)= n, звідси маємо рівність kmn + k, права частина якого є лінійний вираз відносно двох змінних. Лінійний вираз р(k)= n + k досягає свого найбільшого і найменшого значення на межах числового проміжка від 1 до n. Якщо   k = n, то маємо найбільше значення р(n)= n + n =2n, тому  nm = 2n, звідси  m = 2. Відповідь: 2n осіб, 2 фірми.
Алгоритм мовою Pascal
program МіnConkurent;    var k,m,n:integer;    begin
writeln('введіть число конкурентів  в особи 2<n<109  n='); readln(n);
write('найбільше:', 2*n, ' осіб');  {вивід найбільшого числа учасників}
write('найменше: 2 фірми'); {вивід найменшого числа учасників}
end.                              {оголошення кінця алгоритму}
Завдання 2.  На конференцію приїхали рівно по k представників від m(не менше ніж 2) фірм-конкурентів по виробництву гри "Саmрf", при цьому, усі представники різних фірм є конкурентами. Відомо, що у кожного учасника конференції рівно  n конкурентів серед усіх інших учасників.  Скласти алгоритм, який знаходить найбільшу кількість фірм-конкурентів і найменшу кількість представників в конференції?
 Розв’язання.  Кількість учасників конференції дорівнює km осіб. З іншого боку, кількість конкурентів у одного представника дорівнює k(m-1)= n, звідси маємо рівність kmn + k, права частина якого є лінійний вираз відносно двох змінних. Лінійний вираз р(k)= n + k досягає свого найбільшого і найменшого значення на межах числового проміжка від 1 до n. Якщо   у формулі р(k)= n + k,  підставимо k = 1, то отримаємо найменше значення р(1)= n + 1 , тому найбільше значення m = n+1, звідси  n = m-1. Відповідь: n+1 фірм, 1 особа.
Алгоритм мовою Pascal
program МахConkurent;    var n:integer;    begin
writeln('введіть число конкурентів  в особи 2<n<109  n='); readln(n);
write('найбільше:' n+1, 'фірм');  {вивід найбільшого числа фірм}
write('найменше: 1 представник від фірми'); {вивід найменшого числа представників }   end.   {оголошення кінця алгоритму}
Завдання 3. Відомо, що книжкова полиця вміщає k однакових товстих книг, але k+1-а книга вже не влазить. Так само на неї можна поставити m однакових тонких книг, а m+1 -а вже не влізе. Скласти алгоритм, який знаходить можливість, щоб на полиці помістилися одночасно: n товстих та p тонких книг.
Розв’язання.  Якщо числовий вираз  n/k + p/m <=1, то можна, якщо  числовий  n/k + p/m > 1, то не можна помістити одночасно книги на полицю.
Алгоритм мовою Pascal (використовує повне розгалуження, «якщо-то, інакше»)
program BIBLIO;    var k,m,n,p,h:real;    begin
writeln('введіть число товстих книг 2<k<109  k='); readln(k);
writeln('введіть число тонких книг 2<m<109  m='); readln(m);
writeln('введіть даних товстих книг 2<n<109  n='); readln(n);
writeln('введіть даних тонких книг 2<p<109  p='); readln(p);  h:=(n/k)+(p/m);
 if  (h<1) or (h=1) then write(' кнгиги можна помістити') {розгалуження для виводу результату}
else  write('не можна помістити книги');  {інакше то вивід результату не можна} writeln('h=', h); end.
Завдання 4. Самостійно скласти і реалізувати алгоритм впорядкування виразів: (n/k)*(p/m)-(m/p)*(k/m); та (р/k)*(n/m)-(k/n)*(n/p) в порядку зростання для дробових чисел k,m,n,p.

\
Практична робота 7 
Aлгоритми мовою Pascal
Цикли і розгалуження

Завдання 1. Скласти і реалізувати алгоритм мовою Паскаль, який перевіряє приналежність натурального числа до чисел Фібоначчі, тобто приналежність до ряду чисел, в якому кожне наступне число дорівнює сумі двох попередніх чисел(наприклад:1+1=2; 1+2=3; 2+3=5;  3+5=8 і т.д.).  До ряду чисел Фібоначчі належать: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 
Програма мовою Pascal.
program Fibonacсi;                                                                                                    {Оголошення назви алгоритму}  
var      a,b,c,n: integer;   asc: boolean;                             {Оголошення змінних величин : цілих та : логічних}  
 begin    write('Введіть натуральне число N=');  readln(n);                    {Оголошення про введення числа }  
  a:=0;b:=1;c:=0;                                                                {Оголошення початкових значень для цілих змінних}
  asc:=false;                                                                 {Оголошення початкового значення для логічної  змінної}
  while c<n do begin                                                                      {Оголошення початку циклу з передумовою}
    c:=a+b; a:=b;    b:=c;                             { Сума двох попередніх  змінних і переприсвоєння результатів }  
    if  n=c  then  asc:=true; b:=c;     end;                  { Перевірка критерію  числа Фібоначчі і     кінець циклу}  
    if asc = true then writeln(n,' - це число Фібоначчі')                       {Перевірка і вивід числа Фібоначчі}
  else  writeln(n,' - це не є числом Фібоначчі');  end.           {Перевірка і вивід результату, кінець програми}
Протестуйте правильність роботи цього алгоритму. Введення: 7; 8; 9; 54; 55; 832040.
Завдання 2. Скласти і реалізувати алгоритм мовою Паскаль, який перевіряє, чи  декілька натуральних чисел  являються взаємно простими. Два числа взаємно прості, якщо у них найбільший спільний дільник дорівнює 1. Наприклад: 2 та 3 – це взаємно прості числа; 4 та 8 – це не взаємно прості числа.    Програма мовою Pascal.
    program zysla2;                                                                          {Оголошення назви алгоритму}  
var a: array[1..100] of  integer;               {Оголошення про ряд чисел(числовий масив 1х100) в алгоритмі}  
    i,max,n,j: integer;                                                         {Оголошення про цілі змінні в алгоритмі}  
 begin     write('vvedite koli4estvo 4isel:');   readln(n);   {Оголошення про введення кількості чисел}  
   for i:=1 to n do                                                                      {Оголошення початку циклу з лічильником}
    begin   write(i, ') 4islo:'); readln(a[i]);   end;                 {Оголошення введення даних чисел по порядку}
   max:=a[1];
   for i:=2 to n do if max<a[i] then max:=a[i];       {Оголошення початку циклу з лічильником і перевірка}
   for i:=2 to max do                                                   {Оголошення початку циклу з лічильником}
    for j:=1 to n do                                                       {Оголошення початку циклу з лічильником}
     if a[j] mod i=0 then begin  write('TAK');         {Оголошення перевірки подільності чисел з лічильником}
             readln; end
     else  begin write('NI'); readln; end;            {Оголошення кінця перевірки та циклу з лічильником}
  readln;  end.
Протестуйте правильність роботи алгоритму. Введення:{2; 8; 9}=TAK,  {2; 25; 10}=NI, {3; 7; 14; 35}=NI  
Завдання 3. Скласти і реалізувати алгоритм мовою Паскаль, який перевіряє ряд випадкових натуральних чисел, які при діленні на сім дають остачу 2 та 1 і виводить такі числа на екран.
   Програма мовою Pascal
Program Ostaci;                                               {Оголошення назви алгоритму}  
Const n = 5;                                         {Оголошення про постійну величину:  n  - це кількість чисел в ряді}
Var   x : array [1..n] of Integer;      i : Integer; {Оголошення про ряд чисел(числовий масив) в алгоритмі}  
Begin    
     For i := 1 to n  do    x[i] := random(100);      {Цикл формування ряду випадкових чисел, менше 100} 
     For i := 1 to n do     Write(x[i]:3);  WriteLn; {Оголошення про виведення на екран ряду випадк. чисел}
     For i := 1 to n do                             {Цикл з лічильником для перевірки ряду випадкових чисел на остачі} 
         If (x[i] mod 7 = 2) or (x[i] mod 7 = 1)     {Оголошення про перевірку чисел на остачі на 2 та 1 }  
            then Write(x[i]:3, ' (', i, ') ');        {Оголошення про виведення на екран ряду перевірених  чисел}
             WriteLn; readln;   еnd.
Протестуйте правильність роботи алгоритму. 1) Введення: Const n = 7;   Const n = 19;  Const n = 22;
2)Змінити у програмі перевірку остач: перевірити числа на остачі: 4 та 6,  перевірити на остачі: 0 та 6.

Практична робота 8
 Програмування циклів мовою Pascal.

Завдання 1. Ліцей проводить вибори до учнівського парламенту. Скількома способами можна обрати цей парламент, якщо до парламенту подано: k заявок від  8-класників, m заявок від 9-класників, n заявок від 10- класників. Скласти і реалізувати алгоритм підрахунку усіх способів утворення шкільного парламенту мовою Pascal, за умови, що серед вибраних є не менше одиного представника із трьох паралелей, і до парламенту проходить тільки небільше половини від ТИХ, ХТО подав заявки. А саме, у парламенті має зайти не більше:  0,5k+1 осіб від  8-класників, небільше 0,5m+1  осіб від 9-класників, не більше 0,5n+1 осіб від 10- класників.
Розв’язання. У парламент може зайти: або один, або два, або три, …., або  0,5k+1 від  8-класників.  Кількість способів, обчислюємо як сума комбінацій: С1k/2+1  +С2k/2+1 +С3k/2+1+…+ +Сk/2k/2+1. Аналогічно знаходимо кількість способів для 9-класників: С1m/2+1  +С2m/2 +1+С3m/2+1+…+ +Сm/2m/2+1. Аналогічно знаходимо кількість способів для 10-класників: С1n/2+1  +С2n/2+1 +С3n/2+1+…+ +Сn/2n/2+1. А кількість вибору того, що у парламенті мають бути представники від трьох паралелей:
     р=(С1k/2+1  +С2k/2+1 +С3k/2+1+…+ Сk/2k/2+1)( С1k/2+1  +С2k/2+1 +С3k/2+1+…+ Сk/2k/2+1)(С1k/2+1  +С2k/2+1 +С3k/2+1+…+ Сk/2k/2+1).
program Parlament;
var i, k, m, n, v1, d1, b1, v2, d2, b2, v3, d3, b3:integer;
begin
  writeln('Введіть число заявок від 8-класників: k= '); readln(k); k:=(k div 2)+1;
  writeln('Введіть число заявок від 9-класників: m= ');  readln(m);  m:=(m div 2)+1;
 writeln('Введіть число заявок від 10-класників: n= ');    readln(n);  n:=(n div 2)+1;
v1:=1; d1:=1; b1:=1; v2:=1; d2:=1; b2:=1; v3:=0; d3:=0; b3:=0;           {початкові значення змінних}
for i:=1 to k do begin   v1:=i*v1;    v2:=(k-i+1)*v2;     v3:=(v2 div v1)+v3; end;      {цикл 8-их класів}
for i:=1 to m do begin d1:=i*d1;   d2:=(m-i+1)*d2; d3:=(d2 div d1)+d3; end;         {цикл 9-их класів}
for i:=1 to n do  begin b1:=i*b1; b2:=(n-i+1)*b2; b3:=(b2 div b1)+b3; end;            {цикл 10-их класів}
writeln('Кількість способів обрати членів парламенту від окремих паралелей:');
writeln(' v3= ', v3, ' способів тільки від 8-класників; ');
writeln(' d3= ',d3, ' способів тільки від 9-класників;');
writeln(' b3= ',b3, '  способів тільки від 10-класників; ');
writeln('Кількість способів обрати новий  учнівський парламент  ліцею;');
  writeln('  p= ', v3*d3*b3, ' способів');    writeln('     '); end.
Протестуйте правильність роботи алгоритму: {k;m;n}={(1;1;1)=1;  (2;2;2)=27;  (3;3;3)=27;  (4;4;4)=343;  (3;4;2)=63}
Завдання 2. Ліцей проводить вибори до Ради учнівського парламенту. Скількома способами можна обрати Раду  парламенту у складі  n осіб, якщо серед кандидатів  ліцеїстів та m ліцеїсток. Скласти і реалізувати алгоритм підрахунку усіх можливих способів створення Ради парламенту мовою Pascal. Вхідні дані: k, m, n. Вивід: кількість!
Розв’язання. Нехай кандидатів у Раду парламенту більше, ніж n. У Раду парламента може зайти: або одна, або дві,…., або  m  ліцеїсток.  Кількість способів обрати тільки ліцеїсток обчислюємо як  комбінації: С1m =m(1 місце в раді парламенту); С2m =m(m-1)/2( для двох осіб) ; С3;…  Сmm.  (буває варіант Сnn =1, якщо n=m і в Раді парламенту лише ліцеїстки і немає ліцеїстів)Аналогічно знаходимо кількість способів для ліцеїстів:
С1 k =k;  С2k =k(k-1)/2; ….., Сk-1k=k-1 (для k-1 ліцеїстів);Сkk=1 (для k ліцеїстів); С0k (для n-1 ліцеїсток і 1 ліцеїстa);
Таким чином, вибір усіх осіб у Раду парламенту за цих умов можна здійснити сумою добутків:
р= С1kСn-1m + С2kСn-2m +  … + Сn-2mС2k + Сn-1mС1k
program RadaParlament; const k1=15; m1=15;    var i,g,j, k, m, n, v1, d1, b1, v2, d2, b2, v3, d3, b3, p:integer;
a, b: array[1..k1*m1] of  integer;   c: array[1..k1,1..m1] of  integer;      begin
writeln('Введіть число заявок від юнаків: k<= ',k1); readln(k);
 writeln('Введіть число заявок від юнаків: m<= ',m1); readln(m);
 writeln('Введіть число  місць у Раді парламенту n<= ', k1*m1); readln(n);
 v1:=1; d1:=1; b1:=1; v2:=1; d2:=1; b2:=1; v3:=0; d3:=0; b3:=0; 
for i:= 1 to k do begin v1:=i*v1; v2:=(k-i+1)*v2; b[i]:= v2 div v1; v3:=b[i]+v3;  end;
 for i:=1 to m do begin d1:=i*d1; d2:=(m-i+1)*d2;a[i]:= d2 div d1; d3:=a[i]+d3;  end;
for i:=1 to k do  begin  for j:=1 to m do begin c[i,j]:=a[j]*b[i];
  writeln('j=',j,' i= ',i,' ', 'c[',i,';',j,']=',a[j]* b[i],'    ');  end; end;
     writeln('  Кількість способів створити Раду парламенту');
 for i:=1 to k do  begin  for j:=1 to m do begin   if  i+j=n then begin b3:=c[i,j]+b3;
  writeln('j=',j,' i= ',i,' ', 'c[',i,';',j,']=',a[j]* b[i],' ');end; end; end;writeln('^^^^^^^^');
writeln(' b3= ',b3, ' способів отримати Раду парламенту.');writeln(' '); end.
Протестуйте правильність роботи алгоритму: {k;m;n}={(5;5;10)=1;  (2;2;2)=4;  (2;2;3)=4;  (4;4;10)=0;  (4;4;5)=56}

Практична робота 9
Лінійні алгоритми  мовою Pascal

Завдання 1. Скласти і реалізувати алгоритм  для знаходження кількості днів, за яку виконають сумісну роботу два програміста, якщо такий об’єм роботи перший програміст самостійно виконує за k днів, а другий програміст самостійно виконує за m днів.
program  Robota_1;                     {назва    алгоритму}
var  k,m: real;                             {оголошення  змінних величин: k,m – це дійсні числа}
begin                                                                                      { початок   виконання алгоритму}
  writeln( 'k='); readln(k); writeln( 'm='); readln(m);    { введення двох чисел}
   k:=(k*m)/(k+m);                                                            { обчислення за формулою}
writeln('Разом виконають за ', k, ' днів');                   { виведення результату}
end.                                                                                     {закінчення алгоритму}
Протестуйте алгоритм для  таких значень  k i m: а)12 i 8; б)3,2 i  2,4; в)6,5 i 2,6; г)42 і36; д)40,30 і 40,45;  е)20 і 16; є)80 і 84.
Завдання 2. Скласти і реалізувати алгоритм  для знаходження справжньої маси монети, якщо її зважували на бракованих терезах з нерівними плечами, і при викладенні гирьок на першій чашечці, то маса монети на протилежній чашечці становила k грам, а при викладанні гирьок на другій чашечці терезів маса монети на протилежній чашечці становила  m грам.
program  Robota_2;                     {назва    алгоритму}
var  k,m: real;                             {оголошення  змінних величин: k, m – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
  writeln( 'k='); readln(k); writeln( 'm='); readln(m);    { введення двох чисел}
   k:=sqrt(k*m);                                                                 { обчислення за функцією квадратного кореня}
writeln('Cправжня маса монети: ', k, '  грам');                   { виведення результату}
end.                                                                                     {закінчення алгоритму}
Протестуйте алгоритм для  таких значень  k i m: а)12 i 8; б)3,2 i  2,4; в)6,5 i 2,6; г)42 і36; д)40,30 і 40,45;  е)20 і 16; є)80 і 84.
Завдання 3. Є три гаманці: татчин, мамчин, сина. У татовому гаманці: k грн, у маминому гаманці  m  грн. Бабуся запитала внучка, яку б ти хотів мати cуму грошей у своєму гаманці і запропонувала чотири можливі варіанти: 1) середнє арифметичне грошей у двох гаманцях, що мають  k+1000  грн і m-1000  грн відповідно; 2) середнє геометричне грошей, що у двох гаманцях, котрі мають  k-2000 грн і m+2000  грн відповідно; 3)середнє квадратичне грошей у двох гаманцях, котрі мають  k-3000 грн і m+3000  грн відповідно; 4) середнє гармонійне грошей у двох гаманцях, котрі мають  k+4000 грн і m-4000  грн відповідно. Для внучка бабусі скласти і реалізувати алгоритм  для впорядкування  від найбільшого до найменшого названих бабусею чотирьох грошових величин.
program  Robota_3;                     {назва    алгоритму}
var  k,m,n: real;                             {оголошення  змінних величин: k, m, n – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
  writeln( 'k='); readln(k); writeln( 'm='); readln(m);    { введення двох чисел}
   n:=sqrt(((k-3000)*(k-3000)+(m+3000)*(m+3000))*0.5);   {обчислення за фор-лою серед-ого квадр-ного}
writeln('Cереднє квадратичне: ', n, '  грн ');                   { виведення результату}
   n:= ((k+1000)+(m-1000))*0.5;   {обчислення за фор-лою серед-ого арифметичного}
writeln('Cереднє арифметичне: ', n, '  грн ');                   { виведення результату}
   n:=sqrt((k-2000)*(m+2000));   {обчислення за фор-лою серед-ого геометр-ного}
writeln('Cереднє геометричне: ', n, '  грн ');                   { виведення результату}
   n:=2*((k+4000)*(m-4000))/ ((k+4000)+(m-4000))   ;   {обчислення за фор-лою серед-ого гарм-ного}
writeln('Cереднє гармонійне: ', n, '  грн ');                   { виведення результату}
end.                                                                                     {закінчення алгоритму}
Протестуйте алгоритм для  таких значень  k i m: а)10000 i 80000; б)300000 i  400000; в)600500 i 900600.


Практична робота 10
Алгоритми табуляції мовою Pascal

Завдання 1. Скласти і реалізувати алгоритм  для знаходження   табулювання значень квадратичної функції, що задана рекурсивною формулою у=(а1х2)х3= а1х22х3.
program  Quadratfunction;                     {назва    алгоритму  табуляції}
var  a1, a2, a3, x, y, d, x1, x2,y1: real;      i, k: integer;     {оголошення  змінних: дійсні числа та цілі числа}
begin           {початок   виконання алгоритму і введення випадкових коефіцієнтів  квадратичної функції}
 a1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ;   
writeln( ' Якщо cтарший коефіцієнт квадратичної функції a1=', a1); writeln;
a2:=2+random(7) *(-1+random(3));  writeln(' Якщо лінійний коефіцієнт квадратичної функції a2=', a2); writeln;  a3:= (4+random(10))*(-1)*(-1+random(3));
writeln(' Якщо вільний коефіцієнт квадратичної функції:  y(0)=a3=', a3); writeln;
writeln(' Якщо cума коефіцієнтів квадратичної функції:  y(1)=a1+a2+a3=', a1+a2+a3); writeln;
x:=-(1+random(20));  writeln(' Якщо початковий аргумент квадратичної функції x=', x); writeln;
d:=1+random(3);  writeln( ' Якщо величина кроку табуляції  квадратичної функції d=', d); writeln;
k:=5+random(8);  writeln( ' Якщо кількість кроків табуляції k=', k); writeln;
for i:=1 to k do begin       {виконання циклу з лічильником по kрокам для обчислення  значень функції}
x:=x+(i-1)*d;    y:=(a1*x+a2)*x+a3;       { виведення результатів табулювання на  екран монітора}
writeln( ' номер кроку табуляції  i=', i,  ' аргумент функції  х=', x, ' значення функції  y=', y); writeln; end; writeln('********'); writeln( ' квадратична функція має вигляд у=', a1,  '*x*x+( ' ,  a2,  ' )x+( ',  a3,  ' )' );  
d:=a2*a2-4*a1*a3;    if (d>0)  or (d=0)  then   {обчислення  дискримінанта  перевірка  його знаку  для квадратичної функції} begin   x:=0.5*(-a2-sqrt(d))/a1;  y:=abs((a1*x+a2)*x+a3);   x1:=x;   {обчислення  першого нуля квадратичної функції}
writeln( ' перший наближений  нуль квадратичної функції  х1=', x, 'з абсолютною похибкою ',y); writeln;
x:=0.5*(-a2+sqrt(d))/a1;   y:=abs((a1*x+a2)*x+a3);  x2:=x;{ {обчислення  другого нуля квадратичної функції}  writeln( ' другий наближений нуль квадратичної функції  х2=', x, 'з абсолютною похибкою ',y); writeln; end   else   writeln( ' немає нулів квадратична функція');
x:=0.5*(-a2)/a1;  y:=(a1*x+a2)*x+a3;   y1:=y;                              {обчислення  координат вершини параболи  }
if (a1>0)  then                         {оголошення  мінімуму  квадратичної функції як координат вершини параболи}     writeln( 'гілки параболи напрямлені вгору,  мінімум квадратичної функції якщо  Хmin=', x, '  та Уmin= ',y)   else                                          {оголошення  максимуму  квадратичної функції як координат вершини параболи}
writeln( 'гілки параболи напрямлені вниз,   максимум квадратичної функції якщо  Хmах=',x, '  та Уmах= ',y); writeln; 
writeln( 'вісь симетрії графіка параболи  це вертикальна пряма лінія: Хвісь=', -0.5*a2/a1); writeln;
if (a1>0)  then  writeln(' функція зростає, якщо  Х>', -0.5*a2/a1); writeln; 
if (a1>0)  then  writeln(' функція спадає, якщо  Х<', -0.5*a2/a1); writeln; 
if (a1>0) and (d>0)  then  writeln(' функція додатна, якщо  Х<', x1, ' та Х>', x2); writeln; 
if (a1>0) and (d>0)   then  writeln(' функція відємна, якщо  ХЄ(', x1, ' ;', x2, ') ' ); writeln; 
if (a1<0) and (d>0)   then  writeln(' функція відємна, якщо  Х<', x1, ' та Х>', x2); writeln; 
if (a1<0) and (d>0)   then  writeln(' функція додатна, якщо  ХЄ(', x1, ' ;', x2, ') ' ); writeln; 
if (a1<0)  then  writeln(' функція зростає, якщо  Х<', -0.5*a2/a1); writeln; 
if (a1<0)  then  writeln(' функція спадає, якщо  Х>', -0.5*a2/a1); writeln;
if (a2=0)  then  writeln( 'Квадратична функція  у=', a1,  '*x*x+( ' ,  a2,  ' )x+( ',  a3,  ' ) парна.') else  
writeln( 'Квадратична функція  у=', a1,  '*x*x+( ' ,  a2,  ' )x+( ',  a3,  ' ) ні парна, ні непарна.'); writeln; 
writeln( 'Обернена функція до першої гілки параболи квадратичної функції:  у1=+((x-(', y1,  '))/ (',  a1, '))^0.5 +(',  -0.5*a2/a1, ')'); writeln; 
writeln( 'Обернена функція до другої гілки параболи квадратичної функції:  у2=-((x-(', y1,  '))/( ',  a1, '))^0.5 +(',  -0.5*a2/a1, ')'); writeln; 
writeln( ' Немає перегинів випуклих ділянок квадратична функція');
   end.   {закінчення алгоритму}
Протестуйте алгоритм  чотири рази та порівняйте результати табуляції і виберіть той варіант, при якому можна знайти найточніше наближення   нулів квадратичної функції, тобто випадок y:=(a1*x+a2)*x+a3=0.       

Практична робота 11 
Алгоритми табуляції мовою Pascal

Завдання 1. Із потяга зійшли два пасажира і направились одночасно в один і той же пункт А. Перший пасажир половину часу йшов зі швидкістю v1 м/год, а другу половину часу йшов зі швидкістю v2 м/год. Другий пасажир йшов першу половину шляху зі швидкістю v1 м/год, а другу половину шляху зі швидкістю v2 м/год. Допоможіть слідчому, дізнатися, яку відстань долали пасажири від виходу із потяга до пункту призначення і хто першим прибуває в пункт А.  Скласти і реалізувати алгоритм  для вияснення, хто першим прибуває у пункт призначення і на скільки раніше, ніж інший, якщо відомо, що перший пасажир витрачає на весь свій шлях t хвилин?
program  Robota_4;                     {назва    алгоритму}
var  v1,v2,t1,t2, s1 : real;       {оголошення  змінних величин: v1,v2,t1,t2, s1,s2 – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
writeln( 'v1='); readln(v1); writeln( 'v2='); readln(v2);  writeln( 't1='); readln(t1);
s1:=(v1+v2)*t1*0.5; {обчислення за фор-лою відстані від потяга до пункту}
writeln('Довжина шляху пасажирів', s1, '  метрів ');                   { виведення результату}
t2:=(v1+v2)* (v1+v2)*t1*0.25/( v1*v2);   {обчислення за фор-лою  часу другого пасажира}
writeln('Час руху другого пасажира: ',t2, '  хвилин ');                   { виведення результату}
if  t2 –t1=0 then writeln('У пункт  А  пасажири прибувають одночасно');
if  t2 –t1>0 then writeln('У пункт  А раніше прибуває перший пасажир на: ', t2 –t1, '  хвилин. ');    end.
Протестуйте алгоритм для  таких значень  {v1; v2; t1}: а)(90; 80; 30)=0,1 хв; б) (85; 85; 40)=0 хв; в)(60; 80; 20)=0,42 хвилини.

Завдання 2. Скласти і реалізувати алгоритм  для знаходження   табулювання значень кубічної функції, що задана рекурсивною формулою у=(1х2)х3)х+a4.
program  Cubesfunction;                     {назва    алгоритму  табуляції}
var  a1, a2, a3, a4,  x, y, d: real;      i, k: integer;     {оголошення  змінних величин: дійсні числа та цілі числа}
begin           { початок   виконання алгоритму і введення випадкових коефіцієнтів  кубічної функції}
 a1:=1+random(3);  writeln( ' Якщо cтарший коефіцієнт кубічної функції a1=', a1); writeln;
a2:=2+random(7);  writeln(' Якщо квадратичний коефіцієнт кубічної функції a2=', a2); writeln;
a3:=-(4+random(10));  writeln(' Якщо лінійний коефіцієнт кубічної функції a3=', a3); writeln;
a4:=-(3+random(10));  writeln(' Якщо вільний коефіцієнт кубічної функції a4=', a4); writeln;
x:=-(1+random(20));  writeln(' Якщо початковий аргумент кубічної функції x=', x); writeln;
d:=1+random(3);  writeln( ' Якщо величина кроку табуляції  кубічної функції d=', d); writeln;
k:=15+random(5);  writeln( ' Якщо кількість кроків табуляції k=', k); writeln;
for i:=1 to k do begin       {виконання циклу з лічильником по kрокам для обчислення  значень функції}
x:=x+(i-1)*d;    y:=((a1*x+a2)*x+a3)+a4;       { виведення результатів табулювання на  екран монітора}
writeln( ' номер кроку табуляції  i=', i,  ' аргумент функції  х=', x, ' значення функції  y=', y); writeln; end; writeln('********'); end.   {закінчення алгоритму}
Протестуйте алгоритм  чотири рази та порівняйте результати табуляції і виберіть той варіант, при якому можна знайти найточніше наближення   нулів кубічної функції, тобто випадок ((a1*x+a2)*x+a3)*x+a4=0.       

Завдання 3. Створити алгоритм мовою Паскаль, який знаходить корінь кубічного рівняння, якщо відомо, що тільки вільний член кубічного рівняння від’ємний, а всі інші коефіцієнти додатні дійсні числа.

program DichotomiaCUB;
var c1, c2, c3, c4, a, b, mid, x, e, y: real;  n, m, i: integer;
begin
c1:=(1+random(3)) *(2+random(6)) *(random(2)) + 1+random(3) ; 
writeln( ' Якщо найстарший коефіцієнт в кубічному рівнянні: c1=', c1); writeln;
c2:=(1+random(7)) *(2+random(9)) *(random(5)) + 1+random(7) ; 
writeln( ' Якщо квадратичний коефіцієнт в кубічному рівнянні: c2=', c2); writeln;
c3:=(1+random(8)) *2+random(4) *(random(7)) + 1+random(8) ; 
writeln( ' Якщо лінійний коефіцієнт в кубічному рівнянні: c3=', c3); writeln;
c4:=-(1+random(12)) ;
writeln( ' Якщо нульoвий коефіцієнт в кубічному рівнянні: c4=', c4); writeln;
writeln( ' Дане кубічне рівняння:', c1,  '*x*x*x+( ' , c2,  ' )*x*x+( ',  c3,  ' )*x ',c4, '=0');  
a:=0; b:=10; 
for i:=1 to 1000 do begin
mid:=0.5*(a+b);
 y:=c1*mid*mid*mid+c2*mid*mid+c3*mid+c4;
if y>0 then b:=mid  else a:=mid;
end; writeln( 'Наближений корінь кубічноого рівняння: mid=', mid); writeln;
writeln( 'Наближене значення кубічноого рівняння: y=', y); writeln;
end.

Практична робота 12
Лінійні алгоритми мовою Pascal

Завдання 1. Скласти і реалізувати алгоритм  для знаходження кількості днів, за яку виконають сумісну роботу два програміста, якщо такий об’єм роботи перший програміст самостійно виконує за k днів, а другий програміст самостійно виконує за m днів.
program  Robota_1;                     {назва    алгоритму}
var  k,m: real;                             {оголошення  змінних величин: k,m – це дійсні числа}
begin                                                                                      { початок   виконання алгоритму}
  writeln( 'k='); readln(k); writeln( 'm='); readln(m);    { введення двох чисел}
   k:=(k*m)/(k+m);                                                            { обчислення за формулою}
writeln('Разом виконають за ', k, ' днів');                   { виведення результату}
end.                                                                                     {закінчення алгоритму}
Протестуйте алгоритм для  таких значень  k i m: а)12 i 8; б)3,2 i  2,4; в)6,5 i 2,6; г)42 і36; д)40,30 і 40,45;  е)20 і 16; є)80 і 84.

Завдання 2. Скласти і реалізувати алгоритм  для знаходження справжньої маси монети, якщо її зважували на бракованих терезах з нерівними плечами, і при викладенні гирьок на першій чашечці, то маса монети на протилежній чашечці становила k грам, а при викладанні гирьок на другій чашечці терезів маса монети на протилежній чашечці становила  m грам.
program  Robota_2;                     {назва    алгоритму}
var  k,m: real;                             {оголошення  змінних величин: k, m – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
  writeln( 'k='); readln(k); writeln( 'm='); readln(m);    { введення двох чисел}
   k:=sqrt(k*m);                                                                 { обчислення за функцією квадратного кореня}
writeln('Cправжня маса монети: ', k, '  грам);                   { виведення результату}
end.                                                                                     {закінчення алгоритму}
Протестуйте алгоритм для  таких значень  k i m: а)12 i 8; б)3,2 i  2,4; в)6,5 i 2,6; г)42 і36; д)40,30 і 40,45;  е)20 і 16; є)80 і 84.

Завдання 3. Є три гаманці: татчин, мамчин, сина. У татовому гаманці: k грн, у маминому гаманці  m  грн. Бабуся запитала внучка, яку б ти хотів мати cуму грошей у своєму гаманці і запропонувала чотири можливі варіанти: 1) середнє арифметичне грошей у двох гаманцях, що мають  k+1000  грн і m-1000  грн відповідно; 2) середнє геометричне грошей, що у двох гаманцях, котрі мають  k-2000 грн і m+2000  грн відповідно; 3)середнє квадратичне грошей у двох гаманцях, котрі мають  k-3000 грн і m+3000  грн відповідно; 4) середнє гармонійне грошей у двох гаманцях, котрі мають  k+4000 грн і m-4000  грн відповідно. Для внучка бабусі скласти і реалізувати алгоритм  для впорядкування  від найбільшого до найменшого названих бабусею чотирьох грошових величин.
program  Robota_3;                     {назва    алгоритму}
var  k,m,n: real;                             {оголошення  змінних величин: k, m, n – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
  writeln( 'k='); readln(k); writeln( 'm='); readln(m);    { введення двох чисел}
   n:=sqrt(((k-3000)*(k-3000)+(m+3000)*(m+3000))*0.5);   {обчислення за фор-лою серед-ого квадр-ного}
writeln('Cереднє квадратичне: ', n, '  грн ');                   { виведення результату}
   n:= ((k+1000)+(m-1000))*0.5;                                 {обчислення за фор-лою серед-ого арифметичного}
writeln('Cереднє арифметичне: ', n, '  грн ');                   { виведення результату}
   n:=sqrt((k-2000)*(m+2000));                                   {обчислення за фор-лою серед-ого геометр-ного}
writeln('Cереднє геометричне: ', n, '  грн ');                   { виведення результату}
   n:=2*((k+4000)*(m-4000))/ ((k+4000)+(m-4000))   ;   {обчислення за фор-лою серед-ого гарм-ного}
writeln('Cереднє гармонійне: ', n, '  грн ');                   { виведення результату}
end.                                                                                     {закінчення алгоритму}
Протестуйте алгоритм для  таких значень  k i m: а)10000 i 80000; б)300000 i  400000; в)600500 i 900600.


Практична робота 13 
Складені алгоритми з практичним змістом

Завдання 1. На вокзалі з потягу зійшли два пасажира і направились одночасно в один і той же пункт А. Перший пасажир половину часу йшов зі швидкістю v1 м/год, а другу половину часу йшов зі швидкістю v2 м/год. Другий пасажир йшов першу половину шляху зі швидкістю v2 м/год, а другу половину шляху зі швидкістю v1 м/год. Допоможіть слідчому, дізнатися, яку відстань долали пасажири від виходу із потяга до пункту призначення і хто першим прибуває в пункт А.  Скласти і реалізувати алгоритм  для вияснення, хто першим прибуває у пункт призначення і на скільки раніше, ніж інший, якщо відомо, що перший пасажир витрачає на весь свій шлях t хвилин?
program  TOURIST_1;                                                                                                {назва    алгоритму}
var  v1,v2,t1,t2, s1 : real;                       {оголошення  змінних величин: v1,v2,t1,t2, s1,s2 – це дійсні числа}
begin                                                                                                              { початок  виконання  алгоритму}
  writeln( 'v1='); readln(v1); writeln( 'v2='); readln(v2);  writeln( 't1='); readln(t1);      
   s1:=(v1+v2)*t1*0.5;                                                 {обчислення за фор-лою відстані від потяга до пункту}
writeln('Довжина шляху пасажирів', s1, '  метрів ');                                             { виведення результату}
t2:=(v1+v2)* (v1+v2)*t1*0.25/( v1*v2);                          {обчислення за фор-лою  часу другого пасажира}
writeln('Час руху другого пасажира: ',t2, '  хвилин ');                                              { виведення результату}
  if  t2 –t1=0 then writeln('У пункт  А  пасажири прибувають одночасно');   
if  t2 –t1>0 then writeln('У пункт  А раніше прибуває перший пасажир на: ', t2 –t1, '  хвилин. ');    end.                                                                                    
Протестуйте алгоритм для  таких значень  {v1; v2; t1}: а)(90; 80; 30)=0,1 хв; б) (85; 85; 40)=0 хв; в)(60; 80; 20)=0,42 хвилини.
Завдання 2. Якщо через рівні проміжки часу на депозитну картку вноситься деяка постійна сума К грн(періодичні внески) під складні відсотки Р% , то заощадження обчислюється за формулою
S=K*(1+p/100)*(exp(ln(1+p/100)*n)-1)/( (1+p/100)-1).
Скласти і реалізувати алгоритм  для вияснення cум грошей на депозитній картці через декілька років.
program BABLO_2;                     {назва    алгоритму}
var  k,p,r, s : real;      n, i: integer;  {оголошення  змінних величин: k,p,r,n, s – це дійсні числа}
begin                                                                                      { початок  виконання  алгоритму}
k:=1000+random(100);  writeln( ' Якщо сума, що вноситься на депозит k=', k); writeln;
p:=7+random(10);  writeln( ' Якщо відсоткова ставка для цього депозиту р=', p); writeln;
n:=1+random(10);  writeln( ' Якщо кількість років існування депозиту n=', n); writeln;
s:=1+p/100;   u:=1;                                 {обчислення початкового відсотку для виконання  алгоритму}
for i:=1 to n do begin                   {виконання циклу з лічильником по рокам для обчислення грошей}
u:=u*(1+p/100);    s:=1+p/100;    s:= K*s*(u-1)/(s-1); 
writeln( 'Кількість грошей на депозиті через', i, ' років S=', s); writeln; end; writeln('********'); end.
Протестуйте алгоритм декілька разів і порівняйте результати. Самостійно змініть діапазон вибору випадкових чисел в алгоритмі.
Завдання 3. Якщо протягом n років  на  депозитну картку  з сумою К грн нараховується m разів щорічно деякий постійний складний відсоток Р% , то заощадження обчислюється за формулою
S=K* exp(ln (1+p/(100*m))*n*m)
Скласти і реалізувати алгоритм  для вияснення cум грошей на депозитній картці через декілька років.
program BABLO_3;                                                                              {назва    алгоритму}
var  k,s : real;      u,m,n, i: integer;                          {оголошення  змінних величин  дійсні числа та цілі числа}
begin                                                              { початок  виконання  алгоритму і введення випадкових значень}
k:=1000+random(1000);  writeln( ' Якщо початкова сума на депозиті k=', k); writeln;
p:=7+random(10);  writeln( ' Якщо відсоткова ставка для цього депозиту р=', p); writeln;
n:=1+random(5);  writeln( ' Якщо кількість років існування депозиту n=', n); writeln;
m:=1+random(12);  writeln( ' Якщо кількість  нарахувань на депозит за рік m=', m); writeln;
s:=k; u:=n*m;                                                    {обчислення чисел для виконання  циклу в алгоритмі}
for i:=1  to  u  do  begin        {виконання циклу з лічильником по  нарахуванням для обчислення грошей}
s:= K*exp(ln(1+p/(100*i)))*i*i;
writeln( 'Кількість грошей на депозиті  після', i, ' –го нарахування S=', s); writeln; end; writeln('*****');   end.
Протестуйте алгоритм декілька разів і порівняйте результати. Самостійно змініть діапазон вибору випадкових чисел в алгоритмі.


Практична робота 14
  Алгоритми властивостей цілих чисел мовою Pascal

Завдання 1. Скласти і реалізувати алгоритм  для знаходження   кількості цифр, суми цифр натурального числа, подільності на цифри, якщо ціле число задане випадковим чином.
program SummaNumer;                     {назва    алгоритму підрахунку суми цифр цілого числа}
var  m, n, i, m1, k, s: integer;                {оголошення  змінних величин: цілі числа}
begin                            {початок   виконання алгоритму і введення випадкових натуральних чисел}
m:=(10+random(5))*(20+random(7)) *(random(20)) + 1+random(3) ;   
writeln( ' Якщо натуральне число  m=', m); writeln;  m1:=m; k:=0; s:=0; n:=0;
repeat    n:=m mod 10; k:=k+1; s:=s+n;  m:=m div 10;   until m=0; 
     {виконання циклу з  післяумовою  для обчислення}
writeln('Сума цифр числа ', m1,   ' дорівнює числу: ', s); writeln;
writeln('Кількість цифр числа ', m1,   ' дорівнює числу: ', n); writeln;
if (m1 mod 2) =0 then writeln(m1,   ' - це парне число ');  writeln;
if (m1 mod 2) =1 then  writeln(m1,   ' - це непарне число ');  writeln;
if (s mod 3) =0 then writeln(m1,   ' - це число має вигляд 3k, ділиться на 3 націло');  writeln;
if (s mod 3) =1 then writeln(m1,   ' - це число  має вигляд 3k+1');  writeln;
if (s mod 3) =2 then writeln(m1,   ' - це число  має вигляд 3k+2');  writeln; m:= m1 mod 100;
if (m mod 4) =0 then writeln(m1,   ' - це число  має вигляд 4k, ділиться на 4 націло');  writeln;
if (m mod 4) =1 then writeln(m1,   ' - це число  має вигляд 4k+1');  writeln;
if (m mod 4) =2 then writeln(m1,   ' - це число  має вигляд 4k+2');  writeln;
if (m mod 4) =3 then writeln(m1,   ' - це число  має вигляд 4k+3');  writeln; m:= m1 mod 10;
if (m mod 5) =0 then writeln(m1,   ' - це число  має вигляд 5k, ділиться на 5 націло');  writeln;
if ( (s mod 3) =0)  and ((m mod 2)=0) then writeln(m1,   ' - це число  має вигляд 6k, ділиться на 6 націло');  writeln;
if (m mod 7) =0 then writeln(m1,   ' - це число  має вигляд 7k, ділиться на 7 націло');  writeln;
m:=m1; m:= m mod 1000;
if (m mod 8) =0 then writeln(m1,   ' - це число  має вигляд 8k, ділиться на 8 націло');  writeln;
if (s mod 9) =0 then writeln(m1,   ' - це число має вигляд 9k, ділиться на 9 націло');  writeln;
if (m mod 10) =0 then writeln(m1,   ' - це число має вигляд 10k, ділиться на 10 націло');  writeln;
end.   {закінчення алгоритму}
Протестуйте алгоритм  чотири рази та перевірте правильність результатів.
Завдання 2. Скласти і реалізувати алгоритм  знаходження   кількості першої цифри  від початку у цілому числа, що задане випадковим чином.
Program Cifr1;                                                     {оголошення  назви алгоритму}
var n, x,c,c1,k: integer;                                          {оголошення  змінних величин: цілі числа}
begin
    n:=(10+random(5)) *(20+random(7)) *(random(20)) + 1+random(3);     {випадкове число}
writeln( ' Якщо натуральне число  n=', n); writeln;            {виведення на екран випадкового числа}
x:=n;     while n>9 do      n:=n div 10;    c1:=n;    k:=0;                   {цикл з передумовою}
repeat
       c:= x mod 10;       if c=c1 then k:=k+1;      x:=x div 10;   until x=0;  {цикл з післяумовю}
writeln(' Кількість першої цифри дорівнює:   '
, k);  end.
Протестуйте алгоритм  чотири рази та перевірте правильність результатів.
Завдання 3. Скласти і реалізувати алгоритм  знаходження   кількості другої від початку цифри у цілому числа, що задане випадковим чином.
Program Cifr2;                                                                                            {оголошення  назви алгоритму}
var n, x,c,c1,k: integer;                                                           {оголошення  змінних величин: цілі числа}
begin
    n:=(10+random(5)) *(20+random(7)) *(random(20)) + 1+random(3);          {випадкове число}
writeln( ' Якщо натуральне число  n=', n); writeln;            {виведення на екран випадкового числа}
x:=n;     while n>100  do  n:=n div 10; c1:=n div 10;                                              {цикл з передумовою}
writeln('n=', n); end;  c1:=n mod 10; writeln('c1=',c1); writeln('n=',n);     k:=0;                 
repeat       c:= x mod 10;   if c=c1 then k:=k+1;   x:=x div 10;   until x=0;            {цикл з післяумовoю}
writeln('Кількість другої цифри дорівнює:'
, k);  end.
Протестуйте алгоритм  чотири рази та перевірте правильність результатів.

Практична робота 15
 Алгоритми табуляції  перестановок на мові Pascal

Завдання 1. Скласти і реалізувати алгоритм  для    табулювання значень  перестановок натуральних чисел. Наприклад:  Перестановки для трьох чисел:  123   132   213   231   321  312(усього шість).

Program Perestanovka1;                               { оголошення назви алгоритму }
const n=5;                                                  { оголошення  константи, кількість чисел в  перестановці }
var a: array [1..n] of integer;                       { оголошення масиву цілих чисел  для запису  перестановок }
      index: integer;                                                { оголошення  цілої змінної для кодування чисел в перестановках}

procedure generate (l, r: integer);                 { оголошення підпрограми генератора перестановок }
var i, v: integer;                                           { оголошення змінних цілих чисел  для  алгоритму }
begin
      if (l = r) then begin                                                { оголошення перевірки рівності двох індексів }
        for i:=1 to n do write (a [i], '');        { оголошення циклу з лічильником  для виведення  перестановок }
        writeln;
      end    else    begin                                  
        for i:=l to r do begin                          { оголошення циклу з лічильником  для генерації  перестановок }
           v:=a[l]; a[l]:=a[i]; a[i]:=v;                      {Обмін a[i], a[j]}
           generate (l + 1, r);                         {Виклик нової генерації перестановок - це рекурсія в алгоритмі}
           v:=a[l]; a[l]:=a[i]; a[i]:=v;                    {Обмін a [i], a [j]}
        end;        end;    end; 
begin
      for  index:=1  to  N  do  a[index]:=index;    { цикл  з лічильником  для генерації  перестановок }
      generate(1, n);     end.                                          {оголошення процедури  для генерації  перестановок }
Протестуйте алгоритм  чотири рази  тобто треба  змінити число табуляції: 1)соnst=3; 2) соnst=4;  3) соnst=6.
Практична робота 16
 «Алгоритми інтерполяції квадратними
 поліномами трьох точкової статистики на мові Pascal»

Завдання 1. Створити алгоритм який за трьома відомими точками в прямокутній  системі координат генерує формулу квадратичної функції використовуючи розв’язання  системи 3-х рівнянь з трьома невідомими методом Крамера. Ця задача називається «інтерполяція квадратичними поліномами» або знаходження «квадратичного тренду».
Розв’язання.  Випадковим чином задаються три точки деякої статистики:  (х1; у1), (х2; у2), (х3; у3). Вважається, що ці три точки належать деякій параболі,  що записується  формулою вигляду: у=ах2+bx+c.  Підставляємо кожну точку у формулу і отримуємо систему трьох рівнянь з трьома невідомими а, b, c
{| aх1*х1 + bх1 + c * 1 = y1 | }
{| aх2*х2 + bх2 + c * 1 = y2 }
{| aх3*х3 + bх3 + c * 1 = y1 }
Розв’язуємо систему відносно  а, b, c  за допомогою метода визначників (метод Крамера).
Program  Interpoljacia;
var a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3, x, y, z, e, ex, ey, ez, x1, x2, x3, y1, y2, y3: real;
begin
x1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y1:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 2+random(3) ;   
writeln( ' Якщо перша точка, що належить квадратичній функції х1=', x1, 'y1=', y1); writeln;
x2:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y2:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 3+random(3) ;   
writeln( ' Якщо друга точка, що належить квадратичній функції х2=', x2, 'y2=', y2); writeln;
x3:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 1+random(3) ; 
y3:=-(1+random(3)) *(-2+random(1)) *(-random(2)) + 4+random(3) ;   
writeln( ' Якщо третя точка, що належить квадратичній функції х3=', x3, 'y3=', y3); writeln;
a1:= x1*x1;    a2:= x2*x2;  a3:= x3*x3;   b1:= x1;    b2:= x2;  b3:= x3;  c1:=1;    c2:=1;  c3:=1;
d1:=y1;   d2:=y2;  d3:=y3;
 e:= (a1 * b2 * c3 + b1 * c2 * a3 + c1 * a2 * b3-a3 * b2 * c1-b3 * c2 * a1-c3 * a2 * b1);
 ex:=(d1 * b2 * c3 + b1 * c2 * d3 + c1 * d2 * b3-d3 * b2 * c1-b3 * c2 * d1-c3 * d2 * b1);
 ey:=(a1 * d2 * c3 + d1 * c2 * a3 + c1 * a2 * d3-a3 * d2 * c1-d3 * c2 * a1-c3 * a2 * d1);
 ez:=(a1 * b2 * d3 + b1 * d2 * a3 + d1 * a2 * b3-a3 * b2 * d1-b3 * d2 * a1-d3 * a2 * b1);
 if (e=0) and ((ex=0) or (ey=0) or (ez=0)) then
    writeln ( 'безліч рішень')
 else if (e <> 0) and ((ex = 0) or (ey = 0) or (ez = 0)) then
    writeln ( 'немає рішень')
 else begin
    x:=ex/e;     y:=ey/e;     z:=ez/e;
writeln ( 'Головний визначник е =', e);writeln ( 'a =', x); writeln ( 'b =', y); writeln ( 'c =', z);
writeln( ' Шукана квадратична функція  у=', x,  '*x*x+( ' ,  y,  ' )x+( ',  z,  ' ) ');  end; end.



Практична робота 17
 Алгоритми з двовимірними масивами

Задача 1. Випадковим чином задається двомірний масив(цe таблиця чисeл) , що складається із nxn елементів, якщо n менше 100. Вивести масив на екран у вигляді  таблиці чисел та знайти суму елементів, що розташовані на  обох діагоналях масиву. Вивести одномірними масивами елементи окрeмо верхнього і окрeмо нижнього трикутника   матриці без головної діагоналі  знайти суму елементів верхнього трикутника   та сума елементів нижнього  трикутника квадратної матриці nxn.
Розвязання.
Program Summa_trukutnuk_matriza;
const m=100;  n=100;
var  sum,f,s,  d, c:real;    b:array[1..m*n] of real;
 xn:array[1..m*n] of real;     xv:array[1..m*n] of real;      a:array[1..m,1..n] of real;
i,j,p, g, k:integer;
begin
writeln('  Ввeдіть кількість рядків квадратного масиву,  яка мeншe 100 ');
readln(k);    s:=0;
for i:=1 to k do
for j:=1 to k do  begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j];   end;  writeln('   ');
writeln(' Масив випадкових чисeл: ');  writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do  begin      write('  a[',i,';',j,']:= ',a[i,j]  {'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end; writeln('   '); end;
s:=0;   for i:=1 to k do  begin   s:=s+a[i,i];  end;
f:=0;  for i:=1 to k do  begin  f:=f+a[i,k+1-i]; end;
     if   k mod 2 =1 then   sum:=s+f- a[k div 2 +1, k div 2 +1]   else   sum:=s+f;
p:=1;  g:=1;    for i:=1  to k do   begin
for j:=k  downto 1 do  begin
  if   i<j  then  begin
  xv[g]:= a[i,j];  g:=g+1; end;  end; end;
  for i:=1  to k do   begin
  for j:=1  to i-1 do  begin
  if   i>j  then  begin
  xn[p]:= a[i,j];   p:= p+1; end; end;  end;
writeln(' Масив   чисeл нижнього трикутника матриці : ');
          d:=0;  for i:=1  to   ((k-1)*k) div 2     do     begin    d:=d+ xn[i];
write('  xn[',i,']= ', xn[i]); end; writeln('   ');
writeln(' Масив   чисeл вeрхнього трикутника матриці :  ');
           c:=0;  for i:=1  to ((k-1)*k) div 2    do   begin
c:=c+ xv[i];  write('  xv[', i, ']= ', xv[i]);   end;    writeln('   ');
writeln('  Сума чисел головної діагоналі матриці:', s); writeln('    ');
writeln('  Сума  чисел  бічної  діагоналі матриці :', f); writeln('    ');
writeln('  Сума чисел на обох діагоналях: ', sum);   writeln('    ');
writeln('  Сума чисел верхнього трикутника матриці ' , c);  writeln('    ');
writeln('  Сума чисел нижнього трикутника матриці  ' ,  d);    writeln('    ');       end.

Практична робота 18. 
Алгоритми розв′язування систем лінійних рівнянь

Б. Метод Крамера.
Розв′язування систем лінійних рівнянь з двома невідомими (х; у).
|a1*x + b1*y = c1         
|a2*x+b2*y=c1 
Метод визначників:                                                           
     |c1 b1|           |a1 c1| 
     |c2 b2|           |a2 c2| 
 x = ---------     y = ---------                                               
      |a1 b1|           |a1 b1|                                            
      |a2 b2|           |a2 b2|                                           
Обчислюємо визначники квадратних матриць 2х2:                                   
x = (c1*b2-c2*b1)/(a1*b2-a2*b1)                                          
y = (a1*c2-a2*c1)/(a1*b2-a2*b1)  

Алгоритм  Крамера мовою Pascal:

Program KRAMER;
var a1,a2,b1,b2,c1,c2,x,y,d,dx,dy:real;
begin
   writeln('введіть коефіциєнти двох рівнянь: a1,b1,c1,a2,b2,c2');
   readln(a1,b1,c1,a2,b2,c2);
   d  := (a1*b2-a2*b1);
   dx := (c1*b2-c2*b1);
   dy := (a1*c2-a2*c1);
   if ( d=0 ) and ( (dx=0) or (dy=0) ) then
      writeln('Безліч розв′язків у системи')
   else if ( d<>0 ) and ( (dx=0) or (dy=0) ) then
      writeln(' Немає розв′язків у системи')
   else begin writeln('Єдиний розв′язок у системи');
      x:=dx/d; y:=dy/d;
      writeln('x = ', x);  writeln('y = ', y);
   end;
end.




Практична робота 19
  Вкладені цикли мовою Paѕcal

Приклад № 1. Обчислити значення змінної  y=3k+ n при всіх значеннях змінних N=1, 2, 3, 4  і K=3, 8, 13, 18, 23.
Розв′язання.
Якщо перебирати всі значення N і K, ми повинні отримати 4*5=20 значень змінної y =f(n, k)= 3k + n.
Скласти програму можна в такий спосіб: для кожного значення N перебрати всі значення К від 3 до 23 з кроком  5, тобто N використати як параметр зовнішнього циклу, К - як параметр внутрішнього циклу.
Текст програми:
Program priklad_1;
var n, k, y:integer;
begin
for n:=1 to 3 do   begin k:=2;
while k<=23 do   begin y:=3*k+n;
writeln('  n=  ', n:3, '  k=  ',  k:3, ' 3k + n =  ' , y:3);
k:=k+5; end;  end; end.
Параметр N змінюється з кроком 1, тому зовнішній цикл організований з використанням оператора For; параметр К змінюється з кроком 5, тому внутрішній цикл є циклом While.

Приклад № 2. Старовинна задача. Скільки можна купити биків, корів та телят, якщо вартість одного бика - 10 тис. грн, однієї корови - 5  тис. грн, а за одного теля платять 0,5 тис. грн. І якщо на 100 тис. рублів потрібно купити 100 голів скоту.
Розв'язування:
Позначимо через b - кількість биків; k - кількість корів; t - кількість телят. Після цього можна записати два рівняння:
10b + 5k + 0.5t = 100       і          b + k + t = 100
На 100 рублів можна купити:  1) не більше 10 биків, тобто 0<=b<=10;  2)  не більше 20 корів, тобто 0<=k<=20;
2) не більше 200 телят, тобто 0<=t<=200. Отже отримуємо текст програми:
Program Priklad_2;
var b, k, t:integer;
begin
for b:=0 to 10 do
for k:=0 to 20 do
for t:=0 to 200 do
if (10*b + 5*k + 0.5*t = 100) and (b + k + t = 100)  then
writeln('Биків - ', b, ';  корів - ', k,';   телят - ',t);
end.

Завдання для самостійної роботи.
1.1.  Обчислити значення змінної  y=5k-4n при всіх значеннях змінних N=1, 2, 3, 4  і K=2, 8, 14, 20, 26.
1.2. Скільки може бабуся купити на пенсію 1280 грн  індюків , курей та  гусей, якщо вартість одного індюка - 75 грн, однієї курки - 55 грн, а за одного гуся платять 65 гривень. І якщо  їй  потрібно купити лишe 20 голів.
1.3.   Обчислити значення змінної  y=7k-3n при всіх значеннях змінних N=1, 2, 3, 4  і K=1, 8, 15, 22, 29.
1.4. Скільки може дідусь купити на пенсію 1580 грн  індюків , курей та  гусей, якщо вартість одного індюка - 75 грн, однієї курки - 55 грн, а за одного гуся платять 65 гривень. І якщо  їй  потрібно купити лишe 20 голів.
1.5.    Розв′язати рівняння:  а)58=5k-4n;   б) 76=5(k+3)2-4(n-5)3 ;  в) 1=  5/(k+3) -  4/(n-5)3            при значеннях змінних 1 <N<20  і 1<K<20.



Завдання 1 для самостійного опрацювання
Програмування лінійних алгоритмів на Pascal
Записати програму мовою Pascal та протестувати її на правильність.
Завдання 1.0 Дано відстань L в сантиметрах. Використовуючи операцію ділення без остачі, знайти кількість повних метрів в нім (1 метр = 100 см).
Завдання 1.1. Дано тризначне число. Вивести спочатку його останню цифру (одиниці), а потім - його середню цифру (десятки).
Завдання 1.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість повних годин, що пройшло з початку доби.
Завдання 2.0 Дано маса M в кілограмах. Використовуючи операцію ділення без остачі знайти кількість повних тонн в ній (1 тонна = 1000 кг).
Завдання 2.1. Дано тризначне число. Знайти суму і добуток його цифр.
Завдання 2.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість секунд, що пройшли з початку останньої хвилини.
Завдання 3.0 Даний розмір файлу в байтах. Використовуючи операцію ділення без остачі знайти кількість повних кілобайт, які займає даний файл (1 кілобайт = 1024 байти).
Завдання 3.1. Дано тризначне число. У нім закреслили першу зліва цифру  приписали її справа. Вивести отримане число.
Завдання 3.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість секунд, що пройшли з початку останньої години.
 Завдання 4.0 Дані цілі позитивні числа A і B (A > B). На відрізку довжини A розміщена максимально можлива кількість відрізків довжини В (без накладень). Використовуючи операцію ділення без остачі, знайти кількість відрізків B, розміщених на відрізку A.
Завдання 4.1. Дано тризначне число. Вивести число, отримане при прочитанні початкового числа справа наліво.
Завдання 4.2. З початку доби пройшло N секунд (N - ціле). Знайти кількість повних хвилин, що пройшли з початку останньої години.
Завдання 5.0 Дані цілі позитивні числа A і B (A > B). На відрізку довжини  розміщена максимально можлива кількість відрізків довжини B (без накладень). Використовуючи операцію узяття залишку від ділення без остачі, найти довжину незайнятої частини відрізку A.
Завдання 5.1. Дано тризначне число. У нім закреслили першу справа цифру і приписали її зліва. Вивести отримане число.
Завдання 5.2. Дні тижня пронумеровані таким чином: 0 – нeділя, 1 - понеділок, 2 - вівторок . . ., 6 - субота. Дано ціле число K, що в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було понеділком.
Integer6. Дано двозначне число. Вивести спочатку його ліву цифру (десятки), а потім - його праву цифру (одиниці). Для знаходження десятко використовувати операцію ділення без остачі, для знаходження одиниць - операцію узяття залишку від ділення.
Integer15. Дано тризначне число. Вивести число, отримане при перестановці цифр сотень і десятків початкового числа (наприклад, 123 перейде  213).
Integer25. Дні тижня пронумеровані таким чином: 0 - воскресіння 1 - понеділок, 2 - вівторок . . ., 6 - субота. Дано ціле число K лежаче в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було четвергом.
Integer7. Дано двозначне число. Знайти суму і добуток його цифр.
Integer16. Дано тризначне число. Вивести число, отримане при перестановці цифр десятків і одиниць початкового числа (наприклад, 123 перейде в 132).
Integer26. Дні тижня пронумеровані таким чином: 1 - понеділок, 2 - вівторок . . ., 6 - субота, 7 - воскресіння. Дано ціле число K лежаче в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було вівторком.
Integer8. Дано двозначне число. Вивести число, отримане при перестановці цифр початкового числа.
Integer18. Дано ціле число, більше 999. Використовуючи одну операцію ділення без остачі і одну операцію узяття залишку від ділення, знайти цифру відповідну розряду тисяч в записі цього числа.
Integer27. Дні тижня пронумеровані таким чином: 1 - понеділок, 2 - вівторок . . ., 6 - субота, 7 - воскресіння. Дано ціле число K лежаче в діапазоні 1-365. Визначити номер дня тижня для K -го дня року, якщо відомо, що цього року 1 січня було суботою.
Integer9. Дано тризначне число. Використовуючи одну операцію ділення без остачі вивести першу цифру даного числа (сотні).
Integer19. З початку доби пройшло N секунд (N - ціле). Знайти кількість повних хвилин, що пройшли з початку доби.

Integer28. Дні тижня пронумеровані таким чином: 1 - понеділок, 2 - вівторок . . ., 6 - субота, 7 - воскресіння. Дано ціле число K лежаче в діапазоні 1-365, і ціле число N, лежаче в діапазоні 1-7. Визначити номер дня тижня для K -го дня року, якщо відомо, що в цьому році 1 січня було в день тижня з номером N.

Немає коментарів:

Дописати коментар