Язык
программирования Pascal » Тема 2 » Лекция
5
В теории программирования доказано, что программу для
решения задачи любой сложности можно составить только из трех структур,
называемых следованием, ветвлением и циклом. Следованием называется
конструкция, представляющая собой последовательное выполнение двух или более
операторов (простых или составных). Ветвление задает выполнение либо
одного, либо другого оператора в зависимости от выполнения какого-либо
условия. Цикл задает многократное выполнение оператора (рис.1).
|
Рис.
1.
|
Следование, ветвление и цикл называют базовыми
конструкциями структурного программирования. Их особенностью является
то, что любая из них имеет только один вход и один выход, поэтому они могут
вкладываться друг в друга. Например, цикл может содержать следование из двух
ветвлений, каждое из которых включает вложенные циклы.
Целью использования базовых конструкций является получение
программы простой структуры. Такую программу легко читать, отлаживать и при
необходимости вносить в нее изменения. Язык Паскаль способствует созданию
хорошо структурированных программ, поскольку базовые конструкции реализуются
в нем непосредственно с помощью соответствующих операторов.
Условный оператор if
Условный оператор if используется для разветвления процесса
вычислений на два направления. Структурная схема оператора приведена на рис. 2
Формат оператора:
if выражение then оператор_1 [else оператор_2;]
Сначала вычисляется выражение, которое должно иметь
логический тип. Если оно имеет значение true, выполняется первый
оператор, иначе - второй. После этого управление передается на оператор,
следующий за условным.
|
Рис.
2.
|
Одна из ветвей может отсутствовать (см. рис. 2).
Операторы, входящие в состав условного, могут быть простыми или составными. Составной
оператор (блок) обрамляется ключевыми словами begin и end. Блок
применяют в том случае, когда по какой-либо ветви требуется выполнить
несколько операторов.
Пример #1.
|
if a < 0 then b := 1; {1} if (a < b) and ((a > d) or (a = 0)) then inc(b) else begin b := b * a; a := 0 end; {2} if a < b then if a < c then m := a else m := c else if b < c then m := b else m := c; {3} |
Если требуется проверить несколько условий, их объединяют
знаками логических операций. Так, выражение в примере 2 будет истинно в том
случае, если выполнится одновременно условие a < b и хотя бы одно из
условий a > d и a = 0.
Частая ошибка при программировании условных операторов - неверная
запись проверки на принадлежность диапазону. Например, условие 0 < x < 1
нельзя записать непосредственно. Правильный способ: if(0 < x) and (x < 1) then..., поскольку фактически требуется задать проверку выполнения одновременно
двух условий: x > 0 и x
< 1.
Вторая ошибка - отсутствие блока после else, если на
самом деле по этой ветви требуется выполнить более одного действия. Эта
ошибка не может быть обнаружена компилятором, поскольку является не
синтаксической, а семантической, то есть смысловой.
Пример #2.
|
|
Программа, которая по введенному значению аргумента
вычисляет значение функции, заданной в виде графика (рис. 3).
|
Рис.
3.
|
|
Сначала составим описание алгоритма в неформальной
словесной форме.
1. Ввести значение аргумента х.
2. Определить, какому интервалу из области определения функции оно
принадлежит и вычислить значение функции y по соответствующей формуле.
3. Вывести значения х и y.
Второй пункт алгоритма следует детализировать. Сначала
запишем определение функции в виде формул:
|
Рис.
4.
|
Теперь в соответствии с формулами опишем
последовательность действий словами:
·
если x < -2, то присвоить переменной y значение 0;
·
если -2 <= x < -1, то присвоить
переменной y значение -x - 2;
·
если -1 <= x < 1, то присвоить
переменной y значение x;
и так далее.
program calc_function_1; var x, y : real; begin writeln(' Введите значение аргумента'); readln(x); if x < -2 then y := 0; if (x >= -2) and (x < -1) then y := -x - 2; if (x >= -1) and (x < 1) then y := x; if (x >= 1) and (x < 2) then y := -x + 2; if x >= 2 then y := 0; writeln('Для x = ', x:6:2, ' значение функции y = ', y:6:2); end.
Тестовые примеры для этой программы должны включать по
крайней мере по одному значению аргумента из каждого интервала, а для
проверки граничных условий - еще и все точки перегиба.
|
Оператор варианта case
Оператор варианта (выбора) предназначен для разветвления
процесса вычислений на несколько направлений. Стрктурная схема оператора
приведена на рис. 5.
Формат оператора:
case выражение of константы_1 : оператор_1; константы_2 : оператор_2; * константы_n : оператор_n; [ else : оператор ] end;
|
Рис.
5.
|
Выполнение оператора начинается с вычисления выражения.
Затем управление передается на оператор, помеченный константами, значение
одной из которых совпало с результатом вычисления выражения. После этого
выполняется выход из оператора. Если совпадения не произошло, выполняются
операторы, расположенные после слова else, а при его отсутствии
управление передается оператору, следующему за case.
Выражение после ключевого слова case должно быть порядкового
типа, константы - того же типа, что и выражение. Чаще всего после case используется
имя переменной. Перед каждой ветвью оператора можно записать одну или несколько
констант через запятую или операцию диапазона, обозначаемую двумя идущими
подряд точками, например:
case a of 4 : writeln('4'); 5, 6 : writeln('5 или 6'); 7..12: writeln('от 7 до 12'); end;
ВНИМАНИЕ Если по
какой-либо ветви требуется записать не один, а несколько операторов, они
заключаются в блок с помощью ключевых слов begin и end.
Пример #3.
|
|
Программа, определяющая, какая из курсорных клавиш была
нажата.
|
Для объяснения этой программы надо забежать немного вперед
и рассказать о том, что в состав оболочек Паскаля входят так называемые
модули - библиотеки полезных при программировании ресурсов. В модуле Crt есть функция
readkey, позволяющая получить код нажатой клавиши.
Функция readkey работает так: если нажата алфавитно-цифровая клавиша, функция
возвращает соответствующий символ. Если нажата клавиша курсора,
возвращается символ с кодом 0, а при повторном вызове можно получить так
называемый расширенный код клавиши. Для простоты можно считать, что
расширенный код - это номер клавиши на клавиатуре. Функция ord позволяет
получить числовой код символа.
program cursor_keys; uses Crt; var key : char; begin writeln('Нажмите одну из курсорных клавиш '); key := readkey; if ord(key) <> 0 then writeln('обычная клавиша') else begin key := readkey; case ord(key) of 77: writeln('стрелка вправо'); 75: writeln('стрелка влево'); 72: writeln('стрелка вверх'); 80: writeln('стрелка вниз'); else writeln('не стрелка'); end; end; end. |
|
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.