
学生成绩管理系统
学生姓名:
学 号:
班 级:
指导教师:
日 期:2011年12月18日
1.设计目标
设计一个简单的学生成绩管理系统,系统要解决成绩录入、计算学分和平均分成绩排名和成绩查询等几个方面。
主要功能分为四部分:
1提供成绩录入界面。
2统计每个学生的总分和平均分。
3按总分由大刀小排出名次。
4提供成绩查询功能,即任意输入一个学号,能够查询出该学生在班级中的排名及其考试成绩。
2.总体设计
根据需求分析的结果,本系统至少要分为以下几个模块:main函数、成绩录入模块、成绩统计模块、成绩排名模块和成绩查询模块。其中各模块的功能说明如下:
●Main函数模块的主要功能为提供程序入口、前期环境设置、调用主要的执行函数和程序结束前的数据处理。
●成绩录入模块的主要功能为提供简单的成绩录入界面,将输入的成绩存储在对应的数据结构中。
●成绩统计模块的主要功能为统计每个学生的总分和平均分并输出。
●成绩排名模块的主要功能为按总分由大到小排出名次并输出。
●成绩查询模块的主要功能为根据用户输入一个学号,能够查找该学生在班级中的排名及其考试成绩。
根据上述描述,给出该系统的总体设计图,如下图所示:
3.详细设计
由于该系统涉及多个学生的成绩存储,因此,定义一个数据结构,用于存储这些信息。现仅对学生语文成绩、数学成绩、英语成绩进行统计管理。
建立以下数据结构:
class Student
{
public:
char number[Max]; //存储学生学号
char name[Max]; //存储学生姓名
double chinese; //存储语文成绩
double math; //存储数学成绩
double english; //存储英语成绩
double total; //总成绩
double average; //平均成绩
int rank; //排名
};
I、成绩录入模块
成绩录入就是对前面定义的类Student中的成员进行赋值。其中,用户需要输入的是学生的学号、姓名两个基本信息和语文、数学和英语三门成绩,其余总成绩、平均成绩和排名由后续的计算函数来实现。实现成绩录入模块的函数代码如下:
void setData(Student &s) //成绩录入模块
{
cout<<"输入学号,姓名,语文,数学,英语成绩:"; //录入数据
cin>>s.number>>s.name>>s.chinese>>s.math>>s.english;
s.total=0; //初始化
s.average=0;
s.rank=0;
}
该函数运行时其结果如下图所示:
输入学生信息的个数可在主函数用修改相应数值。
II、成绩统计模块
成绩统计模块需要建立在成绩录入模块的基础之上,当系统中已经包含一些数据记录后才能对这些成绩求总分、平均分等操作。本模块包含对输入的数据计算总分和计算平均分,其中,cout()函数用于计算一个同学的总分和平均分,而getAverage()函数则求出整个班级所有的三门课程的平均成绩,其函数代码如下:
void count(Student &s) //成绩统计
{
s.total=s.chinese+s.math+s.english; //求三门课程的总分
s.average=s.total/3; //求三门课程的平均分
}
double getAverage(Student S[],int N) //求平均分函数
{
double Average=0; //变量定义并初始化
    for(int i=0;i //求所有学生的所有成绩和     Average/=(N*3);                           //求所有学生的成绩平均值     return Average;                            //返回该平均值 } 其中,计算整个班级所有的三门课程的成绩getAverage()函数的实现流程图如下:                是                                                                  否 注意:该统计模块中,需要统计一个班级同学的总分和平均分,就需要确定班上同学的人数,这个人数就放在常量N中。 III、成绩排名模块 在获得整个班级的总分和平均分之后,就可以对该班级中的同学按照某个参数进行排名了。在该系统中,使用每位同学的平均成绩对其进行排名,此处使用插入排序来实现。 插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止,其算法流程图如下:   否                             是                                                      是                                 否      根据上述的算法流程图,则乘机排名模块的实现代码如下: void sort(Student S[],int N)                   //插入法排序 (成绩排名) {      int index;                                     //定义变量     Student inserter;                               //创建对象     for(int i=1;i         inserter=S[i];                             //对象初始化         index=i-1;                               //变量初始化         while(index>=0&&inserter.average>S[index].average)     //比较         {              S[index+1]=S[index];                  //元素后移             index--;          }          S[index+1]=inserter;                       //插入该元素      }      for(int j=0;j } IV、成绩查询模块 该系统中的成绩查询工嫩嫩个是根据用户输入的学生的学号作为关键字,在数据结构中进行查询,并将查询结果即该记录的位置返回,其实现代码如下: int search(Student S[],int N,char *n)                 //成绩查询模块 {      for(int i=0;i         if(strcmp(S[i].number,n)==0)              //找到             return i;                           //返回结果所在的位置     }      return -1;                                 //没有找到 } 上述代码,第一行代码函数的生命中,参数字符串n即为用户输入的需要查询的学生学号,将该学号与所有数据元素进行比较,找到则返回该元素的位置,否则返回-1。该函数执行的流程图如下图:                                                           是                             否             是                             否                                  警告:在上述第五行代码中,使用了字符串比较函数strcmp()来实现两个学号的比较,因此在预处理中必须加上 V、输出模块 事实上,如果对该系统内的成绩做了排序、统计和查询等功能后,都需要将结果输出。下面给出输出学生信息的函数print(),代码如下: void print(Student &s)                               //输出结果 {      cout<<"排名"<<"\"<<"学号"<<"\"<<"姓名"<<"\"<<"语文:"<<"\"                                                   //定义输出格式         <<"数学:"<<"\"<<"英语:"<<"\"<<"总分"<<"\"<<"平均分"<         < 提示:该函数中,输出了学生成绩管理系统中所有的成员值。在主函数main()中调用成绩查询、统计等函数后都需要调用该函数,以输出结果到屏幕上。 4.调试与测试 1调试方法 首先,对学生成绩管理系统进行系统实现,利用C++ 然后,在C++继承开发环境中利用Win32控制台程序,将所有模块代码及主函数代码输入 最后,按照提示进行系统调试。 ②测试结果 测试结果正确,运行如下图所示: 分别对3个模块测试 首先输入3组同学数据信息 1)打印所有排名 2)打印出成绩在全班平均分以上的学生名单和数据信息 3)任意输入一个学号,查找出该学生在班级中的排名及其考试成绩 5.分析及结论 系统实现功能:     该系统实现对学生成绩管理功能,主要包括成绩录入、计算总分和平均分、成绩排名和成绩查询。    系统设计中的难点:     在程序开发阶段,main函数定义、输出模块及数据结构方面存在一定难点,而后参考部分文献决绝该问题。   系统不足之处: 为系统实现简单,并没有对班级进行分类,而且仅仅以三门学科进行数据统计。 6.参考文献 [1]《C++程序设计》(谭浩强编著) [2]《C++程序设计(第2版)》(周志德等编著) [3]《C语言程序设计》(普措才仁) 7.附录 源程序清单 #include "stdafx.h" #include #include using namespace std;  const int Max=5;                                 //字符串最大长度  class Student;//类声明  void setData(Student &s);                         //设置对象s的数据  void count(Student &s);                          //计算对象s的总分,平均分  void sort(Student S[],int N); //把长度为N的对象数组S,按平均分排序  double getAverage(Student S[],int N); //计算全班的平均分  void print(Student &s);                          //打印信息  int search(Student S[],int N,char *n); //从长度为M的对象数组中,查找学号n的位置  class Student  { public:     char number[Max];                         //学号     char name[Max];                            //姓名     double chinese;                           //语文成绩     double math;                             //数学成绩     double english;                           //英语成绩     double total;                               //总分     double average;                           //平均分     int rank;                                //只有比较才不为了0  };  void setData(Student &s) //成绩录入模块 {      cout<<"输入学号,姓名,语文,数学,英语成绩:";//录入数据      cin>>s.number>>s.name>>s.chinese>>s.math>>s.english;      s.total=0;//初始化      s.average=0;      s.rank=0;  }  void count(Student &s)                              //成绩统计 {      s.total=s.chinese+s.math+s.english;                //求三门课程的总分     s.average=s.total/3;                             //求三门课程的平均分 } void sort(Student S[],int N)                         //插入法排序 (成绩排名) {      int index;                                     //定义变量     Student inserter;                               //创建对象     for(int i=1;i         inserter=S[i];                             //对象初始化         index=i-1;                               //变量初始化         while(index>=0&&inserter.average>S[index].average)      //比较         {              S[index+1]=S[index];                  //元素后移             index--;          }          S[index+1]=inserter;                       //插入该元素      }      for(int j=0;j } double getAverage(Student S[],int N)                  //求平均分函数 {      double Average=0;                             //变量定义并初始化     for(int i=0;i //求所有学生的所有成绩和     Average/=(N*3);                           //求所有学生的成绩平均值     return Average;                            //返回该平均值 } void print(Student &s)                               //输出结果 {      cout<<"排名"<<"\"<<"学号"<<"\"<<"姓名"<<"\"<<"语文:"<<"\"                                                   //定义输出格式         <<"数学:"<<"\"<<"英语:"<<"\"<<"总分"<<"\"<<"平均分"<         < int search(Student S[],int N,char *n)                 //成绩查询模块 {      for(int i=0;i         if(strcmp(S[i].number,n)==0)              //找到             return i;                           //返回结果所在的位置     }      return -1;                                 //没有找到 } int main() //系统集成 {      const int M=3;      Student S[M];      for(int i=0;i         cout<<"下面输入第"<        setData(S[i]);          count(S[i]);          cout<     sort(S,M);      int order=1;      while(order!=4)      {          cout<<"*****************************命令菜单******************************"<         cin>>order;          switch(order)          {          case 1:              {                  for(int j=0;j             }              break;          case 2:              {                  double compare=getAverage(S,M);                  for(int k=0;k                         print(S[k]);              }              break;          case 3:              {                  char code[Max];                  cout<<"输入您要查找的学号:";                  cin>>code;                  int result=search(S,M,code);                  if(result==-1)                      cout<<"您输入的学号不存在!!!"<                     print(S[result]);              }              break;          case 4:             break;          default:             cout<<"输入的命令不存在!!!"<     }      return 0;  }
