学生成绩管理系统程序设计报告

南邮新校标-独立

程序设计报告

( 201  / 201  学年 第     学期)

题   目:   学生成绩管理系统       

               软件工程(NIIT  

              杨金霖          

             B12041015       

              成小惠         

           计算机软件学院    

                 2013.3.26        

学生成绩管理系统

一、   课题内容和要求

设计一个简化的学生成绩管理系统,并用C或C#语言实现。对该系统的要求如下:

  1. 该系统应实现以下功能

   (1)按班级按课程从文件中读入相应的平时成绩、期中考试成绩和期末考试成绩。

   (2)三个成绩对总评成绩的百分比被定义为常数,各占总成绩的30%、30%和40%。

   (3)计算每位学生的总评成绩。

   (4)算该班级本课程的总平均成绩。

(5)算处于优、良、中、及格、不及格的学生人数以及占总人数的百分比。其中100-90为优,89-80为良,79-70为中,69-60为及格,60分以下为不及格。

   (6)按要求输出成绩在优、良、中、及格、不及格各区间的学生学号。

   2. 系统应有以下菜单:

      0.退出

      1.计算每位学生的总评成绩

      2.计算班级本课程总评成绩

      3.统计优、良、中、及格、不及格的学生人数以及所占比例

      4.查询成绩在优、良、中、及格、不及格各区间的学生学号

允许用户不断从这个菜单选择任一功能执行, 直到选择退出, 才退出整个系统。

二、需求分析

1.系统要从文件中读入相应的平时成绩、期中成绩和期末考试成绩。这里就用到了C++中的输入输出文件的操作。在C++语言中进行文件操作的一般步骤为:

(1)为要进行操作的文件定义一个流。

(2)建立(或打开)文件。

(3)进行读/写操作。

(4)关闭文件

另外从文件中读入的数据要在后面进行计算,所以应该把文件中的数据对应到类或者结构体数组上去。(在这个程序中用的是结构体数组)

2.系统还要有计算的功能,这里的计算包括总评成绩的计算和平均值的计算。因为要计算多个学生的成绩,所以利用循环语句来进行逐个学生成绩的计算并输出。(在这个程序中都是用的for循环)

3.统计功能。需要运用到条件语句,既满足条件就加1,以此来完成计数统计。

4.查询功能。同样是运用条件语句,判断符合条件就对屏幕输出,达到用户查询的目的。

5.菜单功能。用简单的菜单函数完成整体的框架,用到switch语句来完成菜单函数的循环。

三、概要设计 

 


1.首先用struct student定义一个结构数组,里面应该包含学号Id、平时成绩ps、期中成绩qz、期末成绩qm、总评成绩all、等级grade。

2.定义函数

      (1)读入文件(fs.open),对应到结构体数组中,利用for循环计算总评成绩并用判断语句来判断等级。

      (2)调用file函数,把计算的结果输出屏幕,并且按照要求保存到out文件中(ofstream fout(“out.dat”);)。

      (3)调用file函数,计算平均成绩来得到课程的总评成绩。

      (4)调用file函数,if判断语句来统计人数并计算比例,然后输出屏幕。

      (5)if判断语句,把符合用户输入等级的学生的学号输出到屏幕。

四、详细设计 

#include<iostream.h>         /*输入输出的头文件*/

#include<fstream.h>           /*对文件的操作*/

#include<string.h>           /*定义字符串变量*/

#include<stdlib.h>

struct student               /*定义一个结构数组*/

{

public:

       char  Id[10];

       float ps;

       float qz;

       float qm;

       float all;

       char grade;

}stu[20];

fstream fs;

int num;

char str5[100]="学生学号";

char str6[100]="总评成绩";

char str7[100]="成绩等级";

void file()             /*定义一个函数,方便后面的调用*/

{  

    fs.open("note.dat",ios::in|ios::out);    /*对文件读入的操作,文件以输入输出方式打开*/

      

              fs>>num;

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

              {

                      fs>>stu[i].Id>>stu[i].ps>>stu[i].qz>>stu[i].qm; /*把文件中得数值对应到结构数组中*/

              }

              for(i=0;i<num;i++)        /*完成对总评成绩的计算*/

              {

               stu[i].all=stu[i].ps*0.3+stu[i].qz*0.3+stu[i].qm*0.4;

            if((stu[i].all<=100)&&(stu[i].all>=90))

                      stu[i].grade='A';

               if((stu[i].all<90)&&(stu[i].all>=80))

                      stu[i].grade='B';

               if((stu[i].all<80)&&(stu[i].all>=70))

                      stu[i].grade='C';

               if((stu[i].all<70)&&(stu[i].all>=60))

                      stu[i].grade='D';

               if((stu[i].all<60)&&(stu[i].all>=0))

                      stu[i].grade='E';

              }

}

void  readall()            /*对选项1的实现,后面调用*/

{    file();

     int i;          

        ofstream fout("out.dat");          /*输出保存到out文件中*/

        if(!fout)           /*如果文件打开失败*/

        {

               cout<<"Cannot open the file!"<<endl;

        }   

        fout<<str5<<"\t"<<str6<<"\t"<<str7<<endl;    /*把表头文字存入文件*/

        cout<<str5<<"\t"<<str6<<"\t"<<str7<<endl;    /*把表头文字输出屏幕*/

        for(i=0;i<num;i++)         /*for循环逐次输出学生的成绩*/

        {

               fout<<stu[i].Id<<"\t"<<stu[i].all<<"\t"<<stu[i].grade<<endl;

               cout<<stu[i].Id<<"\t"<<stu[i].all<<"\t\t"<<stu[i].grade<<endl;

        }

}

              

void readaverage()       /*对选项2的实现,后面调用*/

{

        cout<<"本课程的总评成绩:";

     file();

        int i;

        float a[20],p;

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

        {

               a[i]=stu[i].all;

        }

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

        {

               a[i]=a[i]+a[i-1];

        }

        p=a[num-1]/num;

        cout<<p<<endl<<endl;

}

void readgrade()                 /*对选项3的实现,后面调用*/

{   int i;

    int j=0;

       int k=0;

       int x=0;

       int y=0;

       int z=0;  

       file();

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

        {

               if(stu[i].grade==65)

                      j++;

               if(stu[i].grade==66)

                      k++;

               if(stu[i].grade==67)

                      x++;

               if(stu[i].grade==68)

                      y++;

               if(stu[i].grade==69)

                      z++;

        }

        cout<<"成绩为优的学生人数:";

        cout<<j<<endl;

         cout<<"成绩为良的学生人数:";

        cout<<k<<endl;

        cout<<"成绩为中等的学生人数:";

        cout<<x<<endl;

        cout<<"成绩为及格的学生人数:";

        cout<<y<<endl;

        cout<<"成绩为不及格的学生人数:";

        cout<<z<<endl;

        float n;

        cout<<"成绩为优的学生百分比:";

        n=float(j)/num;

        cout<<n<<endl;

        cout<<"成绩为良的学生百分比:";

        n=float(k)/num;

        cout<<n<<endl;

        cout<<"成绩为中等的学生百分比:";

        n=float(x)/num;

        cout<<n<<endl;

        cout<<"成绩为及格的学生百分比:";

        n=float(y)/num;

        cout<<n<<endl;

        cout<<"成绩为不及格的学生百分比:";

        n=float(z)/num;

        cout<<n<<endl<<endl;

}

void readABCDE()               /*对选项4的实现,后面调用*/

{    char m[10];

     cout<<"请输入你需要查询学生的成绩等级:";

        cin>>m;

        if((m[0]!=65)&&(m[0]!=66)&&(m[0]!=67)&&(m[0]!=68)&&(m[0]!=69))

               cout<<"Input error!!!!"<<endl<<endl;

        if(m[0]==65)

        {   cout<<str5<<endl;

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

               {   if(stu[i].grade=='A')

                      cout<<stu[i].Id<<endl;

               }

        }

    if(m[0]==66)

       {    cout<<str5<<endl;

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

               {   if(stu[i].grade=='B')

                      cout<<stu[i].Id<<endl;

               }

        }

        if(m[0]==67)

        {    cout<<str5<<endl;

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

               {   if(stu[i].grade=='C')

                      cout<<stu[i].Id<<endl;

               }

        }

          if(m[0]==68)

          {   cout<<str5<<endl;

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

               {   if(stu[i].grade=='D')

                      cout<<stu[i].Id<<endl;

               }

        }

           if(m[0]==69)

              {  cout<<str5<<endl;

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

               {   if(stu[i].grade=='E')

                      cout<<stu[i].Id<<endl;

               }

        }

              cout<<endl;

}

void main()           /*菜单函数,整体框架*/

{   int m=1;

    int n;

       do{

       cout<<"1.计算每位学生的总评成绩"<<endl;

       cout<<"2.计算班级本课程的总评成绩"<<endl;

       cout<<"3.统计优、良、中、及格、不及格的学生人数以及所占比例"<<endl;

       cout<<"4.查询成绩在优、良、中、及格、不及格各区间的学生学号"<<endl;

       cout<<"5.退出"<<endl;

       cout<<"请选择:";

       cin>>n;                   /*实现菜单函数的循环*/

       switch(n){

       case 1:

              readall();

              break;

       case 2:

              readaverage();

              break;

       case 3:

              readgrade();

              break;

       case 4:

              readABCDE();

              break;

       case 5:

              exit(0);

              break;

       default:

              cout<<"Input error!!!!"<<endl<<endl;

       }

       }while(m==1);

}

五、测试数据及其结果分析

   1.note.dat文件中的内容:           

  20                                    

  06030201 88 75.5 66

  06030202 91 79.5 76              

  06030203 85 75 77                 

  06030204 79 82 80.5                     

  06030205 66 70 63                        

  06030206 53 60 52

  06030207 90 90 98

  06030208 86 77 83

  06030209 88 56 69

  06030210 75 59 60

  06030211 68 69 70

  06030212 66 80 89

  06030213 55 59 56

  06030214 70 52 90

  06030215 90 88 97

  06030216 88 52 60

  06030217 60 80 56

  06030218 80 68 77

  06030219 90 80.5 82

  06030220 75.5 88 66

2.out.dat文件中的内容:

学生学号       总评成绩       成绩等级

06030201    75.45   C

06030202       81.55      B

06030203       78.8     C

06030204       80.5     B

06030205       66        D

06030206       54.7     E

06030207       93.2     A

06030208       82.1     B

06030209       70.8     C

06030210       64.2     D

06030211     69.1     D

06030212       79.4     C

06030213       56.6     E

06030214       72.6     C

06030215       92.2     A

06030216       66        D

06030217       64.4     D

06030218       75.2     C

06030219       83.95      B

06030220       75.45      C

运行结果演示:

    1.运行程序后显示菜单:

    2.输入1,并按Enter,得到学生的总评成绩:

3.输入2,并按Enter,得到课程的总评成绩:

4.输入3,并按Enter,统计各等级的人数并计算比例:

                                                                                                           

                                             

     5.输入4,并按Enter,可输入要查询的等级:


     输入A:


 输入B:

 输入C:


 输入D:



 输入E:

六、调试过程中的问题

1.在这个系统中存在的一个难点是如何将note文件中的数据读入到系统中。在这个过程中我刚开始是定义了一组字符串str1,str2,str3,str4,希望能把note文件中的内容对应到字符串中,但是在读取信息的时候出了问题。不能够识别读多少位。后来换了一种思路,定义结构体数组,然后一行一行地来读取note中的内容就能够对应上了。

2.在对文件的操作,即对文件的输入和输出操作中,刚开始是用了文件的路径加文件名,但是打不开文件。后来把文件路径去掉,直接打开文件操作,这样就能读取保存了。

3.在选项4的操作中要用到if判断语句来输出满足条件的学号。开始的时候就是判断m[0]是否等于A(BCDE),但是错误提示A(BCDE)未定义,后来用ASC码值(65.66.67.68.69)来代替A.B.C.D.E就可以了,或者在A.B.C.D.E上加‘’。

七、程序设计总结

这次的课程设计我主要使用只是是C语言中的,虽然是用C++编写的,但是总体思路都是C语言的。通过这个课程设计,我更加牢固的掌握了C语言和C++的知识。并对于以前不熟悉的知识有了更加深刻的了解。同时,在完成此次课程设计的过程中,老师同学给了我很多宝贵的建议,我很感谢他们。虽然有时候编的很痛苦,但带给我很多的收获。C语言已经学了一个学期了,但是还有很多只是不是很理解,这次上机实践操作让我理解了很多东西。对这些知识也有了更深的理解和很好的掌握。没有实践,就不会发现和深刻体会编程的乐趣的。这次实践也培养了我的团队精神,使我懂得了团队的重要性。

相关推荐