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

Методическое пособие 555

.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
2.33 Mб
Скачать

Синтаксис декрементного цикла for имеет вид:

for счетчик := НЗ downto КЗ do begin

[операторы;] end;

Отличие от инкрементного цикла состоит в том, что значение счетчика после каждой итерации будет не увеличиваться, а уменьшаться на 1. Выход из цикла произойдет при выполнении условия счетчик > КЗ.

Рис. 4.2. Блок-схема инкрементного цикла for

В теле цикла for нельзя изменять значение счетчика (при попытке это сделать компилятор сообщит об ошибке). Значения переменных, входящих в выражения НЗ и КЗ изменять можно, но на количество итераций цикла это не повлияет, поскольку значения выражений НЗ и КЗ вычисляются только один раз при входе в цикл.

Для досрочно завершения циклов (при выполнении некоторого условия) for, while и repeat предусмотрен оператор break, который должен быть расположен в теле цикла.

91

Для досрочного завершения текущей итерации цикла и начала следующей служит оператор continue.

2. Практическая часть

Задание 1. Найти сумму всех целых чисел от 1 до 50 с помощью цикла while.

Решение.

Program lab_4_p1;

Var

count, sum: Integer; begin

sum := 0; count := 0;

while count < 50 do begin

inc(count); {увеличиваем счетчик на 1} sum := sum + count;

end;

writeln('sum = ', sum); end.

До входа в цикл переменные sum (сумма) и count (счетчик цикла) инициализируются нулевыми значениями. На каждой итерации цикла счетчик count увеличивается на единицу функцией inc(), после чего его текущее значение добавляется к переменной sum. Перед началом каждой итерации цикла выполняется проверка условия count < 50, и как только оно окажется ложным (при count = 50), цикл завершится. В итоге на выходе из цикла переменная sum будет иметь значение, равное сумме всех целых чисел от 1 до 50.

Путем пошагового выполнения программы проследите за изменениями значений переменных count и sum на каждой итерации цикла. Проверьте результат, используя известную формулу

92

n

i n(n 1) / 2 .

i 1

Задание 2. Найти сумму всех целых чисел от 1 до 50 с помощью циклов for и repeat.

Задание 3. Вычислить факториал числа n, вводимого пользователем с клавиатуры, с использованием цикла for.

Решение. Согласно определению, факториал числа n равен произведению всех натуральных чисел от 1 до n включительно:

 

n

n! 1 2 n

i , n 1,

i 1

и, по договоренности, 0! = 1.

Далее приведен код программы, вычисляющей факториал числа с использованием цикла for.

program lab_4_p3; var

i,n,fact: Integer; begin

writeln('Введите число n'); readln(n);

if n > 0 then begin fact := 1;

for i := 2 to n do begin fact:=fact*i;

end; end

else if n = 0 then fact:=1; writeln('n! = ',fact);

end.

Путем пошагового выполнения программы проследите за изменениями значений переменных i и fact на каждой итерации цикла.

93

Задание 4. Вычислить факториал числа n, вводимого пользователем с клавиатуры, с использованием циклов while

и repeat.

Задание 5. Предположим, для работы с программой пользователь должен ввести пароль «ВГТУ». Напишите программу с использованием цикла repeat, которая предоставляет пользователю пять попыток ввода пароля и завершает программу, если пользователь исчерпал количество попыток.

Решение. Ниже приведен пример программы. Цикл завершается при условии, если пользователь ввел правильный пароль или исчерпал количество попыток. После выхода из цикла с помощью оператора if выполняется проверка, был ли введен правильный пароль. В случае, если пароль был введен неправильно, программа завершается процедурой Halt().

В качестве условия выхода из цикла после слова until указана логическая переменная flag (используемые таким образом логические переменные часто называют флажками). Разумеется, в данном случае можно было обойтись без использования переменной flag, указав вместо этого после слова until условие (pass = PASSWORD) or (p > MAX_P).

program lab_4_p5; const

PASSWORD = 'ВГТУ'; MAX_P = 5;

var

pass: String; p: Integer; flag: Boolean;

begin

p := 1; repeat

writeln('Введите пароль (попытка № ', p, ')');

94

readln(pass);

inc(p);

flag := (pass = PASSWORD) OR (p > MAX_P); until flag;

if (pass <> PASSWORD) then begin writeln('Неверный пароль. В доступе отказано'); Halt; {Завершение программы}

end;

writeln('Добро пожаловать'); end.

Задание 6. Напишите программу, аналогичную программе из предыдущего задания, но вместо цикла repeat используйте цикл for.

Указание. Для досрочного завершения цикла for (когда пользователь ввел правильный пароль) используйте оператор break.

Задание 7. C использованием вложенных циклов for вывести на экран таблицу вида

a11 a12 a13 a14 a15 a16 a17 a18 a19

a21 a22 a23 a24 a25 a26 a27 a28 a29

a31 a32 a33 a34 a35 a36 a37 a38 a39

a41 a42 a43 a44 a45 a46 a47 a48 a49

a51 a52 a53 a54 a55 a56 a57 a58 a59

a61 a62 a63 a64 a65 a66 a67 a68 a69

a71 a72 a73 a74 a75 a76 a77 a78 a79

a81 a82 a83 a84 a85 a86 a87 a88 a89

a91 a92 a93 a94 a95 a96 a97 a98 a99

