Лекции 2021 / OIT_lek_sem_15_09_2021
.docx4.2. Оператор цикла for
Данная структура повторения оформляется следующим образом:
for (выражении 1; выражение 2; выражение 3) оператор;
Выражение 1 показывает начальное значение управляющей переменной, выражение 2 ‒ условие выполнения цикла, выражение 3 ‒ изменение управляющей переменной. Оператор (в том числе составной) ‒ это тело цикла.
Например,
for (i=1; i<=41; i++) {тело цикла;}
Выполнение происходит следующим образом: управляющей переменной i присваивается начальное значение 1, производится проверка условия i<=41 и, если оно истинно, выполняется тело цикла; значение i увеличивается на 1, производится проверка условия i<=41 и, если оно истинно, выполняется тело цикла; значение i снова увеличивается на 1 и т.д. При i=42 процесс заканчивается.
Рассмотрим пример 1 использования цикла типа for. Требуется составить программу для записи в массив pol положительных, а в массив otr отрицательных элементов массива x[10].
Пример 1.
#include "stdafx.h"
#include <iostream>
using namespace std;
// основная функция main
int main() {
int i, x[10];
for (i = 0; i < 10; i++) {
cout << "\nx[" << i << "]=";
cin >> x[i];
}// ввод элементов массива x с клавиатуры
int n, k, pol[10], otr[10];
k = n = 0;
for (i = 0; i < 10; i++)
if (x[i] > 0) {
pol[k] = x[i];
k++;
}
else {
otr[n] = x[i];
n++;
}// получение массивов pol и otr
// вывод элементов массива pol
cout << "\n pol";
cout << "\n";
for (i = 0; i < k; i++)
cout << "pol[" << i << "]=" << pol[i] << ' ';
// вывод элементов массива otr
cout << "\n otr";
cout << "\n";
for (i = 0; i < n; i++)
cout << "otr[" << i << "]=" << otr[i] << ' ';
return 0;
}// конец функции main
Ввод элементов массива x[10] с клавиатуры выполняется в цикле for, тело которого представлено двумя операторами:
cout<<"\nx["<<i<<"]="; ‒ вывод на экран с использованием управляющего символа \n (с новой строки) сопроводительной информации: x[0]=, x[1]= и т.д.;
cin>>x[i]; ‒ ввод значений массива x.
Ввод данных интерпретируется как извлечение из потока cin и присваивание значений переменным. Операция извлечения из стандартного потока оформляется знаком >>. Для работы с символьными потоками cin и cout в программе используется директива #include <iostream>.
Далее для получения массивов pol и otr организован новый цикл for с полным условным оператором в своем теле. В зависимости от значения условия x[i]>0 выполняется составной оператор:
{pol[k]=x[i]; k++;} ‒ формирование массива pol и увеличение на 1 счётчика положительных элементов k; или
{otr[n]=x[i]; n++;} ‒ формирование массива otr и увеличение на 1 счётчика отрицательных элементов n.
Для переменных k и n перед циклом выполнена обязательная инициализация k=n=0;.
Полученные массивы pol и otr выведены на экран каждый в своём цикле for.
Для вычислений с матрицей
Любые операции с таким массивом требуют организации в программе вложенных один в другой циклов. Внутренний цикл (по столбцам ‒ j) выполняется полностью для каждого из значений управляющей переменной внешнего цикла (по строкам ‒ i).
j=0 j=1 j=2
i=0 a00 a01 a02
i=1 a10 a11 a12
i=2 a20 a21 a22
Например, ввод матрицы с клавиатуры:
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
cin >> A[i][j];
}
Для нахождения в матрице элементов главной диагонали a00
a11
a22
в if можно включить проверку условия (i==j)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i==j) ………………
Для элементов на главной диагонали и выше a00 a01 a02
a11 a12
a22
в if можно включить проверку условия (i<=j)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i<=j) ………………
Или for (i = 0; i < n; i++)
for (j = i; j < n; j++)
Для элементов на главной диагонали и ниже a00
a10 a11
a20 a21 a22
for (i = 0; i < n; i++)
for (j = 0; j < i+1; j++)
Для нахождения в матрице элементов побочной диагонали
a02
a11
a20
в if можно включить проверку условия (i+j==n-1)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i+j==n-1) ………………
Для элементов на побочной диагонали и выше a00 a01 a02
a10 a11
a20
for (i = 0; i < n; i++)
for (j = 0; j < n-i; j++)
Для элементов на побочной диагонали и ниже a02
a11 a12
a20 a21 a22
for (i = 0; i < n; i++)
for (j = n-1-i; j < n; j++)
4.3. Оператор цикла while
Структура повторения while (пока) представляет собой цикл с предусловием:
while (выражение) оператор;
т.е. пока значение выражения отлично от нуля (истинно), выполняется оператор (в том числе составной).
Продемонстрируем циклическую структуру типа while на примере 2. Предлагается написать код программы для вычисления суммы компонентов бесконечного ряда с точностью до компонента ряда, меньшего eps:
Текущий компонент вычисляется по формуле:
,
где – предыдущий компонент.
Пример 2.
#include "stdafx.h"
#include <iostream>
using namespace std;
// основная функция main
void main() {
int n = 0;
float x, y, z, eps;
cout << "\n x,eps";
cout << "\n x=";
cin >> x;
cout << "\n eps=";
cin >> eps;
y = z = 1.0;
while (y >= eps) {
n += 1;
y = y*x / n;
z += y;
}
cout << "\n z=" << z;
}// конец функции main
Пока значение компонента ряда y остаётся больше или равно величины eps, выполняются три операции тела цикла:
n+=1; ‒ увеличение n на 1;
y=y*x/n; ‒ вычисление нового y как произведение;
z+=y; ‒ суммирование для z.
Переменные n, y, z проинициализированы до их использования в цикле (int n=0; y=z=1.0;).
4.4. Оператор цикла do/while
Структура повторения do/while (делай, пока):
do оператор; while (выражение);
отличается от предыдущей while (пока) тем, что сначала выполняется оператор (в том числе составной), а потом проверяется условие (значение выражения), поэтому первый цикл реализуется, даже если условие всегда ложно.
Рассмотрим пример 3 использования структуры do/while. В программе вычисляется факториал (m!). Переменная m объявлена как целочисленная. Когда значение m приближается к нескольким десяткам, m! уже не помещается даже в формат unsigned long. Поэтому расчёты ведутся в формате double. Переменная P, сохраняющая результат, описана типом double.
Пример 3.
#include "stdafx.h"
#include <iostream>
using namespace std;
// основная функция main
int main() {
int m; double P;
cout << "\n m=";
cin >> m;
if (m != 0) {
P = (double)m;// приведение типа
do {
--m; P *= m;} P=P*m;
while (m > 2);
}
else P = 1.0;
if (m < 0) cout << "m<0 ‒ error";
else
cout << "m!=" << P << endl;
return 0;
}// конец функции main
Оператор do/while участвует в структуре выбора if/else. Если значение m не равно нулю, тогда выполняется составной оператор, включающий две операции: присваивание переменной P значения m, приведённого к double, и цикл do/while; иначе ‒ простой оператор P=1.0; (0!=1 по определению). Если m отрицательное число, выводится сообщение об ошибке, в других случаях – значение переменной P.