{Вычисление знаменателя с проверкой его на ноль}
function Flag (a,b:real; c:Integer; Var x2:Real) : Boolean;
Begin
Flag:=True;
x2:= 12.0*c + a - b; {12*c приведет к ошибке при c>abs(32767.0/12)}
if x2=0 then
Begin
Writeln('Деление на ноль!!!!!!!! Повторите ввод.');
Flag:=False;
Exit;
End;
End;
{Вычисление арифметического выражения}
function F (a,b,x2:real; c:Integer) : Real;
Var x1 : Real;
Begin
x1:= ArcTan(b)+c*b-a/4;
F:=x1/x2
End;
{Ввод значения переменной С c проверкой его на допустимый диапазон}
Procedure InputC(Var c:integer);
Var cL:Real;
Begin
Repeat
Write('Введите значение c=====>');
Readln(cL);
Until (cL>=-32768)and(cL<=32767);
c:=trunc(cL)
End;
{Главная программа}
begin
Repeat
ClrScr;
Writeln(' Вариант 30');
Writeln(' arctg(b) + c*b - a/4');
Writeln(' x= ------------------------');
Writeln(' 12*c + a - b');
Writeln;
L1:
Write('Введите значение a=====>');
Readln(a);
Write('Введите значение b=====>');
Readln(b);
InputC(c);
if Flag(a,b,c,x2) then Writeln ('x=',F(a,b,x2,c))
else goto L1;
Writeln('Опять? (y/n)');
ch:=ReadKey;
Until (ch='n') or (ch='N');
end.
Рассмотрим поэтапное выполнение контрольной работы №1.
В данном задании необходимо вычислить значение арифметического выражения (вариант 30), которое является частным от деления выражения в числителе на выражение в знаменателе.
Для получения результата необходимо сделать следующее:
1. Ввести значения переменных, входящих в это выражение (a, b, c).
2. Проверить находятся ли целочисленные переменные (в данном случае только c) в диапазоне допустимых значений.
3. Вычислить знаменатель с проверкой его на ноль (т.к. деление на ноль НЕДОПУСТИМО).
4. Вычислить выражение.
5. Вывести результат вычисления.
Программе присвоено имя Work1, имя файла - Work1.pas:
· В фигурных скобках написаны комментарии - в данном случае номер варианта и вид выражения.
· Далее после зарезервированного слова Uses написано имя стандартного модуля среды Turbo Pascal - CRT (подробнее - см. Прил. 9).
· Затем описана метка L1.
· В поле описания Var переменные a,b,x,x1,x2 объявлены как Real, переменная с как Integer, переменная ch как Char ( типы данных - см. [4]).
· Далее идут описания функций Flag, F и процедуры InputC.
· Записана главная программа, которая вызывает нужные процедуры и функции, согласно алгоритму решения задачи.
Вычислим знаменатель с проверкой его на ноль с помощью функции Flag (основные понятия функции и процедуры даны в [4]). Функция Flag описана как Boolean и принимает два значения True (если знаменатель НЕ равен нулю) или False (если знаменатель равен нулю). В заголовке функции используем формальные параметры:
· входные переменные a,b,c, значения которых передаются из основной программы в функцию Flag;
· выходную переменную x2, значение которой вычисляется (это - знаменатель выражения) и передается в основную программу.
Алгоритм вычисления знаменателя следующий:
¨ Присваиваем функции значение Flag:=True;
¨ Вычисляем знаменатель и присваиваем переменной х2 выражение в знаменателе: х2:=12.0*с+a-b;
¨ Если знаменатель равен нулю (х2=0), функция Flag принимает значение равное False и управление передается в основную программу (Exit).
¨ Если знаменатель не равен нулю, значение функции Flag остается равным True и значения функции и переменной х2 передаются в основную программу.
В этом фрагменте использован условный оператор if-then - см. [4].
Непосредственно значение выражения определим с помощью функции F. Функция F описана как Real. Переменные a, b, c (входные) передаются из основной программы. Значение функции F вычисляется и передается в основную программу.
Алгоритм вычисления значения выражения:
¨ вычисляем значение выражения в числителе : х1:=ArcTan(b)+c*b-a/4;
¨ присваиваем функции F значение исходного выражения: F:=x1/x2 и управление передается в основную программу.
Ввод переменной С осуществляем с помощью процедуры InputC. В заголовке процедуры описан формальный параметр-переменная: Var с : integer - получаемое значение вводимой переменной.
Алгоритм работы процедуры InputC:
¨ В цикле вводим с клавиатуры значение переменной сL, одновременно проверяется находится ли значение сL в диапазоне -32768 ... +32767 (диапазон значений для целых чисел типа INTEGER). Тело цикла расположено между Repeat ...и ... Until. Подробнее о циклах см. [4].
¨ Переменной с присваиваем значение равное целой части (функция trunc) переменной cL c:=trunc(cL);
¨ Полученное значение переменной с передается в основную программу.
Алгоритм выполнения главной программы:
В цикле Repeat .... Until(ch=’n’) or (ch:=’N’) выполняем ввод переменных , проверку знаменателя на ноль и вычисление значения выражения для одного комплекта данных a,b,c:
· Вводим значение переменной а: Readln(а);
· Вводим значение переменной b: Readln(b);
· Обращаемся к процедуре InputC(с) для ввода значения целочисленной переменной c (значение с передается в основную программу из процедуры InputC).
· Проверяем значение функции Flag. Если оно True , то выводим значение выражения на экран, иначе управление переходит на метку L1, повторяем ввод переменных a, b, c до тех пор, пока знаменатель примет значение, отличное от нуля.
· После вывода результата на экране дисплея появляется сообщение - Опять? (y/n), переменной ch присваивается значение нажатой клавиши (оператор ReadKey читает символ с клавиатуры - N или Y). Если вы нажали N, выполнение программы заканчивается, если нажали клавишу Y, - управление передается на начало цикла и вы можете повторить вычисление с новыми значениями переменных a,b,c.
пример выполнения контрольной работы № 2
ЛИСТИНГ ПРОГРАММЫ Work2.pas
Program Work2;
{Вариант 30: a*b/4, если b > a
X = -55, если b = a
(b - 5)/a, если b < a
}
Uses CRT;
Const
inv1='Повторите ввод';
inv2='Деление на ноль!!!!!!! ';
inv3='Результат ';
inv4='выходит за диапазон [-32768..32767]!!!!';
inv5='Вводимое значение ';
invA='A';
invB='B';
Label L1;
var
a,b,x : Integer;
ch : Char;
{Вычисление значения X с проверкой на допустимый диапазон
для переменной типа INTEGER}
function F (a,b:Integer; Var x:Integer) : Boolean;
Var x1 : Real;
s1 : String;
Begin
F:=True;
if b>a then x1:=b/4.0*a {Только так, иначе будет ошибка вычисления!!!!}
else if b=a then x1:=-55
else if a=0 then
Begin
s1:=inv2+inv1;
Writeln(s1);
F:=False;
Exit;
End
else x1:=(b-5.0)/a;
{------ Проверка результата на допустимый диапазон ------}
if (x1>=-32768)and(x1<=32767) then x:=trunc(x1)
else
Begin
s1:=inv3+inv4;
Writeln(s1);
Writeln(x1);
Writeln(inv1);
F:=False;
Exit;
End
End;
{Процедура ввода исходного значения переменной А с проверкой на область
допустимых значений}
Procedure Input(Var A:integer; inv:String);
Label L;
Var aL :Real;
s1 : String;
Begin
L:
Write('Введите значение '+inv,'===>');
Readln(aL);
if (aL>=-32768)and(aL<=32767) then A:=trunc(aL)
else
Begin
s1:=inv5+inv4;
Writeln(s1);
Writeln(inv1);
goto L;
End
End;
{Главная программа}
begin
Repeat
ClrScr;
Writeln(' Вариант 30');
Writeln(' a*b/4, если b > a');
Writeln(' X = -55, если b = a');
Writeln(' (b - 5)/a, если b < a');
Writeln;
L1:
Input(b,invB);
Input(a,invA);
if F(a,b,x) then Writeln ('x=',x)
else goto L1;
Writeln('Опять? (y/n)');
ch:=ReadKey;
Until (ch='n') or (ch='N');
end.
В контрольной работе №2 необходимо вычислить значение целочисленной переменной Х в зависимости от значений тоже целочисленных переменных a и b c учетом области допустимых значений.
Программе присвоено имя Work2:
· В фигурных скобках (комментарий) записано условие задачи варианта 30.
· В поле вызова библиотечных модулей USES записан модуль CRT.
· В поле задания констант определены значения строковых констант: inv1, inv2, inv3, inv4, inv5, invA, invB.
· В поле меток описана метка L1.
· В поле описания переменных описаны переменные - a, b, x : integer; ch : char.
· Далее следуют описания функции F и процедуры Input.
· Записана главная программа, которая вызывает нужные процедуры и функции, согласно алгоритму решения задачи.
Функция F определена как BOOLEAN. В заголовке функции описаны входные параметры a,b:integer (передаются из основной программы) и выходной параметр x:integer ( передается в основную программу). В теле функции используются локальные переменные x1: real и s1: string.
Алгоритм выполнения функции 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]!!!!’);