неділя, 7 січня 2018 р.

Лінійні алгоритми мовою Pascal

Практична робота 1. Лінійні алгоритми мовою Pascal
Завдання 1(2 бали). Скласти і реалізувати алгоритм в програмному середовищі, який визначає із довільної кількості прямих загального положення   число точок перетину цих прямих. Значення  кількості прямих вводяться з клавіатури; і виводить на екран  кількість точок перетину цих прямих. Використовувати в алгоритмі більше однієї цілої змінної не можна.
Алгоритм  мовою Pascal
Program linearPunkt;
{алгоритм знаходження кількості точок перетину прямих на площині}
var  { оголошується опис змінних величин, які використовує алгоритм}
k: integer; {оголошується  ціла змінна у даному  алгоритмі}
begin
write('k='); readln(k); { на екрані запит на введення з клавіатури цілого числа: у}
 write('кількість прямих k='); writeln(k,'  '); { перевірка початкового: k}
k:=(k-1)*k div 2; {обчис-ня  кіл-сті точок перетину за  форм-лою:0,5(k-1)k}
writeln;  write('кількість точок перетину прямих k='); {повідомлення}
writeln(k,'  ');   {виведення результату обчислення алгоритму}
  writeln;   end.                   {закінчення дій алгоритму}
Протестувати правильну роботу цього алгоритму  для трійок цілих  чисел:  1;  2; 4; 5; 10;  100;  901;   9000; 101010.

Завдання 2.(2 бали). Нехай R- це приблизна кількість риби у ставку(R>0), проте вона невідома. Одночасно виловити усю рибу в ставку неможливо. Тому першого дня зі ставка виловлюють  K риб(K>0), помічають їх і відпускають назад у ставок. Через день знову закидають сітку і виловлюють  M риб(M>0), серед яких виявляють  N помічених риб(0<N<=K). Створіть і реалізуйте алгоритм, який знаходить приблизну кількість риб у ставку.

Розв’язання. Нехай у ставку R – риб, тоді K/R – це ймовірність виловити помічену рибу. Кількість помічених риб серед другого вилову приблизно дорівнює M*K/R =N. Звідси отримаємо приблизну кількість риб у ставку R =M*K/N риб.
program Fisher;             {назва    алгоритму}
var r,k,m,n: integer;      {оголошення  змінних величин: r,k,m,n - це цілі числа}
begin                                {початок виконання дій  алгоритму}
readln(k);                        {оголошення  про введення  числа k - це ціле число}
readln(m);                    {оголошення  про введення  числа m - це ціле число}
readln(n);                        {оголошення  про введення  числа n - це ціле число}
r:=k*m div n;    {арифметичні дії над цілими k,m,n  і присвоєння результату  r}
write(r);                 {оголошення  про виведення  числа r - це ціле число}
end.                              {кінець виконання дій      алгоритму}

Протестуйте його для трійок цілих чисел (K;M;N)={(2000;2400;1000), (2300;2500;1600), (5581;3159;2992), (4581;3159;2992), (2001;20001;2001), (2077;2166;1552)}.
Завдання 3(4 бали). Самостійно скласти і реалізувати алгоритм в програмному середовищі, який визначає із довільної кількості прямих загального положення   на площині    знаходить кількість  утворених частин площини, при умові, що кожна точка перетину прямих утворена не більше, ніж двома прямими. Значення  кількості прямих вводяться з клавіатури; і виводить на екран  кількість частин площини. Використовувати в алгоритмі більше однієї цілої змінної не можна. Формула кількості частин на площині після перетину n непаралельних прямих має вигляд:  k(n)=  (n+1)n/2 +1, де n - натуральне число.
Протестувати правильну роботу цього алгоритму  для трійок цілих  чисел:  1;  2; 3; 4; 5;  6;  7;   3059; 121314.

Завдання 4. (4 бали). Самостійно скласти і реалізувати алгоритм в програмному середовищі,  що за заданими n точками  на лощині, знаходить кількість  відрізків між цими усіма точками.  Протестувати правильну роботу цього алгоритму  для трійок цілих  чисел:  1;  2; 3; 4; 5;  6;  7;   2099; 521314.  Формула кіл-сті відр-ів: k(n)=  (n-1)n/2 , де n - натуральне число.


Практична робота 2. Лінійні алгоритми мовою Pascal
Завдання 1(6 балів). Скласти і реалізувати алгоритм в програмному середовищі, який виконує взаємний обмін числовими значеннями двох цілих змінних; і виводить на екран  два початкових значення змінних і два кінцеві значення цих змінних. Використовувати в алгоритмі більше двох цілих змінних не можна.
Алгоритм  мовою Pascal
program SuperposiziaNumer;
{алгоритм обміну числовими значеннями двох змінних}
var       {оголошується опис змінних величин, які використовує алгоритм}
x,y: integer;            {оголошуються дві цілі змінні у даному  алгоритмі}
begin                     {оголошується початок алгоритмічних дій}
write('x=');       {на екрані запит на введення з клавіатури цілого числа: х}
readln(x);     {зчитування числового значення і внесення його в змінну  х}
write('y=');      { на екрані запит на введення з клавіатури цілого числа: у}
readln(y);     {зчитування числового значення і внесення його в змінну  у}
 write('початкове значення x='); writeln(x,'  ');  { перевірка початкового: х}
 write('початкове значення y='); write(y,'  ');     { перевірка початкового: у}
x:=x+y; y:=x-y; x:=x-y;                {взаємний обмін числами за допомогою арифметичних дій.}
writeln;                                     {поставити курсор на екрані з нового рядка}
 write('кінцеве значення x=');         {виведення на екран  повідомлення}
writeln(x,'    ');             {виведення на екрані  числового значення змінної х}
 write('кінцеве значення y=');        {виведення на екран  повідомлення}
write(y,'    ');                {виведення на екрані  значення значення змінної у}
 writeln;                       {поставити курсор на екрані з нового рядка}                 
end.                              {закінчення дій алгоритму}

Протестувати правильну роботу цього алгоритму  для двох цілих  чисел:
  -9 і 17;     0 і 7;       100 і; 250;           -900 і - 1000.
Завдання 2(6 балів). Cамостійно скласти і реалізувати алгоритм program SuperposiziaNumer, який виконує взаємний обмін числовими значеннями між трьома цілими  змінними; і виводить на екран  три початкових значення змінних і три  кінцеві значення цих змінних. Використовувати в алгоритмі більше чотирьох  цілих змінних не можна.
Протестувати правильну роботу цього алгоритму  для трійок цілих  чисел:
 -2;  -9 і 17;      -1;  0 і 7;      7;  100 і 250;         -300;  -900 і - 1000.


Практична робота 3. Лінійні алгоритми мовою Pascal
Завдання 1(6 балів). Скласти і реалізувати алгоритм в програмному середовищі, який визначає із двох довільних дійсних чисел найменше число та найбільше число. Значення  двох дійсних змінних вводяться зклавіатури; і виводить на екран  найменше значення із двох  чисел  та найбільше значення із двох  чисел. Використовувати в алгоритмі більше трьох дійсних змінних не можна.
Алгоритм  мовою Pascal
program  МАхМіnNumer;  {алгоритм знаходження МАХ(x;y) та МІN(x;y) }
var     {оголошується опис змінних величин, які використовує алгоритм}
x,y,z: real;            {оголошуються три дійсні  змінні у даному  алгоритмі}
begin                        {оголошується початок алгоритмічних дій}
write('x=');     {на екрані запит на введення з клавіатури цілого числа: х}
readln(x);     {зчитування числового значення і внесення його в змінну  х}
write('y=');   { на екрані запит на введення з клавіатури цілого числа: у}
readln(y);    {зчитування числового значення і внесення його в змінну  у}
 write('початкове значення x='); writeln(x,'  '); { перевірка початкового: х}
 write('початкове значення y='); write(y,'  '); { перевірка початкового: у}
 z:=abs(x-y); x:=0.5*(x+y-z);  y:=x+z;    {знаходження МАХ(x;y) та МІN(x;y)}
 writeln;                                 {поставити курсор на екрані з нового рядка}
 write('найменше значення x=');   {виведення на екран  повідомлення}
