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

Разработка программ

.pdf
Скачиваний:
9
Добавлен:
02.05.2015
Размер:
440.75 Кб
Скачать

мы с разветвлением.

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