Лабораторная работа № 2. Программирование алгоритмов с ветвлениями
Программирование алгоритмов с ветвлениями
Задачи лабораторной работы
Вопросы, изучаемые в работе
· Построение простейшей программы с ветвлениями.
· Изучение условных операторов.
· Использование именованных констант.
· Использование операторов ввода для исходных данных.
Задание (общее ко всем вариантам).
Написать программу вычисления и вывода на экран значения функции F по значениям одного или нескольких аргументов, величины которых вводятся с клавиатуры операторами ввода. Результат вывести на экран. Проверить программу, задавая значения аргументов, указанные в задании, и сверяя результаты с приведенными ответами.
Оформить отчет по лабораторной работе по образцу первой работы, но текст программы распечатать из оболочки Турбо-Паскаля.
Требования к программе
· Программа должна содержать комментарий по форме, указанной в работе № 1.
· Константа, встречающаяся в задании два или более раз, должна быть использована в программе в форме именованной константы.
· Значения аргументов вводятся с клавиатуры, перед вводом должен стоять оператор запроса аргументов.
· Проверку программы выполнить для всех ветвей алгоритма.
· При выводе результата, одновременно выводить значения аргументов.
· Вывод результата выполнять по формату :8:4.
Общие пояснения
1.Алгоритмы с ветвлениями подразумевают, что в них существует больше одного пути, по которому можно пройти от начала к концу. Наличие параллельных ветвей алгоритма осложняет тестирование программ, так как требуется задать несколько вариантов исходных данных, чтобы отработали все ветви алгоритма.
Ветвящиеся алгоритмы могут быть построены как из стандартных структур ветвления (А), так и из неполных (В).
В данной работе (как и вообще при программировании на языке Паскаль) предпочтительней использовать конструкцию типа (А), так как она отвечает требованиям структурного программирования.
2. Реализация структур ветвления на Паскале осуществляется с помощью условных операторов "if".
Таблица 6. Запись "if" операторов на Паскале
Форма (А) запишется: | Форма (В) с операторами по "да": |
if <услов.истинно> then begin <операторы ветви 1> end else begin <операторы ветви 2> end; | if <условие истинно> then begin <операторы ветви 1> end; |
Форма (Б) с операторами по "нет" : | |
if <условие истинно> then goto Met; <операторы ветви 1>; Met: . . . |
Примеры написания таких операторов:
if A>0 then Y:=sin(X) else Y:=cos(X);
if (A+B > C) and (B < 0) then { если требуется проверка}
Writeln('Ветвь 1') { нескольких условий, }
else { каждое отношение следует}
Writeln('Ветвь 2'); { заключать в скобки }
if Pr then {здесь Pr – логическая переменная,}
begin {если Pr равно TRUE выполнится этот блок}
Writeln(' При таких данных решения нет');
Pr:=FALSE;
end;
Если в качестве оператора одной из ветвей используется условный оператор, то можно выбирать один из трех возможных путей. Вообще, количество "if"-операторов должно быть на единицу меньше, чем возможных ветвей алгоритма. Например, если нужно задать Y=-1, при X<0, Y=0 при X=0 и Y=1 при X>0, такой алгоритм и соответствующий ему текст на Паскале будет выглядеть:
If X<0 then Y=-1
else
if Y>0 then Y=1
else Y=0;
Условиями, определяющими какую ветвь алгоритма выполнять, являются логические выражения, принимающие значение TRUE или FALSE. В качестве таких выражений часто используются отношения между двумя однотипными данными. Турбо-Паскаль разрешает сравнивать вещественные и целочисленные данные, строчные и символьные данные. Подробнее см. учебное пособие с описанием языка.
Таблица 7. Операции отношений
№ | Операция | Знак операции | ||
Равно | = | |||
Не равно | <> | |||
Больше | > | |||
Больше или равно (не меньше) | >= | |||
Меньше | < | |||
Меньше или рано (не больше) | <= | |||
В качестве операций отношений для упорядоченных типов данных можно использовать шесть видов операций, приведенных в таблице N 7; для неупорядоченных типов разрешены только первые две операции. У всех одинаковый приоритет, причем он ниже, чем приоритеты любых других операций (арифметических и прочих), а результат всегда имеет логическое значение.
3. В программе на Паскале можно пользоваться константами, которые имеют не только значение, но и имя. Такие константы должны быть описаны в блоке описаний, в специальном разделе описаний констант. Использование таких именованных констант позволяет "вытащить" задание значений констант в начало программы, где их можно, при необходимости, изменить в одном месте. Пример раздела описаний констант:
CONST
MAXBALL = 5;
MINBALL = 2;
ERR = ' Ошибка в программе';
ABSNUL = -273.16;
В дальнейшем можно всюду вместо числового значения -273.16 использовать имя ABSNUL и т.д.
Существует ряд констант, которыми можно пользоваться без их описания. Некоторые из них приведены в таблице 8.
Таблица 8. Стандартные константы Турбо-Паскаля
Имя | Тип | Значение | Назначение |
TRUE | boolean | True | "истина" |
FALSE | boolean | False | "ложь" |
MAXINT | integer | +32767 | Максимальное целое |
MAXLONGINT | longint | +2147483647 | Максимальное длинное целое |
PI | double | 3.14159265358... | Число p |
4. В процессе работы программа пользуется данными, которые берет из ячеек памяти. Каким же образом эти значения попадают в эти ячейки? Существует всего три возможности. Во-первых, значения могут быть занесены в некоторые переменные в самый начальный момент при загрузке программы в память. Такие переменные называются типизированными константами (хотя по сути их правильнее называть инициализированными переменными). Во-вторых, переменная (ячейка памяти) может получить значение при выполнении оператора присваивания. Наконец, в переменную можно ввести значение с помощью процедуры ввода данных с внешнего устройства.
Только последний способ позволяет одной и той же программе обрабатывать различные наборы исходных данных. Если в программе нет операторов ввода, она при всяком запуске будет выполнять один и тот же расчет.
Оператор ввода (а точнее, процедура ввода) может вводить данные в оперативную память или из файла или с клавиатуры. При вводе с клавиатуры процедура имеет вид:
Read(<список переменных>); или
Readln(<список переменных>);
где список переменных представляет собой перечень имен переменных через запятую, в которые заносятся вводимые значения. Очевидно, что список значений и список имен должны соответствовать друг другу по типам и порядку следования элементов списков. Отличие в этих процедурах проявляется только при вводе данных из файла. Оно заключается в том, что при втором варианте после ввода выполняется переход на новую запись файла, даже если в текущей записи данные не кончились.
Примеры:
Read(N); {программа ждет, пока не будет набрано число на клавиатуре и не нажата клавиша <Enter>, после чего переменная с именем N получит набранное значение}
Read(A,B,C); {необходимо набрать через пробел три числа и нажать <Enter>, первое попадет в ячейку с именем A и т.д.}
Нельзя в списке имен писать константы или выражения.
Если в программе требуется выполнить ввод данных с клавиатуры, предварительно следует предусмотреть команды вывода на экран запроса, какие параметры и в каком порядке пользователь должен вводить, например:
Writeln('задай коэффициенты уравнения: A,B,C');
Readln(A,B,C);
или
Writeln('Сколько вариантов будем считать?');
Readln(N);
Разбор контрольного варианта
Задание
Написать программу вычисления и вывода на экран (по формату :8:4) значения функции по значениям аргументов A и B, величины которых вводятся с клавиатуры операторами ввода. Проверить ее работу для каждой ветви алгоритма заданием соответствующих исходных данных.
Таблица 9. Данные задания 31 варианта
Вид функции | При условии | Данные для проверки | ||||||||
| | 3.2 0.34 А | 0.68 -3.58 0.13 В | -0.4154 -0.2328 3.9506 F |
Таблица 10. Таблица распределения памяти
Имя | Тип | Р-р,байт | Назначение |
Lab_2 | Имя программы | Вычисление заданной функции | |
F | Веществ. | Результат | |
A | Веществ. | Аргумент | |
B | Веществ. | -"- | |
C | Веществ.константа | 2.13 | |
R | Веществ. | Рабочая переменная | |
sin | Веществ.функция | Вычисление синуса | |
cos | Веществ.функция | Вычисление косинуса | |
exp | Веществ.функция | Вычисление экспоненты | |
ln | Веществ.функция | Вычисление натурального логарифма |
Блок-схема алгоритма
|
| ||||||
|
|
|
Текст программы
PROGRAM Lab_2;
{ Лабораторная работа N 2 Вариант N 31
А.Я.Умненькая, ст. гр. Я-007 }
CONST
C=2.13;
VAR
A,B,F,R :real;
BEGIN
Writeln('Значения аргументов A и B ?');
Readln(A,B);
R:=A+B;
if R>C then
F:= Sin(R)+1.0/R
else
if R<C then
F:= cos(A)-ln(-R)
else
F:= exp(R)/C;
Writeln(' Рез-т: ',F:8:4);
END.
Результаты расчетов
Рез-т: -0.4154
Рез-т: 0.2328
Рез-т: 3.9506
Варианты заданий
Таблица 11. Варианты заданий лабораторной работы № 2
№ вар. | Вид функции | При условии | Данные для проверки | ||
A | B | Результат | |||
-4.0 -1.0 4.52 | 0.25 | 2.1353 4.2500 -0.9983 | |||
0.77 2.88 1.01 | 1.99 7.04 | 6.8061 -3.9833 0.7888 | |||
2.10 10.2 3.0 | -1.2 0.02 1.0 | 1.9341 0.6930 2.4975 | |||
0.01 0.01 1.11 | 0.5 2.0 -2.22 | 0.5001 -0.3070 -2.3881 | |||
65.43 0.11 -2.13 | 1.33 -3.13 | 4.1626 -0.2293 0.4416 | |||
-2 -1.0 | -2 1.0 | 8.1400 -0.1610 1.3491 | |||
0.11 | 0.55 5.45 | 0.4500 0.0029 0.4170 | |||
2.22 0.5 | 0.5 2.22 0.1 | 1.3429 0.4510 0.9418 | |||
1.5 0.5 0.2 | 0.5 1.5 0.01 | 3.0562 0.9983 0.8600 | |||
-1 -3 -1.0 | 1.0 0.0 | 1.2091 -0.4620 -1.6797 | |||
1.1 3.3 | 2.2 -1.2 -1 | 4.9914 6.1148 -5.7770 | |||
-1 0.0 | -2 1.0 -0.23 | -7.5470 0.2256 1.4042 | |||
2.5 3.14 | -1 2.1 | -0.0085 7.8897 -0.1335 | |||
-1 | -0.1 | 1.0556 -0.1110 0.0000 | |||
2.5 1.5 | -0.2 1.5 -1.5 | 0.1310 2.5105 -1.7101 | |||
-1 | 0.5 2.3 9.5 | -0.0354 -0.0248 0.9996 | |||
3.5 -3.5 | 2.5 -2.5 | 2.5000 0.0396 0.8223 | |||
-1.5 | -1 -2 0.5 | 2.4973 -3.0000 0.3336 | |||
1.5 -1.5 | -2 -5.8 | 3.1602 -2.3872 -0.4959 | |||
-1 0.5 | 1.0 | 4.1212 -0.2264 3.8982 | |||
1.8 0.5 -0.2 | 0.8 1.7 | 0.0000 0.8771 -0.3002 | |||
-12.3 2.5 | -89.9 4.5 -0.5 | 48.5200 0.0805 32.0000 | |||
-10 3.5 | -5.5 | -0.5589 1.6094 85.2480 | |||
-1.88 1.25 5.5 | -0.66 0.13 -0.02 | 0.9370 0.9916 -0.1233 | |||
11.1 3.9 | 0.87 1.55 0.06 | 1.0160 25.3045 0.5003 | |||
- 0.5 - 1.7 | 3.55 3.1 | 1.1526 -0.0551 1.1299 | |||
-0.08 1.89 2.40 | 0.28 4.92 - 2.4 | -1.9599 1.5006 1.3569 | |||
A + B > 17.33 A + B < - 17.33 в остальных случаях | 10.3 - 20.6 2.48 | 13.8 -0.6 - 1.75 | -12.0952 0.6730 0.0421 | ||
5.77 - 3.96 1.0 | - 1.85 2.04 0.1 | 0.6055 1.6708 2.0833 | |||
2.77 0.84 - 1.39 | 0.88 - 3.58 - 0.42 | 5.4488 18.227 7.9204 | |||
3.2 0.34 | 0.68 - 3.58 0.13 | -0.4154 -0.2328 3.9506 |