Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_программирование_Часть3_управляющие стру...doc
Скачиваний:
4
Добавлен:
14.08.2019
Размер:
105.47 Кб
Скачать

Примеры смотри в пособии.

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

  • подготовка (инициализация параметров цикла);

  • выполнение вычислений цикла (тело цикла);

  • модификация параметров (которая фактически является частью тела цикла);

  • проверка условия окончания (или условия продолжения) цикла.

Порядок выполнения этих этапов может и меняться. Если условие проверяется до выполнения тела цикл, то говорят о цикле с предусловием. Если – после, то о цикле с постусловием. Главное отличие- цикл с постусловием обязательно выполнится хотя бы один раз.

На блок схеме циклы изображаются следующим образом

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

В С++ существует три конструкции цикла.

  • цикл с предусловием

while (выражение_условие)

тело_цикла;

  • цикл с постусловием

do

тело_цикла

while (выражение_условие)

  • цикл for

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

тело_цикла

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

Примеры смотри в пособии.

Конструкцию for чаще применяют для организации детерминированных циклов. А конструкции do и while чаще применяют для итерационных циклов. Хотя такое функциональное разделение довольно условно.

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

Примером индуктивной последовательности являются числа Фибоначчи, которые вычисляются по следующей формуле:

A1=A2=1, An=An-1+An-2, где n=3,4…

То есть последовательность чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21, 34, ….

Пример детерминированного цикла

// Вычисление k-го числа Фибоначчи

# include <iostream.h>

# include <conio.h>

void main ()

{

int k,a1=1,a2=1,a3;

cout<<"Enter k>2 ";

cin>>k;

for (int i=1; i<=(k-2);i++)

{

a3=a1+a2;

a1=a2;

a2=a3;

}

cout<<"\n"<<a3;

getch();

}

Итерационный цикл

// Определить сумма скольки чисел Фибоначчи не превосходит m(m>1)

# include <iostream.h>

# include <conio.h>

void main ()

{

int k=1,a1=1,a2=1,a3,m;

int sum=a1+a3;

cout<<"Enter m ";

cin>>m;

while (sum<m)

{

k++;

a3=a1+a2;

sum+=a3;

a1=a2;

a2=a3;

}

cout<<"\nk="<<k;

getch();

}

Основная проблема при организации циклов – возможность зацикливания – бесконечное повторение тела цикла.

Зацикливание может возникнуть по двум основным причинам:

  1. Неверно задано условие цикла

  2. Неверно в теле цикла меняются параметры, участвующие в условии цикла.

Например,

Задача посчитать сумму первых n натуральных чисел.

int i=1,sum=0,n;

while (i>n) {sum+=i; i++;}

cout<<sum;

Вероятнее всего цикл будет бесконечным, так как n – не инициализировано, и может принимать значение 0. Правильное условие (i<n), причем надо инициализировать n;

Задача посчитать сумму целых числе в диапозаоне [n, m] (n<m)

int n,m;

cin >>n>>m;

int i=n, sum=0;

while (i<=m) {sum+=i; i--;}

cout<<sum;

Цикл будет бесконечным, так как i все время уменьшается, а следовательно условие всегда будет верным. Правильно i++;

Рассмотрим еще примеры циклов.

Задача на детерминированный цикл.

Пример. Сформировать массив целых чисел X(N), элементами которого являются случайные числа в диапазоне [-20..20]. Найти максимальный элемент и его номер.

#include <iostream.h>

#include <stdlib.h>

#include <time.h>

void main ()

{

int a[100],n,max,imax;

cout<<"\nEnter n ";

cin >>n;

cout<<"\n";

randomize();// инициализация счетчика случайных чисел

for (int i=0;i<n;i++)

{

a[i]= random(41)-20; // генерируем массив случайных чисел

//в диапазоне [-20..20]

cout<<"a["<<i<<"]="<<a[i]<<"\n";

}

max=a[0];

for(int i=1;i<n;i++)

if (a[i]>max) {max=a[i]; imax=i;}

cout<< "\nmax = a["<<imax<<"]= "<<max;

}

Задача на итерационный цикл.

Дано натуральное число N. Подсчитать сумму его цифр.

# include <iostream.h>

void main()

{

long n,m;

cout << “Enter n”;

cin >> n;

m=n; // Сохранили значение исходного числа

int sum=0;

while (m>0)

{ sum+=m%10; m/=10;}

cout<< “sum = ”<< sum;

}

Задача на вложенные циклы.

Сформировать матрицу A(10,10) следующего вида

# include <iostream.h>

# include <iomanip.h>

void main ()

{ const int N=10;

static int a[N][N]; //статический массив инициализируется

//нулями

for (i=0; i<N; i++)

for (j=0; j<N; j++)

if (i>=j) a[i][j]=i-j+1 //условие попадания под главную

// диагональ

for (i=0; i<N; i++) // печать матрицы

{

for (j=0; j<N; j++) cout <<setw(3)<<a[i][j];//под каждый элемент отводится

//3 позиции, что обеспечивает

// красивый вывод матрицы

cout << “\n”;

}

}

Как видно из примеров основные три конструкции программирования (цепочка, ветвление, цикл) можно комбинировать произвольным образом, получая программы любой сложности.

Кроме конструкций следования, ветвления, мультиветвления и цикла, существует еще один блок конструкций, изменяющих активную точку выполнения программы – конструкции передачи управления.