生徒の成績管理システム|Python小規模アプリケーション演習

トピックの要件

生徒の成績管理システムの実現
生徒の成績情報を順番に入力し、高位から低位、低位から高位の成績を取得し、特定の成績の配列に従って、同じ成績は最初に入力するルールに従って処理されます
データは次のとおりです: (データ ルール: 生徒の名前、数学の高いスコア、英語のスコア、ビッグ オブジェクトのスコア)
SanZhang 70 80 61
SiLi 86 77 81
WuWang 88 90 77
MingLi 60 77 81
MiWang 71 70 60
HaiLi 88 78 89
HeWang 70 90 80
LiWang 67 71 70
出力: 辞書コンテナーを使用して各生徒のスコア データの保存を完了し、すべての生徒をリストに保存します。合計スコアに応じた基準
学生の高い順のリスト、合計スコアの低い学生のリスト、3 科目の学生の高い順のリスト。
具体的なソート結果と関連するコードを示し、設計したソート アルゴリズムの原理を簡単に紹介します。

まとめ

Student_score_info_listクラスを実装することで、この大きな仕事に必要なすべてのメソッドを完了します。

パフォーマンス管理システムでは次のことが導入されます。

トピックで必要な関数:

  • Student_score_info_listクラスを実装すると、各生徒の成績データが格納されます(リストのデータ構造を利用) 各リストの要素型は辞書型(ハッシュテーブル)で、辞書には生徒の名前と3教科の成績が格納されます

  • さらに、print_info_list_by_methodこの方法を通じて、データはトピックのさまざまな並べ替え要件に従って印刷されます。

追加機能が実装されました:

  • 生徒の成績を追加、削除、確認、変更できます
  • 生徒の成績管理システムのメニューインターフェイスを提供 – ユーザーの選択に従って対応する操作を実行できます
  • 固定入力に限定されず、生徒の成績を動的に管理できる

ソートアルゴリズムについて:

  • 効率的なソート方法であるマージソートを提供します(マージソートを選択する理由は後で説明します)

学生情報を入力してください

start_working()クラスメソッドを提供し、menu()メソッドを呼び出し、ユーザー入力に従って対応する操作を実行します。

ユーザーは、生徒の成績情報を追加するために 1 を選択します。このとき、入力条件ステートメントを使用して、対応する名前、学年、その他の情報を入力し、メソッドを呼び出し、 を渡すと、生徒の成績の追加が完了しadd_student_infoますPerson(type:dict)

コードは以下のように表示されます。

def menu(self): # 菜单
        print("*********************")
        print("------- 目录 --------")
        print("------ 1.add --------")
        print("------ 2.del --------")
        print("------ 3.search -----")
        print("------ 4.modify -----")
        print("------ 5.print ------")
        print("*********************")
        print("现在已经有",len(self.stu_info_list),"位学生的成绩")
def start_working(self):  # 学生成绩管理系统开始运行
        while True:
            self.menu()
            sec=int(input("请输入:>"))
            if sec==1:
                # 添加学生信息
                person={
    
    }
                name=input("请输入名字:>")
                person['name']=name
                Advanced_Mathematics=int(input("请输入高数成绩:>"))
                person['Advanced_Mathematics']=Advanced_Mathematics
                English=int(input("请输入英语成绩:>"))
                person['English']=English 
                College_Physics=int(input("请输入大学物理成绩:>"))
                person['College_Physics']=College_Physics 
                person['total_score']=Advanced_Mathematics+English+College_Physics
                print("添加成功!")
                print()
                self.add_student_info(person)
            elif sec==2:
                # 删除学生成绩
                name=input("请输入要删除学生的名字:>")
                self.del_student_info(name)
                print()
            elif sec==3:
                name=input("请输入要查找学生的名字:>")
                self.search_student_info(name)
                print()
            elif sec==4:
                name=input("请输入要修改学生的名字:>")
                self.modify_student_info(name)
                print()
            elif sec==5:
                print("------- 打印方式 --------")
                print("---- 0.按照高数成绩降序 ----")
                print("---- 1.按照英语成绩降序 ----")
                print("---- 2.按照大物成绩降序 ----")
                print("---- 3.按照总分成绩降序 ----")
                print("---- 4.按照总分成绩升序 ----")
                sec=int(input("请选择:>"))
                self.print_info_list_by_method(sec)
                print()
            else:
                print("选择错误 -- 程序退出!")
                sys.exit()

同様に、トピックで必要なすべての学生の成績を追加できます。

生徒の成績の印刷

このメソッドを呼び出すとprint_info_list_by_method()、生徒の成績が印刷され、ユーザーの選択に応じて、対応する並べ替えメソッドと印刷メソッドを呼び出すことができます。

まずStudent_score_info_listクラス属性を定義します

self.sort_method = ['Advanced_Mathematics', 'English', 'College_Physics',
                            'total_score']

sort_methodこの処理により、リストの添字を直接処理するだけで、対応する並べ替えメソッドを呼び出すことがより便利になります。

start_workingユーザーが並べ替え方法を選択できるように、メソッド内でメニューを定義します。

            elif sec==5:
                print("------- 打印方式 --------")
                print("---- 0.按照高数成绩降序 ----")
                print("---- 1.按照英语成绩降序 ----")
                print("---- 2.按照大物成绩降序 ----")
                print("---- 3.按照总分成绩降序 ----")
                print("---- 4.按照总分成绩升序 ----")
                sec=int(input("请选择:>"))
                self.print_info_list_by_method(sec)
                print()

print_info_list_by_method()メソッドを定義する

条件文を使用してユーザーが入力した整数型を判断し、並べ替え関数を呼び出します (並べ替え関数の具体的な実装については後で説明します)。

生徒の成績の印刷をより美しくするには –印刷用pandasライブラリのデータ型を使用しますDataFrame

    # 为了使得打印学生成绩更加美观 -- 采用pandas库中的DataFrame数据类型进行打印
    import pandas as pd
    def print_list(self):
        print("------------- 学生成绩 -------------")
        # 利用DataFrame打印会更好看一些
        df=pd.DataFrame(self.stu_info_list,index=None)
        print(df)
        print("------------- 学生成绩 -------------")    
    def print_info_list_by_method(self, sort_method_type):
        if sort_method_type == 0:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 0, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照高数排序
            pass
        elif sort_method_type == 1:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 1, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照英语排序
            pass
        elif sort_method_type == 2:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 2, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照大学物理排序
            pass
        elif sort_method_type == 3:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 降序
            pass
        elif sort_method_type == 4:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 1)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 升序
            pass

仕分けの具体的な実装

並べ替えクラスを定義します:My_MergeSort_By_Student_score並べ替えアルゴリズムをカプセル化します。

コンストラクターを定義します。受け入れられるパラメーターは次のとおりです。

  1. dict_list並べ替える辞書の順序
  2. sort_method事前に定義された文字のシーケンス
  3. sort_method_typeソートタイプ(整数)
  4. Seq整数、降順の場合は 1、昇順の場合は 0
class My_MergeSort_By_Student_score:
    def __init__(self, dict_list, sort_method, sort_method_type, Seq):
        self.key = sort_method[sort_method_type]  # key是str类型,决定按照什么排序
        self.Seq = Seq  # 决定升序还是降序
        self.dict_list = dict_list  # 待排序的字典序列

マージソート

O(nlogn) 効率を達成できる一般的に使用されるソートは、クイック ソート、ヒープ ソート、およびマージ ソートです。効率 O(n 1.3 ) のソートはヒルソートです。

トピックの要件に従って、同じ成績は最初に入力するルールに従って処理されます。したがって、並べ替えプロセス中に、同じ値を持つ変数の相対位置を変更することはできないため、安定した並べ替えアルゴリズムを使用する必要があります。
マージソートを使用することで、効率と安定性を両立できます。

マージソートの基本的な考え方:

マージ ソート:
マージ ソートで使用される中心的な考え方は分割統治です。マージ ソート (mergeSort)は、順序付けられたサブシーケンスをマージして
、別の順序付けされたシーケンスを取得することです。つまり、最初に各サブシーケンスを順番に作成し、次にサブシーケンスのセグメントを順番に作成します。2 つのソート済みリストを 1 つのソート済みリストにマージすることを、双方向マージと呼びます。

画像

マージ ソートを実装するには、再帰とループの 2 つの方法があり、
再帰メソッドのソース コードは単純で、
ループメソッドのソース コードはより複雑ですが、効率的です。

再帰的アプローチは次のとおりです。

class My_MergeSort_By_Student_score:
    def __init__(self, dict_list, sort_method, sort_method_type, Seq):
        self.key = sort_method[sort_method_type]  # key是str类型,决定按照什么排序
        self.Seq = Seq  # 决定升序还是降序
        self.dict_list = dict_list  # 待排序的字典序列
    def mergeSort(self,arr,arrtmp,start,end):
        if start>=end: return
        mid=start+int((end-start)/2)
        istart1=start
        iend1=mid

        istart2=mid+1
        iend2=end
        self.mergeSort(arr,arrtmp,istart1,iend1)
        self.mergeSort(arr,arrtmp,istart2,iend2)
        # 开始归并
        i = start
        while istart1 <= iend1 and istart2 <= iend2:
            if arr[istart1][self.key]<arr[istart2][self.key]:
                arrtmp[i]=arr[istart1]
                istart1+=1
            else:
                arrtmp[i]=arr[istart2]
                istart2+=1
            i+=1
        while istart1<=iend1:
            arrtmp[i]=arr[istart1]
            i+=1
            istart1+=1
        while istart2<=iend2:
            arrtmp[i]=arr[istart2]
            i+=1
            istart2+=1
        # 把原来的数据拷贝回去
        for i in range(start,end+1):
            arr[i]=arrtmp[i]
    def sortArray(self):
        nums=self.dict_list
        if len(nums)<2:return nums
        arrtmp=[]
        for i in range(0,len(nums)):
            arrtmp.append(0)
        self.mergeSort(nums,arrtmp,0,len(nums)-1)
        if self.Seq==1:
            nums=nums.reverse()
        return nums

トピックで必要な機能以外の機能

生徒情報を削除する

 elif sec==2:
                # 删除学生成绩
                name=input("请输入要删除学生的名字:>")
                self.del_student_info(name)
                print()
    # 查找算法还可以优化 -- 如果使用哈希表存储可以大大提高查找效率(在学生信息多的情况下)
    def del_student_info(self, name):  # 删除名为name的学生成绩
        # 暴力查找名字
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                self.stu_info_list.remove(self.stu_info_list[i])
                print("successfully removed!")
                if_removed = True
                return
        print("err,No information about the student!")

学生情報の変更

ブルートフォース検索名 - 検索後に新しいグレード情報を入力します

def modify_student_info(self, name):  # 修改名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("please modify the score info:")
                # 只允许修改分数,不允许修改名字
                new_total_score = 0
                new_score = int(input("Advanced_Mathematics:"))
                new_total_score += new_score
                self.stu_info_list[i]['Advanced_Mathematics'] = new_score
                new_score = int(input("English:"))
                new_total_score += new_score
                self.stu_info_list[i]['English'] = new_score
                new_score = int(input("College_Physics:"))
                new_total_score += new_score
                self.stu_info_list[i]['College_Physics'] = new_score
                # 更新总成绩
                self.stu_info_list[i]['total_score'] = new_total_score
                break

学生情報を探す

検索アルゴリズムは実際には変更と削除と同じであり、暴力的な横断検索で十分です。情報が見つかったら情報を出力し、見つからない場合はエラー メッセージを出力します。

    def search_student_info(self, name):  # 查找名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("name:", self.stu_info_list[i]['name'])
                print("Advanced_Mathematics",
                      self.stu_info_list[i]['Advanced_Mathematics'])
                print("English", self.stu_info_list[i]['English'])
                print("College_Physics",
                      self.stu_info_list[i]['College_Physics'])
                print("total_score", self.stu_info_list[i]['total_score'])
                break
        print("err,No information about the student!")

学生の成績管理システムの全体的なコード

class My_MergeSort_By_Student_score:
    def __init__(self, dict_list, sort_method, sort_method_type, Seq):
        self.key = sort_method[sort_method_type]  # key是str类型,决定按照什么排序
        self.Seq = Seq  # 决定升序还是降序
        self.dict_list = dict_list  # 待排序的字典序列
    def mergeSort(self,arr,arrtmp,start,end):
        if start>=end: return
        mid=start+int((end-start)/2)
        istart1=start
        iend1=mid

        istart2=mid+1
        iend2=end
        self.mergeSort(arr,arrtmp,istart1,iend1)
        self.mergeSort(arr,arrtmp,istart2,iend2)
        # 开始归并
        i = start
        while istart1 <= iend1 and istart2 <= iend2:
            if arr[istart1][self.key]<arr[istart2][self.key]:
                arrtmp[i]=arr[istart1]
                istart1+=1
            else:
                arrtmp[i]=arr[istart2]
                istart2+=1
            i+=1
        while istart1<=iend1:
            arrtmp[i]=arr[istart1]
            i+=1
            istart1+=1
        while istart2<=iend2:
            arrtmp[i]=arr[istart2]
            i+=1
            istart2+=1
        # 把原来的数据拷贝回去
        for i in range(start,end+1):
            arr[i]=arrtmp[i]
    def sortArray(self):
        nums=self.dict_list
        if len(nums)<2:return nums
        arrtmp=[]
        for i in range(0,len(nums)):
            arrtmp.append(0)
        self.mergeSort(nums,arrtmp,0,len(nums)-1)
        print(nums)
        if self.Seq==0:
            nums=nums[-1::-1]
        return nums

