繁体   English   中英

C# 计算平均值会增加一个额外的数字

[英]C# calculating an average adds an extra number

我是 C# 的新程序员,在这个网站上是新的,找不到关于这个主题的类似帖子,如果它已经被覆盖,很抱歉。

作为视频课程的一部分,我被指示创建一个控制台“APP”来计算学生的平均分数。 用户输入学生总数,然后输入每个人的分数,然后将总和除以学生人数。 我不明白的是为什么 C# 为学生增加了另一个额外的数字? 所以用户输入5,我得到6次得分......

class Program
{
 

    static void Main(string[] args)
    {
        
        int totalScores= 0;
        int totalStudents = 0;
        int number;

        Console.WriteLine("how many students are there?");
        int studentNumber = int.Parse(Console.ReadLine());
        

        while(totalStudents <= studentNumber)
        {
            Console.WriteLine("enter your student score");
            string studentScore = Console.ReadLine();
            if (int.TryParse(studentScore, out number))
            {
                totalScores += number;
                totalStudents += 1;
            }
            else
            {
                Console.WriteLine("you did not enter a number");
            }
            
        }
        int avarage = totalScores / totalStudents;

        Console.WriteLine("the average is" + average);
    }

    
}

这是我在控制台中看到的:控制台

我确定我错过了什么……有什么建议吗?

迭代器变量“ totalStudents ”从 0 开始,因此您的 while 循环条件应仅更改为“<”,同时使用“ studentNumber ”变量来计算平均值。

while(totalStudents < studentNumber)
{
    Console.WriteLine("enter your student score");
    string studentScore = Console.ReadLine();
    if (int.TryParse(studentScore, out number))
    {
        totalScores += number;
        totalStudents += 1;
    }
    else
    {
        Console.WriteLine("you did not enter a number");
    }
    
}
int avarage = totalScores / studentNumber;

简短的回答

简短的回答是您应该使用while(totalStudents < studentNumber) 但让我们探讨一下原因。

长答案

我希望你专注于这个时间点:

while(totalStudents <= studentNumber)
{
    // <------ HERE

    Console.WriteLine("enter your student score");
    string studentScore = Console.ReadLine();
    
    // rest of code omitted      
}

换句话说,这是您决定注册另一个学生之后,但您注册该学生之前。

假设总共有 3 名学生,请告诉我每个循环中totalStudents的值是多少。 请在继续之前尝试解决它,这是作为初学者理解的基本技能。

第一个循环: totalStudents = 0
第二个循环: totalStudents = 1
第三个循环: totalStudents = 2
第四个循环: totalStudents = 3

总结:当开始循环 X 时, totalStudents等于 X-1

注意:我在列表中添加了第四个循环,因为您当前的代码额外运行了一个循环,我想向您展示导致第四个循环的原因。

现在让我们重复这个练习,但关注另一个时间点:

while(totalStudents <= studentNumber)
{
    Console.WriteLine("enter your student score");
    string studentScore = Console.ReadLine();
    
    // if block omitted      

    // <------ HERE
}

换句话说,这是您决定注册另一个学生之后,并且您注册该学生之后。 对于每个循环(假设 3 个学生),告诉我totalStudents的值。

第一个循环: totalStudents = 1
第二个循环: totalStudents = 2
第三个循环: totalStudents = 3
第四个循环: totalStudents = 4

总结:当完成循环 X 时, totalStudents等于 X

在第三个循环结束时, while将检查是否需要启动另一个循环。 要检查这一点,它会检查是否totalStudents <= studentNumber

在我的示例中,我们确定studentNumber为 3。但是在第三个循环执行后, totalStudents的值是多少? (提示:查看我列出的上述值)。

由于您现在知道totalStudentsstudentNumber的值,因此您可以看到totalStudents <= studentNumber将评估为true ,因此将启动第四个循环。

但你不想要这个。 您希望它在studentNumber循环数之后停止。
另一种说法是,仅当您当前注册的学生数量少于您希望注册的学生总数时,才应启动另一个循环。 当它们相等时,您不想开始另一个循环。

因此,正确的while评估应该使用小于运算符: totalStudents < studentNumber

名字里有什么?

作为一个很好的提示,请尝试为变量使用更好的描述性名称。 我建议以下重命名:

  • totalStudents => amount_of_students_you_have_entered_so_far
  • studentNumber => amount_of_students_you_will_enter_in_total

这些名字很长,但我让它们非常具有描述性且易于理解,因为您是初学者。 现在让我们再次使用新名称重新访问您的代码(包含错误):

while(amount_of_students_you_have_entered_so_far <= amount_of_students_you_will_enter_in_total)
{        
    // rest of code omitted      
}

现在更清楚地看到您的评估存在缺陷。

我承认这些名字太长了。 但是,如果您难以解析代码的含义,最好是过度描述,而不是让它更难猜测。 经验会随着时间的推移而出现,然后您可以减少变量名称的长度。

就我个人而言,我会使用studentCounterstudentTotal来表示一个是向上计数的值,另一个是这个计数值应该达到的最大限制。

我怀疑您无法发现该错误的部分原因是因为您使用“总数”一词来指代输入的学生人数totalStudents ),而您使用“数字”来指代您的学生总数将输入 ( studentNumber )。 你换了个词。

也许是因为在 while 循环中你放了小于或等于 5,所以它会在学生总数中增加 1 直到达到 5,并且它会在第五个中增加 1,使其成为 6。就是这样,如果你只是改变它应该可以正常工作<= 只是 <

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM