【问题标题】:Computing GPA of list of Student ID计算学生证列表的GPA
【发布时间】:2020-04-04 04:54:58
【问题描述】:

JAVA 初学者。我正在尝试打印学生的 GPA。找到下面的说明问题。

我们只能有 3 个等级:A、B、C 对应点 4、3、2。假设一个学生有 获得了 A、A、A 和 B 的成绩。GPA = (4+4+4+3) / 4 = 3.75。

calculateGPA 应该返回学生的 GPA 数组。

输入: 学生列表 = {1001, 1002} studentgrades = {{'A','A','A','B'},{'A','B','B'}};

输出:(预期)

3.75, 3.333

输出:(实际)

4.00, 0.00

import java.util.ArrayList;

    public class StudentUtil {

        public static double[] calculateGPA(int[] studentIdList, char[][] studentsGrades) {

            double[] Grades = new double[studentIdList.length];

            for(int i = 0; i < studentsGrades.length; i++) {
                double sumGrades = 0.0;

                for(int j = 0; j < studentsGrades.length; j++) {

                    if(studentsGrades[i][j] == 'A') {
                        sumGrades += 4;
                    }
                    else if(studentsGrades[i][j] == 'B') {
                        sumGrades += 3;
                    }
                    else if(studentsGrades[i][j] == 'C') {
                        sumGrades += 2;
                    }
                }
                Grades[i++] = sumGrades / studentsGrades.length;
            }

            return Grades;
        }

   //(Test Case)

    import static java.lang.System.out;
    import java.text.DecimalFormat;
    import static java.lang.System.out;

    public class TestStudentUtil {

        public static void main(String[] args) throws Exception {
            int[] studentIdList = { 1001, 1002 };
            char[][] studentsGrades = { { 'A', 'A', 'A', 'B' }, { 'A', 'B', 'B' } };

            double[] results = StudentUtil.calculateGPA(studentIdList, studentsGrades);

            for (double result : results) {
                out.printf("%.2f\n", result);
            }


        }
    }

【问题讨论】:

  • 你的两个循环从 0 循环到 studentGrades.length。出于某种我无法理解的原因,你有 i++ 两次。你也除以错误的数字。提取一种方法来计算单个数组的平均值。这会让事情变得更加清晰。

标签: java gpa


【解决方案1】:

问题出在内部循环中:您的循环条件是j &lt; studentsGrades.length,而当它应该是j &lt; studentsGrades[i].length 来遍历数组studentsGrades[i] 的所有条目时。

编写此代码的更简洁的方法是使用增强的for 循环,因为无论如何您只需要值,而不是索引。除了更易于阅读之外,这还避免了像编写错误的循环绑定这样的细微错误的可能性。

            for(int i = 0; i < studentsGrades.length; i++) {
                double sumGrades = 0.0;
                char[] currentGrades = studentsGrades[i];

                for(char grade : currentGrades) {
                    if(grade == 'A') {
                        sumGrades += 4;
                    }
                    else if(grade == 'B') {
                        sumGrades += 3;
                    }
                    else if(grade == 'C') {
                        sumGrades += 2;
                    }
                }
                Grades[i] = sumGrades / currentGrades.length;
            }

最后的划分也有同样的问题;你需要除以这个学生的成绩,而不是学生的数量。

还要注意i++ 已经在你的外循环更新步骤中完成,所以你不应该在Grades[i] = ... 行中也这样做。

【讨论】:

  • 嗨@kaya3 请解释一下这个逻辑“char[] currentGrades = studentsGrades[i];”。我不太清楚。
  • studentGrades 是一组数组 - 每个学生一个数组 - 所以 studentGrades[i] 只是学生 i 成绩的数组。
猜你喜欢
  • 2019-07-12
  • 1970-01-01
  • 2022-08-17
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多