Информатика / лекции
.pdf3. Основные сведения об языке Pascal |
61 |
Program Max3;
Var A,B,C : integer; begin
writeLn('Введите 3 числа (A,B,C)'); readln(A,B,C);
if (A>B) and (A>C) then A:=sqr(A)
else
if B>C then B:=sqr(B)
else C:=sqr(C);
writeLn('A=',A,' B=',B, ' C=', C); end.
Рассмотренный пример показывает, как именно можно пользоваться разветвляющимися процессами. Блок-схема программы представлена на Рисунок 3.2.
Дословно «if … then … else …» переводится как «если … тогда … иначе…».
Начало
Ввод A, B, C
(A>B) and (A>C)
A:=A2 |
B>C |
B:=B2 |
C:=C2 |
Вsвод A, B, C
Конец
Рисунок 3.2 Возведение в квадрат наибольшего из трех неравных чисел
62 |
3.7 Программирование развилок |
Развилка есть процесс принятия решения относительно выбора дальнейшего движения в зависимости от некоторого условия. Наиболее часто используемыми являются развилки с вариантом решения «да» или «нет». Алгоритмические управляющие структуры развилкой с двумя вариантами дальнейшего движения были рассмотрены ранее. Однако существует так называемая, развилка множественного выбора. Т.е. когда мы можем двигаться далее по алгоритму не в двух возможных направлениях, а в гораздо большем их количестве.
Для этого используют развилку с множеством путей. Записывается она следующим образом:
case значение of
первый вариант: управляющий оператор для 1-го варианта; второй вариант: управляющий оператор для 2-го варианта; третий вариант: управляющий оператор для 3-го варианта;
…
else: управляющий оператор для ветви «иначе»; end;
Опять подробности работы этой управляющей структуры удобнее рассматривать на примере. Блок-схема алгоритма на Рисунок 3.3.
ПРИМЕР
По введенному номеру дня, определить к какой части недели он относится.
Program CaseWeek;
Var H :integer;
S :string[20]; begin
writeLn('Введите номер дня недели:'); readln(H);
case H of
1..3: S:='начало недели';
4:S:='четверг';
5:S:='пятница'; 6,7: S:='выходные';
else
S:='нет такого дня';
end;
writeLn('Дню ', H, ' соответствует ', S); end.
|
3. Основные сведения об языке Pascal |
63 |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 3.3 Пример работы Case
3.8 Программирование циклов
Циклические алгоритмические управляющие структуры в Pascal представлены все три рассмотренные ранее. Цикл с предусловием, или цикл «пока» имеет следующую реализацию
while условие do
тело цикла;
«while … do» можно перевести как «пока истинно … выполняй».
Цикл с постусловием записывается как repeat
тело цикла;
until условие выхода;
«repeat … until» можно перевести как «повторяй … до тех пор пока не».
64 |
3.8 Программирование циклов |
Цикл с параметром и с шагом «+1» записывается следующим образом: for k:=n to m do
тело цикла;
Дословный перевод «for k:=n to m do» таков: «для k присвоить n до m выполнять». Если цикл идет в обратную сторону, т.е. шаг равен «–1», то он принимает вид:
for k:=n downTo m do
тело цикла;
Для понимания рассмотрим работу всех трех циклов на примере одной задачи.
ПРИМЕР
Протабулировать функцию y=x2 на промежутке [-2, 1].
Реализация программы используя цикл «while» (блок-схема на Рисунок 3.4):
Рисунок 3.4 Табулирование |
функции циклом while |
Рисунок 3.5 Табулирование функции циклом repeat ... until
3. Основные сведения об языке Pascal |
65 |
Program TabFWhile; Var X,Y : real; begin
X := -2; while X<=1 do
begin
Y := sqr(X); writeLn('f(',X:5:1, ')=',Y:8:3); X:=X+0.5;
end;
end.
Реализация программы используя цикл «repeat … until» (блок-схема на Рисунок 3.5):
Program TabFRepeat; Var X,Y : real; begin
X := -2; repeat
Y := sqr(X); writeLn('f(',X:5:1,
')=',Y:8:3);
X:=X+0.5; until X>1;
end.
Реализация программы c помощью цикла «for» (блок-схема на Рисунок 3.6):
Program TabFFor; Var a,b,x,y : real;
i,N: integer; begin
a:=-2; b:=1;
N := trunc(2*(b-a)); for i:=0 to N do
begin
Y := sqr(a+i*0.5); writeLn('f(', (a+i*0.5):5:1, ')=',Y:8:3);
end;
end.
Рисунок 3.6 Табулирование функции циклом for
В результате работы всех трех программ на экране появится таблица значений функции:
66 |
3.9 Составной оператор |
|
i := k |
|
i := k , m |
|
i ≤ m |
|
Тело цикла |
|
<=> |
|
Тело цикла |
|
i := i + 1 |
|
Рисунок 3.7 Эквивалентное преобразование цикла for в цикл while |
f( -2.0)= |
4.000 |
|
f( -1.5)= |
2.250 |
|
f( -1.0)= |
1.000 |
|
f( -0.5)= |
0.250 |
|
f( |
0.0)= |
0.000 |
f( |
0.5)= |
0.250 |
f( |
1.0)= |
1.000 |
Как отмечалось ранее, цикл for в Pascal является частным случаем цикла while. Эквивалентность этих двух алгоритмов изображена на Рисунок
3.7.
3.9 Составной оператор
Итак, выше мы описали основные алгоритмические конструкции языка Pascal. Если посмотреть на изображение блок-схем этих конструкций, то можно выделить в их составе блок действия (прямоугольник). Все достаточно просто и понятно, если действие выполняется одним оператором или процедурой, однако, если необходимо выполнить несколько подряд идущих строчек кода, то для этого их нужно объединить. Нужно сделать так, чтобы все эти строчки для компилятора представляли собой один сложный оператор. Для этого данную последовательность заключают в так называемые, операторные скобки. А все то, что находится внутри этих скобок принято называть составным оператором.
3. Основные сведения об языке Pascal |
67 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 3.9 Сборка составного оператора |
|||
L1 |
|
|
|
Действие1 |
|
|
|
L2 |
|
|
|
|
|
La |
|
Действие5 |
|
ДействиеD |
|
L3 |
ДействиеA |
||
|
|||
Действие6 |
|
Lb |
|
Действие2 |
ДействиеB |
ДействиеE |
|
|
|
||
Действие7 |
|
|
|
Действие3 |
ДействиеC |
ДействиеF |
|
|
|||
|
|
||
Действие4 |
|
|
|
|
б) |
|
|
Действие8 |
|
|
|
а) |
|
|
|
Рисунок 3.8 Примеры алгоритмов, где используется составной оператор |
68 |
3.9 Составной оператор |
В качестве операторных скобок языка Pascal выступают begin и end (begin – открывающая скобка, end – закрывающая). Ранее при демонстрации решения задач на циклы мы уже пользовались операторными скобками для выделения границ тел циклов while и for.
Иллюстрация правила расстановки скобок показана на Рисунок 3.9. Вообще, скобки begin end нужно ставить при составлении программы по блок-схеме в том месте, где на одной ветви встречается более одного независимого оператора. Некоторые примеры расстановки операторных скобок можно видеть на (Рисунок 3.8). Для случая (Рисунок 3.8) а) текст кода на Pascal имеет примерно такой вид:
while L1 do begin
Действие1; if L2 then begin
while L3 do begin
Действие2; Действие3;
end;
Действие4; end
else begin
Действие5; Действие6; Действие7;
end;
Действие8; end;
А для случая (Рисунок 3.8) б) Pascal-код таков: if La then
begin
ДействиеA;
ДействиеB;
ДействиеC; end
else begin
ДействиеD; if Lb then begin
ДействиеE;
ДействиеF; end;
end;
4. РЕШЕНИЕ ТИПОВЫХ ЗАДАЧ НА РАЗВИЛКИ И ЦИКЛЫ
4.1 Задачи на развилки
При решении задач на развилки используется ветвление алгоритма. Как мы помним, направление ветвления зависит от истинности предиката стоящего в точке развилки. Следует иметь в виду, что множество вариантов ветвления конечно. Составление алгоритма должно полностью охватывать все существующие варианты решения задачи. При этом желательно направления движения по алгоритму, приводящие к одинаковым результатам не дублировать.
Большинство задач на развилки по своей сути являются задачами на правильное составление предиката. Предикат, как мы помним, является выражением, принимающим всего 2 значения TRUE или FALSE. Если у нас несколько предикатов, то мы их комбинируем, используя основы алгебры логики.
Далее рассмотрим наиболее показательные в этом отношении примеры.
ПРИМЕР
Выяснить попадает ли точка с координатами (x, y) в окружность
радиуса R с центром в начале координат.
Задача достаточно проста, если воспользоваться иллюстрацией (Рисунок 4.1 а)). Точка удалена от начала координат на расстояние,
вычисляемое по теореме Пифагора: r1 = x2 + y2 . Если радиус окружности R
, то в зависимости от того больше, меньше или рано r1 радиусу R , мы будем
y |
y |
|
r1 = x2 + y2 |
y = a x2 |
(x, y) |
|
R
r1 |
|
|
|
x |
x |
R |
−R |
R |
−R
Рисунок 4.1 Попадание точки в окружность – а) и попадание точки в заштрихованную область – б)
70 |
4.1 Задачи на развилки |
Начало
Ввод R, x, y
r1:= x2 + y2
r1<R
Точка внутри
окружности
|
r1=R |
Точка лежит |
Точка за |
на окружности |
окружностью |
Конец
Рисунок 4.2 Проверка попадания точки в окружность
иметь три варианта расположения точки: «внутри окружности», «на окружности» или «за окружностью». Всего три варианта, задача решается в два предиката. Использование двух предикатов, как раз, дает три маршрута движения от точки начала алгоритма к его концу (Рисунок 4.2).
Программа на языке Pascal такова: program Radius;
var x,y,R,r1:real; begin
writeLn('введите радиус R'); readLn(R);
writeLn('введите координаты x, y'); readLn(x,y); r1:=sqrt(sqr(x)+sqr(y));
if r1<R then
writeLn('точка внутри окружности') else
if r1=R then
writeLn('точка лежит на окружности') else
writeLn('точка за окружностью');
end.