Pascal синтаксис операторов условного перехода множественный выбор. Turbo Pascal. Структурированные операторы. Примеры использования оператора условного перехода, который имеет сокращенную форму представления

  • 31.10.2019

Оператор перехода

В этот раз я продолжу рассмотрение темы “Операторы”.

Операторы (безусловного) перехода предназначены для передачи управления оператору, помеченному меткой (которому предшествует метка).

Авторская версия языка предполагает оформление метки в виде целого десятичного числа в диапазоне 1..9999 . В качестве меток Turbo Pascal допускает использование идентификаторов. При использовании операторов перехода необходимо соблюдать следующие правила:

1) Все метки, находящиеся в блоке, должны быть описаны. При этом каждая метка может быть описана не более одного раза. Т.е. в пределах блока не может быть двух меток с одним и тем же именем.

2) Метка, указанная в операторе перехода, должна указывать на оператор (помечать его), находящийся в том же блоке, что и сам оператор перехода. Т.е. переходы вовне процедур (функций) или внутрь них не допускаются.

3) Попытка перехода (передачи управления) внутрь структурного оператора может вызвать непредсказуемые эффекты, хотя в данном случае компилятор может не выдать сообщения об ошибке.

Применение безусловного перехода в программе считается теоретически избыточным, так как может внести путаницу в цепочку логически размещённых операций программы, что может повлечь большие сложности при отладке и модификации такой программы. Применять операторы перехода рекомендуется, соблюдая следующие правила:

1) если кажется невозможным обойтись без операторов перехода, необходимо стремиться применять их для передачи управления только вниз по тексту программы (вперёд); при возникновении необходимости передачи управления “назад” лучше использовать операторы цикла (см. далее);

2) для наглядности, расстояние между меткой и оператором перехода на неё не должно превышать одной страницы текста (или высоты экрана дисплея), иначе смысл такого безусловного перехода будет трудно уловить.

Метки определяются посредством описаний, которые начинаются со служебного слова label и содержат последовательность имён меток через запятую. Для передачи управления оператору, помеченному меткой, предусмотрен оператор безусловного перехода goto . Метка отделяется от следующего за ней оператора символом ‘:’ (двоеточие). Пример:

var j: integer;

{ объявляем две метки }

label Start, Finish;

Start: writeln(‘Начало программы’);

goto Finish;

Finish: writeln(‘Конец программы’);

Составной оператор

Самым простейшим структурным оператором является составной оператор. Данный оператор задаёт последовательность выполнения содержащихся в нём операторов. Составной оператор оформляется в виде списка операторов, отделённых друг от друга символом ‘;’ (точка с запятой) и заключённых между служебными словами begin и end .

Необходимость в составном операторе может возникать в тех случаях, когда синтаксис языка Pascal допускает использование только одного оператора в том месте программы, где необходим целый ряд действий (операторов, см. примеры далее). Приведу простой пример составного оператора:

Условный оператор

Смысл условного оператора состоит в том, чтобы провести анализ некоторого логического условия, и в соответствии с тем, выполняется это условие или нет, передать управление соответствующему оператору. В качестве условия может быть выражение, возвращающее логическое значение булевского типа. Результатом анализа условия может быть значение true , т.е. условие выполняется и false , т.е. условие не выполняется.

Условный оператор выполняется следующим образом. Предварительно вычисляется выражение, указанное после служебного слова IF . Если условие выполняется, то управление передаётся оператору, указанному после служебного слова then , если нет, то выполняется оператор, указанный после служебного слова else. При этом часть условного оператора, начиная со слова else, может отсутствовать. Вот примеры условных операторов:

If Keypressed then writeln(‘Клавиша нажата’);

If A > B then Min:= B

else Min:= A;

if X1 > X2 then begin

Последний пример - это как раз тот случай, когда необходимо, чтобы по условию выполнялся ряд операторов, но в силу того, что за служебным словом then или else может следовать только один оператор, то есть возможность урегулировать ситуацию, используя составной оператор, содержащий как раз ряд тех необходимых операторов.

При составлении вложенных условных операторов следует учитывать, что ветвь else всегда принадлежит предшествующему ветвлению IF , у которого ещё нет ветви else. Т.е. следующую конструкцию

if Условие1 then if Условие2 then Оператор1 else Оператор2;

для ясности, можно трактовать так

if Условие1 then begin

if Условие2 then Оператор1 else Оператор2;

Необходимо соблюдать аккуратность при использовании вложенных условных операторов, чтобы в запале составления очередного условного оператора программы, не упустить из виду такую, на первый взгляд, мелкую деталь, которая может привести к совершенно иному выполнению условного ветвления.

Оператор варианта

Довольно часто возникает ситуация, когда цепочка условных операторов разрастается до огромных масштабов, например, следующий пример иллюстрирует скромное по своим размерам ветвление, но уже содержащее в себе сложность восприятия смысла, заложенного в нём:

type TWay = (Up, Right, Down, Left);

var Way: TWay;

MapX, MapY: word;

if Way = Up then MapY:= MapY - 1

else if Way = Right then MapX:= MapX + 1

else if Way = Down then MapY:= MapY + 1

else MapX:= MapX - 1;

Последняя ветвь else не имеет оператора If , так как в случае невыполнения всех трёх условий логично было бы, чтобы в действие вступал оператор, соответствующий четвёртому и последнему варианту возможных значений типа TWay .

В данном случае нам ещё повезло, что тип TWay имеет только четыре варианта принимаемых значений. Составление таких ветвлений превратилось бы в рутину, если бы вариантов было десять и более? А ведь в представленном ветвлении просматривается простая закономерность. Так можно ли его как-то упростить и сделать более эффективным и читабельным? Можно, и для этого в языке предусмотрен оператор варианта, конструкция которого может содержать произвольное число альтернатив для определённого выражения. Тогда последний пример можно переписать на новый лад:

case Way of

Up: MapY:= MapY - 1;

Right: MapX:= MapX + 1;

Down: MapY:= MapY + 1;

Left: MapX:= MapX - 1;

Ну вот, совсем другое дело. Теперь рассмотрим порядок выполнения данного оператора. Предварительно вычисляется значение выражения, следующего за служебным словом case , но так как в данном случае стоит имя переменной Way , то производится чтение значения этой переменной. Полученное значение сравнивается поочерёдно с каждой альтернативой (константной, непосредственным значением), указанной после служебного слова of . В случае равенства значения выражения очередной константе, выполняется оператор-альтернатива, следующий за этой константой, отделённый от неё двоеточием. После завершения выполнения альтернативного оператора действие переходит к оператору, следующему за оператором варианта. При несовпадении значения Way ни с одной константой, данный оператор варианта не производит никаких действий.

А как же быть, если необходимо предусмотреть некоторую ветвь операторов, которая выполнялась бы в случае несовпадения значения выражения ни с одной константой? Для этого можно использовать альтернативу else, например:

case Way of

Up: MapY:= MapY - 1;

Right: MapX:= MapX + 1;

Down: MapY:= MapY + 1;

else MapX:= MapX - 1;

Следовательно, конструкция, построенная с помощью оператора case полностью эквивалентна конструкции, построенной ранее с помощью оператора IF . К тому же она нагляднее и нет риска запутаться во многочисленных else .

Я ещё раз хочу обратить ваше внимание на то, что константами в операторе варианта могут быть как непосредственные целые числа, так и имена нетипизированных констант, описанных ранее. Использование типизированных констант в альтернативах оператора варианта не допускается. При чём в каждом варианте можно указать целый список констант через запятую или диапазон значений, например:

case Way of

Up, Down: writeln(‘Двигаемся по вертикали’);

Right, Left: writeln(‘Двигаемся по горизонтали’);

case X of

10,20,30: writeln(‘десятки’);

1..9: writeln(‘единицы’);

В последней конструкции оператор writeln(‘единицы’) выполнится, если переменная X будет иметь одно из значений 1,2,3,..,8,9 .

Как вы могли заметить, строки с константами я выровнял по двоеточиям, так как мне кажется, что такой вид нагляднее, хотя это дело вкуса, а как известно, на вкус и цвет товарища нет;O)

Применять оператор варианта следует в соответствии со следующими правилами:

1) Допустимые значение выражения - “переключателя”, записанного после служебного слова case , должны удовлетворять дискретному типу: для целого типа они должны лежать в диапазоне -32768..32767 .

2) Все указанные константы альтернатив должны иметь тип, совместимый с типом выражения.

3) Константы в альтернативах не должны повторяться в пределах оператора варианта, а диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах.

И ещё одно. Конструкция case предусматривает один оператор для каждой альтернативы. Если возникает необходимость выполнения нескольких операторов, следует сгруппировать их в составной оператор begin..end . Есть возможность указать пустой оператор для альтернативы, поставив символ ";" (точка с запятой) сразу после двоеточия, который ничего не будет выполнять. А синтаксис ветви else предусматривает указание последовательности операторов, разделённых символом ‘;’ (точка с запятой).

На занятии рассматривается условный оператор в Паскале (if ). Объясняется, как использовать несколько условий в одной конструкции (AND и OR ). Рассмотриваются примеры работы с оператором

Напоминаем, что данный сайт не претендует на полное изложение информации по теме. Целью портала является предоставление возможности усваивания материала на основе готовых решенных примеров по теме «Язык программирования Pascal» с практическими заданиями для закрепления материала. Представленные на сайте сайт задания по Паскалю выстроены последовательно по мере увеличения их сложности. Сайт сайт может быть использован учителями и преподавателями в качестве вспомогательного наглядного пособия.

До рассмотрения данной темы в основном использовались линейные алгоритмы в Паскале, характерные для весьма простых задач, когда действия (операторы) выполняются последовательно, одно за другим. Более сложные алгоритмы предусматривают использование конструкция ветвления.

Блок-схема условного оператора:

Условный оператор в Паскале имеет следующий синтаксис:

Сокращенный вариант:

if условие then оператор;

Полный вариант:

