неділя, 20 травня 2018 р.

Компетентнісні завдання


Що таке дослідження властивостей інформаційної моделі?
Використання комп'ютера для дослідження інформаційних моделей
 різних об'єктів і систем дозволяє вивчити їх зміни залежно від значення 
тих або інших параметрів. Процес розробки моделей і їх дослідження
 на комп'ютері можна розділити на кілька основних етапів.
На першому етапі дослідження об'єкта або процесу звичайно 
будується описова інформаційна модель. Така модель виділяє
 істотні (суттєві, змістовні, описові) з погляду цілей проведеного дослідження
 параметри об'єкта(а це є вимірювальні властивості об'єкта та їхні діапазони(шкали) значення)
а несуттєвими параметрами зневажає, бо їх виміряти не можливо.
На другому етапі створюється формалізована модель, тобто описова інформаційна модель
 записується за допомогою якої-небудь формальної мови. 
У такій моделі за допомогою формул, рівнянь, нерівностей та ін. 
фіксуються формальні співвідношення між початковими й кінцевими значеннями 
властивостей об'єктів, а також накладаються обмеження на припустимі значення цих властивостей.
Однак далеко не завжди вдається знайти формули, 
що явно виражають шукані величини через вихідні дані. 
У таких випадках використовуються наближені математичні методи, 
що дозволяють одержувати результати із заданою точністю.
На третьому етапі необхідно формалізовану інформаційну модель перетворити в комп'ютерну модель, тобто виразити її на зрозумілій для комп'ютера мові. Існують два принципово різні шляхи побудови комп'ютерної моделі:
1)  побудова алгоритму рішення завдання і його кодування на одній з мов програмування;
2) побудова комп'ютерної моделі з використанням одного з додатків (електронних таблиць, СУБД та ін.).
У процесі створення комп'ютерної моделі корисно розробити зручний графічний інтерфейс, який дозволить візуалізувати формальну модель, а також реалізувати інтерактивний діалог людини з комп'ютером на етапі дослідження моделі.
Четвертий етап дослідження інформаційної моделі полягає в проведенні комп'ютерного експерименту. Якщо комп'ютерна модель існує у вигляді програми на одній з мов програмування, її потрібно запустити на виконання й одержати результати.
Якщо комп'ютерна модель досліджується в додатку, наприклад в електронних таблицях, можна провести сортування або пошук даних, побудувати діаграму або графік і так далі.
П'ятий етап полягає в аналізі отриманих результатів і коректуванню досліджуваної моделі. У випадку відмінності результатів, отриманих при дослідженні інформаційної моделі, з вимірюваними параметрами реальних об'єктів можна зробити вивід, що на попередніх етапах побудови моделі були допущені помилки або неточності. Наприклад, при побудові описової якісної моделі можуть бути неправильно відібрані істотні властивості об'єктів, у процесі формалізації можуть бути допущені помилки у формулах і так далі. У цих випадках необхідно провести коректування моделі, причому уточнення моделі може проводитися багаторазово, поки аналіз результатів не покаже їх відповідність досліджуваному об'єкту.



Завдання «Фермер»
Фермер, вивчивши попит на ягідні культури у своєму регіоні, планує 70 % своєї земельної ділянки площею 2 га відвести під вирощування полуниці. Для цього він збирається звернутися до керівництва банку із листом про надання йому відповідного кредиту.
Завдання:
1.  Розсаду фермер планує закупити в інтернет-магазині «Дім і сад» із розрахунку 40-60 тис. кущів на 1 га. Розрахуйте кількість кущів певного сорту полуниці.
2.  Розрахуйте потрібну суму на закупку розсади за умови, що за першу сотню кущів покупець платить повну вартість, за кожну наступну сотню вартість зменшується на 1% від попередньої вартості.
3.  Вказати, які дані для розв'язання задачі вам потрібно знайти.
4.  Вказати URL-адреси використаних пошукових служб.
5.  Вказати ключові слова для пошуку потрібних відомостей.
6.  Вказати URL-адреси сайтів, на яких знайшли необхідні дані.
7.   Оберіть середовище для виконання завдання: табличний процесор чи середовище програмування.
8.  Створіть лист для отримання фермером кредиту від банку, у якому подайте потрібні дані, висновки та аргументуйте їх. Додайте у текст листа зображення вибраного сорту полуниці.
9.  На електронну адресу вчителя надішліть розв'язок завдання: текстовий документ; архів електронної таблиці чи проекту, розроблений у середовищі програмування.
 Критерії оцінювання виконання завдання
Критерій
Кількість балів
Зрозумів умову завдання
1 бал
Вміє формулювати критерії відбору даних для пошуку
2 бали
Вміє здійснювати пошук в Інтернеті
1 бал
Вміє створювати електронні таблиці
2 бали
Вміє обґрунтовувати вибір візуалізації подання результату
1 бал
Вміє знаходити стратегію розв'язування задачі
2 бали
Вміє робити висновки щодо спрямованості наявних відомостей на розв'язування конкретного завдання
2 бали
Правильно обирає засіб для розв'язування завдання та подання даних
1 бал


Компетентнісне завдання СВЯТО
Завдання «Дитяче свято»
У вашого двоюрідного брата скоро день народження — йому виповниться 7 років. Його батьки звернулися до вас за допомогою у створенні кошторису для проведення дитячого свята.
Брат хотів би запросити 11 друзів. Пригощати гостей заплановано вдома двома видами тістечок, соком і морозивом, які можна придбати в одному із супермаркетів. Кімнату можна прикрасити повітряними кульками власними силами або замовити оформлення в агенції «Веселий клоун», про яку батьки багато чули та хотіли б отримати її контактні дані, щоб запросити клоуна для проведення свята.
Завдання:
1.  Оберіть форму подання знайдених відомостей, яка буде зручна для перегляду батьками:
ü презентація,
ü електронний лист,
ü текстовий документ,
ü проект, підготовлений мовою програмування.
2.  Передбачте, що батькам слід повідомити URL-адреси сайтів супермаркетів, в яких найвигідніше на вашу думку купувати тістечка, морозиво та соки.
3.  Вказати, які дані для розв'язання задачі вам потрібно знайти.
4.  Вказати URL-адреси використаних пошукових служб.
5.  Вказати ключові слова для пошуку потрібних відомостей.
6.  Вказати URL-адреси сайтів, на яких знайшли необхідні дані.
7.  Створити й використати електронну таблицю.
8.  Обгрунтувати доцільність користування послугами агенції «Веселий клоун»
9.  На електронну адресу вчителя надішліть розв'язок завдання:
ü архів опрацьованої електронної таблиці;
ü  архів представлення результатів батькам.
10.  Описати, які програми використано для виконання завдань?
Критерії оцінювання виконання завдання
Критерій
Кількість балів
Зрозумів умову завдання
1 бал
Вміє формулювати критерії відбору даних для пошуку
2 бали
Вміє здійснювати пошук в Інтернеті
1 бал
Вміє створювати електронні таблиці
2 бали
Вміє обґрунтовувати вибір візуалізації подання результату
1 бал
Вміє знаходити стратегію розв'язування задачі
2 бали
Вміє робити висновки щодо спрямованості наявних відомостей на розв'язування конкретного завдання
2 бали
Правильно обирає засіб для розв'язування завдання та подання даних
1 бал

V. Рефлексія.
                    Сьогодні на уроці:
1. Я навчився…………………………………………………………….
2.Було легко………………………………………..................................
3.Було важко…………………………………………………………….
4.Найбільш сподобалось……………………………………………….
5.Своєю роботою на уроці я (задоволений, не зовсім, зовсім незадоволений)
6.Вважаю, що робота однокласника……………………………була   найкращою

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



Практична робота 11.
Алгоритми розгалуження.

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


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

Завдання 1. Скласти і реалізувати алгоритм підрахунку різних букв у слові мовою Pascal.
 program Wordlitera;                                  { оголошення назви алгоритму }
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 в алгоритмі}
          if s[i]=s[j] then inc(n);     { оголошення про перевірку на однаковість букв}
       end;                          { оголошення про кінець циклу }
       r:=r+1/n;                 {оголошення   лічильника кількості  різних букв} 
  end;      writeln('кількість різних букв у слові  r = ', r:1:0);  end.       { оголошення про кінець циклу, алгоритму }
Протестувати правильність виконання алгоритму: Ввести: карта;  агов; математика; інформатика-а-а.
Завдання 2. Скласти і реалізувати алгоритм знаходження цілих дільників натурального числа мовою Pascal.
program Numer;                                  { оголошення назви алгоритму }
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:=(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}


Практична робота 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  і  обчислює значення декількох виразів при виконанні умов на знак числа х. Це нелінійний алгоритм, бо має розгалуження на дві умови «+х» та «-х».
program tabul2;
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.
program tabul3;
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.  Цей  алгоритм використовує  вкладені цикли і розгалуження в повній формі.
program remont1;
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)  км, то варто користуватися другим видом транспорту.
Створити та реалізувати мовою Паскаль алгоритм , який обчислює і порівнює  рентабельність кожного виду транспорту  для деякої відстані перевезення вантажу.
program perevoz2;
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 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.
Протестуйте алгоритм декілька разів і порівняйте результати. Самостійно змініть діапазон вибору випадкових чисел в алгоритмі.


Практична робота 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. Створити та реалізувати алгоритм, що містить функцію, яка знаходить найбільше значення двох цілих чисел.
program proced4;
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;
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);   {обчислення  першого нуля квадратичної функції}
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;
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.      



Практична робота 20.
Табулювання кускових функції

Завдання 1. Створити та реалізувати мовою Паскаль алгоритм , який обчислює значення функції при заданому аргументі за такими формулами:
   
Алгоритм використовує   послідні розгалуження в повній формі.
program tabuljacia1;
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. Створити та реалізувати мовою Паскаль алгоритм, який обчислює значення  кускової функції.
program tabuljacia2;
var  p, n, iinteger;                             {оголошуються змінні  типу:  цілі}
begin writeln(' вводиться початкове випадкове  число, яке є аргументом функції ');
 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  (p mod 2 = 0) then  p:=p divelse  p:=3*p+1;             { розгалуження   та обчислення}
writeln('результат обчислення 
p(', i, ')=', p, 'якщо номер кроку i =', i); writeln; end; end.
Протестуйте цей алгоритм декілька разів і порівняйте результати обчислень на кожному кроці. Спробуйте самостійно змінити в алгоритмі діапазон випадкових чисел.

Завдання 3. Створити та реалізувати мовою Паскаль алгоритм, який обчислює значення функції.
program tabuljacia3;
var  g, n, iinteger;                                                      {оголошуються змінні  типу:  цілі}
begin writeln(' вводиться початкове випадкове  число, яке є аргументом функції ');
 g:=-(10+random(10)); write(g); writeln;  n:= 10+random(20);
write(' якщо  кроків  n =', n); writeln; 
for i:=1 to n do  begin             {виконується цикл  з лічильником  для обчислення функції }
  if  (g mod 3 = 0)  then  g:=3*g+1  else          {розгалуження перевірки  аргументу функції }
    if  (g mod 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.