ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 31
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Циклы с условием и вложенные циклы
Вы уже немало знаете о циклах — умеете с их помощью печатать строки и проводить расчёты. Однако циклы не существуют в программе сами по себе. Их выполнение может зависеть от внешних обстоятельств.
К примеру, благодаря советам ветеринара Байт отлично похудел к лету. Чтобы оставаться в форме, он решил устраивать разгрузочные дни. Каждое утро Байт взвешивается и определяет, будет ли он сегодня есть морковки или только попьёт воды и побегает в колесе. Если вес меньше 800 грамм, то Байт съедает как обычно пять морковок, в обратном случае объявляет разгрузочный день. Чтобы отразить это в коде, нужно добавить к циклу условное выражение:
using System;
namespace prog1
{
public class Program1
{
public static void Main(string[] args)
{
int weight = 750; // Объявили переменную веса Байта и присвоили ей значение
if (weight < 800)
{ // Цикл сработает, только если вес Байта меньше 800 грамм
for (int i = 1; i < 6; i = i + 1)
{
Console.WriteLine("Байт съел " + i + "-ю морковку");
}
}
else
{
Console.WriteLine("Разгрузочный день. Пьём водичку, крутим колесо!");
}
}
}
}
Результат
Байт съел 1-ю морковку
Байт съел 2-ю морковку
Байт съел 3-ю морковку
Байт съел 4-ю морковку
Байт съел 5-ю морковку
Ура! Цикл с поеданием морковок запустится, только если вес Байта меньше 800 грамм. Поменяйте вес хомяка и позапускайте код — проверьте, что Байт точно не потолстеет!
Условные выражения и циклы часто используются вместе. Причём и цикл может находиться внутри условного выражения, как в примере с Байтом, так и условное выражение может быть внутри цикла.
Прочитайте этот код исходя из того, что вы уже знаете о циклах и условных выражениях. Каким будет конечное значение переменной counter?
using System;
namespace prog1
{
public class Program1
{
public static void Main(string[] args)
{
int counter = 0;
for (int i = 0; i < 10; i = i + 1)
{
if (i > 7)
{
counter = counter + 2;
}
counter = counter + 1;
}
}
}
}
Цикл while
Уф! Сколько всего вы уже знаете о циклах! Так держать — ещё пара уроков и вы станете настоящим профи в этой теме — краеугольной для любого разработчика.
На прошлых уроках мы много говорили о цикле for — он подходит для тех случаев, когда заранее известно количество итераций. Но так бывает не всегда. К примеру, вы закупили для Байта корм впрок — неизвестно, на сколько порций его хватит. В этом случае работа цикла будет определяться не числом повторений, а булевым выражением — питомец ест корм до тех пор, пока он в наличии. Если корм кончился — булево выражение стало ложным — цикл завершится. Такой цикл описывается с помощью служебного слова
while (от англ. while — до тех пор, пока).
В цикле for мы определяли переменную итерирования, условие и шаг цикла. В цикле while нам неизвестно число итераций, поэтому не получится задать ни переменную, ни шаг. Мы знаем только условие его работы. Его и указываем после слова while, перед телом цикла в фигурных скобках:
int foodWeight = 500; // Количество корма
while (foodWeight >= 10) { // Условие работы цикла - пока осталась хотя бы одна порция
foodWeight = foodWeight - 10; // Байт съедает 10 грамм корма за раз
}
Console.WriteLine("Корм закончился! Пора идти в магазин!");
Структура циклов for и while похожа, как и логика их работы — цикл выполняется, пока условие верно. В нашем примере цикл while будет работать до тех пор, пока значение переменной foodWeight больше или равно 10 — дома есть хотя бы одна порция корма. Как только переменная станет меньше 10 — цикл завершится. После этого будет выполнен следующий код — напечатано предупреждение, что пора идти в магазин.
Рассмотрим пример. Вам нужно запрограммировать робота для перемещения коробок на складе. За один подход можно взять одну коробку, при этом их общее количество каждый раз разное. Какой цикл подойдёт для решения такой задачи?
1. Цикл for c условным выражением
2. Цикл while
3. Цикл for
4. Вложенный цикл for
Бесконечный цикл
Продолжаем изучать возможности цикла while. Он выполняется до тех пор, пока условие является истинным. Следовательно, если в условии написать true, то цикл будет выполняться снова и снова. Посмотрим, что получится, если запустить такой цикл для пробежки Байта в колесе.
while (true) {
Console.WriteLine("Бегу, бегу, бегу!"); // Будет выполняться бесконечно
}
Console.WriteLine("Отлично побегал!"); // Эта строка не будет напечатана
В консоли будет беспрерывно печататься строка "Бегу, бегу, бегу!", а до строки "Отлично побегал!" очередь никогда не дойдёт. Хомяк Байт в колесе превратился в вечный двигатель! Такой цикл, который начинается со служебного слова while и содержит в условии true, называется бесконечным. И никакого символа бесконечности ∞ не требуется — его просто-напросто нет в синтаксисе C#.\
Если же написать в условии цикла false и попробовать запустить код, то вообще ничего не получится. Программа выдаст ошибку:
unreachable statement (англ. «недостижимое утверждение»).
while (false) {
Console.WriteLine("Никуда не побегу!"); // Такой цикл не запустится. Хомяк решил поспать.
}
Бесконечные циклы активно используются, например, при передаче данных, когда их объём неизвестен заранее. Или в построении web-приложений, которые общаются через не всегда надёжную сеть и могут «падать», и поэтому им требуется снова и снова отправлять друг другу запросы. При работе с пользователями бесконечные циклы нужны, чтобы обеспечить беспрерывное ожидание и обработку таких операций, как касание экрана, свайпы или ввод текста и других.
Однако Байт не хочет вечно бегать в колесе — вам нужно закончить цикл. Выйти из бесконечного цикла можно двумя способами, первый — остановить программу. Но это всё равно что сломать колесо — не очень практично. Более рационально использовать второй способ — добавить в код слово break (англ. «перерыв»). На break цикл сразу завершится, а программа перейдёт к выполнению следующего кода. Байт сможет закончить пробежку и пойти перекусить. Это выглядит так:
while (true) {
Console.WriteLine("Бегу, бегу, бегу!");
break; // Цикл завершился
}
Console.WriteLine("Отлично побегал, пойду поем!"); // Теперь эта строка будет напечатана
В результате будет напечатано:
Бегу, бегу, бегу!
Отлично побегал, пойду поем!
Бесконечный цикл с прерыванием break нужен, когда требуется выполнять условно неограниченное количество итераций до достижения определённого результата. Например, при вызове такси в приложении радиус поиска свободной машины расширяется до тех пор, пока не найдётся первый подходящий автомобиль. Однако условий выхода из цикла (подходящих машин) может быть несколько, и в таком случае мы можем предложить пользователю выбор.
Как работает бесконечный цикл с break с несколькими условиями выхода, разберём на примере первого тренажёра этого урока — в нём специально нет правильных ответов. Переходите к нему!
Прокачиваем финансовое приложение и добавляем в него циклы
Пришло время усовершенствовать финансовое приложение. Сейчас оно работает так: предлагает ввести баланс на счету в рублях и число дней до зарплаты, после чего просит выбрать команду convert
или advice. В зависимости от команды программа либо конвертирует деньги в какую-то из доступных валют — доллары, евро или йены, либо дает совет, где сегодня поужинать. Код выглядит так:
using System;
namespace prog1
{
public class Program1
{
public static void Main(string[] args)
{
double rateUSD = 78;
double rateEUR = 85;
double rateJPY = 0.74;
Console.WriteLine("Сколько денег у вас осталось до зарплаты?");
double moneyBeforeSalary = double.Parse(Console.ReadLine());
Console.WriteLine("Сколько дней до зарплаты?");
int daysBeforeSalary = int.Parse(Console.ReadLine());
Console.WriteLine("Введите команду. Доступные команды: convert и advice.");
String command = Console.ReadLine();
if (command.Equals("convert"))
{
Console.WriteLine("В какую валюту хотите конвертировать рубли? Доступные варианты: USD, EUR, JPY.");
String currency = Console.ReadLine();
if (currency.Equals("USD"))
{
Console.WriteLine("Ваши сбережения в долларах: " + moneyBeforeSalary / rateUSD);
}
else if (currency.Equals("EUR"))
{
Console.WriteLine("Ваши сбережения в евро: " + moneyBeforeSalary / rateEUR);
}
else if (currency.Equals("JPY"))
{
Console.WriteLine("Ваши сбережения в йенах: " + moneyBeforeSalary / rateJPY);
}
else
{
Console.WriteLine("Валюта не поддерживается.");
}
}
else if (command.Equals("advice"))
{
if (moneyBeforeSalary < 3000)
{
Console.WriteLine("Сегодня лучше поесть дома. Экономьте и вы дотянете до зарплаты!");
}
else if (moneyBeforeSalary < 10000)
{
if (daysBeforeSalary < 10)
{
Console.WriteLine("Окей, пора в Макдак!");
}
else
{
Console.WriteLine("Сегодня лучше поесть дома. Экономьте и вы дотянете до зарплаты!");
}
}
else if (moneyBeforeSalary < 30000)
{
if (daysBeforeSalary < 10)
{
Console.WriteLine("Неплохо! Прикупите долларов и зайдите поужинать в классное место. :)");
}
else
{
Console.WriteLine("Окей, пора в Макдак!");
}
}
else
{
if (daysBeforeSalary < 10)
{
Console.WriteLine("Отлично! Заказывайте крабов!");
}
else
{
Console.WriteLine("Неплохо! Прикупите долларов и зайдите поужинать в классное место. :)");
}
}
}
else
{
Console.WriteLine("Извините, такой команды пока нет.");
}
}
}
}
Основной недостаток, который бросается в глаза, — вводить команды словами неудобно, можно легко ошибиться. Нужно исправить код приложения таким образом, чтобы вместо слов он принимал числа. Конвертация валют должна срабатывать, если пользователь ввёл число 1, а выдача совета по поводу ужина — число 2. Для этого нам нужно внести изменения в следующие строки:
Console.WriteLine("Введите команду. Доступные команды: convert и advice.");
String command = Console.ReadLine();
if (command.Equals("convert")) {
...
} else if (command.Equals("advice")) {
...
}
Для начала сделаем приложение более дружелюбным к пользователю: заменим призыв «Введите команду» на вопрос «Что вы хотите сделать?». Теперь с ним гораздо приятнее иметь дело. Далее создадим и оформим цифровое меню с двумя опциями: «1 — Конвертировать валюту» и «2 — Получить совет».
Console.WriteLine("Что вы хотите сделать?");
Console.WriteLine("1 - Конвертировать валюту");
Console.WriteLine("2 - Получить совет");
Теперь программа должна считать ответ пользователя из консоли. Раньше это происходило с помощью команды Console.ReadLine();, однако теперь у нас не слова, а цифры, поэтому нужно использовать int.Parse(Console.ReadLine().
int command = int.Parse(Console.ReadLine()
Следующий шаг — отредактировать условия при выборе команд. Вместо слов здесь также будут цифры 1 или 2. Их нужно сравнить с переменной command при помощи оператора проверки на равенство ==.
if (command == 1) {
...
} else if (command == 2) {
...
}
Готово! Теперь у финансового приложения появилось цифровое меню, пользователю больше не нужно мучиться, набирая слова на клавиатуре.
У финансового приложения теперь есть цифровое меню и вас больше не напугать исключениями. Однако программа по-прежнему даёт выбрать только одну команду, а после её выполнения завершается. Это неудобно — возможно, пользователь захочет не только конвертировать деньги, но и получить совет, однако для этого ему придётся перезапускать приложение. Исправить это можно, если добавить в код бесконечный цикл while и предусмотреть возможность выхода из него, например при выборе цифры 0. Программа сможет работать так:
...
Что вы хотите сделать?
1 - Конвертировать валюту
2 - Получить совет
0 - Выход
> 2
Окей, сегодня в Макдак!!
Что вы хотите сделать?
1 - Конвертировать валюту
2 - Получить совет
0 - Выход
> 0
Выход
На практике вам нужно завершить «прокачку» финансового приложения — добавить цифровое меню для выбора валюты при конвертации и с помощью бесконечного цикла сделать программу удобной для пользователя.