Перейти к основному содержимому

Обучающий проект - Разработка условных ветвлений и циклических структур в C#.

Введение

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

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

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

Разработанное вами приложение будет:

  • добавлять предопределенные данные образца в массив домашних животных.
  • итерировать блок кода "опции меню и выбор пользователя" для создания внешнего цикла вашего приложения.
  • реализовывать ветви кода, соответствующие выборам пользователя в меню.
  • отображать всю информацию, содержащуюся в массиве, используемом для хранения данных о домашних животных (на основе выбора пользователя в меню). Итерируйте блок кода "Добавить информацию о новом животном", который позволяет пользователю добавить одно или несколько новых животных в массив питомцев (на основе выбора пользователя в меню).

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

Цели обучения

В этом модуле вы научитесь:

  • Использовать Visual Studio для разработки консольного приложения на C#, использующего комбинацию операторов выбора и итерации для реализации логических рабочих процессов.
  • Оценивать базовые условия в приложении и принимать обоснованные решения между вариантами операторов выбора.
  • Оцените условия, лежащие в основе приложения, и примите обоснованное решение между вариантами операторов итерации.
  • Определять границы переменных на соответствующем уровне в приложении.

Обзор проекта

Вы работаете над приложением Contoso Pets - приложением, которое помогает устраивать домашних животных в новые дома. Спецификации вашего приложения следующие:

  • Создайте консольное приложение на C#.

  • Храните данные приложения в многомерном строковом массиве с именем ourAnimals.

  • Массив ourAnimals включает следующие «характеристики питомца» для каждого животного:

    • ID # питомца.
    • Вид животного (кошка или собака).
    • Возраст животного (годы).
    • Описание физического состояния/характеристик животного.
    • Описание характера животного.
    • Кличка животного.
  • Реализуйте примерный набор данных, в котором представлены собаки и кошки, находящиеся на вашем попечении.

  • Отобразите пункты меню для доступа к основным функциям приложения.

  • Основные функции позволяют выполнять следующие задачи:

    • Выводить информацию о питомцах всех животных в массиве ourAnimals.

    • Добавить новых животных в массив ourAnimals. При этом действуют следующие условия:

      • При добавлении нового животного в массив ourAnimals необходимо ввести вид животного (собака или кошка).
      • Идентификатор животного должен быть программно сгенерирован при добавлении нового животного в массив ourAnimals.
      • Некоторые физические характеристики животного могут быть неизвестны до осмотра ветеринара. Например, возраст, порода и статус кастрированного/стерилизованного животного.
      • Кличка и характер животного могут быть неизвестны, когда питомец только появился в доме.
    • Убедитесь в том, что возраст животных и их физические характеристики полностью заполнены. Это может потребоваться после осмотра ветеринара.

    • Убедитесь, что клички и описание характера животных заполнены (это действие может быть выполнено после того, как команда познакомится с животным).

    • Отредактируйте возраст животного (если дата рождения питомца известна и у него есть день рождения, пока он находится под нашей опекой).

    • Редактировать описание характера животного (животное может вести себя по-другому после того, как проведет больше времени под нашей опекой).

    • Показать всех кошек, соответствующих указанным пользователем физическим характеристикам.

    • Показать всех собак, соответствующих указанным пользователем физическим характеристикам.

Начальная версия приложения уже завершена. Проект начального кода для этого модуля представлен ниже и предоставляет следующие возможности кода:

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

  • В коде объявлен массив ourAnimals.

  • В коде используется цикл for вокруг конструкции if-elseif-else для заполнения массива ourAnimals набором данных образца.

  • Код отображает следующие пункты главного меню для выбора пользователем:

1. List all of our current pet information.
2. Assign values to the ourAnimals array fields.
3. Ensure animal ages and physical descriptions are complete.
4. Ensure animal nicknames and personality descriptions are complete.
5. Edit an animal’s age.
6. Edit an animal’s personality description.
7. Display all cats with a specified characteristic.
8. Display all dogs with a specified characteristic.

Enter menu item selection or type "Exit" to exit the program
  • Код считывает выбранный пользователем пункт меню и выводит сообщение, повторяющее его выбор.

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

  1. Обновите код, который используется для создания образца данных для приложения.
  2. Постройте цикл вокруг главного меню и создайте оператор выбора, который устанавливает ветку кода для каждого пункта меню.
  3. Напишите код для отображения всех данных массива OurAnimals (опция меню 1).
  4. Постройте цикл для ввода новых данных массива OurAnimals (опция меню 2 - часть 1).
  5. Напишите код для чтения и сохранения новых данных массива OurAnimals (пункт меню 2 - часть 2).

Вы будете тестировать свое приложение на каждом этапе разработки.

Постройте циклы выборки данных и меню

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

  1. Обзор кода: ознакомьтесь с содержимым файла Program.cs.
  2. Образец данных: преобразуйте структуру if-elseif-else в структуру switch-case, которая улучшает читаемость.
  3. Цикл меню: заключите главное меню и выбор пункта меню в цикл, который будет повторяться до тех пор, пока пользователь не нажмет «exit».
  4. Выбор меню: напишите код для структуры switch-case, которая устанавливает отдельные ветви кода для каждого пункта меню.
  5. Ветви кода: напишите заполнители в ветвях пунктов меню, которые обеспечат обратную связь с пользователем до тех пор, пока не будут разработаны функции приложения.
  6. Проверочный тест: выполните проверочные тесты для кода, который вы разработали в этом упражнении.

Подготовка проекта

  1. Создайте новый проект.
  2. Используйте стартовый код:
// the ourAnimals array will store the following: 
string animalSpecies = "";
string animalID = "";
string animalAge = "";
string animalPhysicalDescription = "";
string animalPersonalityDescription = "";
string animalNickname = "";

// variables that support data entry
int maxPets = 8;
string? readResult;
string menuSelection = "";

// array used to store runtime data, there is no persisted data
string[,] ourAnimals = new string[maxPets, 6];

// TODO: Convert the if-elseif-else construct to a switch statement

// create some initial ourAnimals array entries
for (int i = 0; i < maxPets; i++)
{
if (i == 0)
{
animalSpecies = "dog";
animalID = "d1";
animalAge = "2";
animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.";
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
animalNickname = "lola";
}
else if (i == 1)
{
animalSpecies = "dog";
animalID = "d2";
animalAge = "9";
animalPhysicalDescription = "large reddish-brown male golden retriever weighing about 85 pounds. housebroken.";
animalPersonalityDescription = "loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.";
animalNickname = "loki";
}
else if (i == 2)
{
animalSpecies = "cat";
animalID = "c3";
animalAge = "1";
animalPhysicalDescription = "small white female weighing about 8 pounds. litter box trained.";
animalPersonalityDescription = "friendly";
animalNickname = "Puss";
}
else if (i == 3)
{
animalSpecies = "cat";
animalID = "c4";
animalAge = "?";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
}
else
{
animalSpecies = "";
animalID = "";
animalAge = "";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
}

ourAnimals[i, 0] = "ID #: " + animalID;
ourAnimals[i, 1] = "Species: " + animalSpecies;
ourAnimals[i, 2] = "Age: " + animalAge;
ourAnimals[i, 3] = "Nickname: " + animalNickname;
ourAnimals[i, 4] = "Physical description: " + animalPhysicalDescription;
ourAnimals[i, 5] = "Personality: " + animalPersonalityDescription;
}

// display the top-level menu options

Console.Clear();

Console.WriteLine("Welcome to the Contoso PetFriends app. Your main menu options are:");
Console.WriteLine(" 1. List all of our current pet information");
Console.WriteLine(" 2. Add a new animal friend to the ourAnimals array");
Console.WriteLine(" 3. Ensure animal ages and physical descriptions are complete");
Console.WriteLine(" 4. Ensure animal nicknames and personality descriptions are complete");
Console.WriteLine(" 5. Edit an animal’s age");
Console.WriteLine(" 6. Edit an animal’s personality description");
Console.WriteLine(" 7. Display all cats with a specified characteristic");
Console.WriteLine(" 8. Display all dogs with a specified characteristic");
Console.WriteLine();
Console.WriteLine("Enter your selection number (or type Exit to exit the program)");

readResult = Console.ReadLine();
if (readResult != null)
{
menuSelection = readResult.ToLower();
}

