#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 вещей. Изменив его сейчас, я вернусь к тому, с чего начал.