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

Завершено

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

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

Это важно

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

Создание цикла для итерации с помощью массиваAnimals

В этой задаче создается внешний 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;
    
  3. Удалите оператор Console.WriteLine(), используемый для отображения сообщения "скоро будет", и оставьте пустую строку кода под строкой с комментарием // List all of our current pet information.

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

    Оставьте следующее сообщение, которое гласит Press the Enter key to continue.

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

    for ()
    {
    }
    
  5. Потратьте минуту, чтобы обдумать, чего вы хотите достичь с помощью этого 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.

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

    for (int i = 0; i < maxPets; i++)
    {
    }
    

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

  7. Возьмите минуту, чтобы рассмотреть выбор между оператором 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. Теперь, когда вы видите, как работает каждый вариант, вы можете выбрать свой выбор в будущих проектах программирования.

  8. В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".

  9. Откройте панель встроенного терминала в Visual Studio Code и введите команду для создания программы.

    Чтобы открыть интегрированный терминал из представления EXPLORER, щелкните правой кнопкой мыши Starter, а затем выберите Открыть в интегрированном терминале. Вы также можете использовать меню "Вид " или "Терминал " для открытия панели встроенного терминала.

    Чтобы создать программу, введите dotnet build команду из командной строки терминала.

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

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

  11. Закройте панель терминала.

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

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

  1. Создайте пустую строку кода внутри for блока кода инструкции следующим образом:

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

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

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

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

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

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

    Замечание

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

  4. Чтобы создать Console.WriteLine() метод, который отображает petID внутри if блока кода инструкции, обновите код следующим образом:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
        }
    }    
    

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

  5. В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".

  6. Откройте панель встроенного терминала и введите команду для сборки программы.

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

  8. В командной строке терминала введите команду для запуска программы.

    Введите команду в командной строке dotnet run терминала, чтобы запустить код программы.

    Если код создает ошибку среды выполнения, исправьте ошибки, сохраните обновления и перезапустите приложение.

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

    Вы увидите следующие petID значения:

    ID #: d1
    ID #: d2
    ID #: c3
    ID #: c4
    Press the Enter key to continue.
    

    Эти идентификаторы соответствуют домашним животным, которым назначены данные.

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

  10. Закройте приложение и закройте панель терминала.

Отображение всех характеристик домашних животных с назначенными данными

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

  1. В редакторе кода найдите следующие строки кода в файле Program.cs:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
        }
    }    
    
  2. Чтобы создать 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 . Намерение состоит в том, чтобы внутренний цикл итерировать через характеристики каждого животного. Так как данные животных хранятся в многомерном массиве, доступ к характеристикам животных будет легко получить.

  3. Потратьте минуту на просмотр введенного for заявления.

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

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

  4. Чтобы отобразить каждую характеристику питомца в отдельной строке, обновите код следующим образом:

    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]);
            }
        }
    }    
    
  5. Потратьте минуту, чтобы задуматься о созданной вами вложенной структуре и отображаемых результатах, которые будет производить ваш код.

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

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

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

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

  6. Чтобы заменить сообщение 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]);
            }
        }
    }    
    

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

  7. В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".

  8. Откройте панель терминала и создайте программу.

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

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

В этой задаче вы запускаете своё приложение из встроенного терминала и проверяете, что вложенное сочетание операторов 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.
    

    Замечание

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

  5. Закройте приложение и закройте панель терминала.