Console.WriteLine($"You selected menu option {menuSelection}.");
Console.WriteLine("Press the Enter key to continue");

// pause code execution
readResult = Console.ReadLine();

В верхней части файла вы видите строку комментария и список переменных. Эти переменные, animalSpecies и animalNickname, используются для хранения значений характеристик питомцев. Позже в коде вы присваиваете значения характеристик многомерному массиву строк с именем ourAnimals. Каждая из этих переменных инициализируется и содержит строку нулевой длины «». Массив ourAnimals объявлен чуть ниже в коде.

Следующая группа переменных представляет собой смесь строковых и int-переменных, которые вы будете использовать для генерации данных образца, считывания пользовательского ввода и определения критериев выхода из основного цикла программы. Возможно, вы заметили строку кода string? readResult;. При использовании в объявлении переменной, подобном этому, символ ? определяет переменную нулевого типа. При чтении введенных пользователем значений с помощью метода Console.ReadLine() лучше всего использовать переменные с нулевым типом.

Последняя переменная - это двумерный строковый массив с именем ourAnimals. Поскольку вы создаете массив без инициализации значений, вы используете оператор new (оператор new используется для создания нового экземпляра типа). Количество строк определяется значением maxPets, которое было инициализировано до восьми. Количество характеристик, которые вы храните, равно шести, это строковые переменные, которые вы рассмотрели выше.

  1. Прокрутите страницу вниз, чтобы рассмотреть цикл for, содержащий конструкцию выбора if-elseif-else.
  2. Обратите внимание, что цикл for использует переменную maxPets, чтобы установить верхнюю границу на количество итераций
  3. Обратите внимание, что конструкция if-elseif-else выборочно ветвит ваш код на основе характеристик домашних животных.

Конструкция if-elseif-else используется для определения различных значений для первых четырех итераций цикла for. После четвертой итерации всем характеристикам присваивается пустая строка нулевой длины.

Значения переменных характеристик животных присваиваются массиву ourAnimals в нижней части цикла for.

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

  2. Обратите внимание, что вы присваиваете значение, возвращаемое методом Console.ReadLine(), нулевой строке readResult.

    Использование зануляемой строки является лучшей практикой для получения входных данных из метода ReadLine(). Убедившись, что вводимое значение не является нулевым, вы присваиваете его стандартной строковой переменной menuSelection. Этот процесс позволяет оценить значение выбора меню, не заботясь о нулевых значениях. Многие методы, принимающие строки в качестве входного параметра, выдадут ошибку, если им будет передано нулевое значение. Если вы не будете следовать этому шаблону ввода, компилятор кода, скорее всего, выдаст предупреждение при сборке вашего проекта.

    Заключительные строки файла Program.cs повторяют выбор пункта меню, а затем приостанавливают выполнение до нажатия клавиши Enter.

Преобразуйте оператор if в оператор switch

В этом задании вы преобразуете существующую конструкцию if-elseif-else в конструкцию switch-case. Оператор switch улучшает читабельность кода.

  1. Прокрутите вверх до начала цикла for, который используется для генерации данных образца.
  2. Обратите внимание, что конструкция if-elseif-else начинается со следующего оператора if и блока кода:
if (i == 0)
{
animalSpecies = "dog";
animalID = "d1";
animalAge = "2";
animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.";
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
animalNickname = "lola";
}
  1. Замените начальный оператор if и блок кода следующим кодом:
switch (i)
{
case 0:
animalSpecies = "dog";
animalID = "d1";
animalAge = "2";
animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.";
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
animalNickname = "lola";
break;

Код case 0: выполняет тот же выбор, что и выбор if (i == 0), который он заменяет. Вы будете делать соответствующие замены, чтобы завершить преобразование конструкции if-elseif-else в конструкцию switch-case.

  1. Обратите внимание, что под символом ; в конце оператора break появился символ красной загогулины. Visual Studio Code использует красную загогулину, чтобы помочь вам обнаружить проблемы в коде. В данном случае проблем несколько. Во-первых, вы не закрыли блок кода для оператора switch. Кроме того, у вас есть else if без if, что недопустимо. Вы устраните каждую из этих проблем по мере преобразования if в switch.
  2. Замените оператор else if (i == 1) и блок кода следующим кодом:
case 1:
animalSpecies = "dog";
animalID = "d2";
animalAge = "9";
animalPhysicalDescription = "large reddish-brown male golden retriever weighing about 85 pounds. housebroken.";
animalPersonalityDescription = "loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.";
animalNickname = "loki";
break;
  1. Замените оператор else if (i == 2) и блок кода следующим кодом:
case 2:
animalSpecies = "cat";
animalID = "c3";
animalAge = "1";
animalPhysicalDescription = "small white female weighing about 8 pounds. litter box trained.";
animalPersonalityDescription = "friendly";
animalNickname = "Puss";
break;
  1. Замените оператор else if (i == 3) и блок кода следующим кодом:
case 3:
animalSpecies = "cat";
animalID = "c4";
animalAge = "?";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
break;
  1. Замените оператор else и блок кода следующим кодом:
default:
animalSpecies = "";
animalID = "";
animalAge = "";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
break;

}
  1. Обратите внимание, что конструкция if-elseif-else теперь полностью заменена конструкцией switch, а символ красной бегущей строки исчез. Если части конструкции if-elseif-else все еще остаются или оператор switch не завершен, проверьте, не пропустили ли вы какой-нибудь шаг.
  2. Ваша готовая конструкция switch-case должна иметь структуру, похожую на следующий код:
примечание

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

switch (i)
{
case 0:
// variable assignments were removed for this view of the structure
break;

case 1:
// variable assignments were removed for this view of the structure
break;

case 2:
// variable assignments were removed for this view of the structure
break;

case 3:
// variable assignments were removed for this view of the structure
break;

default:
// variable assignments were removed for this view of the structure
break;
}

Напомним, что при выполнении секции switch не разрешается "проваливаться" в следующую секцию switch. Чтобы этого не произошло, используется оператор break.

Создание цикла меню программы

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

  1. В редакторе кода Visual Studio в верхней части кода, который используется для отображения пунктов меню, найдите следующий комментарий:
// display the top-level menu options

Создайте пустую строку кода над комментарием, а затем введите следующий код:

do
{

Заключив пункты меню программы в цикл do, вы гарантируете, что пользователь увидит пункты меню хотя бы один раз.

  1. Прокрутите вниз до самого низа файла с кодом
  2. Создайте пустую строку кода под кодом, который приостанавливает выполнение кода, а затем обновите код следующим образом:
// pause code execution
readResult = Console.ReadLine();

} while ();

Обратите внимание, что вы закрыли блок кода для цикла do и начали строить оператор while.

  1. Чтобы указать булево выражение, которое оценивается оператором while, обновите оператор while следующим образом:
while (menuSelection != "exit");

Это выражение обеспечит итерацию цикла do до тех пор, пока пользователь не решит "выйти" из приложения. На каждой итерации будет отображаться меню и считываться выбор пользователя.

  1. Обратите внимание, что отступы строк кода не соответствуют тому, что вы ожидаете увидеть внутри блока кода цикла do.
  2. Отформатируйте код используя встроенные средства среды разработки. Помимо правильного отступа строк кода, команда "Форматировать документ" применяет и другие правила форматирования кода. Однако она не исправляет синтаксические ошибки в вашем коде и может привести к неожиданным результатам, если ваш код содержит неполные или неправильно оформленные блоки кода. Команда "Форматировать документ" полезна при условии, что вы осторожны.
  3. Сохраните, соберите и запустите ваше приложение.
  4. Должно отобразиться следующее.
Welcome to the Contoso PetFriends app. Your main menu options are:
1. List all of our current pet information
2. Add a new animal friend to the ourAnimals array
3. Ensure animal ages and physical descriptions are complete
4. Ensure animal nicknames and personality descriptions are complete
5. Edit an animal's age
6. Edit an animal's personality description
7. Display all cats with a specified characteristic
8. Display all dogs with a specified characteristic

Enter your selection number (or type Exit to exit the program)
  1. Введите 1 и нажмите Enter
  2. Убедитесь, что ваш код возвращает "эхом" введенный вами выбор меню. В терминале должен появиться следующий вывод.
You selected menu option 1.
Press the Enter key to continue
  1. В командной строке Terminal нажмите клавишу Enter, чтобы продолжить. Нажатие Enter позволит вашему коду перейти к методу Console.ReadLine(), который находится перед оценкой выражения while в конце приложения.
  2. Чтобы убедиться, что ваш код продолжает принимать дополнительные варианты меню, попробуйте ввести один или несколько номеров других пунктов меню.

Если ваш код перестал работать после ввода "1", убедитесь, что вы сохранили обновления кода. При необходимости сохраните код, а затем попробуйте запустить приложение снова. Вы можете заметить, что можете ввести любое текстовое или числовое значение, или даже комбинацию букв и цифр.

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

  1. В командной строке Terminal, чтобы убедиться, что критерий выхода из цикла оценивается правильно, введите Exit или exit. Когда вы введете "Exit" или "exit", выражение while должно получить значение false и выполнение кода завершится.

  2. Завершите работу программы

Напишите оператор switch для выбора меню

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

  1. В редакторе кода Visual Studio найдите следующую строку кода Console.WriteLine(), которая используется для возврата эхо-сигнала о выборе меню.
Console.WriteLine($"You selected menu option {menuSelection}.");
  1. Чтобы начать разработку оператора switch, обновите код следующим образом:
//Console.WriteLine($"You selected menu option {menuSelection}.");
//Console.WriteLine("Press the Enter key to continue");

// pause code execution
//readResult = Console.ReadLine();

switch(menuSelection)
{

}
  1. Чтобы добавить первый паттерн case в оператор switch, обновите код оператора switch следующим образом:
switch(menuSelection)
{
case "1":
break;

}

Возможно, вы заметили, что используемый здесь шаблон case немного отличается от шаблона case, использованного при построении образца данных ранее в приложении (case 1: против case "1":). Объяснение этому простое. Ранее вы проверяли целочисленные значения, а теперь проверяете строковые значения.

  1. Возможно, вы заметили, что используемый здесь шаблон case немного отличается от шаблона case, использованного при построении образца данных ранее в приложении (case 1: против case "1":). Объяснение этому простое. Ранее вы проверяли целочисленные значения, а теперь проверяете строковые значения.
switch(menuSelection)
{
case "1":
break;

case "2":
break;

case "3":
break;

case "4":
break;

case "5":
break;

case "6":
break;

case "7":
break;

case "8":
break;

}
  1. Обратите внимание, что вы можете добавить необязательный случай по умолчанию в конец списка выбора следующим образом:
  2. Сохраните код, соберите проект. если возникли ошибки исправьте

Напишите код-заполнитель для каждого случая оператора switch

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

  1. В редакторе кода Visual Studio найдите строку кода, содержащую case "1": selection:
switch (menuSelection)
{
case "1":
break;
  1. Чтобы предоставить пользователю сообщение обратной связи между строками кода case "1": и break;, обновите код следующим образом:
switch (menuSelection)
{
case "1":
// List all of our current pet information
Console.WriteLine("this app feature is coming soon - please check back to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
  1. Добавьте такое же сообщение обратной связи для случая "2": выбор следующим образом:
switch (menuSelection)
{
case "1":
// List all of our current pet information
Console.WriteLine("this app feature is coming soon - please check back to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;

case "2":
// List all of our current pet information
Console.WriteLine("this app feature is coming soon - please check back to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
  1. Обновите комментарий к строке для случая "2": выбор, чтобы отразить второй вариант меню следующим образом:
case "2":
// Add a new animal friend to the ourAnimals array
Console.WriteLine("this app feature is coming soon - please check back to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
  1. Для вариантов выбора от case "3": до case "8": обновите код, добавив строки комментариев, отражающий текст соответствующего пункта меню. Например, ниже case "3": добавьте
// Убедитесь, что возраст и физическое описание животных полные. 

Вы можете скопировать текст пункта меню из строк кода, в которых отображаются пункты меню.

  1. Для вариантов выбора case "3": и case "4": добавьте следующее сообщение обратной связи и ReadLine() ниже комментария:
Console.WriteLine("Challenge Project - please check back soon to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
  1. Для оставшихся вариантов обновить код, добавив следующее сообщение обратной связи и ReadLine():
Console.WriteLine("UNDER CONSTRUCTION - please check back next month to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
примечание

Если вы добавили необязательный случай default в список выбора, не добавляйте сообщение обратной связи для этого случая.

  1. Исправьте все ошибки сборки или предупреждения, о которых вы видите сообщение, прежде чем продолжить.

Проверьте свою работу

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

  1. Запустите приложение
  2. В командной строке терминала, чтобы выбрать первый пункт меню, введите 1.
  3. Убедитесь, что на экране появилось ожидаемое сообщение «Скоро появится».
  4. Повторите предыдущий шаг, вводя номера всех остальных пунктов меню, чтобы убедиться, что в каждом случае отображается ожидаемое сообщение.
  5. В командной строке терминала введите Exit или exit, чтобы убедиться, что критерии выхода по-прежнему оцениваются правильно.

Напишите код для отображения всех данных массива OurAnimals

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

  1. Внешний цикл: постройте внешний цикл, который перебирает животных в массиве ourAnimals.
  2. Проверка данных: напишите код, который проверяет наличие данных о питомце и выводит идентификатор питомца, если данные о нем существуют.
  3. Внутренний цикл: постройте внутренний цикл, который отображает все характеристики питомцев, для которых есть данные.
  4. Проверочный тест: выполните проверочные тесты для кода, который вы разработали в этом упражнении.

Постройте цикл для итерации по массиву ourAnimals

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

  1. Убедитесь, что Visual Studio Code открыт и ваш файл Program.cs виден в редакторе.
  2. Внутри блока кода для оператора выбора switch(menuSelection) найдите следующие строки кода:
case "1":
// List all of our current pet information
Console.WriteLine("this app feature is coming soon - please check back to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
  1. Удалите оператор Console.WriteLine(), используемый для отображения сообщения «coming soon», и оставьте пустую строку кода под строкой // Перечислите всю информацию о наших текущих питомцах.

    Сообщение обратной связи не понадобится, поскольку вы будете отображать содержимое массива ourAnimals. По мере разработки кода, соответствующего другим пунктам меню, эти сообщения обратной связи также будут обновляться.

    Оставьте сообщение, в котором говорится, что для продолжения нажмите клавишу Enter.

  2. Начиная с пустой строки кода, которую вы создали, выполните оператор for следующим образом:

for ()
{
}
  1. Потратьте минуту на то, что вам нужно достичь с помощью этого оператора for.

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

В данном случае цикл for используется для итерации по массиву ourAnimals. Вы знаете, что массивы имеют нулевую индексацию, то есть массив с n элементами индексируется от 0 до n-1. Инициализатор for, условие for и итератор for должны соответствовать размерам массива. В данном случае цикл for должен начинаться с 0, увеличиваться на 1 и заканчиваться на maxPets-1.

Массив ourAnimals объявлен следующим образом: string[,] ourAnimals = new string[maxPets, 6];. Вы знаете, что значение, присвоенное maxPets, равно 8. В этом объявлении maxPets задает количество элементов в первом измерении массива, а не нулевой индекс, который вы используете для ссылки на элементы в массиве. Поэтому, хотя maxPets = 8, номера индексов массива варьируются от 0 до 7.

  1. Чтобы указать управляющее значение цикла for, обновите код следующим образом:
for (int i = 0; i < maxPets; i++)
{
}

Как видите, установка инициализатора for в int i = 0; соответствует нулевому индексу массива. Аналогично, установка условия for в i < maxPets; соответствует первой размерности массива. Наконец, установка итератора for в i++ будет увеличивать управляющее значение цикла на 1 на каждой итерации.

  1. Потратьте минуту на то, чтобы подумать о выборе между операторами for и foreach при итерации по массиву ourAnimals.

Цель состоит в том, чтобы перебрать по очереди каждое животное в массиве ourAnimals. Так почему бы не использовать цикл foreach? В конце концов, вы знаете, что оператор foreach предназначен для случаев, когда нужно перебрать каждый элемент массива элементов.

Причина, по которой вы не используете цикл foreach в этой ситуации, заключается в том, что массив ourAnimals является многомерным массивом. Поскольку ourAnimals - это многомерный строковый массив, каждый элемент, содержащийся в ourAnimals, является отдельным элементом типа string. Если бы вы использовали цикл foreach для итерации по ourAnimals, foreach распознал бы каждую строку как отдельный элемент в списке из 48 строковых элементов (8 x 6 = 48). Оператор foreach не будет обрабатывать два размера массива отдельно. Другими словами, цикл foreach не распознает 8 строк строковых элементов, где каждая строка содержит столбец из 6 элементов. Поскольку вы хотите работать с одним животным за раз и обрабатывать все шесть характеристик животного за одну итерацию, оператор foreach - не лучший выбор.

Однако если бы массив ourAnimals представлял собой неровный массив, сконфигурированный как массив строковых массивов, можно было бы использовать оператор foreach. В этом случае вы создадите один foreach для внешнего цикла и второй foreach для внутреннего цикла. Внешний цикл будет выполнять итерации по элементам «массива строк» в зубчатом массиве. Строковые массивы - это «строки» в двумерном массиве. Внутренний цикл перебирает элементы «строка», содержащиеся в массивах строк. Элементы строк в массивах строк являются «столбцами» двумерного массива.

Следующий пример кода демонстрирует подход с использованием зубчатых массивов.

string[][] jaggedArray = new string[][]
{
new string[] { "one1", "two1", "three1", "four1", "five1", "six1" },
new string[] { "one2", "two2", "three2", "four2", "five2", "six2" },
new string[] { "one3", "two3", "three3", "four3", "five3", "six3" },
new string[] { "one4", "two4", "three4", "four4", "five4", "six4" },
new string[] { "one5", "two5", "three5", "four5", "five5", "six5" },
new string[] { "one6", "two6", "three6", "four6", "five6", "six6" },
new string[] { "one7", "two7", "three7", "four7", "five7", "six7" },
new string[] { "one8", "two8", "three8", "four8", "five8", "six8" }
};

foreach (string[] array in jaggedArray)
{
foreach (string value in array)
{
Console.WriteLine(value);
}
Console.WriteLine();
}

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

  1. Исправьте все ошибки сборки или предупреждения, о которых вы видите сообщение, прежде чем продолжить. Помните, что сообщения об ошибках и предупреждениях сборки говорят вам о том, в чем проблема и где ее можно найти. При устранении проблем лучше всего начинать с проблем, возникающих в верхней части кода, и работать вниз. Сохраните и запустите проект.

Проверьте наличие данных о питомце и отобразите результат

В этом задании вы используете оператор if для поиска каждого питомца в массиве ourAnimals, которому были присвоены данные о характеристиках питомца. Если найден питомец с присвоенными данными, выводим его идентификатор. Если данные не назначены, ничего не отображается. Запустите код, чтобы убедиться, что операторы for и if работают правильно.

  1. Создайте пустую строку кода внутри блока оператора for следующим образом:
for (int i = 0; i < maxPets; i++)
{

}
  1. Чтобы создать оператор if, который проверяет наличие идентификационных данных питомца, обновите код следующим образом:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
}
}
  1. Потратьте минуту на то, что оценивает это выражение if и почему.

Сначала рассмотрим левую часть выражения: ourAnimals[i, 0]. Обратите внимание, что управляющая переменная цикла i используется для указания исследуемого животного. Как вы помните, 0 в [i, 0] соответствует характеристике petID. Поскольку первое измерение массива соответствует «номеру» животного, эта часть выражения гарантирует, что ваш код проверит значение, присвоенное petID, для каждого животного в массиве.

Во-вторых, рассмотрим выбор оператора сравнения. Обратите внимание, что используется оператор «неравно», !=. Выражение считается истинным, если значение, присвоенное petID, ourAnimals[i, 0], НЕ равно значению, указанному в правой части уравнения.

В-третьих, рассмотрим значение в правой части уравнения. Обратите внимание, что используется статическое строковое значение «ID #: ». Это значение по умолчанию, присваиваемое petID при создании данных выборки. Когда животному присваиваются характеристики, значение petID обновляется и уже не будет равно значению по умолчанию.

Это говорит о том, что блок кода оператора if будет выполнен, когда у текущего животного будут определены характеристики.

примечание

Это хороший пример того, когда следует использовать !=. Вам все равно, какое значение будет присвоено petID, лишь бы оно не было значением по умолчанию.

  1. Чтобы создать метод Console.WriteLine(), который выводит идентификатор питомца внутри блока кода оператора if, обновите свой код следующим образом:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
Console.WriteLine(ourAnimals[i, 0]);
}
}

Обратите внимание, что элемент массива можно использовать в качестве аргумента при вызове метода WriteLine().

  1. В меню Файл Visual Studio выберите Сохранить. Соберите программу. Исправьте все ошибки сборки или предупреждения, о которых вы увидите сообщение, прежде чем продолжить. Запустите программу.
  2. В командной строке терминала, чтобы убедиться, что новая логика кода работает так, как ожидалось, введите 1. На экране должны появиться следующие значения petID:
ID #: d1
ID #: d2
ID #: c3
ID #: c4
Press the Enter key to continue.

Эти идентификаторы соответствуют питомцам, которым присвоены данные.

Если при выборе пункта меню 1 ваш код выводит другой результат, пересмотрите и обновите код. Помните, что после внесения обновлений необходимо сохранить файл Program.cs.

Отображение всех характеристик питомцев, для которых назначены данные

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

  1. В редакторе кода найдите следующие строки кода в файле Program.cs:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
Console.WriteLine(ourAnimals[i, 0]);
}
}
  1. Чтобы создать цикл for, который будет перебирать характеристики каждого питомца, обновите код следующим образом:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
Console.WriteLine(ourAnimals[i, 0]);
for (int j = 0; j < 6; j++)
{
}
}
}

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

  1. Уделите минуту просмотру введенного вами оператора for.

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

Поскольку для каждого животного хранится шесть характеристик, инициализатор for имеет значение int j = 0; а условие for - j < 6;. Такая комбинация инициализатора и условия соответствует диапазону индексов массива, который вам нужен, - 0 - 5.

  1. Чтобы отобразить каждую характеристику питомца в отдельной строке, обновите код следующим образом:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
Console.WriteLine(ourAnimals[i, 0]);
for (int j = 0; j < 6; j++)
{
Console.WriteLine(ourAnimals[i, j]);
}
}
}
  1. Потратьте минуту на то, чтобы рассмотреть созданную вами вложенную структуру и вывод, который будет произведен вашим кодом.

Обратите внимание, что значение, записанное в консоль, ourAnimals[i, j], использует управляющие переменные цикла как из внешнего, так и из внутреннего циклов for.

Вы знаете каждый из следующих элементов:

  • Первая размерность массива ourAnimals соответствует различным домашним животным.
  • Вторая размерность массива ourAnimals соответствует характеристикам каждого питомца.
  • Оператор if предотвращает запуск внутреннего цикла, если текущему питомцу не присвоены данные о питомце.
  • Внутренний цикл завершает все свои итерации для каждой итерации внешнего цикла.

Таким образом, вы знаете, что характеристики каждого животного будут отображаться так, как нужно.

  1. Чтобы заменить сообщение petID пустым WriteLine(), обновите код следующим образом:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
Console.WriteLine();
for (int j = 0; j < 6; j++)
{
Console.WriteLine(ourAnimals[i, j]);
}
}
}

Это последнее обновление позволяет легче увидеть разделение между питомцами при выводе результатов в консоль.

  1. В меню Файл Visual Studio выберите Сохранить. Выполните сборку программы. Исправьте все ошибки сборки или предупреждения, о которых вы увидите сообщение, прежде чем продолжить.

Проверьте свою работу

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

  1. При необходимости откройте панель интегрированного терминала Visual Studio Code.

  2. В командной строке терминала введите dotnet run

  3. В командной строке терминала введите 1

  4. Убедитесь, что данные о питомцах отображаются для четырех питомцев, которым были присвоены данные.

ID #: d1
Species: dog
Age: 2
Nickname: lola
Physical description: medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.
Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.

ID #: d2
Species: dog
Age: 9
Nickname: loki
Physical description: large reddish-brown male golden retriever weighing about 85 pounds. housebroken.
Personality: loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.

ID #: c3
Species: cat
Age: 1
Nickname: Puss
Physical description: small white female weighing about 8 pounds. litter box trained.
Personality: friendly

ID #: c4
Species: cat
Age: ?
Nickname:
Physical description:
Personality:
Press the Enter key to continue.
  1. Выйдите из приложения, а затем закройте панель терминала.

Создайте и протестируйте цикл для ввода данных о новом питомце

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

  1. Вычислить petCount: написать код, который подсчитывает количество питомцев в массиве ourAnimals, которым были присвоены данные.
  2. Условные сообщения: напишите код для вывода сообщения, если petCount меньше maxPets.
  3. Внешний цикл: постройте структуру цикла, которая будет использоваться для ввода новых данных массива ourAnimals.
  4. Критерии выхода: напишите код, который оценивает условие выхода для цикла «ввод новых данных массива ourAnimals».
  5. Проверочный тест: выполните проверочные тесты для кода, который вы разработали в этом упражнении.

Подсчитайте количество домашних животных в массиве ourAnimals

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

  1. Убедитесь, что Visual Studio открыта и ваш файл Program.cs виден в редакторе.

  2. Найдите оператор switch(menuSelection), а затем найдите строку кода case «2»:.

  3. Найдите оператор Console.WriteLine(), который выводит сообщение «скоро будет», а затем замените его пустой строкой кода.

  4. В созданной вами пустой строке кода, чтобы объявить переменные anotherPet и petCount, введите следующий код:

string anotherPet = "y";
int petCount = 0;

Эти две переменные управляют итерацией цикла while, который используется для ввода новых данных о питомце. Вы инициализируете обе переменные в рамках объявления.

  • AnotherPet инициализируется значением y перед началом цикла while. Внутри цикла while она получит значение, присвоенное пользователем, либо y, либо n.

  • PetCount представляет собой количество животных с назначенными характеристиками питомца. Ему будет присвоено вычисляемое значение вне цикла while, а внутри цикла while оно будет увеличиваться на 1 каждый раз, когда в массив ourAnimals будет добавлено новое животное.

warning

Область действия переменных всегда должна быть как можно более узкой. В приложении Contoso Pets вы могли бы задать область видимости petCount на уровне приложения, а не на уровне блока кода case «2»:. Более широкая область охвата позволит вам получить доступ к petCount из любой точки приложения. Если бы petCount был доступен на уровне приложения, вы могли бы присвоить ему значение при создании данных образца и программно управлять его значением на протяжении всего остального приложения. Например, когда вы находите дом для питомца и удаляете его из массива ourAnimals, вы можете уменьшить petCount на 1. Вопрос в том, на каком уровне следует задать область видимости переменной, если вы не уверены, что она будет использоваться в других частях вашего приложения? В данном случае заманчиво присвоить переменной petCount значение на уровне приложения, даже если вы больше нигде ее не используете. В конце концов, выделение petCount на уровне приложения гарантирует, что она будет доступна, если вы решите использовать ее в другом месте. Возможно, на уровне приложения можно было бы объявить и другие переменные. Таким образом, ваши переменные всегда будут в области видимости и доступны. Так почему бы не объявить переменные на уровне приложения, если вы думаете, что они могут быть использованы позже в приложении? Развертывание переменных на более высоком уровне, чем это необходимо, может привести к проблемам. Расширение масштаба увеличивает требования к ресурсам приложения и может подвергнуть его ненужным рискам безопасности. По мере того как ваши приложения становятся все больше и сложнее, им требуется все больше ресурсов. Телефоны и компьютеры выделяют память под эти ресурсы, когда они находятся в области видимости. По мере того как ваши приложения становятся более «реальными», они становятся более доступными. Приложения часто доступны из «облака» или других приложений. Эти проблемы усугубляются тем, что приложения часто остаются запущенными, когда они не используются. Важно держать под контролем требования приложения к ресурсам и максимально снизить уровень безопасности. Хотя современные операционные системы отлично справляются с управлением ресурсами и обеспечением безопасности приложений, все же лучше, чтобы переменные были ограничены до уровня, на котором они действительно необходимы. В приложении Contoso Pets, если вы решите использовать petCount более широко в приложении, вы можете обновить свой код, чтобы охватить petCount на более высоком уровне. Помните, что переменные должны иметь как можно более узкую область видимости, и увеличивайте их область видимости только тогда, когда это становится необходимым.

  1. В строке кода под объявлением переменных, чтобы создать цикл, который перебирает животных в массиве ourAnimals, введите следующий код:
for (int i = 0; i < maxPets; i++)
{
}

Этот код должен выглядеть знакомо. Вы будете использовать этот цикл for при каждом итерационном просмотре массива ourAnimals.

  1. Внутри блока кода нашего цикла for, чтобы проверить, были ли присвоены данные о характеристиках животного, введите следующий код:
if (ourAnimals[i, 0] != "ID #: ")
{
}

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

  1. Внутри блока кода созданного вами if, чтобы увеличить petCount на 1, введите следующий код:
petCount += 1;
  1. Потратьте минуту на изучение вашего завершенного цикла for. Ваш завершенный цикл for должен выглядеть следующим образом:
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
petCount += 1;
}
}

Этот код будет циклически просматривать массив ourAnimals, проверяя наличие присвоенных данных. Когда он находит животное с присвоенными данными, он увеличивает счетчик petCounter.

  1. Сохраните код. Исправьте ошибки.
примечание

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

Вывод сообщения, когда количество питомцев меньше maxPets

В этом задании вы проверяете, меньше ли PetCount, чем maxPets, и если меньше, то выводите сообщение для пользователя.

  1. В пустой строке кода под созданным вами циклом for, чтобы проверить, меньше ли petCount, чем maxPets, введите следующий код:
if (petCount < maxPets)
{
}
  1. Внутри блока кода оператора if, чтобы вывести сообщение пользователю, введите следующий код:
Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more.");

Пользователи приложения собираются ввести характеристики домашних животных. Это сообщение содержит важный контекст.

  1. Уделите минуту просмотру ветви кода case "2": оператора switch. На данный момент ветвь кода case "2": должна выглядеть следующим образом:
case "2":
// Add a new animal friend to the ourAnimals array
string anotherPet = "y";
int petCount = 0;
for (int i = 0; i < maxPets; i++)
{
if (ourAnimals[i, 0] != "ID #: ")
{
petCount += 1;
}

}

if (petCount < maxPets)
{
Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more.");
}

Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
  1. В меню Файл Visual Studio выберите Сохранить.

Соберите вашу программу.

Исправьте все ошибки сборки, о которых вы увидите сообщение, прежде чем продолжить.

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

Помните, что предупреждающие сообщения - это то, что должно вас насторожить, но они не помешают вам запустить программу.

  1. Запустите вашу программу.
  2. В командной строке Terminal введите 2 Это значение соответствует вашему случаю "2": ветвь кода.
  3. Убедитесь, что в терминале отображается следующее сообщение.
We currently have 4 pets that need homes. We can manage 4 more.
Press the Enter key to continue.

Если ожидаемое сообщение не отображается, просмотрите свой код, чтобы выявить и устранить проблему. Сохраните изменения, перестройте и запустите приложение снова. Прежде чем продолжить, убедитесь, что код работает так, как ожидалось.

Постройте структуру цикла, которая будет использоваться для ввода новых данных массива ourAnimals

В этом задании вы создаете цикл while, который продолжает итерацию до тех пор, пока anotherPet не станет равным y, а PetCount не станет меньше maxPets.

  1. В редакторе кода создайте пустую строку кода под блоком кода if (petCount < maxPets).
  2. Чтобы начать процесс создания нового цикла while, введите следующий код:
while (anotherPet == "y" && petCount < maxPets)
{
}
  1. В меню Visual Studio File выберите Save. Соберите проект. Обратите внимание, что вы больше не получаете предупреждение о том, что anotherPet не используется. Если при сборке были обнаружены ошибки или предупреждения, устраните их, прежде чем продолжить.

Проверьте условие выхода из цикла для новых питомцев

В этом задании вы обновляете блок кода while (anotherPet == "y" && petCount < maxPets). Новый код увеличивает значение petCount, а затем проверяет, меньше ли petCount, чем maxPets. Если petCount меньше maxPets, вы спрашиваете пользователя, хочет ли он ввести информацию о другом питомце, и убеждаетесь, что ответом будет либо y, либо n. После блока кода while (anotherPet == "y" && petCount < maxPets) вы проверяете значение petCount. Если petCount равно maxPets, вы сообщаете пользователю, что больше питомцы не могут быть добавлены.

примечание

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

  1. Создайте пустую строку кода внутри блока кода цикла while (anotherPet == "y" && petCount < maxPets), который вы создали в предыдущем задании.
  2. Чтобы увеличить значение petCount, введите следующий код:
// increment petCount (the array is zero-based, so we increment the counter after adding to the array)
petCount = petCount + 1;
  1. Чтобы проверить, меньше ли petCount, чем maxPets, введите следующий код:
// check maxPet limit
if (petCount < maxPets)
{
}
  1. Внутри блока кода созданного вами оператора if, чтобы спросить пользователя, хочет ли он добавить еще одного питомца, введите следующий код:
// another pet?
Console.WriteLine("Do you want to enter info for another pet (y/n)");
  1. Ниже сообщения WriteLine(), которое вы ввели, чтобы прочитать ответ пользователя и убедиться, что он ввел "y" или "n", введите следующий код:
do
{
readResult = Console.ReadLine();
if (readResult != null)
{
anotherPet = readResult.ToLower();
}

} while (anotherPet != "y" && anotherPet != "n");
  1. Найдите оператор break, который отделяет case "2"; от case "3"; в операторе switch.
  2. Обратите внимание на операторы Console.WriteLine() и Console.ReadLine() в конце нашего кода case "2";. Этот код выводит сообщение пользователю, а затем приостанавливает работу приложения.
  3. Чтобы заключить операторы Console.WriteLine() и Console.ReadLine() внутри оператора if, измените свой код следующим образом:
if (petCount >= maxPets)
{
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
}

break;

case "3":

Значение параметра petCount увеличивается внутри цикла while. Если значение petCount равно maxPets, в массив ourAnimals больше не могут быть добавлены питомцы. Вы должны сообщить пользователю, когда это произойдет.

  1. Чтобы сообщить пользователю, что Contoso Pets достигли своей емкости, обновите код следующим образом:
