субота, 3 березня 2018 р.

Практ. роб. Алгоритми з практичним змістом


Практична робота 14 «Лінійні алгоритми на мові Pascal»

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

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

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




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

Завдання 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. Якщо n разів через рівні проміжки часу на депозитну картку вноситься деяка постійна сума К грн(періодичні внески) під складні відсотки Р% , то заощадження обчислюється за формулою
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.

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


Програма, написана мовою ПАСКАЛЬ, являє собою послідовність рядків, кожен з яких відокремлюється від іншого символом “;” (крапка з комою). Вона складається з трьох частин:заголовкаблока описів та блока операторів.
Заголовок задає ім’я програмі.
Блок описів оголошує всі об’єкти, які використовуються програмою: мітки, константи, типи користувача, змінні, тощо.
Блок операторів задає дії, які направлені на розв’язання завдання.
Отже, загальний вид програми на мові ПАСКАЛЬ має вигляд:
Program <ім’я програми >
Uses < модулі >
Const < константи >
Label < мітки >
Type < типи користувача >
Var < змінні >
Begin
< оператори >
End.
Розглянемо кожен блок детальніше.
Заголовок програми розпочинається зі службового слова program , після якого вказується ім’я програми. Він грає допоміжну функцію і ніякої суттєвої ролі для самої програми не має.
ПРИКЛАД:
program circles;
Не слід плутати заголовок програми та ім’я відповідного дискового файлу. Ці імена ніяк між собою не пов’язані. В більшості випадків користувачі не вказують заголовок.
У блоку описів оголошуються всі ідентифікатори, що використовуються в програмі (основному модулі). Блок описів, у свою чергу, може містити шість розділів:
 розділ підключення модулів процедур та функцій;
 розділ опису міток;
 розділ опису констант;
 розділ визначення типів;
 розділ опису змінних;
 розділ опису процедур і функцій.
Транслятор мови ПАСКАЛЬ створений таким чином, що основний файл не містить всіх процедур та функцій. Вони згруповані і реалізовані в окремих файлах, які називаються модулями стандартних процедур та функцій. Наприклад, модуль CRT містить функції для роботи з екраном в текстовому режимі, GRAPH – функції для роботи з екраном в графічному режимі. Крім того, користувач може створювати власні модулі процедур та функцій. В розділі uses здійснюється підключення необхідних модулів процедур та функцій. Програма може містити лише один розділ uses , причому він повинен бути завжди першим у блокові описів. Якщо жоден з модулів не підключається, то цей розділ відсутній.
ПРИКЛАДИ:
uses dos, graph;
uses my_lib;
Розділ оголошення міток призначений для вказівки міток операторів. Перед будь-яким оператором програми можна поставити мітку. Це дозволить виконувати прямий перехід на цей оператор при виконанні команди GOTO. Розділ опису міток має таку структуру: спочатку записується зарезервоване слово label (мітка), за ним слідує список ідентифікаторів міток, відділених одна від одної комами. В мові TУРБО ПАСКАЛЬ в ролі міток можуть бути використані як числа, так і ідентифікатори.
ПРИКЛАД:
label 10,999;
label new, errors;
У розділі визначення констант здійснюється присвоювання ідентифікатором визначенихпостійних значень. На початку розділу визначення констант пишеться слово const (константа). Слідом за цим словом іде список імен і після символу “=” відповідні їм вирази, у яких ідентифікаторам присвоюються визначені постійні значення. Елементи списку відокремлюються один від одного крапкою з комою.
ПРИКЛАД:
Const
max = 1024;
password = ‘Sezam’;
limit=2*max;
Розділ оголошення типів призначений для введення типів даних користувача. Практично всі структуровані типи даних є типами даних користувача і повинні описуватись у даному розділі. Розділ визначення типів починається зарезервованим словом type (тип). За словом type слідують визначення типів, розділених один від одного крапкою з комою. Кожне визначення типу складається з ідентифікатора типу, знака рівності і самого опису типу.
ПРИКЛАД:
type
day = (пн, вт, ср, чт, пт, сб, вс);
colors= (синій, червоний, зелений);
Зауважимо, що в останньому прикладі значення задаються без лапок (це не значення рядкового типу, а значення зліченого типу!).
Розділ оголошення змінних є найважливішим в блокові оголошень. Кожна змінна, що зустрічається в програмі, повинна бути описана, тобто, повинен бути вказаний її тип. Опис змінної повинен передувати використанню її в тексті програми для того, щоб у момент використання вона була вже “знайома” компілятору.
Розділ опису змінних починається зарезервованим словом var (від variable - змінна). Слідом за ним йде список, записи якого мають таку структуру: спочатку через кому перераховується один або декілька ідентифікаторів змінних, потім ставиться двокрапка і після двокрапки вказується тип перерахованих змінних.
ПРИКЛАД:
var
a, b, result: real;
i, j, x, y: integer;
period: day;
Мова ПАСКАЛЬ припускає також оголошення змінних безпосереднім описом змінних.
ПРИКЛАД:
var
nt: 1..20;
anser: (yes, no);
Таке оголошення має свої обмеження на використання змінних, і тому зловживати ним не рекомендується.
Розділ опису процедур та функцій служить для визначення допоміжних алгоритмів (процедур та функцій користувача) у рамках поточного модуля або програми. Цей розділ не має службового слова для початку розділу, тому що кожна процедура або функція користувача має своє службове слово для початку свого оголошення.. Детально цей процес буде розглянутий далі.
Кожен з описових розділів, крім розділу uses, може зустрічатись в програмі декілька разів і в будь-якій послідовності. Головне, щоб не порушувалась логічна структура програми (наприклад, змінна типу користувача не оголошувалась раніше самого типу, тощо).
Розділ операторів є останнім у блоці програми. Він задає дії, які повинна виконати програма. Розділ операторів починається службовим словом begin і закінчується службовим словом end.(крапка в кінці обов’язкова). Кожна програма може мати лише один розділ операторів.

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

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