Цикл с постусловием (do while)
Цикл с постусловием реализует структурную схему, приведенную на рис. 4.1(б).
Синтаксис:
do
{
/ / Инструкции цикла (тело цикла)
}
while (УсловиеПовторения);
Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение УсловиеПовторения. Если оно истинно (не равно false), тело цикла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.
Тип выражения должен быть арифметическим или приводимым к нему.
Пример 2. Программа осуществляет проверку ввода.
# include <iostream.h> # include <math.h> # include <conio.h> void main (){ clrscr(); char answer; do { cout <<"Kypi clona!"; cin >>answer;} while (answer !='y') ; } |
Цикл с параметром (for)
Синтаксис:
for (Инициализация; УсловиеВыполнения; Изменение)
{
// Здесь инструкции цикла (тело цикла)
}
Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой (операцией «последовательное выполнение»), например, так:
for (int 1 = 0, j = 2; …
int к, m;
for (k = 1, m = 0; …
Областью действия переменных, объявленных в части инициализации цикла, является цикл. Инициализация выполняется один раз в начале исполнения цикла.
Выражение УсловиеВыполнения определяет условие выполнения цикла: если его результат, приведенный к типу bool (логический), равен true, цикл выполняется.
Цикл с параметром реализован как цикл с предусловием. Сам оператор for - это оператор цикла, обобщающий оператор while. Так же, как и в случае оператора while, тело цикла может состоять из одного оператора или из группы операторов, заключенных в фигурные скобки. Инициализирующая и реинициализирующая части могут быть любыми отдельными выражениями.
Выбор между операторами while и for произволен и основывается на том, что выглядит яснее. Оператор for обычно удобен для циклов, в которых инициализация и реинициализация логически связаны и каждая задается одним оператором, так как в этом случае запись более компактна, чем при использовании оператора while, а операторы управления циклом сосредотачиваются вместе в одном месте.
Изменение (модификация) выполняется после каждой итерации цикла и служит обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую. Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!).
Пример 3. Реализовать задачу из примера 1 через цикл for.
# include <iostream.h>
# include <math.h>
# include <conio.h>
void main (){
clrscr();
float n,k,d,i;
cout <<"VVedite nachalo, konec i shag izmeneniy ";
cin >> n>>k>>d;
for (i=n; i<=k; i+=d) {
cout<<" "<< (pow(i,2)+1);
}
getch();
}
Любой цикл while может быть приведен к эквивалентному ему циклу for и наоборот по следующей схеме:
for (i; j; k) оператор i;
while (j){
оператор;
k;}
Часто встречающиеся ошибки при программировании циклов — использование в теле цикла неинициализированных переменных и неверная запись условия выхода из цикла.
Чтобы избежать ошибок, рекомендуется:
• проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);
• проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;
• предусмотреть аварийный выход из цикла по достижению некоторого количества;
• и, конечно, не забывать о том, что если в теле цикла требуется выполнить более одного оператора, нужно заключать их в фигурные скобки.
Операторы цикла взаимозаменяемы, но можно привести некоторые рекомендации по выбору наилучшего в каждом конкретном случае.
Оператор do while обычно используется для организации приближенных вычислений, в задачах поиска и обработки данных, вводимых с клавиатуры или из файла.
· Число повторений инструкций цикла do while определяется ходом выполнения программы;
· инструкции цикла do while выполняются до тех пор, пока значение выражения, записанного после слова while,не станет равным нулю;
· после слова whileнадо записывать условие выполнения инструкций цикла;
· для завершения цикла do whileв теле цикла обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла;
· цикл do while— это цикл с постусловием, т. е. инструкции тела цикла будут выполнены хотя бы один раз.
Оператором while удобнее пользоваться в случаях, когда число итераций заранее не известно, очевидных параметров цикла нет или модификацию параметров удобнее записывать не в конце тела цикла.
· инструкции цикла while выполняются до тех пор, пока значение выражения, записанного после слова while,не станет равным нулю;
· после слова whileнадо записывать условие выполнения инструкций цикла;
· для завершения цикла whileв теле цикла обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла;
· цикл while— это цикл с предусловием, т. е. возможна ситуация, при которой инструкции тела цикла ни разу не будут выполнены;
· цикл while,как правило, используется для организации приближенных вычислений, в задачах поиска и обработки данных, вводимых с клавиатуры или из файла.
Оператор for предпочтительнее в большинстве остальных случаев (однозначно — для организации циклов со счетчиками).
· инструкция for используется для организации циклов с фиксированным, известным во время разработки программы, числом повторений;
· количество повторений цикла определяется начальным значением переменной-счетчика и условием завершения цикла;
· переменная-счетчик должна быть целого (int) типа и может быть объявлена непосредственно в инструкции цикла.
Циклы в TPascal
Цикл с предусловием (иначе цикл пока) имеет вид:
Форматы записи операторов алгоритма | Блок-схема | Форматы записи операторов на Паскале |
Пока (условие) нц серия команд кц | while условие do begin серия команд; end; |
где
условие – выражение логического типа.
Цикл может не выполняться ни разу, если значение логического выражения сразу же оказывается ложным.
Серия команд, находящихся между begin и end, выполняются до тех пор, пока условие истинно.
Для того чтобы цикл завершился, необходимо, чтобы последовательность инструкций между BEGIN и END изменяла значение переменных, входящих в условие.
Цикл с постусловием (иначе цикл до) имеет вид:
Форматы записи операторов алгоритма | Блок-схема | Форматы записи операторов на Паскале |
В алгоритмическом языке нет команды которая могла бы описать данную структуру, но ее можно выразить с помощью других команд (Например, ветвления). | repeat серия команд until условие |
где
условие – выражение логического типа.
Обратите внимание:
Последовательность инструкций между repeat и untilвсегда будет выполнено хотя бы один раз;
Для того чтобы цикл завершился, необходимо, чтобы последовательность операторов между repeat и until изменяла значения переменных, входящих в выражение условие.
Инструкция repeat, как и инструкция while, используется в программе, если надо провести некоторые повторяющиеся вычисления (цикл), однако число повторов заранее не известно и определяется самим ходом вычисления.
Цикл с параметром (иначе цикл для) имеет вид:
Форматы записи операторов алгоритма | Блок-схема | Форматы записи операторов на Паскале |
Для i от а до b шаг h делай Нц Серия команд кц | h = +1 for i:= ato b do begin серия команд end; h = -1 for i:= b downto a do begin Cерия команд; end; |
где
i – параметр цикла;
a – начальное значение цикла;
b – конечное значение цикла;
h – шаг изменения параметра.
Структура данного цикла иначе называют циклом i раз.
Заголовок оператора повтора for определяет:
- диапазон изменения параметра цикла и число повторений тела цикла;
- направление изменения параметра цикла (возрастание (+1) for..to..do и убывания (-1) for..down to.. do) на единицу (шаг изменения параметра) при каждом повторе.
Эта команда выполняется таким образом: параметру i присваивается начальное значение а, сравнивается с конечным значением b и, если оно меньше или равно конечному значению b, выполняется серия команд. Параметру присваивается значение предыдущего, увеличенного на величину h – шага изменения параметра и вновь сравнивается с конечным значением b.
Если между begin и end находится только один оператор, то операторные скобки можно не писать. Это правило работает для цикла типа «Пока» и «Для».
Тело цикла может быть простым и составным оператором. Оператор for обеспечивает выполнения тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного.
Параметр цикла, его начальное и конечное значения должны принадлежать к одному и тому же типу данных. При этом допустим целый, символьный, булевский, перечислимый типы. Сам параметр должен быть описан совместно с прочими операторами.
Например:
Var
I:integer;{описание переменных цикла}
Begin
for I: = -3 to 3 do write (i); {-3 -2 – 1 0 1 2 3}
for I: = 3 down to –3 do write (i); {-3 -2 -1 0 1 2 3}
Начальное и конечное значения параметра цикла могут задаваться выражениями, например:
for j:= x+2 down to x-2 do
Begin
A:=j/2;
Write1n (a)
End;
Допустимо применять вложенные циклы, например:
for I: = 1 to 10 do
for j: = 1 to 5 do F [i,j] : = 0; {обнуление элементов матрицы}
Если телом цикла является циклическая структура, то такие циклы называются вложенными. Цикл, содержащий в теле цикла другой цикл, называется внешним циклом. Цикл, входящий в тело другого цикла называется внутренним циклом. Внутренние и внешние циклы могут быть трех видов: циклами с предусловием while, циклами с постусловиями repeat или циклами с параметром for.
Рассмотрим пример решения задач с использованием данных структур
Пример 4.
Вычислить произведение чисел от 1 до 5 используя различные варианты цикла
Математическая модель:
Р= 1· 2· 3· 4· 5=120
Составим алгоритм в виде блок-схемы.
Для проверки правильности алгоритма заполним трассировочную таблицу.
Шаг | Операция | Р | i | Проверка условия |
P:=1 | 1 | |||
i:=1; | 1 | 1 | ||
i<=5 P:=P*I i:=i+1 | 1 | 1 | 1<=5, да (истина) | |
i<=5 P:=P*I i:=i+1 | 2 | 2 | 2<=5, да (истина) | |
i<=5 P:=P*I i:=i+1 | 6 | 3 | 3<=5, да (истина) | |
i<=5 P:=P*I i:=i+1 | 24 | 4 | 4<=5, да (истина) | |
i<=5 P:=P*I i:=i+1 | 120 | 5 | 5<=5, да (истина) | |
i<=5 P:=P*I i:=i+1 | 6<=5, нет (ложь) |
Проверка условия происходит в несколько шагов: проверка условия и выполнение команд на одной из ветвей. Поэтому в трассировочной таблице записываются не команды алгоритма, а отдельные операции, выполняемые компьютером на каждом шаге.
Шаг первый: Р присваивается значение один.
Шаг второй: i присваивается значение один.
Шаг третий: при i равном единице проверяем условие один меньше или равен пяти, да, условие истинно, значит Р присваивается значение один умноженное на один, будет два. Для i: один плюс один, будет два.
Шаг четвертый:при i равном двум проверяем условие два меньше или равен пяти, да, условие истинно, значит Р присваивается значение 2 умноженное на один, будет 2. Для i: два плюс один, будет три.
Шаг пятый:при i равном трем проверяем условие три меньше или равен пяти, да, условие истинно, значит Р присваивается значение два умноженное на три, будет шесть. Для i: три плюс один, будет четыре.
Шаг шестой:при i равном четырем проверяем условие четыре меньше или равен пяти, да, условие истинно, значит Р присваивается значение шесть умноженное на четыре, будет двадцать четыре. Для i: четыре плюс один, будет пять.
Шаг седьмой:при i равном пяти проверяем условие пять меньше или равен пяти, да ,условие истинно, значит Р присваивается значение двадцать четыре умноженное на пять, будет сто двадцать. Для i: пять плюс один, будет шесть.
Шаг восьмой:при i равном шести проверяем условие шесть меньше или равен пяти, нет, условие ложно, тогда мы выходим из цикла, а в результате получаем последнее значение равное сто двадцати.
Program Pr1;
Var i: integer;
Begin
P:=1;
i:=1;
While i<=5 do
Begin
P:=P*i;
i:=i+1;
end;
Write (‘P=’, P);
End.
Пример 5.
Вычислить и вывести на экран значение заданной функции
t=2.2, xЄ[0.2;2], Δx=0.2.
Значение функции вычислять многократно при изменении аргумента в указанном диапазоне и с заданным шагом Δx. Организовать вывод значения аргумента и вычисленного значения функции в виде таблицы.
1. Блок-схема.
Текст программы.
Program Lab4_for;
Const dx=0.2;t=2.2;
Var x0,xk,z,x:real;
n,i:byte;
Begin
Writeln('Введите x0,xk');
Read(x0,xk);
Writeln('Таблица функции z(x)');
Writeln(' x y');
n:=trunc((xk-x0)/dx)+1;
x:=x0;
for i:=1 to n do
begin
If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)
else if x=0.5 then z:=sqrt(x+t)+1/x
else z:=cos(x)+t*(sqr(sin(x)));
Writeln(x:6:3,' ',z:6:3);
x:=x+dx;
end;
End.
2. Блок-схема.
Текст программы.
Program Lab4_repeat;
Const dx=0.2;t=2.2;
Var x0,xk,z,x:real;
Begin
Writeln(' Введите x0,xk');
Read(x0,xk);
Writeln('Таблица функции z(x)');
Writeln(' x y');
x:=x0;
Repeat
If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)
else if x=0.5 then z:=sqrt(x+t)+1/x
else z:=cos(x)+t*(sqr(sin(x)));
Writeln(x:6:3,' ',z:6:3);
x:=x+dx;
Until x>xk;
End.
3. Блок-схема.
Текст программы.
Program Lab4_while;
Const dx=0.2;t=2.2;
Var x0,xk,z,x:real;
Begin
Writeln(' Введите x0,xk');
Read(x0,xk);
Writeln(' Таблица функции z(x)');
Writeln(' x y');
x:=x0;
while x<=xk do
begin
If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)
else if x=0.5 then z:=sqrt(x+t)+1/x
else z:=cos(x)+t*(sqr(sin(x)));
Writeln(x:6:3,' ',z:6:3);
x:=x+dx;
end;
End.
Таблица функции z(x)
x y
0.200 -3.091
0.400 -1.606
0.600 1.527
0.800 1.829
1.000 2.098
1.200 2.273
1.400 2.306
1.600 2.169
1.800 1.859
2.000 1.403
Пример 6.
Вычислить:
При вычислении конечной суммы следует организовать цикл, в котором число повторений равно количеству слагаемых. Перед началом цикла переменную суммы обнуляют S:=0. Тело цикла должно содержать вычисления очередного слагаемого А и рекуррентного соотношения:
S:=S+A.
К переменной суммы S прибавляется переменная А, результат вычисления присваивается переменной S.
Вычисление произведения конечного числа элементов аналогично, начальному значению произведения присваивается значение единицы P:=1, а в рекуррентной формуле меняется знак:
P:=P*A.
При организации алгоритма необходимо помнить, что открытие циклов следует в порядке их очередности, начиная с самого внешнего, заканчивая самым внутренним циклом. Закрытие циклов, наоборот, начинают с самого внутреннего цикла, заканчивают самым внешним циклом.
Обозначим результаты вычисления произведения по параметру i - через P1, результат вычисления суммы по параметру j - через S1, результат вычисления суммы по параметру k - через S2, результат произведения по параметру l-через P2.
Текст программы:
program lab_4;
var
p1, s1, s2, p2: real; i, j, k, l: integer;
begin
p1:=1;
for i:=1 to 4 do
begin
s1:=0;
for j:=1 to 6 do
begin
s2:=0;
for k:=2 to 11 do s2:=s2+sqr(k);
p2:=1;
for l:=1 to 3 do p2:=p2*l;
p2:=sin(p2);
s1:=s1+i+j-sqrt(s2+p2);
end;
p1:=p1*(sqr(i)+s1);
end;
writeln (`s= `, p1:6:3);
end.
Методические рекомендации к выполнению лабораторной работы
Отчет к лабораторной работе оформляется в текстовом редакторе MS Word в формате А4 и должна содержать:
1. Цель работы.
2. Задание (3 задачи – на использование циклов «до», «пока» и «для»).
3. Графические схемы алгоритмов с учетом требований ГОСТ 19.701-90 (в редакторе Visio).
4. Программы на Тuгbо Раscаl и Си/С++.
5. Результаты выполнения работы.
ВАРИАНТЫ ЗАДАНИЙ
№ вар | Цикл типа «для» | Циклы типа «пока» и «до» выполняются по одному заданию. a, b, c – действительные числа. Значения a, b, c, Хнач, Хкон и dX ввести с клавиатуры |
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= | ||
Y= |
Контрольные вопросы
1. Перечислите операторы циклов, используемых в языках ТР и Си/С++.
2. В чем разница между операторами типа «пока» и «до»?
3. Запишите общую структуру оператора цикла.
4. В каких случаях предпочтительно использовать для организации циклов оператор повтора for?
5. Формат записи и блок-схема оператора for.
6. К какому типу данных принадлежат параметр цикла, его начальное и конечное значение?
7. Что такое вложенные циклы? Какие циклы называются внешними и внутренними?
Лабораторная работа № 5