0

我有一种方法需要根据数组的长度进行计算。我正在使用 .length 方法进行计算,但该方法正在使用数组的最大长度(我已声明为 10)进行算术运算。这是我用来从用户那里获取数据的循环。我知道这不是对数组数据进行排序的理想方法,但这是用于家庭作业,它围绕正确使用 .Split 方法(这不是我遇到的问题)。

for (int i = 0; i < MAX; i++)
{
    Console.Write("Enter a name and a score for player #{0}: ", (i + 1));
    string input = Console.ReadLine();
    if (input == "")
    {
        // If nothing is entered, it will break the loop.
        break; 
    }

    // Splits the user data into 2 arrays (integer and string).
    string[] separateInput = input.Split();
    name [i] = separateInput[0];
    score [i] = int.Parse(separateInput[1]);
}

这是我用来计算平均分的方法:

static void CalculateScores(int[] score)
{
    int sum = 0;
    int average = 0;
    for (int i = 0; i < score.Length; i++)
    {
        sum += score[i];
        average = sum / score.Length;
    }

    Console.WriteLine("The average score was {0}", average);

我正在调用这样的方法:

    CalculateScores(score);

编辑:我的数组被声明:

    int[] score = new int[MAX]; //MAX == 10.
    string[] name = new string[MAX];

CalculateScores 方法在进行数学运算时,就像 score.Length 始终为 10 一样,无论我向控制台输入了多少不同的分数组合。我不知道是不是因为我收集输入的循环不正确,或者我的 CalculateScores 方法有缺陷。提前致谢。

编辑:澄清一下,我只是对为什么我不能从CalculateScores 中得到正确的值感到困惑。

4

3 回答 3

5

Length总是表示数组的大小,如果你已经实例化为 10,那么无论你填充了多少项,它总是 10。

有很多方法可以解决您的问题,但我会选择一种简单的方法,即在计算中不使用长度,而只是将项目数存储在一个单独的变量中:

int numItems = 0;
for(int i=0;i<MAX;i++)
{
    Console.Write("Enter a name and a score for player #{0}: ", (i + 1));
    string input = Console.ReadLine();
    if (input == "")
    {
        break; // if nothing is entered, it will break the loop
    }
    numItems++;
    ...
}

static void CalculateScores(int[] score, int numItems)
{
    // don't use Length at all, use numItems instead
}
于 2013-03-25T17:26:58.023 回答
2

数组一般用于固定大小的数据,所以该Length属性反映了数组可以容纳多少项,而不是数组中元素的数量。最简单的解决方法是使用 a List(T),它用于可变参数数据。

// A nice abstraction to hold the scores instead of two separate arrays.
public class ScoreKeeper
{
    public string Name { get; set; }
    public int Score { get; set; }
}

var scores = new List<ScoreKeeper>();

for (int i = 0; i < MAX; i++)
{
    Console.Write("Enter a name and a score for player #{0}: ", (i + 1));
    string input = Console.ReadLine();
    if (input == "")
    {
        // If nothing is entered, it will break the loop.
        break; 
    }

    // Splits the user data into 2 arrays (integer and string).

    string[] separateInput = input.Split();

    scores.Add(new ScoreKeeper { Name = separateInput[0], Score = int.Parse(separateInput[1]) });
}

static void CalculateScores(ICollection<ScoreKeeper> scores)
{
    // We take advantage of Linq here by gathering all the
    // scores and taking their average.
    var average = scores.Select(s => s.Score).Average();
    Console.WriteLine("The average score was {0}", average);
}
于 2013-03-25T17:35:43.697 回答
0

手动检查:

int sum = 0;
int average = 0;
int length;
for (int i = 0; i < MAX; i++) {
    if(name[i]!=string.empty) {
        sum += score[i];
        length=i+1;
    }       
}
average = sum / length;
Console.WriteLine("The average score was {0}", average);
于 2013-03-25T17:33:51.837 回答