if условие then оператор else оператор;

Условный оператор в Паскале — if — служит для организации хода задачи таким образом, при котором изменяется последовательность выполнения операторов в зависимости от какого-либо логического условия. Логическое условие может принимать одно из двух значений: либо true (истина), либо false (ложь), соответственно, оно может быть либо истинным, либо ложным.

Составной оператор

Если при истинном условии необходимо выполнять несколько операторов, то их по правилам языка Pascal необходимо заключать в блок , начинающийся со служебного слова begin и заканчивающегося служебным словом end . Такой блок принято называть операторными скобками , а данную конструкцию — составным оператором :

Операторные скобки и составной оператор в Паскале:

if логическое выражение then begin оператор1; оператор2; end else begin оператор1; оператор2; end;

Перевод с английского оператора условия облегчит понимание его использования:

IF THEN ELSE
ЕСЛИ ТО ИНАЧЕ


В условии (в логическом выражении) используются операторы отношения.
Рассмотрим список операторов отношения Паскаля:

  • больше >
  • меньше
  • больше или равно в Pascal >=
  • меньше либо равно в Pascal
  • сравнение в Pascal =
  • не равно в Pascal

Пример: найти наибольшее из двух чисел

Вариант 1 Вариант 2


Подробно разобраться в работе условного оператора в Паскале можно, просмотрев видеоурок:

Пример: вычислить значение переменной у по одной из двух ветвей

Показать решение:

var x,y:real; begin writeln ("введите х"); read(x); if x>0 then y:=ln(x) else y:=exp(x); writeln ("y=", y:6:2) {итоговое число будет занимать 6 позиций, и в нем будет 2 знака после запятой} end.

Обратите внимание на то, как в данном примере выводится y . При выводе переменных типа в pascal, можно использовать так называемый форматированный вывод , или запись с двумя двоеточиями:
y:6:2
- цифра после первого двоеточия (6) указывает на то, сколько знаков будет занимать число при выводе на экран
- цифра после второго двоеточия (2) указывает на то, сколько знаков после запятой вещественного числа будет выводиться

Таким образом, использование такой записи в pascal практически позволяет выполнить округление до сотых, тысячных и т.п.

Задача 0. Вычислить значение переменной у по одной из двух ветвей:

Задача 1. В компьютер вводятся два числа. Если первое больше второго, то вычислить их сумму, иначе - произведение. После этого компьютер должен напечатать результат и текст ЗАДАЧА РЕШЕНА

Задача 2. Дракон каждый год отращивает по три головы, но после того, как ему исполнится 100 лет - только по две. Сколько голов и глаз у дракона, которому N лет?

Логические операции в Паскале (в логическом выражении)

Когда необходимо использовать двойное условие в Pascal, то понадобятся логические операции.

  • Логическая операция AND (И), поставленная между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия (должны быть истинными). Логический смысл операции - "конъюнкция".
  • Поставленный между двумя условиями, знак OR (ИЛИ) говорит о том, что достаточно, если будет выполняться хотя бы одно из них (одно из двух условий истинно). Логический смысл операции - "дизъюнкция".
  • На языке Паскаль XOR - знак логической операции, имеющий смысл "строгая дизъюнкция" и указывающий на то, что необходимо, чтобы одно из двух условий выполнялось (истинно), а другое - не выполнялось (ложно).
  • Логическая операция NOT перед логическим выражением или переменной имеет смысл "отрицание" или "инверсия" и указывает на то, что если данная переменная или выражение истинны, то их отрицание - ложь и наоборот.

Важно: Каждое из простых условий обязательно заключать в скобки.

Пример : Рассмотрим примеры логических операций в логических выражениях в Паскале

1 2 3 4 5 6 7 8 var n: integer ; begin n: = 6 ; if (n>5 ) and (n<10 ) then writeln ("истина" ) ; if (n>7 ) or (n<10 ) then writeln ("истина" ) ; if (n>7 ) xor (n<10 ) then writeln ("истина" ) ; if not (n>7 ) then writeln ("истина" ) ; end .

var n:integer; begin n:=6; if (n>5) and (n<10) then writeln("истина"); if (n>7) or (n<10) then writeln("истина"); if (n>7) xor (n<10) then writeln("истина"); if not(n>7) then writeln("истина"); end.

Пример: Компания набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он для данной компании (вывести ответ «подходит» или «не подходит»).
Особенность: надо проверить, выполняются ли два условия одновременно.

Большинство программистов считают использование в программе оператора безусловного перехода, знаком дурного тона и редко используют его. Но, не смотря на это, знать его надо, так как может оказаться, что Вы не сможете придумать альтернативного решения проблемы. Имя данного оператора Goto , смысловое значение в программе «перейти к …», а его общий вид такой:

Goto m;

m – метка, заранее заданная в разделе описания меток. Следующая программа показывает как работает оператор безусловного перехода.

1
2
3
4
5
6
7
8
9
10

