3

我有一个任务,用户必须输入一个名字,然后是一个分数,然后重复这个过程直到他们完成,按 Q,然后数组将显示名字和分数,然后给出所有这些的平均值分数。我现在拥有的就是这个。

    static void inputPartInformation(string[] pl, double[] sc)
    {

        int i = 0;

        do
        {
            Console.Write("Enter The Player's Name: ");

            pl[i] = Console.ReadLine();


            Console.Write("Enter Their Score: ");

            sc[i] = double.Parse(Console.ReadLine());

        }
        while (pl[i++].CompareTo("Q") != 0);

    }


    static void displayParts(string[] pl, double[] sc)
    {
        int i = 0;
        while (pl[i].CompareTo("Q") != 0)
        {
            Console.WriteLine("{0,15}{1,6}", pl[i], sc[i]);
            ++i;
        }

    }

    static void Main(string[] args)
    {

        String[] players = new String[100];

        double[] scores = new double[100];

        inputPartInformation(players, scores);



        displayParts(players, scores);


        double average = scores.Average();
        Console.WriteLine("The Average is: {0}", average);



        Console.ReadLine();

    }

当我尝试平均分数时,结果并不正确。

4

3 回答 3

5

问题在于调用Average: 你正在平均所有内容,而不是"Q"对应names位置的所有内容。您将未写入的分数部分中的所有这些零相加,然后将其除以 100 - 整个数组的长度。

解决此问题的最简单方法是"Q"从方法中返回条目的位置inputPartInformation

var count = inputPartInformation(players, scores);

现在您可以使用 LINQ 的Take函数来获得正确的平均值:

double average = scores.Take(count).Average();
于 2012-08-16T01:01:52.960 回答
1

我建议您计算已输入的分数(在变量中N)并使用该函数仅返回分数.Take(N)数组。N

例子:

double[] list = new double[100];
// assumed first N values are filled only.
// N = ...
list = list.Take(N).ToArray();

double average = list.Average();
于 2012-08-16T01:06:51.357 回答
1

你必须使用数组吗?使用列表可能是更好的选择,因为只要他们不断添加分数,您只需将其添加到列表中即可。这样,当他们退出并且你去取平均值时,它不会包含任何未输入分数的 0。

于 2012-08-16T01:51:59.690 回答