學生成績管理系統C++@USC

                                                                          題目學生成績管理系統設計


1、問題描述

       學生信息包括:學號、姓名、性別、年齡、班級等信息。

       小學生除了包括學生所有信息外,還包括英語、數學和語文成績。

       中學生除了包括小學生所有信息外,還包括地理、歷史成績。

       大學生除了包括學生所有信息外,還包括專業、英語、程序設計和高等數學等課程。

       設計一程序能夠對學生成績進行管理,應用到繼承、抽象類、虛函數、虛基類、多態和文件的輸入/輸出等內容。

2、功能要求

1)添加功能:程序能夠添加不同學生的記錄,提供選擇界面供用戶選擇所要添加的類別,要求學號要唯一,如果添加了重複學號的記錄時,則提示數據添加重複並取消添加。

2)查詢功能:可根據學號、姓名等信息對已添加的學生記錄進行查詢,如果未找到,給出相應的提示信息,如果找到,則顯示相應的記錄信息。

3)顯示功能:可顯示當前系統中所有學生的記錄,每條記錄佔據一行。

4)編輯功能:可根據查詢結果對相應的記錄進行修改,修改時注意學號的唯一性。

5)刪除功能:主要實現對已添加的學生記錄進行刪除。如果當前系統中沒有相應的記錄,則提示“記錄爲空!”並返回操作。

6)統計功能:能根據多種參數進行統計。能統計學生人數、總分、單科的平均分等。

7)保存功能:可將當前系統中各類記錄存入文件中,存入方式任意。

8)讀取功能:可將保存在文件中的信息讀入到當前系統中,供用戶進行使用。

9)排序功能:可按總分和單科成績排名次。

3、問題的解決方案 

根據系統功能要求,可以將問題解決分爲以下步驟:

1)應用系統分析,建立該系統的功能模塊框圖以及界面的組織和設計;

2)分析系統中的各個實體及它們之間的關係;

3)根據問題描述,設計系統的類層次;

4)完成類層次中各個類的描述;

5)完成類中各個成員函數的定義;

6)完成系統的應用模塊;

7)功能調試;

8)完成系統總結報告。


                                                                                      系統實現與報告

注:撰寫時沒學數據結構,導致傻逼似的手動模擬撰寫了雙向鏈表,沒有使用標準庫裏面的已有的鏈表,雖然有點傻逼,但是自己手動模擬實現一個數據結構還是挺好的,代碼冗餘嚴重,簡單點說就是寫的很爛~

實驗報告原文下載:https://download.csdn.net/download/lfy905805357/11250294

實現項目源碼下載:https://download.csdn.net/download/lfy905805357/11250302


 

                                                                                         南華大學

                                                                             計算機科學與技術學院

                                                                                        實 訓 報 告

 

                                                                    ( 2017 ~ 2018 學年 夏季 學期 )

 

 

課程名稱

高級語言程序設計實訓

 

實驗名稱

學生成績管理系統

 

 

組長姓名

LFY

學號

201604408

組員姓名

YY

學號

201604408

組員姓名

ZMJ

學號

201604408

 

專業

計算機類

班級

八班

 

地點

八教

教師

CX


1.實驗目的及要求

編程環境:codeblocks        硬件:普通筆記本電腦
一 實驗目的:

1、要求熟練掌握C++語言的基本知識和技能; 

2、基本掌握面向對象程序設計的基本思路和方法; 

3、能夠利用所學的基本知識和技能,解決簡單的面向對象程序設計問題。

4、運用面向對象的程序設計建造出一個學生成績管理系統

5、通過實驗實踐設計、鞏固自己繼承與派生、虛函數等的應用以及相關知識的加強、形成以面向對象的思維方式、學會分析各類成員以及他們之間的關係,爲未來的程序設計打下基礎。

二 實驗要求:

     1、設計出一個學生成績管理系統。

     2、運用面向對象的方式,應用到繼承、抽象類、虛函數、虛基類、多態和文件的輸入/輸出等內容。

     3、學生類爲基類(抽象類)其中包含學生的一些基本信息,學生類派生出小學生類 增添了3門成績信息,小學生類派生出中學生類,又增添了2門成績,學生類派生出大學生類,由於大學生的成績科目計算方法更爲複雜,大學生類也不同與前面的中小學生類,更爲複雜化。

     4、編寫成績管理系統類,對前面的幾個學生對象進行操作,實現一定的管理功能(例如:讀取,添加,查詢,顯示,排序,保存,刪除,編輯等功能)

     5、能力足夠,可以另外添加一些功能。

2.實驗步驟

一 分析實驗要求:

   看清題目意思,弄明白各個實驗要求,避免南轅北轍,通過分析可以明白題目的一些基本要求。

二 分析類的層次關係:

   既然是面向對象的程序設計,那就必須少不了對類的分析,題目中涉及到幾個類,他們之間的關係是什麼,這都是實現實驗之前需要分析的內容。

三 思考實現方法:

   分析完了類的層次關係之後,就要考慮怎麼來構建和實現他們關係以及怎麼實現相關的成員函數。是用組合類還是繼承和派生來完成?是用對象數組還是對象鏈表的實現相應的存儲?是用基本的冒泡排序還是其他的各種排序方法?這都是需要在這一階段考慮清楚的內容。

四 畫流程圖和UML類圖:

   通過畫流程圖和UML類圖,使得之前的分析更簡單明瞭,更貼近與代碼,這樣一畫,代碼的實現就更加有依據了,不是憑空瞎寫了。

五 分工編寫實驗代碼:

   根據隊員的代碼習慣和風格,分工合作,各個隊員負責相應的類或分開負責接口的設計和函數實現的設計,分工寫代碼使得效率更高並且加強了同學之間的配合思想的形成。

六 代碼拼湊和調試:

   最後將各隊員的代碼組合起來進行調試分析,看看有沒有問題?,問題出在哪?需不需要改進及優化?這些都是在這一步需要解決的問題。

七 實驗報告的撰寫和總結分析自我評價:

   根據實驗,發現自己的不足,哪裏沒學好,哪裏不會用,促進自己的學習和成長,總結分析本次實驗的優缺點,哪裏處理的好,哪裏還有待改進。

3. 實驗內容

一 需求分析:

   1、學生類(抽象類)要求包含一些基本的學生信息。

    2、小學生類(由學生類派生而來)在學生類的基礎之上再增添了3門課程的成績信息。

    3、中學生類(由小學生類派生而來)在小學生類的基礎之上再增添了2門課程的成績信息。

    4、大學生類(由學生類派生而來)在學生類的基礎之上再增添了許多門課程的成績信息。

    5、學生成績管理類,可以對各種學生類對象進行相關操作(操作包括:讀取信息,顯示信息,查詢信息,編輯信息,刪除學生,增添學生,成績排序等)

    6、應用到繼承、抽象類、虛函數、虛基類、多態和文件的輸入/輸出等內容。

二 概要設計:

        1、設計思想:

       此實驗明顯用一個類是解決不了,要麼就用類的嵌套,或者組合類,我們選擇了類的繼承與派生以及利用friend類來實現相應的功能。我們用五個類解決了這個題目。

定義出學生類(抽象基類)、小學生類、中學生類、大學生類。

其中類的層次關係爲:學生類爲基類(抽象類)學生類派生出小學生類小學生派生出中學生類學生類派生出大學生類(大學生類的實現和中小學生類不同,相比更爲複雜)

他們的友元類都爲studentmanagementsystem類,studentmanagementsystem類裏面保存幾個指針,開創3個雙向鏈表,一個是小學生對象雙向鏈表、一箇中學生對象雙向鏈表、一個大學生對象雙向鏈表。

studentmanagementsystem類裏面再定義相應的函數實現相應的操作功能。

        2、實現方法:

       我們將學生的基本信息和成績信息分開處理,分開用不同的文件進行讀取相應的信息數據。

學生的那些基本數據信息全部用student類的保護(方便繼承)成員數據存下來。

至於成績信息,我們分學生類的不同而實現不同。

由於小學生類和中學生類的科目固定,我直接開固定的科目成績存了下來。

大學生的成績信息相對複雜些,考慮到大學生每個人的科目不同,有些科目有實驗成績、平時成績、卷面成績、綜合成績等。那麼我在大學生類裏面內嵌一個結構體鏈表來存相應的成績數據。運用結構體鏈表,實現了不同人科目可以不同,學分不同。

