- •Var X,y: real;
- •Var X,y: real;
- •Var s:char;
- •Var X,y: real; {другой вариант}
- •Program p5_8;
- •Var y,X,z: integer;
- •Var I,j:integer; X,y,r:real;
- •Var I,j: integer;
- •Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;
- •Var I,j,n,m: integer;
- •X:array [1..10] of integer;
- •Var n,I,j,st,kl,k:integer;
- •Var st: char; sm: string[32]; ss: string;
- •Var n:integer;y:string;
- •Var k,I:integer; X: string;
- •Var X:string[1]; d:string; I:integer;
- •Var X:vr; y:array [1..5] of vr;
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
- •Im:string[4]
- •Im:string;
- •Var d,I,m,rx,ry:integer;
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real;
- •Ответы на тестовые задания, имеющиеся в тексте пособия:
- •& Тесты по курсу
- •1. Элементы языка 3
- •Тираж: 150. Заказ №
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 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, умноженному на два. Если учесть введенные обозначения, можно записать так называемые рекуррентные формулы:
S
i
= 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). Исправьте программу.
Оператор цикла с предусловием имеет вид
WHILE условие DO оператор
Такая конструкция позволяет легко организовывать итерационные циклы (циклы с заранее неизвестным числом повторений). Оператор, входящий в тело цикла выполняется до тех пор, пока истинно условие. Для примера решим задачу – вычислять и печатать Y=2/X до обнаружения первого Х=0 (на ноль делить нельзя). Программа приведена ниже.

=3<9