【问题标题】:c# mark average calc issuec# 标记平均计算问题
【发布时间】:2016-06-18 06:50:00
【问题描述】:
        Console.Write ("How many students do you have?: ");
        student = Convert.ToInt32 (Console.ReadLine ());

        int[] numberOfStudents = new int[student];

        for (int i = 1; i <= numberOfStudents.Length; i++) {
            Console.Write ($"Enter student {i}'s current grade: ");
            numberOfStudents [i] = Convert.ToInt16 (Console.ReadLine ());
        }

        int sum = 0;
        for(int i = 0; i < numberOfStudents.Length; i++)
        {
            sum += numberOfStudents[i];
        }

        average = sum / numberOfStudents.Length;

        Console.WriteLine ($"Your student average is {average}.");
        Console.ReadLine ();

基本上,用户输入学生人数并确定数组的长度。 for 循环收集稍后计算平均值的所有标记。

由于某种原因,如果 numberOfStudents 长度为 5,当 for 循环到达第五次时,它会要求学生标记,但是当您输入它而不是获取总和并计算平均值时,程序会因 @ 而崩溃987654323@错误。

感谢您的帮助!

【问题讨论】:

  • 数组在 C# 中从零开始。您的 second for 循环 (for (int i = 0; i &lt; numberOfStudents.Length; i++)) 是正确的,但您的 first for 循环就像它们是基于一个的:for (int i = 1; i &lt;= numberOfStudents.Length; i++)跨度>
  • 您的第一个 for 循环是基于一个的。您应该将其更改为从零开始。
  • 您将同一个变量用于两个不同的目的。您有一系列学生。每个学生都应该有一系列的成绩。两个数组的长度可以不同。再看看你的代码。
  • 从0和i开始首先
  • 要缩短此代码,您可以跳过数组并创建一个 sum 变量并在一个 for 循环中添加它,然后从中计算总和,尽管这可能不适合规范。

标签: c# arrays for-loop average


【解决方案1】:

在 C# 数组中,起始索引是 0 而不是 1,因此您只需在第一个 for 循环中将 i 初始化为 0,您的代码就可以正常工作。 试试下面的代码:

    Console.Write ("How many students do you have?: ");
    student = Convert.ToInt32 (Console.ReadLine ());

    int[] numberOfStudents = new int[student];

    for (int i = 0; i <= numberOfStudents.Length; i++) {
        Console.Write ($"Enter student {i+1}'s current grade: ");
        numberOfStudents [i] = Convert.ToInt16 (Console.ReadLine ());
    }

    int sum = 0;
    for(int i = 0; i < numberOfStudents.Length; i++)
    {
        sum += numberOfStudents[i];
    }

    average = sum / numberOfStudents.Length;

    Console.WriteLine ($"Your student average is {average}.");
    Console.ReadLine ();

【讨论】:

    【解决方案2】:

    数组从索引 0 开始,因此在尝试选择最后一个值时,第一个 for 循环将超出范围(因为 i 变量将从索引 1 =&gt; 6 开始)。

    for (int i = 1; i <= numberOfStudents.Length; i++) { 
      // The i variable is starting on 1, loops til the index is greater than 5 (I.E., 6)
      Console.Write ($"Enter student {i}'s current grade: ");
      numberOfStudents [i] = Convert.ToInt16 (Console.ReadLine ());
      // On last fetch the variable i is 6, trying to fetch from array where last index is 5
      // will make the array throw an exception.
    }
    

    要解决此问题,您可以在索引 0 上启动循环,然后像在第二个循环 (for (i=0;i&lt;numberOfStudents.Length;i++)) 中那样循环它,然后在输出中添加 +1 以使输出从 1 而不是 0 开始.
    或者只需将您从数组中获取的部分更改为获取i - 1

    【讨论】:

    • 或者只是初始化循环从0开始
    • 我想从 0 开始循环,但后来写行会说“学生 0”,这没有意义。 @AndrewL 但上述解决方案解决了这两个问题。
    • 这就是重点。然后你会打印出 i+1th student @AlexAgla 。
    • 你在 for 循环中少了一个分号!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多