Опубликован: 10.12.2015 | Уровень: для всех | Доступ: платный
Лекция 6:

Оператор итерационного цикла for

< Лекция 5 || Лекция 6 || Лекция 7 >
Ключевые слова: метка

Оператор итерационного цикла for имеет следующий синтакис:

for (инициализация цикла; выражение-условие;список выражений)
{
тело_цикла
}

тело_цикла либо отдельный оператор, который всегда завершается точкой с запятой, либо составной оператор (заключаются в фигурные скобки), выражение-условие – это чаще всего арифметическое выражение, определяющее условие продолжения выполнения итераций (если его значение не равно нулю). Инициализация_цикла в цикле for всегда завершается точкой с запятой, т.е. отделяется этим разделителем от последующего выражения-условия, которое также завершается точкой с запятой. Даже при отсутствии инициализации_цикла и выражения-условия в цикле for символы "точка с запятой" всегда присутствуют. Список_выражений (в цикле for) - последовательность скалярных выражений, разделенных запятыми.

В приведенном ниже примере вычисляется тройной интеграл функции x2+y2+z2. Генератор случайных чисел определяется в библиотеке специальных функций stdlib.h.

//==========================================================
// Name        : monte_carlo_integral.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
//В этой программе рассчитывается тройной интеграл методом Монте-Карло
//f(x,y,z)=x^2+y^2+z^2

#include <iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;

int main() {
	double x_lower,x_upper;//Верхний и нижний пределы интегрирования по оси OX
	double y_lower,y_upper;//Верхний и нижний пределы интегрирования по оси OY
	double z_lower,z_upper;//Верхний и нижний пределы интегрирования по оси OZ
	int n;       //Количество испытаний

cout<<"\nInput upper integrating level on OX axes, please ";
cin>>x_upper;
cout<<"\nInput lower integrating level on OX axes, please ";
cin>>x_lower;

	double x5=x_upper-x_lower;

cout<<"\nInput upper integrating level on OY axes, please ";
cin>>y_upper;
cout<<"\nInput lower integrating level on OY axes, please ";
cin>>y_lower;

	double y5=y_upper-y_lower;

cout<<"\nInput upper integrating level on OZ axes, please ";
cin>>z_upper;
cout<<"\nInput lower integrating level on OZ axes, please ";
	cin>>z_lower;

	cout<<"\nInput number of tests, please ";
	cin>>n;

	double z5=z_upper-z_lower;

	double v=x5*y5*z5;

	double s=0;

	for(int i=0;i<n;i++)
	{
double x = (double)(rand()/((double)RAND_MAX+1)*x5)+x_lower;
double y = (double)(rand()/((double)RAND_MAX+1)*y5)+y_lower;
double z = (double)(rand()/((double)RAND_MAX+1)*z5)+z_lower;
double f=pow(x,2)+pow(y,2)+pow(z,2);
	s+=f;
	}

	double integral = (s*v)/n;

	cout<<"\nIntegral value is "<<integral<<endl;
	return 0;
}

Результат:

Input upper integrating level on OX axes, please 1
Input lower integrating level on OX axes, please 0
Input upper integrating level on OY axes, please 1
Input lower integrating level on OY axes, please 0
Input upper integrating level on OZ axes, please 1
Input lower integrating level on OZ axes, please 0
Input number of tests, please 1000
Integral value is 1.00048

Иногда бывает необходимо изменить естественный ход работы циклов. Для этих целей существуют операторы передачи управления (break, goto и continue).

Оператор безусловного перехода goto

Этой оператор организует переход на строку с так называемой меткой (произвольно выбранный идентификатор).

//==========================================================
// Name        : label.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	goto label_2;

	label_1: cout<<"\nbecause it's a bad programming style";

	goto label_3;

	label_2: cout<<"\nDon't use goto operators frequently";

	goto label_1;

	label_3: cout<<"\nGood buy!"<<endl;
	return 0;
}

Результат:

Don't use goto operators frequently
because it's a bad programming style
Good buy!

В программе, показанной ниже, оператор goto передает управление оператору, стоящему за меткой alpha при достижении переменной i величины, превышающей m.

//==========================================================
// Name        : loop_goto.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	int n=10;
	int m=4;

	int s=0;

	for(int i=0;i<n;i++)
	{
	s+=i; //Сумма членов ряда
	if (i>m) goto alpha;

	}

	alpha: cout<<"\ns = "<<s;//Метка
	cout<<"\nGood buy!"<<endl;
	return 0;
}

Результат:

s = 15
Good buy!

Оператор break

Оператор break отличается от goto тем, что управление передается не на конкретную метку, а на первый оператор, стоящий после цикла.

//==========================================================
// Name        : loop_break.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;

int main() {
	int t=1;
	int s=0;

	while (t<10)
	{
	s+=t;
	if (s>20) break;
	t++;
	}

	cout<<"\nsum = "<<s<<endl;
	return 0;
}

Результат:

sum = 21

Использование оператора break в переключателях (switch) уже рассматривалось выше.

Оператор continue

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

//==========================================================
// Name        : continue.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	int i, n;
	cout<<"\nInput Aray size = ";
	cin>>n;
	double s=0;
	int k=0;
	double x[100];
	double d;
	for(int i=0;i<n;i++)
	{
	cout<<"\nInput x["<<i+1<<"]= ";
	cin>>x[i];
	}
	for(i=0;i<n;i++)
	{
	if (x[i]<0)continue;
	//Отрицательные значения пропускаются
	k++;//Количество положительных элементов
	s+=+x[i];//Сумма положительных элементов
	}
	if (k>0) d=s/k;//Среднее значение

	cout<<"\nSum of positive values = "<<s;
	cout<<"\nAverage values = "<<d<<endl;
	return 0;
}

Результат:

Input array size = 5
Input x[1] = -4
Input x[2] = 2.3
Input x[3] = -8
Input x[4] = 2.3
Input x[5] = 0.65
Sum of positive values = 5.25
Average values = 1.75

Во втором примере расчитывается число π методом Монте-Карло.

//==========================================================
// Name        : monte_carlo.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
#include<stdlib.h>//Здесь располагается прототип функции генератора случайных чисел
#include<math.h>  //Здесь располагается прототипы математических функций

int main() {
	double x,y;//Обцисса и ордината точек

	int s;     //Число удачных выстрелов
	int n;     //Число выстрелов по мишени
	double pi; //Площадь четвертинки окружности
	int N=1;   //Интервал генерации случайных чисел

	cout<<"\nInput number of tests ";
	cin>>n;
	s=0;

	for(int i=0;i<n;i++)
	{
		x = (double)(rand()/((double)RAND_MAX+1)*N);
		y = (double)(rand()/((double)RAND_MAX+1)*N);
		//Пропускаются выстрелы, не попавшие в окружность
		if(pow(x,2)+pow(y,2)>1) continue;
		s++;
	}

	double w=4*s;
	pi=w/n;

	cout<<"\nPi = "<<pi<<endl;
	return 0;
}
 

Результат:

Input number of tests 10000000
Pi = 3.14113

Функция exit()

Иногда при выполнении определенных условий требуется остановить выполнение программы (например, при делении на ноль, отрицательных значениях квадратного корня и т.д.). Для этих целей служит функция exit(). Прототип этой функции находится в библиотеке stdlib.h. Ниже приводится пример решении квадратного уравнения, в котором при отрицательном дескриминанте программа завершает свою работу.

//==========================================================
// Name        : sqrt_exit.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;
#include<stdlib.h>//Здесь описывается функция exit()
#include<math.h>  //Математическая библиотека
//Решение квадратного уравнения

int main() {
	double a,b,c;
	cout<<"\nInput a = ";
	cin>>a;
	cout<<"\nInput b = ";
	cin>>b;
	cout<<"\nInput c = ";
	cin>>c;

	double d = pow(b,2) - 4*a*c;

if (d<0) {cout<<"\nThere are no real roots"<<endl; exit(1);}

	double x1=(-b+sqrt(d))/(2*a);
	double x2=(-b-sqrt(d))/(2*a);

	cout<<"\nx1 = "<<x1<<", "<<"x2 = "<<x2<<endl;
	return 0;
}

Результат:

Input a = -2
Input b = 3
Input c = 1
x1 = -0.116025, x2 = 1.61603
< Лекция 5 || Лекция 6 || Лекция 7 >
Зося Ковалева
Зося Ковалева

Хочу получить удостоверение. Сколько стоит оплата?

Aleksey Aplaev
Aleksey Aplaev
Россия, Chelybinsk
Александр Сидоров
Александр Сидоров
Россия, Самара