Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование для начинающих 2011-09-02.pdf
Скачиваний:
45
Добавлен:
09.06.2015
Размер:
576.39 Кб
Скачать

3. Цикл for

3.1. Цикл с параметром (for)

Современные компьютеры выполняют миллиарды операций в секунду. Однако к счастью, программистам не приходится писать программы из миллиардов строк кода. Чтобы с помощью короткой программы указать на необходимость выполнения большого количества операций используется оператор цикла, суть которого в многократном повторении одного и того же набора инструкций. На рис. 1 работа циклов показана с помощью блок-схем.

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

(а)

(б)

Рис. 1. Блок-схемы циклов.

В языке Паскаль существует несколько вариантов организации циклов. Рассмотрим один из них – так называемый цикл с параметром или цикл for. Чтобы записать его нам потребуется переменная целого типа, например:

var

i: integer;

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

for i:=<начальное значение> to <конечное значение> do begin

<операторы> end;

Здесь i – так называемая переменная-счетчик (разумеется, ее не обязательно называть именно i, это может быть любая переменная целого типа). Начальное и конечное значение это любые выражения, имеющее значение целого типа. Когда оператор цикла начинает работу переменная счетчик принимает начальное значение, затем выполняются <операторы>, после этого счетчик увеличивается на

единицу, и снова выполняются операторы. Процесс повторяется, пока счетчик не окажется больше конечного значения. Например, если начальное значение 2, а конечное 3, то <операторы> будут выполнены 2 раза. Область между словами begin и end, где располагаются повторяющие в цикле операторы, называется

телом цикла.

На рис. 2 показан блок-схема работы этого цикла.

Рис. 2. Схема работы цикла с параметром (for).

Пример 1: Напечатать слово Hello на экране 100 раз.

Один раз слово Hello можно напечатать с помощью процедуры writeln(‘Hello’); Чтобы напечатать его 100 раз, надо эту инструкцию поместить внутрь оператора цикла, который выполнится нужное количество раз. А именно:

for n:=1 to 100 do begin

writeln(‘Hello’); end;

Переменной счетчику n будет присвоено начальное значение 1. Затем Hello будет напечатано 1-й раз. Счетчик увеличится на 1 и Hello напечатается 2-й раз и т.д.

Перечислим в одном месте все правила, касающиеся работы цикла с параметром:

1)Переменная-счетчик должна быть обязательно целого типа (например,

integer).

2)Начальное и конечное значения задаются выражениями, значение которых также имеет целый тип. Нельзя, например, записать цикл

for x:=0 to 2*Pi do … Но можно, например:

for k:=2*round(n*1000) to trunc(2*pi)+1 do

3)Если конечное значение меньше начального цикл не выполнится ни разу.

4)После окончания работы переменная-счетчик «портится». Глядя на блоксхему можно предположить, что после окончания работы цикла она на единицу больше конечного значения. На практике это не так и она может иметь любое значение. Отсюда правило: если переменная используется, как счетчик шагов в цикле не следует обращаться к ней после того, как цикл завершил свою работу.

5)Если в теле цикла содержится всего один оператор, то слова begin и end,

ограничивающие тело цикла можно опустить. Такая ситуация у нас была в примере 1. Там можно было написать:

for n:=1 to 100 do writeln(‘Hello’);

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

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

8)Еще одно стилистическое правило: все операторы тела цикла должны быть дополнительно сдвинуты на 2-3 пробела вправо (см. запись программы в примере 1 и последующих примеров ниже по тексту).

Итак, одни и те же действия мы можем выполнять сколько угодно раз, но что полезного это дает? Печатать 100 раз Hello не очень важное приложение. Чтобы сделать что-то полезное, надо чтобы действия на каждом шаге цикла чем-то различались. Первый способ добиться этого состоит в использовании переменной счетчика, которая на каждом шаге принимает различные значения.

Пример 2: Напечатать все целые числа в диапазоне от 5 до 25.

for i:=5 to 25 do writeln(i);

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

Пример 3: Табуляция функций.

Под табуляцией функций подразумевается составление таблицы значений функции для некоторого диапазона значений аргумента. Пусть требуется N значений функции f(x) в диапазоне от Xmin до Xmax. Рассматривая переменнуюсчетчик как номер аргумента функции, составим выражение, позволяющее по номеру получить значение аргумента:

x := Xmin + (Xmax - Xmin)*(i-1)/(N-1).

Убедитесь, что действительно первое значение аргумента (при i = 1) составляет x = Xmin, а N-е (i = N) x = Xmax. Вычисляя на каждом шаге значение аргумента, можем тут же вычислить функцию и составить требуемую таблицу.

for i:=1 to N do begin

x:=Xmin+(Xmax-Xmin)*(i-1)/(N-1); y:=f(x);

writeln(x, ' ', y); end;

Вместо f(x) в приведенной программе следует подставить любое выражение, составленное по правилам языка Паскаль.

4.2. Прием накопления суммы

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

Пример 4: Просуммировать все целые числа от 1 до 100.

s:=0;

{Обнуление переменной}

for i:=1 to 100 do

 

s:=s+i;

{Прибавление очередного элемента суммы на каждом шаге

цикла}

 

Очень важная, фундаментальная идея, использованная в данном приеме, состоит в том, что результат выполнения каждого шага цикла, зависит от значения переменной, вычисленной на предыдущем шаге. Таким образом, вместо тривиального повторения одного и того же, мы на каждом шаге получаем новый результат. Так в приведенном примере очередное число добавляется к значению переменной s, полученному на предыдущем шаге.

А к чему добавляется очередное число на самом первом шаге? Чтобы было к чему добавлять, перед циклом обязательно должна присутствовать инициализация (присваивание начального значения) переменной, в которой накапливается сумма. Чаще всего требуется присвоить ей начальное значение 0.

Программистский анекдот в тему. Буратино подарили три яблока. Два он съел. Сколько яблок осталось у Буратино? Ответ «одно» неправильный. Неизвестно, сколько осталось, так как не сказано, сколько яблок было у него до того, как ему подарили три новых. Мораль: не забывайте обнулять переменные.

4.3. Прием накопления произведения

Аналогично накоплению суммы можно в отдельной переменной накапливать произведение. Переменной, в которой производится накопление, присваивается начальное значение 1.