Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ахмадулин Р.К. технологии программирования.doc
Скачиваний:
9
Добавлен:
10.11.2019
Размер:
615.94 Кб
Скачать

Вопросы для самопроверки

1. Опишите принцип работы оператора For.

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

3. Может ли в цикле For использоваться счетчик типа Real? Byte? Char?

4. Назовите 3 основных отличия оператора цикла Repeat от оператора цикла While.

5. Сколько раз выполнится тело следующего цикла: x:=3; while x<5 do inc(x); ?

§9. Пример использования циклов

В данном параграфе рассмотрим несколько типовых задач, которые можно решить с использованием рассмотренных ранее операторов циклов.

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

Вычисление факториала

Пользователь вводит целое положительное число N. Вычислить факториал от N.

Факториал целого числа N (обозначается N!) – это произведение всех целых чисел в диапазоне от 1 до N включительно. Исключение: факториал 0 равен 1.

Пример: 4! = 1*2*3*4 = 24

Другими словами, задачу можно перефразировать следующим образом: пользователь вводит целое положительное число N. Вычислить произведение целых чисел от 1 до N.

Для решения такой задачи наиболее подходящим будет цикл for, т.к. нам заранее известно количество повторений: от 1 до N, т.е. N раз.

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

Пример:

var

N: integer; {число, которое вводит пользователь}

F: integer; {сюда будем вычислять факториал}

i: integer; {счетчик для цикла}

begin

writeln(‘Вычисление факториала N!’);

writeln(‘Введите число N:’);

readln(N);

F:=1; {задаем стартовое значение – инициализируем}

for i:=1 to N do F:=F*i; {в этом цикле и вычисляется факториал}

writeln(N, ‘!=’, F); {печатаем на экране результат}

end.

Суть алгоритма следующая: сначала в переменную F записываем единицу, а затем на каждом шаге домножаем его на новый элемент: на 2, на 3, и т.д., пока не дойдем до N. Для этого используем счетчик i, который внутри цикла for будет как раз принимать значения 1, 2, 3 и т.д. до N (см. начальное и конечное значение). В конце программы не забываем вывести результат на экран.

Вычисление суммы по заданной формуле

Пользователь вводит целое положительное число N. Вычислить сумму .

Данная задача аналогична предыдущей. Заводим дополнительную переменную Sum и на каждом шаге цикла добавляем в нее новый элемент – 1/i. Основное отличие – при инициализации в Sum запишем 0, т.к. в данном случае мы имеем дело с суммой, а не с произведением.

Пример:

var

N: integer; {число, которое вводит пользователь}

Sum: integer; {сюда будем считать сумму}

i: integer; {счетчик для цикла}

begin

writeln(‘Введите число N:’);

readln(N);

Sum:=0; {задаем стартовое значение – инициализируем}

for i:=1 to N do Sum:=Sum+1/i;

writeln(‘Sum=’, Sum); {печатаем на экране результат}

end.

Вычисление суммы по формуле с заданной точностью

Пользователь вводит вещественное число x (модуль меньше 1) и точность вычислений eps (от 0 до 1). Вычислить сумму с заданной точностью.

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

Пример:

var

x: real; {число, которое вводит пользователь}

xx: real; {в этой переменной будем хранить x в нужной степени}

eps: real; {точность, которую вводит пользователь}

Sum: integer; {сюда будем считать сумму}

i: integer; {счетчик}

begin

writeln(‘Введите число x (<1):’);

readln(x);

writeln(‘Введите точность вычислений (<1):’);

readln(eps);

Sum:=0; {задаем стартовое значение – инициализируем}

xx:=1; {задаем стартовое значение – инициализируем}

repeat

xx:=xx*x; {т.к. степень у x отличается от предыдущего шага

всего на 1, то можно сделать и так}

Sum:=Sum+xx/(i+1); {добавляем новый элемент к сумме}

until abs(xx/(i+1))<eps; {повторяем цикл, пока не получим точность}

writeln(‘Sum=’, Sum); {печатаем на экране результат}

end.

Обратите внимание на переменную xx: чтобы на каждом шаге заново не возводить x в степень, мы просто запоминаем это значение с предыдущего шага и домножаем его еще раз на x (т.е., x5 = x4 * x).