学生成绩管理系统课程设计报告书(C语言)

课程设计报告书

      课程名称:       

      学    院:            

      班    级:          

      学    号:          

      姓    名:               

      指导老师:              

      设计时间           

学生成绩管理课程设计

一、设计题目

     用C语言编写程序完成以下任务:

(1)能按学期、按班级完成对学生成绩的录入、修改

(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的

     平时成绩进行查询  

(3)能查询学生成绩,不及格科目及学生名单

(4)能按班级输出学生的成绩单

   二、设计要求

(1)贯彻结构化的程序设计思想。

(2)用户界面友好,功能明确,操作方便。 

(3)用户界面中的菜单至少应包括“统计各班总分及平均分”、“平均成绩 排

     序”、“成绩单显示”和“退出”4项。

(4)代码应适当缩进,并给出必要的注释,以增强程序的可读性。

三、设计需求分析

 经过对程序设计题目的分析可知,整个程序的设计实现大致分为十个模块,每一个模块对应一个函数。在这些函数当中,按学期对学生信息查询函数、按班级对学生信息查询函数、按平均成绩排序函数、按班级显示学生成绩单函数、统计全部学生总分及平均分函数、按总成绩排序函数、统计成绩不及格学生信息函数、显示全部学生信息并统计人数函数的实现严格按照题目的要求。读取文件函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。

1.显示全部学生信息并统计人数    这里要用到文件打开函数和文件读取数据函数,再加入人数的统计语句,以实现将文件内容显示到窗体并统计总人数。

 2.统计全部学生总分及平均分   这一步在第一项功能的基础上稍加改动,添加求学生总分和平均分的函数就可以实现预期的功能。

 3.按学期对学生信息查询  实现的功能是按照学期对学生的成绩和数据进行查询,要求输入正确学期实现该功能。

   4.按班级对学生信息查询  实现的功能是按照班级对学生的成绩和数据进行查询,要求输入正确班级实现该功能。

   5.按总成绩排序  该项为附加功能实现的是总成绩的递减排序以及名次显示,其中总成绩相同者名次相同。                                                      

   6.按平均成绩排序  按照题目的具体要求实现的是平均成绩的递减排序以及名次显示,其中平均成绩相同者名次相同。

   7.统计成绩不及格学生信息  该项即统计所有学生中各科中至少有一科不及格的学生的所有信息 。

   8.按班级显示学生成绩单   该项即显示所有学生的基本信息及在总体中成绩排序信息。             

   除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序,这使整个程序更加完善。

每一个学生记录都包含学期、班级、学号、姓名,以及英语、计算机两门成绩,在程序当中将学生记录类型定义为结构体类型,函数每次对学生记录的访问,其数据来源都是file.txt文件,这样做保证学生数据的一致性,每次运行程序都可以采用原来的数据。

四、程序流程图

1. 程序总体结构图

                         

图1程序总体结构图

2. 具体功能框图

(1)显示全部学生信息并统计学生人数函数

                   

图2读取学生数据

    (2)按平均分排序函数

                              

图3按平均分排序

五、核心技术的实现说明及相应程序段

本程序主要由十个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其它函数来实现要求的所有功能。在这些函数当中,按学期对学生信息查询、按班级对学生信息查询函数、按平均成绩排序函数、统计成绩不及格学生信息函数等是程序中较为核心的部分,下面分别进行说明。

1. 按学期、班级对学生信息查询函数  首先调用reads函数读取文件中的信息,利用for循环按照班级号循环查找,通过strcmp函数比较所查找学期、班级和已知学期、班级字符,利用if语句对所输入的待查找学期、班级与已知学期、班级字符进行判断,如果所查学期、班级字符不是已知,则显示无此学期、班级信息,在符合条件的情况下则输出该学期学生所有信息。具体的程序段如下:

/*按学期对学生信息查询*/

void xueqi () 

{

    struct student stud[N];

    char number[20];

    int i,n;

    n=reads(stud);

    printf("\n请输入待查询的学生学期号,按回车键确认:\n",number);

    scanf("%s",number);

    printf("***********************所查学生信息如下************************\n");

    printf("学期    班级    学号    姓名    计算机   英语   总分   平均分  \n");

    printf("***************************************************************\n");

    for(i=0;i

    {

        if(strcmp(number,stud[i].xq)!=0) continue;

        if(i>=n)

        {   printf("没有找到该学期信息!\n");

            return;

        }

        else     printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);

    }

} }}

/*按班级对学生信息查询*/

void query() 

{

    struct student stud[N];

    char number[20];

    int i,n;

    n=reads(stud);

    printf("\n请输入待查询的学生班级号,按回车键确认:\n",number);

    scanf("%s",number);

    printf("***************************所查学生信息如下**********************\n");

    printf("班级    学期   学号    姓名   计算机    英语    总分    平均分   \n");

    printf("*****************************************************************\n");

    for(i=0;i

    {

        if(strcmp(number,stud[i].cla)!=0) continue;

        if(i>=n)

        {   printf("没有找到该班级信息!\n"); return;}

        else

 printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].cla,stud[i].xq,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);

    }

}

2. 按平均成绩排序函数

该函数的核心内容是求平均成绩并对所有人进行排序。采用冒泡法对平均分进行排序,并记录对于总分的排序采用的排序算法是冒泡法排序,其中平均分的求得是在排序的过程中实现的,这部分程序仍然调用了reads函数,整个排序过程在结构体数组stud中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。对于学生排序后名次的确定在结果输出时予以显示。具体程序段如下:

/*按平均成绩排序*/

void sort2() 

{

   struct student stud[N],temp;

    int i,j,n;

    n=reads(stud);

    for(i=0;i

      for(j=0;j

      {

          if((stud[j].english+stud[j].computer)/2<(stud[j+1].english+stud[j+1].computer)/2)

          {

              temp=stud[j]; stud[j]=stud[j+1]; stud[j+1]=temp;

          }

      }

       j=1;

      printf("***********************平均成绩排序结果如下*************************\n\n");

      printf("名次   学期     班级    学号    姓名    英语    计算机  平均成绩    \n");

       printf("***************************************************************************\n");

      for(i=0;i

      { 

          if(stud[i].english+stud[i].computer==stud[i+1].english+stud[i+1].computer)

           printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,(stud[i].computer+stud[i].english)/2);

           else

           printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j++,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,(stud[i].computer+stud[i].english)/2);

      }

       getch();}

3. 统计成绩不及格学生信息

该函数首先读取文件中的内容,通过循环将挑选出至少一科成绩不及格的学生的信息。具体的程序段如下:

  /*统计成绩不及格学生信息*/

void bujige()  

{

    struct student stud[N];

    int i,n;

    n=reads(stud);

    printf("***************成绩不及格学生信息如下************\n\n");

    printf("学期     班级   学号     姓名   计算机   英语    \n");

    printf("**************************************************\n");

    for(i=0;i

      if((stud[i].computer<60)||(stud[i].english<60))

      printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english);

}

六、测试情况

七、课程设计总结

    不觉之中C语言课程设计很快结束了,通过这一段时间的设计使我学到了许多,以前对C语言的认识比较肤浅,不过在不断尝试中我知道能利用C语言解决比较复杂的问题,也对许多函数有了很深的认识。通过我的努力以及遇到不会的问题主动向老师请教和向同学们探讨,我顺利的完成了这次语言课程设计,感到要想对一门课程了解深刻就必须亲自身入其中的去体验,这样才能发现自己的很多缺点,才能一一的去克服,也才能真正的学到知识,也明白了那句“纸上谈来终觉浅,深知此是要躬行”的真正意义。纵然把结论书本背得滚瓜烂熟而不运用与实际,也不过是纸上谈兵罢了,终究在未来需要动手能力和实践人才的社会竞争中被淘汰,所以我们需要实际的操作,需要更多的实践训练,这样才能成为真正的二十一世纪合格的大学生!

八、源程序代码

#include

#include

#include

#include

#define N 25

struct student

{

 char cla[10];

 char xq[10];

 char num[20];

 char name[10];

 float  computer;

 float  english;

 float  sum,aver;

}

stud[N];

void menu();

void sort();

void printll();

int reads(struct student stu[N]);

void sort1() ;

void sort2();

void xueqi();

void query();

void bujige();

void cjdan();

void main()

{

    int c;

    while(1)

    {

        menu();

        printf("\n 请输入您要选择的操作序号,按回车键确认:");

        scanf("%d",&c);

        if(c>8||c<1)

        printf("------对不起,没 有 此 项 功 能 -----!\n");

        switch(c)

        {

           case 1:printll();break;

           case 2:sort();break;

           case 3:xueqi();break;

           case 4:query();break;

           case 5:sort1();break;

           case 6:sort2();break;

           case 7:bujige();break;

           case 8:cjdan();break;

           case 9:exit(0);

        }

    }

}

void menu()

{

    printf("*******************************************************\n");

    printf("*******************************************************\n");

    printf("      ※ ☆  欢 迎  光 临   ☆ ※          \n");

    printf("                                         \n");

    printf("      ★★ 成 绩 统 计 系 统 ★★        \n");

    printf("                                      \n");

    printf("        ★1.显示全部学生信息并统计人数              \n");

    printf("                                      \n");

    printf("        ★2.统计全部学生总分及平均分                \n");

    printf("                                \n");

    printf("        ★3.按学期对学生信息查询                    \n");

    printf("                                \n");

    printf("         ★4.按班级对学生信息查询                    \n");

    printf("                               \n");

    printf("         ★5.按总成绩排序                            \n");

    printf("                                \n");

    printf("         ★6.按平均成绩排序                          \n");

    printf("                                \n");

    printf("         ★7.统计成绩不及格学生信息                    \n");

    printf("                                 \n");

    printf("         ★8.按班级显示学生成绩单                    \n");

    printf("                                 \n");

    printf("         ★9.退出                                    \n");

    printf("                                 \n");

    printf("*******************************************************\n");

    printf("*******************************************************\n");

}

int  reads(struct student stud[N]) // 读取文件中的内容

{

    FILE *fp;

    int i=0;

    if((fp=fopen("e:\\file04.txt","r"))==NULL)

    {

        printf("文件打开失败!\n");

        return 0;

    }

    else

    {

        for(i=0;!feof(fp);i++)

    fscanf(fp,"%s\t%s\t%s\t%s\t%f\t%f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,&stud[i].computer,&stud[i].english); }

    fclose(fp);

    return i;

}

void printll()   /*读取D盘文件并打印全部,统计总人数*/

{

    FILE *fp;

    int number=0,i,n=20;

    if((fp=fopen("E:\\file04.txt","r"))==NULL)

    {

        printf("无 法 打 开 文 件\n");

    }

    printf("*********************所有的学生信息如下*********************\n");

    printf("学期    班级    学号     姓名    计算机          英语       \n");

    printf("************************************************************\n");

    for(i=0;i

   {

       fscanf(fp,"%s\t%s\t%s\t%s\t%f\t%f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,&stud[i].computer,&stud[i].english);

       printf("%s\t%s\t%s\t%s\t%f\t%f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english);

       number++;               

       if(feof(fp))           

       break;

   }

   printf("学生总人数为 :%d\n",number);

   fclose(fp);            

}

void sort()           /*统计全部学生总分及平均分*/

{  

    struct student stud[N];

    int i,n;

    n=reads(stud);

    printf("***************************全部学生信息如下***************\n");

    printf("班级    学号    姓名   计算机    英语   总分   平均分     \n");

    printf("**********************************************************\n");

    printf("**********************************************************\n");

    for(i=0;i

    {

        stud[i].sum=stud[i].computer+stud[i].english;

        stud[i].aver=(stud[i].computer+stud[i].english)/2;

        printf("%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].sum,stud[i].aver);

    }

        getch();

}

void xueqi ()  /*按学期对学生信息查询*/

{

    struct student stud[N];

    char number[20];

    int i,n;

    n=reads(stud);

    printf("\n请输入待查询的学生学期号,按回车键确认:\n",number);

    scanf("%s",number);

    printf("***********************所查学生信息如下************************\n");

    printf("学期    班级    学号    姓名    计算机   英语   总分   平均分  \n");

    printf("***************************************************************\n");

    for(i=0;i

    {

        if(strcmp(number,stud[i].xq)!=0) continue;

        if(i>=n)

        {   printf("没有找到该学期信息!\n");

            return;

        }

        else

        printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);

    }

}

void query()  /*按班级对学生信息查询*/

{

    struct student stud[N];

    char number[20];

    int i,n;

    n=reads(stud);

    printf("\n请输入待查询的学生班级号,按回车键确认:\n",number);

    scanf("%s",number);

    printf("***************************所查学生信息如下**********************\n");

    printf("班级    学期   学号    姓名   计算机    英语    总分    平均分   \n");

    printf("*****************************************************************\n");

    for(i=0;i

    {

        if(strcmp(number,stud[i].cla)!=0) continue;

        if(i>=n)

        {   printf("没有找到该班级信息!\n"); return;}

        else

        printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].cla,stud[i].xq,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);

    }

}

void sort1()  /*按总成绩排序*/

{

    struct student stud[N],temp;

    int i,j,n;

    n=reads(stud);

    for(i=0;i

       for(j=0;j

       {

          if(stud[j].english+stud[j].computer

          {  temp=stud[j]; stud[j]=stud[j+1]; stud[j+1]=temp; } }

          j=1;

          printf("*************************总成绩排序结果如下**************************\n\n");

          printf("名次   学期     班级    学号     姓名   英语    计算机   总成绩      \n");

          printf("*********************************************************************\n");

          for(i=0;i

          { 

              if(stud[i].english+stud[i].computer==stud[i+1].english+stud[i+1].computer)

              printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english);

              else

              printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j++,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english);

          }

          getch();

}

void sort2()  /*按平均成绩排序*/

{

    struct student stud[N],temp;

    int i,j,n;

    n=reads(stud);

    for(i=0;i

       for(j=0;j

       {

           if((stud[j].english+stud[j].computer)/2<(stud[j+1].english+stud[j+1].computer)/2)

           {

               temp=stud[j]; stud[j]=stud[j+1]; stud[j+1]=temp;

           }

       }

       j=1;

       printf("***********************平均成绩排序结果如下*************************\n\n");

       printf("名次   学期     班级    学号    姓名    英语    计算机  平均成绩    \n");

       printf("***************************************************************************\n");

       for(i=0;i

       { 

           if(stud[i].english+stud[i].computer==stud[i+1].english+stud[i+1].computer)

           printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,(stud[i].computer+stud[i].english)/2);

           else

           printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j++,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,(stud[i].computer+stud[i].english)/2);

       }

       getch();

}

void bujige()     /*统计成绩不及格学生信息*/

{

    struct student stud[N];

    int i,n;

    n=reads(stud);

    printf("***************成绩不及格学生信息如下************\n\n");

    printf("学期     班级   学号     姓名   计算机   英语    \n");

    printf("**************************************************\n");

    for(i=0;i

      if((stud[i].computer<60)||(stud[i].english<60))

      printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english);

}

void cjdan() /*按班级显示学生成绩单*/

{

    struct student stud[N];

    char number[20];

    int i,n,j=1;

    n=reads(stud);

    printf("\n请输入待查询的学生班级号,按回车键确认:\n",number);

    scanf("%s",number);

    printf("*********************所查班级信息如下*******************\n");

    printf(" 名次   班级    学号    姓名    计算机   英语    总分   \n");

    printf("********************************************************\n");

    for(i=0;i

    {  

        if(strcmp(number,stud[i].cla)!=0) continue;

        if(i>=n)

        {  

            printf("没有找到该班级信息!\n");

            return;

        }

        else

       {

            if(stud[i].english+stud[i].computer==stud[i+1].english+stud[i+1].computer)

            printf("%d\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english);

            else

            printf("%d\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j++,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english);

        }

}

    getch();

}

file.txt文件内容

2009  信工1班  101  杜*宁  92  79

2010  信工2班  102  段*    91  80

2009  信工1班  103  冯*红    61  75

2008  信工3班  104  郝*苇    62  78

2009  信工1班  105  胡*龙    63  65

2009  信工1班  106  金*鹏  12  53

2010  信工1班  107  李*芳    87  70

2008  信工2班  108  刘*阳  86  75

2010  信工1班  109  刘*玫  88  68

2009  信工3班  110  卢*明    30  65

2008  信工2班  111  马*涛  86   61

2009  信工2班  112  孙*林    92  80

2010  信工3班  113  田*莉  88  72

2009  信工3班  114  王*华  73  60

2008  信工3班  115  王*伟    36  60

2009  信工2班  116  王*萌  84  79

2009  信工3班  117  杨*青  31  50

2010  信工2班  118  殷*泳    84  75

2010  信工2班  119  英*平    42  61

2008  信工1班  120  张*华  98  62

       

相关推荐