至於那些操作功能用studentmanagementsystem類的成員函數來實現解決。學生對象內存幾乎都是動態申請的內存,解決辦法---我在studentmanagementsystem類裏面保存了用於創建雙向鏈表的相應指針,再用指針動態申請一個小學生對象的雙向鏈表、一箇中學生對象的雙向鏈表、一個大學生對象的雙向鏈表,這樣排序就只要排一次就可以升序和降序輸出了,不過構建和排序過程中更改指針的指向十分燒腦,很容易弄錯。其他的查詢,刪除都還好辦。只需要遍歷鏈表,以及更改相應的指針指向就ok了。

        3、系統中主要模塊及各模塊間的關係的描述:

       其中類的層次關係爲:學生類爲基類(抽象類)學生類派生出小學生類小學生派生出中學生類學生類派生出大學生類(大學生類的實現和中小學生類不同,相比更爲複雜)

他們的友元類都爲studentmanagementsystem類,tudentmanagementsystem類裏面保存幾個指針,開創3個雙向鏈表,一個是小學生對象雙向鏈表、一箇中學生對象雙向鏈表、一個大學生對象雙向鏈表。

studentmanagementsystem類裏面再定義相應的函數實現相應的操作功能。

三 詳細設計:

   1、簡化UML類關係圖

   2、主要函數流程圖

學生類構造函數

學生類show_normal_message()函數

單個小學生成績信息輸出 

單個大學生成績信息輸出 

求大學生綜合成績和總學分函數 

管理系統構造函數

系統刪除功能函數

管理系統編輯信息功能函

 管理系統基本信息查詢功能函數

 

系統查找成績信息功能函數

系統添加學生功能函數

 

管理系統析構函數

 

單科成績打印功能函數

系統按大學生學分排序打印成績單函數

系統交換鏈表裏面兩個元素功能函數

系統讀取文件信息函數

系統成績排序功能函數

系統升級函數

Main()函數

3、核心代碼(足夠註釋)

類的實現.cpp代碼過長就不貼出來了,自行從上面鏈接下載整個項目~

Student.h

