保龄球计划中的C#阵列。不要使用最低分数

时间:2014-11-24 05:18:10

标签: c# arrays

我正在尝试创建一个保龄球计划,当您输入您的名字后跟您的分数时,它将采用球员的平均,最低和最高分数并打印出来。但由于某种原因,我无法获得最低分数,因为当我按两次输入时,它将使用空白值而不是最低输入值和名称。如何解决这个问题,以便显示最低分?

{    
class Program
{
   static void Main(string[] args)
   {
       const int SIZE = 10;
       int i;

       // create an array with 10 elements
       string[] scoreInfo = new string[SIZE];
       string[] names = new string[SIZE];
       int[] scores = new int[SIZE];


       for (i = 0; i < SIZE; i++)
       {
           // Prompt the user
           Console.Write("Enter your first name and score on one line");
           Console.WriteLine(" separated by a space.");

           // Read one line of data from the file and save it in inputStr
           string inputStr = Console.ReadLine( );
           // if statement to break when the user enters a zero
           if (inputStr == String.Empty)
           {
               break;
           }
           // The Split method creates an array of two strings
           scoreInfo = inputStr.Split();
           // Parse each element of the array into the correct data type
           names[i] = scoreInfo[0];
           scores[i] = int.Parse(scoreInfo[1]);
       }


       Console.WriteLine("The avarage score is {0}", AverageScore(scores, i));
       Console.WriteLine("{0} scored the lowest at {1}", names[LowScore(scores, i--)], scores[LowScore(scores, i--)]);
       Console.WriteLine("{0} scored the highest at {1}", names[HighScore(scores)], scores[HighScore(scores)]);
       Console.ReadLine();


       Console.ReadLine();
   }

   static int LowScore(int[] scores, int j)
   {
       int min = scores.Min();
       return Array.IndexOf(scores, min);
   }

   static int HighScore(int[] scores)
   {
       int max = scores.Max();
       return Array.IndexOf(scores, max);
   }

   static double AverageScore(int[] numbers, int j)
   {
       double average = 0;
       for (int i = 0; i < j--; i++)
       {
           int product = 1;
           product = numbers[i] * product;
           average = product / j;
       }
       return average;
   }

} }

2 个答案:

答案 0 :(得分:1)

使用不同的数据结构,减少自己的工作量。

从一个字典开始,将名称映射到分数,这样你就不必乱用索引。

然后,LINQ是你的朋友,因为你已经注意到了。您不需要为已存在的事物创建函数(例如最小值/最大值/平均值)。

例如

Dictionary<string, int> ranking = new Dictionary<string, int>();
ranking.Add("adam", 20);
ranking.Add("bill", 10);
ranking.Add("carl", 30);

double avg = ranking.Average(kvp => (double)kvp.Value);
var sorted = ranking.OrderBy(kvp => kvp.Value);
var min = sorted.First();
var max = sorted.Last();

Console.WriteLine("Average: {0}", avg);
Console.WriteLine("Lowest: {0} with {1}", min.Key, min.Value);
Console.WriteLine("Highest: {0} with {1}", max.Key, max.Value);

答案 1 :(得分:0)

修改您的平均功能,如下所示: -

static double AverageScore(int[] numbers, int j)
{
   double sum = 0;
   for (int i = 0; i < j; i++)
   {
       sum += numbers[i];
   }
   return (double)sum / j;
}

我不确定你为什么要使用物品来找到平均分数。

你的Min功能如下: -

static int LowScore(int[] scores, int j)
{
     int min = scores.Where((v, i) => i < j).Min();
     return Array.IndexOf(scores, min);
}

这里,你传递完整的整数数组,所以如果只有3个玩家输入值,其余值将被初始化为default,即0int,因此你得到0作为最小值。

此外,您需要更改方法调用,如下所示: -

Console.WriteLine("{0} scored the lowest at {1}", names[LowScore(scores, i)], scores[LowScore(scores, i)]);