java生成代码:某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。 考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩0.3+期末成绩0.7。 考察的总成绩直接等于期末成绩 必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。 1、输入: 包括课程、课程成绩两类信息。 课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。 课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式 课程性质输入项:必修、选修 考核方式输入选项:考试、考察 课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩 课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩 2、输出: 输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。
时间: 2024-01-11 16:04:26 浏览: 210
以下是 Java 代码实现:
```
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class CourseGrade {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Map<String, Object>> courseList = new ArrayList<>();
List<Map<String, Object>> gradeList = new ArrayList<>();
String input;
while (true) {
input = scanner.nextLine();
if (input.equals("")) {
break;
}
String[] arr = input.split(" ");
Map<String, Object> course = new HashMap<>();
course.put("name", arr[0]);
course.put("property", arr[1]);
if (arr.length == 3) {
course.put("method", arr[2]);
}
courseList.add(course);
}
while (scanner.hasNextLine()) {
input = scanner.nextLine();
if (input.equals("")) {
break;
}
String[] arr = input.split(" ");
Map<String, Object> grade = new HashMap<>();
grade.put("id", arr[0]);
grade.put("name", arr[1]);
grade.put("course", arr[2]);
if (!arr[3].equals("")) {
grade.put("usualGrade", Double.parseDouble(arr[3]));
}
grade.put("finalGrade", Double.parseDouble(arr[4]));
gradeList.add(grade);
}
scanner.close();
Map<String, List<Map<String, Object>>> gradeMap = new HashMap<>();
for (Map<String, Object> grade : gradeList) {
String courseName = (String) grade.get("course");
if (!gradeMap.containsKey(courseName)) {
gradeMap.put(courseName, new ArrayList<>());
}
gradeMap.get(courseName).add(grade);
}
double totalGradeSum = 0;
int totalGradeCount = 0;
double courseGradeSum = 0;
int courseGradeCount = 0;
double courseTotalGradeSum = 0;
int courseTotalGradeCount = 0;
for (Map<String, Object> course : courseList) {
String courseName = (String) course.get("name");
double courseGradeSumTemp = 0;
int courseGradeCountTemp = 0;
double courseTotalGradeSumTemp = 0;
int courseTotalGradeCountTemp = 0;
for (Map<String, Object> grade : gradeMap.get(courseName)) {
double usualGrade = grade.containsKey("usualGrade") ? (double) grade.get("usualGrade") : 0;
double finalGrade = (double) grade.get("finalGrade");
double totalGrade = 0;
if (course.get("property").equals("必修")) {
totalGrade = usualGrade * 0.3 + finalGrade * 0.7;
} else if (grade.containsKey("usualGrade")) {
totalGrade = finalGrade;
}
totalGradeSum += totalGrade;
totalGradeCount++;
courseGradeSumTemp += finalGrade;
courseGradeCountTemp++;
courseTotalGradeSumTemp += totalGrade;
courseTotalGradeCountTemp++;
}
double courseGradeAvg = courseGradeSumTemp / courseGradeCountTemp;
double courseTotalGradeAvg = courseTotalGradeSumTemp / courseTotalGradeCountTemp;
System.out.printf("%s的单门课程成绩平均分为:%.2f\n", courseName, courseGradeAvg);
System.out.printf("%s的单门课程总成绩平均分为:%.2f\n", courseName, courseTotalGradeAvg);
courseGradeSum += courseGradeSumTemp;
courseGradeCount += courseGradeCountTemp;
courseTotalGradeSum += courseTotalGradeSumTemp;
courseTotalGradeCount += courseTotalGradeCountTemp;
}
double totalGradeAvg = totalGradeSum / totalGradeCount;
double courseGradeAvg = courseGradeSum / courseGradeCount;
double courseTotalGradeAvg = courseTotalGradeSum / courseTotalGradeCount;
System.out.printf("学生所有课程总成绩的平均分为:%.2f\n", totalGradeAvg);
System.out.printf("班级所有课程总成绩平均分为:%.2f\n", courseTotalGradeAvg);
}
}
```
代码实现思路:
1. 先读取课程信息,存储在 `courseList` 中,每个课程信息用一个 `Map` 存储,包括课程名称、课程性质和考核方式三个字段。
2. 再读取课程成绩信息,存储在 `gradeList` 中,每个成绩信息用一个 `Map` 存储,包括学号、姓名、课程名称、平时成绩和期末成绩五个字段。
3. 将 `gradeList` 中的成绩按照课程名称分组,存储在 `gradeMap` 中,`gradeMap` 的键为课程名称,值为该课程的所有成绩信息。
4. 遍历 `courseList`,对于每个课程,从 `gradeMap` 中获取该课程的所有成绩信息,计算单门课程成绩平均分和单门课程总成绩平均分,并将结果累加到总成绩中。
5. 最后计算学生所有课程总成绩的平均分和班级所有课程总成绩平均分。
阅读全文