Bash GPA计算脚本重复课程处理问题求助
Bash 5 GPA计算脚本修复求助
核心需求
- 学生重修课程时,GPA计算仅纳入最新成绩
- 若课程有重修则忽略此前不及格成绩,无重修则保留原成绩
- 排除无成绩的在修课程
当前问题
脚本未达预期效果:重复计算了重修课程的两次成绩,而非仅取最新一次。尝试使用Bash关联数组跟踪课程的最新修读记录,但未成功。
相关代码
#!/bin/bash # 定义成绩转绩点的函数 grade_to_points() { case $1 in A) echo 4 ;; A-) echo 3.7 ;; B+) echo 3.3 ;; B) echo 3 ;; B-) echo 2.7 ;; C+) echo 2.3 ;; C) echo 2 ;; D) echo 1 ;; F) echo 0 ;; *) echo -1 ;; # 无成绩的课程返回-1 esac } # 提取科目文件列表和学生ID subject_files=() student_ids=() read_subjects=true for arg in "$@"; do if [[ $arg == "student" ]]; then read_subjects=false continue fi if $read_subjects; then subject_files+=($arg) else student_ids+=($arg) fi done # 遍历每个学生ID生成成绩单 for student_id in "${student_ids[@]}"; do # 从student.dat获取学生姓名 student_name=$(grep "^$student_id" student.dat | cut -d ' ' -f 2-) echo "Transcript for $student_id $student_name" total_points=0 subjects_count=0 # 遍历每个科目文件查找学生成绩 for subject_file in "${subject_files[@]}"; do if grep -q "^$student_id" $subject_file; then # 提取科目详情和成绩 subject_code=$(head -n 1 $subject_file | cut -d ' ' -f 2) academic_year=$(head -n 1 $subject_file | cut -d ' ' -f 3) semester=$(head -n 1 $subject_file | cut -d ' ' -f 4) grade=$(grep "^$student_id" $subject_file | awk '{print ($2=="") ? "" : $2}') # 打印科目详情 echo "$subject_code $academic_year Sem $semester $grade" # 有成绩时计算绩点 if [[ $grade != "" ]]; then points=$(grade_to_points $grade) if [[ $points != -1 ]]; then total_points=$(echo "$total_points + $points" | bc) ((subjects_count++)) fi fi fi done # 计算并打印GPA(如果有已评分科目) if [[ $subjects_count -gt 0 ]]; then gpa=$(echo "scale=2; $total_points / $subjects_count" | bc) echo "GPA for $subjects_count subjects $gpa" else echo "No graded subjects found." fi echo # 换行分隔 done
错误输出(输入命令:transcript COMP* student 1236 1234 1223)
Transcript for 1236 peter COMP1011 2021 Sem 2 A COMP2411 2022 Sem 1 A COMP2432 2022 Sem 2 GPA for 2 subjects 4.00 Transcript for 1234 john COMP1011 2021 Sem 2 B COMP2411 2022 Sem 1 B- GPA for 2 subjects 2.85 Transcript for 1223 bob COMP1011 2021 Sem 2 F COMP1011 2022 Sem 1 B COMP2411 2022 Sem 1 C+ COMP2432 2022 Sem 2 GPA for 3 subjects 1.76
预期正确输出
Transcript for 1236 peter COMP1011 2021 Sem 2 A COMP2411 2022 Sem 1 A COMP2432 2022 Sem 2 GPA for 2 subjects 4.00 Transcript for 1234 john COMP1011 2021 Sem 2 B COMP2411 2022 Sem 1 B GPA for 2 subjects 2.85 Transcript for 1223 bob COMP1011 2021 Sem 2 F COMP1011 2022 Sem 1 B COMP2411 2022 Sem 1 C+ COMP2432 2022 Sem 2 GPA for 2 subjects 2.65
使用的文件内容
student.dat
1223 bob 1224 kevin 1225 stuart 1226 otto 1234 john 1235 mary 1236 peter 1237 david 1238 alice
COMP101121S2.dat
Subject COMP1011 2021 2 1223 F 1234 B 1235 B+ 1236 A
COMP101122S1.dat
Subject COMP1011 2022 1 1223 B 1224 B+ 1225 B1238 C+
COMP241122S1.dat
Subject COMP2411 2022 1 1223 C+ 1234 B1235 B 1236 A
COMP243222S2.dat
Subject COMP2432 2022 2 1223 1235 1236 1237
已尝试的方案
- 使用关联数组跟踪课程的最新修读记录,但未生效
- 确认Bash 5支持关联数组
内容的提问来源于stack exchange,提问作者kibz
相关产品推荐
相关产品推荐

