Смекни!
smekni.com

Методические рекомендации по выполнению контрольных и лабораторных работ (стр. 4 из 7)

{Вычисление знаменателя с проверкой его на ноль}

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.

ПРИЛОЖЕНИЕ 3

пример выполнения контрольной работы № 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]!!!!’);