学生成绩报告册

学生成绩报告册

1

 

第二篇:C++学生成绩管理系统设计报告

学生成绩管理系统

课程设计报告

编写人:李梦婕

同组人员:李梦婕(课程设计负责人)

縢肖莉

郭青艳

李强

完成日期:20##-5-28

指导教师:刘晓静

批阅日期:20##-6-1

分数:

一,需求分析:

用数组或链表数据结构完成一个学生成绩管理系统,此系统的具体功能要求如下:

(1)学生信息录入功能
    1)用户从键盘输入每个学生的信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理五门课成绩。
    2)可插入一个或多个学生信息到当前编辑的班级数据中。

3)可删除一个或多个学生信息。

(2)文件保存功能
    1)学生信息每一班存为一个数据文件,数据文件可在程序中打开、编辑和重新保存。
    2)用户输入学生信息可随时保存数据文件。
(3)文件打开功能
    1)程序只能对当前打开的数据文件进行编辑。
(4)查询功能
    1)浏览所有学生信息;
    2)按学号查询学生信息;
    3)按姓名查询学生信息;
    4) 查询一个班总成绩和平均成绩;
    5) 查询一个班某一门课总成绩和平均成绩;
    6)查询某一门课分数段( <60,60-69,70-79,80-89,>90)学生数。
(5)报表输出功能
    1) 按学号输出一个班学生信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理成绩和总成绩,到屏幕和文件。
    2) 按总成绩输出从高到低输出学号、姓名信息。
    注:以上功能以菜单形式供用户使用,并有一定的容错功能。

二,功能描述

整体框架:

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

模块基本介绍:

1.      用户输入模块

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

2.      学生信息录入模块

此模块可以让用户从键盘输入每个学生的信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理五门课成绩。用户可插入一个或多个学生信息到当前编辑的班级数据中。 用户可删除一个或多个学生信息。

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

4.      文件打开功能模块

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

5.      查询功能模块

在此模块里,用户可实现以下操作:1.浏览所有学生信息;2.按学号查询学生信息;3.按姓名查询学生信息;4.查询一个班每个人的总成绩和平均成绩; 5.查询一个班某一门课每个人的总成绩和平均成绩;6)进行成绩的统计分析:包括总人数,每门课的最高成绩、最低成绩、平均成绩、各个分数段的人数(100-90、89-80、79-70、69-60、59-50、50以下)、及格人数。

6.      报表输出功能模块

在此模块中,用户可以浏览所有学生的信息,或者可以按学号输出一个班学生信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理成绩和总成绩,到屏幕和文件。也可以按总成绩输出从高到低输出学号、姓名信息。
模块图

三,总体设计

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

1.   用户输入模块设计

提示用户输入一个0~11的值,并存储在一个整型变量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.   文件打开功能模块

先提示用户输入要打开的数据文件的名称,然后通过一个ifstream变量input来进行文件操作。首先判断文件是否存在,如果不存在则输出"File does not exist",并跳出switch语句。文件存在的话,则可以进行数据的存入了。因为数据文件具有固定的格式,即开头两行是班级名称和表头,则可以先用两次input.getline(temp,80);语句来将input设置到第三行,此时可以将数据通过input读入链表中。先用input.eof()判断文件中是否有数据,若有数据,则进行数据的读入,直到文件结束。

 5.  查询功能模块

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

 6.  报表输出功能模块

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

四,调试分析

调试是整个程序编写过程中十分重要也是很困难的一部分,在这个过程中用了不少的时间进行程序的调试,在调试过程中遇到的相关问题如下:

一、语法错误

1、语句的最后忘记了加上“;”,使程序发生错误。

2、把“<<”与“>>”写反,以及字符与字符串的操作问题,这些是比较简单的错误,很容易分辨出来,并改正之。

3、函数的返回值问题,也是比较容易找出并解决的问题。

二、逻辑错误

