Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика / лекции

.pdf
Скачиваний:
24
Добавлен:
14.03.2016
Размер:
3.17 Mб
Скачать

3. Основные сведения об языке 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.

Соседние файлы в папке Информатика