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