1、文件的写入与读出,刚开始对文件的操作不太明白,一致不能很好的操作文件,其中最大的问题是对已存在的文件读取问题,通过“显示全部学生成绩” 将数据从文件中读取,可是在使用过程中总是出现读出错误,出现乱码。

2、内存的分配问题,这也是困惑了我好久的问题。对于我们初学者来说对内存的分配和释放问题是比较抽象和模糊的难题,本来使用链表的方式存储数据,然而待到排序时出现了交换数据困难的问题,以及分配空间繁琐释放空间不及时的问题,造成空间浪费使得程序运行效率低的问题。因此最后采用了顺序存储记录的方式,这样就能改变前述问题。

整个调试过程中主要是这么几个问题,其余的是一些小问题,很容易的就调试出来了。

五,测试结果

1,主界面

2,录入记录

3,查询记录

4,  修改记录

5,  删除记录

6,  统计分析记录

7,  总成绩和平均成绩查询记录

8,  浏览记录

9,  保存记录

10,              打开记录

11,              排序记录

12,              输出保存记录

六,用户使用说明

用户运行程序后进入系统主界面,在主界面用户可以打开或者新建数据文件。用户新建或者打开文件要符合操作系统的要求,如果用户打开不存在的文件,那么系统将按照用户打开的文件名作为新的数据文件名,并对其进行相关操作。本系统同时只能对一个数据文件进行相关操作,不能同时打开多个数据文件,其类似于单用户操作系统。

当用户指定当前文件后可对其进行显示,插入,删除,修改,计算平均分等相关功能。用户在操作过程中可随时对当前文件进行保存到文件操作,以防止修改的数据丢失。操作完当前文件后,用户可以关闭该文件,在不退出本系统的前提下另行打开或者新建数据文件对其进行相关操作。

七,课程设计的总结

两个星期的课程设计,虽然有些疲劳和困倦,但带给我很多的收获。C++已经学了一个学期了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。也有很多理论上说得过去的代码,但到了实际操作,却是行不通的。这种困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。只能避过这些方法,换方法实现。在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输入电脑,并用编译器将其运行,发现通过不了,再来检查找出问题,这是一件非常辛苦的事情,也很浪费时间。于是在课程设计的时候,我花了两天的时间来规划与写代码,将要实现的内容分析清楚,才把代码输入电脑。我觉得写程序,应该先找到该程序中的核心地方,用多种方法来实现该核心,这才可能避免等到发现逻辑上或者编译器不支持上的错误,才来想补救的措施,这样花费时间在想补救措施是很不值得的。此次任务的完成,也体现出同学之间的团结精神。实践是检验真理的唯一标准。没有实践,就不会发现和深刻体会它的真实所在。只有通过检验的真理,在自己的心里,才会认可它的真实性。面向对象程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。

八,附录

源代码:

#include<iostream.h>

#include<string.h>

#include<iomanip.h>

#include<fstream.h>

const int M = 20;

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

{

public:

    char id[20];

    char sex[10];

    char name[10];

    double grade[5];

    double sumsum;//总成绩

    double average;//平均成绩

};

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

{

friend class list;

public:

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

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

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

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

student()

{

    next=0;

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

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

    for (i=0;i<10;i++)      name[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 setgrade(double grade1[5])

{

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

        grade[i]=grade1[i];

}

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

char * outid(){return id;};

char * outsex(){return sex;};

char * outname(){return name;};

double outsum()

{

    double sum=0;

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

        sum+=this->outgrade(i);

    return sum;

}

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

double outgrade(int i){return grade[i];};

void intgrade(int);

};

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

{

    switch (j)

    {

    case 1:

              cout<<" 请输入数学成绩:\n";

              cin>>grade[0];break;

    case 2:

              cout<<"请输入英语成绩:\n";

              cin>>grade[1];break;

    case 3:

              cout<<"请输入政治成绩:\n";

              cin>>grade[2];break;

    case 4:

          cout<<"请输入程序设计基础成绩:\n";

          cin>>grade[3];break;

    case 5:

              cout<<"请输入物理成绩:\n";

              cin>>grade[4];break;

    }

}

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

{

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

cin>>id;

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

cin>>name;

cout<<"请输入性别:\n";

cin>>sex;

cout<<"请输入数学成绩:\n";

cin>>grade[0];

cout<<"请输入英语成绩:\n";

cin>>grade[1];

cout<<"请输入政治成绩:\n";

cin>>grade[2];

cout<<"请输入程序设计基础成绩:\n";

cin>>grade[3];

cout<<"请输入物理成绩:\n";

cin>>grade[4];

}

class list//此类为链表

{

private:

double high[5],low[5];

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);//根据学号修改一个学生的成绩

double hi(int i);//求某门课的最高分

double lo(int i);//求某门课的最低分

void av(int i);//求某门课的平均分

void ev(int i);//用于班级成绩统计分析的人数分布输出

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

};

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

{

if(first!=0)

{

student *p=first,*temp;

while(p!=NULL){

temp=p;

p=p->next;

delete temp;

cout<<"ok\n";

}}}

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(6)<<"性别"<<setw(6)<<"数学"<<setw(6)

                <<"英语"<<setw(6)<<"政治"<<setw(14)<<"程序设计基础"<<setw(6)<<"物理"<<endl;

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

            <<temp->outgrade(0)<<setw(6)<<temp->outgrade(1)<<setw(6)<<temp->outgrade(2)<<setw(14)

            <<temp->outgrade(3)<<setw(6)<<temp->outgrade(4);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(6)<<"性别"<<setw(6)<<"数学"<<setw(6)

                <<"英语"<<setw(6)<<"政治"<<setw(14)<<"程序设计基础"<<setw(6)<<"物理"<<endl;

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

            <<temp->outgrade(0)<<setw(6)<<temp->outgrade(1)<<setw(6)<<temp->outgrade(2)<<setw(14)

            <<temp->outgrade(3)<<setw(6)<<temp->outgrade(4);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()

{

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

    int i=0;

    student *p=first;

    while (p!=NULL)

    {

        p=p->next;

        i++;

    }

    totoal=i;

cout<<"人数:"<<i<<endl;

cout<<"数学\n";

cout<<"最高分:"<<hi(0)<<" "<<"最低分:"<<lo(0)<<" "<<"平均分:";

av(0);

ev(0);

cout<<"英语\n";

cout<<"最高分:"<<hi(1)<<" "<<"最低分:"<<lo(1)<<" "<<"平均分:";

av(1);

ev(1);

cout<<"政治\n";

cout<<"最高分:"<<hi(2)<<" "<<"最低分:"<<lo(2)<<" "<<"平均分:";

av(2);

ev(2);

cout<<"程序设计基础\n";

cout<<"最高分:"<<hi(3)<<" "<<"最低分:"<<lo(3)<<" "<<"平均分:";

av(3);

ev(3);

cout<<"物理\n";

cout<<"最高分:"<<hi(4)<<" "<<"最低分:"<<lo(4)<<" "<<"平均分:";

av(4);

ev(4);

}

double list::hi(int i)

{

high[i]=0.00;

student *temp=first;

while(temp!=0)

{if(temp->outgrade(i)>high[i])

high[i]=temp->outgrade(i);

temp=temp->next;

}

return high[i];

}

double list::lo(int i)

{

low[i]=100;

student *temp=first;while(temp!=0)

{if(temp->outgrade(i)<low[i])

low[i]=temp->outgrade(i);

temp=temp->next;

}

return low[i];

}

void list::av(int i)

{

    double aver=0;

    student *temp=first;

    while(temp!=NULL)

    {

        aver+=temp->outgrade(i);

        temp=temp->next;

    }

    cout<<aver/totoal<<endl;

}

void list::ev(int i)

{ int a=0,b=0,c=0,d=0,e=0,f=0;

student *temp=first;while(temp!=0)

{switch((int)temp->outgrade(i)/10)

{

case 10:a++;break;case 9:a++;break;

case 8:b++;break;case 7:c++;break;

case 6:d++;break;case 5:e++;break;

default:f++;

}

temp=temp->next;

}

cout<<"100-90的人数:"<<a<<"  89-80的人数:"<<b<<"  79-70的人数:"<<c

<<"  69-60的人数:"<<d<<"  59-50的人数:"<<e<<"  50以下的人数:"<<f

<<"  及格的人数:"<<(a+b+c+d)<<"  不及格的人数:"<<(e+f)<<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::outsum(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(10)<<"平均成绩"<<"\n";

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

                <<temp->outsex()<<setw(8)<<temp->outsum()<<setw(10)<<temp->outav();

            return;

        }

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

        return;

}

void list::outsum1(char *n)

{

    double sum=0;

    int i=0;

    double av=0;

    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(10)<<"平均成绩"<<"\n";

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

                <<temp->outsex()<<setw(8)<<temp->outsum()<<setw(10)<<temp->outav();

            return;

        }

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

        return;

}

