Цикл с постусловием (do while)

Цикл с постусловием реализует структурную схему, приведенную на рис. 4.1(б).

Синтаксис:

do

{

/ / Инструкции цикла (тело цикла)

}

while (УсловиеПовторения);

Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение УсловиеПовторения. Если оно истинно (не равно false), тело цикла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.

Тип выражения должен быть арифметическим или приводимым к нему.

Пример 2. Программа осуществляет проверку ввода.

Цикл с постусловием (do while) - student2.ru # 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

Цикл с предусловием (иначе цикл пока) имеет вид:

Форматы записи операторов алгоритма Блок-схема Форматы записи операторов на Паскале
Пока (условие) нц серия команд кц Цикл с постусловием (do while) - student2.ru while условие do begin серия команд; end;

где

условие – выражение логического типа.

Цикл может не выполняться ни разу, если значение логического выражения сразу же оказывается ложным.

Серия команд, находящихся между begin и end, выполняются до тех пор, пока условие истинно.

Для того чтобы цикл завершился, необходимо, чтобы последовательность инструкций между BEGIN и END изменяла значение переменных, входящих в условие.

Цикл с постусловием (иначе цикл до) имеет вид:

Форматы записи операторов алгоритма Блок-схема Форматы записи операторов на Паскале
В алгоритмическом языке нет команды которая могла бы описать данную структуру, но ее можно выразить с помощью других команд (Например, ветвления). Цикл с постусловием (do while) - student2.ru repeat серия команд until условие

где

условие – выражение логического типа.

Обратите внимание:

Последовательность инструкций между repeat и untilвсегда будет выполнено хотя бы один раз;

Для того чтобы цикл завершился, необходимо, чтобы последовательность операторов между repeat и until изменяла значения переменных, входящих в выражение условие.

Инструкция repeat, как и инструкция while, используется в программе, если надо провести некоторые повторяющиеся вычисления (цикл), однако число повторов заранее не известно и определяется самим ходом вычисления.

Цикл с параметром (иначе цикл для) имеет вид:

Форматы записи операторов алгоритма Блок-схема Форматы записи операторов на Паскале
Для i от а до b шаг h делай Нц Серия команд кц Цикл с постусловием (do while) - student2.ru 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

Составим алгоритм в виде блок-схемы.

Цикл с постусловием (do while) - student2.ru

Для проверки правильности алгоритма заполним трассировочную таблицу.

Шаг Операция Р 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.

Вычислить и вывести на экран значение заданной функции

Цикл с постусловием (do while) - student2.ru

t=2.2, xЄ[0.2;2], Δx=0.2.

Значение функции вычислять многократно при изменении аргумента в указанном диапазоне и с заданным шагом Δx. Организовать вывод значения аргумента и вычисленного значения функции в виде таблицы.

1. Блок-схема.

Цикл с постусловием (do while) - student2.ru

Текст программы.

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. Блок-схема.

Цикл с постусловием (do while) - student2.ru

Текст программы.

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. Блок-схема.

Цикл с постусловием (do while) - student2.ru

Текст программы.

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.

Вычислить:

Цикл с постусловием (do while) - student2.ru

При вычислении конечной суммы следует организовать цикл, в котором число повторений равно количеству слагаемых. Перед началом цикла переменную суммы обнуляют S:=0. Тело цикла должно содержать вычисления очередного слагаемого А и рекуррентного соотношения:

S:=S+A.

К переменной суммы S прибавляется переменная А, результат вычисления присваивается переменной S.

Вычисление произведения конечного числа элементов аналогично, начальному значению произведения присваивается значение единицы P:=1, а в рекуррентной формуле меняется знак:

P:=P*A.

При организации алгоритма необходимо помнить, что открытие циклов следует в порядке их очередности, начиная с самого внешнего, заканчивая самым внутренним циклом. Закрытие циклов, наоборот, начинают с самого внутреннего цикла, заканчивают самым внешним циклом.

Обозначим результаты вычисления произведения по параметру i - через P1, результат вычисления суммы по параметру j - через S1, результат вычисления суммы по параметру k - через S2, результат произведения по параметру l-через P2.

Цикл с постусловием (do while) - student2.ru

Текст программы:

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= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
  Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
  Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
  Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru
Y= Цикл с постусловием (do while) - student2.ru Цикл с постусловием (do while) - student2.ru

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

1. Перечислите операторы циклов, используемых в языках ТР и Си/С++.

2. В чем разница между операторами типа «пока» и «до»?

3. Запишите общую структуру оператора цикла.

4. В каких случаях предпочтительно использовать для организации циклов оператор повтора for?

5. Формат записи и блок-схема оператора for.

6. К какому типу данных принадлежат параметр цикла, его начальное и конечное значение?

7. Что такое вложенные циклы? Какие циклы называются внешними и внутренними?

Лабораторная работа № 5

Наши рекомендации