Лабораторная работа № 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 |