|
Алгоритм виконання функції F
1. Спочатку функціїF присвоюється значення TRUE і перевіряєтьсяb>a. 2. Якщоумова виконується, тоді обчислюється значення x1:=b/4.0*a. 3. Інакше перевіряєтьсяb=a. 4. Якщо так, тох1:=-55. 5. Якщо ж ця умова не виконується , то залишається умова b<a, у якій треба перевірити на нуль знаменник a виразу (b-5)/a. 6. Якщо ця умова (a=0)виконується (знаменник у виразі (b-5)/a дорівнює нулю), обчислюється складений оператор після THEN, взятий у дужки -begin ... end: ¨ У цьому випадку стрічкова змінна s1:=inv1+inv2 буде дорівнює: ‘Ділення на нуль!!!!!!! Повторіть введення’. ¨ Це повідомлення виводиться на екран. ¨ Функція F приймає значення FALSE і керування передається по EXIT в головну програму. 7.У випадку,якщо знаменник не дорівнює нулю, обчислюється значенняx1:=(b-5.0)/a. 8. Далі перевіряється, чи входить значеннях1 у допустимий діапазон (для змінних типу INTEGER). 9. Якщотак, то ціла змінна одержує значення х:=trunc(x1). 10. Якщо значення х1 виходить за допустимий діапазон, то: ¨ s1:=inv3+inv4 (‘Результат виходить за діапазон [-3268...32767]!!!!’); ¨ значенння S1 виводиться на екран -Writeln(s1); ¨ виводиться на екран отримане значення Х1 - Writeln(x1); ¨ і нове запрошення - Writeln(Inv1) (‘Повторіть ввод’). ¨ Функція F приймає значення FALSEі керування по EXITпередається в головну програму. Далі описана процедура введення вихідного значення змінної А з перевіркою на область допустимих значень. Ім'я процедури -Input. У заголовку описані формальні параметриA:integer і inv:string(ім'я змінної). У тілі процедури використовуються локальні змінні al:real і s1:string, у полі опису міток визначена мітка L. Алгоритм виконання процедури Input 1.На екран повідомляємо про введення змінної А - Write(‘Введіть значення ’+ inv,'===>'). При виконанні цього оператора на екрані з'являється повідомлення:Введіть значення А===>. 2. Вводимо з клавіатури її значення- READLN(a). 3. Перевіряємо чи входить ці значення в допустимий діапазон: ¨ якщо так, то A:=TRUNC(a), ¨ якщо ні, то змінна s1отримує значення s1:=inv5+inv4 (' значення, що вводиться, виходить за діапазон [-32768...32767]!!!’). ¨ На екран виводиться значення inv1 (‘Повторіть введення’). ¨ Керування передається на мітку L для повторного введення значенняА. Ця процедура може бути використана для введення і контролю діапазону будь-якої цілої змінної типу INTEGER. Опис головної програми 1. У циклі REPEAT ... UNTIL очищається екран (ClrScr), виводиться на екран вид вихідного завдання, через процедуру INPUTвводяться змінні a і b, через функцію F обчислюється шукане значення x. ¨ Якщо значення функціїFдорівнює False, керування передається на мітку L1 для повторного введення змінних а і b . ¨ Якщо значення функції Fдорівнює TRUE, - виводиться результат (змінна х). 2. На екрані з'являється ‘Знову? (Y/N)’. 3. Змінна ch:=ReadKey і в залежності від відповіді керування передається на початок циклу (ch:=’Y’) чи програма закінчує виконання (ch:= ‘N’). ДОДАТОК 3 Приклад виконання лабораторної роботи № 3 ЛІСТИНГ ПРОГРАМИ Work3.pas program Work3; {$N+,E+} { Варіант 60 - елементів масиву типу LONGINT. Знайти суму перших K від’ємних елементів масиву A. } Uses CRT; Const NN=20; {Максимальна довжина вектора} inv=' N'; inv=' К'; inv1='Повторіть введення'; inv4='виходить за діапазон [-2147483648..2147483647]!!!!'; inv5=' значення, що вводиться, '; Type ArrayA=Array [1..NN] of LongInt; Var k,N:integer; A:Array; ch:char;
{введення значення N, 1<=N<=NN} Procedure Input(inv:String; NN:Integer; Var N:integer); Begin Repeat Write('введіть значення'+inv,'=====>'); Readln(N); Until (N<=NN) and (N>=1); End;
{введення N значень компонентів вектораA[i], -2147483648<=A[i]<= 2147483647} Procedure InputVector(N:integer;Var A:arrayA); Label L; Var i :integer; Ra:Real; s1:String; Begin for i:=1 to N do Begin L: Write('введіть значення елемента вектора A[',і,']=====>'); Readln(Ra); if (Ra>=-2147483648.0)and(Ra<=2147483647.0) then A[i]:=trunc(Ra) else Begin s1:=inv5+inv4; Writeln(s1); Writeln(inv1); goto L; End End; End; {Висновок значень компонентів вектора A пострічно} Procedure OutputVector(N:integer; A:arrayA); Var i :integer; Begin Writeln(' -і-і-і- Вихідний вектор -і-і-і-'); for i:=1 to N do Write(A[i]:11,' '); Writeln; End;
{Перебування суми перших K від’ємних елементів масиву A довжиною N} Function Summa(k,N:Integer; A:ArrayA):Extended; Var i,Kk:integer; S:Extended; Begin Kk:=1; {Лічильник від’ємних елементів масиву} S:=0; for i:=1 to N do if (A[i]<0) and (Kk<=k) then Begin S:=S+A[i]; Kk:=Kk+1 End; Summa:=S End; {Головна програма} Begin Repeat ClrScr; Input(inv,NN,N); {введення конкретної довжини масиву N<=NN } {введення числа від’ємних елементів масиву K<=N, що треба підрахувати} Input(invK,N,K); InputVector(N,A); OutputVector(N,A); Writeln('Сума перших K від’ємних елементів масиву A=', Summa(k,N,A):15:0); Writeln('Повторити? (y/n)'); ch:=ReadKey; Until (ch='n') or (ch='N'); End. Для одержання результату в контрольній роботі №3 (варіант 60) необхідно ввести фактичне значення довжини масивуN (1<=N<=NN), значення числа від’ємних елементів масиву ДО (K<=N) , що треба підрахувати,і
значення елементів вихідного масиву A[i], i=1,...,N (з перевіркою на діапазон LONGINT). Ім'я програми - WORK3. · У фігурні дужки включені директиви компілятора (див. Дод. 8) для обробки дійсної суми типу EXTENDED: ¨ $N+ - використовувати числовий співпроцесор (реалізувати операції з крапкою, що плаває, апаратно); ¨ $E+ -включити режим програмної эмуляції співпроцесора. · У поле опису бібліотек, констант і змінних завдань стандартний модуль CRT, визначені константи:NN, inv, inv, inv1, inv4, inv5. · Описано власний тип даних Array для опису масиву довжиною NN, елементи якого мають тип LongInt, - Type Array=Array[1..NN] of Longint; · Описано змінніk, N:Integer і масив A:Array; задана символьна змінна ch. Далі йдуть описи процедур Input, InputVector, OutputVector, і функції Summa. · Записано головну програму, що викликає потрібні процедури і функції, відповідно до алгоритму рішення задачі. Опис процедури Input ¨ У заголовку процедури описані формальні змінні: вхідні: inv, NN (значення яких передаються з основної програми); вихідне N (значення визначається в процедурі і передається в основну програму). ¨ У цикліRepeat ...Until (N<=NN) and (N>=1) вводиться значення змінної N- Readln(N) з перевіркою (тобто що N повинно бути більше або дорівнює одиниці і менше або дорівнює NN - заданому за умовою завдання значенню розміру масиву). Потім керування передається в основну програму. Опис процедури InputVector ¨ У заголовку процедури описані параметри: N, переданий з основної програми; A- масив елементів матриці, що вводяться. ¨ Описано локальні змінні: i : integer- параметр циклу for; Ra : Real- робоча змінна ( елемент масиву, що вводиться,); s1 : String- рядок, формований для аварійного висновку. ¨ У циклі for вводяться значення елемента матрицічерез робочу змінну Ra і перевіряються на допустимі значення (у даному випадку взяті межі зміни для змінних типу longint). ¨ Якщо значення, що вводиться, задовольняє заданій умові, то елементам матриці присвоюєтьсязначення A[]]:=trunc(ra). ¨ Інакше 1) стрічковій змінний присвоюється значення s1:=inv5+inv4; ¨ (‘ значення, щов водяться, виходять за діапазон [- 147483648...2147483647]!!!!!!’).
2) це повідомлення виводиться на екран; 3) також на екран виводиться повідомлення «Повторите введення»; 4) керування передається на міткуL і знову вводимо значення елементів матриці з перевіркою на припустимі значення. ¨ Керування передається в головну програму, коли закінчиться цикл for . Опис процедури OutputVector ¨ У заголовку процедури описані параметри:N, переданий з головної програми; A- масив виведених елементів матриці. ¨ Описано локальна перемінна i : integer- параметр циклу for. ¨ У процедурі в циклі forвиводяться значення елементів масивуА.В операторі висновкуWrite(A[i]:11,’ ’) заданий формат для виведеного елемента масиву:A[i]:11, що показує, що для висновку значення елемента масивуА приділяється 11 позицій. ¨ Потім керування передається головній програмі. Опис функції Summa ¨ У заголовку функції описані параметри:k - число від’ємних елементів масиву, щозчитуються, до<=N;N - розмірність масиву, А - масив елементів. Функція Summa описана, як Extended. ¨ У тілі функції задається лічильник від’ємних елементів масивуКк, йому привласнюється початкове значення 1 ( Kk:=1). Початкове значення суми дорівнює0 (s:=0).
¨ У циклі for від одиниці доN вважається сума перших K від’ємних елементів масиву: 1) перевіряється A[i]<0 (від’ємне число) і одночасно перевіряється значення лічильникаКк<=K (не перевищує числа негативних елементів масиву, щозчитуються, K); 2) S:=S+A[i]; 3) лічильник від’ємних чисел збільшується на одиницю Кк:=Кк+1. ¨ Після закінчення циклу функції Summa присвоюється значення отриманої суми всіх від’ємних чисел - Summa:=S. ¨ Керування передається в головну програму. Опис головної програми 1. У тілі головної програми в цикліRepeat ... Untilочищається екран (ClrScr). 2. Виробляється рішення задачі для одного комплекту вхідних даних N, K, A: ¨ Через виклик процедуриInput(inv,NN,N) здійснюється введення довжини масиву N<=NN(змінніinv, NN є вхідними, змінна N - результат роботи процедури). ¨ Через цю же процедуру Input(inv,N,K) здійснює введення числа від’ємних елементів масиву, щозчитуються, ДО<=N(змінного іnvк, N передаються з головної програми в процедуру, значення змінної K повертається з процедури в головну програму). ¨ Процедура InputVector(N,A) здійснює введення елементів масивуА (значення змінноїN передається з головної програми, значення елементів масиву А передається з процедури). ¨ Процедура OutputVector(N,A) здійснює висновок елементів масивуА (значення змінноїN і значення елементів масиву А передаються з головної програми). ¨ Виводиться значення суми через функцію Summa(k,N,A)(значення параметрівДО, N, A передається з головної програми); ¨ На екрані з'являється повідомлення «Знову? (Y/N)». Змінній ch присвоюється значення натиснутої клавіші ch:=ReadKey і в залежності від відповіді керування передається на початок циклу (ch:=’Y’) чи програма закінчує виконання (ch:= ‘N’).
ДОДАТОК 4 |
|
|