#ifndef STUDENT_H_INCLUDED
#define STUDENT_H_INCLUDED
#include "Head.h"
using namespace std;
//基類(學生類)-抽象類
class student
{
    friend class studentmanagementsystem;
public:
    student():total_course(0),age(0),grade("一年級"){total++;}
    student(string ID,string name,string classes,string sex,int age,string grade,int houseID,int phonenumble);//構造函數
    virtual ~student(){total--;}//析構函數
    void show_normal_message()const;//顯示學生基本信息
    //基類設置兩個純虛函數,方便派生類的不同實現
    virtual void get_sum()=0;//求綜合成績和總成績
    virtual void show_score_message(ofstream &outfile)const=0;//顯示學生成績信息
    static int gettotal(){return total;}//靜態函數成員求總人數
protected:
    //學生基本屬性
    string name,ID,sex,classes,grade;//姓名、學號、性別、班級、年級
    int age,phonenumble,houseID;//年齡、手機號、宿舍號
    int total_course;//科目數目
private:
    static int total;//靜態數據成員(統計學生數目)
};
//學生類派生出的小學生類
class pri_stu:public student
{
    friend class studentmanagementsystem;
public:
    //構造函數
    pri_stu():student(),english(0),chinese(0),math(0),next(NULL),front(NULL){total_course=3;pri_total++;}
    pri_stu(string ID,string name,string classes,string sex,int age,string grade,int houseID,int phonenumble):
    student(ID,name,classes,sex,age,grade,houseID,phonenumble),english(0),chinese(0),math(0),score_sum(0)
    {front=next=NULL;total_course=3;pri_total++;}
    //析構函數
    virtual ~pri_stu(){pri_total--;}
    int get_sumscore()const{return score_sum;}
    void get_sum(){score_sum=english+chinese+math;}//求總成績
    void show_score_message(ofstream &outfile)const;//顯示學生成績信息
    static int get_pri_num(){return pri_total;}//靜態函數成員求總人數
protected:
    int english,chinese,math;
    int score_sum;//總成績
    pri_stu *next,*front;//創建雙向鏈表用的指針
private:
    static int pri_total;//統計小學總人數
};
//小學生類派生出中學生類
class mid_stu:public pri_stu
{
    friend class studentmanagementsystem;
public:
    mid_stu():pri_stu(),geography(0),history(0){front=next=NULL;total_course=5;mid_total++;}
    mid_stu(string ID,string name,string classes,string sex,int age,string grade,int houseID,int phonenumble):
    pri_stu(ID,name,classes,sex,age,grade,houseID,phonenumble),geography(0),history(0)
    {front=next=NULL;total_course=5;mid_total++;}
    virtual ~mid_stu(){mid_total--;}
    void get_sum(){score_sum=english+chinese+math+geography+history;}//求總成績
    void show_score_message(ofstream &outfile)const;//顯示學生成績信息
    static int get_mid_total(){return mid_total;}//靜態函數成員求總人數
private:
    mid_stu *next,*front;//創建雙向鏈表用的指針
    int geography,history;//地理,歷史成績
    static int mid_total;//統計中學生總人數
};
//由於大學生成績更爲複雜,我用結構體來存學生成績
struct stu_score_message//學生的成績用結構體存
{
    //以下是成績信息
    string courseID;//課程編號
    string coursename;//課程名稱
    int coursecredit;//學分
    int peacetimescore;//平時成績
    int volumescore;//卷面成績
    int experimentalscore=-1;//實驗成績(-1代表該科目無實驗)
    float comprehensivescore=0;//綜合成績
    stu_score_message *nexts=NULL;//指向下一個們成績的結構體位置
};
//學生類派生出來的大學生類
class col_stu:public student
{
    friend class studentmanagementsystem;
public:
    col_stu():student(),score_head(NULL){front=next=NULL;this->creditsum=0;col_total++;}
    col_stu(string ID,string name,string classes,string sex,int age,string grade,int houseID,int phonenumble):
    student(ID,name,classes,sex,age,grade,houseID,phonenumble),score_head(NULL)
    {front=next=NULL;this->creditsum=0;col_total++;}
    //構造函數 成績數組指針用常引用
    virtual ~col_stu();//析構函數
    //設置私有成績信息
    void set_scores(string courseID,string coursename,int coursecredit,int peacetimescore,int experimentalscore,int volumescore,string thecourse);
    void get_sum();//求綜合成績和總成績
    void show_score_message(ofstream &outfile)const;//顯示學生成績信息
    static int get_col_total(){return col_total;}//靜態函數成員求總人數
private:
    col_stu *next,*front;//創建雙向鏈表用的指針
    stu_score_message *score_head;
    int creditsum;//總學分
    static int col_total;//靜態數據成員(統計學生數目)
};

#endif // STUDENT_H_INCLUDED

Studentmangmentsystem.h

#ifndef STUDENTMANAGEMENTSYSTEM_H_INCLUDED
#define STUDENTMANAGEMENTSYSTEM_H_INCLUDED
#include "Student.h"
#include "StudentManagementSystem.h"
namespace{const string st="----------------";}//輔助初始化
class studentmanagementsystem
{
public:
    studentmanagementsystem(string jurisdiction="小學生");//構造函數
    ~studentmanagementsystem();//析構函數
    //打印管理系統的文本菜單
    void show_menu(const string a=st,const string b=st,const string c=st,const string d=st,const string e=st,const string f=st,const string g=st,const string h=st,const string i=st,const string j=st,const string k=st)const;
    void printfs(const string &topic)const;//輔助打印文本菜單
    void input_message();//文件讀入學生信息數據
    void find_normal_message();//學生基本信息查詢
    void find_score_message();//學生成績查詢
    void remove();//刪除功能
    void sorts(char c='A');//成績排序功能
    void exchange(pri_stu *latter);//交換小學生雙向鏈表相鄰的兩個
    void exchange(mid_stu *latter);//交換中學生雙向鏈表相鄰的兩個
    void exchange(col_stu *latter);//交換大學生雙向鏈表相鄰的兩個
    void sort_score(char c='F');//按某科目綜合成績排列
    void sort_credit(char c='H');//按某科目學分排序
    void print_single_score(string courseID="A01",char c='F',string grade="大學生");//打印某科目的成績單
    void print_score(char c='H',string grade="大學生",bool is_sort=1);//打印總成績單
    void delete_stu();//收回動態申請的學生類對象
    void change_onces_message();//修改某人信息
    void add_student();//增添單個同學
    void system_upgrade();//系統版本升級
    ofstream outfile;//用於文件保存數據使用
private:
    string name;//學生管理系統對象的名字
    string version;//學生管理系統的版本
    int amount_of_student;//學生個數統計值
    //用來對學生對象鏈表進行操作的指針
    pri_stu *head1,*nodes1,*p1,*last1;
    mid_stu *head2,*nodes2,*p2,*last2;
    col_stu *head3,*nodes3,*p3,*last3;
    string jurisdiction;//權限設置
};



