Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ - С-С++методичка и титул.doc
Скачиваний:
12
Добавлен:
08.11.2019
Размер:
789.5 Кб
Скачать

Вложенные циклы и организация диалога в программе

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

Пример21.

Организовать диалог с пользователем и проверку исходных данных в задаче определения цифр младшего и старшего разрядов натурального числа N, вводимого пользователем.

Программа:

# include<stdio.h>

# include<conio.h>

void main ()

{ long N , n ; int mp, r ; // описание переменных

clrscr (); // очистка экрана

do { // внешний цикл диалога

do { // цикл контроля числа

printf (“Введите натуральное число:”);

scanf (“%ld”, &N); // ввод числа

} while (N<0); // повтор ввода, если N не натуральное

n = N; // текущее число

mp = n % 10; // младший разряд

while (n>9) // цикл до старшего разряда

n /=10; // деление числа нацело на 10

printf (“В числе %ld старший разряд =%d младший” “ разряд=%d”, N, n, mp);

printf (“Продолжить? Если нет- введите 0, иначе – любую” “ другую цифру”);

scanf (“%d”, &n); // ввод цифры для цикла диалога

} while (n); // условие для цикла диалога

}

В данном случае порядок организации внешнего цикла и вложенных циклов определен условиями задачи. В других задачах, когда циклы равноправны, их порядок определяется программистом.

Пример22.

Вычислить значения переменной y=sin(x)+b с параметрами циклов x = x0(hx)xk и b = b0(hb)bk, где x0, b0 – начальные значения, hx, hb – шаг изменения, xk, bk – конечные значения параметров циклов x и b. Здесь параметры циклов x и b равноправны, поэтому любой из них может быть внешним или вложенным. В данном примере логично использовать оператор цикла while, который проверяет необходимость выполнения цикла.

Программа:

# include<stdio.h>

#include<math.h>

#include<conio.h>

void main()

{ float y, x, x0, hx, xk, b, b0, hb, bk;

clrscr();

printf (“Введите x0, hx, xk, b0, hb, bk: ”);

scanf (“%f%f%f%f%f%f”, &x0, &hx, &xk, &b0, &hb, &bk);

x=x0; // начальное значение параметра x

while (x<=xk) // внешний цикл по x

{ b=b0; // начальное значение параметра b

while (b<=bk) // вложенный цикл по b

{ y = sin(x)+b; // оператор тела цикла

printf (“x=%f b=%f y=%f\n”, x, b, y); // вывод результатов

b += hb; // изменение параметра b

}

x += hx; // изменение параметра x

}

}

Оператор цикла с параметром (for)

Этот наиболее гибкий по своим возможностям оператор цикла имеет вид

for (инициатор; условие; модификатор) // заголовок цикла

оператор // тело цикла, где

for (для) – ключевое слово;

инициатор – одно или несколько выражений, задающих начальное значение переменным оператора цикла;

условие – выражение сравнимое с нулем, определяющее условие продолжения цикла;

модификатор – одно или несколько выражений, изменяющих переменные оператора цикла;

оператор (тело цикла) – одиночный, составной или пустой оператор, выполняющий действия в цикле.

Оператор for действует следующим образом.

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

  • Вычисляется выражение условия. Если его значение не равно 0 (истинно), то выполняется оператор (тело цикла), иначе при значении равном 0 (ложно) управление передается следующему оператору.

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

Существенно то, что условие цикла проверяется перед выполнением тела цикла. Это значит, что цикл может ни разу не выполниться, если условие сразу будет ложным, что аналогично действию оператора цикла while. Однако оператор for удобнее для восприятия, поскольку все три выражения, управляющие циклом, (инициализация, проверка и модификация параметра цикла) представлены в его заголовке, а не разнесены, как в операторе while.

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

Пример23.

Возможные варианты заголовков оператора цикла for.

  1. Вывод значений изменяющихся переменных: for (i=20, k=i; i > - 45; k += i, i -= 5) printf (“k=%d i=%d\n”, k, i);

  1. Получение величины переменной x с заданной точностью: for (x=d/2.0; fabs(x*x-d) > 0.01; x=(x+d/x)/2) /* тело цикла – пустой оператор, за которым стоит точка с запятой */ ;

  1. Оператор суммирует первые 10 ненулевых целых значений: for (c=1, sum=0; c <= 10; sum +=c, c++) ;

  1. Пустой оператор тела цикла можно использовать для организации задержки выполнения: for (i=0; i < 100000; i++) ; // заголовок цикла с пустым телом цикла

Прерывание выполнения оператора for может быть осуществлено с помощью операторов break (прервать), continue (продолжить), goto (перейти) аналогично их действию в операторе while. Во вложенных циклах оператор break прерывает самый внутренний, содержащий его цикл for; оператор continue передает управление на конец самого внутреннего тела цикла, в котором он находится, для продолжения итераций. Оператор goto из тела цикла оператора for любой глубины вложения передает управление любому оператору блока функции. Он используется для аварийного выхода из внутренних и любых циклов вообще. Рассмотрим примеры применения оператора for.

П ример 24.

Вычислить сумму ряда

где N – количество членов ряда.

Рекуррентная формула суммы Sk = Sk-1 + sin(kx), при начальном значении параметра цикла k=1 начальное значение S0 = 0.

Программа.

# include<stdio.h>

#include<conio.h>

# include <math.h>

void main( )

{ int k, N; float S, x; // описание переменных

clrscr ( ); // чистка экрана

printf (“ Введите x, N: ”);

scanf (“ %f%d”, &x, &N); // ввод данных ряда

for (k=1, S=0; k<=N; k++ ) // заголовок цикла

S += sin(k * x); // вычисление суммы ряда

printf (“Сумма = %f ”, S); // вывод результата

}

Пример 25. Программа вывода четных чисел меньше 100.

void main ( )

{ int n ;

for ( n = 0; n < 100; n++)

{ if (n % 2) // если нечетные (≠0) – продолжить

continue;

printf(“%3d ”, n); // печать четных чисел

}

}

Пример 26.

Ввести натуральное число N и определить, является ли оно простым.

Простое число делится без остатка только на 1 и N, а не простое число может делиться без остатка и на другие числа в диапазоне от 2 до N/2.