Решение. Текст программы приведен ниже. Путем пошагового выполнения программы проследите за изменениями значений счетчиков циклов i и j в процессе циклических вычислений.

program labY_4; var

i,j: Integer; begin

for i:=1 to 9 do begin {i - номер строки} for j:=1 to 9 do begin {j - номер столбца}

write('a',i,j,' ');

95

end;

writeln; {переводим курсор на след. строку} end;

end.

Задание 8. Напишите программу, которая с использованием вложенных циклов for выводит на экран таблицу Пифагора:

1

2

3

4

5

6

7

8

9

2

4

6

8

10

12

14

16

18

3

6

9

12

15

18

21

24

27

4

8

12

16

20

24

28

32

36

5

10

15

20

25

30

35

40

45

6

12

18

24

30

36

42

48

54

7

14

21

28

35

42

49

56

63

8

16

24

32

40

48

56

64

72

9

18

27

36

45

54

63

72

81

3.Контрольные вопросы

1.Опишите синтаксис и алгоритм работы циклов for, while и repeat.

2.В каких случаях используется цикл for?

3.В чем основное отличие между циклами while и repeat?

4.Всегда ли возможно преобразовать цикл for в эквивалентные циклы while или repeat? Всегда ли возможно преобразование циклов while и repeat в эквивалентный цикл for?

5.Как досрочно завершить цикл? Как досрочно завершить текущую итерацию цикла?

6.Можно ли менять значение переменной-счетчика в теле

цикла for?

7.Если в теле цикла for изменить значения переменных, входящих в выражения для начального и конечного значения счетчика, повлияет ли это на количество итераций цикла?

8.Убедитесь, что программа для вычисления факториала n!, приведенная в задании 2, не работает правильно при n > 12. Почему так происходит и как можно решить эту проблему?

9.Ниже приведен код программы, вычисляющей сумму

96

всех целых чисел от 1 до 30. Код содержит две ошибки, найдите их.

Var

count, sum: Integer; begin

count := 1;

while (count < 31) do ; begin

sum := sum + count;

inc(count); {увеличиваем счетчик на 1} end;

writeln('sum = ', sum); end.

Лабораторная работа № 5

МАССИВЫ В ЯЗЫКЕ PASCAL

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

1. Теоретическая часть

1.1. Одномерные массивы

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

Целое число, характеризующее позицию элемента внутри массива, называют индексом элемента.

Массив, номер элемента которого определяется только одним индексом, называется одномерным (рис. 5.1).

97

Массивы в языке Pascal объявляются с помощью ключевых слов array of. Синтаксис объявления (в разделе var) одномерного массива имеет вид:

имя_массива: array [НИ..ВИ] of Тип;

Здесь НИ и ВИ – целые числа, задающие нижнее и верхнее (минимальное и максимальное) значение индекса элементов массива.

Рис. 5.1. Структура одномерного массива, содержащего 5 элементов

Индекс – это целое число, характеризующее позицию элемента внутри массива. Для обращения к отдельному элементу массива используется оператор вида

Имя_массива[Индекс]

Например, в результате выполнения оператора x[3] := 5 элементу массива x, индекс которого равен 3, будет присвоено значение 5.

Общее число элементов одномерного массива, очевидно, равно ВИ НИ + 1. Необходимо следить за тем, чтобы значение индекса удовлетворяло условию НИ индекс ВИ, в противном случае в процессе выполнения программы возникнет ошибка.

98

Как правило, работа с массивами осуществляется поэлементно, с использованием цикла (обычно for). Например, в следующем фрагменте кода массив z, содержащий 10 элементов, заполняется значениями, которые вводит пользователь с клавиатуры:

for i := 1 to 10 do begin

write('Введите значение z[', i, ']: '); readln(z[i]);

end;

1.2. Многомерные массивы

Массивы в языке Pascal могут быть многомерными (рис. 5.2). Синтаксис объявления статического N-мерного массива имеет вид:

имя_массива: array [НИ1..ВИ1,..,НИN..ВИN] of Тип;

Общее число элементов многомерного массива равно произведению числа элементов вдоль каждой размерности. Для обращения к отдельному элементу многомерного массива необходимо указывать соответствующее количество индексов через запятую:

Имя_массива[Индекс1,…,ИндексN].

Рис 5.2. Структура двухмерного и трехмерного массивов

99

1.3. Динамические массивы

Помимо статических массивов, размер которых задается один раз в момент запуска программы и в дальнейшем не изменяется, в PascalABC.Net существуют динамические массивы, размер которых может изменяться в процессе выполнения программы.

Динамический одномерный массив объявляется следующим образом:

имя_массива: array of Тип;

Изменение размера динамического массива в процессе выполнения программы осуществляется процедурой

SetLength(имя_массива, длина);

Если новая длина массива больше исходной, данная процедура выделит необходимое количество памяти под новые элементы массива, при этом значения исходных элементов сохраняются. Если же происходит уменьшение размера массива, соответствующая часть памяти освобождается.

Начальный индекс динамического массива равен нулю, а конечный – длина-1. Узнать текущую длину динамического массива позволяет функция Length(имя_массива).

2. Практическая часть

Задание 1. Заполнить одномерный массив из 20 элементов типа Real случайными числами в диапазоне от -6 до 6. Вывести на экран индекс и значение минимального элемента массива.

Решение. Рассмотрим пример кода соответствующей программы:

Program lab5_p1; var

x: array [1..20] of Real; i: Integer;

100