
- •Цикл предусловием while
- •Цикл с постусловием do…while
- •Цикл с параметром for
- •Цикл перебора foreach
- •Рекомендации по выбору цикла
- •Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •Порядок выполнения лабораторной работы
- •Задания к лабораторной работе.
- •Пример решения варианта 0.
- •Листинг 2.5 – Задание 1.
- •Листинг 2.7 – Задание 2
Цикл с постусловием do…while
Цикл с постусловием реализует структурную схему, приведенную на (рис. 1, b), и имеет вид: do оператор while выражение;
Сначала выполняется простой или составной оператор, образующий тело цикла, а затем вычисляется выражение (оно должно иметь тип bool). Если выражение истинно, тело цикла выполняется еще раз и проверка повторяется. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.
Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз, например, если в цикле вводятся данные и выполняется их проверка. Если же такой необходимости нет, предпочтительнее пользоваться циклом с предусловием. Рассмотрим пример 2 применения цикла с постусловием – программу, определяющую корень уравнения cos(x) = x методом деления пополам с точностью 0,0001.
Исходные данные для этой задачи – точность, результат – число, представляющее собой корень уравнения. Оба значения имеют вещественный тип.
Суть метода деления пополам очень проста. Задается интервал, в котором есть ровно один корень (следовательно, на концах этого интервала функция имеет значения разных знаков). Вычисляется значение функции в середине этого интервала. Если оно того же знака, что и значение на левом конце интервала, значит, корень находится в правой половине интервала, иначе — в левой. Процесс повторяется для найденной половины интервала до тех пор, пока его длина не станет меньше заданной точности.
В приведенной далее программе (листинг 2) исходный интервал задан с помощью констант, значения которых взяты из графика функции. Для уравнений, имеющих несколько корней, можно написать дополнительную программу, определяющую (путем вычисления и анализа таблицы значений функции) интервалы, содержащие ровно один корень.
Листинг 2.2 – Вычисление корня нелинейного уравнения
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lab2
{
class Program
{
static void Main(string[] args)
{
Console.Write("Вычисление корня нелинейного уравнения: cos(x) = x\n\n");
Console.Write("Для решения данной задачи используется метод деления пополам\n\n");
double x, left = 0.0, right = 1.0;
do
{
x = (left + right) / 2.0;
if ((Math.Cos(x) - x) * (Math.Cos(left) - left) < 0)
right = x;
else left = x;
} while (Math.Abs(right - left) > 1e-4);
Console.WriteLine("Корень равен " + x);
}
}
}
Рисунок 2.3 – Результат выполнения примера 2
Цикл с параметром for
Цикл с параметром имеет следующий формат:
for ( инициализация; выражение; модификации ) оператор;
Инициализация служит для объявления величин, используемых в цикле, и присвоения им начальных значений. В этой части можно записать несколько операторов, разделенных запятой, например:
for (int i = 0, j = 20; …
int k, m;
for (k = 1, m = 0; …
Областью действия переменных, объявленных в части инициализации цикла, является цикл.
Инициализация выполняется один раз в начале исполнения цикла. Выражение типа bool определяет условие выполнения цикла: если его результат равен true, цикл выполняется. Цикл с параметром реализован как цикл с предусловием.
Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую, например:
for (int i = 0, j = 20; i < 5 && j > 10; i++, j--)
Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах).
В листинге 3 приведена программа, выводящая таблицу значений функции из листинга 2.
Листинг 2.3 – Таблица значений функции, полученная с помощью цикла for
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lab2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Таблица значений функции, полученная с помощью цикла for");
double Xn = -2.0, Xk = 12.0, dX = 2.0, t = 2.0, y;
Console.WriteLine("| x | y |"); // заголовок таблицы
for (double x = Xn; x <= Xk; x += dX) //1, 4, 5
{
y = t; //2
if (x >= 0 && x < 10) //2
y = t * x; //2
else if (x >= 10) //2
y = 2 * t; //2
Console.WriteLine("| {0,6} | {1, 6} |", x, y); //3
}
}
}
}
Как видите, в этом варианте программы все управление циклом сосредоточено в его заголовке. Это делает программу понятней. Кроме того, областью действия служебной переменной x является цикл, а не вся функция, как это было в листинге 1, что предпочтительнее, поскольку переменная x вне цикла не требуется.