if (petCount >= maxPets)
{
Console.WriteLine("We have reached our limit on the number of pets that we can manage.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
}

break;

case "3":
  1. Уделите минуту просмотру кода в цикле while и созданного вами пользовательского сообщения. Ваш цикл while (anotherPet == "y" && petCount < maxPets) и код, выводящий пользовательское сообщение, должны выглядеть следующим образом:
while (anotherPet == "y" && petCount < maxPets)
{
// increment petCount (the array is zero-based, so we increment the counter after adding to the array)
petCount = petCount + 1;

// check maxPet limit
if (petCount < maxPets)
{
// another pet?
Console.WriteLine("Do you want to enter info for another pet (y/n)");
do
{
readResult = Console.ReadLine();
if (readResult != null)
{
anotherPet = readResult.ToLower();
}

} while (anotherPet != "y" && anotherPet != "n");
}
}

if (petCount >= maxPets)
{
Console.WriteLine("We have reached our limit on the number of pets that we can manage.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
}
  1. Сохраните файлы, исправьте ошибки если есть.

Проверьте свою работу

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

  1. Запустите приложение
  2. В командной строке терминала введите 2 Убедитесь, что вы видите следующие сообщения:
We currently have 4 pets that need homes. We can manage 4 more.
Do you want to enter info for another pet (y/n)
  1. В командной строке терминала введите n
  2. Убедитесь, что ваш код выходит из цикла ввода новых питомцев, когда вы ввели "n".

Если логика вашего кода работает так, как ожидалось, вы должны увидеть главное меню, отображаемое в терминале.

Если ваш код не выходит из цикла, когда ожидалось, нажмите Ctrl + C в терминале, чтобы принудительно остановить выполнение. Вам нужно пройтись по коду вручную и отследить значения переменных критериев выхода. При необходимости обновите код, чтобы обеспечить выход из цикла while, когда пользователь вводит "n". Сохраните изменения, перестройте программу и проведите проверочный тест, чтобы вернуться к этому моменту.

  1. В командной строке терминала введите 2 И снова на экране появятся следующие сообщения:
We currently have 4 pets that need homes. We can manage 4 more.
Do you want to enter info for another pet (y/n)
  1. В командной строке терминала введите y
  2. Потратьте минуту на то, как используется petCount в вашем коде.

Прежде чем проверять код, необходимо понять логику его работы.

В данном случае логика кода основывается на взаимосвязи между petCount и maxPets. Вы знаете, что maxPets присваивается значение 8, но как быть с petCount? Следующие пункты помогут оценить реализованную вами логику:

  • Вы знаете, что при входе в первую итерацию цикла while значение PetCount равно 4.

  • Вы знаете, что при каждой итерации цикла while значение petCount увеличивается.

  • Вы знаете, что значение, присвоенное petCount, и способ увеличения petCount влияют на то, как данные хранятся в массиве ourAnimals. Следующие пункты объясняют связь между petCount и данными, хранящимися в ourAnimals:

    • Приложение добавляет четырех питомцев в массив ourAnimals при создании образца данных.
    • Приложение сохраняет новые данные в массив ourAnimals, когда значение параметра petCount равно 4. Это не ошибка. Код имеет смысл, если вспомнить, что элементы массива имеют нулевое значение. Например, ourAnimals[0,0] содержит идентификатор животного 1, а ourAnimals[3,0] - идентификатор животного 4. Поэтому, когда petCount равен 4, вы храните данные о пятом питомце.
    • Приложение сохранит данные о питомце в массив до того, как увеличит petCount.
    • Приложение увеличивает petCount до того, как предложит пользователю добавить еще одного питомца.
    • Когда приложение впервые отображает запрос «Хотите ли вы ввести информацию о другом питомце (y/n)», значение petCount уже равно 5.
  • Если пользователь ввел y в первом запросе Do you want to enter info for another pet (y/n), вы знаете об этом:

    • Цикл while (anotherPet == «y» && petCount < maxPets) будет итерироваться. Вы знаете, что цикл будет повторяться, потому что anotherPet == «y» и petCount < maxPets.
    • Значение, присвоенное petCount, будет увеличено (при итерации цикла while).
    • Значение, присвоенное petCount, будет равно 6 (после того как пользователь в первый раз введет y).

Не забывайте об этом анализе логики кода, когда будете продолжать тестировать приложение.

  1. Обратите внимание, что панель терминала обновляется с тем же сообщением "another pet?", но ваш код не отображает обновленный petCount. Теперь панель терминала должна отображать следующий вывод:
We currently have 4 pets that need homes. We can manage 4 more.
Do you want to enter info for another pet (y/n)
y
Do you want to enter info for another pet (y/n)
  1. В командной строке Terminal введите y Когда вы введете y во второй раз, количество питомцев увеличится до 7. Таким образом, количество питомцев все еще меньше, чем maxPets
  2. В командной строке Terminal введите y Когда вы введете y в третий раз, значение petCount увеличится до 8. Таким образом, количество питомцев теперь равно maxPets
  3. Убедитесь, что ваш код завершает цикл while, когда вы в третий раз вводите y. Теперь на панели терминала должен появиться следующий вывод:
We currently have 4 pets that need homes. We can manage 4 more.
Do you want to enter info for another pet (y/n)
y
Do you want to enter info for another pet (y/n)
y
Do you want to enter info for another pet (y/n)
y
We have reached our limit on the number of pets that we can manage.
Press the Enter key to continue.

Если ваш код не завершает цикл в ожидаемый момент, пройдитесь по коду вручную и отследите значения переменных критериев выхода. Обновите код, чтобы обеспечить выход из цикла, когда petCount достигнет значения, равного maxPets. Продолжайте отвечать "y", пока не убедитесь, что значение petCount равно maxPets, которое по умолчанию равно 8.

Напишите код для чтения и сохранения новых данных массива ourAnimals

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

  1. Чтение и проверка вида: постройте цикл и внутреннюю структуру кода, используемую для ввода и проверки вида питомца.
  2. Создание идентификатора питомца: напишите код, который использует petCount и название вида для создания значения petID.
  3. Чтение и проверка возраста: постройте цикл и внутреннюю структуру кода, используемую для ввода и проверки возраста питомца.
  4. Чтение и проверка физического описания: постройте цикл и внутреннюю структуру кода, используемую для ввода физического описания питомца.
  5. Прочитать и подтвердить описание личности: постройте цикл и внутреннюю структуру кода для ввода описания личности питомца.
  6. Чтение и проверка клички: построение цикла и внутренней структуры кода для ввода клички питомца.
  7. Проверочный тест: выполните проверочные тесты для кода, который вы разработали в этом упражнении.

Создайте цикл для считывания и проверки вида животного

В этом задании вы создаете цикл do, который выполняет итерацию до тех пор, пока пользователь не введет правильное название вида, либо собаки, либо кошки. Вы повторно используете свою voidable строку readResult для получения входных данных Console.ReadLine(). Вы также повторно используете строковую переменную animalSpecies, которую вы использовали при генерации данных образца. Вы добавляете в приложение новую булеву переменную validEntry. Вы используете validEntry в выражении, которое оценивается как критерий выхода из цикла do.

  1. Убедитесь, что Visual Studio открыта и ваш файл Program.cs виден в редакторе.
  2. Найдите оператор while (anotherPet == "y" && petCount < maxPets), а затем добавьте пустую строку кода в верхний блок кода.
  3. В созданной вами пустой строке кода, чтобы объявить validEntry с начальным значением false, введите следующий код:
bool validEntry = false;
  1. В строке под объявлением validEntry, чтобы создать цикл do для ввода данных о видах, введите следующий код:
// get species (cat or dog) - string animalSpecies is a required field 
do
{
} while (validEntry == false);
  1. Внутри блока кода оператора do, чтобы создать приглашение на экран и считать введенные пользователем данные, введите следующий код:
Console.WriteLine("\n\rEnter 'dog' or 'cat' to begin a new entry");
readResult = Console.ReadLine();
  1. Чтобы убедиться, что значение readResult НЕ равно null, прежде чем присваивать значение readResult объекту animalSpecies, введите следующий код:
if (readResult != null)
{
animalSpecies = readResult.ToLower();

}
  1. В строке под присвоением значения animalSpecies, чтобы убедиться, что animalSpecies содержит действительное название вида, введите следующий код:
if (animalSpecies != "dog" && animalSpecies != "cat")
{
validEntry = false;
}
else
{
validEntry = true;
}
  1. Сравните выполненный цикл ввода данных о названии вида со следующим кодом:
// get species (cat or dog) - string animalSpecies is a required field 
do
{
Console.WriteLine("\n\rEnter 'dog' or 'cat' to begin a new entry");
readResult = Console.ReadLine();
if (readResult != null)
{
animalSpecies = readResult.ToLower();
if (animalSpecies != "dog" && animalSpecies != "cat")
{
//Console.WriteLine($"You entered: {animalSpecies}.");
validEntry = false;
}
else
{
validEntry = true;
}
}
} while (validEntry == false);
  1. Сохраните файл. Соберите проект. Если были получены сообщения об ошибках или предупреждениях сборки, устраните их, прежде чем продолжить.

Создайте значение идентификатора животного

В этой задаче вы используете переменные animalSpecies и petCount для создания значения, которое вы присваиваете animalID.

  1. Добавьте пустую строку кода под блоком кода цикла ввода данных о названии вида.
  2. Чтобы создать и присвоить значение animalID, введите следующий код:
// build the animal the ID number - for example C1, C2, D3 (for Cat 1, Cat 2, Dog 3)
animalID = animalSpecies.Substring(0, 1) + (petCount + 1).ToString();

Создайте цикл для считывания и проверки возраста питомца

В этом задании вы создаете цикл do, который выполняет итерацию до тех пор, пока пользователь не введет либо ?, либо правильное целое число, обозначающее возраст питомца в годах. Вы повторно используете voidable строку readResult для захвата ввода Console.ReadLine(). Вы также повторно используете строковую переменную animalAge, которую вы использовали при генерации данных образца. Чтобы проверить, представляет ли строка animalAge действительное целое число, вы используете логическое значение validEntry. Вы объявляете новую целочисленную переменную с именем petAge для хранения числового значения. И снова булево значение validEntry используется в выражении, которое оценивается как критерий выхода для нашего цикла do.

  1. Добавьте пустую строку кода под строкой, используемой для присвоения значения нашей переменной animalID.
  2. Чтобы создать цикл do для ввода данных о возрасте, введите следующий код:
// get the pet's age. can be ? at initial entry. 
do
{
} while (validEntry == false);
  1. В блоке кода оператора do, чтобы объявить целочисленную переменную с именем petAge, введите следующий код:
int petAge;
  1. В строке под объявлением petAge, чтобы вывести подсказку и считать введенные пользователем данные, введите следующий код:
Console.WriteLine("Enter the pet's age or enter ? if unknown");
readResult = Console.ReadLine();
  1. Чтобы убедиться, что значение readResult не равно null, прежде чем присвоить значение readResult значению animalAge, введите следующий код:
if (readResult != null)
{
animalAge = readResult;

}
  1. В строке под присвоением значения animalAge, чтобы проверить, ввел ли пользователь ? перед проверкой на правильность целого числа, введите следующий код:
if (animalAge != "?")
{
validEntry = int.TryParse(animalAge, out petAge);
}
else
{
validEntry = true;
}
  1. Сравните готовый цикл ввода данных о возрасте со следующим кодом:
// get the pet's age. can be ? at initial entry.
do
{
int petAge;
Console.WriteLine("Enter the pet's age or enter ? if unknown");
readResult = Console.ReadLine();
if (readResult != null)
{
animalAge = readResult;
if (animalAge != "?")
{
validEntry = int.TryParse(animalAge, out petAge);
}
else
{
validEntry = true;
}
}
} while (validEntry == false);
  1. Сохраните файл. Соберите проект. Если были получены сообщения об ошибках или предупреждениях сборки, устраните их, прежде чем продолжить.

Создайте цикл для чтения и проверки физического описания животного

В этом задании вы создаете цикл do, который выполняет итерацию до тех пор, пока пользователь не введет строковое значение, представляющее собой физическое описание домашнего животного. Вы повторно используете voidable строку readResult для захвата ввода Console.ReadLine(). Вы также повторно используете строковую переменную animalPhysicalDescription, которую вы использовали при генерации данных выборки. Вы используете значение, присвоенное animalPhysicalDescription, в выражении, которое оценивается в качестве критерия выхода для нашего цикла do.

  1. Добавьте пустую строку кода под блоком кода цикла ввода данных о возрасте.
  2. Чтобы создать цикл do для ввода данных о физическом описании, введите следующий код:
// get a description of the pet's physical appearance/condition - animalPhysicalDescription can be blank.
do
{
} while (animalPhysicalDescription == "");
  1. Внутри блока кода оператора do, чтобы создать приглашение на экран и считать введенные пользователем данные, введите следующий код:
Console.WriteLine("Enter a physical description of the pet (size, color, gender, weight, housebroken)");
readResult = Console.ReadLine();
  1. Чтобы убедиться, что значение readResult не равно null, прежде чем присвоить значение readResult значению animalPhysicalDescription, введите следующий код:
if (readResult != null)
{
animalPhysicalDescription = readResult.ToLower();

}
  1. Чтобы присвоить значение "tbd" параметру animalPhysicalDescription, когда введенное значение равно "", введите следующий код:
if (animalPhysicalDescription == "")
{
animalPhysicalDescription = "tbd";
}
  1. Сравните заполненный цикл ввода данных физического описания со следующим кодом:
// get a description of the pet's physical appearance/condition - animalPhysicalDescription can be blank.
do
{
Console.WriteLine("Enter a physical description of the pet (size, color, gender, weight, housebroken)");
readResult = Console.ReadLine();
if (readResult != null)
{
animalPhysicalDescription = readResult.ToLower();
if (animalPhysicalDescription == "")
{
animalPhysicalDescription = "tbd";
}
}
} while (animalPhysicalDescription == "");
  1. Сохраните файл. Соберите проект. Если были получены сообщения об ошибках или предупреждениях сборки, устраните их, прежде чем продолжить.

Постройте цикл для чтения и проверки описания личности питомца

В этом задании вы создаете цикл do, который выполняет итерацию до тех пор, пока пользователь не введет строковое значение, представляющее собой описание характера питомца. Вы повторно используете voidable строку readResult для захвата ввода Console.ReadLine(). Вы также повторно используете строковую переменную animalPersonalityDescription, которую вы использовали при генерации данных выборки. Вы используете значение, присвоенное animalPersonalityDescription, в выражении, которое оценивается в качестве критерия выхода для нашего цикла do.

  1. Добавьте пустую строку кода под блоком кода цикла ввода данных физического описания.
  2. Чтобы создать цикл do для ввода данных об описании личности, введите следующий код:
// get a description of the pet's personality - animalPersonalityDescription can be blank.
do
{
} while (animalPersonalityDescription == "");
  1. Внутри блока кода оператора do, чтобы создать приглашение на экран и считать введенные пользователем данные, введите следующий код:
Console.WriteLine("Enter a description of the pet's personality (likes or dislikes, tricks, energy level)");
readResult = Console.ReadLine();
  1. Чтобы убедиться, что значение readResult не равно null, прежде чем присвоить значение readResult значению animalPersonalityDescription, введите следующий код:
if (readResult != null)
{
animalPersonalityDescription = readResult.ToLower();

}
  1. Чтобы присвоить значение "tbd" параметру animalPersonalityDescription, когда введенное значение равно "", введите следующий код:
if (animalPersonalityDescription == "")
{
animalPersonalityDescription = "tbd";
}
  1. Сравните заполненный цикл ввода данных физического описания со следующим кодом:
// get a description of the pet's personality - animalPersonalityDescription can be blank.
do
{
Console.WriteLine("Enter a description of the pet's personality (likes or dislikes, tricks, energy level)");
readResult = Console.ReadLine();
if (readResult != null)
{
animalPersonalityDescription = readResult.ToLower();
if (animalPersonalityDescription == "")
{
animalPersonalityDescription = "tbd";
}
}
} while (animalPersonalityDescription == "");
  1. Сохраните файл. Соберите проект. Если были получены сообщения об ошибках или предупреждениях сборки, устраните их, прежде чем продолжить.

Создайте цикл для чтения и проверки клички питомца

В этом задании вы создаете цикл do, который выполняет итерацию до тех пор, пока пользователь не введет строковое значение, представляющее собой кличку для домашнего животного. Вы повторно используете voidable строку readResult для захвата ввода Console.ReadLine(). Вы также повторно используете строковую переменную animalNickname, которую вы использовали при генерации данных выборки. Вы используете значение, присвоенное animalNickname, в выражении, которое оценивается в качестве критерия выхода для нашего цикла do.

  1. Добавьте пустую строку кода под блоком кода цикла ввода данных описания личности.
  2. Чтобы создать цикл do для ввода данных об описании личности, введите следующий код:
// get the pet's nickname. animalNickname can be blank.
do
{
} while (animalNickname == "");
  1. Внутри блока кода оператора do, чтобы создать приглашение на экран и считать введенные пользователем данные, введите следующий код:
Console.WriteLine("Enter a nickname for the pet");
readResult = Console.ReadLine();
  1. Чтобы убедиться, что значение readResult не равно null, прежде чем присвоить значение readResult имени животного (animalNickname), введите следующий код:
if (readResult != null)
{
animalNickname = readResult.ToLower();

}
  1. Чтобы присвоить значение "tbd" для animalNickname, когда введенное значение равно "", введите следующий код:
if (animalNickname == "")
{
animalNickname = "tbd";
}
  1. Сравните выполненный цикл ввода данных о псевдониме со следующим кодом:
// get the pet's nickname. animalNickname can be blank.
do
{
Console.WriteLine("Enter a nickname for the pet");
readResult = Console.ReadLine();
if (readResult != null)
{
animalNickname = readResult.ToLower();
if (animalNickname == "")
{
animalNickname = "tbd";
}
}
} while (animalNickname == "");
  1. Сохраните файл. Соберите проект. Если были получены сообщения об ошибках или предупреждениях сборки, устраните их, прежде чем продолжить.

Сохраните информацию о новом питомце

В этом задании вы сохраните введенные значения характеристик домашних животных в массив ourAnimals.

  1. Добавьте пустую строку кода под блоком кода цикла ввода данных о кличке.
  2. Чтобы сохранить значения данных, указанные пользователем, введите следующий код:
// store the pet information in the ourAnimals array (zero based)
ourAnimals[petCount, 0] = "ID #: " + animalID;
ourAnimals[petCount, 1] = "Species: " + animalSpecies;
ourAnimals[petCount, 2] = "Age: " + animalAge;
ourAnimals[petCount, 3] = "Nickname: " + animalNickname;
ourAnimals[petCount, 4] = "Physical description: " + animalPhysicalDescription;
ourAnimals[petCount, 5] = "Personality: " + animalPersonalityDescription;
  1. Сохраните файл. Соберите проект. Если были получены сообщения об ошибках или предупреждениях сборки, устраните их, прежде чем продолжить.

Проверьте свою работу

В этом задании вы запустите свое приложение из интегрированного терминала и убедитесь, что ввод данных о домашних животных работает правильно.

  1. Запустите приложение
  2. В командной строке терминала введите 2
  3. Убедитесь, что панель терминала обновилась и показывает следующий результат:
We currently have 4 pets that need homes. We can manage 4 more.

Enter 'dog' or 'cat' to begin a new entry
  1. Введите следующие значения в командных подсказках терминала и убедитесь, что каждая последующая подсказка отображается:
  • В подсказке Введите «dog» или «cat», чтобы начать новый ввод, введите dog
  • В строке Введите возраст животного или введите ?, если неизвестно. Введите ?
  • В строке Введите физическое описание животного (размер, цвет, пол, вес, приучен ли к дому) нажмите клавишу Enter.
  • В строке Введите описание характера питомца (симпатии или антипатии, трюки, уровень энергии) нажмите клавишу Enter.
  • В подсказке «Введите кличку для питомца» нажмите клавишу Enter.

Панель терминала должна быть обновлена следующим образом:

Enter 'dog' or 'cat' to begin a new entry
dog
Enter the pet's age or enter ? if unknown
?
Enter a physical description of the pet (size, color, gender, weight, housebroken)

Enter a description of the pet's personality (likes or dislikes, tricks, energy level)

Enter a nickname for the pet

Do you want to enter info for another pet (y/n)
  1. В командной строке терминала введите n
  2. Убедитесь, что панель терминала обновилась и отображает пункты главного меню.
  3. В командной строке терминала введите 1
  4. Убедитесь, что панель терминала обновилась и отображает следующий вывод:
ID #: d1
Species: dog
Age: 2
Nickname: lola
Physical description: medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.
Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.

ID #: d2
Species: dog
Age: 9
Nickname: loki
Physical description: large reddish-brown male golden retriever weighing about 85 pounds. housebroken.
Personality: loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.

ID #: c3
Species: cat
Age: 1
Nickname: Puss
Physical description: small white female weighing about 8 pounds. litter box trained.
Personality: friendly

ID #: c4
Species: cat
Age: ?
Nickname:
Physical description:
Personality:

ID #: d5
Species: dog
Age: ?
Nickname: tbd
Physical description: tbd
Personality: tbd
Press the Enter key to continue

Если добавленная информация о питомце не отображается, проверьте, что вы включили строки кода для сохранения данных в массив ourAnimals, и проверьте, что вы включили строки кода для создания идентификатора питомца.

  1. Убедитесь, что вы можете создавать дополнительные описания животных для собак и кошек и что характеристики животных сохраняются в массиве ourAnimals.
  2. Закройте приложение

Поздравляем вас с завершением этого проекта! Вы создали приложение, в котором сочетаются операторы выбора и итерации для достижения целей дизайна приложения. Ваше приложение содержит более 300 строк и выполняет задачи, которые можно найти в профессиональном приложении. Завершение этого проекта - значительное достижение. Продолжайте свою работу!

Заключение

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

Создавая вложенные комбинации операторов итерации и выбора, вы построили пользовательский интерфейс, который позволяет пользователю отображать данные о питомцах из массива ourAnimals. Вы также разработали функции для ввода и проверки характеристик новых питомцев и добавления их в массив ourAnimals. Пользователь приложения может продолжать делать выбор в меню, пока не решит выйти из приложения.

Возможность реализовать различные операторы итерации и выбора позволяет оптимизировать код.