Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Относительность выбора операторов while и repeat

Со временем вы поймете, что проверка условия окончания цикла до или после тела цикла — это вопрос исключительно личных предпочтений. В данном случае, например, можно написать эту программу через while и при этом не повторять оператор ввода:

Пример 7.5. Использование цикла while для подсчета суммы вводимых чисел до первого отрицательного числа без дублирования оператора ввода

var
sum, a: real;
begin
sum:=0; { Обнуляем сумму }
а:=1; {Используем ту же хитрость, что и в примере 7.3. Это нужно, чтобы значение А удовлетворяло условию while }
while а>=0 do { Проверяем введенное число на отрицательность }
begin
sum:=sum+a;
write('Введите число:') ; { Ввод очередного числа } ;
redln(а) { Добавляем введенное число к сумме }
end;
writeln('Сумма чисел=', sum:5:3);
readln
end.

 

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

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

 

Задание 7.9.
Написать программу, которая подсчитывает произведение целых чисел, введенных с клавиатуры. Произведение подсчитывается до тех пор, пока вводятся числа в интервале от -10 до +10. Используйте цикл с постусловием.
Подсказка: в записи условия используйте логическую операцию.

Задание 7.10.
Выполните ту же задачу, но с использованием цикла с предусловием.

Задание 7.11.
Написать программу «Угадай-ка»: С использованием датчика случайных чисел в программе загадывается число в диапазоне 0... 100. На отгадывание числа дается 10 попыток. Играющий вводит каждый раз очередное число. После каждого ответа программа выводит на экран одно из сообщений — «больше», «меньше» или «угадано», в зависимости от числа, введенного пользователем. Цикл завершается при выполнении одного из двух условий: либо число попыток достигло 10, либо дан правильный ответ.

Подсказки:

1. Каждый раз в цикле наращивается переменная к, содержащая счетчик попыток.
2. Для отслеживания правильного ответа введите логическую переменную flag, которой первоначально следует присвоить значение False. Если ответ верен, присвойте этой логической переменной значение True.
3. Цикл завершается, если значение счетчика попыток k равно 10 или если логическая переменная имеет Значение True (использовать операцию логическое «или» — or).
4. При выходе из цикла надо сообщить, угадано ли число или же выход из цикла произошел по совершении 10 попыток. Для этого надо проверить значение логической переменной flag («истина» или «ложь»).

Сначала заполните блок-схему алгоритма (рис. 7.11).

Рис. 7.11. «Слепая» блок-схема алгоритма «Угадайка» (см. задание 7.11)

 

Задание 7.12.
Введите два числа (например, А = 5 и В = 8) и найдите их произведение, используя только операцию сложения. Нарисуйте блок-схему алгоритма, используя цикл с постусловием.

Задание 7.13.
Введите два числа (например, А = 45 и В = 8) и найдите частное от деления нацело (в переменной к) и остаток от деления нацело (в переменной А), используя только операцию вычитания. Нарисуйте блок-схему алгоритма, используя цикл с постусловием.

Задание 7.14.
Перед вами блок-схема алгоритма подсчета количества десятичных разрядов в заданном положительном числе N (рис. 7.12). Заполните таблицу трассировки и докажите, что в переменной k мы действительно получаем количество разрядов (в нашем случае их 4).

 

Таблица 7.1. Таблица для трассировки алгоритма, приведенного на рис. 7.12 (задание 7.14)

 

Оператор

Условие

N

k

Примечание

ВводN

 

1024

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7.12. Блок-схема алгоритма подсчета количества десятичных разрядов в заданном положительном числе N
Напишите программу и проверьте алгоритм для других значений N.

 

Задание 7.15. Перед вами блок-схема алгоритма подсчета суммы десятичных разрядов в заданном положительном числе N (рис. 7.13). Заполните таблицу трассировки и докажите, что в переменной S мы действительно получаем сумму разрядов (в нашем случае сумма равна 14).

Таблица 7.2. Таблица для трассировки алгоритма, приведенного на рис. 7.13 (задание 7.15)

Оператор

Условие

N

S

Примечание

Ввод N

 

4235

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7.13. Блок-схема алгоритма подсчета суммы десятичных разрядов в заданном положительном числе N

 

Напишите программу и проверьте алгоритм для других значений N.
Полезным примером цикла repeat... until является использование библиотечной функции KeyPressed.

KeyPressed — библиотечная функция (из модуля CRT), которая, отработав, возвращает в программу результат в виде логического значения. Первоначально результат равен False. Как только будет нажата любая клавиша на клавиатуре, возвращаемый результат станет равным True. Таким образом, цикл вида repeat until KeyPressed будет выполняться, пока не будет нажата какая-либо клавиша.

Обычно это используется для получения задержки в программе — например, для просмотра результата на экране. Тело цикла пусто, цикл сводится только к проверке условия KeyPressed.

 

Выводы

1. Для организации многократно повторяющихся действий с неизвестным числом повторений используется оператор цикла с предусловием:
while логическое условие> do <оператор>
2. Выполнение цикла while прекращается, как только логическое условие примет значение false.
3. Цикл с предусловием (while) может не выполниться ни разу.
4. Для выполнения той же задачи служит цикл с постусловием:
repeat
<один или несколько операторов> until логическое условие>
5. Выполнение цикла repeat прекращается, как только логическое условие примет значение true.
6. Цикл с постусловием (repeat) будет выполнен хотя бы один раз.
7. При использовании нескольких операторов в теле цикла repeat... until операторная скобка (begin ... end) не нужна, так как пара repeat... until сама является операторной скобкой.

 

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

1. В каких случаях предпочтительнее использовать оператор цикла for, а в каких — операторы цикла с условием?
2. Чем проверка условия выполнения цикла while отличается от проверки в цикле repeat... until?
3. Что будет на экране в результате выполнения следующих фрагментов программ? (Переменные описаны для всех фрагментов.)

var
k,x,i: integer;
begin
{ Фрагмент 1 }
k:=256;
while k<>l do
begin
write(k:4);
k:=k div 2
end;

{ Фрагмент 2 }
k:=5;
repeat
writeln(k);
k:=k+5
until k>30;

{ Фрагмент 3 }
for i:=1 to 5 do
writeln(i*5);

{ Фрагмент 4 }
for i:=8 downto 4 do
write(i :3);

{ Фрагмент 5 }
for x:=l to 79 do
begin
gotoxy(x,8);
write('*');
gotoxy(x,15);
write('*');
end;
end.

 




 

Комментарии:

2012-02-14 ответил алёна

алёна



2015-03-25 ответил линейка

длинотёхонько




Добавить свой комментарий:


Введите значение:
 









   
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru