Оператор цикла с предусловием общий вид

Цикл с пердусловием реализуется в языке программирования Pascal с помощью оператора WHILE … DO.
Синтаксис:
while условие выполнения цикла do
begin
{Операторы}
end;
- Оператор while состоит из заголовка и тела цикла. Операторы, находящиеся в теле цикла, обязательно заключаются в операторные скобки begin и end.
- “Условие выполнения цикла” – это выражение логического типа (булевское выражение) выражение отношения или логическое выражение, принимающее одно из двух значений: true или false.
- Если проверяемое условие ложно изначально, то операторы входящие в тело цикла не выполняются, проход по телу цикла не осуществляется и выполняются инструкции, находящиеся после операторной скобки end.
- Служебные слова while и do означают “пока” и “делай”.
Блок-схема
Пример задачи на использование цикла с предусловием
Пример №1
Постановка задачи:
- Дано целое число N (> 0). Найти наименьшее целое положительное число K, квадрат которого превосходит N: K2 > N. Функцию извлечения квадратного корня не использовать.
- Блок-схема:
- Кодирование
- Тестирование
program while7;
var
n,k,p:longint;
begin
rite(‘Введите число N > 0, N = ‘); readln(n);
k:=0;
while p < n do
begin
p := k * k;
k := k + 1;
end;
writeln(‘Наименьшее целое положительное число K, квадрат которого превосходит ‘,
n, ‘ равен K = ‘,k)
end.
Дано: | 6
——————————–
Результат | 3
Пример №2
Постановка задачи:
- Дано натуральное число: верно ли утверждение, что в данном числе N нет такой цифры A (цифра A вводится с клавиатуры).
- Входные данные: a – искомая цифра, n – данное число, k, x – вспомогательные переменные (целочисленного типа); f – логическая переменная для проверки предположения.
- Выходные данные: вывод на экран сообщения о присутствии цифры в числе.
- Описание алгоритма
- Блок-схема
- Кодирование
Предположим, что цифра есть в числе. Тогда, используя цикл с предусловием, выполняющий последовательное целочисленное деление числа на 10 и выделяя остатки, мы проверяем условным оператором наличие цифры в числе. Если таковое найдется, мы немедленно выходим из цикла и выводим сообщение, что число найдено. Если цифра не будет обнаружена, то, по завершении цикла, выводится сообщение, что цифра в числе не обнаружена.
(* Задача: Дано натуральное число: верно ли *)
(* утверждение, что в данном числе N нет *)
(* данной цифры A (цифра A вводится с *)
(* клавиатуры). *)
(* Выполнил ученик 10 класса Иванов Иван *)
(* 15.02.10 г. *)
program chislo;
var
a:byte;
n,k,x:longint;
b:boolean;
begin
write(‘Введите число N = ‘); readln(n);
write(‘Введите цифру A = ‘); readln(a);
f := true; {Предположим, что цифра A есть в числе N}
x := n; {Сохраним значение N}
while x > 0 do
begin
k := x mod 10;
if k = a then
begin
f := false;
break {если цифра обнаружена – нет необходимости просматривать
число полностью, выходим из цикла}
end;
x := x div 10
end;
if f then
writeln(‘Цифры ‘, а, ‘ в числе ‘, n, ‘ нет’)
else
writeln(‘Такая цифра есть в числе!’)
end.
Тестирование
Дано: | N = 1234567
| A = 9
——————————–
Результат | Цифры 9 в числе 1234567 нет
Пример №3
Постановка задачи:
- Найти наибольший общий делитель (НОД) двух натуральных чисел A и B
- Входные данные: a,b – два натуральных числа, переменные целочисленного типа
- Выходные данные: a – НОД.
- Описание алгоритма:
- Блок-схема
- Кодирование
- Тестирование
Для решения поставленной задачи воспользуемся алгоритмом Евклида. Если M > N, то НОД(М,N)=НОД(M-N,N). Будем уменьшать каждый раз большее из чисел на величину меньшего до тех пор, пока оба значения не станут равными.
program evklid;
var
a,b:integer;
begin
write’Введите число A = ‘); readln(a);
write(‘Введите число B = ‘); readln(b);
while a<>b do
begin
if a>b then
a:=a-b
else
b:=b-a
end;
write(‘НОД = ‘,a)
end.
Дано: | А = 56
| B = 32
——————————–
Результат | НОД = 8
Домашнее задание
- (While1) Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.
- (While3) Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти частное от деления нацело N на K, а также остаток от этого деления.
- Дополнительное задание: (While11) Поменять порядок цифр на обратный. Например, было 1234567, стало 7654321
- Дополнительное задание: Дано целое число N (> 1). Вывести наименьшее из целых чисел K, для которых сумма 1 + 2 + … + K будет больше или равна N, и саму эту сумму.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
В Си существуют все три типа операторов цикла: цикл с
предусловием, цикл с постусловием и цикл с параметром.
Цикл с
предусловием. Формат оператора цикла
с предусловием:
while (выражение)
оператор;
Цикл повторяет свое выполнение, пока значение
выражения отлично от нуля, т. е. заключенное в нем условие цикла истинно.
В качестве примера использования оператора цикла
рассмотрим программу вычисления факториала целого положительного числа N!. Сопоставим
программу решения этой задачи, написанную на Си.
//
Программа вычисления факториала
#include
<iostream.h>
void main()
{ long int F;
int i,N;
cout<<“N=”;
cin>>N;
F=i=l;
while(i<=N)
F=F*i++;
cout<<“n”<<N<<”
!=”<<F;
}
Обратите внимание на операторы в теле цикла. Конечно,
и в Си-программе можно было написать два оператора присваивания, объединив их
фигурными скобками. Однако использованный способ записи более лаконичен и
более характерен для Си. Этот же самый оператор можно было записать еще короче:
F*=i++
При практическом использовании этой программы не
следует забывать, что факториал — очень быстро растущая функция, и поэтому при
определенных значениях N выйдет из диапазона, соответствующего типу long int.
Задав для переменной F тип unsigned long, можно сдвинуть эту границу, но этого
может оказаться недостаточно. Предлагаем в качестве самостоятельного задания
исследовать предельные значения N для двух указанных типов переменной F.
Интересно свойство следующего оператора:
while(1);
Это бесконечный пустой цикл. Использование в качестве
выражения константы 1 приводит к тому, что условие повторения цикла все время
остается истинным и работа цикла никогда не заканчивается. Тело в этом цикле
представляет собой пустой оператор.
При исполнении такого оператора программа будет «топтаться на месте».
Рассмотрим еще один пример использования оператора
цикла while. Вернемся к задаче итерационного вычисления суммы гармонического
ряда: 1 + 1/2 + 1/3 + … с заданной точностью ε. Снова сопоставим программу на
С++.
// сумма гармонического ряда
#include <iostream.h>
#include <limits.h>
void main()
{int n=l;
double S=0, eps;
cout<<“Toчность:”;
cin>>eps;
while(1.0/n>eps && n<INT_MAX)
S+=l./n++;
cout<<“nCyммa=”<<S;
}
Файл limits .h, подключаемый препроцессором, содержит
определения предельных констант для целых типов данных. В частности,
константа с именем int_max равна максимальному значению типа int в данной
реализации компилятора. Если для типа int используется двухбайтовое
представление, то int_max=327 67. В этом же заголовочном файле определены и
другие константы: INT_MIN=-327 68;
LONG_MAX=214 74 8 3 64 7 и т.д.
Цикл с
постусловием. Формат оператора цикла
с постусловием:
do оператор while
(выражение);
Цикл выполняется до тех пор, пока выражение отлично от
нуля, т.е. заключенное в нем условие цикла истинно. Выход из Цикла происходит
после того, как значение выражения станет ложным, иными словами равным нулю. В
качестве примера рассмотрим программу вычисления N!, в которой используется
цикл с постусловием.
#include <iostream.h>
void main()
{ long int F;
int i,N;
cout<<“N=”;
cin>>N;
F=i=1;
do F*=i++;
while(i<=N);
cout<<“n”<<N<<“!=”<<F;
}
Цикл с параметром. Формат оператора цикла с параметром:
for (выражение_1;
выражение_2; выражение_3) оператор;
Выражение 1 выполняется только один раз в начале
цикла. Обычно оно определяет начальное значение параметра цикла (инициализирует
параметр цикла). Выражение 2 — это условие выполнения цикла. Выражение 3
обычно определяет изменение параметра цикла, оператор — тело цикла, которое
может быть простым или составным. В последнем случае используются фигурные
скобки.
Рис 4
Алгоритм выполнения цикла for представлен на
блок-схеме на рис. 4.
Обратите внимание на то, что после вычисления
выражения 3 происходит возврат к вычислению выражения 2 — проверке условия
повторения цикла.
С помощью цикла for нахождение N! можно организовать
следующим образом:
F=l;
for(i=l;i<=N;i++)
F=F*i;
Используя операцию «запятая», можно в выражение 1
внести инициализацию значений сразу нескольких переменных:
for(F=l,i=l;i<=N;i++) F=F*i;
Некоторых элементов в оператора for может не быть,
однако разделяющие их точки с запятой обязательно должны присутствовать. В следующем
примере инициализирующая часть вынесена из оператора for:
F=1;
i=1;
for(;i<=N;i++) F=F*i;
Ниже показан еще один вариант вычисления N!. В нем на
месте тела цикла находится пустой оператор, а вычислительная часть внесена в
выражение 3.
for(F=l,i=l;i<=N;F=F*i,i++);
Этот же оператор можно записать в следующей форме:
for(F=l,i=l;i<=N;F*=i++);
В языке Си оператор for является достаточно
универсальным средством для организации циклов. Вот пример вычисления суммы
элементов гармонического ряда, превышающих заданную величину ε:
for(n=l,S=0;1.0/n>eps &&
n<INT_MAX;n++) S+=1.0/n;
И наконец, эта же самая задача с пустым телом цикла:
for(n=l,S=0;1.0/n>eps
&& n<INT_MAX;S+=l.0/n++);
Следующий фрагмент программы на Си++ содержит два вложенных
цикла for. В нем запрограммировано получение на экране таблицы умножения.
for(х=2;х<=9;х++)
for(y=2;y<=9;y++)
cout<<“n”<<x<<“*”<<y<<”
= “<<x*y;
На экране будет получен следующий результат:
2*2=4
2*3=6
………
9*8=72
9*9=81
Оператор
continue. Если выполнение очередного
шага цикла требуется завершить до того, как будет достигнут конец тела цикла,
используется оператор continue. Следующий фрагмент программы обеспечивает вывод
на экран всех четных чисел в диапазоне от 1 до 100.
for<i=l;i<=100;i
{if(i%2)
continue;
cout<<“t”<<i; }
Для нечетных значений переменной i остаток от деления на 2 будет равен единице, этот
результат воспринимается как значение «истина» в условии ветвления, и
выполняется оператор continue. Он завершит очередной шаг цикла, выполнение
цикла перейдет к следующему шагу.
Оператор
goto. Оператор безусловного перехода
goto существует в языке Си, как и во всех других языках программирования
высокого уровня. Однако с точки зрения структурного подхода к программированию
его использование рекомендуется ограничить. Формат оператора:
goto метка;
Метка представляет собой идентификатор с последующим
двоеточием, ставится перед помечаемым оператором.
Одна из ситуаций, в которых использование goto
является оправданным — это необходимость «досрочного» выхода из вложенного
цикла. Вот пример такой ситуации:
for(…)
{ while (…)
{ for(…)
{… goto exit …}
}
}
exit:
cout<<“Bыход из
цикла”;
При использовании оператора безусловного перехода
необходимо учитывать следующие ограничения:
o
нельзя входить
внутрь блока извне;
o
нельзя входить
внутрь условного оператора (if …else…);
o
нельзя входить
внутрь переключателя;
o
нельзя входить
внутрь цикла.
Источник
Вчера мы узнали о понятии циклы в паскале в общих чертах, сегодня узнаем о каждом из циклов в паскале поподробней и увидим как они задаются. Будем разбирать цикл while с предусловием, цикл for с параметром и цикл repeat – until с постусловием.
1. Цикл с параметром в Паскале – FOR
Цикл FOR задаёт определённое условие по которому программа будет работать до его выполнения, допустим нужно нам 5 (или n) раз зациклить программу, то это легко сделать с помощью данного цикла. У цикла FOR есть характерная черта – счетчик который обычно обозначается буквой i или j.
Внешний вид цикла с параметром в паскале:
for i:= 1 to n do // присваиваем i сначала одному, потом двум, трем, …, n
После 1-го прохода переменной i присваиваем 1, после второго присваиваем 2 и так до тех пор, пока не дойдем до n. to – это до .. в порядке возрастания, также есть downto – до .. в порядке убывания.
Блок – схема цикла с параметром:
2. Цикл с предусловием в Паскале – WHILE
Оператор цикла с предусловием выполняет действия заранее неизвестное число раз. Выход из цикла осуществляется, если некоторое логическое выражение или его результат окажется ложным. Так как верность логического выражения проверяется в начале, тело цикла может не выполнится ни одного разу.
Структура цикла с предусловием:
WHILE DO
begin
end;
– логическое выражение, истинность которого проверяется вначале выполнения циклического оператора;
– любые выполняемые операторы языка.
Порядок выполнения цикла:
Пока условие истинно выполняется тело цикла. Как только условие становится ложно выполнение цикла прекращается.
Блок – схема цикла с предусловием:
Примечание: в прямоугольных блоках показано любое действие, которое выполняется в цикле или после него (шаг цикла), в овалах – начало или конец всей программы или её части. Главную роль в данной блок – схеме играет её центральная часть.
Пример:
Задача: вычислить сумму ряда 1+1.5+2+2.5+3+3.5+ .. + 30
program example-while;
var
sum:real;
n:real;
BEGIN
sum:=0;
n:=1;
while n
3. Цикл с постусловием – Repeat – until.
Этот оператор аналогичен оператору цикла с предусловием, но отличается от него тем, что проверка условия производится после выполнения тела (действий) цикла. Это обеспечивает его выполнение хотя бы один раз в отличие от ранее разобранных циклов.
Обратите внимание на то, что данный оператор цикла предполагает наличие нескольких операторов в теле цикла, то есть можно выполнять несколько действий, поэтому служебные слова Begin и End не нужны.
Последовательность операторов, входящих в тело цикла выполняется один раз, после чего проверяется соблюдение условия, записанного следом за служебным словом Until. Если условие не соблюдается, цикл завершается. В противном случае – тело цикла повторяется ещё раз, после чего снова проверяется соблюдение условия.
Блок – схема цикла с постусловием:
REPEAT
UNTIL ;
Program test2;
Var b:Real;
Begin
b:=100;
Repeat b:=b/2;
Until b
Выводы:
1.Цикл с параметром используется переменная, называемая параметром цикла или счётчиком. Перед выполнением цикла параметру (счётчику) устанавливается начальное значение. После выполнения шага цикла значение параметра увеличивается на единицу. Цикл продолжается до тех пор пока параметр не достигнет своего конечного значения, которое указывается после to (downto).
2. Цикл с предусловием выполняется до тех пор, пока условие выполнения не станет ложным, и продолжается, если условие истинно.
3. Цикл с постусловием выполняется до тех пор, пока условие не станет истинно, если условие ложно, цикл продолжается.
Предыдущий урок
Дата: 2012-01-06 19:31:43 Просмотров: 271746
Теги: Паскаль Pascal циклы уроки
Источник
3.5 Операторы цикла
Циклический процесс, или просто цикл — это повторение одних и тех же действий. Последовательность действий, которые повторяются в цикле, называют телом цикла. Один проход цикла называют шагом, или
итерацией9. Переменные, которые изменяются внутри цикла и влияют на его окончание, называются параметрами цикла.
При написании циклических алгоритмов следует помнить следующее. Во-первых, чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла. Во-вторых, условие должно состоять из корректных выражений и значений, определённых ещё до первого выполнения тела цикла.
В языке Free Pascal для удобства программиста предусмотрены три оператора, реализующих циклический процесс: while, repeat..until и for.
3.5.1 Оператор цикла с предусловием while..do
На рис. 3.24 изображена блок-схема алгоритма цикла с предусловием.
Оператор, реализующий этот алгоритм, в языке Free Pascal имеет вид:
while выражение do оператор;
Выражение должно быть логической константой, переменной или логическим выражением.
Работает оператор while следующим образом. Вычисляется значение выражения.
Если оно истинно (True), выполняется оператор. Выполнение цикла заканчивается, если условие ложно, после этого управление передается оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение ложно (False), цикл не выполнится ни разу.
Если в цикле надо выполнить более одного оператора, необходимо использовать составной оператор:
begin
оператор_1;
оператор_2;
…
оператор_n;
end;
Рассмотрим пример. Пусть необходимо вывести на экран значения функции на отрезке с шагом 0.1.
Применим цикл с предусловием :
begin
{Присваивание параметру цикла стартового значения.}
x : = 0;
{Цикл с предусловием.}
while x<=pi do {Пока параметр цикла не превышает}
{конечное значение, выполнять тело цикла.}
begin
{Вычислить значение y.}
y:=exp ( sin ( x ) ) * cos ( x );
{Вывод на экран пары х и y.}
writeln ( ’ x= ’, x, ’ y= ’, y );
{Изменение параметра цикла – переход к следующему значению x.}
x:=x + 0.1;
end; {Конец цикла.}
end.
В результате работы данного фрагмента программы на экран последовательно будут выводиться сообщения со значениями переменных x и y:
x= 0.1; y =1.0995
…
x= 3.1; y= -1.0415
3.5.2 Оператор цикла с постусловием repeat..until
Если в цикле с предусловием проверка условия осуществляется до тела цикла, то в цикле с постусловием условие проверяется после тела цикла (см. рис. 3.25). Сначала выполняются операторы, являющиеся телом цикла, после чего проверятся условие, если последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если условие станет истинным.
В языке Free Pascal цикл с постусловием реализован конструкцией
оператор;
until выражение;
или, если тело цикла состоит более чем из одного оператора
оператор_1;
оператор_2;
…
оператор_N;
until выражение;
Выражение должно быть логическим.
Работает цикл следующим образом. В начале выполняется оператор, представляющий собой тело цикла. Затем вычисляется значение выражения. Если оно ложно (False), оператор тела цикла выполняется ещё раз. В противном случае цикл завершается, и управление передается оператору, следующему за циклом.
Таким образом, нетрудно заметить, что цикл с постусловием всегда будет выполнен хотя бы один раз, в отличие от цикла с предусловием, который может не выполниться ни разу.
Если применить цикл с постусловием для создания подпрограммы, которая выводит значения функции на отрезке с шагом 0.1, получим:
begin
{Присваивание параметру цикла стартового значения.}
x : = 0;
{Цикл с постусловием.}
repeat {Начало цикла}
y:=exp ( sin ( x ) ) * cos ( x );
writeln ( ’ x= ’, x, ’ y= ’, y );
x:=x + 0.1; {Изменение значения параметра цикла.}
until x > pi; {Закончить работу цикла,}
{когда параметр превысит конечное значение.}
end.
Источник
Урок из серии: «Язык программирования Паскаль»
На предыдущем уроке было показано, как использовать оператор цикла с параметром For.
В этом уроке Вы познакомитесь с операторами цикла с условием.
Операторы цикла с условием используются тогда, когда число повторений тела цикла заранее неизвестно, а задано лишь условие повторения (или окончания) цикла.
Оператор цикла с условием содержит две части: условие и тело цикла. В зависимости от их взаимного расположения, различают две разновидности циклов с условием: циклы с предусловием и циклы с постусловием.
В языке программирования Паскаль для организации циклов с условием используются операторы While и Repeat.
Оператор цикла с предусловием While
Оператор while (пока) называют оператором цикла с предусловием за то, что проверка условия выполнения тела цикла производится в самом начале оператора, до операторов тела цикла. Если условие изначально не выполнится, то операторы тела цикла не выполнятся ни разу.
Формат оператора:
begin
<тело цикла>;
end;
Здесь:
<условие выполнения цикла> – булевское выражение;
<тело цикла> – операторы, которые будут повторяться.
На русском языке это звучит примерно так:
пока выполняется условие делай
начало
<тело цикла>
конец
Алгоритм выполнения оператора:
- Проверяется условие выполнения цикла (вычисляется булевское выражение).
- Если условие выполняется (значение выражения равно true), то выполняются операторы, составляющие тело цикла.
- Если условие не выполняется (значение выражения равно false), то происходит выход из цикла и переход к первому после while оператора.
При использовании цикла с предусловием надо помнить следующее:
- Начальное значение переменной цикла нужно присвоить до начала выполнения цикла.
- Условие продолжения цикла должно зависеть от значения переменной цикла.
- Переменная цикла должна изменяться при каждом новом выполнении цикла, иначе цикл будет повторяться бесконечное число раз.
Пример. Составить программу для нахождения суммы 10 произвольных чисел, введенных с клавиатуры.
var
k: byte;
x, sum:real;
begin
k:=0; {Счетчик чисел}
sum := 0; {Сумма чисел}
while (k < 10) do {Условие выполнения цикла}
begin
k:= k+1;
write(‘Введите ‘,k , ‘-е число: ‘);
readln(x); {Ввод очередного числа с клавиатуры}
sum := sum + x;
end;
writeln(‘Сумма введенных чисел равна ‘, sum);
end.
В данном примере перед циклом обнуляются значение счетчика введенных чисел k и их суммы sum.
В начале оператора while проверяется условие k < 10.
Если условие верно, то выполняется составной оператор в теле цикла. В этом операторе вводится значение очередного числа, и на это значение увеличивается значение суммы. После этого управление в программе вновь передается оператору цикла while, опять проверяется условие k < 10.
Как только значение станет равно 10, выполнение цикла завершиться, а управление будет передано на оператор, находящийся за словом end, т. е. первый оператор за границей while.
Оператор цикла с постусловием repeat
Оператор цикла repeat аналогичен оператору while, но отличается от него, во-первых, тем, что условие проверяется после очередного выполнения тела цикла (за это и называется циклом с постусловием) и таким образом гарантируется хотя бы однократное выполнение цикла, а во-вторых, тем, что выполнение условия (равенство булевского выражения константе true) является критерием не повторения, а прекращения цикла.
Формат оператора:
<оператор 1> ;
<оператор 2> ;
. . .
<оператор n>;
Until <условие окончания цикла>;
где Repeat (повторять), until (до тех пор).
Обратите внимание на то, что данный оператор цикла предполагает несколько операторов в теле цикла, поэтому операторные скобки begin и end не нужны.
Алгоритм выполнения:
- Выполняется тело цикла (операторы, заключенные между словами repeat / until).
- Проверяется условие выхода из цикла.
- Если условие выполняется, то происходит выход из цикла к первому после repeat оператору.
- Если условие не выполняется, то алгоритм повторяется с пункта 1.
Пример. Составить программу, которая будет вводить и суммировать любое количество чисел. Если будет введено число 999, на экран вывести результат суммирования.
Для решения этой задачи сначало нужно ввести число, а потом проверить его значение (проверить условие выхода из цикла). Для этого нужен цикл с постусловием.
Формат оператора:
var
x, sum:real;
begin
sum := 0; {Сумма чисел}
x:=0; {Очередное число}
repeat {Повторять}
sum := sum + x;
write(‘Введите очередное число: ‘);
readln(x);
until x=999; {Условие окончания цикла}
writeln(‘Сумма введенных чисел равна ‘, sum);
end.
Коротко о главном
1. Операторы While Repeat используют в тех случаях, когда заранее неизвестно число повторений тела цикла или шаг отличен от 1.
2. При организации циклов с проверкой условия обязательно нужно указать:
- начальное значение параметра цикла;
- условие, при котором действия должны выполняться;
- приращение параметра цикла.
На следующем уроке рассмотрим применение циклов в задачах на целочисленную арифметику.
Проверь себя!
Следующий урок: Циклы и целочисленная арифметика.
Источник