我有一个分配,用户必须输入一个名称,然后一个分数,并重复该过程直到完成,按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();
}
当我尝试对分数进行平均时,它并没有正确显示。
答案 0 :(得分:5)
问题在于Average
的调用:您正在平均所有内容,而不是相应"Q"
位置names
的所有内容。您将所有这些零加在未写入的分数部分中,然后将其除以100 - 整个数组的长度。
解决此问题的最简单方法是从"Q"
方法返回inputPartInformation
条目的位置:
var count = inputPartInformation(players, scores);
现在您可以使用LINQ的Take
函数来获得正确的平均值:
double average = scores.Take(count).Average();
答案 1 :(得分: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();
答案 2 :(得分:1)
你必须使用数组吗?使用List可能是更好的选择,因为只要他们不断添加分数就可以添加它。这样当他们退出并且你去取平均值时,它将不包含任何未输入分数的0。