Разработка программ
.pdfмы с разветвлением.
1Program prim1(input,output);
2Var x,y,z:integer;
3Begin
4Read(x,y);
5If x>y then z:=x+y
6Else z:=x-y;
7Write(z)
8End.
Таблица трассировки
Входные данные 7 4
Строка |
Ход выполнения |
x |
y |
z |
3 |
вход в Prim1 |
? |
? |
? |
4 |
|
7 |
4 |
|
5 |
(x > z)=True |
|
|
11 |
7 |
вывод: 11 |
|
|
|
8 |
Выход из Prim1 |
|
|
|
Результат 11
Замечание. Поскольку от значения логического выражения x>y будет зависеть, какой выполняется оператор – z := x + y или z := x - y, то это выражение и его значение записываются в столбец “ход выполнения”.
В программе переменная z в зависимости от значения выражения x > y может принять только два значения: либо x+y (строка 5), либо x - y (строка 6). Поэтому математическое выражение выдаваемого программой результата как функцию от входных данных можно записать
X Y если X Y
Z
X Y если X Y
Программа 3
1 Program Account3(input, output);
2const
3lowPostage = 5;
4highPostage = 10;
5var number, price, cost: integer;
11
6begin
7read(number, price);
8cost := number * price;
9if cost < 50 then
10cost := cost + lowPostage
11else
12cost := cost + highPostage;
13write(cost);
14end.
Трассировка
|
№ |
|
Ход выполнения |
|
number |
price |
|
cost |
||
|
|
|
|
|
|
|
|
|
|
|
6 |
|
Вход в Account3 |
|
? |
? |
? |
|
|||
7 |
|
|
|
|
3 |
6 |
|
|
|
|
8 |
|
|
|
|
|
|
18 |
|
||
9 |
cost < 50 TRUE |
|
|
|
|
|
|
|||
10 |
|
|
|
|
|
|
23 |
|
||
13 |
|
Печать cost (23) |
|
|
|
|
|
|
||
14 |
|
Выход из Account3 |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
№ |
|
|
Ход выполнения |
number |
price |
|
cost |
|
|
|
|
|
|
|
|
|
|
|
||
6 |
|
Вход в Account3 |
? |
? |
|
? |
|
|||
|
7 |
|
|
10 |
6 |
|
|
|
||
|
8 |
|
|
|
|
|
|
60 |
|
|
|
9 |
cost < 50 FALSE |
|
|
|
|
|
|
||
|
12 |
|
|
|
|
|
|
70 |
|
|
|
13 |
|
Печать cost (70) |
|
|
|
|
|
|
|
|
14 |
|
Выход изAccount3 |
|
|
|
|
|
|
|
12 |
|
|
|
|
|
|
|
|
|
Построение программы с разветвлением
I Пример построения программы с разветвлением: спецификация таблица разработки {таблица трассировки}.
Задача: Даны целые числа x,y,z,f. Если x<=y<=z<=f, то каждое число заменить наибольшим из них, в противном случае числа оставить без изменения.
Спецификация
1.Даны целые числа x,y,z,f. Составить программу на Паскале, которая заменяет числа x,y,z на число f, если выполняется условие x<=y<=z<=f и оставляет числа без изменения, если это условие не выполняется.
2.Входные данные: четыре целых числа 1 2 3 4.
3.Выходные данные: преобразованные согласно условию задачи четыре целых числа, например, при входных данных 1 2 3 4 результат 4 4 4 4.
Таблица разработки |
|
Шаги разработки |
Примечания |
Work2 |
|
|
|
begin |
|
ввод входных данных |
|
преобразование чисел |
|
вывод результата |
|
end |
|
ввод входных данных |
переменные |
|
x,y,z,f:integer |
read (x,y,z,f) |
|
преобразование чисел |
|
|
|
если выполняется условие x<=y<=z<=f, то |
|
заменить числа x,y,z на число f |
|
если выполняется условие x<=y<=z<=f, то |
|
13 |
|
заменить числа x,y,z на число f
if x<=y then if y<=z then if z<=f then begin
x:=f; y:=f; z:=f; end;
вывод результата
write (x,y,z,f)
Work2
begin
read (x,y,z,f); if x<=y then if y<=z then if z<=f then begin
x:=f; y:=f; z:=f; end;
write (x,y,z,f) end.
Текст программы
1Program work2;
2var x,y,z,f : integer;
3begin
4read (x,y,z,f);
5if x<=y then
6if y<=z then
7if z<=f then
8begin
9x:=f; y:=f; z:=f;
10end;
11write (x,y,z,f)
14
12 |
|
end. |
|
|
|
|
|
|
|
|
Таблица трассировки |
|
|
||
Входные данные 1 2 3 4 |
|
|
|
|
|||
Строка |
|
Ход выполнения |
x |
y |
z |
f |
|
3 |
|
|
вход в work2 |
? |
? |
? |
? |
4 |
|
|
|
1 |
2 |
3 |
4 |
5 |
|
|
(x<=y) = True |
|
|
|
|
6 |
|
|
(y<=z) = True |
|
|
|
|
7 |
|
|
(z<=f) =True |
|
|
|
|
8 |
|
|
|
|
|
|
|
9 |
|
|
|
4 |
4 |
4 |
|
10 |
|
|
|
|
|
|
|
11 |
|
|
Вывод : 4 4 4 4 |
|
|
|
|
12 |
|
|
Выход из work2 |
|
|
|
|
Результат: 4 4 4 4
Замечание. Последовательность операторов x:=f; y:=f; z:=f объединена в составной оператор begin x:=f; y:=f; z:=f end. Если это не сделать, то при любых значениях входных данных переменным y и z присваивалось бы значение переменной f.
Простейшие циклы
I Оператор цикла с предусловием while.
IIПример трассировки программы с циклом.
I. Цикл (повторение) всегда характеризуется двумя аспектами: во-первых - процессом,
который должен повторяться, во-вторых - условием, при котором повторение прекращается.
Общий вид оператора цикла с предусловием while : while U do S,
(пока U (=True) выпол-
нять S)
где while (пока), do (выполнять) - служебные слова, U -
Нет (FALSE) |
U |
Да (TRUE) |
S |
15
логическое выражение, управляющее циклом, S - оператор (тело цикла).
Выполнение:
1.вычисляется значение логического выражения U
2.если U= False, цикл завершается, т.е. оператор S не выполняется, а выполняется оператор, следующий за оператором цикла
3.если U = True, то происходит однократное выполнение S и возврат к пункту 1).
Схема алгоритма с циклом представлена на рис. 3.
Программа 4
1 Program Account4(input, output);
2 const lowpostage = 5;
3highpostage = 10;
4var items, totalcost, number, price: integer;
5begin
6read(items);
7totalcost := 0;
8while items > 0 do
9begin
10items := items – 1;
11read(number, price);
12totalcost := totalcost + number * price
13end;
14if totalcost < 100 then
15totalcost := totalcost + lowpostage
16else
17totalcost := totalcost + highpostage;
18write(totalcost)
19end.
16
Трассировка
№ |
Ход выполнения |
items |
number |
price |
totalcost |
||
|
|
|
|
|
|
|
|
5 |
Вход в Account4 |
|
? |
? |
? |
? |
|
6 |
|
|
|
3 |
|
|
|
7 |
|
|
|
|
|
|
0 |
8 |
items > 0 TRUE |
|
|
|
|
|
|
10 |
|
|
|
2 |
|
|
|
11 |
|
|
|
|
2 |
3 |
|
12 |
|
|
|
|
|
|
6 |
8 |
items > 0 TRUE |
|
|
|
|
|
|
10 |
|
|
|
1 |
|
|
|
11 |
|
|
|
|
3 |
4 |
|
12 |
|
|
|
|
|
|
18 |
8 |
items > 0 TRUE |
|
|
|
|
|
|
10 |
|
|
|
0 |
|
|
|
11 |
|
|
|
|
5 |
6 |
|
12 |
|
|
|
|
|
|
48 |
8 |
items > 0 FALSE |
|
|
|
|
||
14 |
totalcost |
< |
100 |
|
|
|
|
|
TRUE |
|
|
|
|
|
|
15 |
|
|
|
|
|
|
53 |
18 |
Печать totalcost (53) |
|
|
|
|
||
19 |
Выход из Account4 |
|
|
|
|
II.Пример трассировки программы с циклом while
1Program prim2 (input,output);
2var n,x,i:integer;
3rez:real;
4begin
5read (n,x);
6i:=1;
7rez:=0;
8while i<n do
17
9begin
10rez:=rez+ x*x;
11i:=i+1;
12end;
13write (rez)
14end.
Таблица трассировки. Входные данные 3 2
Строка |
Ход выполнения |
n |
x |
i |
rez |
4 |
вход в Prim2 |
? |
? |
? |
? |
5 |
|
3 |
2 |
|
|
6 |
|
|
|
1 |
|
7 |
|
|
|
|
0 |
8 |
(i<n)=True |
|
|
|
|
10 |
|
|
|
|
4 |
11 |
|
|
|
2 |
|
8 |
(i<n)=True |
|
|
|
|
10 |
|
|
|
|
8 |
11 |
|
|
|
3 |
|
8 |
(i<n)=False |
|
|
|
|
13 |
Вывод 8 |
|
|
|
|
14 |
Выход из prim2 |
|
|
|
|
Результат: 8 Замечания.
1.Поскольку значение выражения i < n влияет на то, будет ли выполняться оператор цикла или цикл завершится, оно фиксируется в столбце «ход выполнения».
2.Так как в теле оператора цикла должны выполняться несколько операторов, они оформляются в виде составного оператора.
3.Результат работы программы можно в математическом виде записать: rez0 = 0 (строка 7), rezi = rezi-1 + x2, i = 1, ..., n–1,
n 1 |
n 1 |
(строки 6, 8..12), что дает rez x2 |
x2 * 1 x2 *(n 1) |
i 1 |
i 1 |
18
Пример разработки программы с циклом while.
Задача. Составить программу для вычисления 1/n!. Спецификация
1.Составить программу на Паскале для вычисления значения выражения 1/n!, где n! = 1 2 ... n (n – основание факториала).
2.Входные данные: целое число, основание факториала, например 3
3.Выходные данные: вещественное число, значение выражения, 0.167 для данного случая.
Таблица разработки |
|
|
|
Шаги разработки |
Примечания |
||
work3 |
|
|
|
|
|
|
|
begin |
|
|
|
ввод входных данных |
|
|
|
вычисление значения выражения |
|
|
|
вывод результата |
|
|
|
end |
|
|
|
ввод входных данных |
переменная |
n: |
|
|
integer |
|
|
read (n) |
|
|
|
вычисление значения выражения |
|
|
|
|
|
|
|
begin |
переменная |
rez |
|
установить начальное значение произведения |
|||
установить начальное значение счетчика |
(real) |
|
|
пока счетчик не достиг значения n выполнять |
переменная |
i |
|
begin |
(integer) |
|
для |
вычислить и запомнить очередное |
подсчета |
коли- |
|
произведение |
чества |
умно- |
|
увеличить счетчик на 1 |
жений, ее зна- |
||
end |
чения |
также |
|
посчитать значение выражения |
являются |
|
чле- |
end |
нами произве- |
||
|
дения |
|
|
19 |
|
|
|
Установить начальное значение произведения
rez:=1;
Установить начальное значение счетчика i:=1;
Пока счетчик не достиг значения n выполнять
while i<=n do
Вычислить и запомнить очередное произведение
rez:=rez*i;
Увеличить счетчик на 1
i:=i+1;
Посчитать значение выражения
rez:=1/rez;
Вывод результата
Write (rez)
Текст программы
1Program work3;
2var n,i:integer;
3rez:real;
4Begin
5read (n);
6rez:=1;
7i:=1;
8while i<=n do
9begin
10rez:=rez*i;
11i:=i+1;
12end;
13rez:=1/rez;
20