writeln(x,'  ');    {виведення на екран   числового значення змінної х}
 write('найбільше значення y=');    {виведення на екран  повідомлення}
write(y,'  ');     {виведення на екрані  числового значення змінної y}
 writeln;              {поставити курсор на екрані з нового рядка}                 
end.                                             {закінчення дій алгоритму}
Протестувати правильну роботу цього алгоритму  для двійок цілих  чисел:       -9 і -17;      0 і -8;    -2 і 0;    -1 і 1;    100 і 250;    900  і - 1000.
Завдання 2(6 балів). Cамостійно скласти і реалізувати алгоритм в програмному середовищі, який визначає із трьох довільних дійсних чисел найменше число та найбільше число. Значення  трьох дійсних змінних вводяться з клавіатури; і результат  виводить на екран  найменше значення із трьох  чисел  та найбільше значення із трьох  чисел. Використовувати в алгоритмі більше чотирьох дійсних змінних не можна.
Протестувати правильну роботу цього алгоритму  для трійок цілих  чисел:

 -2;  -9 і -17;      -1;  0 і - 7;      7;  100 і 250;         300;  300 і - 300.


Практична робота 4. Лінійні алгоритми мовою Pascal
Завдання 1.(4 бали). Нехай R- це приблизна кількість риби у ставку(R>0), проте вона невідома. Одночасно виловити усю рибу в ставку неможливо. Тому першого дня зі ставка виловлюють  K риб(K>0), помічають їх і відпускають назад у ставок. Через день знову закидають сітку і виловлюють  M риб(M>0), серед яких виявляють  N помічених риб(0<N<=K). Створіть і реалізуйте алгоритм, який знаходить приблизну кількість риб у ставку.
Розв’язання. Нехай у ставку R – риб, тоді K/R – це ймовірність виловити помічену рибу. Кількість помічених риб серед другого вилову приблизно дорівнює M*K/R =N. Звідси отримаємо приблизну кількість риб у ставку R =M*K/N риб.
program Fisher;             {назва    алгоритму}
var r,k,m,n: integer;      {оголошення  змінних величин: r,k,m,n - це цілі числа}
begin                                {початок виконання дій  алгоритму}
readln(k);                        {оголошення  про введення  числа k - це ціле число}
readln(m);                    {оголошення  про введення  числа m - це ціле число}
readln(n);                        {оголошення  про введення  числа n - це ціле число}
r:=k*m div n;    {арифметичні дії над цілими k,m,n  і присвоєння результату  r}
write(r);                 {оголошення  про виведення  числа r - це ціле число}
end.                              {кінець виконання дій      алгоритму}
Протестуйте його для трійок цілих чисел (K;M;N)={(2000;2400;1000), (2300;2500;1600), (5581;3159;2992), (4581;3159;2992), (2001;20001;2001), (2077;2166;1552)}.
Завдання 2.(4 бали). Із молока,  жирність якого становить а%(1<a<7) виготовляють сир жирністю b%(15<b<30).При цьому залишається сироватка жирністю с% (0,0001<c< 0,09).
Створіть і реалізуйте алгоритм, який знаходить кількість сиру m кг, що виходить із k тонн молока.
Розв’язання. Нехай із k тонн молока виходить m кг сиру. Маса жиру в k тоннах молока k*1000*(а/100) =10kа кг. Маса жиру в m кг сиру становить m*(b/100) кг.  Маса жиру в сироватці становить (k*1000-m)*(с/100).  Оскільки при переробці молока кінцевими продуктами є сир та сироватка, тоді складаємо рівняння для кількості жиру в обох продуктах:   m*(b/100) + (k*1000-m)*(с/100) =10kа, звідси  m =1000k(a-c)/(b-c)      
program Cheese;             {назва    алгоритму}
var a,b,c, k,m: real;      {оголошення  змінних величин: a,b,c, k,m: - це дійсні числа}
begin                                {початок виконання дій  алгоритму}
writeln('введіть жирність молока 1<a<5  а='); readln(a);
writeln('введіть жирність сиру 15<b<30  b='); readln(b);
writeln('введіть жирність сироватки 0.001<c<0.100, c='); readln(c);
writeln('введіть кількість молока 1<k<1000, k='); readln(k);
        {оголошення  про введення  числа  k - це дійсне число}
m:=1000*k*(a-c)/(b-c);    {арифметичні дії над дійсними a,b,c, k,  і присвоєння результату  m}
write(m);                 {оголошення  про виведення  числа m - це ціле число}
end.                              {кінець виконання дій      алгоритму}.
Протестуйте алгоритм для четвірок дійсних  чисел (a; b; c; k)={(5.5; 17.4; 0.1; 1), (3.89; 16.67; 0.086; 20), (4.581; 17.759; 0.029; 40.5), (3.181; 18.59; 39.92; 30), (4.1; 19.61; 0.08; 25).
 Завдання 3.(4 бали). Із молока,  жирність якого становить а%(1<a<7) виготовляють вершки k кг (1< k <100)  вершків, жирністю b%(20<b<60). Самостійно створіть і реалізуйте алгоритм, який знаходить кількість молока m кг, жирність якого становить а%(1<a<7),  із якого вийшло  k кг (0.1< k <100)  вершків, жирністю b% (20<b<60).
Розв’язання. Нехай із m кг молока виходить k  кг  вершків. Маса жиру в m кг молока становить  0.01*а* m  Маса жиру в k кг вершків становить 0.01*b* k  кг. Оскільки при переробці молока кінцевими продуктами є вершки, тоді складаємо рівняння для кількості жиру в обох продуктах:   0.01*а* m  = 0.01*b* k.  Звідси   m = b* k/а, для b,k,а дійсних.

Протестуйте алгоритм для трійок дійсних  чисел (a; b; k)={(5.5; 27.4; 1), (3.89; 26.67; 3.86), (4.581; 37.759;  20.5), (3.181; 28.59;  30), (4.1; 39.61; 25).


Практична робота 5. Лінійні алгоритми мовою Pascal
Завдання 1.(4 бали). Створіть і реалізуйте алгоритм, який знаходить скільки треба досипати a кг солі до k  кг водного m% розчину, щоб отримати водний розчин з концентрацією n %.
Розв’язання. Нехай у розчин треба досипати  a кг солі. Маса солі у початковому розчині становить 0.01mk   кг. Маса солі у новому розчині становить 0.01n(k +а). Тоді маємо рівняння: 0.01n(k +а)= 0.01mk+а.  Звідси, маємо а =0.01k(m- n)/(0.01n -1)
program SaltSolution;             {назва    алгоритму}
var a,k,m,n: real;                 {оголошення  змінних величин: а,k,m,n - це дійсні числа}
begin
writeln('введіть початкову масу води 1<k<5000  k='); readln(k);
writeln('введіть початковий відсоток концентрації солі у воді 1<m<10 m='); readln(m);
writeln('введіть кінцевий відсоток концентрації солі у воді 10<m<60  n='); readln(n);
a:=0.01*k*(m- n)/(0.01*n -1); {арифметичні дії над дійсними k,m,n  і присв-я результату  a}
write(a , 'кг');                 {оголошення  про виведення  числа a - це ціле число}
end.                              {кінець виконання дій      алгоритму}
Протестуйте його для трійок дійсних чисел (k;m;n)={(200; 2; 12), (300;2.5;16), (5500;3;29), (581; 3; 9), (200; 1.8; 20), (1000; 1.6; 2)}.
Завдання 2.(4 бали). Швейна фабрика має пошити  k  костюмів  двох моделей. Для визначення того, скільки костюмів і якої моделі треба пошити провели опитування серед покупців.  Результати опитування: 1-шу модель вибрало  m  покупців;  2-гу модель вибрало  n покупців.  Створіть і реалізуйте алгоритм, який знаходить кількість костюмів і якої моделі треба пошити, якщо опитано  m+n покупців. 
Розв’язання. Частка покупців, котрі вибрали першу модель, становить  m /(m+n). Частка покупців, котрі вибрали другу модель, становить  n /(m+n).  Швейна фабрика має пошити:
1-у модель   km /(m+n) одиниць та  2-у модель   kn /(m+n) одиниць.
program Models;  {назва    алгоритму}
var a1,a2,k,m,n: integer; {оголошення  змінних величин: a1,a2,n, k,m: - це цілі числа}
begin                                {початок виконання дій  алгоритму}
writeln('введіть кількість  замовлених  костюмів 1<k<10000  а='); readln(k);
writeln('введіть кількість покупців 1-ої моделі  1<m<3000); readln(m);
writeln('введіть кількість покупців 2-ої моделі  1<n<3000); readln(n);
        {оголошення  про введення  числа  k - це дійсне число}
a1:=(k*m) div (m+n); {арифметичні дії над цілими n, k,m,  і присвоєння результату  a1}
a2:=(k*n) div (m+n);  {арифметичні дії над цілими n, k,m,  і присвоєння результату  a2}
write('a1=',a1, 'одиниць; ', 'a2=', a2, 'одиниць.'); {виведення  кіль-сті модельних костюмів }
end.                              {кінець виконання дій      алгоритму}.
Протестуйте алгоритм для трійок цілих  чисел (a; b; c; k)={(5; 1;  1), (3; 16; 20), (4581; 17; 29), (3181; 181; 59), (3900; 92; 30), (410; 19; 25).
 Завдання 3.(4 бали). Син з батьком домовилися зустрітися між  k та m годинами протягом доби. Але у них існувала умова зустрічі: той, хто приходить першим на місце зустрічі,  чекає другого не більше n хв, після чого покидає місце зустрічі. Самостійно створіть і реалізуйте алгоритм, який знаходить ймовірність зустрічі сина та батька.  
Розв’язання. Нехай х – момент приходу сина;  у – момент приходу батька; тоді умова зустрічі батька та сина записується виразом:  |x-y|=<n. Тоді -n=< x-y=<n,  звідки отримаємо: y=<х+n;  у>=x-n.  Якщо А – подія, коли батько і син зустрінуться за цієї умови, то фактом зустрічі буде точка вибрана із заштрихованої 6-кутника. Тоді ймовірність зустрічі
 Р(А)=(Площа 6-кутника):(площа квадрата)=(m-k) 2*602-(60m-60k- n)2/((m-k) 2*602)
program Meeting;
var k,m,n: integer;   p: real;
begin  writeln(' введіть нижню межу  на проміжку зустрічі: 10<k<20  k='); readln(k);
writeln(' введіть верхню межу на проміжку зустрічі: 11<m<24  m='); readln(m);
writeln(' тривалість очікування в хвилинах  5<n<60  n='); readln(n);
p:=((m-k)*(m-k)*60*60-(60*m-60*k-n)*(60*m-60*k-n))/((m-k)*(m-k)*60*60);
write('p=',p);  {виведення результату}      end. {кінець  алгоритму}
Протестуйте алгоритм для трійок дійсних  чисел (k; m; n)={(15; 17.41), (8; 12; 80), (14; 17; 15), (18; 19; 15), (12; 15; 25).






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

Завдання 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.

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

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