program goto_primer; {имя программы}
uses crt; {подключение модуля}
label m; {описание метки m}
begin
write (‘Karl Marx ‘ ) ; {вывод строки}
goto m; {требование перейти к метки}
write (‘clever’ ) ; {этот оператор пропускается}
m: write (‘fool’ ) ; {выполняется переход в эту область}
readkey; {для останова программы}
end .

В этой программе нет никаких условий, но именно о них будет идти далее речь.

Условный оператор:

В Паскале проверить какую-то часть программы для определения дальнейшего пути, по которому ей следует идти, есть оператор If . В зависимости от выполнения логического условия он указывает, какой блок выполниться следующим. Существует две формы записи: полная и краткая. Вторая отличается от первой тем что в ней имеется ветвь Else (иначе).

Общий вид краткой формы:

If <условие A> Then <оператор 1>;

Общий вид полной формы:

If <условие A> Then <оператор 1>

Else <оператор 2>;

В краткой форме выполняется оператор 1 тогда, когда условие A истинно, иначе управление переходит к следующему оператору. В полной форме если условие A истинно, то выполняется оператор 1, иначе выполняется оператор 2. Следует запомнить, что перед else точка с запятой не ставится.

Пример программы с условным оператором, записанным в краткой форме:

Пример программы с условным оператором, записанным в полной форме:

В Паскале можно вкладывать один условный оператор в другой, причем делать это можно множество раз. При этом следует отметить, что каждому Then соответствует ближайшее Else .

Оператор выбора:

Когда количество альтернатив больше двух применяется оператор выбора Case . Его вид:

Case <селектор> Of

<значение селектора>: <оператор 1>;

<значение селектора>: <оператор 2>;

<значение селектора>: <оператор N>;

Else <оператор>

Если селектором оператора If было логическое выражение, то в Case им выступает переменная, которая может быть целого, перечислимого, интервального или символьного типа. В случае совпадения селектора со значения выполняется соответствующий оператор. Задать значение селектору можно тремя способами:

1) перечислением: 1, 10, 100, 1000

2) диапазоном: ‘d’..’k’

3) перечислением и диапазоном: 1..10, 20, 30, 50, 70..100

Выполнятся в операторе выбора, может только одна ветка (идущая раньше), даже когда селектор совпадает с несколькими значениями. Также, в отличие от If в Case можно ставить точку с запятой перед Else .

Рассмотрим программу, в которой условия проверяет оператор выбора.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

program case_primer;
uses crt;
var money: char ;
begin
write (‘Первая буква кода денежной единицы: ‘ ) ;
readln (money) ; {ввод значение в переменную}
case money of
‘A’ , ‘a’ : writeln (‘Французский франк’ ) ;
‘B’ , ‘b’ : writeln (‘Динар’ ) ;
‘C’ , ‘c’ : writeln (‘Юань’ ) ;
‘E’ , ‘e’ : writeln (‘Испанская песета’ ) ;
‘G’ , ‘g’ : writeln (‘Английский фунт стерлингов’ ) ;
‘I’ , ‘i’ : writeln (‘Итальянская лира’ ) ;
‘J’ , ‘j’ : writeln (‘Иена’ ) ;
‘R’ , ‘r’ : writeln (‘Рубль’ ) ;
‘U’ , ‘u’ : writeln (‘Доллар США’ ) ;
‘X’ , ‘x’ : writeln (‘Восточнокарибский доллар’ ) ;
else writeln (‘Неизвестная единица’ )
end ;
readkey;
end .

Программа проверяет селектор на соответствие его с имеющимися значениями. Если совпадений не находится, то выполняется блок Else .

Оператор является неделимым элементом программы, который дает возможность выполнять определенные алгоритмические действия. Отличием оператора, по отношению к другим элементам, является то, что под ним всегда подразумевается какое-то действие. В языке Паскаль операторы состоят из служебных слов. Операторы, используемые в программе, отделяются между собой и от других элементов программы символом (;). Все операторы языка Паскаль можно условно разбить на две группы :

  1. простые;
  2. структурированные.

Простые операторы - это операторы, не содержащие в себе других операторов. К ним относятся:

  • оператор присвоения (:=);
  • оператор процедуры;
  • оператор безусловного перехода (GOTO).

Структурированные операторы - это операторы, которые содержат в себе другие операторы. К ним относятся:

  • составной оператор;
  • операторы условий (IF, CASE);
  • операторы цикла (FOR, WHILE, REPEAT);
  • оператор присоединения (WITH).

Простые операторы

Оператор процедуры

Оператор процедуры служит для вызова процедуры.

Формат: [имя_процедуры] (список параметров вызова);

Оператор процедуры состоит из идентификатора процедуры, непосредственно за которым в скобках расположен список параметров вызова. В Паскале имеются процедуры без параметров. В этом случае, при вызове, список параметров отсутствует. Выполнение оператора процедуры приводит к активизации действий описанных в ее теле. В языке Паскаль имеется два вида процедур:

  • Стандартные, которые описаны в самом языке и являются принадлежностью языка;
  • Процедуры пользователя, которые создает пользователь.

