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

Python实现大学课程评分系统的功能实现问题求助

解决你的大学评分系统代码问题

首先,你的代码核心问题是混淆了Emner和Karakterer的职责:Emner应该只存纯粹的课程代码,而Karakterer负责存储课程与成绩的映射关系,但你的SettKarakter函数错误地修改了Emner列表,同时emneliste的展示逻辑也没正确关联课程和成绩。下面是具体的解决思路和修正后的代码:

核心修复思路

1. 修复课程列表展示功能

需要遍历Emner中的每一门课程,单独匹配Karakterer里的对应成绩,确保无成绩的课程也能正常显示:

  • 对每个课程代码,在Karakterer中查找是否存在对应条目
  • 找到则显示课程+成绩,未找到则显示课程+“Ingen karakter”(无成绩)

2. 修复新增成绩功能

绝对不要修改Emner列表!所有成绩相关操作都应该针对Karakterer:

  • 先验证课程是否在Emner中,不在则引导用户新增课程
  • 检查该课程是否已有成绩:有则更新,无则新增条目到Karakterer

3. 修正新增课程的格式验证逻辑

原代码的while循环逻辑错误,应该先验证输入格式,正确才添加课程,否则重新提示输入


修正后的完整代码

import re

# 全局列表初始化
Emner = ["INFO100","INFO104","INFO110","INFO150","INFO125"]
FagKoder = [["Informasjonsvitenskap","INF"],["Kognitiv vitenskap","KVT"]]
Karakterer=[["INFO100","C"],["INFO104","B"],["INFO110","E"]]

def emneliste():
    """展示所有课程(含已有成绩和无成绩的课程)"""
    print("\n=== Din emneliste ===")
    for emne in Emner:
        # 查找当前课程的成绩
        karakter = "Ingen karakter"
        for entry in Karakterer:
            if entry[0] == emne:
                karakter = entry[1]
                break
        print(f"{emne}: {karakter}")
    start()

def LeggTilEmne():
    """新增课程到Emner列表"""
    global Emner
    nyttEmne = input("\nSkriv ny emnekode (3-4 bokstaver + 3 tall): ")
    # 先验证格式是否正确,支持大小写输入
    if re.match('^[A-Åa-å]{3,4}[0-9]{3}$', nyttEmne):
        nyttEmne = nyttEmne.upper()  # 统一转为大写,避免大小写重复问题
        if nyttEmne not in Emner:
            Emner.append(nyttEmne)
            print(f"{nyttEmne} er lagt til!")
        else:
            print("Dette emnet er allerede i listen din")
    else:
        print("Feil format! Prøv igjen (f.eks. INFO100)")
        LeggTilEmne()
    start()

def SettKarakter():
    """新增/更新课程成绩"""
    global Karakterer, Emner
    VelgEmne = input("\nHvilke emne? ").upper()
    
    # 检查课程是否在Emner中
    if VelgEmne not in Emner:
        print("Dette faget er ikke i din liste")
        feil = input("Hvis du vil opprette faget, trykk 2, ellers trykk enter: ")
        if feil == "2":
            LeggTilEmne()
        else:
            start()
        return
    
    # 检查课程是否已有成绩
    existing_index = None
    for idx, entry in enumerate(Karakterer):
        if entry[0] == VelgEmne:
            existing_index = idx
            break
    
    SettKar = input("Skriv karakter (A-F): ").upper()
    # 验证成绩格式,确保是合法成绩
    if SettKar not in ["A", "B", "C", "D", "E", "F"]:
        print("Ugyldig karakter! Skriv en bokstav mellom A-F")
        SettKarakter()
        return
    
    if existing_index is not None:
        # 更新已有成绩
        Karakterer[existing_index][1] = SettKar
        print(f"Karakteren for {VelgEmne} er oppdatert til {SettKar}!")
    else:
        # 新增成绩条目
        Karakterer.append([VelgEmne, SettKar])
        print(f"Karakter {SettKar} er lagt til for {VelgEmne}!")
    start()

def start():
    """主菜单入口"""
    print("\n=== Karakteradministrasjon ===")
    print("1. Vis emneliste")
    print("2. Legg til emne")
    print("3. Sett/oppdater karakter")
    print("4. Avslutt")
    valg = input("Velg et alternativ: ")
    if valg == "1":
        emneliste()
    elif valg == "2":
        LeggTilEmne()
    elif valg == "3":
        SettKarakter()
    elif valg == "4":
        print("Ha en fin dag!")
    else:
        print("Ugyldig valg, prøv igjen")
        start()

# 启动程序
start()

关键修改说明

  1. emneliste函数:改为遍历每个课程单独匹配成绩,确保无成绩课程也能正常显示
  2. SettKarakter函数:彻底移除对Emner的修改,所有操作针对Karakterer,支持更新已有成绩和新增成绩
  3. LeggTilEmne函数:修正正则验证逻辑,添加大小写统一处理,避免因大小写导致的重复添加问题
  4. 新增主菜单函数start(),补全程序入口,让流程更清晰
  5. 添加成绩格式验证,确保输入的成绩是合法的A-F字符

内容的提问来源于stack exchange,提问作者Thymas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:18:54