#endif // STUDENTMANAGEMENTSYSTEM_H_INCLUDED

main.cpp

#include "Head.h"
#include "Student.h"
#include "StudentManagementSystem.h"
using namespace std;
int main()
{
    char d;
    bool run=1;
    studentmanagementsystem manage1("小學生");//定義學生管理系統對象(權限:小學生)
    studentmanagementsystem manage2("中學生");//定義學生管理系統對象(權限:中學生)
    studentmanagementsystem manage3("大學生");//定義學生管理系統對象(權限:大學生)
    //顯示系統操作界面
    while(run){
    manage1.show_menu(">>請輸入學生類型<<","[A:小   學   生]","[B:中   學   生]","[C:大   學   生]","[D: 退      出 ]");
    cout<<endl;
    for(int i=0;i<48;i++)cout<<" ";
    cin>>d;
    if(d=='A'){
        manage1.show_menu(">>請輸入操作類型<<",
        "[A:數據錄入功能]","[B:基本情況查詢]","[C:學生成績查詢]",
        "[D:信息刪除功能]","[E:成績排序功能]","[F:打印總成績單]",
        "[G:編輯個人信息]","[H:增添單個同學]","[I:升級管理系統]","[J:退出管理系統]");
        char choice='a';//控制操作指令
        bool flag=true;//判斷是否退出操作
        while(choice!='A'&&flag)
        {
            for(int i=0;i<42;i++)cout<<" ";
            cout<<"請輸入操作指令:\n"<<endl;
            for(int i=0;i<48;i++)cout<<" ";
            cin>>choice;
            if(choice=='A')
            {
                manage1.input_message();//調用函數從文件中錄入數據
            }
            else if(choice=='J')flag=false;//退出操作
            else
            {
                for(int i=0; i<36; i++)cout<<" ";
                cout<<"Error! 請先錄入學生信息!\n"<<endl;
            }
        }
        while(flag)//循環操作
        {
            for(int i=0; i<42; i++)cout<<" ";
            cout<<"請輸入操作指令:\n"<<endl;
            for(int i=0; i<48; i++)cout<<" ";
            cin>>choice;
            manage1.outfile.open("save1");//關聯文件,用於保存相應數據
            switch(choice)
            {
            case 'A':
                for(int i=0; i<42; i++)cout<<" ";
                cout<<"請勿重複讀取文件信息!"<<endl;
                break;
            case 'B':
                manage1.find_normal_message();
                break;
            case 'C':
                manage1.find_score_message();
                break;
            case 'D':
                manage1.remove();
                break;
            case 'E':
                manage1.sorts(d);
                break;
            case 'F':
                manage1.print_score('D',"小學生",0);
                break;
            case 'G':
                manage1.change_onces_message();
                break;
            case 'H':
                manage1.add_student();
                break;
            case 'I':
                manage1.system_upgrade();
                break;
            case 'J':
                flag=false;
                break;
            default :
                for(int i=0; i<43; i++)cout<<" ";
                cout<<"Input Error!"<<endl;
            }
        }
        manage1.outfile.close();//關閉文件關聯
    }
    else if(d=='B'){
        manage2.show_menu(">>請輸入操作類型<<",
        "[A:數據錄入功能]","[B:基本情況查詢]","[C:學生成績查詢]",
        "[D:信息刪除功能]","[E:成績排序功能]","[F:打印總成績單]",
        "[G:編輯個人信息]","[H:增添單個同學]","[I:升級管理系統]","[J:退出管理系統]");
        char choice='a';//控制操作指令
        bool flag=true;//判斷是否退出操作
        while(choice!='A'&&flag)
        {
            for(int i=0;i<42;i++)cout<<" ";
            cout<<"請輸入操作指令:\n"<<endl;
            for(int i=0;i<48;i++)cout<<" ";
            cin>>choice;
            if(choice=='A')
            {
                manage2.input_message();//調用函數從文件中錄入數據
            }
            else if(choice=='J')flag=false;//退出操作
            else
            {
                for(int i=0; i<36; i++)cout<<" ";
                cout<<"Error! 請先錄入學生信息!\n"<<endl;
            }
        }
        while(flag)//循環操作
        {
            for(int i=0; i<42; i++)cout<<" ";
            cout<<"請輸入操作指令:\n"<<endl;
            for(int i=0; i<48; i++)cout<<" ";
            cin>>choice;
            manage2.outfile.open("save2");//關聯文件,用於保存相應數據
            switch(choice)
            {
            case 'A':
                for(int i=0; i<42; i++)cout<<" ";
                cout<<"請勿重複讀取文件信息!"<<endl;
                break;
            case 'B':
                manage2.find_normal_message();
                break;
            case 'C':
                manage2.find_score_message();
                break;
            case 'D':
                manage2.remove();
                break;
            case 'E':
                manage2.sorts(d);
                break;
            case 'F':
                manage2.print_score('D',"中學生",0);
                break;
            case 'G':
                manage2.change_onces_message();
                break;
            case 'H':
                manage2.add_student();
                break;
            case 'I':
                manage2.system_upgrade();
                break;
            case 'J':
                flag=false;
                break;
            default :
                for(int i=0; i<43; i++)cout<<" ";
                cout<<"Input Error!"<<endl;
            }
        }
        //關閉文件關聯
        manage2.outfile.close();
    }
    else if(d=='C'){
        manage3.show_menu(">>請輸入操作類型<<",
        "[A:數據錄入功能]","[B:基本情況查詢]","[C:學生成績查詢]",
        "[D:信息刪除功能]","[E:成績排序功能]","[F:打印總成績單]",
        "[G:編輯個人信息]","[H:增添單個同學]","[I:升級管理系統]","[J:退出管理系統]");
        char choice='a';//控制操作指令
        bool flag=true;//判斷是否退出操作
        while(choice!='A'&&flag)
        {
            for(int i=0;i<42;i++)cout<<" ";
            cout<<"請輸入操作指令:\n"<<endl;
            for(int i=0;i<48;i++)cout<<" ";
            cin>>choice;
            if(choice=='A')
            {
                manage3.input_message();//調用函數從文件中錄入數據
            }
            else if(choice=='J')flag=false;//退出操作
            else
            {
                for(int i=0; i<36; i++)cout<<" ";
                cout<<"Error! 請先錄入學生信息!\n"<<endl;
            }
        }
        while(flag)//循環操作
        {
            for(int i=0; i<42; i++)cout<<" ";
            cout<<"請輸入操作指令:\n"<<endl;
            for(int i=0; i<48; i++)cout<<" ";
            cin>>choice;
            manage3.outfile.open("save3");//關聯文件,用於保存相應數據
            switch(choice)
            {
            case 'A':
                for(int i=0; i<42; i++)cout<<" ";
                cout<<"請勿重複讀取文件信息!"<<endl;
                break;
            case 'B':
                manage3.find_normal_message();
                break;
            case 'C':
                manage3.find_score_message();
                break;
            case 'D':
                manage3.remove();
                break;
            case 'E':
                manage3.sorts(d);
                break;
            case 'F':
                manage3.print_score('H',"大學生",0);
                break;
            case 'G':
                manage3.change_onces_message();
                break;
            case 'H':
                manage3.add_student();
                break;
            case 'I':
                manage3.system_upgrade();
                break;
            case 'J':
                flag=false;
                break;
            default :
                for(int i=0; i<43; i++)cout<<" ";
                cout<<"Input Error!"<<endl;
            }
        }
        //關閉文件關聯
        manage3.outfile.close();
    }
    else if(d=='D'){
        run=0;
        cout<<endl;
        for(int i=0;i<44;i++)cout<<" ";
        cout<<"退出成功!"<<endl;
    }
    else{
        cout<<endl;
        for(int i=0;i<40;i++)cout<<" ";
        cout<<"輸入的操作有誤!"<<endl;
    }
    }
    return 0;
}

 四 調試分析:

通過調試,我們不斷髮現代碼還是有很多問題的存在,前面幾次調試發現,文件讀取學生的信息出現了問題,比如學號讀取成了名字,學生人數讀取得不對,後來不斷更正最後實現了正確的讀取。

 後面又發現有些地方少輸出或者多輸出的現象,一一通過排查改正了輸出的錯誤問題,最後我們發現了最麻煩的問題了,排序出現了問題,小學生對象的雙向鏈表排序不對,最後找了半天才發現某個單詞寫錯了,中學生對象的雙向鏈表直接出現了指針指向錯誤的問題,導致了雙向鏈表的斷裂。最後我們三通過了指針漫天飛的操作,找到了錯誤的源頭所在,歷盡千辛萬苦,我們終於完成了最爲賦值的雙向鏈表排序的工作。

 收尾的時候,我們不斷改正輸出排版,導致的界面的美觀。

五 測試結果:

我們經過了一系列的拼湊,調試,分析,更正,最後我們實現了題目要求的那些功能。

我們按基本信息和成績信息和學生類型分文件讀取相應的數據進入程序

其中的界面顯示,刪除,顯示,編輯,添加等功能還比較容易實現,但那些排序就相對複雜了,

對於中小學生來說,分爲按單科成績升降排序按總成績升降排序

