从C#数组中获得平均值

时间:2015-06-08 03:37:05

标签: c# arrays

我已经在这个任务工作了几天了。我自己编写了所有代码。我不是想欺骗或者有人为我做我的工作,但对于我的生活,我不能让它正常工作。

我遇到的问题是,当我尝试对数组中的数字进行平均而不是仅仅除以条目数时,它除以允许的总条目数进入数组。

例如。我在一个可以容纳100个值的数组中输入2个值,而不是除以2,它除以100.

如何将其除以条目数?这就是我所拥有的:

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

namespace ConsoleApplication6
{
    class Program
    {
        static void InputData(string[] player, int[] score, ref int numPlayer)
        {
            // input items up to the number of the array size
            while (numPlayer < player.Length)
            {
                Console.Write("Enter player name (Q to quit): ");
                player[numPlayer] = Console.ReadLine();
                if ((player[numPlayer] == "Q") || (player[numPlayer] == "q"))
                {
                    Console.WriteLine();
                    break;
                }
                else
                {
                    Console.Write("Enter score for " + player[numPlayer] + ": ");
                    score[numPlayer] = Convert.ToInt32(Console.ReadLine());
                    numPlayer++;
                }
            }
        }


        static void DisplayPlayerData(string[] player, int[] score, int numPlayer)
        {
            Console.WriteLine("Name           Score");
            for (int i = 0; i < numPlayer; i++)
                Console.WriteLine("{0, -16} {1, 8}", player[i], score[i]);
        }


        static double CalculateAverageScore(int[] score, ref int numPlayer)
        {
            double avgScore;
            double total = 0;

            for (int i = 0; i < numPlayer; i++)
            {
                total += score[i];
            }
            avgScore = total / score.Length;
            Console.WriteLine("Average Score:" + avgScore);
            return avgScore;
        }

        static void DisplayBelowAverage(string[] player, int[] score, int numPlayer)
        {
            double avgScore = CalculateAverageScore(score, ref numPlayer);
            Console.WriteLine("Players who scored below average");
            Console.WriteLine("Name           Score");
            for (int i = 0; i < numPlayer; i++)
            {
                if (score[i] < avgScore)
                {
                    Console.WriteLine("{0, -16} {1}", player[i], score[i]);
                }
            }
        }
        static void Main(string[] args)
        {
            //Variables
            string[] player = new string[100];
            int[] score = new int[100];
            int numPlayer = 0;

            InputData(player, score, ref numPlayer);
            DisplayPlayerData(player, score, numPlayer);
            CalculateAverageScore(score, ref numPlayer);
            DisplayBelowAverage(player, score, numPlayer);


            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:7)

  1. 您有一个numPlayer个变量代表一些输入的玩家 只需使用它。
  2. 替换

            avgScore = total / score.Length;
    

            avgScore = total / numPlayer;
    
    1. 您的代码有一些非常奇怪的要点。
    2. 例如,您在CalculateAverageScore(score, ref numPlayer);中致电Main()。但是,您没有使用返回值。在DisplayBelowAverage方法中正确调用此方法。 一般来说,它看起来不对 - 引用,具有动态数值的静态大小数组,非格式控制台写信等。

      仅供您参考。阅读一次。也许一些代码行可以帮助你。也许,你找不到新的,未知的或有趣的东西 这就是我如何解决这个问题:

      public class Program
      {   
          private const string InputTerminationString = "Q";
      
          public static void Main()
          {
              List<Player> players = new List<Player>(); // p. 1, 4
      
              while (true)
              {
                  Console.Write("Enter player name ({0} to quit): ", InputTerminationString);
                  string name = Console.ReadLine();
                  if (name == InputTerminationString) break; // p. 2
      
                  Console.Write("Enter score for {0}: ", name); // p. 3
                  int score = int.Parse(Console.ReadLine());
      
                  players.Add(new Player { Name = name, Score = score }); 
              }
      
              Console.WriteLine("Name           Score");
              players.ForEach(x => Console.WriteLine("{0, -16} {1, 8}", x.Name, x.Score)); // p. 5
      
              double average = players.Average(x => x.Score); // p. 6
              Console.WriteLine("Average score: {0:F2}", average); // p. 3
      
              Console.WriteLine("Players who scored below average");
              Console.WriteLine("Name           Score");
              players
                  .Where(x => x.Score < average) // p. 7
                  .ToList()
                  .ForEach(x => Console.WriteLine("{0, -16} {1, 8}", x.Name, x.Score)); // p. 5           
          }
      }
      
      public class Player
      {
          public string Name { get; set; }
          public int Score { get; set; }  
      }
      

      现在,一步一步:

      1. 使用Player课程。传递两个namesscores的独立数组非常不方便。而且,一般来说并不安全。如果是单个玩家,则玩家的名称和分数是属性,并且应该在结构或类中存储在一起。

      2. 使用常量。如果您需要将“Q”终止字符串更改为“退出”,您可以在一秒钟内完成此操作,而无需查看代码。

      3. 使用格式化的Console.WriteLine。它适用于String.Format,你不需要连接字符串 这里有一些信息:https://msdn.microsoft.com/en-us/library/828t9b9h(v=vs.110).aspx

      4. 使用动态集合List。数组适用于存储和快速访问已知长度的值范围。由于用户逐个输入值,您永远不知道他是否会输入0,1或90000值。 List收藏将帮助您 这里有一些信息:http://www.dotnetperls.com/list

      5. 您可以使用ForEach方法为集合中的每个项目执行给定代码。使用带有lambda表达式的ForEach可以使代码更短,更易读 这里有一些信息:https://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx

      6. 使用Average函数计算集合的平均值。如果是int[],您可以使用arr.Average()。但是,对于Class对象,您需要使用lambda-expression描述计算平均值的逻辑。
        这里有一些信息:http://www.dotnetperls.com/average

      7. LINQ Where表达式可让您过滤收藏。
        这里有一些信息:http://www.dotnetperls.com/where

答案 1 :(得分:3)

您可以使用 LINQ Average方法,而不是编写CalculateAverageScore

double avgScore = score.Average();
Console.WriteLine("Average Score:" + avgScore);

Forthermore最好不要将计算 I / O 混合,所以:

static double CalculateAverageScore(int[] score) {
     return score.Average();
}

或者,因为您使用数组,请使用sum:

static double CalculateAverageScore(int[] score, ref int numPlayer) {
     return (double) score.Sum()/numPlayer;
}

并在Main

中进行打印
static void Main(string[] args) {
    //Variables
    string[] player = new string[100];
    int[] score = new int[100];
    int numPlayer = 0;

    InputData(player, score, ref numPlayer);
    DisplayPlayerData(player, score, numPlayer);
    double avgScore = CalculateAverageScore(score, ref numPlayer);
    Console.WriteLine("Average Score:" + avgScore);
    DisplayBelowAverage(player, score, numPlayer);
    Console.ReadLine();
}

online Ideone demo

您还可以将数组修改为List 。此处也没有理由在所有这些方法中使用ref关键字,也不构建static