Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pascal.pdf
Скачиваний:
114
Добавлен:
20.04.2015
Размер:
980.04 Кб
Скачать

 

38

Программирование на языке Pascal

Модуль 3. Операторы повторения (циклы)

Представим себе ситуацию, что нам требуется написать программу, которой необходимо вычислить сумму 100 чисел, которые подряд, одно за другим, вводит пользователь. В таком случае, обладая теми знаниями, которые мы получили ранее, нам придется написать

программу, вроде той, что приведена ниже

Uses Crt;

Var currentNumber, summValue: Integer;

Begin summValue:=0;

WriteLn('Введите число с номером 1'); ReadLn(currentNumber); summValue:=summValue+currentNumber; Writeln('Введите число с номером 2'); ReadLn(currentNumber); summValue:=summValue+currentNumber; Writeln('Ведите число с номером 3'); ReadLn(currentNumber); summValue:=summValue+currentNumber;

WriteLn('Введите число с номером 100'); ReadLn(currentNumber); summValue:=summValue+currentNumber; WriteLn('сумма 100 чисел равна: ',summValue);

End.

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

Взависимости от конкретной задачи, могут быть использованы различные виды циклов:

циклы с параметром;

циклы с условием;

o с предусловием; o с постусловием.

Цикл с параметром

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

Для того, чтобы указать корректно указать, количество итераций такого цикла, необходимо указать начальное значение параметра и его конечно значение.

Синтаксис выглядит следующим образом:

For параметр_цикла:=начальное_значение To конечное_значение Do

Begin

{тело цикла}

End;

38

 

39

Программирование на языке Pascal

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

Приведем простой пример, в котором на экран 10 раз будет выводиться строка,

содержащая свой номер:

Uses Crt;

Var i: Integer;

Begin

ClrScr;

For i:=1 To 10 Do

Begin

WriteLn('Это строка номер ', i);

End; End.

Результат работы такой программы будет выглядеть следующим образом:

Рисунок 17

Вданном примере, в качестве параметре цикла была задействована переменная i, изменяющаяся от 1 до 10. Кроме того, ее значение было использовано в процедуре WriteLn для того, чтобы определить номер итерации, которая по логике работы программы совпадает с номером выводимой строчки.

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

For i:=10 To 0 Do {так делать нельзя!}

Если все-таки необходимо организовать изменение параметра от большего значения к меньшему, то вместо ключевого слова To используется ключевое слово DownTo. Например:

Uses Crt;

Var i: Integer;

Begin

ClrScr;

39

 

 

 

40

Программирование на языке Pascal

 

For i:=10 DownTo 1 Do

 

 

 

 

Begin

 

 

WriteLn('У Маши было ', i, ' конфет. Одну съела и',

 

 

' осталось – ', i-1);

 

 

End;

 

 

End.

 

Рисунок 18

Практикум: Вычисление факториала числа

Применим цикл с параметром для решения задачи о перестановках.

Суть задачи сводится к подсчету количества различных перестановок, которые можно осуществить из N предметов.

Предположим, что у нас есть три различных мячика, например таких, которые изображены ниже на рисунке

Вопрос заключается в том, сколько существует неповторяющихся вариантов их взаимного расположения?

Для ответа на этот вопрос переберем все возможные варианты расположения мячиков. В результате чего увидим, что всего таких вариантов может быть 6.

1 2 3 4 5 6

Конечно, в общем случае произвольного N, перебирать все возможные варианты не очень эффективно, поэтому необходимо разработать алгоритм подсчета, возвращающий количество неповторяющихся перестановок в зависимости от числа предметов – N. В курсе математики показывается, что количество C таких перестановок вычисляется следующей формулой:

C 1 2 3 ... (N 1) N N!,

40

 

41

Программирование на языке Pascal

т.е. это произведение всех чисел от 1 до N. Такое произведение в математике называется факториалом числа N. Действительно, если N 3 , то N! 3! 1 2 3 6 , что и показал наш прямой перебор всех вариантов.

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

N! 1 2 ...(N 1) N

(N 1)!

т.е. для того чтобы вычислить факториал числа N, достаточно на N умножить факториал числа, меньшего на единицу. При этом считается, что 1!=1.

Тогда, если мы некоторой переменной в начальный момент присвоим значение, равное 1, а потом будем постепенно умножать значение переменной на параметр цикла, то в итоге мы и получим требуемый результат – факториал числа N. Для этого параметр цикла

должен будет перебрать все множители – от 1 до N:

Uses Crt;

Var factorial : LongInt;

i, n: Integer;

Begin

ClrScr;

WriteLn('Введите количество предметов: '); ReadLn(n);

factorial:=1;

For i:=1 To n Do factorial:=factorial*i;

WriteLn('Количество перестановок из ',n, ' предметов =', factorial);

End.

Рисунок 19

Обратите внимание, что в случае использования циклов ситуация с операторными скобками Begin … End точно такая же, что и в случае условного оператора: если тело цикла представляет собой всего один оператор (в данном случае – присвоение переменной factorial результата умножения), то операторные скобки можно не писать.

41

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]