void list::scanall()

{

    student *temp;

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

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

        <<temp->outsex()<<setw(6)<<temp->outgrade(0)<<setw(6)<<temp->outgrade(1)

        <<setw(6)<<temp->outgrade(2)<<setw(14)<<temp->outgrade(3)<<setw(6)

        <<temp->outgrade(4)<<setw(8)<<temp->outsum()<<setw(10)<<temp->outav()<<endl;

}

void 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];//临时变量

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

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

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

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

do{

cout<<"//----------------------------------------------------------\\\n"

<<" 0、 退出系统。\n"

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

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

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

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

<<" 5、 成绩的统计分析:包括总人数、最高成绩、最低成绩、平均成绩、\n"

<<"     各个分数段的人数(100-90、89-80、79-70、69-60、59-50、50以下)、及格率。\n"

<<" 6、 总成绩和平均成绩的查询:可以根据学号或姓名查询。\n"

<<" 7、 浏览所有学生信息。\n"

<<" 8、 将所有学生信息保存成文件。\n"

<<" 9、 打开指定的数据文件。\n"

<<" 10、 按总成绩排序输出学生信息。\n"

<<" 11、 按学号顺序输出学生信息,并可保存成文件。\n"

<<"//----------------------------------------------------------\\\n";

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<<"\n";break;

    case 2:

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

        cin>>name;

        will.outstu(name);

        cout<<"\n";break;}break;

