Формат цикла с постусловием
Здравствуйте, дорогие читатели! Вот мы с вами и подошли к изучению циклов. Циклы в Паскаль. Что это такое? Как этим пользоваться? Для чего они нужны? Именно на эти вопросы я сегодня и отвечу.
Если вы читали этот урок, то знаете, что существует три вида алгоритмов: линейный, разветвляющийся и циклический. Мы с вами уже знаем, как реализовывать линейные и разветвляющиеся алгоритмы на Паскале. Приступим к изучению последнего типа алгоритмов.
В языке Pascal, как и в большинстве языков программирования, существует три типа циклических конструкций.
Любой цикл состоит из тела и заголовка. Тело цикла – это набор повторяющихся операторов, а условие – это логическое выражение, в зависимости от результата которого и происходит повторное выполнение цикла.
Возьмем одну задачу, которую будем решать, используя различные виды циклов.
Задача 1. Вывести все числа от 1 до числа, введенного с клавиатуры.
While, или цикл с предусловием
Как вы, наверное, уже поняли из названия, while – это цикл, в котором условие стоит перед телом. Причем тело цикла выполняется тогда и только тогда, когда условие true; как только условие становится false, выполнение цикла прекращается.
While имеет формат:
while < условие> do <оператор 1>; {Пока … делай ….}
Данный цикл подходит только для одного оператора, если же вы хотите использовать несколько операторов в своем коде, вам следует заключить их в операторные скобки – begin и end;.
Решение задачи.
program example_while; var i, N: integer; { объявляем переменные } begin i := 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } while i <= N do {Как только i станет больше N, цикл прекратится (можно было бы написать просто <, но пришлось бы добавлять 1 к N) } begin {Открываем операторные скобки} write(i, ‘ ‘); {Выводим i} Inc(i); {увеличиваем i на один.} end; { закрываем скобки } end.
Repeat, или цикл с постусловием
Repeat – полная противоположность while. Repeat – это цикл, в котором условие стоит после тела. Причем оно выполняется тогда и только тогда, когда результат условия false; как только логическое выражение становится true, выполнение цикла прекращается.
Repeat имеет формат:
repeat { повторяй … }
<оператор 1>;
< оператор 2>;
…
until {до…} <условие>
Begin и end не требуются.
Решение задачи.
program example_repeat; var i, N: integer;{ объявляем переменные } begin i := 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } repeat {после repeat не требуется begin и end } write(i, ‘ ‘); {Выводим i} Inc(i); {увеличиваем i на один.} until i = N + 1; {Например, i = 11, а N = 10. Цикл прекратится, так условие стало true.} end.
For, или цикл с параметром
For – это цикл, в котором тело выполняется заданное количество раз.
Существует две формы записи этого цикла:
Первая форма
for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик1> будет увеличиваться на 1.
<значение1> – это начальное значение счетчика. Это может быть переменная или число.
<конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.
Если требуется написать несколько операторов в теле цикла, используем begin и end.
И <счетчик1>, и <конечное_значение>, и <значение1> – переменные целого типа.
Чаще всего в качестве счетчика используется переменная i.
Вторая форма
for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик2> будет уменьшатся на 1.
<значение2> – это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.
Два важных примечания:
- Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
- Изменять значение счетчика внутри тела нельзя! Вот что выводит компилятор:
Решение задачи:
program example_for; var i, N: integer; begin read(N); {предположим, что мы ввели 10} for i := 1 to N do write(i, ‘ ‘); {количество итераций – 10 – 1 + 1 = 10} end.
Согласитесь, данный код проще и лаконичнее, чем все предыдущие. И цикл for – не совсем обычный цикл, в нем нет логического условия. Поэтому цикл с параметром в программировании называют синтаксическим сахаром. Синтаксический сахар – это дополнения синтаксиса языка программирования, которые не добавляют новых возможностей, а делают использование языка более удобным для человека.
Давайте решим пару задач.
For1. Даны целые числа K и N (N > 0). Вывести N раз число K.
Организовываем простой цикл от 1 до требуемого числа.
program for1; var K, N, i: integer; begin read(K, N); for i := 1 to N do write(K, ‘ ‘); {Пишем К через пробел } end.
For2. Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (включая сами числа A и B), а также количество N этих чисел.
Так как A < B, то цикл должен будет выводить все числа от А до B. Чтобы сосчитать количество чисел, используем формулу: <конечное_значение> – <начальное_значение> + 1.
program for2; var A, B, i, count: integer; begin read(A, B); for i := A to B do write(i, ‘ ‘); {выписываем числа от меньшего к большему} count := B – A + 1; {считаем количество чисел} writeln; write( ‘Количество чисел – ‘, count); end.
For9. Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.
Организовываем такой же цикл, как и в предыдущей задаче, но одновременно суммируем квадраты всех чисел. Чтобы высчитать квадрат, используем функцию Sqr.
program for9; var A, B, i, S: integer; begin read(A, B); S := 0; {PascalABC делает это автоматически, но если у вас другой компилятор советуем обнулять переменные вручную} for i := A to B do S := S + Sqr(i); {складываем все квадраты} writeln; write( ‘Сумма квадратов – ‘, S); end.
For13°. Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.
Для того, чтобы поменять знак, каждую итерацию цикла меняем значение специальной переменной на противоположное.
program for13; var N, A, i: integer; S: real; begin Write(‘N = ‘); readln(N); S := 1.1; A := 1; {Сначала положительное} for i := 2 to N do {первую итерацию цикла мы уже произвели, поэтому начинаем отсчет с 2} begin A := -A; {Теперь отрицательное} S := S + A * (1 + i / 10); {Складываем} end; Writeln(S:5:1); {Отдадим под дробную часть одно знакоместо} end.
While1°. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.
Каждый раз вычитаем B из А, пока А – В >= 0.
program while1; var A, B: integer; begin readln(A, B); while (A – B) >= 0 do A := A – B; {Пока разница положительная, вычитаем. Необходимо предусмотреть вариант с кратностью А и B, поэтому >=} write(A); end.
While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является – вывести False.
Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 – число является степенью тройки; если N <> 1, тогда число – не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое div и mod, и как работают логические выражения.
program while4; var N: integer; begin readln(N); while N mod 3 = 0 do N := N div 3; {Пока остаток от деления на три равен нулю, делим N нацело } writeln(N = 1); {логическое выражение} end.
На сегодня все! Не забывайте почаще заходить на наш сайт и кликать по кнопочкам, которые расположены перед комментариями.
Источник
На занятии рассматривается цикл с постусловием в Паскаль Repeat и происходит знакомство со строковым типом данных
Основной задачей портала labs-org.ru является предоставление возможности получения навыков решения практических задач с использованием языка программирования Pascal. На основе решенных примеров и заданий по Паскалю, изложенных по мере увеличения их сложности, даже новичкам будет достаточно просто усвоить предоставленный материал.
Цикл с постусловием в Паскаль (repeat)
Пример: Ввести целое положительное число (n) и определить четное ли оно.
Проблема 1: Как избежать ввода отрицательного числа или нуля?
Решение 1: Если вводится неверное число, то нужно вернуться назад к вводу данных (цикл).
Проблема 2: Неизвестно, сколько шагов надо сделать.
Решение 2: Надо остановиться, когда n > 0, т.е. надо делать «до тех пор пока n не станет больше0».
- Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием)!.
- Цикл Repeat в Паскале используется для организации повторений (итераций) с заранее неизвестным их числом.
- Цикл повторяется до тех пор, пока не станет истинным некоторое условие.
repeat оператор1; оператор2; . . .; операторN until условие {до тех пор, пока условие не станет истинным}
Блок-схема решения примера:
Блок-схема решения примера
Решение на Паскале:
- Операторы образуют тело цикла и будут выполняться до тех пор, пока значение “условие” не станет равно true, т.е. не станет истинным.
- Условием может быть переменная или логическое выражение.
- Проверка условия осуществляется уже после первого прохождения операторов тела структуры, т.е. после первой итерации, т.о. цикл с постусловием в Паскаль обязательно выполнится хотя бы один раз, независимо от истинности условия.
Еще одно использование цикла Repeat рассмотрим на примере с решением.
Пример: Печатать «ноль» указанное количество раз
Показать решение:
1 2 3 4 5 6 7 8 9 10 | var i,n:integer; begin write (‘kolichestvo raz’); readln(n); i:=1; repeat write(0); i:=i+1 until i>n end. |
В решенной задаче оператор 8-й строки – это счетчик (i:=i+1), который просчитывает количество раз и одновременно является условием для выхода из цикла.
Задача 1. Написать программу решения задачи о печати чисел 3 5 7 9 11 13. Для решения задачи использовать цикл Repeat
Узнать о работе оператора с постусловием в Паскале можно также из видеоурока:
Строковый тип данных в Паскаль
Для решения следующей задачи нам пригодится работа со строковым типом данных.
Рассмотрим как объявляются строки в Паскале:
Объявление строковой переменной:
Присваивание значения строковой переменной:
str:=’вот такая вот строка’;
Пример использования строковых переменных в Паскале
1 2 3 4 5 6 7 | var str1,str2: string; begin str1:=’Привет, ‘; writeln(‘Ваше имя?’); readln(str2); writeln(str1,str2) end. |
Теперь снова возвращаемся к нашему циклу repeat.
Задача 2. Компьютер предлагает человеку ввести слово, после чего распечатывает это слово, снабдив его восклицательным знаком. Затем снова предлагает ввести слово и так до тех пор, пока человек не введет слово «Хватит». Распечатав его с восклицательным знаком, компьютер отвечает: «Хватит так хватит» и заканчивает работу. Для решения задачи использовать цикл с постусловием в Паскаль.
Дополнительно: Перед выводом каждого слова необходимо выводить его порядковый номер.
Источник
В Си существуют все три типа операторов цикла: цикл с предусловием, цикл с постусловием и цикл с параметром.
Цикл с предусловием. Формат оператора цикла с предусловием:
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 тип uned 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 нельзя входить внутрь цикла.
Источник
Циклы чрезвычайно важны в программирования на C++, да и в остальных языках. Начнем с теории.
Цикл – это повторение одного и того же участка кода в программе. Последовательность действий, которые повторяются, называют телом цикла. Один проход цикла – это шаг или итерация. Переменные, изменяющиеся внутри цикла и влияющие на его окончание, называются параметрами цикла.
В C++ предусмотрены три оператора, реализующих циклический процесс: while, do..while и for. Рассмотрим каждый из них.
Оператор с предусловием (while)
Он работает следующим образом. Вычисляется значение выражения. Если оно истинно, то выполняется оператор. В противном случае цикл заканчивается. Если состоит более чем из одного оператора, необходимо использовать составной оператор:
while условие
{
оператор_1;
оператор_2;
…
оператор_n;
}
Рассмотрим пример. Пусть нам необходимо составить программу, которая в зависимости от возраста пользователя определяла сколько лет ему осталось до выхода на пенсию. При условии, что пенсионный возраст наступает в 56 лет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include “stdafx.h” #include <iostream> using namespace std; int main () { int x, y, i, pen; //описаваем нужные переменные x=0; //стартовое значение переменной y=56; //определяем пенсионный возраст while (x<=3) //пока параметр цикла не превышает конечное значение. //выполнять тело цикла { cout<<“How old are you? n”; cin>>i; pen=y-i; cout<<“Remained until retirement (years) = “<<pen<<endl; x++; //изменение параметра цикла (аналогично x=x+1 (расмотрим в последующих уроках)) } system (“pause”); return 0; } |
Вот результат работы программы:
Цикл с постусловием (do…while)
Иногда возникает необходимость, чтобы тело цикла выполнилось хотя бы один раз, но условие не позволяет этому случится. Вот именно тут нам поможет цикл с постусловие do…while. Который реализован следующей конструкцией:
do оператор while (выражение);
Работает цикл следующим образом. В начале выполняется оператор, затем вычисляется значение выражения. Если оно истинно, оператор тела цикла выполняется еще раз.
Рассмотрим код на примере прошлой программы, изменив некоторые строки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include “stdafx.h” #include <iostream> using namespace std; int main () { int x, y, i, pen; //описаваем нужные переменные x=0; //стартовое значение переменной y=56; //определяем пенсионный возраст do { cout<<“How old are you? n”; cin>>i; pen=y-i; cout<<“Remained until retirement (years) = “<<pen<<endl; x++; //изменение параметра цикла (аналогично x=x+1) } while (x<=-1); //условие ложно, но цикл выполняется 1 раз system (“pause”); return 0; } |
Цикл с параметром (for)
Данный цикл можно представить такой конструкцией;
for (начальные_присваивания; выражение; приращение) оператор;
Здесь начальные_присваивания – оператор или группа операторов, применяемые для присвоения начальных значений величинам используемым в цикле; выражение – определяет условие выполнения цикла, если оно истинно, то цикл выполняется; приращение – оператор, который выполняется после каждого шага (прохода) по телу цикла; оператор – любой оператор.
Давайте на примере задачи рассмотрим цикл с параметром. Нам необходимо посчитать сумму чисел от 1 до 500. Делаем:
#include “stdafx.h” #include <iostream> using namespace std; int main () { int i; //определяем переменную int sum = 0; for (i=1; i<=500; i=i+1) // задаем начальное значение, конечное 500, шаг цикла { sum = sum + i; } cout << “The sum of the numbers from 1 to 500 = ” <<sum<<endl; system (“pause”); return 0; } |
Ответ будет 125250.
Похожие записи:
- Матрицы в C++. Общие сведения
- Классы в C++. ООП. Конструктор
- C++. Функция-деструктор и массив экземпляров
- Первая визуальная программа на Visual C++. MFC
- Visual C++. Использование мыши в MFC приложениях
Источник