|
Хочу получить удостоверение. Сколько стоит оплата? |
Оператор итерационного цикла for
Оператор итерационного цикла 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