Для вызова стандартных процедур необходимо подключение в разделе USES имени модуля (библиотеки), где описана данная процедура. Ряд процедур, находящихся в модуле SYSTEM всегда подключается к программе автоматически и их подключение в разделе USES не нужно. Стандартные процедуры языка Паскаль - READ, WRITE, REWRITE, CLOSE, RESET.

READ ([файловая_переменная], [список_ввода])

READ (x,y)

Процедуры пользователя (нестандартные) должны быть созданы перед их использованием в программе и находятся либо в разделе описания самой программы, либо в отдельные программные единицы модуля. Если процедура находится в модуле, то имя этого модуля необходимо упомянуть в приложении USES.

Оператор безусловного перехода GOTO

Формат: GOTO [метка];

GOTO - зарезервированное слово в языке Паскаль. [метка] - это произвольный идентификатор, который позволяет пометить некий оператор программы и в дальнейшем сослаться на него. В языке Паскаль допускается в качестве меток использовать целое число без знаков. Метка располагается перед помеченным оператором и отделяется от него (:). Один оператор можно помечать несколькими метками. Они так же отделяются друг от друга (:). Перед тем как использовать метку в разделе оператора ее необходимо описать в разделе LABEL (раздел описания).

Действие GOTO передает управление соответствующему помеченному оператору. При использовании меток нужно руководствоваться следующими правилами:

  • метка должна быть описана в разделе описаний и все метки должны быть использованы;
  • если в качестве меток используются целые числа, их не объявляют.

Противоречит принципам технологии структурного программирования. Современные языки программирования не имеют в своем составе такого оператора, и в его использовании нет необходимости. Кроме того в современных компьютерах используется так называемый конвейерный способ. Если в программе встречается оператор безусловного перехода, то такой оператор ломает весь конвейер, заставляя создавать его заново, что существенно замедляет вычислительный процесс.

Структурированные операторы

Операторы условия IF

Условный оператор используется в программе для реализации алгоритмической структуры - ветвления. В данной структуре вычислительный процесс может продолжаться по одному из возможных направлений. Выбор направления обычно осуществляется проверкой какого-либо условия. Существует два вида структуры ветвления: структура вилка и обход.

В языке Паскаль условный оператор IF это средство организации ветвящегося вычислительного процесса.

Формат: IF [логическое_выражение] Then [оператор_1]; Else [оператор_2];

IF, Then, Else - служебные слова. [оператор_1], [оператор_2] - обыкновенные операции языка Паскаль. Часть Else является необязательной (может отсутствовать).

Оператор IF работает следующим образом: вначале проверяется результат логического выражения. Если результат Истина(TRUE), то выполняется [оператор_1], следующий за служебным словом Then, а [оператор_2] пропускается. Если результат Ложь(FALSE), то [оператор_1] пропускается, а [оператор_2] исполняется.

Если часть Else отсутствует, то оператор IF имеет не полную форму:

IF [логическое_выражение] Then [оператор];

В этом случае, если результат Истина(TRUE), то выполняется [оператор], если Ложь(FALSE), то управление передается оператору, следующему за оператором IF.

имеются 2 числа A и B. Найти максимальное число.

Составной оператор

Составной оператор - это последовательность произвольных операций в программе, заключенная в так называемые операторные скобки (Begin-End).

Формат: Begin [операторы]; End;

Составные операторы позволяют представлять группу операторов, как один оператор.

Оператор выбора CASE

Предназначен для реализации множественных ветвлений, поскольку оператор IF может реализовать всего два направления вычислительного процесса, использовать его для реализации множественных ветвлений не всегда удобно. Множественное ветвление реализуется оператором CASE.

Формат: CASE [ключ_выбора] OF

[константа_выбора_1]:[оператор_1];

[константа_выбора_2]:[оператор_2];

[константа_выбора_N]:[оператор_N];

ELSE [оператор];

CASE, OF, ELSE, END - служебные слова. [ключ_выбора] - это параметр одного из порядковых типов. [константы_выбора] - константы того же типа, что и ключ выбора, реализующие выбор. [оператор_1(N)] - обыкновенный оператор. ELSE может отсутствовать.

Оператор выбора работает следующим образом: до работы оператора определяется значение параметра ключ выбора. Этот параметр может быть либо выражен как переменная в программе, либо другим путем. Затем параметр ключ выбора последовательно сравниваем с константой выбора. При совпадении значения ключа выбора с одной из констант выбора, выполняется оператор, следующий за этой константой, а все прочие операторы игнорируются. В случае не совпадения ключа выбора ни с одним из констант, выполняется оператор, следующий за Else. Часто Else является не обязательной и в случае несовпадения ключа выбора ни с одной из констант выбора и при отсутствии Else, управление передается оператору, следующему за оператором CASE.

В операторе CASE нет явной проверки условия, характерного для оператора IF. В тоже время в неявном виде операция сравнения выполняется. CASE вносит диссонанс в программу на языке Паскаль, поскольку данные оператор завершается служебным словом End, которому нет парного Begin.

Составить алгоритм и программу задачи, моделирующей работу светофора. При вводе символа первой буквы цветов светофора, программа должна выводить сообщение о соответствующем цвете и действиях.

