Упражнение. Написание кода для отображения всех данных массиваAnimals
В этом упражнении вы напишите структуру вложенного цикла и блок кода выбора, который используется для отображения сведений о массиве ourAnimals. Ниже приведены подробные задачи, которые выполняются во время этого упражнения:
- Внешний цикл: создайте внешний цикл, который выполняет итерацию через животных в массиве ourAnimals.
- Проверка данных: напишите код, который проверяет наличие существующих данных домашних животных и отображает идентификатор животного, если данные существуют для животного.
- Внутренний цикл: создание внутреннего цикла, отображающего все характеристики домашних животных с назначенными данными.
- Тест проверки: выполните тесты проверки для кода, который вы разрабатываете в этом упражнении.
Это важно
Перед началом этого упражнения необходимо выполнить предыдущее упражнение в этом модуле.
Создание цикла для итерации с помощью массиваAnimals
В этой задаче создается внешний for цикл, используемый для итерации животных в массиве ourAnimals . Вы проверяете связь между измерениями массива и параметрами for цикла. Вы также рассматриваете различия между операторами for и операторами foreach при работе с многомерными массивами.
Убедитесь, что Visual Studio Code открыт и что файл Program.cs отображается в редакторе.
В блоке кода для инструкции
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;Удалите оператор
Console.WriteLine(), используемый для отображения сообщения "скоро будет", и оставьте пустую строку кода под строкой с комментарием// List all of our current pet information.Сообщение обратной связи не потребуется, так как вы будете отображать содержимое массива
ourAnimals. При разработке кода, соответствующего другим пунктам меню, сообщения обратной связи также будут обновлены.Оставьте следующее сообщение, которое гласит
Press the Enter key to continue.Начиная с созданной пустой строки кода запустите инструкцию
forследующим образом:for () { }Потратьте минуту, чтобы обдумать, чего вы хотите достичь с помощью этого
forвыражения.Помните, что инструкция
forсостоит из трех частей, которые управляют реализацией итерации: итеризатором,условием и итератором. Значения, назначенные инициализатору, условию и итератору , основаны на том, что необходимо достичь с помощью инструкцииfor.В этом случае
forцикл используется для итерации по массивуourAnimals. Вы знаете, что массивы начинаются с индекса ноль, что означает, что массив сnэлементами индексируется от0доn-1. Требуется инициализатор, условие и итератор для сопоставления измерений массива. В этом случае вы хотите, чтобы цикл начинался сfor, увеличивался на0, и заканчивался на1.Массив
ourAnimalsобъявлен следующим образом:string[,] ourAnimals = new string[maxPets, 6];Вы знаете, что значениюmaxPetsприсвоено8. В этом объявленииmaxPetsуказывается количество элементов в первом измерении массива, а не нумерация индексов с нуля, которую вы используете для ссылки на элементы в массиве. Таким образом, хотяmaxPets = 8, числовые индексы массива находятся в диапазоне от0до7.Чтобы указать управляющее значение цикла
for, обновите код следующим образом:for (int i = 0; i < maxPets; i++) { }Как видно, установка инициализатора
int i = 0;соответствует индексу массива, начинающемуся с нуля. Аналогичным образом, установка условия for наi < maxPets;соответствует первому измерению массива. Наконец, установка итератора for вi++будет увеличивать значение управления циклом на1в каждой итерации.Возьмите минуту, чтобы рассмотреть выбор между оператором
forи операторомforeachпри переборе массива ourAnimals.Цель состоит в том, чтобы проводить итерацию по каждому животному в массиве ourAnimals по одному за раз. Так почему бы не использовать
foreachцикл? В конце концов, вы знаете, чтоforeachинструкция предназначена для случаев, когда требуется выполнить итерацию каждого элемента в массиве элементов.Причина, по которой вы не используете
foreachцикл в этой ситуации, заключается в том, чтоourAnimalsмассив является многомерным массивом. Так какourAnimalsэто многомерный массив строк, каждый элемент, содержащийся внутриourAnimals, является отдельным элементом строки типа. Если вы использовалиforeachцикл для итерации черезourAnimals, тоforeachраспознавал бы каждую строку как отдельный элемент в списке из 48 строковых элементов (8 x 6 = 48). Операторforeachне будет обрабатывать два измерения массива отдельно. Другими словами,foreachцикл не распознает8строки элементов типа строка, где каждая строка содержит столбец6элементов. Так как вы хотите работать с одним животными за раз, и обрабатывать все шесть характеристик животных во время одной итерации,foreachзаявление не является правильным выбором.Однако если
ourAnimalsмассив был зубчатым массивом, настроенным как массив, состоящий из строковых массивов, можно было бы использовать операторforeach. В этом случае вы создадитеforeachдля внешнего цикла иforeachдля внутреннего цикла. Внешний цикл будет итерировать по элементам строкового массива в зубчатом массиве. Массивы строк — это "строки" в двухмерном массиве. Внутренний цикл будет итерировать через элементы string, содержащиеся в массивах строк. Строковые элементы в массивах строк являются столбцами в двухмерном массиве.В следующем примере кода демонстрируется подход к зубчатым массивам.
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. Теперь, когда вы видите, как работает каждый вариант, вы можете выбрать свой выбор в будущих проектах программирования.В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".
Откройте панель встроенного терминала в Visual Studio Code и введите команду для создания программы.
Чтобы открыть интегрированный терминал из представления EXPLORER, щелкните правой кнопкой мыши Starter, а затем выберите Открыть в интегрированном терминале. Вы также можете использовать меню "Вид " или "Терминал " для открытия панели встроенного терминала.
Чтобы создать программу, введите
dotnet buildкоманду из командной строки терминала.Исправьте все ошибки сборки или предупреждения, которые вы видите перед продолжением.
Помните, что сообщения об ошибке сборки и предупреждения сообщают вам, в чём проблема и где её можно найти. При устранении проблем лучше всего начать с тех, которые возникают ближе к началу кода, и продвигаться вниз.
Закройте панель терминала.
Проверка существующих данных домашних животных и отображение результатов
В этой задаче вы используете инструкцию if для поиска каждого животного в массиве ourAnimals , который был назначен данным о характеристиках домашних животных. При обнаружении домашнего животного с назначенными данными отображается petID. Если данные не назначены, ничего не отображается. Выполните код, чтобы убедиться, что ваши for и if операторы работают правильно.
Создайте пустую строку кода внутри
forблока кода инструкции следующим образом:for (int i = 0; i < maxPets; i++) { }Чтобы создать инструкцию
if, которая проверяет данные идентификатора домашних животных, обновите код следующим образом:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { } }Найдите минутку, чтобы подумать, что оценивается в этом
ifутверждении и почему.Сначала рассмотрим левую сторону выражения:
ourAnimals[i, 0]Обратите внимание, что переменная управления цикломiиспользуется для указания животного, которое проверяется. Как вы можете вспомнить,0в[i, 0]соответствует характеристикеpetID. Так как первое измерение массива соответствует "числу" животного, эта сторона выражения гарантирует, что код проверяет значение, назначенноеpetIDкаждому животному в массиве.Во-вторых, рассмотрим выбор оператора сравнения. Обратите внимание, что используется оператор
!=not-equal. Выражение вычисляется так, какtrueесли значение, назначенное petID,ourAnimals[i, 0]не равно значению, указанному справа от уравнения.В-третьих, рассмотрим значение в правой части уравнения. Обратите внимание, что используется статическое строковое значение
"ID #: ". Это значение по умолчанию, назначенноеpetIDпри создании образца данных. Когда характеристики назначаются животному,petIDзначение обновляется и не будет равно значению по умолчанию.Это говорит о том, что блок кода инструкции
ifбудет выполняться, когда у текущего животного заданы характеристики.Замечание
Это хороший пример, когда
!=следует использовать. Вы не заботитесь о том, какое значение назначаетсяpetID, если это не значение по умолчанию.Чтобы создать
Console.WriteLine()метод, который отображаетpetIDвнутриifблока кода инструкции, обновите код следующим образом:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); } }Обратите внимание, что элемент массива можно использовать в качестве аргумента при вызове
WriteLine()метода.В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".
Откройте панель встроенного терминала и введите команду для сборки программы.
Исправьте все ошибки сборки или предупреждения, которые вы видите перед продолжением.
В командной строке терминала введите команду для запуска программы.
Введите команду в командной строке
dotnet runтерминала, чтобы запустить код программы.Если код создает ошибку среды выполнения, исправьте ошибки, сохраните обновления и перезапустите приложение.
В командной строке терминала убедитесь, что новая логика кода работает должным образом, введите 1.
Вы увидите следующие
petIDзначения:ID #: d1 ID #: d2 ID #: c3 ID #: c4 Press the Enter key to continue.Эти идентификаторы соответствуют домашним животным, которым назначены данные.
Если код отображает разные выходные данные при выборе пункта меню 1, просмотрите и обновите код. Помните, что после внесения обновлений необходимо сохранить файл Program.cs.
Закройте приложение и закройте панель терминала.
Отображение всех характеристик домашних животных с назначенными данными
В этой задаче создается for цикл внутри if блока кода инструкции, который используется для отображения всех характеристик текущего питомца.
В редакторе кода найдите следующие строки кода в файле Program.cs:
for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); } }Чтобы создать
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. Намерение состоит в том, чтобы внутренний цикл итерировать через характеристики каждого животного. Так как данные животных хранятся в многомерном массиве, доступ к характеристикам животных будет легко получить.Потратьте минуту на просмотр введенного
forзаявления.Обратите внимание, что переменная элемента управления циклом называется
j. При вложенныхforциклах одним из стандартных подходов является использованиеiво внешнем цикле иjво внутреннем цикле. Такие соглашения упрощают чтение кода другими пользователями.Поскольку шесть характеристик хранятся для каждого животного, инициализатор - это
int j = 0;, а условие - этоj < 6;. Это сочетание инициализатора и условия соответствует необходимому диапазону0-5индексов массива.Чтобы отобразить каждую характеристику питомца в отдельной строке, обновите код следующим образом:
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]); } } }Потратьте минуту, чтобы задуматься о созданной вами вложенной структуре и отображаемых результатах, которые будет производить ваш код.
Обратите внимание, что значение, записанное в консоль,
ourAnimals[i, j]использует переменные управления циклом как из внешних, так и внутреннихforциклов.Вы знаете каждый из следующих элементов:
- Первое измерение массива
ourAnimalsсоответствует разным домашним животным. - Второе измерение массива
ourAnimalsсоответствует характеристикам каждого животного. - Условие
ifпредотвращает выполнение внутреннего цикла, если данные о питомце не назначены текущему животному. - Внутренний цикл завершает все его итерации для каждой итерации внешнего цикла.
Поэтому вы знаете, что характеристики каждого животного будут отображаться как и ожидалось.
- Первое измерение массива
Чтобы заменить сообщение 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]); } } }Это окончательное обновление упрощает разделение между домашними животными при отображении выходных данных в консоли.
В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".
Откройте панель терминала и создайте программу.
Исправьте все ошибки сборки или предупреждения, которые вы видите перед продолжением.
Проверь свою работу
В этой задаче вы запускаете своё приложение из встроенного терминала и проверяете, что вложенное сочетание операторов for и if создаёт ожидаемый результат.
При необходимости откройте панель интегрированного терминала Visual Studio Code.
В командной строке терминала введите dotnet run
В командной строке терминала введите 1
Убедитесь, что данные домашних животных отображаются для четырех домашних животных, которым назначены данные.
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.Замечание
Если ожидаемые результаты не отображаются, убедитесь, что вы сохранили обновленный файл Program.cs. Если вы не видите ожидаемые результаты и не сможете определить проблему, можно просмотреть код Program.cs в конечной папке. Последняя папка включается в состав загрузки, завершенной во время установки. Перед проверкой файла Program.cs в конечной папке рекомендуется идентифицировать синтаксис и проблему логики в коде.
Закройте приложение и закройте панель терминала.