You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:19:50