我已经在这个任务工作了几天了。我自己编写了所有代码。我不是想欺骗或者有人为我做我的工作,但对于我的生活,我不能让它正常工作。
我遇到的问题是,当我尝试对数组中的数字进行平均而不是仅仅除以条目数时,它除以允许的总条目数进入数组。
例如。我在一个可以容纳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();
}
}
}
答案 0 :(得分:7)
numPlayer
个变量代表一些输入的玩家
只需使用它。替换
avgScore = total / score.Length;
与
avgScore = total / numPlayer;
例如,您在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; }
}
现在,一步一步:
使用Player
课程。传递两个names
和scores
的独立数组非常不方便。而且,一般来说并不安全。如果是单个玩家,则玩家的名称和分数是属性,并且应该在结构或类中存储在一起。
使用常量。如果您需要将“Q”终止字符串更改为“退出”,您可以在一秒钟内完成此操作,而无需查看代码。
使用格式化的Console.WriteLine
。它适用于String.Format
,你不需要连接字符串
这里有一些信息:https://msdn.microsoft.com/en-us/library/828t9b9h(v=vs.110).aspx
使用动态集合List
。数组适用于存储和快速访问已知长度的值范围。由于用户逐个输入值,您永远不知道他是否会输入0,1或90000值。 List
收藏将帮助您
这里有一些信息:http://www.dotnetperls.com/list
您可以使用ForEach方法为集合中的每个项目执行给定代码。使用带有lambda表达式的ForEach可以使代码更短,更易读 这里有一些信息:https://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx
使用Average
函数计算集合的平均值。如果是int[]
,您可以使用arr.Average()
。但是,对于Class
对象,您需要使用lambda-expression描述计算平均值的逻辑。
这里有一些信息:http://www.dotnetperls.com/average
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();
}
您还可以将数组修改为List
。此处也没有理由在所有这些方法中使用ref
关键字,也不构建static
。