class Student_score_info_list():
    def __init__(self, stu_info_list=[]):  # 提供缺省的参数,如果已有学生成绩 -- 可导入此类
        self.stu_info_list = stu_info_list  # 学生的列表
        self.sort_method = ['Advanced_Mathematics', 'English', 'College_Physics',
                            'total_score']
    def menu(self):
        print("*********************")
        print("------- 目录 --------")
        print("------ 1.add --------")
        print("------ 2.del --------")
        print("------ 3.search -----")
        print("------ 4.modify -----")
        print("------ 5.print ------")
        print("*********************")
        # print(self.stu_info_list)
        print("现在已经有",len(self.stu_info_list),"位学生的成绩")
    def start_working(self):  # 学生成绩管理系统开始运行
        while True:
            self.menu()
            sec=int(input("请输入:>"))
            if sec==1:
                # 添加学生信息
                person={
    
    }
                name=input("请输入名字:>")
                person['name']=name
                Advanced_Mathematics=int(input("请输入高数成绩:>"))
                person['Advanced_Mathematics']=Advanced_Mathematics
                English=int(input("请输入英语成绩:>"))
                person['English']=English 
                College_Physics=int(input("请输入大学物理成绩:>"))
                person['College_Physics']=College_Physics 
                person['total_score']=Advanced_Mathematics+English+College_Physics
                print("添加成功!")
                print()
                self.add_student_info(person)
            elif sec==2:
                # 删除学生成绩
                name=input("请输入要删除学生的名字:>")
                self.del_student_info(name)
                print()
            elif sec==3:
                name=input("请输入要查找学生的名字:>")
                self.search_student_info(name)
                print()
            elif sec==4:
                name=input("请输入要修改学生的名字:>")
                self.modify_student_info(name)
                print()
            elif sec==5:
                print("------- 打印方式 --------")
                print("---- 0.按照高数成绩降序 ----")
                print("---- 1.按照英语成绩降序 ----")
                print("---- 2.按照大物成绩降序 ----")
                print("---- 3.按照总分成绩降序 ----")
                print("---- 4.按照总分成绩升序 ----")
                sec=int(input("请选择:>"))
                self.print_info_list_by_method(sec)
                print()
            else:
                print("选择错误 -- 程序退出!")
                sys.exit()
    def print_list(self):
        print("------------- 学生成绩 -------------")
        # 利用DataFrame打印会更好看一些
        df=pd.DataFrame(self.stu_info_list)
        print(df)
        print("------------- 学生成绩 -------------")
    def print_info_list_by_method(self, sort_method_type):
        if sort_method_type == 0:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 0, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照高数排序
            pass
        elif sort_method_type == 1:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 1, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照英语排序
            pass
        elif sort_method_type == 2:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 2, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照大学物理排序
            pass
        elif sort_method_type == 3:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 降序
            pass
        elif sort_method_type == 4:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 1)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 升序
            pass

    def add_student_info(self, person):  # 按照题目要求,此时的person应该是dict对象
        self.stu_info_list.append(person)

    def del_student_info(self, name):  # 删除名为name的学生成绩
        # 暴力查找名字
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                self.stu_info_list.remove(self.stu_info_list[i])
                print("successfully removed!")
                if_removed = True
                return
        print("err,No information about the student!")

    def search_student_info(self, name):  # 查找名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("name:", self.stu_info_list[i]['name'])
                print("Advanced_Mathematics",
                      self.stu_info_list[i]['Advanced_Mathematics'])
                print("English", self.stu_info_list[i]['English'])
                print("College_Physics",
                      self.stu_info_list[i]['College_Physics'])
                print("total_score", self.stu_info_list[i]['total_score'])
                break
        print("err,No information about the student!")

    def modify_student_info(self, name):  # 修改名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("please modify the score info:")
                # 只允许修改分数,不允许修改名字
                new_total_score = 0
                new_score = int(input("Advanced_Mathematics:"))
                new_total_score += new_score
                self.stu_info_list[i]['Advanced_Mathematics'] = new_score
                new_score = int(input("English:"))
                new_total_score += new_score
                self.stu_info_list[i]['English'] = new_score
                new_score = int(input("College_Physics:"))
                new_total_score += new_score
                self.stu_info_list[i]['College_Physics'] = new_score
                # 更新总成绩
                self.stu_info_list[i]['total_score'] = new_total_score
                break


# ============================================ main ============================================== #
# 本成绩管理系统所有方法由 <Student_score_info_list> 类提供

# main函数
def main():
    s=Student_score_info_list()
    s.start_working()


if __name__ == '__main__':
    main()

おすすめ

転載: blog.csdn.net/Yu_Cblog/article/details/131777593