我有一个文件存储一类学生的考试成绩。我正在尝试编写一个程序,该程序可以成功打开文件,读取考试分数,找到平均分数,最高分数和最低分数,并打印出来。平均分数应在小数点后打印2位数。
这是我到目前为止所做的:
static void Main()
{
string myData = "";
int temp = 0;
int max = 0;
int min = 0;
double average = 0;
StreamReader fileReader = new StreamReader("data.txt");
do
{
myData = fileReader.ReadLine();
if (myData != null)
{
max = int.Parse(myData);
temp = int.Parse(myData);
if (temp > max)
temp = max;
}
} while (myData != null);
fileReader.Close();
Console.ReadLine();
}//End Main()
我不知道如何继续。如何读取新行并将其分配给temp?我认为我做得不对。
答案 0 :(得分:7)
这是让你老师伤心的一种方式:P
static void Main(string[] args)
{
var file = new StreamReader("scores.txt");
var split = file.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
IEnumerable<int> ints = split.Select(x => int.Parse(x));
Console.WriteLine("Total Scores:" + ints.Count());
Console.WriteLine("Max:" + ints.Max());
Console.WriteLine("Min:" + ints.Min());
Console.WriteLine("Average:" + ints.Average().ToString("0.00"));
Console.ReadLine();
}
虽然这在技术上是正确的,但这对于理解算法(无论它们可能是什么)都是适得其反的,我建议你看看其他答案。但这证明了.NET框架的多功能性。
&lt; 3 LINQ
答案 1 :(得分:4)
我发现的第一个错误是max
始终与temp
完全相同,因为您为它们分配了相同的值,因此if
永远不会成立:
max = int.Parse(myData);
temp = int.Parse(myData);
if (temp > max)
答案 2 :(得分:2)
不错。这是一些伪代码:
假设文件如下:
25
12个
33.5
100个
75个
...
答案 3 :(得分:1)
对于初学者,你需要摆脱“max = int.Parse(myData)”这一行。否则,您将使用当前值继续覆盖max。
答案 4 :(得分:1)
由于这是家庭作业,我只会给你一些线索。
现在,每次循环都会设置“max”。尝试只设置temp,看看会发生什么。您可能希望将默认值(在创建时)默认为非常小的数字而不是0。
此外,你需要为“min”做类似的事情,但默认为非常大的数字。
int max = int.MinValue;
int min = int.MaxValue;
为了获得平均值,您需要有一笔金额和一个计数,并跟踪它们。然后,最后,使用double计算平均值,然后打印。要得到2个小数位,你可以使用平均值。ToString(“N”) - “N”格式的格式很好,默认为2位小数。
答案 5 :(得分:1)
你如何分离出这些流程?执行读取并使用文件内容填充整数列表。然后执行最小/最大和平均处理。
隔离问题有助于您专注于它们。我喜欢称这种降噪。作为一个承包商,我开始处理大量杂乱的代码,其中一个难以理解的原因是同时发生的事情太多了。如果你简化了什么,那么代码几乎会自行编写。这也称为关注点分离。这是一个非常重要的编程原则。
在您分离问题并使代码工作之后,您可以尝试将它们全部放在一起以便更有效(如果您使用文件读取进行内联,那么您将只在内存中保留一行一次)。
答案 6 :(得分:1)
我认为这是你作业的一般要点。你应该谨慎复制这段代码。
double count = 0.0;
double min = double.MaxValue;
double max = double.MinValue;
double total = 0.0;
using(StreamReader sr = new StreamReader(@"c:\data.txt"))
{
while (!sr.EndOfStream)
{
String line = sr.ReadLine();
double value = double.Parse(line.Trim());
if (value < min) min = value;
if (value > max) max = value;
total += value;
count++;
}
}
Console.WriteLine("Min: {0}", min);
Console.WriteLine("Max: {0}", max);
Console.WriteLine("Avg: {0}", (total / count).ToString("0.00"));
Console.ReadLine();
答案 7 :(得分:0)
static void Main(string[] args)
{
const string filename = @"data.txt";
bool first = true;
int min=0, max=0, total=0;
var lines = File.ReadAllLines(filename);
foreach (var line in lines)
{
var score = int.Parse(line.Trim());
if (first)
{
min = max = total = score;
first = false;
continue;
}
if (score < min)
min = score;
if (score > max)
max = score;
total += score;
}
if (first)
{
Console.WriteLine("no input");
return;
}
var average = (double)total/lines.Length;
Console.WriteLine(string.Format("Min: {0}, Max: {1}, Average: {2:F2}", min, max, average));
}
答案 8 :(得分:0)
嘿谢谢所有帮助过并提出建议的人,这是我的最终代码实现(不使用数组)
using System;
using System.IO;
class Program
{
static void Main()
{
string line = "";
int value = 0;
int max = 0;
int min = 100;
int total = 0;
double count = 0.0;
double average = 0;
StreamReader fileReader = new StreamReader(@"data.txt");
do
{
line = fileReader.ReadLine();
if (line != null)
{
value = int.Parse(line);
if (value > max)
max = value;
if (value < min)
min = value;
total += value;
count++;
}
} while (line != null);
average = total / count;
Console.WriteLine("Max: {0}", max);
Console.WriteLine("Min: {0}", min);
Console.WriteLine("Avg: {0:f2}", average);
Console.ReadLine();
}//End Main()
}//End class Program