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

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

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

Программа:

# include<stdio.h>

# include<conio.h>

void main ()

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

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

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

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

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

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

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

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); /* условие для цикла диалога */

}

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

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

Программа:

#include<math.>

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

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

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

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

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

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

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

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

Рассмотрим примеры применения оператора for.


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

 
 

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

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

Программа:

# 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); /* вывод результата */

}

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

void main ()

{ int n;

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

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

continue;

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

}

}

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

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

Программа:

void main()

{ int N, i, p=1; /* р=1 – признак простого числа */

clrscr ();

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

sсanf (“ %d”, &N); /* ввод числа */

for (i=2; i <= N / 2; i++) /* цикл по делителям */

if (!(p = N % i)) break; /* деление без остатка (р=0) */

if (p) printf (“Число %d простое.”, N);

else printf (“Число %d не простое.”, N);

}

Рассмотрим пример применения всех трех операторов цикла с вложенными циклами.

Пример. Ввести натуральное число N и найти его разложение на простые множители, произведение которых дает N. Организовать диалог с пользователем (интерактивный режим) по вводу любого числа N и контроль его ввода.

Программа:

void main()

{ int N, n, i, p; /* описание переменных */

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

puts (“ Разложение числа на простые множители ”);

do /* цикл диалога */

{ do /* цикл проверки числа */

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

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

} while (N<=1); /* условие продолжения ввода */

n=N; /* текущее значение N */

p=1; /* признак простого числа */

printf(“\n %d =”, N); /* вывод числа N */

for (i=2; i<=N/2; i++) /* цикл по множителям */

{ if (n % i == 0) /* если число не простое */

{ p=0; /* признак не простого числа */

while (n % i == 0) /* цикл по одинаковым множителям */

{ printf (“%d*”, i); /* вывод множителя */

n /= i; /* число делится на множитель */

}

}

} /* конец цикла по множителям */

if (p) printf(“ простое число ”);

printf (“\nПродолжить? Да – нажмите 1, Нет – любую клавишу”);

i=getche(); /* ввод видимого символа */

} while (i == ’1’); /* условие продолжения диалога */

} /* конец программы */


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: