Отображение массива в методе

#c# #arrays

#c# #массивы

Вопрос:

Это относится к другому коду, который я опубликовал ранее, но поскольку это другой вопрос, я решил сделать новый пост. В настоящее время я застрял с этим кодом, я новичок в c #, поэтому для меня это выглядит сложным. Я работал над этим кодом, который должен получать массив от пользователя, вычислять его среднее значение, а затем отображать результаты внутри show() . Я получил эту работу, чтобы показать среднее значение массива, но теперь мне нужно фактически отобразить в массиве каждое значение по отдельности, т.Е. 1-е введенное вами значение было: 12, 2-е введенное вами значение было: 32

Спасибо, ребята!

         private static int Array()
        {
            string inValue;
            int[] score = new int[10];
            int total = 0;

            for (int i = 0; i < score.Length; i  )
            {
                Console.Write("Enter Value {0}: ", i   1);
                inValue = Console.ReadLine();
                score[i] = Convert.ToInt32(inValue);
            }

            for (int i = 0; i < score.Length; i  )
            {
                total  = score[i];   
            }
            return total;
        }
 

Ответ №1:

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

т.е. измените getValues() на:

     private static int[] GetValues()
    {
        string inValue;
        int[] score = new int[5];
        int total = 0;

        for (int i = 0; i < score.Length; i  )
        {
            Console.Write("Enter Value {0}: ", i   1);
            inValue = Console.ReadLine();
            score[i] = Convert.ToInt32(inValue);
        }

        return score;
    }
 

РЕДАКТИРОВАТЬ: вот как использовать функцию getValues() выше в функции для распечатки всех значений. Вы должны быть в состоянии решить все остальное отсюда:

 private static void PrintArray(int[] scoreArray)
{
    for (int i = 0; i < scoreArray.Length; i  )
    {
         Console.WriteLine("Value #{0}: {1}", i   1, scoreArray[i]);
    }
}
 

Обратите внимание, как передается scoreArray, а также как осуществляется доступ к каждому значению, используя scoreArray[i] (где i — число от 0 до 4 включительно).

Комментарии:

1. Я сделал это, но тогда я не могу использовать ‘/’ Я получаю сообщение об ошибке, в котором говорится, что я не могу использовать этот операнд при работе с int[] . Есть предложения?

2. Да — вы не можете разделить весь массив чисел на что-то, это не имеет смысла! Вместо этого вам нужно перейти к одному значению из этого массива, которое, как я полагаю, в вашем примере является суммой чисел в массиве. Итак, создайте новую функцию, которая принимает массив целых чисел и возвращает одно целое число, являющееся суммой, а затем используйте результаты этой новой функции для последующего деления на количество значений в массиве.

3. Вот подсказка: чтобы функция могла принимать массив, вам нужно поместить что-то вроде int[] scoreArray между круглыми скобками после имени функции. Затем вы можете ссылаться на этот массив внутри функции, используя имя scoreArray . Например, вы можете (и должны будете) сделать scoreArray.Length .

4. Спасибо, я предполагаю, что я должен создать эту новую функцию внутри метода, отличного от getValues() ? или это может быть внутри него? Я думаю, что будет разумнее создать функцию sum внутри FindAverage(). Я на правильном пути?

5. К вашему сведению, «функция» и «метод» означают одно и то же. Вы могли бы просто вычислить общее количество внутри метода FindAverage(), да. Или у вас может быть отдельная функция / метод для его вычисления (лучшая практика программирования, а также многократное использование!).

Ответ №2:

int[] score Выйдите из GetValues и объявите его на уровне класса, сделав его статическим:

  static int[] score = new int[5];
 

Моя следующая рекомендация заключается в том, что вы не делаете внутри своих функций больше, чем то, что они утверждают, исходя из их имени; например, GetValues() должны получать значения только от пользователя; не вычислять итоговые значения (как вы делаете), потому что это вводит в заблуждение; это заставляет вас смотреть на реализацию, чтобы точно знать, чтоэто так. Аналогично для Show() ; если цель состоит в том, чтобы показать значения, введенные пользователем, затем вызовите его ShowValues() ; Если цель состоит в том, чтобы показать значения, введенные пользователем, а также вычислить среднее значение, затем назовите его как-то вроде ShowValuesAndAverage()

Вот полная реализация вашей программы с моими рекомендациями:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testscores
{
    class Program
    {
        static int[] score = new int[5];
        //Get Values     
        private static void GetValues()
        {
            string inValue;

            for (int i = 0; i < score.Length; i  )
            {
                Console.Write("Enter Value {0}: ", i   1);
                inValue = Console.ReadLine();
                score[i] = Convert.ToInt32(inValue);
            }

        }

        //FIND AVERAGE
        private static double FindAverage()
        {
            double total = 0.0;
            for (int i = 0; i < score.Length; i  )
            {
                total  = score[i];
            }
            double average = total / 5.0;
            return average;
        }

        //Show
        static void ShowValuesAndAverage()
        {
            Console.WriteLine("The values are:");
            for (int i = 0; i < score.Length; i  )
            {
                Console.WriteLine(string.Format("The {0} value you entered was {1}", i   1, score[i]));
            }
            Console.WriteLine("The average is: {0}", FindAverage());
        }
        //Main
        static void Main()
        {
            GetValues();
            ShowValuesAndAverage(); 
            Console.ReadKey();
        }
    }
}
 

Комментарии:

1. 1 за полезные рекомендации. Ваше решение должно работать, и, вероятно, это самое простое решение в данном случае, но его гораздо сложнее повторно использовать, чем если бы у вас были функции, которые принимают массив в качестве параметра. Слишком много зависимостей — например FindAverage() , зависит от наличия вызываемого массива элементов score , который уже был правильно инициализирован. Мысли?

2. @Icarus Спасибо, чувак, это очень полезно, особенно для таких людей, как я, которые учатся. Это позволяет мне понять, что я делал неправильно.

3. @Icarus Не могли бы вы объяснить мне, почему вы переместили int[] score из getValues() и что было не так с тем, что он был внутри него?

4. @Oskar в целом ничего плохого, но поскольку все ваши методы являются статическими, и вам нужно было получить доступ score из других функций, его нужно было переместить за пределы GetValues метода и создать static . Прочитайте о методах экземпляра и статических методах.

5. @GregL Моим намерением было объяснить некоторые очень простые принципы . Да, есть много вещей, которые можно переработать из моего кода, чтобы сделать его более общим, но для этого требуется более длинный пост и объяснение гораздо большего количества вещей, о которых я готов написать 🙂

Ответ №3:

Создайте одну функцию для getValues() и верните массив. Затем передайте массив в функцию AddValues() и в Show(). Либо это, либо прочитайте, как использовать указатели, но это может немного усложнить ситуацию.

Комментарии:

1. Спасибо, но мне нужно сделать это только с помощью 3 методов (исключая main). и без указателя, поскольку я еще не зашел так далеко. Есть идеи?

2. Хорошо, как насчет того, чтобы заставить getValues() возвращать массив. Передавая Show() массив, создайте цикл, который отображает их и добавляет их одновременно, а затем вычисляет среднее значение и тоже отображает его.

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

4. Однако, если вы действительно ограничены 3 методами, я бы предложил поместить логику для печати результатов в Main() функцию, а затем использовать следующие 3 функции: GetValues() , GetTotal() и GetAverage() . Подсказка: GetTotal() будет вызываться только в GetAverage() том случае, если вам не нужно распечатывать итоговое значение.

5. Ну, это те требования, которые мне были даны. если бы это было для меня, я бы сделал все внутри Main хаха. Я думаю, что первое, что я должен сделать, это изменить код, чтобы getValues возвращал массив, в этом нет сомнений. Но тогда мне нужно было бы найти способ выполнить эту сумму массива где-нибудь в другом месте. Я знаю, это может показаться глупым для кого-то опытного, но я работаю над этим кодом уже 3 дня. С кодом, который я создал, у меня работали 2 из 3 вещей. Изменив его сейчас, я вернусь к тому, с чего начал.