субота, 6 квітня 2019 р.

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


Практична робота 61. 
Нелінійні алгоритми   мовою Pascal

Завдання 1. Старовинний годинник з дванадцятигодинним циферблатом б’є в кінці останньої хвилини кожної години. Бій триває менше однієї хвилини. Кількість ударів відповідає показам годинникової стрілки (1 удар – о першій ночі і о першій дня,  по 2 удари – о другій години ночі та о другій дня і так далі, опівночі і опівдні він б’є, відповідно, по 12 разів.  Дано проміжок часу (відомо, що пройшло строго менше 24 годин).  Напишіть програму, що визначає, скільки ударів зробив годинник за цей час. 

Технічні умови: Вхідні дані: ви вводите з клавіатури у першому рядку початковий момент
часу, в другому рядку — кінцевий. Моменти часу задаються двома цілими числами,
що розділяються пропуском.
Перше число задає години (від 0 до 23, друге – хвилини (від 1 до 59).
Вихідні дані: ви виводите на екран одне число — кількість ударів,
які зробив годинник за цей відрізок часу.

Алгоритм мовою програмування Pascal
Program Godynnyk;           // Називаємо програму і оголошуємо змінні
var  g1,h1,g2,h2,i,s:integer;            // g1,g2 -початкова і кінцева години;i- циклічна змінна;
        //h1,h2 – початкова і кінцева хвилини; s-сума (кількість ударів)
begin
s:=0;
writeln('Bведіть початкову годину і хвилину через пробіл');
g1:=1+random(12); h1:=random(59);writeln(g1,'год  ', h1, 'хв '); {readln (g1,h1);} // початкові дані
writeln('Bведіть кінцеву годину і хвилину через пробіл');
g2:=12+random(12); h2:=random(59); writeln(g2,'год  ', h2, 'хв '); {readln (g2,h2);}
if g2>g1 then      // коли кінцевий момент часу більший за початковий
begin
if g2>12 then      // коли кінцевий час більший за 12
begin                   // спрацьовує цей фрагмент програми
for i:=g1+1 to 12 do s:=s+i; //циклічна змінна змінюється від наступної за початковою годиною
for i:=1 to g2-12 do s:=s+i; // до 12 години. Враховуємо ще один оберт малої стрілки.
end else begin           // коли кінцевий час менший за 12
for i:=g1+1 to g2 do s:=s+i;  // працює цикл для обчислення площі
end; end;
if g2<g1 then    // коли кінцевий момент часу менший за початковий
begin
for i:=g1+1 to 12 do s:=s+i; //рахуємо удари годинника від початкової до 12 години
for i:=1 to 12 do s:=s+i;   //рахуємо удари годинника від 1 до 12 год 
for i:=1 to g2 do s:=s+i;   //знову удари годинника від 1 до кінцевої години
end;
if g2=g1 then   // коли кінцевий момент часу дорівнює початковому
begin
s:=0;                 // якщо години співпадають то ударів не буде
end;
writeln ('Відповідь: годинник зробив ', s, ' ударів');
end.

  
Завдання 2. Два прожектори утворюють на стіні дві плями квадратної форми, одну – блакитного, а другу – жовтого кольору. Визначити площу плями зеленого кольору, яка утворилася внаслідок накладання двох плям – блакитної та жовтої.
 Вхідні дані: ви вводите з клавіатури у першому рядку координати лівої нижньої вершини кожного квадрата (натуральні числа x1,y1, х2, у2 <1000, розділені пропуском), у другому рядку – довжини сторін квадратів (натуральні числа а1, а2<100, розділені пропуском).
Вихідні дані: ви виводите на екран одне число – площу.

Алгоритм мовою програмування Pascal

Program Zeleny_kvadrat;
var   a,b,x1,y1,x2,y2,a1,a2,i,j: integer; //оголошення змінних
label start ;                       // оголошення мітки початку програми
begin
a:=0; b:=0;                          // початкові значення ширини і висоти зеленої плями
writeln ('Введіть координати початкових вершин двох квадратів через пробіл');
x1:=random(1000); y1:=random(1000); x2:=random(1000); y2:=random(1000);
writeln(' x1=',x1,' y1=',y1,' x2=',x2,' y2=', y2);        {readln(x1,y1,x2,y2);}
writeln ('Введіть розміри двох кольорових  квадратних плям  через пробі{readln(a1,a2);}л');
a1:=1+random(100);  a2:=2+random(100); writeln('a1=', a1, '   a2=',a2);   
for i:=x1 to x1+a1-1 do begin    // змінюємо і від початкової координати до ширини першої плями
for j:=x2 to x2+a2-1 do          // змінюємо j від початку до ширини другої плями
if i=j then  a:=a+1;          // якщо точки співпадають – збільшуємо ширину зеленої плями на 1
end;
for i:=y1 to y1+a1-1 do begin    //аналогічно вчиняємо з висотою зеленої плями
for j:=y2 to y2+a2-1 do
if i=j then b:=b+1;              //в разі співпадання висота збільшується на 1
end;
writeln (' площа зеленої плями ',a*b);
end.

Завдання для самостійного опрацювання

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

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