计算学生证列表的GPA
Computing GPA of list of Student ID
JAVA 的初学者。我正在尝试打印学生的 GPA。找到下面指令的问题。
我们只能有3个等级:A、B、C分别对应4、3、2点。假设一个学生有
获得了 A、A、A 和 B 的成绩。GPA = (4+4+4+3) / 4 = 3.75.
计算GPA应该return学生的GPA数组。
输入:
学生名单 = {1001, 1002}
学生成绩 = {{'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);
}
}
}
问题出在内部循环中:您的循环条件是 j < studentsGrades.length
,而它应该是 j < studentsGrades[i].length
以遍历数组 studentsGrades[i]
.[=17= 的所有条目]
编写此代码的一种更简洁的方法是使用增强的 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] = ...
.
行中也执行此操作
JAVA 的初学者。我正在尝试打印学生的 GPA。找到下面指令的问题。
我们只能有3个等级:A、B、C分别对应4、3、2点。假设一个学生有 获得了 A、A、A 和 B 的成绩。GPA = (4+4+4+3) / 4 = 3.75.
计算GPA应该return学生的GPA数组。
输入: 学生名单 = {1001, 1002} 学生成绩 = {{'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);
}
}
}
问题出在内部循环中:您的循环条件是 j < studentsGrades.length
,而它应该是 j < studentsGrades[i].length
以遍历数组 studentsGrades[i]
.[=17= 的所有条目]
编写此代码的一种更简洁的方法是使用增强的 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] = ...
.