For (инициализаторы; условие; список_выражений) оператор
Оператор, стоящий после закрывающей скобки, задает тело цикла. В большинстве случаев телом цикла является блок. Инициализаторы задают начальное значение одной или нескольких переменных, часто называемых счетчиками или просто переменными цикла. Условие задает условие окончания цикла, соответствующее выражение при вычислении должно получать значение true или false. Список выражений, записанный через запятую, показывает, как меняются счетчики цикла на каждом шаге выполнения. Если условие цикла истинно, то выполняется тело цикла, затем изменяются значения счетчиков и снова проверяется условие. Как только условие становится ложным, цикл завершает свою работу. В нормальной ситуации тело цикла выполняется конечное число раз. Счетчики цикла зачастую объявляются непосредственно в инициализаторе и соответственно являются переменными, локализованными в цикле.
В тех случаях, когда предусматривается возможность преждевременного завершения цикла с помощью одного из операторов перехода, счетчики объявляются до цикла, что позволяет анализировать их значения при выходе из цикла.
В качестве примера рассмотрим классическую задачу: является ли строка текста палиндромом. Для ее решения цикл for подходит наилучшим образом.
Здесь используются два счетчика - один возрастающий, другой убывающий. Вот текст соответствующей процедуры:
/// <summary>
/// Определение палиндромов. Демонстрация цикла for
/// </summary>
/// <param name="str"> текст</param>
/// <returns> true - если текст является палиндромом</returns>
public bool Palindrom(string str) {
for (int i = 0, j = str.Length - 1; i < j; i++, j--)
if (str[i] != str[j]) return (false);
Return (true);
} //Palindrom
Циклы While
Цикл while (выражение) является универсальным видом цикла, включаемым во все языки программирования. Тело цикла выполняется до тех пор, пока остается истинным выражение while. В языке C# у этого вида цикла две модификации - с проверкой условия в начале и в конце цикла. Первая модификация имеет следующий синтаксис:
While(выражение) оператор
Эта модификация соответствует циклу с предусловием. Тело такого цикла может ни разу не выполняться. В нормальной ситуации каждое выполнение тела цикла - это очередной шаг к завершению цикла.
Цикл, проверяющий условие завершения в конце, соответствует циклу с постусловием. Тело такого цикла выполняется, по меньшей мере, один раз. Вот синтаксис этой модификации:
Do
Оператор
While(выражение);
Приведем пример, в котором участвуют обе модификации цикла while. Во внешнем цикле проверка выполняется в конце, а во внутреннем - в начале. Внешний цикл представляет собой типичный образец организации учебных программ, когда в диалоге с пользователем многократно решается некоторая задача. На каждом шаге пользователь вводит новые данные, решает задачу и анализирует полученные данные. В его власти, продолжить вычисления или нет, но хотя бы один раз решить задачу ему приходится. Внутренний цикл do while используется для решения уже известной задачи с палиндромами. Вот текст соответствующей процедуры:
/// <summary>
/// Два цикла: с проверкой в конце и в начале.
/// Внешний цикл - образец многократно решаемой задачи.
/// Завершение цикла определяется в диалоге с пользователем.
/// </summary>
public void Loop() {
// начало процедуры string answer, text;
do {
// начало внешнего цикла
Console.WriteLine("Введите слово");
text = Console.ReadLine();
int i = 0, j = text.Length - 1;
while ((i < j) && (text[i] == text[j])) {
// внутренний цикл
i++; j-- ;
}
if (text[i] == text[j]) Console.WriteLine(text + " - это палиндром!");
else Console.WriteLine(text + " - это не палиндром!");
Console.WriteLine("Продолжим? (yes/no)");
answer = Console.ReadLine();
} while (answer == "yes"); // конец внешнего цикла
} //Loop
Цикл forEach
Новым видом цикла, не унаследованным от С++, является цикл foreach, удобный при работе с массивами, коллекциями и другими подобными контейнерами данных. Его синтаксис: