Ви Гість.

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

Останнє редагування: 2019-02-18

Автор: Негода Сергій Петрович

 

Практична робота11.

Алгоритми розгалуження.

 

Задача 1. Василько та Юлія грають в таку гру. Спочатку кожен записує на папері свій прогноз – число від 1 до 6. Потім вони кидають гральний кубик з числами від 1 до 6 на гранях. Чий прогноз виявляється ближчим до того числа, що випало, той і переміг. Треба написати програму для визначення переможця.

Технічні умови. Програма Forа  читає з пристрою стандартного введення три числа через пропуски (пробіли) – прогноз Василька, Юлі та результат кидання кубика. Програма виводить “V”, якщо переміг Василько, “J” якщо Юлія або ”D” – якщо прогноз обох однаково близький до результату (тобто переможця виявити неможливо.

Програма мовою Pascal

programfora;                                               {оголошення назви алгоритму}

vara,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) thenwrite(' кнгиги можна помістити') {розгалуження для результату}

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  Виведення  ?

Практична робота 12.  

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

 

Завдання 1. Скласти і реалізувати алгоритм підрахунку різних букв у слові мовою Pascal.

 programWordlitera;                                  { оголошення назви алгоритму }

var   s:string;        r:real;      i,j,n:integer;  {оголошення змінних величин алгоритму: рядкові, дійсні, цілі}

begin                          {оголошення початку  алгоритму }

    r:=0;                {оголошення присвоєння нуля дійсній змінній}

    readln(s);               {оголошення про зчитування з екрану рядкової змінної }

    for i:=1 to length(s) do begin     {оголошення циклу з лічильником  в алгоритмі}

       n:=0;                                { оголошення про присвоєвоння нуля }

       for j:=1 to length(s) do begin                {оголошення циклу з лічильником  j в алгоритмі}

          ifs[i]=s[j] theninc(n);     { оголошення про перевірку на однаковість букв}

       end;                          { оголошення про кінець циклу }

       r:=r+1/n;                 {оголошення   лічильника кількості  різних букв} 

  end;      writeln('кількість різних букв у слові  r = ', r:1:0);  end.       { оголошення про кінець циклу, алгоритму }

Протестувати правильність виконання алгоритму: Ввести: карта;  агов; математика; інформатика-а-а.

Завдання 2. Скласти і реалізувати алгоритм знаходження цілих дільників натурального числа мовою Pascal.

programNumer;                                  { оголошення назви алгоритму }

var   a,n,c,d: integer;      {оголошення цілих величин  a,n,c,d в алгоритмі}

begin                                                      {початок алгоритму }

    readln(a);   {оголошення про зчитування з екрану змінної }

    n:=1;           { оголошення про присвоєвоння  лічильнику  1 }          

    while ( n <= sqrt(a) ) do begin         {оголошення циклу з передумовою(допоки … виконати…)  в алгоритмі}

       c:=a mod n;        {оголошення про знаходження остачі від ділення a:n}

       d:=a div n;      {оголошення про знаходження цілої частини від ділення a:n}

       if c = 0 then begin  writeln(n);        {Перевірка подільності націло, якщо  остача =0, то написати дільник}

          if n <> d then writeln( d );    {Перевірка неоднаковості дільників, якщо  дільники різні, то написати дільник}

       end;         inc(n);      end;   end.     { оголошення про кінець циклу та алгоритму }

Протестувати правильність виконання алгоритму: Ввести чисел: 4;  6; 8; 94;  96; 80; 99; 100; 272; 558; 997

Завдання 3. Скласти і реалізувати алгоритм знаходження простих натуральних чисел мовою Pascal.

Program Prime;

const LIMIT = 50;             {оголошення постійної величини  в алгоритмі: цілі}

var i,j,lim: integer;             {оголошення змінних величин  i, j, lim в алгоритмі: цілі}

begin                                  {початок основної програми  алгоритму}

  writeln;              {початок з нового рядку}

  for i:=1 to LIMIT do begin   {оголошення про початок циклу з лічильником i}   

      j:=2; lim:=round(sqrt(i)); { оголошення про присвоєвоння  лічильнику  2 }          

      while (i mod j <> 0) and (j <= lim) do inc(j);  {цикл з складеною передумовою}

      if (j > lim) then write( i,' ' );   end;  end.        { перевірка, вивід і оголошення про кінець}

Протестувати правильність виконання алгоритму: Замінити:  LIMIT = 50 на LIMIT = 100; LIMIT = 997.

Завдання 4. Скласти і реалізувати алгоритм знаходження суми цифр натурального числа мовою Pascal.

Program Summa;

var a,x, i,s: integer;

begin

     writeln('введіть ціле число');  readln(a);

     x:=a;  s:=0;

     while ( x < > 0 ) do begin

       s := s + (x mod 10);

       x := x div 10;       end;

     writeln( 'Сума цифр числа ', a, '  s= ',  s); end.

Протестувати правильність виконання алгоритму: Ввести чисел: 4;  6; 8; 94;  96; 80; 99; 100; 272; 558; 997

Завдання 5. Самостійно скласти і реалізувати алгоритм знаходження послідовності чисел, що утворюється сумою усіх цифр натурального числа та  додаванням  цієї суми до самого числа мовою Pascal.

Наприклад: А(15 )=1+5+15=26, А(20)=2+0+20=22, А(95 )=9+5+95=109, А(24)=2+4+24=30,   А(111)=1+1+1+111=114. 

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

Наприклад: А(15 )=1*5*15=75,  А(20)=2*0*20=0,А(95 )=9*5*95=4275,   А(24)=2*4*24=192, А(111)=1*1*111=111. 

 

Практична робота 13.

 Цикли і розгалуження

 

Завдання 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.  3)Змінити у програмі перевірку подільності на 9: перевірити числа на остачі: 1 та 3,  перевірити на остачі: 0 та 5. 

 

Практична робота 14.  

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

 

Завдання 1. Ліцей проводить вибори до учнівського парламенту. Скількома способами можна обрати цей парламент, якщо до парламенту подано: k заявок від  8-класників, заявок від 9-класників, заявок від 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:=(kdiv 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}

 

 

Практична робота 15.

Алгоритми різних типів

 

Завдання 1. Створити, реалізувати алгоритм мовою Pascal, який знаходить значення функції. Це лінійний алгоритм, бо містить тільки вираз з алгебраїчними діями.

program tabul1;

var x, y, z, b : real;

begin    write(‘введіть х :’);     readln(x);     write(‘введіть y :’);     readln(y);

   write(‘введіть z :’);      readln(z);

 b:=sqr(sin(x))+(sqr(y)+sin(sqr(z))/cos(sqrt(z)))/(z+exp(-x))+abs(55-2*random(99));     

   writeln(‘значення b=’, 5*b-3);end.

Протестуйте цей алгоритмякщо:  1) х= 10; у=7; z=9. 2) х= 100; у=25; z=49.

 

Завдання 2. Створити, реалізувати алгоритм мовою Pascal, який містить повне розгалуження  if  .. else  і  обчислює значення декількох виразів при виконанні умов на знак числа х. Це нелінійний алгоритм, бо має розгалуження на дві умови «+х» та «-х».

programtabul2;

var k,a, r,l, n,q,x: integer;

begin

   x:=48-random(80);     writeln('початкове значення х :=',x);

   n:=random(90);     writeln('початкове значення n :=',n);

   a :=random(70);     writeln('початкове значення a :=',a);

  q:=random(60);     writeln('початкове значення q :=',q);

l:=random(60);     writeln('початкове значення l :=',l);

k:=random(60);     writeln('початкове значення k :=',k);

if   x>0   then   begin     k:=2*k+ k*k+25;     r:=2*a+a*a+24;  l:=0; q:=0;  end

         else begin   l:=2*l+1;  q:=q*a+3;k:=0; r:=0;  end;

writeln(‘число х :=’, x);    writeln(‘число k:=’, k);     writeln(‘число r:=’, r);       

writeln(‘числоa :=, a);   writeln(‘числоq:=, q);  writeln(‘числоl :=,l);  end.    

Завдання 3. Створити, реалізувати алгоритм мовою Pascal, який містить вибір  case..  Це нелінійний алгоритм, бо містить вибір на 6 випадків для цілих значень k від 0 до 5.

programtabul3;

var a, r, l, n, y, x: realk: integer;

begin

   x:=random(80);     writeln('початкове значення х :=',x);

   n:=random(90);     writeln('початкове значення n :=',n);

   a :=random(70);     writeln('початкове значення a :=',a);

  y:=random(60);     writeln('початкове значення y :=',y);

l:=random(60);     writeln('початкове значення l :=',l);

k:=random(6);     writeln('початкове значення k :=',k);

case k of

    1: a:=abs(20*sqrt(a) - 40.567/ln(a));

    2: n:=25/sqr(l)+6.89*exp(-n);

    3: x:=6/sin(-n)+7*cos(y);

    4: r:=6*sin(n)+7.7*cos(-y);

    else y:=0;  n:=0; x:=0; r:=0; a:=0; end;

writeln(‘r:=, r);   writeln(‘y :=’, y);   writeln(‘k:=’, k);    writeln(‘n:=’, n);       

writeln(‘числоa :=, a);   writeln(‘числоl:=, l);  writeln(‘***********’);  end.    

Завдання 4. Створити, реалізувати алгоритм мовою Pascal, який містить повторення з лічильником  k.  Це нелінійний алгоритм, бо має два цикли з лічильниками.

program tabul4;

var x : array[1..5] of real;          a,b,y : real;             i : integer;

begin     a:=round(sqrt(random(45)))-2*sqr(round(random(70)))+25;     writeln(' a:=',a);

b :=10*round(40/sqr(a)) -3*round(random(70));     writeln('початкове значення b :=', b);

  for i:=1 to 5 do   begin  x[i]:=10- round(random(70));   write(‘    x[’,i,’]=’, 2+6*x[i]);     end;

 for i:=1 to 5 do  begin  y:=-a*sqr(x[i])+b; writeln(‘   x=’,8*x[i], ‘    y=’, 30+0.34*y);   end; end.

 

 

Практична робота 16.

Економічні алгоритми на рентабельність

 

Завдання 1.Вартість автомобіля дорівнює А грн, а його капітальний ремонт вимагає rгрн. Встановлено, що автомобіль може працювати без ремонту n років, а з ремонтом m років. За яких умов між A, r, n, m витрати ремонту являються рентабельними? При цьому треба врахувати, що після ремонту потужність автомобіля дорівнює потужності нового автомобіля.

Розв’язання. А/n– це середня вартість місяної експлуатації нового автомобіля. A+ r – це сумарна вартість автомобіля і ремонту.  (A+ r)/m – це середня вартість річної експлуатації автомобіля після  ремонту.  Капітальний ремонт автомобіля буде рентабельним, тобто окупить себе, тільки в тому випадку, якщо середня вартість експлуатації автомобіля після ремонту буде більше ніж середня вартість експлуатації до ремонту. Тому отримаємо нестрогу нерівність,  (A+ r)/m <= А/n, звідки отримаємо

r <= А(m-n)/n.

Створити та реалізувати мовою Паскаль алгоритм , який обчислює рентабельність ремонту автомобіля при заданих A, r, n, m.  Цей  алгоритм використовує  вкладені цикли і розгалуження в повній формі.

programremont1;

var  a, r, mn, b, iinteger;                                               {оголошуються змінні  типу:  цілі}

begin  writeln(' Вводяться початкові випадкові  числа A, r, n, m. ');

a:=(10000+random(100000));   write('якщо вартість автомобіля: a =', a);  writeln;

r:=(1000+random(90000));  write('якщо вартість ремонту:  r =', r);  writeln;

n:= 1+random(12);  write('якщо кількість місяців без ремонту:  n=', n);  writeln;

m:= 10+random(18);  write('якщо кількість місяців з ремонтом: m =', m);   writeln;

for i:=1 to n do  begin                               {два цикли  з лічильником  для обчислення рентабельності}

for i:=1 to m do  begin   b:=a*(m-n)  div n;   

  if  (r<bor (r=bthen          { повне розгалуження для перевірки  рентабельності }

            writeln(' Варто ремонтувати автомобіль, бо дешевий кап.ремонт ', r, ' =<', b

   else    writeln(' Не варто ремонтувати автомобіль, бо дорогий кап.ремонт ', r, ' >', b); 

writeln; end; end; end.

Протестуйте цей алгоритм декілька разів і порівняйте результати обчислень на кожному кроці. Спробуйте самостійно змінити в алгоритмі діапазон випадкових чисел.

Завдання 2.  Затрати при перевезенні вантажів двома видами транспорту обчислюється за двома лінійними формулами: у1=a+bх,  у2=m+kх,  де х – це відстань перевезення в сотнях кілометрів, у  грн. – це  транспортні витрати при перевезенні вантажу також  a>0, b>0, m>0, n>0. Знайти, на які відстані і яким видом транспорту перевезення вантажів буде рентабельним?

Розв’язання. Дві формули  у1=a+bх,  у2=m+kх  задають прямі лінії в прямокутній системі координат.  Одна з цих прямих лежить вище ніж друга. Ті точки, що лежать на прямій, що розміщена нижче, означають, що затрат буде менше. Є випадок, коли ці прямі перетинаються(це однакові затрати).  Координати точки перетину знаходиться із системи двох рівнянь, тобто  х=(m-a)/(b-k) сотень км; у=a+b*(m-a)/(b-k) грн.  Отже, якщо перевозити на відстань менше ніж (m-a)/(b-k)  км, то варто користуватися першим видом транспорту, а  якщо перевозити на відстань більшу ніж (m-a)/(b-k)  км, то варто користуватися другим видом транспорту.

Створити та реалізувати мовою Паскаль алгоритм , який обчислює і порівнює  рентабельність кожного виду транспорту для деякої відстані перевезення вантажу.

programperevoz2;

var  a, k, mx, b, y,  с, v1, v2:  integer;                                 {оголошуються змінні  типу:  цілі}

begin  writeln(' Вводяться початкові випадкові  числа для:  a>0, b>0, m>0, n>0 ');

a:=(300+random(900));   write('якщо вартість 1-го перевізника: a =', a);  writeln;

b:=(29+random(5));  write('якщо вартість палива на 100 км:  b =', b);  writeln;

m:=(400+random(900));   write('якщо вартість 2-го перевізника: m =', m);  writeln;

k:=(26+random(4));  write('якщо вартість палива на 100 км:  k =', k);  writeln;

x:=(1+random(150));  write('якщо відстань перевезення вантажу:  х =', х);  writeln;

c:= (m-a) div (b-k);  write('якщо відстань перевезення вантажу:  c =', c, '  то можна  на 2-ох  видах транспорту' );  writeln;

  v1:= a+b*x;    write('вартість перевезення 1-им видом транспорту:  v1 =', v1 );  writeln;

 v2:= m+k*x;    write('вартість перевезення 2-им видом транспорту:  v2 =', v2);  writeln;

  if  (v1<v2then                                     { повне розгалуження для перевірки  рентабельності }

writeln('Варто везти 1-им видом транспорту, бо  бо менша вартість 1-ого ', v1, ' <', v2

 else  writeln('Варто везти 2-им видом транспорту, бо менша вартість 2-ого ', v1, ' >', v2); 

writeln; end.

Протестуйте цей алгоритм декілька разів і порівняйте результати обчислень на кожному кроці. Спробуйте самостійно змінити в алгоритмі діапазон випадкових чисел.

 

Практична робота 17.

Нелінійні алгоритми з практичним змістом

 

Завдання 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 thenwriteln('У пункт  А  пасажири прибувають одночасно');   

if t2 –t1>0 thenwriteln('У пункт  А раніше прибуває перший пасажирна: ', 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;         {обчислення початкового відсотку для виконання  алгоритму}

fori:=1 tondobegin     {виконання циклу з лічильником по рокам для обчислення грошей}

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;         {обчислення чисел для виконання  циклу в алгоритмі}

fori:=1  to  u  do  begin  { цикл з лічильником по  нарахуванням для обчислення грошей}

s:= K*exp(ln(1+p/(100*i)))*i*i;

writeln( 'Кількість грошей на депозиті  після', i, '–го нарахування S=', s); writeln;end; writeln('*****');   end.

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

 

Практична робота 18.

Алгоритми повторення різних типів

 

Завдання 1. Створити та реалізувати алгоритм мовою програмування Pascal, що містить двовимірний масив array [1 .. n, 1 .. 10] , вкладені цикли  for i:=1   to n do  з лічильниками  по двом індексам і цикл  while  …  do з передумовоюдля обчислення похибок обчислень в масиві.

program proced1;

const n=5; m=10;     type     mas = array [1 .. n, 1 .. m] of real;     var a: mas;   e, eps: real;    j,i: integer;

begin

for i:=1   to n do  begin  for j:=1    to m do  a[i,j]:=random(10);  end;    eps:=0.001;

for i:=1 to n do begin  for j:=1 to m do begin e:= 0.987*a[i,j]-(1-0.123*eps)*a[i,j];

while   e > 0.0001  do    e:=e/10;  end; end;

writeln('Це похибка обчислень', e);  end.

Завдання  2. Створити та реалізувати алгоритм мовою програмування Pascal, що містить двовимірний масив array [1 .. n, 1 .. 10] , вкладені цикли  for i:=1   to n do  з лічильниками  по двом індексам і цикл  repeat      …..   until   …  з післядумовою для обчислення похибок обчислень в масиві.

program proced2;

const n=3; m=4;     type     mas = array [1 .. n, 1 .. 10] of real;     var b: mas; e, eps: real;   j,i: integer;

begin

for i:=1   to n do  begin  for j:=1    to m do  b[i,j]:=random(10);  end;

eps:=0.001;

for i:=1 to n do begin  for j:=1   to n do  begin 

repeat      e:= a[i,j]-(1-eps)*a[i,j];  e:=e/10;   until   e>0.01;  end; end;

writeln('Це похибка обчислень', e);  end.

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

program proced3;

var x,y,m,n: integer;

     procedure maxnumber(a,b: integer;  var max: integer);

     begin      if a>b then  max:=a  else max:=b;  end;

begin

 x:=random(100);    writeln(' x=', x);   y:=random(100);        writeln(' y= ', y);      

   maxnumber(x,y,m);       maxnumber(2,x+y,n);

   writeln(' max=', m, '  summa  n=', n);  end.

 

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

programproced4;

var x,y,m,n: integer;

function MaxNumber(a,b: integer): integer;

   var max: integer;

begin

   if a>b then max:=a else max:=b;

   MaxNumber := max;  end;

begin

   x:=40-random(100);    writeln(' x=', x);   y:=50-random(100);        writeln(' y= ', y);      

   m := MaxNumber(x,y);       n := MaxNumber(2,x+y);

   writeln('max=',m,'  summa=',n);  end.

 

 

Практична робота 19.

Алгоритми табуляції поліномів на мові Pascal

 

Завдання 1. Скласти і реалізувати алгоритм  для знаходження   табулювання значень квадратичної функції, нулів функції, що задана рекурсивною формулою у=(а1х+а2)х+а3= а1х22х+а3.

program  Quadratfunction;                     {назва    алгоритму  табуляції}

var  a1, a2, a3, x, y, d: 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;

fori:=1 tokdobegin       {виконання циклу з лічильником по 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);   {обчислення  першого нуля квадратичної функції}

writeln( 'перший наближений  нуль квадратичної функції  х1=', х, 'з абсолютною похибкою ',y); writeln;

x:=0.5*(-a2+sqrt(d))/a1;   y:=abs((a1*x+a2)*x+a3);   {обчислення  другого нуля квадратичної функції}

writeln( 'другий наближений нуль квадратичної функції  х2=', x, 'з абсолютною похибкою ',y); writeln; end 

else   writeln( ' немає нулів квадратична функція');

x:=0.5*(-a2)/a1;  y:=(a1*x+a2)*x+a3;                                       {обчислення  координат вершини параболи  }

if (a1>0)  then                        {оголошення  мінімуму  квадратичної функції як координат вершини параболи}

   writeln( ' наближений  мінімум квадратичної функції якщо  Хmin=', x, '  та Уmin= ',y

else                                          {оголошення  максимуму  квадратичної функції як координат вершини параболи}

writeln( ' наближений  максимум квадратичної функції якщо  Хmах=', x, '  та Уmах= ',y); writeln; 

 writeln( ' немає перегинів випуклих ділянок квадратична функція');

   end.   {закінчення алгоритму}

Протестуйте алгоритм  чотири рази та порівняйте результати табуляції і виберіть той варіант, при якому можна знайти найточніше наближення   нулів квадратичної функції, тобто випадок y:=(a1*x+a2)*x+a3=0.      

Завдання 2. Скласти і реалізувати алгоритм  для знаходження   табулювання значень кубічної функції, що задана рекурсивною формулою у=(1х+а2)х+а3)х+a4== а1х3+ а2х23х+а4.

program  Cubfunction;                     {назва    алгоритму  табуляції}

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;

fori:=1 tokdobegin       {виконання циклу з лічильником по 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.      

 

Практична робота 20.

Табулювання кускових функції

 

Завдання 1. Створити та реалізувати мовою Паскаль алгоритм , який обчислює значення функції при заданому аргументі за такими формулами:

   

Алгоритм використовує   послідні розгалуження в повній формі.

programtabuljacia1;

var  f,x,d: realn, iinteger;                             {оголошуються змінні  типу:  дійсні  та цілі}

begin  writeln('вводиться початкове випадкове  число, яке є аргументом функції ');

 x:=-(10+random(10)); write(x); writeln;  n:= 10+random(20); d:= 1+random(5);

write('якщо  кроків  n =', n); writeln;  write('якщо  довжина кроку  d =', d); writeln; 

for i:=1 to n do  begin             {виконується цикл  з лічильником  для обчислення функції }

  if  x<-10  then  f:=x*x  else                      {розгалуження для перевірки  аргументу функції }

    if  x<10  then  f:=x   else  f:=-x*xx:=x+d;                           { розгалуження   та обчислення}

writeln('результат обчислення  f(', x, ')=', f, 'якщо номер кроку i =', i); writeln; end; end.

Протестуйте цей алгоритм декілька разів і порівняйте результати обчислень на кожному кроці. Спробуйте самостійно змінити в алгоритмі діапазон випадкових чисел.

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

programtabuljacia2;

var  p, n, iinteger;                             {оголошуються змінні  типу:  цілі}

beginwriteln('вводиться початкове випадкове  число, яке є аргументом функції ');

 p:=-(10+random(10)); write(p); writeln;  n:= 10+random(20);

write('якщо  кроків  n =', n); writeln; 

for i:=1 to n do  begin             {виконується цикл  з лічильником  для обчислення функції }

  if  (p = 0) or (p = 1) then  p:=0  else       {розгалуження для перевірки  аргументу функції }

    if  (pmod 2 = 0) then  p:=pdivelse  p:=3*p+1;             { розгалуження   та обчислення}

writeln('результат обчислення 

p(', i, ')=', p, 'якщо номер кроку i =', i); writeln; end; end.

Протестуйте цей алгоритм декілька разів і порівняйте результати обчислень на кожному кроці. Спробуйте самостійно змінити в алгоритмі діапазон випадкових чисел.

 

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

programtabuljacia3;

var  g, n, iinteger;                                                      {оголошуються змінні  типу:  цілі}

beginwriteln('вводиться початкове випадкове  число, яке є аргументом функції ');

 g:=-(10+random(10)); write(g); writeln;  n:= 10+random(20);

write('якщо  кроків  n =', n); writeln; 

for i:=1 to n do  begin             {виконується цикл  з лічильником  для обчислення функції }

  if  (gmod 3 = 0)  then  g:=3*g+1  else          {розгалуження перевірки  аргументу функції }

    if  (gmod 3 = 1) then  g:=g-2  divelse  g:=3*g+2;        {розгалуження   та обчислення}

writeln('результат обчислення  g(', i, ')=', g, 'якщо номер кроку i =', i); writeln; end; end.

Протестуйте цей алгоритм декілька разів і порівняйте результати обчислень на кожному кроці. Спробуйте самостійно змінити в алгоритмі діапазон випадкових чисел.

 

 

Практична робота 21.

Алгоритми інтерполяції функції

 

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

Протестуйте правильність виконання алгоритму.

 

Практична робота 22.

Алгоритми розгалуження та вибору.

 

Завдання 1.Створити алгоритм повного розгалуження  if ….. then  … else

program pryklad_01;

var a,b,c,y: real;

begin

write(‘Vvedit a’); readln(a);

write(’Vvedit b’); readln(b);

write(‘Vvedit c’); readln(c);

if a>=15 then

  begin

    if a<=20 then begin writeln( ‘a v diapazoni  15-20 ‘); 

y:=10-(exp(abs(a-b)))*(exp(a*(ln(sqr(sin(c)/cos(c)+1)))); end

    else writeln begin ( ‘a >20 ‘ );

y:=20-(exp(abs(a-b)))*(exp(a*(ln(sqr(sin(c)/cos(c)+1)))); end;

  end

else writeln(‘a<15’);

y:=30-(exp(abs(a-b)))*(exp(a*(ln(sqr(sin(c)/cos(c)+1))));

writeln(‘y=’,y);

readln;

end.

Завдання 2.Створити алгоритм повного вибору  case N of …. else

Program zrazok_02;

var Num: integer;

begin

write('Введіть число:');

readln(Num);

case Num of

0: writeln('Нуль');

1: writeln('Один');

2: writeln('Два' );

3: writeln('Три ');

4: writeln('Чотири') ;

5:writeln('П’ять');

6:writeln('Шість');

7:writeln('Сім');

8:writeln('Вісім');

9:writeln('Дев’ять');  

else writeln('Число не є цифрою');  end;  readln;  end.

Завдання 3.Створити алгоритм повного розгалуження  if ….. then  … else

program Bilshe03;

var a,b:integer;

begin

writeln('Vvedit a:');  readln(a);

writeln('Vvedit b:');  readln(b);

if a>b then writeln('a=',a) else

if a<b then writeln('b=',b) else writeln('a=b');  end.

 

 

Практична робота 23.

Алгоритми розгалуження геометричного змісту

 

Завдання 1. Cтворити та реалізувати мовою програмування Pascal, що визначає в скількох точках перетинаються два кола за шістьма чисел x1, y1, r1, x2, y2, r2, де x1, y1, x2, y2, - координати центрів кіл, r1, r2 – їх радіуси. Усі числа - дійсні, не перевищують 1000000000 за модулем, та задані не більш ніж із 3 знаками після коми.

Program Circus01;

var x1,y1,r1,x2,y2,r2, d:real;

begin

readln (x1,y1,r1,x2,y2,r2);   d:=sqr(x1-x2)+sqr(y1-y2);

if (x1=x2) and (y1=y2) and (r1=r2) then writeln (-1)

else  if (sqr(r1+r2)=d) or (sqr(r1-r2)=d) then writeln (1)

else  if (sqr(r1+r2)<d) or (sqr(r1-r2)>d) then writeln (0)

else writeln (2); end.

Завдання 2.Cтворити та реалізувати мовою програмування Pascal, що визначає

за розмірами прямокутних дверей a, b та розмірами шафи, що має форму прямокутного паралелепіпеда x, y, z, x, y, z < 10 чи можна пронести шафу у двері, якщо проносити її дозволяється так, щоб кожне ребро шафи було паралельне або перпендикулярне кожній стороні дверей.

program SHАFA2;

var a, b, c, x, y, z:real;

begin  readln (a, b, x, y, z);

if ((x<a) and (y<b)) or ((x<b) and (y<a)) or ((z<a) and (y<b)) or

((x<a) and (z<b)) or ((y<a) and (z<b)) or ((z<a) and (x<b))

then writeln (1) else writeln (0); end.

Завдання 3.Cтворити та реалізувати алгоритм  мовою програмування Pascal.

Гена збирається на туристичний зліт учнів своєї школи. У своєму класі його було призначено відповідальним за палатки. У себе вдома він знайшов 3 палатки: перша з них важить a1 кілограм і вміщує b1 чоловік, друга важить a2 кілограм і вміщує b2 чоловік, третя важить a3 кілограм і вміщує b3 чоловік.

У класі Гени k чоловік. Виясніть, чи може він вибрати палатки так, щоб у них змогли поміститись усі. При цьому враховуйте, що вибрані палатки повинні разом важити не більше w кілограм.

Вхідні дані: два цілих числа k та w (1 k 15, 1 w 30). Другий рядок містить шість цілих чисел: a1, b1, a2, b2, a3, b3 (1≤ a1, a2, a3 ≤ 10, 1 ≤ b1, b2, b3 ≤ 15).

program KLASS4;

var k,w,a1,a2,a3,b1,b2,b3: integer;

n1, n2, n3, n4,  m1, m2, m3, m4: integer;

begin  read (k,w);   readln (a1,b1,a2,b2,a3,b3);

m1 := a1 + a2; n1 := b1 + b2;   m2 := a1 + a3; n2 := b1 + b3;

m3 := a3 + a2; n3 := b3 + b2;   m4 := a1 + a2 + a3; n4 := b1 + b2 + b3;

if ( (a1<=w) and (b1>=k) ) or ( (a2<=w) and (b2>=k) ) or

( (a3<=w) and (b3>=k) ) or  ( (m1<=w) and (n1>=k) ) or

( (m2<=w) and (n2>=k) ) or  ( (m3<=w) and (n3>=k) ) or

( (m4<=w) and (n4>=k) ) then writeln('YES')   else writeln('NO');

end.

 

Завдання 4.Cтворити та реалізувати алгоритм мовою програмування Pascal.

У різдвяний вечір на підвіконні стояли три квіточки, зліва направо: герань, крокус та фіалка. Кожен ранок Маша витирала підвіконня і міняла місцями квіточку, що стояла праворуч,з центральною квіточкою. А Таня кожен вечір поливала квіточки і міняла місцями ліву та центральну квіточки. Потрібно визначити порядок квітів вночі після того, як пройде k днів.

Вивести m рядків, що містять по три латинських літери: "G", "C" и "V" (великі літери без пропусків), які описують порядок квітів на вікні по закінченню k днів (зліва направо). Позначення: G – герань, C – крокус, V – фіалка.

program E4;

var  m, k, i: integer;

begin readln(m);

for i := 1 to m do begin  readln(k);

if (k mod 3 = 1) then writeln('VGC');

if (k mod 3 = 2) then writeln('CVG');

if (k mod 3 = 0) then writeln('GCV');

end; end.

 

Практична робота 24.

Алгоритми розгалуження і повторення

 

Завдання 1. Cтворити та реалізувати алгоритм мовою програмування Pascal.

Степан влітку відпочиває у бабусі в селі. Особливо йому подобається

купатись на сільському озері. Посередині озера плаває пліт, який має формупрямокутника. Сторони плота спрямовані уздовж паралелей і меридіанів.Введемо систему координат, в якій вісь ОХ направлена на схід, а вісь ОY – напівніч. Нехай південно-західний кут плоту має координати (x1, y1), північно-східний кут - координати (x2, y2).

Cтепан знаходиться в точціз координатами (x, y). Визначте,до якої сторони плоту (північної,південої, західної чи східної) абодо будь-якого кута плоту(північно-західному, північно-східному, південно-західному, південно- східному) Степанупотрібно плисти, щоб якомогашвидше дістатися до плоту.

Формат вхідних даних:

Дано шість чисел в наступному порядку: x1, y1 (координати південно-

західного кута плоту), x2, y2 (координати північно-східного кута плоту), x,

y (координати Степана). Всі числа цілі і по модулю не перевершують 100.

Гарантується, що x1 < x2, y1 < y2, xx1, xx2, yy1, yy2, координати Степана знаходяться поза плотом.

 

 

Формат вихідних даних:

Якщо Степану слід пливти до північної сторони плоту, програма повинна

вивести символ «N», до південної - символ «S», до західної - символ «W», до

східної - символ «E». Якщо Степану слід пливти до кута плоту, потрібно

вивести один з наступних рядків: «NW», «NE», «SW», «SE».

 

 

Пліт умовно розбиває площину на 8 частин. (див.мал.)

Очевидно, якщо точка з координатами (x, y) знаходиться у 2, 4, 6 або 8

частині площини, то найкоротшою відстанню до плоту буде перпендикуляр, проведений відповідно до північної, східної, південної або західної сторони.

Якщо точка з координатами (x, y) знаходиться у 1, 3, 5, 7 частинах

площини, то найкоротшою відстанню буде відповідний кут плота.

Розв’язання:

Program PROBA_01;

var x1,x2,x,y1,y2,y:integer;

begin

read(x1,y1,x2,y2,x,y);

if (x<x1) and (y>y1) and (y<y2) then write('W');

if (y>y2) and (x>x1) and (x<x2) then write('N');

if (x>x2) and (y>y1) and (y<y2) then write('E');

if (y<y1) and (x>x1) and (x<x2) then write('S');

if (x<x1) and (y>y2) then write('NW');

if (x>x2) and (y>y2) then write('NE');

if (x<x1) and (y<y1) then write('SW');

if (x>x2) and (y<y1) then write('SE');

end.

 

Завдання 2.Cтворити та реалізувати мовою програмування Pascal, що визначає

найбільшу кількість олівців k, які може купити Семен на S гривень  після подорожчання на Р відсотків.

Технічні умови. У першому рядку задано число N (1 ≤ N ≤ 107) - вартість олівця до подорожчання. У другому рядку - Р (0 ≤ Р ≤ 100) - величина подорожчання олівця у відсотках. В третьому рядку - S (1 ≤ S ≤ 107) - сума грошей, яка є у Семена.

Program PROBA_02;

var n,s,p,k,t:integer;

begin

read(n);  readln(p);  readln(s);

k:= s*100 div(n+n*p);   ;

write(k);

end.

 

Завдання 3.Cтворити та реалізувати мовою програмування Pascal, що визначає вагу запакованих речей рюкзака і валізи, якщо Семен збирає речі у похід. З собою в автобус він може взяти ручну поклажу і багаж. Для ручної поклажі у нього є рюкзак, а для багажу - здоровенна валіза.  За правилами перевезення маса ручної поклажі не повинна перевищувати S кг, а багаж може бути будь-якої маси (за наднормативний багаж Семен готовий доплатити). Зрозуміло, найбільш цінні речі - ноутбук, фотоапарат, документи і т. д. - Семен хоче покласти в ручну поклажу.

Семен розклав усі свої речі в порядку зменшення їх цінності і починає складати найбільш цінні речі в рюкзак. Він діє в такий спосіб - бере найцінніший предмет, і якщо його маса не перевищує S, то кладе його в рюкзак, інакше кладе його до валізи. Потім він бере наступний за цінністю предмет, якщо його можна покласти в рюкзак, тобто якщо його маса разом з масою вже покладених в рюкзак речей не перевищує S, то кладе його в рюкзак, інакше до валізи, і таким же чином процес триває для всіх предметів в порядку спадання їх цінності.

Визначте вагу рюкзака і валізи після того, як Семен складе всі речі.

Формат вхідних даних:

Перший рядок вхідних даних містить число S (1 ≤ S ≤ 2 × 109) – максимально дозволенa вага рюкзака. У другому рядку вхідних даних записано число N (1 ≤ N ≤ 105) - кількість предметів.

У наступних N рядках дано маси предметів, самі предмети перераховані в порядку спадання цінності (спочатку вказана маса найціннішого предмета, потім маса другого по цінності предмета і т. Д.). Всі числа натуральні, сума ваги всіх предметів не перевищує 2 × 109.

Формат вихідних даних:

Виведіть два числа - вагу рюкзака і вагу валізи (вага порожнього рюкзака і валізи не враховується).

Приклади Вхідні дані

Результат роботи

10

4

6

3

4

1

10 4

Нехай m1– вага рюкзака і m2 – вага валізи.

Беремо перший предмет з вагою а і перевіряємо, якщо m1+a не перевищує s, то збільшуємо m1 на а, інакше m2 збільшуємо на a.

Розв’язання: 1 спосіб

Program PROBA_03;

var s,n,a, m1, m2,i:integer;

begin

readln(s);   readln(n);

i:=1;   m1:=0;   m2:=0;

while i<=n do  begin   readln(a);

if (m1+a<=s) then m1:=m1+a else m2:=m2+a;

i:=i+1;  end;

write(m1,' ',m2);  end.

2 спосіб

var v,b,n,s,i:longint;    a:array [1..1000000] of longint;

begin

read(s,n);

for i:=1 to n do read(a[i]);

b:=0;   v:=0;

for i:=1 to n do

  if b+a[i]<=s then b:=b+a[i] else v:=v+a[i];

write(b,' ',v);

end.

 

Завдання 4. Степан виписує на листочку усі цілі числа від 1 до N в кілька груп, при цьому якщо одне число ділиться на інше, то вони обов'язково будуть у різних групах.

Наприклад, якщо N = 9, то отримаємо 4 групи:

Перша група: 1.

Друга група: 2 3 7.

Третя група: 4 5 6.

Четверта група: 8 9.

Очевидно, що оскільки, будь-яке число ділиться на 1, то одна група завжди буде складатись тільки з числа 1, а от інші групи можуть бути створені різними способами.

Допоможіть Степану написати програму, яка визначає мінімальне число груп, на яке можна розбити усі числа від 1 до N у відповідності до наведеної вище умови.

 

Формат вхідних даних:

Перший рядок вхідних даних містить єдине число N (1 ≤ N ≤ 109).

Формат вихідних даних:

Виведіть одне число - знайдену мінімальну кількість груп.

Приклади Вхідні дані

Результат роботи

9

4

Наприклад, якщо визначати кількість груп для послідовних чисел від 1 до 20, то можна побачити, що вона (кількість) є степенем числа 2. Таким чином для будь-якого числа N можна розглянути нерівність 2k ≤ N < 2k+1, і шуканою відповіддю буде число k+1.

Program proba04;

var n,v,i,st: integer;

begin

read(n);

v:=1;  st:=2;  i:=2;

while i<=n do begin i:=st*2; st:=i; inc(v);  end;

if n<>1 then write(v) else write(1); end.

Активні користувачі за останні 15 хвилин: