Операторы цикла.
Операторы цикла позволяют выполнить участок программы требуемое число раз.
Для организации цикла используются три оператора – for, while и do_while.
for – выполнение тела цикла для описанных в заголовке значений управляющей переменной (перебор);
while – пока указанное условие истинно выполняется тела цикла (с предусловием);
do_while – выполняется тела цикла, пока указанное условие не станет ложным (с постусловием).
Оператор цикла for (перебор)
Оператор цикла for имеет следующий вид:
for(инициализация; условие; изменение) оператор
Оператор, стоящий после закрывающей скобки, задает тело цикла. В большинстве случаев телом цикла является блок (группа операторов в фигурных скобках). Сколько раз будет выполняться тело цикла, зависит от обязательных трех управляющих элементов, заданных в круглых скобках в заголовке цикла.
Инициализация задает начальное значение некоторой переменной, называемой управляющей переменной цикла.
Условие задает условие выполнения цикла, при обращении в FALSE цикл завершается.
Изменение описывает, как меняется переменная цикла в каждой итерации выполнения.
Если условие цикла истинно, то выполняется тело цикла, затем изменяются значения переменной цикла и снова проверяется условие. Как только условие становится ложным, цикл завершает свою работу.
Пример 1. Например, для вывода на экран значений целых чисел от 1 до 10 можно использовать следующий цикл:
for (int i = 1; i <= 10; i++)
Console.Write("{0} ",i);
Переменная цикла часто объявляется непосредственно в инициализации (как в примере 1.) и, соответственно, являются локальной в цикле переменной, так что после завершения цикла она перестанет существовать.
Задание 1. Вывести на экран числа в указанном порядке
a) 1 2 3 4 5 6 7 8 9
b) 1 3 5 7 9 11 13 15 17 19
c) 77 66 55 44 33 22 11
d) 1 3 9 27 81 243 729
Пример 1A. Напечатать числа в виде таблицы:
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 |
for (int i = 1; i <= 5; i++) //номер строки { for (int j = 1; j <= i; j++) //номер столбца Console.Write(" {0}", j); Console.WriteLine(); }
|
5 5 5 5 5 6 6 6 6 7 7 7 8 8 9 |
for (int i = 5; i <= 9; i++) { for (int j = 1; j <= 10-i; j++) Console.Write(" {0}", i); Console.WriteLine(); }
|
Пример 2. Вычислить сумму чисел от 1 до 100.
int s = 0;
for (int i = 1; i <= 100; i++)
s += i;
Console.WriteLine(s);
Выражение инициализации присваивает переменной i значение 1. Выражение цикла прибавляет 1 к переменной i, а в теле цикла происходит увеличение значения переменной s на величину i.
Цикл завершает свою работу, когда переменная i достигнет значения 101. То есть, последним числом, которое будет прибавлено к переменной s, будет 100.
В конце работы оператора for переменная s будет содержать число 5050 – сумму натуральных чисел от 1 до 100.
Если в заголовке цикла изменить знак в условии:
int s = 0;
for (int i = 1; i >= 100; i++) s += i;
то цикл не выполнит ни одной итерации.
Пример 3. Для заданного натурального n вычислить сумму
.
Фактически, требуется вычислить значение выражения .
Такая форма записи очень удобна, т.к. здесь присутствует вся информация (управляющая переменная цикла, её начальное и конечное значения, шаг по умолчанию равный 1), которая указывается в заголовке цикла for.
Console.Write("n=");
string w = Console.ReadLine();
int n = Convert.ToInt32(w);
double s = 0;
for (i = 1; i <= n; i++)
s = s + 1.0 / i / (i + 1); // или s += 1.0 / i / (i + 1)
Console.WriteLine("s={0}",s);
Кстати, попробуйте догадаться, почему в числителе слагаемого единица представлена константой 1.0 .
Пример запуска программы показан ниже:
Шаг управляющей переменной не всегда равен 1. Так, в задаче табулирования функции (получения таблицы значений функции для аргумента из заданного интервала с заданным шагом) шаг управляющей переменной цикла должен быть вещественным.
Пример 4. Распечатать таблицу значений функций y=Cos(x) и y=Sqrt(x) для аргумента, изменяющегося в заданных пределах (от -1 до 2) с заданным шагом (0,2).
double Xn = -1, Xk = 2, dX = 0.2, y1, y2;
Console.WriteLine("+------------+---------------+---------------+");
Console.WriteLine("| X | Cos(x) | Sqrt(x) |");
Console.WriteLine("+------------+---------------+---------------+");
for (double x = Xn; x <= Xk; x += dX)
{
y1 = Math.Cos(x);
y2 = Math.Sqrt(x);
Console.WriteLine("| {0,9:F2} | {1,9:F2} | {2,9:F2} |", x, y1, y2);
}
Console.WriteLine("+------------+---------------+---------------+");
Результатом работы программы будет таблица:
.
Появление слова NaN в качестве значения означает, что результат не был вычислен (квадратный корень из отрицательного числа не вычисляется). Для более «привычного» вида таблицы заменим слово NaN прочерком. Для этого будем проверять нахождения аргумента в ОДЗ функции «квадратный корень» – x>=0.
double Xn = -1, Xk = 2, dX = 0.2, y1, y2;
Console.WriteLine("+------------+---------------+---------------+");
Console.WriteLine("| X | Cos(x) | Sqrt(x) |");
Console.WriteLine("+------------+---------------+---------------+");
for (double x = Xn; x <= Xk; x += dX)
{
y1 = Math.Cos(x);
if (x < 0)
Console.WriteLine("| {0,9:F2} | {1,9:F2} | --- |", x, y1);
else {
y2 = Math.Sqrt(x);
Console.WriteLine("| {0,9:F2} | {1,9:F2} | {2,9:F2} |", x, y1, y2);
}
}
Console.WriteLine("+------------+---------------+---------------+");
Теперь таблица более «читаема»:
Пример 5. Построить таблицу истинности для заданного логического выражения (A or B) xor (A and B) в виде:
Так как в операторе цикла не получится использовать логические переменные, то воспользуемся нехитрым приёмом:
Console.WriteLine("+-------+-------+---------------------+");
Console.WriteLine("| A | B | (A | B) ^ (A & B) |");
Console.WriteLine("+-------+-------+---------------------+");
for (int i = 0; i <= 1; i++)
for (int j = 0; j <= 1; j++)
{
bool a = i==1;
bool b = j==1;
bool c = (a | b) ^ (a & b);
Console.WriteLine("| {0,5} | {1,5} | {2,5} |", a, b, c);
}
Console.WriteLine("+-------+-------+---------------------+");