C++小型学生成绩管理系统

高级程序设计实践报告

课题名称:小型学生成绩管理系统

姓名:小戴

专业班级:电气1207

学号:0909120700

指导老师:向老师

上课时间:6.24~7.4

一.  课程设计目的

1、使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;

2、使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力;

3、使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

二.设计要求

1、需要处理的基础数据

?1) 学生基本信息:如班级、学号、姓名、性别、年龄、宿舍号码、电话号码等。

?2) 学生选修课程的基本信息:课程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、重修否等。

2、系统的基本功能

*     数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息;

*     数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;

*  数据的插入:插入某个学生信息;

*  数据的查询:如按学号查询、按姓名查询等;

* 数据的删除:如删除指定学号、或者指定姓名的学生及其选修课程信息;

*  平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息;

*  列出不及格学生清单(学号、姓名、不及格的课程和成绩)。

*  考虑用文件把数据保存起来(可选)。

三.概要设计

1.整体框架:

整个学生成绩管理系统采用链表作为基本数据结构,创建一个类student用于保存学生的数据且是链表中的一个节点。类list作为保存整个链表之用。主函数通过switch语句来根据用户的需要连接各个模块,以实现用户的需要。

2.模块基本介绍

1).  用户输入模块

在此模块中,用户将根据菜单提示结合自己的需求输入一个0~8的值,来实现一定的功能。

2).  学生信息录入模块

此模块可以让用户从键盘输入每个学生的信息:学号、姓名、性别、各门课程的成绩。用户可插入一个或多个学生信息到当前编辑的班级数据中。用户可删除一个或多个学生信息。

3).  文件保存功能模块

用户在确定以录入的成绩无误之后,可以将学生信息以每一班为单位存为一个数据文件。用户输入的学生信息可随时保存数据文件。

4).  文件打开功能模块

用户可以用此模块将数据文件在程序中打开、编辑,程序只能对当前打开的数据文件进行编辑。

5).  查询功能模块

在此模块里,用户可实现以下操作:1.浏览所有学生信息;2.按学号查询学生信息;3.按姓名查询学生信息;4.查询一个班每个人的总成绩和平均成绩; 5.查询一个班某一门课每个人的总成绩和平均成绩;6.列出不及格清单。

6).  报表输出功能模块

在此模块中,用户可以浏览所有学生的信息,或者可以按学号输出一个班学生信息:学号、姓名、性别、各门课成绩和总成绩,到屏幕和文件。也可以按平均成绩输出从高到低输出学号、姓名信息。

3.模块图:

四.详细设计

主要功能模块的算法设计思路:

1.   用户输入模块设计

提示用户输入一个0~8的值,并存储在一个整型变量m中。

2.   学生信息录入模块设计

通过应用list中的instu()函数,来新建一个链表中的节点,即一个新的学生信息,来进行成绩的录入功能。成绩修改功能,可以根据姓名或学号进行查询并修改相应的课程的成绩,使用了void search(char s[10],int)和void search1(char s[20],int)函数进行操作。search函数根据姓名查找,search1函数根据学号进行查找。因为学号和姓名,都是存储在字符数组中的,所以都是通过字符串的比较进行查找的。然后根据整形参数进行对应的课程成绩的修改。成绩删除功能,也是可以根据姓名或学号进行删除,查询的算法和成绩修改功能的查询方法是一样的,当找到要删除的节点时,因为节点都是在堆内存中保存的,所以可以直接delete掉,并将前一个节点的next指针指向被删掉的节点的next指针所指向的节点。

3.   文件保存功能模块

先提示用户输入保存文件的文件名及班级名称。文件的前两行分别是班级名称和成绩单的开头,然后通过ofstream变量output来进行学生信息的输出,一项一项的输出,并设定格式,直到输出节点为NULL为止,之后关闭output。

4.  查询功能模块

     可以根据姓名或学号进行查找,搜索方法和前几个模块相同。通过outstu1(char *n)和outstu(char *n)来进行输出。总成绩和平均成绩的查询通过函数void outsum(char *)和void outsum1(char *)来完成。通过函数scanall()来浏览所有学生的信息。通过函数think()来进行成绩的统计分析。

 5.  报表输出功能模块

     通过建立一个新的类class stucopy用于拷贝student的数据,并实现排序功能。创建一个stucopy stu[M]数组,将原链表的数据拷贝与数组中,然后用选择排序方法将数组排序,然后用output按照标准的格式输出或保存为数据文件。

五.运行结果

1)信息的录入

2)成绩的查询

3)成绩的修改

4)数据的删除

5)列出不及格清单

6)浏览所有学生信息

7)保存文件

8)按平均成绩排序输出学生信息

六.心得体会

虽说已经有过一次程序设计的经历,但这次的难度显然是比上次要大的多的。本此程序设计所用时间较长,工作量很大,且所涉及的知识很多,光凭我们在课堂上学的知识是远远不够的。开始的时候我还是很期待这次挑战的,但当我真正着手策划设计的时候,才发现有些东西已经超过了自己的能力范围了,但这并不意味着我会因此放弃,接着我就去接了几本相关的书籍,在遇到问题的时候我就会去查阅,也确实解决了一些问题,但显然还有许多问题无从下手,这时就不得不向大神求助了。我觉得在编写程序时需要的是灵感,有时苦坐数个小时什么都没做,但有时在夜深人静的时候却一下子解决了好多问题,虽然熬得很晚,却很值得。为了这个程序设计确实是忙活了好久,总算勉强完成了。我相信我收获的绝不仅仅是一个程序,还有在思维上的锻炼,以及编写能力的提高。总而言之,我觉得这次课程设计很有意义,很有价值。

附录:

#include<iostream.h>

#include<string.h>

#include<iomanip.h>

#include<fstream.h>

int grade_number;//课程数

const int M = 20;

class stucopy//此类用于拷贝student的数据,用于排序功能的实现

{

public:

         char id[20];

         char sex[10];

         char name[10];

    char course[5];//课程编号

         double grade[2][5];

         double sumsum;//总成绩

         double average;//平均成绩

    double xuefen;

         char age[5];

    char dorm[5];

    char tele[20];

};

class student//用于保存学生信息的类

{

friend class list;

public:

char id[20];//保存学号

char sex[10];//保存性别

char name[10];//保存名字

double grade[2][5];//保存成绩

char course[5];//保存课程编号

double xuefen;

char age[5];

char dorm[5];

char tele[20];

student()

{

         next=0;

         for (int i=0;i<20;i++)          id[i]=0;

         for (int i=0;i<10;i++)          sex[i]=0;

         for (int i=0;i<10;i++)          name[i]=0;

    for (int i=0;i<5;i++)       age[i]=0;

    for (int i=0;i<5;i++)       dorm[i]=0;

    for (int i=0;i<20;i++)      tele[i]=0;

}

void s();

void setid(char id1[20])

{

         for(int i=0;i<20;i++)

                   id[i]=id1[i];

}

void setsex(char sex1[10])

{

         for(int i=0;i<10;i++)

                   sex[i]=sex1[i];

}

void setname(char name1[10])

{

         for(int i=0;i<10;i++)

                   name[i]=name1[i];

}

void setage(int age1[5])

{

         for(int i=0;i<5;i++)

         age[i]=age1[i];

}

void setdorm(int dorm1[5])

{

         for(int i=0;i<5;i++)

         dorm[i]=dorm1[i];

}

void settele(int tele1[5])

{

         for(int i=0;i<5;i++)

         tele[i]=tele1[i];

}

void setcourse(int course1[5])

{

         for(int i=0;i<5;i++)

         course[i]=course1[i];

}

student *next;//next指向下一个学生,构成链表

char * outid(){return id;}

char * outsex(){return sex;}

char * outname(){return name;}

char *outage(){return age;}

char *outdorm(){return dorm;}

char *outtele(){return tele;}

double outav(){return this->outsum()/grade_number;}

double outgrade(int i){return grade[2][i]=grade[0][i]*0.3+grade[1][i]*0.7;}

char outcourse(int i){return course[i];}

void intgrade(int);

double outsum()

{

         double sum=0;

         for(int i=0;i<grade_number;i++)

                   sum+=this->outgrade(i);

         return sum;

}

};

void student::s()//用于录入学生的信息

{cout<<"请输入课程数:"<<endl;

cin>>grade_number;

cout<<"请输入学号:"<<endl;

cin>>id;

cout<<"请输入姓名:"<<endl;

cin>>name;

cout<<"请输入性别:"<<endl;

cin>>sex;

cout<<"请输入年龄:"<<endl;

cin>>age;

cout<<"请输入宿舍号:"<<endl;

cin>>dorm;

cout<<"请输入电话:"<<endl;

cin>>tele;

for(int i=0;i<grade_number;i++)

  {cout<<"请输入课程编号:"<<endl;

   cin>>course[i];

   cout<<"学分:"<<endl;

   cin>>xuefen;

   cout<<"平时成绩:"<<endl;

   cin>>grade[0][i];

   if(grade[0][i]>100||grade[0][i]<0)

   {cout<<"请输入0~100之间的数!"<<endl;

   cout<<"请重新输入:" <<endl;

   cin>>grade[0][i]; }

   cout<<"考试成绩"<<endl;

   cin>>grade[1][i];

   if(grade[1][i]>100||grade[1][i]<0)

   {cout<<"请输入0~100之间的数!"<<endl;

   cout<<"请重新输入:" <<endl;

   cin>>grade[1][i]; }

  }

}

void student::intgrade(int j)//用于修改学生的成绩

{

         for(int i=0;i<grade_number;i++)

                   if(j==i+1)

        {

                    cout<<"平时成绩"<<endl;

        cin>>grade[0][i];

                   if(grade[0][i]>100||grade[0][i]<0)

   {cout<<"请输入0~100之间的数!"<<endl;

   cout<<"请重新输入:" <<endl;

   cin>>grade[0][i]; }

                  

                   cout<<"考试成绩"<<endl;     

                   cin>>grade[1][i];          

        if(grade[1][i]>100||grade[1][i]<0)

   {cout<<"请输入0~100之间的数!"<<endl;

   cout<<"请重新输入:" <<endl;

   cin>>grade[1][i]; }

                  

                   }

}

class list//此类为链表

{

public:

student *last,*first;//链表的开头和结尾

double totoal;

list(){last=0;first=0;};

~list();

void instu();//新建一个学生的数据

void outstu(char *);//根据姓名输出一个学生的信息

int delstu(char *n);//根据姓名删除一个学生的信息

void outstu1(char *);//根据学号输出一个学生的信息

int delstu1(char *n);//根据学号删除一个学生的信息

void outsum(char *);//根据姓名输出一个学生的总成绩和平均成绩

void outsum1(char *);//根据学号输出一个学生的总成绩和平均成绩

void think();//用于输出班级成绩的统计分析

void search(char s[10],int);//根据姓名修改一个学生的成绩

void search1(char s[20],int);//根据学号修改一个学生的成绩

void scanall();//输出所有学生的信息

};

list::~list()//析构函数,将所有创建的学生对象删掉

{

if(first!=0)

{

student *p=first,*temp;

while(p!=NULL){

temp=p;

p=p->next;

delete temp;

cout<<"ok"<<endl;

}}}

void list::instu()

{ student *p=new student();

p->s();

if(first==0){first=last=p;}else{last->next=p;last=p;}

}

void list::outstu(char *n)//按姓名输出

{

         if(first==0) {cout<<"班级无成员!查无此人!"<<endl;return;}

         student *temp=first;for(;temp!=NULL;temp=temp->next)

                   if(strcmp(temp->outname(),n)==0)

                   { cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别"<<setw(8)<<"年龄"<<setw(8)<<"宿舍号"<<setw(8)<<"电话";

                           

                            for(int i=0;i<grade_number;i++)

                            {cout<<setw(8)<<temp->outcourse(i);}

                            cout<<endl;

                     cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(8)<<temp->outsex()

                     <<setw(8)<<temp->outage()<<setw(8)<<temp->outdorm()<<setw(8)<<temp->outtele();;

                     for(int i=0;i<grade_number;i++)

                     {cout<<setw(8)<<temp->outgrade(i);}

               return; }

                   cout<<"查无此人!"<<endl;

                   return;

}

void list::outstu1(char *n)//按学号输出

{

         if(first==0) {cout<<"班级无成员!查无此人!"<<endl;return;}

         student *temp=first;for(;temp!=NULL;temp=temp->next)

                   if(strcmp(temp->outid(),n)==0)

                   { cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别"<<setw(8)<<"年龄"<<setw(8)<<"宿舍号"<<setw(14)<<"电话";

                           

                            for(int i=0;i<grade_number;i++)

                            {cout<<setw(8)<<temp->outcourse(i);}

                            cout<<endl;

                     cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(8)<<temp->outsex()

                     <<setw(8)<<temp->outage()<<setw(8)<<temp->outdorm()<<setw(14)<<temp->outtele();

                     for(int i=0;i<grade_number;i++)

                     {cout<<setw(8)<<temp->outgrade(i);}

               return; }

                   cout<<"查无此人!"<<endl;

                   return;

}

int list::delstu(char *n)//删除学生成绩

{

         if(first==0) {cout<<"无数据!"<<endl;return 0;}

         student *temp=first;

         student *p;

         if(strcmp(first->outname(),n)==0)

         { first=first->next;delete temp;

         cout<<"\n删除成功\n";return 0;}

         else for(;temp->next!=NULL;temp=temp->next)

         {if(strcmp(temp->next->outname(),n)==0)

         {p=temp->next;temp->next=temp->next->next;delete p;

         cout<<"\n删除成功\n";return 0;}}

        

         cout<<"\n查无此人,删除失败\n";

         return 0;

}

int list::delstu1(char *n)

{

         if(first==0) {cout<<"无数据!"<<endl;return 0;}

         student *temp=first;

         student *p;

         if(strcmp(first->outid(),n)==0)

         { first=first->next;delete temp;

         cout<<"\n删除成功\n";return 0;}

         else while(temp->next!=NULL)

         {if(strcmp(temp->next->outid(),n)==0)

         {p=temp->next;temp->next=temp->next->next;delete p;

         cout<<"\n删除成功\n";return 0;}

         else temp=temp->next;}

        

         cout<<"\n查无此人,删除失败\n";

         return 0;

}

void list::think()//列出不及格清单

{

cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(14)<<"不及格的课程"

<<setw(8)<<"成绩"<<setw(8)<<"重修否"<<endl;

       

          

          student *p=first;for(;p!=NULL;p=p->next)

                          

for(int j=0;j<grade_number;j++)

{if(p->grade[2][j]<60)

   {

  

         cout<<setw(8)<<p->outid()<<setw(8)<<p->outname()<<setw(14)

         <<p->course[j]<<setw(8)<<p->grade[2][j]<<setw(8)<<"重修"<<endl;

   }

}

}

void list::search(char s[10],int n)//根据姓名修改

{

student *temp=first;for(;temp!=NULL;temp=temp->next)

if(strcmp(temp->outname(),s)==0)temp->intgrade(n);

}

void list::search1(char s[20],int n)//根据学号修改

{

         student *temp=first;for(;temp!=NULL;temp=temp->next)

                   if(strcmp(temp->outid(),s)==0)

                   temp->intgrade(n);

                  

}

void list::scanall()

{

         if(first==0) {cout<<"班级无成员!查无此人!"<<endl;return;}

           student *temp=first;  for(;temp!=NULL;temp=temp->next)

                  

                    {cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别";

                           

                            for(int i=0;i<grade_number;i++)

                            {cout<<setw(8)<<temp->outcourse(i);}

                            cout<<endl;

                     cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(8)<<temp->outsex();

                     for(int i=0;i<grade_number;i++)

                     {cout<<setw(8)<<temp->outgrade(i);}

                cout<<endl;

                     }

}

int main()

{

         stucopy stu[M];//复制整个链表的数据于数组,用于排序

         stucopy stutemp;//临时变量

         list will;//整个链表

         student *p, *p1=new student(),*q;//临时变量

         ifstream input;//输入

         ofstream output;//输出

         char file[20],classname[20],temp[80],id[20],name[9],sex1[10],age[5],dorm[5],tele[20];//临时变量

         int m=0,n=0,j=0,i=0;//临时变量

         double grade1[2][5];//临时变量

    char  course1[10];

         for( i=0;i<20;i++) id[i]=0;

         for(i=0;i<9;i++) name[i]=0;//初始化

do{cout<<"                           小型学生成绩管理系统                       "<<endl;

cout<<"        ******************************************************************"<<endl

    <<"        *  1 成绩的录入:包括学生学号、姓名、性别和各门课程成绩的录入。  *"<<endl

    <<"        *  2 成绩的查询:可以根据学号或姓名查询某个学生的成绩。          *"<<endl

    <<"        *  3 成绩的修改:可以根据学号或姓名来修改相应的学生的成绩。      *"<<endl

    <<"        *  4 数据的删除:可以根据学号或姓名指定删除某个学生的数据。      *"<<endl

    <<"        *  5 列出不及格学生清单(学号、姓名、不及格的课程和成绩)。      *"<<endl                                

    <<"        *  6 浏览所有学生信息。                                          *"<<endl

    <<"        *  7 将所有学生信息保存成文件。                                  *"<<endl

    <<"        *  8 按平均成绩排序输出学生信息。                                *"<<endl

    <<"        ******************************************************************"<<endl;

cout<<endl<<"请输入:";

cin>>m;

switch(m)

{

case 1:

will.instu();

break;

case 2:

        

         cout<<"1.根据学号查询     2.根据姓名查询"<<endl<<"请输入:";

         cin>>n;

         switch(n){        

         case 1:

                   cout<<"请输入学号\n";

                   cin>>id;

                   will.outstu1(id);

                   cout<<endl;break;

         case 2:

                   cout<<"请输入姓名\n";

                   cin>>name;

                   will.outstu(name);

                   cout<<endl;break;}break;

case 3:

         do{

                   cout<<"1.根据学号修改     2.根据姓名修改"<<endl<<"请输入:";

                   cin>>n;

                   switch(n){

                   case 1:

                            cout<<"请输入学号\n";

                            cin>>id;

                            will.outstu1(id);

                            cout<<endl;

                            cout<<"请输入课程编号:";

                            cin>>j;

                            will.search1(id,j);break;

                   case 2:

                            cout<<"请输入姓名\n";

                            cin>>name;

                            will.outstu(name);

                            cout<<endl;

                            for(int i=0;i<grade_number;i++)

           {cout<<"请输入课程名:"<<endl;

         cin>>p->course[i];

         cout<<"平时成绩"<<endl;

         cin>>p->grade[0][i];

                    cout<<"考试成绩"<<endl;

                    cin>>p->grade[1][i];}

                            cout<<"请输入课程编号:";

                            cin>>j;

                            will.search(name,j);break;}

         cout<<endl<<"输入1:继续修改     输入0:退出修改"<<endl;

                    cin>>m;

         }while(m==1);

         break;

case 4:

         cout<<"1.根据学号删除     2.根据姓名删除"<<endl<<"请输入:";

         cin>>n;

         switch(n){

         case 1:

                   cout<<"请输入学号\n";

                   cin>>id;

                   will.outstu1(id);

                   will.delstu1(id);break;

         case 2:

                   cout<<"请输入姓名\n";

                   cin>>name;

                   will.outstu(name);

                   will.delstu(name);break;}break;

case 5:

will.think();

break;

case 6:

    will.scanall();

        

                   break;

case 7:

                   cout<<"请输入文件名:"<<endl;

                   cin>>file;

                   cout<<"请输入班级名称:"<<endl;

                   cin>>classname;

                   output.open(file);

                   p = will.first;

                   output<<classname<<"成绩单"<<endl<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别";

                           

                            for(int k=0;k<grade_number;k++)

                            {output<<setw(8)<<p->outcourse(k);}

                            output<<setw(8)<<"平均成绩"<<endl;

                    for(;p!=NULL;p=p->next)

                     {output<<setw(8)<<p->outid()<<setw(8)<<p->outname()<<setw(8)<<p->outsex();

                     for(int i=0;i<grade_number;i++)

                     {output<<setw(8)<<p->outgrade(i);}

               output<<setw(8)<<p->outav()<<endl;}

                    

                   output.close();

                   break;

case 8:

         p=will.first;

         cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别"

         <<setw(8)<<"年龄"<<setw(8)<<"宿舍号"<<setw(14)<<"电话"

         <<setw(14)<<"平均成绩"<<endl;

        

                   for(i=0;i<20&&p!=NULL;i++,p=p->next)

         {

             for (j=0;j<20;j++)

                   {

                            stu[i].id[j]=p->id[j];

                   }

                   for (j=0;j<10;j++)

                   {

                            stu[i].name[j]=p->name[j];

                   }

                   for (j=0;j<10;j++)

                   {

                            stu[i].sex[j]=p->sex[j];

                   }

                   for (j=0;j<5;j++)

                   {

                            stu[i].age[j]=p->age[j];

                   }

                   for (j=0;j<5;j++)

                   {

                            stu[i].dorm[j]=p->dorm[j];

                   }

                   for (j=0;j<20;j++)

                   {

                            stu[i].tele[j]=p->tele[j];

                   }

                  

                   stu[i].sumsum=p->outsum();

                   stu[i].average=p->outav();

       for(j=0;j<grade_number;j++)

                            stu[i].grade[2][j]=p->grade[2][j];

        

         }

         for(n=0;n<i-1;n++)

                   for(j=1;j<i;j++)

                   {

                            if (stu[n].average<stu[j].average)

                            {

                                     stutemp=stu[j];

                                     stu[j]=stu[n];

                                     stu[n]=stutemp;

                            }

                   }

                   for (j=0;j<i;j++)

                            cout<<setw(8)<<stu[j].id<<setw(8)<<stu[j].name<<setw(8)

                                     <<stu[j].sex<<setw(8)<<stu[j].age<<setw(8)<<stu[j].dorm<<setw(14)

                                     <<stu[j].tele<<setw(14)<<stu[j].average<<endl;

                                              

                                     break;

}

cout<<endl<<" 输入1: 继续;     输入0: 退出"<<endl;

cin>>m;

 }while(m==1);

}

相关推荐