Программа работает следующим образом: с клавиатуры процедурой Read вводится символ буквы цвета светофора. Если введена буква ‘з’ соответствующая зеленому цвету, то в операторе CASE введено значение в списке выбора найдет константу выбора ‘з’ и будет выведено сообщение “Зеленый цвет, движение разрешено”. При вводе символа букв ‘к’ и ‘ж’ буду выведены аналогичные сообщения. При вводе любого другого символа будет выведено сообщение “Светофор не работает”, поскольку в этом случае работает часть Else, оператора CASE.

Операторы цикла

Циклической алгоритмической структурой считается такая структура, в которой некоторые действия выполняются несколько раз. В программировании имеются два вида циклических структур: цикл с параметром и итерационный цикл.

В цикле с параметром всегда имеются так называемые параметры цикла: X, X n , X k , ∆X. Иногда цикл с параметром называют регулярным циклом. Характерной чертой является то, что число циклов и повторений можно определить до выполнения цикла.

В итерационном цикле невозможно определить число циклов до его выполнения. Он выполняется до тех пор, пока выполняется условие продолжение цикла.

В языке Паскаль имеются три оператора, реализующих циклические вычислительные структуры:

  • счетный оператор FOR. Он предназначен для реализации цикла с параметром и не может быть использован для реализации итерационного цикла;
  • оператор цикла с предусловием WHILE;
  • оператор цикла с постусловием REPEAT.

Последние два ориентированы на реализацию итерационного цикла, однако их можно использовать и для реализации цикла с параметром.

Оператор FOR

Формат: FOR [параметр_цикла] := [н_з_п_ц] To [к_з_п_ц] Do [оператор];

FOR, To, Do - служебные слова. [параметр_цикла] - параметр цикла. [н_з_п_ц] - начальное значение параметра цикла. [к_з_п_ц] - конечное значение параметра цикла. [оператор] - произвольный оператор.

Параметр цикла должен быть переменой порядкового типа. Начальное и конечное значения параметра цикла должны быть того же типа, что и параметр цикла.

Работу оператора рассмотрим на его алгоритме:

На первом шаге значение параметра цикла принимает [н_з_п_ц], затем осуществляется проверка параметр цикла меньше или равен [к_з_п_ц]. Это условие является условием продолжения цикла. Если выполнено, то цикл продолжает свою работу и выполняется [оператор], после чего параметр цикла увеличивается (уменьшается) на единицу. Затем с новым значением параметр цикла, проверяется условие продолжения цикла. Если оно выполняется, то действия повторяются. Если условие не выполняется, то цикл прекращает свою работу.

Оператор For существенно отличается от аналогичных операторов в других языках программирования. Отличия следующие:

  • телом оператора For. Оператор может не выполниться ни разу, поскольку проверка условия продолжения цикла выполняется до тела цикла;
  • шаг изменения параметра цикла постоянный и равен 1;
  • тело цикла в операторе For представлено одним оператором. В том случае, если действие тела цикла требует более одного простого оператора, то эти операторы необходимо превратить в один составной оператор посредством операторных скобок (BEGIN-END);
  • Параметр цикла может быть только переменой порядкового типа.

Пример использования оператора FOR: составить таблицу перевода рублей в доллары.

Оператор WHILE (оператор цикла с предусловием)

Формат: WHILE [условие] Do [оператор];

WHILE, Do - служебные слова. [условие] - выражение логического типа. [оператор] - обыкновенный оператор.

;

Оператор While работает следующим образом: вначале работы проверяется результат логического условия. Если результат истина, то выполняется оператор, после которого осуществляется возврат на проверку условия с новым значением параметров в логическом выражении условия. Если результат ложь, то осуществляется завершение цикла.

При работе с While надо обратить внимание на его свойства:

  • условия, использованные в While, являются условием продолжения цикла;
  • в теле цикла всегда происходит изменение значения параметра входящего в выражение условия;
  • цикл While может, не выполнится ни разу, поскольку проверка условия в продолжение цикла выполняется до тела цикла.

Оператор REPEAT (оператор цикла с постусловием)

Формат: REPEAT [тело_цикла]; UNTIL [условие];

Оператор REPEAT работает следующим образом: сначала выполняются операторы тела цикла, после чего результат проверяется логического условия. Если результат ложь, то осуществляется возврат к выполнению операторов очередного тела цикла. Если результат истина, то оператор завершает работу.

Оператор Repeat имеет следующие особенности:

  • в Repeat проверяется условие завершения цикла и если условие выполняется, то цикл прекращает работу;
  • тело цикла всегда выполняется хотя бы один раз;
  • параметр для проверки условия изменяется в теле цикла;
  • операторы тела цикла не надо заключать в операторские скобки (BEGIN-END), при этом роль операторных скобок выполняют Repeat и Until.

Вычислить y=sin(x), где xn=10, xk=100, шаг равен 10.

Структурированными операторами называются такие операторы, которые включают в себя другие операторы и управляют последовательностью их выполнения. К ним относятся:

  • составной оператор;
  • условный оператор If ;
  • условный оператор Case ;
  • оператор цикла Repeat ;
  • оператор цикла While ;
  • оператор цикла For .

Составной оператор

Часто необходимо, чтобы по отношению к какому-то действию несколько операторов воспринимались в программе как один оператор. Такой оператор может быть получен, если необходимую последовательность операторов объединить операторными скобками. Служебные слова Begin и End называются операторными скобками.

Формат оператора:

оператор №1;

оператор №2;

оператор №3;

оператор № n-1;

оператор № n; End;

Слово Begin играет роль открывающей скобки, слово End – роль закрывающей скобки.

Составной оператор воспринимается как единый оператор. Его можно вставлять в любое место программы, где допускается только один оператор.

Операторы, входящие в составной оператор, как и всякие операторы, разделяются точкой с запятой, но перед end этот разделитель можно не ставить. После end точка с запятой необходима как разделитель между составным оператором и следующим оператором.

В последующих разделах смысл и назначение составного оператора будут проиллюстрированы на многочисленных примерах.

Условный оператор IF

Оператор If реализует алгоритмическую конструкцию «Решение» и позволяет изменить порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Формат оператора может быть записан в двух формах: полной и неполной форме.

Формат оператора в полной форме:

If<условие> Then<оператор 1> Else<оператор 2>

Формат оператора в неполной форме:

If<условие>Then<оператор 1>

If (если), Then (тогда), Else (иначе) – зарезервированные слова.

Блок-схемы оператора if представлены ниже:

Условный оператор работает следующим образом. Сначала вычисляется условное выражение < условие >. Если результат есть True (истина), то выполняется < оператор 1 > (после слова Then), а < оператор 2 > пропускается. Если результат есть False (ложь), то < оператор 1 > пропускается, а выполняется < оператор 2 > (после слова Else). Перед Else никогда не ставится точка с запятой, поскольку это еще не конец оператора If .

Часть Else <оператор 2> условного оператора If может быть опущена. Если < условие > оператора If принимает значение True , то выполняется <оператор 1> , в противном случае этот оператор пропускается. В этом случае формат условного оператора имеет неполную форму:

Сравним две конструкции:

If <условие>Then<оператор 1>;

If <условие>Then<оператор 1>; <оператор 2>;

В первой строке <оператор 1> или выполняется, или не выполняется в зависимости от выполнения <условия> . Во второй строке <оператор 2> выполняется всегда, поскольку после <оператора 1> стоит разделитель «;» и все что стоит поле разделителя считается другим оператором. Поэтому в соответствии с форматом оператора If после зарезервированных слов Then и Else может стоять всего лишь один оператор.

Пример:

If a > 0 Then b:=1;

If a > 0 Then b:=1; a:=b; {оператор a:=b; выполняется всегда}

Если же необходимо выполнить после Then и Else не один, а несколько операторов, то следует поставить операторные скобки, т.е. использовать составной оператор.

В этом случае оператор If будет иметь следующий вид:

If<условие>Then

оператор 11;

оператор 1n;

оператор 21;

оператор 2n;

Пример .

If a>0 Then begin b:=1; a:=b; end;

ЗАДАЧА 1. Вычислить значение функции, заданной неравенствами

y=x+1 при x<0; y=2∙x при x>0. program a5; var x,y:real; begin write(‘Введите значение x: ’); readln(x); if x writeln(‘Значение у равно: ’, y:6:2) end.

Результаты работы программы:

Введите значения x:0.5

Значение у равно: 1.00

ЗАДАЧА 2. Написать программу решения квадратного уравнения. Если дискриминант меньше нуля, то выводить соответствующее сообщение.

Program a6; var a,b,c:real; {коэффициенты уравнения} x1,x2:real; {корни уравнения} d:real; {дискриминант} begin Writeln(‘Решение квадратного уравнения’:50); Write(‘Введите значения коэффициентов a,b,c:’); Readln(a,b,c); {ввод коэффициентов} d:=b*b-4*a*c; if (d<0) then Writeln(‘Уравнение не имеет корней.’) else begin {операторные скобки} x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); WriteLn(‘Корни уравнения: ’, x1:8:2,x2:8:2); end; end.

Результаты работы программы:

Решение квадратного уравнения

Введите значения коэффициентов a,b,c:3 1 6

Уравнение не имеет корней.

В операторе If может быть использован не только составной оператор, но и любой структурированный оператор. В качестве такого оператора может использоваться и рассмотренный нами условный оператор If . В этом случае говорят о вложенных операторах If .

Пример.

if условие then
begin Операторные скобки
оператор; вложенный
оператор IF ,
неполная форма
if условие then опеатор
else оператор;
end
else
begin Операторные скобки
оператор; вложенный
оператор IF ,
неполная форма
if условие
then оператор;
end;

При работе с вложенными операторами if следует учитывать следующие правила:

  • перед зарезервированным словом else символ «;» никогда не ставится;
  • зарезервированное слово else всегда связывается с ближайшим перед ним стоящим зарезервированным словом then .

