Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2021 / OIT_lek_sem_15_09_2021

.docx
Скачиваний:
1
Добавлен:
14.12.2023
Размер:
35.81 Кб
Скачать

4.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.

21

Соседние файлы в папке Лекции 2021