對於大學生來說,由於科目不同,平時成績,實驗成績,卷面成績,綜合成績的影響,導致了排序更爲複雜,有按某科目的綜合成績排序按總學分的排序

4、實驗結果

小學生基本信息讀入文件

中學生基本信息讀入文件

大學生基本信息讀入文件

小學生成績讀入文件

中學生成績讀入文件

大學生成績讀入文件

數據錄入功能

基本信息查詢功能

成績信息查詢功能

刪除功能

排序功能

 

打印功能

 顯示同時文件保存輸出

信息編輯功能

添加功能

系統升級及退出

5. 實驗總結分析(務必要有詳細的總結分析和心得體會)

我們三找到了大體思路後,個類,個雙向鏈表,其他功能用函數解決,完成了大體輪廓後,開始感覺大學生科目不同,錄入數據沒有給出學生總數,學分的計算等有點麻煩了,最後只能全部動態申請空間,在仔細的排查之後,成功實現了讀取數據時不用給出學生總數,來一個學生開一個空間,並且學生的科目可以不相同,自然學分有可能不相同了。並且在讀取成績數據時可以不嚴格按照按學號從小到大排列讀取,可以實現學號無規則讀取學生的成績。通過實驗成功體驗到了面向對象的編程的思路不同與面向過程,也體會到了合作的益處。

最後在CX老師的指點之下,我們將大學生類的學生編輯功能全面了一下,大學生添加科目更加簡便了。還有爲學生管理系統添加了權限的屬性,只有規定的屬性員工才能操作和管理該類學生。使得權限更加保密。

 

 

優點

要求全部達到,排序細分(可以按不同的標準進行排序)

大學生類的對象每個人的科目、學分可以不盡相同,

大學生所具有的科目不限,有平時、實驗、卷面、綜合成績,非常貼近現實。

缺點

代碼較爲囉嗦,健壯性有待提升,雙向鏈表的排序效率低下,封裝型也有待提示,代碼重利用難度大。

 

姓名

學號

任務

自我評價

組長:

LFY

201604408

代碼:學生管理系統類

實驗報告:實驗內容、實驗結果、總結、流程圖的撰寫

組員:

YY

201604408

代碼:學生類、大學生類

實驗報告:實驗步驟、總結分析、流程圖的撰寫

組員:

ZMJ

201604408

代碼:小學生類、中學生類

實驗報告:實驗目的及要求、總結、流程圖的撰寫

小組自我評價

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章