з точки зору мови програмування Pascal:
рядок чисел=лінійний масив=вектор з координатами
Практична робота 1.
Алгоритми дій з лінійними масивами мовою Pascal
program Vector1; {Алгоритм підрахунків координат лінійної комбінації трьох векторів(напрямлених відрізків) або дії з елементами числового масиву}
const n=2; var a, b,c,d: array [1..n] of real; i: integer;
sk1, sk4, sk2, sk3: real;
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( 'Це модулі(або довжини) векторів a, b,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 t, p,w,v,h: array [1..n] of real; s, i: integer;
s1, s4, s2, s3: real;
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( 'Це модулі(або довжини) векторів t, p,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 ( 'Це три скалярні добутки для таких пар векторів: tp, tw, wp, 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; {оголошення змінних, які визначає індекс (и) елемента}
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 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.
***********************
********************************
Практична робота 14
Алгоритми властивостей цілих чисел мовою Pascal
********************************
Практична робота 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
Aлгоритми мовою Pascal
Завдання 1. На конференцію приїхали рівно по k представників від m(не менше ніж 2) фірм-конкурентів по виробництву гри
"Саmрf", при
цьому, усі представники різних фірм є конкурентами. Відомо, що у кожного
учасника конференції рівно n конкурентів серед усіх інших учасників. Скласти алгоритм, який знаходить найбільшу
кількість учасників та найменшу
кількість фірм-конкурентів в конференції?
Розв’язання. Кількість учасників конференції дорівнює km осіб. З іншого боку, кількість конкурентів у одного
представника дорівнює k(m-1)= n, звідси маємо
рівність km = n + 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, звідси маємо
рівність km = n + 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.
Цикли і розгалуження
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.
Програмування циклів мовою 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 осіб,
якщо серед кандидатів k ліцеїстів та m ліцеїсток. Скласти
і реалізувати алгоритм підрахунку усіх можливих способів створення Ради
парламенту мовою Pascal.
Вхідні дані: k, m, n.
Вивід: кількість!
Розв’язання.
Нехай кандидатів у Раду парламенту більше, ніж n.
У Раду парламента може зайти: або одна, або дві,…., або m ліцеїсток. Кількість способів обрати тільки ліцеїсток обчислюємо як комбінації: С1m =m(1 місце в раді парламенту); С2m =m(m-1)/2( для двох осіб) ; С3m
;… С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
Лінійні алгоритми мовою 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
Алгоритми табуляції мовою Pascal
Завдання 1. Скласти і
реалізувати алгоритм для знаходження табулювання значень квадратичної функції, що
задана рекурсивною формулою у=(а1х+а2)х+а3=
а1х2+а2х+а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
Алгоритми табуляції мовою 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
Лінійні алгоритми мовою 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); {випадкове число}
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.
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); {випадкове число}
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;
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.
writeln('Кількість другої цифри дорівнює:' , k); end.
Протестуйте алгоритм чотири рази та
перевірте правильність результатів.
Практична робота 15
Алгоритми табуляції перестановок на мові Pascal
Алгоритми табуляції перестановок на мові 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»
«Алгоритми інтерполяції квадратними
поліномами трьох точкової статистики на мові 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
Вкладені цикли мовою 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.
Немає коментарів:
Дописати коментар