Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УПП Программирование 2102,2202.doc
Скачиваний:
23
Добавлен:
20.04.2015
Размер:
760.32 Кб
Скачать

PROGRAM P4_1; {возраст}

Var t:integer; p:char;

begin

t:=80; p:='ж';

case t of

0..17: Write('детство');

20..30: Write('молодость');

31..54: Write('зрелость');

else if (p='ж') or (t>=60)

then write('пенсия')

else write('зрелость')

end

end.

CASE выражение OF

константа1: оператор1;

константа2: оператор2;

. . .

ELSE операторN;

END;

Здесь выражение может быть целого или символьного типа. Если его значение равно одной из констант, вы­полняется соответствующий оператор. Если ни одна из констант не подходит, выполняется оператор, следующий пос­ле слова else (если есть). Любая из констант может быть диапазоном (через две точки) и/или множеством констант (через запятую). Любой оператор может быть блоком begin и содержать свои операторы case и if.

Пример 4-1. Пусть требуется по числу прожитых лет Т отнести человека к какой-то возрастной группе. Решение очевидно, но нуждается в одном пояснении. Поскольку женщины и мужчины уходят на пенсию в разное время (55 и 60 лет), кроме возраста нужно учитывать и пол Р.

Пример 4-2. Положим, введен какой-то знак в переменную S и его нужно отнести к соответствующей группе. Следует сказать, что латинские символы в символьной таблице ПК находятся не вместе. Подряд идут буквы с А по Z, затем идут не буквы, затем буквы с а по z. В виду этого пришлось указать два диапазона констант ('A'..'Z', 'a'..'z'). Символы русского алфавита состоят из еще большего числа диапазонов (см. раздел ‘Символьные данные’).

PROGRAM P4_2; {символы}

Var s:char;

begin

write('введите символ '); read(s);

case s of

'A'..'Z','a'..'z': write('латинский');

'А'..'Я','а'..'п','р'..'я','Ё','ё': write('русский');

'0'..'9': write('цифры');

'+','-','/','*': write('знаки операций');

',','.',';': write('знаки препинания');

else write('вспомогательные знаки')

end

end.

 Задание 4.5. Написать программу, в которой вводятся два числа-операнда Х и Y и знак операции Z (+,–,/,*). Вычислить резуль­тат S в зависимости от знака. Предусмотреть реакции на возможный неверный знак операции, а также на ввод Y=0 при попытке выполнить деление ('Деление на ноль не возможно').

5. ОРГАНИЗАЦИЯ ЦИКЛОВ

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

 Итерационные циклы. В случае, если число циклов, необ­ходимых для решения задачи, заранее неизвестно, такие циклы называются итераци­онными. Рассмотрим ряд примеров.

Пример 5-1. Пусть для некоторого множества чисел Х нужно вычислить и отпечатать функцию 2/Х. Ввод и вычисления следует прекратить после обнаружения первого Х, равного нулю (деление на ноль невозможно). Очевидна следующая блок-схема (рис.5-1а). Блоков ввода, вычисления, печати и анализа столько, сколько чисел в последовательности до первого нуля. Чисел может быть очень много и подобный подход, конечно, непри­емлем, не говоря уже о том, что количество их заранее неизвестно. Такие программы строятся по-иному. Обрабатывающая часть прог­раммы записывается только раз, но охватывается петлей возврата (рис.5-1б). Тогда одни и те же операторы будут выполняться много­кратно до тех пор, пока Х0. Для реализации цикла здесь понадобилась метка (назовем ее m).

Задание 5.1. Наберите программу Р5_1. Затем улу­чшите ее: введите необходимые подсказки, отфор­ма­тируйте вывод, сделайте очистку экрана, введите под­счет количества точек Х, для которых был вычислен Y. Выдайте сообщение “Х=0” по завершении программы.

Пример 5-2. Пусть для аргумента Х, находящегося в диапазоне 3÷9, требуется вычислить значение функции Y=(X–6)2, где Х изменя­ется с шагом 2 (рис.5-2а, б). Справа от текста программы сделаны выкладки по проверке решения. В каждой строке вручную вычисляется значение соответствующей переменной. Проверка выполняется сверху-вниз, слева-направо по ходу исполнения программы. Стрелки показывают связи между циклами.

Видим, что заданная последова­тельность изменения Х (3,5,7,...) наблюдает­ся и последнее значение Y вычисляется для Х=9. При следующем приращении Х оно становится равным 11 и пятый цикл не выполняется, поскольку Х>9. Программа завершается.

PROGRAM P5_2;

Про

верка

label k;

var x,y:real;

begin

1

цикл

2

цикл

3

цикл

4

цикл

x:=3;

k: if x>9 then exit;

y:=sqr(x–6);

writeln(x,y);

x:=x+2;

goto k;

end.

x=3

x=3<9

y=9

3, 9

x=3+2=5

5<9

y=1

5, 1

x=7

7<9

y=1

7, 1

x=9

9=9

y=9

9, 9

x=11

11>9

конец


Следует отметить, что нет никакого технически простого способа проверки правильности написанных программ. Для этой цели программисту приходится вручную по тексту программы рассчиты­вать значения переменных и сличать их с желаемыми (известными из условия). Конечно, проверка выполняется не для всей задачи, а только для небольшого числа (например, 3-х) начальных циклов и при этом тщательно анализируется значение условия выхода из цикла (здесь оператор IF).

 Задание 5.2. Вычислите функцию в обратном порядке. Под­считайте среднее арифметическое всех Х и Y (SX и SY).

 Арифметические циклы. Если число повторений известно заранее – такие циклы называются арифметическими.

Пример 5-3. Пусть в условиях предыдущего примера не известно пре­дель­ное значение аргумента, но зато задано количество точек аргумента – 4. Поскольку в данном случае не задано последнее значение Х, признак окончания циклов придется формировать самим. Для этого вводится переменная, которая фиксирует число уже выполненных циклов – счетчик циклов (назовем ее I).

Висходном состоянии (рис.5-3) берем его рав­ным 1. После выполнения очередного цикла счетчик получает приращение на единицу (I=I+1). В начале каждого цикла в операторе IF делается проверка на достижение счетчиком последнего разрешенного значения (у нас 4). Если I<=4 программа продолжает вычисление функции, если нет (I>4) – счет прекра­щается. Рядом с программой приведены выкладки по ее проверке. Как видим, результат проверки совпал с результатом, полученным ранее. По очевидным причинам счетчик цикловI должен быть целочисленного типа.

PROGRAM P5_3;

проверка

label d;

var x,y:real; i:integer;

begin

1

цикл

2

цикл

3

цикл

4

цикл

x:=3; i:=1;

d: if i>4 then exit;

y:=sqr(x–6);

writeln(x,y);

x:=x+2;

i:=i+1;

goto d;

end.

x=3, i=1

i=1<4

y=9

3, 9

x=5

i=2

2<4

y=1

5, 1

x=7

i=3

3<4

y=1

7, 1

x=9

i=4

4=4

y=9

9, 9

x=11

i=5

5>4

конец

Задание 5.3. Напишите программу вычисления функции в обратном порядке. Сделайте число точек не константой (4), а перемен­ной N, вводимой оператором read. При прогоне программы задайте N=100. Поскольку весь результат теперь не умещается на экране, организуйте паузу при выдаче каждых 20-ти строк (понадобится операция mod и readkey).

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

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

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

ТО конечное значение DO оператор

реализует приращение счетчика циклов на единицу в заданных пределах и контроль его значения. Цикл завершается в момент, когда переменная цикла становится больше конечного значения цикла. Например, оператор:

for a = 3 to 7 do writeln(a);

дословно интерпретируется следующим образом: “Оператор WRITELN после слова DO будет повторяться столько раз, сколь­ко нужно, чтобы переменная А, изменяясь с шагом 1 от значения равного 3, достигла 7”. Т.е.: A=3; 4; 5; 6; 7 и цикл будет выполнен 5 раз. Если после слова DO поместить конструкцию begin...end, цикл может содержать неограниченное число операторов, например

for i = 1 to n do begin writeln(i); readln(x) end;

Имеется форма оператора, работающего на убывание (шаг равен –1).

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

DOWNТО конечное значение DO оператор

В качестве параметров оператора цикла разрешены и выражения, например, for c=b+2 to 4*k do ... . Все параметры-переменные в операторе FOR должны быть целого типа.

 Тест. 5.1. Каким будет h после завершения программы. Выберите один из трех ответов: 1). 3, 2). 4, 3). 6.

var i,k,m,h: integer;

begin

h:=0; k:=2; m:=8;

for i:=k*2 to m-1 do h:=h+1;

end.

 Задачи на накопление. В практике очень распространены задачи на накопление, т.е. на нахождение сумм и произведений последователь­ности переменных. Такие задачи могут встречаться как в формулировке итерационных, так и арифметических циклов.

Пример 5-4. Пусть требуется найти сумму N произвольных чисел Х. В программе P5_4 сумма накапливается в переменной S с помощью оператора S=S+X. Начальное значение суммы берется равным нулю (S=0).

З

PROGRAM P5_4;

проверка для n=3

var

x=2,4,3

n,s,i,x:integer;

begin

1

цикл

2

цикл

3

цикл

writeln(n);

s:=0;

for i:=1 to n do begin

readln(x);

s:=s+x;

end;

writeln(s);

end.

n=3

s=0

1<3

x=2

s=2

2<3

4

6

3=3

3

9

4>3

s=9

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

 Числовые ряды. Типичной цикли­ческой задачей на нако­пление является вычис­ление числовых рядов.

Пример 5-5. Пусть требуется найти сумму S для N членов геометрической прогрессии.

A1 A2 A3 A4 N

S= 3 + 6 + 12 + 24 + ... + = АI

1

S1 S2 S3 S4

Здесь каждый следующий член прогрессии Аi равен преды­дущему Ai-1, умноженному на два. Если учесть введенные обозначения, можно записать так называемые рекуррентные формулы:

Si = Si-1+Ai, где Sо=0 Или, как принято S=S+A, S=0

Ai = 2Ai-1 A1=3. в программировании: A=2A, A=3.

Действие оператора FOR отражено блок-схемой на рис. 5-5. Сам оператор FOR помещается в фигуру “прямоугольник в ромбе”, ко­торая имеет два выхода. Выход ДА соответствует случаю, когда переменная цикла меньше или равна своему предельному значению (здесь I<=N) – цикл продолжает выпол­няться. Выход НЕТ – случаю превышения переменной этой границы – цикл завершается. Аналогично строятся программы для циклического произ­ведения, однако исходное значение искомого произведения берется равным единице. Если по аналогии с суммой сделать его равным нулю, то результат всегда будет также нулем, поскольку умножение на ноль дает только ноль.

Задание 5-4. Напишите программу вычисления произведения N эле­ментов числового ряда.

Z1A1 Z2A2 Z3A3 Z4A4

P= –3 · 5 · –7 · 9 · – ... = ПАi.

P1 P2 P3 P4

Здесь справедливы формулы:

Для формирования изменяющегося знака вводим специальную переменную Z и задаем ей первоначальное значение, совпадающее со знаком первого сомножимого (–1). Далее знак будет изменяться на противоположный при каждом умножении на минус 1 (Z=–Z).

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

Пример 5-6. Для N произвольных целых чисел Х вычислить и отпечатать: 1) сумму отри­цательных чисел S, 2) количество положи­тель­ных чисел КР, 3) произведение положительных чисел Р. Все вы­числения производить до появления первого нуля в последовательности. Если ноль не встретился, кроме S, KP и Р, печатать сообщение Нулей нет. Блок-схема алгоритма на рис. 5-6. Проверка в программе сделана для N=5 и Х=3, –2, 1, –3, 2. В результате: S=–5, P=6, KP=3.

PROGRAM P5_6;

label t;

проверка для n=5 (х=3, –2, 1, –3, 2)

var i,n,kp,x,s,p:integer;

begin

1

цикл

2

цикл

3

цикл

4

цикл

5

цикл

readln(n);

kp:=0; s:=0; p:=1;

for i:=1 to n do begin

readln(x);

if x=0 then goto t;

if x<0 then s:=s+x;

if x>0 then begin

kp:=kp+1;

p:=p*x end;

end;

writeln('0 нет');

t: writeln(s,p,kp);

end.

n=5

i=1<5

x=3

kp=1

p=3

2<5

x=–2

s=–2

3<5

x=1

kp=2

p=3

4<5

x=–3

s=–5

5=5

x=2

kp=3

p=6

6>5

0 нет

–5,6,3


 Задание 5.5. Программа имеет один дефект. Произведение положитель­ных элементов может оказаться равным 1, как в случае, если оно действительно таким получилось, так и если положительных чисел не было совсем (ведь исходное значение произведения =1). Исправьте программу.