Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000555.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
19.12 Mб
Скачать

2.2.4. Оператор выбора case

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

CASE селектор OF

список констант_1: оператор_1;

список констант_2: оператор_2;

список констант_N: onepaтop_N;

END

или

CASE селектор OF

список констант_1: оператор_1; список констант_2: оператор_2;

.

.

.

список констант_N: оператор_N

else

оператор_еlsе; END

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

Значение селектора вычисляется, и затем отыскивается в одном из списков констант. После этого выполняется оператор, соответствующий списку. Если значение селектора не найдено в списках, то не выполняется ни один оператор (при первой схеме) * или выполняется оператор еlsе (при второй схеме).

Пример. Программа вводит цифру и печатает ее прописью. Если цифра больше трех, печатается слово «много». Если введена не цифра, то печатается сообщение об этом

program digit_to_word;

var N: integer; begin

Write ('Введите цифру ') read(N);

case N of

0: writeln ('ноль');

1: writeln ('один1):

2: writeln ('два');

3: writeln ('три');

4,5,6,7,8,9: writeln ('много');

end;

end.

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

program letters_and_digits;

var Ch: char;

begin

write('Bвeдите символ '); read(Ch);

case Ch of

'a'..V: writeln ('Введена маленькая буква');

'A'..'Z': writeln ('Введена большая буква');

'0'..'9': writeln (' Введена цифра')

else writeln ('Введен неизвестный символ1);

end;

end.

Запись 'a'..z означает все символы подряд от 'а' до z.

Запись 'A'..'Z' означает все символы подряд от 'А' до 'Z'.

Запись '0'..'9' означает все символы подряд от '0' до '9'.

2.2.5. Оператор цикла for

Цикл позволяет многократно выполнять некоторые действия. Он является ключевым фактором в реализации различных алгоритмов и делает применение ЭВМ обоснованным.

В Паскале имеется три оператора цикла - FOR, WHILE и REPEAT.

Вначале рассмотрим оператор FOR.

Оператор FOR обеспечивает повторение цикла, управляемое параметром цикла.

Оператор цикла FOR позволяет выполнять некоторые действия определенное (фиксированное) число раз.

Общая форма оператора цикла FOR имеет вид

FOR параметр_цикла:= начальное_значение ТО конечное_значение DO

оператор; (* этот оператор выполняется *) (*конечное_значение - начальное_значение + 1 раз *)

или при использовании составного оператора

FOR параметр_цикла:= начальное_значение ТО конечное_значение DO

begin

оператор_1; (* эти операторы выполняются *)

оператор_2; (* конечное_значение - начальное_значение + 1 раз *)

оператор_N; end;

где параметр_цикла — переменная скалярного типа, кроме действительного;

начальное_значение и конечное_значение - выражения того же типа, что и параметр_цикла. Выполняемые в цикле оператор или операторы называются телом цикла.

Выполнение оператора FOR начинается с вычисления значений выражений начальное_значение и конечное_значение. Затем переменной параметр_цикла присваивается начальное_значение и делается проверка, не превышает ли оно конечное_значение. Если не превышает, то выполняется тело цикла. После завершения выполнения параметр_цикла получает следующее по порядку значение и все повторяется, начиная с проверки.

Когда значение параметра_цикла становится равным ко-нечному_значению., тело цикла выполняется последний раз.

Таким образом:

• если начальное_значение > конечное_значение, тело цикла не выполняется ни разу;

  • если начальное_значение = конечное_значение, тело цикла выполняется один раз. При этом параметр_цикла будет равен начальному_значению;

  • если начальное_значение < конечное_значение, тело цикла выполняется ( конечное_значение - начальное_значение + 1) раз. При этом параметр _цикла при каждом выполнении будет получать последовательные значения своего типа (если параметр_цикла целого типа, то будет увеличиваться на единицу).

Пример. Вычислить сумму целых чисел от 1 до 100. program Summa_l_100;

var s,i:integer;

begin

s:=0;

for i:=l to 100 do s:=s+i;

writeln('сумма целых чисел от 1 до 100 равна ',s);

end.

Также следует иметь в виду, что изменение параметра_цикла в теле цикла каким-либо другим способом недопустимо, так как это в зависимости от реализации либо вызовет ошибку при трансляции, либо изменит число повторений цикла.

Например, оператор

For i:=1to 10 do i:=i+l;

либо вызовет ошибку, либо (в Турбо-Паскале) выполнит тело цикла не 10 как можно было ожидать, а 5 раз.

Возможен вариант оператора FOR, когда параметр_цикла принимает последовательно убывающие значения:

FOR параметр_цикла:= начальное_значение DOWNTO конечное_значение DO

оператор; (* этот оператор выполняется *)

(*начальное значение - конечное значение + 1 раз *)

или

FOR параметр_цикла:= начальное_значение DOWNTO

конечное_значение DO

begin

оператор_1; (* эти операторы выполняются *)

оператор_2;(*начальное значение - конечное значение + 1 раз *)

оператор_N; end;

В этом случае:

  • если начальное_значение < конечное_значение, тело цикла не выполняется ни разу;

  • если начальное_значение = конечное_значение., тело цикла выполняется один раз. При этом параметр_цикла будет равен начальному_значению;

  • если начальное_значение > конечное_значение, тело цикла выполняется (начальное значение - конечное значение + 1) раз. При этом параметр_цикла при каждом выполнении будет получать последовательно убывающие значения своего типа (если параметр_цикла целого типа, то будет уменьшаться на единицу).

Пример. Напечатать латинский алфавит в обратном

порядке.

program Z_A; var C:char;

begin

for С := 'Z' downto 'A1 do write (C, ' ‘); end.

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

Пример - Вычислить сумму целых четных чисел от 2 до 100.

program Summa_2 100;

var s л.j: integer,

begin s:=0:

for i.=l to 50 do begin

j:=2*i;

s:=s+j;

end;

writeln('cyммa целых четных чисел от 2 до 100 равна ',s); end.

Пример. Вычислить значения синусов углов от 0 до 90 градусов с шагом 10 градусов.

program SINUS;

var i, angle_grad:integer;

pi, angle_rd:real; begin

pi:=3.14159;

for i:=0 to 9 do begin

angle_grad:=10*i;

angle_rd := angle_grad*pi / 180;

writeln('yгoл= ',angle_grad, ' синус= ',sin(angle_rd));

end;

end.

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

program SINUS _with_IF;

var angle_grad:integer;

pi:real; begin

pi:=3.14159;

for angle_grad:=0 to 90 do

if angle_grad mod 10 = 0 then (* угол кратен 10° *) writeln(yron= ', angle_grad, ' синус= ',

sin(angle_grad*pi/180)); end.

Пример. Вычислить сумму S первых 100 членов ряда

1 + 1/2 + 1/3 + 1/4+... + 1/п.

Program Summa;

var

s: real;

n: integer;

begin

s:=0;

for n:=l to 100 do s—s+l/n;

writeln (Сумма 100 членов ряда равна ',s);

end.

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

Для решения этой задачи можно предложить следующий алгоритм.

  1. Ввести первое число в переменную Мах.

  2. Ввести следующее число в переменную Next.

  3. Если Next > Мах, то Мах := Next.

Пункты 2 и 3 повторять, пока не будут введены все числа.

4. Вывести значение переменной Мах.

Докажем логически правильность этого алгоритма.

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

Повторение пунктов 2 и 3. в сущности, представляет собой цикл, который выполняется, пока не будут введены все числа. Если перед очередным повторением цикла в переменной Мах находилось наибольшее из введенных чисел, то после выполнения пунктов 2 и 3 там снова будет наибольшее из введенных чисел.

Свойство переменной Мах содержать наибольшее из введенных чисел сохраняется после каждого повторения цикла (такие свойства называют инвариантом цикла). Естественно, инвариант цикла сохранится и после завершения цикла, т.е. после ввода всех чисел.

В последнем пункте значение Мах будет выведено. Этот пример показывает, что правильность алгоритма можно доказать, как доказывают математическую теорему.

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

program MAX_NUMBER;

var Max, Next, N, i:integer;

begin

write('Введите количество чисел '); Read(N);

write('Введите первое число '); Read(Max);

for i:=2 to N do

begin

write(' Введите следующее число '): Read(Next);

if Next > Max then

Max := Next; end;

write ('Максимальное число равно ', Max); end.