ЗАДАЧА 3. Усовершенствуем программу решения квадратного уравнения (ЗАДАЧА 2). При значении коэффициента a=0 уравнение вырождается. В программе этот факт не учитывался, что вызовет фатальную ошибку при исполнении программы (деление на нуль). Для того чтобы исключить деление на нуль, выполним проверку значения коэффициента а после его ввода оператором Readln(a,b,c) .

Поскольку переменная a объявлена в программе как переменная вещественного типа, ее численное значение в машине представлено не точно, с некоторой погрешностью. Поэтому запись типа

Возможны несколько вариантов проведения корректного сравнения значений вещественной переменной с нулем:

ЗАДАЧА 4. Усовершенствованная программа решения квадратного уравнения.

Program a7;Var a,b,c:real; {коэффициенты уравнения} x1,x2:real; {корни уравнения} d:real; {дискриминант} begin Writeln(‘Решение квадратного уравнения’:50); Write(‘Введите значения коэффициентов a,b,c: ’); Readln(a,b,c); {ввод коэффициентов} if round(a)<>0 then begin d:=b*b-4*a*c; if d<0 then Writeln(‘Уравнение не имеет корней.’) else begin{операторные скобки} x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); WriteLN(‘Корни уравнения: ’, x1:8:2,x2:8:2); end; end else Writeln(‘Деление на нуль.’); end.

Результаты работы программы:

Решение квадратного уравнения Введите значения коэффициентов a,b,c:0 1 6 Деление на нуль.

Условный оператор выбора Case

Оператор выбора является обобщением оператора If и используется в тех случаях, когда необходимо выполнить только один оператор из совокупности операторов в зависимости от значения ключа выбора.

В качестве ключа выбора используется выражение, которое располагается между зарезервированными словами Case и of. Выражение может быть целого, логического и символьного типов. Выражение не может иметь тип Real, String.

Формат оператора:

Case of "<ключ выбора>" константа1:оператор 1; константа2:оператор 2; константа3:оператор 3; ... константаN-1:оператор N-1; константаN:оператор Nn; Else оператор End;

Здесь Сase (в случае), of (из), Else (иначе), End (конец) являются зарезервированными словами.

Ключ выбора – это выражение любого типа кроме Real и String .

Константа1 – константа того же типа, что и выражение.

Оператор1 – произвольный оператор.

Оператор выбора действует следующим образом. Вначале вычисляется выражение <ключ выбора> , а затем в последовательности операторов отыскивается такой, которому предшествует константа, равная вычисленному значению <ключ выбора> . Найденный оператор выполняется, после чего оператор выбора завершает свою работу (управление передается на end). Если в списке констант не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается оператору, стоящему за словом Else .

Часть Else <оператора> можно опустить, тогда при отсутствии в списке констант нужной константы ничего не происходит, и оператор выбора просто завершает свою работу.

ЗАДАЧА 5. Написать программу простого калькулятора .

Program a8; var x,y:real; z:real; {результат} op:char; {ключ выбора} begin Write(‘Введите операнды x,y: ’); Readln(x,y); Write(‘Введите операцию(+,-,*,/): ’); Readln(op); case op of ‘+’:z:=x+y; ‘-‘:z:=x-y; ‘*‘:z:=x*y; ‘/‘:if y0 then z:=x/y Elsewriteln(‘Деление на нуль’); Else writeln(‘Действие не предусмотрено!’); end; {op} {так можно пометить, «чей» end} writeln(‘Результат равен=’,z:8:2); end.

Результаты работы программы:

Введите операнды x,y:4 2

Введите операцию (+,-,*,/):*

Результат равен= 8.00

В программе ключом выбора является переменная символьного типа. В зависимости от введенного значения символов (+, -, *, /) выполняется одно из арифметических действий: сложение, вычитание, умножение или деление. Если в качестве делителя будет введен нуль, то деление невозможно и выдается сообщение «Деление на нуль». Если будет введен какой-либо другой символ, то результатом будет сообщение «Действие не предусмотрено!». Если введены допустимые операции, то выдается результат.

ЗАДАЧА 6. Написать программу, которая запрашивает у пользователя номер дня недели, затем выводит название дня недели или сообщение об ошибке, если введены неверные данные.

Program a9; Var n: integer; {номер дня недели} Begin write(‘Введите номер дня недели:’); readln(n); case n of 1: writeln(‘Понедельник’); 2: writeln(‘Вторник’); 3: writeln(‘Среда’); 4: writeln(‘Четверг’); 5: writeln(‘Пятница’); 6: writeln(‘Суббота’); 7: writeln(‘Воскресенье’); else write(‘вы ошиблись!’) end; {n} end.

Результаты работы программы:

Введите номер дня недели:1

Понедельник

Ни одна константа не должна совпадать с другой. Если для нескольких констант необходимо выполнить один и тот же оператор, то их можно перечислить через запятую, например

case n of 1,3,5,7,9: writeln(‘Это нечетные цифры’); 2,4,6,8,10: writeln(‘Это четные цифры’); end;