首页 > 解决方案 > 变量不更新c#

问题描述

我正在编写一个 C# 程序来显示平均成绩、最高成绩和最低成绩

结果应该是
最高成绩是 90.5
最低成绩是 77.3
平均成绩是 85.633

但不幸的是这样显示
最高成绩是 1.7976931348623157 E+308
最低成绩是-1.7976931348623157E+308
平均成绩是85.633

我花了两天时间寻找解决方案,但我不能,所以我不得不问一个问题
谢谢你

using System;
using System.Collections.Generic;

namespace GradeBook
{
    public class Statistics
    {
        public double Average;
        public double High;
        public double Low;
    }

    public class Book
    {
        public Book()
        {
            grades = new List<double>();
        }
        public void addGrade(double grade)
        {
            grades.Add(grade);
        }
        public Statistics GetStatistics()
        {
            var result = new Statistics();
            result.Average = 0.0;
            result.High = double.MaxValue;
            result.Low = double.MinValue;

            foreach (var grade in grades)
            {
                result.Low = Math.Min(grade, result.Low);
                result.High = Math.Max(grade, result.High);
                result.Average += grade;
            }
            result.Average /= grades.Count;
            return result;
        }
        private List<double> grades;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book();
            book.addGrade(89.1);
            book.addGrade(90.5);
            book.addGrade(77.3);
            var stats = book.GetStatistics();

            Console.WriteLine("the highest grade is " + stats.High);
            Console.WriteLine("the lowerst grade is " + stats.Low);
            Console.WriteLine($"the average grade is {stats.Average:N3}");
        }
    }
}

标签: c#

解决方案


所以你有这个代码来评估每个等级的变量result.Lowresult.High循环之外:

result.Low = Math.Min(grade, result.Low);
result.High = Math.Max(grade, result.High);

但是您已将它们定义为:

result.High = double.MaxValue;
result.Low = double.MinValue;

因此grade > double.MaxValue, 或grade < double.MinValue

一个更好的解决方案是:

var result = new Statistics();
var firstGrade = grades.DefaultIfEmpty().First(); // get the first grade in the list, or 0 if it's empty

// assign that to average, high, and low
result.Average = firstGrade;
result.High = firstGrade;
result.Low = firstGrade;

// visit every grade after the first
foreach (var grade in grades.Skip(1))
{
    result.Low = Math.Min(grade, result.Low);
    result.High = Math.Max(grade, result.High);
    result.Average += grade;
}

result.Average /= grades.Count;
return result;

我们还应该考虑这种情况grades.Count == 0,它会抛出一个错误就result.Average /= grades.Count行了。我们可以这样修复它:

if (grades.Count > 0)
{
    result.Average /= grades.Count;
}
return result;

推荐阅读