Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 3:

Операторы управления

3.4.2 Оператор цикла с постусловием

В цикле с предусловием предварительной проверкой определяется, выполнять тело цикла или нет, до первой итерации. Если это не соответствует логике алгоритма, то можно использовать цикл с постусловием. На рис. 3.21 видно, что в этом цикле проверяется, делать или нет очередную итерацию, лишь после завершения предыдущей. Это имеет принципиальное значение лишь на первом шаге, а далее циклы ведут себя идентично.

Алгоритм циклической структуры с постусловием

Рис. 3.21. Алгоритм циклической структуры с постусловием

В С++ цикл с постусловием реализован конструкцией

do оператор while (условие);
			

здесь условие — логическое или целочисленное выражение, оператор — любой оператор языка С(С++). Если тело цикла состоит более чем из одного оператора:

do
{
	оператор_1;
	оператор_2;
	...
	оператор_n;
}
while (условие);
			

Работает цикл следующим образом. В начале выполняется оператор, представляющий собой тело цикла. Затем вычисляется условие. Если оно истинно (не равно нулю), оператор тела цикла выполняется ещё раз. В противном случае цикл завершается, и управление передаётся оператору, следующему за циклом.

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

Если применить цикл с постусловием для создания программы, которая выводит таблицу значений функции y=e^{\sin (x)}\cos(x) на отрезке [0; π] с шагом 0.1, получим:

#include <iostream>
#include <stdio.h>
#include <math.h>
#define PI 3.14159
using namespace std;
int main ( )
{
	float x, y; //Описание переменных
	x=0; //Присваивание параметру цикла стартового значения
	do //Цикл с постусловием
	{ //Выполнять тело цикла
	y=exp ( sin ( x ) ) * cos ( x );
	printf ( " \t x =%5.2 f \t y =%5.4 f \n ",x, y );
	x+=0.1; //Изменение параметра цикла
}
while (x<=PI ); //пока параметр цикла не превышает конечное значение
return 0;
}
			

Результаты работы этой программы будут такими.

3.4.3 Оператор цикла for с параметром

Кроме того, в С++ предусмотрен цикл for с параметром:

for (начальные_присваивания;условие;последействие)
оператор;
			

где начальные_присваивания — оператор или группа операторов, разделённых запятой4Запятая в С++ это операция последовательного выполнения операторов, применяются для присвоения начальных значений величинам, используемым в цикле, в том числе параметру цикла, и выполняются один раз в начале цикла; условие — целое или логическое выражение, которое определяет условие входа в цикл, если условие истинно (не равно нулю), то цикл выполняется; последействие — оператор или группа операторов, разделённых запятой, которые выполняются после каждой итерации и служат для изменения параметра цикла; оператор — любой оператор языка, представляющий собой тело цикла. Последействие или оператор должны влиять на условие, иначе цикл никогда не закончится. Начальные_присваивания, выражение или последействие в записи оператора for могут отсутствовать, но при этом "точки с запятой" должны оставаться на своих местах. Опишем алгоритм работы цикла for:

  1. Выполняются начальные_присваивания.
  2. Вычисляется условие, если оно не равно 0 (true), то выполняется переход к п.3. В противном случае выполнение цикла завершается.
  3. Выполняется оператор.
  4. Выполняется оператор последействие и осуществляется переход к п.2, опять вычисляется значение выражения и т.д.

Понятно, что этот алгоритм представляет собой цикл с предусловием (рис. 3.22).

Алгоритм работы цикла с параметром

Рис. 3.22. Алгоритм работы цикла с параметром

В дальнейшем, чтобы избежать создания слишком громоздких алгоритмов, в блок-схемах цикл for будем изображать, так как показано на рис. 3.23.

В случае если тело цикла состоит более чем из одного оператора, необходимо использовать составной оператор:

for (начальные_присваивания; условие; последействие)
{
	оператор_1;
	...
	оператор_n;
}
			

Применение цикла for рассмотрим на примере печати таблицы значений функции y=e^{\sin (x)}\cos (x) на отрезке [0;π] с шагом 0.1:

#include <stdio.h>
#include <math.h>
#define PI 3.14159
using namespace std;
int main ( )
{
	float x, y;
	//Параметру цикла присваивается начальное значение, если оно не превышает конечное значение,
	//то выполняются операторы тела цикла и значение параметра изменяется, в противном случае
	//цикл заканчивается.
	for ( x=0;x<=PI; x+=0.1)
	{
	y=exp ( sin ( x ) ) * cos ( x );
	printf ( " \t x =%5.2 f \t y =%5.4 f \n ", x, y );
	}
return 0;
}
			
Блок-схема цикла с параметром

Рис. 3.23. Блок-схема цикла с параметром

Программный код выдаст результат.

3.4.4 Операторы передачи управления

Операторы передачи управления принудительно изменяют порядок выполнения команд. В С++ таких операторов четыре: goto, break, continue и return.

Оператор goto метка, где метка обычный идентификатор, применяют для безусловного перехода, он передаёт управление оператору с меткой: метка: оператор;5Обычно применение оператора goto приводит к усложнению программы и затрудняет от-ладку. Он нарушает принцип структурного программирования, согласно которому все блоки, составляющие программу, должны иметь только один вход и один выход. В большинстве ал-горитмов применения этого оператора можно избежать.

Оператор break осуществляет немедленный выход из циклов while, do... while и for, а так же из оператора выбора switch. Управление передаётся оператору, находящемуся непосредственно за циклом или оператором выбора.

Оператор continue начинает новую итерацию цикла, даже если предыдущая не была завершена.

Оператор return выражение завершает выполнение функции и передаёт управление в точку её вызова. Если функция возвращает значение типа void, то выражение в записи оператора отсутствует. В противном случае выражение должно иметь скалярный тип.

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?