case 3:

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

        cin>>n;

        switch(n){

        case 1:

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

            cin>>id;

            will.outstu1(id);

            cout<<"\n";

            cout<<setw(6)<<"1.数学"<<

                setw(6)<<"2.英语"<<setw(6)<<"3.政治  "<<

                setw(14)<<"4.程序设计基础"<<setw(6)<<"5.物理"<<endl;

            cout<<"请输入要修改的课程编号:";

            cin>>j;

            will.search1(id,j);break;

        case 2:

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

            cin>>name;

            will.outstu(name);

            cout<<"\n";

            cout<<setw(6)<<"1.数学"<<

                setw(6)<<"2.英语"<<setw(6)<<"3.政治  "<<

                setw(14)<<"4.程序设计基础"<<setw(6)<<"5.物理"<<endl;

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

            cin>>j;

            will.search(name,j);break;}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:

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

    cin>>n;

    switch(n){

    case 1:

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

        cin>>id;

        will.outsum1(id);break;

    case 2:

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

        cin>>name;

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

case 7:

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

                setw(6)<<"英语"<<setw(6)<<"政治"<<

                setw(14)<<"程序设计基础"<<setw(6)<<"物理"<<setw(8)<<"总成绩"<<

                setw(10)<<"平均成绩"<<"\n";

            will.scanall();

            break;

case 8:

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

        cin>>file;

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

        cin>>classname;

        output.open(file);

        p = will.first;

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

            setw(6)<<"英语"<<setw(6)<<"政治"<<

            setw(14)<<"程序设计基础"<<setw(6)<<"物理"<<setw(8)<<"总成绩"<<

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

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

            output<<setw(8)<<p->outid()<<setw(8)<<p->outname()<<setw(6)

            <<p->outsex()<<setw(6)<<p->outgrade(0)<<setw(6)<<p->outgrade(1)

            <<setw(6)<<p->outgrade(2)<<setw(14)<<p->outgrade(3)<<setw(6)

        <<p->outgrade(4)<<setw(8)<<p->outsum()<<setw(10)<<p->outav()<<endl;

        output.close();

        break;

case 9:

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

        cin>>file;

        input.open(file);

        if (input.fail())

        {

            cout<<"File does not exist"<<endl;

            break;

        }

        input.getline(temp,80);

        input.getline(temp,80);

        if(input.eof()) {cout<<"文件中无数据!"<<endl;break;}

        input>>id>>name>>sex1>>grade1[0]>>grade1[1]>>grade1[2]>>

            grade1[3]>>grade1[4];

        input>>temp;

        input>>temp;//将总成绩和平均成绩输入进临时变量

        p1->setid(id);

        p1->setname(name);

        p1->setsex(sex1);

        p1->setgrade(grade1);

        will.first=p1;

        will.last=will.first;

        while(!input.eof())

        {

        p=new student();

        q=will.last;

        will.last->next=p;

        will.last=p;

        input>>id>>name>>sex1>>grade1[0]>>grade1[1]>>grade1[2]>>

            grade1[3]>>grade1[4];

        will.last->setid(id);

        will.last->setname(name);

        will.last->setsex(sex1);

        will.last->setgrade(grade1);

        input>>temp;

        input>>temp;//将总成绩和平均成绩输入进临时变量

        }

        will.last=q;

        will.last->next=NULL;

        input.close();break;

case 10:

    p=will.first;

    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];

        }

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

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

    }

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

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

        {

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

            {

                stutemp=stu[j];

                stu[j]=stu[n];

                stu[n]=stutemp;

            }

        }

        cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(8)<<"总成绩"<<

                setw(10)<<"平均成绩"<<"\n";

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

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

                <<stu[j].sex<<setw(8)<<stu[j].sumsum<<setw(10)<<stu[j].average<<endl;break;

case 11:

        p=will.first;

    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];

        }

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

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

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

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

    }

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

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

        {

            if (stu[n].id>stu[j].id)

            {

                stutemp=stu[j];

                stu[j]=stu[n];

                stu[n]=stutemp;

            }

        }

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

                <<setw(6)<<"英语"<<setw(6)<<"政治"<<setw(14)<<"程序设计基础"<<setw(6)

                <<"物理"<<setw(8)<<"总成绩"<<setw(10)<<"平均成绩"<<endl;

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

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

            <<stu[j].grade[0]<<setw(6)<<stu[j].grade[1]<<setw(6)<<stu[j].grade[2]<<setw(14)

            <<stu[j].grade[3]<<setw(6)<<stu[j].grade[4]<<setw(8)<<stu[j].sumsum<<setw(10)

            <<stu[j].average<<endl;

        cout<<"\n 输入1.将上述信息保存成文件;      输入0:返回"<<endl;

        cin>>m;

        if (m==1)

        {

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

            cin>>file;

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

            cin>>classname;

            output.open(file);

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

                setw(6)<<"英语"<<setw(6)<<"政治"<<

                setw(14)<<"程序设计基础"<<setw(6)<<"物理"<<setw(8)<<"总成绩"<<

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

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

            output<<setw(8)<<stu[j].id<<setw(8)<<stu[j].name<<setw(6)<<stu[j].sex<<setw(6)

            <<stu[j].grade[0]<<setw(6)<<stu[j].grade[1]<<setw(6)<<stu[j].grade[2]<<setw(14)

            <<stu[j].grade[3]<<setw(6)<<stu[j].grade[4]<<setw(8)<<stu[j].sumsum<<setw(10)

            <<stu[j].average<<endl;

            output.close();

        }break;

}

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

cin>>m;

}while(m==1);

}

相关推荐