Циклы do while и foreach. Циклы for и while

Gigabyte предложит наборы из платы Z390 Aorus Xtreme WaterForce и разогнанного Core i9-9900K. Компания Gigabyte в ближайшее время выведет на рынок комплекты из материнской платы Z390 Aorus Xtreme WaterForce и разогнанного до 5,1 ГГц процессора Intel Core i9-9900K (8 ядер/16 потоков, 3,6/5 ГГц). Эти наборы в первую очередь

Samsung Galaxy A90 впервые протестировали в бенчмарке Geekbench. 10 апреля компания Samsung проведет свою очередную презентацию, где наверняка представит ряд смартфонов среднего ценового диапазона. Среди них должен быть Samsung Galaxy A90, который буквально только что был протестирован в

На сайте Slahsleaks, который часто выкладывает эксклюзивные фотографии новых мобильных устройств и аксессуаров для них, опубликовали живое фото фронтальной панели смартфона Nokia 8.1 Plus. Смартфон получил очень узкие рамки по периметру, чуть более широкую рамку под дисплеем,

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

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

Ученые-астрономы обнаружили 83 новые сверхмассивные черные дыры, возраст которых почти равен возрасту доступной для изучения части Вселенной. Идентификация этих черных дыр и определение их параметров проводилось путем анализа их яркости и спектра излучения. Они

Google анонсировал новую функцию для отправки писем в Gmail. Теперь их отправку можно будет запланировать на удобное время. Для планирования письма нужно нажать на стрелочку рядом с кнопкой «Отправить» и выбрать нужное время и дату отправки, пишет Хроника.инфо со ссылкой на

Специалисты iFixit изучили конструкцию планшетного компьютера iPad mini нового поколения, который компания Apple официально представила в прошлом месяце. Устройство, напомним, оборудовано дисплеем Retina размером 7,9 дюйма по диагонали. Разрешение составляет 2048 × 1536 точек,

Телевизоры и дисплеи Vizio получат поддержку AirPlay. Американский производитель бытовой электроники Vizio ранее объявил о поддержке AirPlay 2 и приложения Дом. Сейчас стало известно, что специалисты компании работают над приложением SmartCast, совместимым с AirPlay, пишет Хроника.инфо

Компания BIOSTAR, ведущий мировой производитель материнских плат, видеокарт и устройств хранения данных, представила материнскую плату A68MHEдля массового пользователя. BIOSTAR A68MHE оснащена чипсетом AMD A68H, который поддерживает процессоры AMD серии FM2+ Athlon™/A- и оперативную память

Оператор циклаfor обобщает известную конструкцию цикла типа арифметической прогрессии. Его синтаксис:

for (инициализаторы; условие; список_выражений) оператор

Оператор, стоящий после закрывающей скобки, задает тело цикла. В большинстве случаев телом цикла является блок. Инициализаторы задают начальное значение одной или нескольких переменных, часто называемых счетчиками или просто переменными цикла. Условие задает условие окончания цикла, соответствующее выражение при вычислении должно получать значение true илиfalse . Список выражений, записанный через запятую, показывает, как меняются счетчики цикла на каждом шаге выполнения. Если условие цикла истинно, то выполняется тело цикла, затем изменяются значения счетчиков и снова проверяется условие. Как только условие становится ложным, цикл завершает свою работу. В нормальной ситуации тело цикла выполняется конечное число раз. Счетчики цикла зачастую объявляются непосредственно в инициализаторе и соответственно являются переменными, локализованными в цикле.

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

В качестве примера рассмотрим классическую задачу: является ли строка текста палиндромом. Для ее решения циклfor подходит наилучшим образом.

Здесь используются два счетчика - один возрастающий, другой убывающий. Вот текст соответствующей процедуры:

/// < summary >
/// Определение палиндромов. Демонстрация цикла for
///
/// текст
/// < returns > true - если текст является палиндромом
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

5.6.2. Циклы While

Циклwhile (выражение) является универсальным видом цикла, включаемым во все языки программирования. Тело цикла выполняется до тех пор, пока остается истинным выражениеwhile . В языке C# у этого вида цикла две модификации - с проверкой условия в начале и в конце цикла. Первая модификация имеет следующий синтаксис:

while(выражение) оператор

Эта модификация соответствует циклу с предусловием. Тело такого цикла может ни разу не выполняться. В нормальной ситуации каждое выполнение тела цикла - это очередной шаг к завершению цикла.

Цикл, проверяющий условие завершения в конце, соответствует циклу с постусловием. Тело такого цикла выполняется, по меньшей мере, один раз. Вот синтаксис этой модификации:

do
оператор
while(выражение);

Приведем пример, в котором участвуют обе модификации циклаwhile . Во внешнем цикле проверка выполняется в конце, а во внутреннем - в начале. Внешний цикл представляет собой типичный образец организации учебных программ, когда в диалоге с пользователем многократно решается некоторая задача. На каждом шаге пользователь вводит новые данные, решает задачу и анализирует полученные данные. В его власти, продолжить вычисления или нет, но хотя бы один раз решить задачу ему приходится. Внутренний циклdo while используется для решения уже известной задачи с палиндромами. Вот текст соответствующей процедуры:

/// < 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

5.6.3. Цикл forEach

Новым видом цикла, не унаследованным от С++, является циклforeach , удобный при работе с массивами, коллекциями и другими подобными контейнерами данных. Его синтаксис:

foreach (тип идентификатор in контейнер) оператор

Цикл работает в полном соответствии со своим названием - тело цикла выполняется для каждого элемента в контейнере. Тип идентификатора должен быть согласован с типом элементов, хранящихся в контейнере данных. Предполагается также, что элементы контейнера (массива, коллекции) упорядочены. На каждом шаге цикла идентификатор, задающий текущий элемент контейнера, получает значение очередного элемента в соответствии с порядком, установленным на элементах контейнера. С этим текущим элементом и выполняется тело цикла - выполняется столько раз, сколько элементов находится в контейнере. Цикл заканчивается, когда полностью перебраны все элементы контейнера. Серьезным недостатком цикловforeach в языке C# является то, что цикл работает только на чтение, но не на запись элементов. Так что наполнять контейнер элементами приходится с помощью других операторов цикла.

В приведенном ниже примере показана работа с трехмерным массивом. Массив создается с использованием циклов типаfor , а при нахождении суммы его элементов, минимального и максимального значения используется цикл foreach :

/// < summary >
/// Демонстрация цикла foreach .
/// Вычисление суммы, максимального и минимального элементов
/// трехмерного массива, заполненного случайными числами.
///
public void SumMinMax() {
int[,] arr3d = new int;
Random rnd = new Random();
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
for (int k = 0; k < 10; k++)
arr3d = rnd.Next(100);
long sum = 0;
int min = arr3d, max = arr3d;
foreach (int item in arr3d) {
sum += item;
if (item > max) max = item;
else if (item < min) min = item;
}
Console.WriteLine("sum = {0}, min = {1}, max = {2}", sum, min, max);
} // SumMinMax

Циклы do while и foreach

Цикл do. . . while

Цикл do...while в C# - это версия while с постпроверкой условия. Это значит, что условие цикла проверяется после выполнения тела цикла. Следовательно, циклы do...while удобны в тех ситуациях, когда блок операторов должен быть выполнен как минимум однажды. Ниже приведена общая форма оператора цикла do-while:

do { операторы; } while (условие);

При наличии лишь одного оператора фигурные скобки в данной форме записи необязательны. Тем не менее они зачастую используются для того, чтобы сделать конструкцию do-while более удобочитаемой и не путать ее с конструкцией цикла while. Цикл do-while выполняется до тех пор, пока условное выражение истинно. В качестве примера использования цикла do-while можно привести следующую программу, расчитывающую факториал числа:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string args) { try { // Вычисляем факториал числа int i, result = 1, num = 1; Console.WriteLine("Введите число:"); i = int.Parse(Console.ReadLine()); Console.Write("\n\nФакториал {0} = ", i); do { result *= num; num++; } while (num

Цикл foreach

Цикл foreach служит для циклического обращения к элементам коллекции , представляющей собой группу объектов. В C# определено несколько видов коллекций, каждая из которых является массивом. Ниже приведена общая форма оператора цикла foreach:

foreach (тип имя_переменной_цикла in коллекция) оператор;

Здесь тип имя_переменной_цикла обозначает тип и имя переменной управления циклом, которая получает значение следующего элемента коллекции на каждом шаге выполнения цикла foreach. А коллекция обозначает циклически опрашиваемую коллекцию, которая здесь и далее представляет собой массив. Следовательно, тип переменной цикла должен соответствовать типу элемента массива. Кроме того, тип может обозначаться ключевым словом var. В этом случае компилятор определяет тип переменной цикла, исходя из типа элемента массива. Это может оказаться полезным для работы с определенного рода запросами. Но, как правило, тип указывается явным образом.

Оператор цикла foreach действует следующим образом. Когда цикл начинается, первый элемент массива выбирается и присваивается переменной цикла. На каждом последующем шаге итерации выбирается следующий элемент массива, который сохраняется в переменной цикла. Цикл завершается, когда все элементы массива окажутся выбранными.

Цикл foreach позволяет проходить по каждому элементу коллекции (объект, представляющий список других объектов). Формально для того, чтобы нечто можно было рассматривать как коллекцию, это нечто должно поддерживать интерфейс IEnumerable . Примерами коллекций могут служить массивы C#, классы коллекций из пространства имен System.Collection, а также пользовательские классы коллекций.

Циклы for и while

В C# имеются четыре различных вида циклов (for, while, do...while и foreach), позволяющие выполнять блок кода повторно до тех пор, пока удовлетворяется определенное условие. В этой статье мы познакомимся с циклами for и while.

Цикл for

Цикл for в C# предоставляет механизм итерации, в котором определенное условие проверяется перед выполнением каждой итерации. Синтаксис этого оператора показан ниже:

for (инициализатор; условие; итератор) оператор (операторы)

инициализатор

это выражение, вычисляемое перед первым выполнением тела цикла (обычно инициализация локальной переменной в качестве счетчика цикла). Инициализация, как правило, представлена оператором присваивания, задающим первоначальное значение переменной, которая выполняет роль счетчика и управляет циклом;

условие

это выражение, проверяемое перед каждой новой итерацией цикла (должно возвращать true, чтобы была выполнена следующая итерация);

итератор

выражение, вычисляемое после каждой итерации (обычно приращение значения счетчика цикла).

Обратите внимание на то, что эти три основные части оператора цикла for должны быть разделены точкой с запятой. Выполнение цикла for будет продолжаться до тех пор, пока проверка условия дает истинный результат. Как только эта проверка даст ложный результат, цикл завершится, а выполнение программы будет продолжено с оператора, следующего после цикла for.

Стоит отметить, что цикл for отлично подходит для повторного выполнения оператора или блока операторов заранее известное количество раз. Давайте рассмотрим практическое применение цикла for на следующем примере:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { // Данный метод выводит таблицу умножения // размерностью b x b static void tab(byte b) { Console.WriteLine("Таблица умножения {0} x {0}\n", b); // Этот цикл проходит по строкам for (int i = 1; i

Цикл while

Подобно for, while также является циклом с предварительной проверкой. Синтаксис его аналогичен, но циклы while включают только одно выражение:

while(условие) оператор (операторы);

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

Как и в цикле for, в цикле while проверяется условное выражение, указываемое в самом начале цикла. Это означает, что код в теле цикла может вообще не выполняться, а также избавляет от необходимости выполнять отдельную проверку перед самим циклом.

Циклы используются для многократного повторения кусков кода. Возможность повторения определенных фрагментов кода — это одна из основных и в тоже время важных задач, которые приходится решать программисту. Большинство программ или сайтов используют циклы, например — для вывода новостной информации или объявлений. То есть в таких задачах необходимо выполнять постоянно операции чтения и записи, и для того чтобы не дублировать один и тот же код на помощь приходят циклы. Циклы достаточно просто объявляются в коде, однако они выполняют сложные задачи, всего лишь простым повторением.

Чтобы приступить к изучению циклов, убедитесь в том, что вы хорошо понимаете концепцию в языке программирования Си. Потому как это будет жизненно необходимо в использовании циклов, ведь в циклах также как и в присутствуют условные выражения. В языке Си существует три типа циклов: for , while , do while . Каждый из них имеет свои конкретные применения. Все они описаны ниже.

Самый часто используемый цикл — это цикл for , его структура показана ниже:

For (/*инициализация переменной; условие; изменение значения переменной*/) { // тело цикла (тут находится код который будет повторяться) }

Инициализация переменной позволяет либо объявить переменную и присвоить ей значение либо присвоить значение уже существующей переменной. Во-вторых, значение этой переменной сообщает программе — истинно или ложно условие цикла. И пока условие цикла — истинно, цикл должен продолжать повторяться. Управляющую переменную обязательно необходимо как-то изменять, иначе цикл будет бесконечный, например можно обновлять её так: i++ , i = i + 2 или даже так i = random(5) . Обратите внимание, что каждую секцию в заголовке цикла, отделяет точка с запятой, что очень важно. Также отметим, что каждый из разделов может быть пустым, хотя точки с запятой все еще должны быть там. Если условие не пустое, то оно оценивается как истинное и цикл будет выполняться до тех пор, пока что-то не сделает условие цикла — ложным. Давайте рассмотрим простой пример использования цикла for .

#include int main() { int i; /* Цикл будет работать до тех пор, пока i < 10, при этом после каждой итерации переменная i будет инкрементироваться(увеличиваться на 1)*/ for (i = 0; i < 10; i++) { /* Имейте ввиду что условие проверяется перед каждым повторением, то есть работа цикла остановится когда переменная i будет равна 10*/ printf("%d\n", i); } getchar(); }

Собственно, результат работы программы:

0 1 2 3 4 5 6 7 8 9

Эта программа представляет собой очень простой пример использования цикла. переменной i присваивается ноль, и пока i меньше 10 на экран печатается значения переменной i , после этого к переменной i прибавляется единица и все снова повторяется до тех пор, пока условие не станет ложным. Имейте в виду, что значение переменной i увеличивается после выполнения кода в теле цикла запускается в первый раз.

Цикл while — очень простой цикл, вот его структура:

While (/*условие*/) { // тело цикл - тут находится код, который необходимо повторять }

Тело цикла начинает выполняться, если условие цикла — истинно. Условие представляет собой логическое выражение, например х == 1 или х! = 7 (х не равно 7). То есть условие может быть абсолютно любым — любое сочетание логических выражений. Вот пример составного условия — x == 3 || x > 10 , это условие будет истинным, если икс будет равен трем или икс будет больше 10. Обратите внимание, что while имеет раздела инициализации или раздела изменения управляемой переменной, поэтому перед использованием этого цикла, сначала необходимо объявить переменную, которая будет проверяться в условии цикла и в теле цикла изменять значение этой переменной. Собственно, давайте рассмотрим простой пример с использованием цикла while:

#include int main() { int var = 0; /* обязательно сначала объявляем переменную */ while (var < 10) { /* пока значение переменной var меньше 10 */ printf("%d\n", var); var++; /* обновляем значение в переменной var(если этого не делать, то условие цикла всегда будет истинным, тогда цикл будет - бесконечным) */ } getchar(); }

Вот мы и рассмотрели еще один пример использования циклов, и как видите и в этом примере нет ничего сложного. Просто представьте себе, что цикл всегда начинает повторять код, который находится в теле цикла. Как только выполняется последний оператор в теле цикла, выполняется проверка условия цикла. Если условие все ещё — истинное, то цикл продолжает и дальше работать, а если условие — ложное, то выполняется выход из цикла.

Есть еще один тип циклов — do while . Этот цикл полезен, когда необходимо выполнить код по крайней мере — 1 раз. Рассмотрим его структуру:

Do { // тело цикла } while (/*условие*/);

Структура очень простая, как видите условие находится в конце цикла,соответственно и проверка условия будет выполняться после того, как выполнятся код в теле цикла. Обратите внимание, что условие проверяется в конце цикла, а не в начале, так что блок кода в теле цикла будет выполнен по крайней мере один раз. Если условие истинно, цикл прыгает обратно в начало и снова выполняет его. Цикл do while почти ничем не отличается от цикла while , за исключением того, что тело цикла гарантированно выполняется хотя бы один раз. Цикл while сначала проверяет условие, а потом выполняет блок кода в теле, конечно же, если условие — истинно, В то время как do while сначала выполняет код в теле цикла, а затем проверяет условие, и если оно — истинное, то он продолжает работать. Пример работы цикла do while показан ниже:

#include int main() { int i = 0; do { /* Напечатает сообщение и завершит работу*/ printf("Привет! Я цикл do while\n"); } while (i != 0); getchar(); }

Обратите внимание на точку с запятой в конце цикла, вы всегда должны ставить эту точку с запятой так, как в приведенном выше примере. Очень часто эта точка с запятой не ставится, в результате — появляется ошибка компиляции. Только этот цикл заканчивается точкой с запятой, у остальных циклов в конце, кроме закрывающей скобочки — ничего не ставится. Обратите внимание, что в примере выше, этот цикл будет выполняться один раз, потому что сначала печатается сообщение а потом проверяется условие цикла.



Понравилась статья? Поделиться с друзьями: