【学生成绩管理系统】课程设计

一、设计目的:

高级语言综合设计是学习“高级语言程序设计”课程后进行的一次全面的综合练习。其目的在于加深对高级语言程序设计基础理论和基本知识的理解,进一步了解和应用丰富的C语言函数,锻炼学生分析、解决复杂问题的能力,提高学生编写程序的能力,为开发软件打下坚实的基础。

二、设计要求:

要求学生利用学到的编程知识和编程技巧,学会如何运用前修知识与查阅、收集、归纳相关资料解决具体问题的方法;

按班级建立学生文件,对应增删改功能;建立学生成绩文件(每个学生至少三门课),对应增删改功能;学生成绩可以按学生、按课程求平均;提供必要的查询功能;找出有两门课以上不及格的学生,输出他们的学号和全部成绩,要求用指针函数实现:float *Search(float (*p)[5])

综合运用结构体、指针、数组、文件知识开发应用程序。

三、题目分析:

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

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

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

(3)能查询学生成绩,有两门以上不及格科目的学生名单

(4)输出学生的成绩单

(5)计算不同分段学生的人数

四、设计需求分析

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

1.显示全部学生信息并统计人数    这里要用到文件打开函数和文件读取数据函数,再加入人数的统计语句.

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

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

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

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

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

每一个学生记录都包含学期、班级、学号、姓名,以及数学、语文、英语三门成绩,在程序当中将学生记录类型定义为结构体类型,用函数每次对学生记录的访问。

五、功能模块介绍

  根据要求设计7个函数:Menu()、inputScore()、 Search()、.Insert()、Delete( )、 Count()、Show()。

1. Menu()模块
该模块执行后,给出6个菜单项的内容和输人提示。

1.学生成绩输入

2.学生成绩查询

3.学生成绩插入

4.学生成绩删除

5.学生成绩统计

  1. 退出

2. inputScore()模块
本模块实现的功能是对学生的信息进行录人,每输人一条学生记录,将其写人文件,并询问是否继续录人,根据需求输人若干条记录。

3. Search()模块
本模块实现的功能是查询学生的相关信息,首先输人学生学号,在文件中查找与输人的学号相同的记录,并在屏幕上显示出来。当文件中不存在该学生的信息时,系统将做出相关提示。
4.Insert()模块
本模块实现的功能是要求用户输人某一学生 的相关信息,并将该学生插人文件末尾。

5. Delete( )模块
本模块实现的功能是要求用户输人某- -学生的学号,从文件中查找该学生的信息,如果存在,删除该学生的信息;反之提供相关提示。
6. Count()模块
本模块实现的功能是对学生的信息进行统计,主要实现三方面的功能:按照数学成绩对学生进行分段统计,按照语文成绩对学生进行分段统计,按照英语成绩对学生进行分段统计,按照平均成绩对学生进行分段统计。
7. Show()模块
本模块实现的功能是将文件中的所有信息在屏幕上显示出来。

六、测试情况

附图

、源程序代码

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define maxnub 100





typedef struct stud

    {

int number;

char name[20];

float math;

float chinese;

float english;

float average;

}StudentInfor;









//函数声明

void Menu();//主菜单模块

void inputScore();//输入

void Search();//查找

void Insert();//插入

void Delete();//删除

void Select();

void Find();

void Count();//统计

void Show();//查看










int main()

{

   int  choice;

   while(1)

   {

    Menu();

    scanf("%d",&choice);

    switch(choice)

   {

    case 1:inputScore();Show();break;

    case 2:Search();break;

    case 3:Insert();Show();break;

    case 4:Delete();Show();break;

    case 5:Count();break;

    case 0:return 0;

    default:printf("\n\t输入错误,请重新选择!\n");

       }

   }

   return 0;

}










void Menu()

{

printf("\t学生成绩管理系统\n");

printf("\t*1.学生成绩输入\n");

printf("\t*2学生成绩查询\n" );

printf("\t*3学生成绩插入\n" );

printf("\t*4学生成绩删除 \n" );

printf("\t*5学生成绩统计\n"  );

printf("\t*6学生成绩查找不及格\n");

printf("\t*0.退出\n" );

printf("请输入您要进行的操作:");

}





 void inputScore()//用来控制是否输入

 {

  char ch='y';

  FILE *fp;

  StudentInfor varStu;

  if((fp=fopen("studentScore.dat","wb"))==NULL)

  {

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

  return;

 }

 printf("请输入学生的学号,姓名,数学成绩,语文成绩,英语成绩\n");

 while(ch=='y')

 {

  scanf("%d",&varStu.number);

  getchar();

  scanf("%s",varStu.name);

  scanf("%f%f%f",&varStu.math,&varStu.chinese,&varStu.english);

  varStu.average=(varStu.math+varStu.chinese+varStu.english)/3;

  fwrite(&varStu,sizeof(StudentInfor),1,fp);

  printf("是否需要继续输入?(y/n)");

  getchar();

  scanf("%c",&ch);

  ch=(ch=='Y')?ch+32:ch;

 }

 fclose(fp);

 }







void Search()

{

int number,flag;

FILE *fp;

StudentInfor varStu;

char ch='y';

if((fp=fopen("studentScore.dat","rb"))==NULL)

    {

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

     return;

    }

    while(ch=='y')

    {

     flag=0;

     printf("请输入您要查找的学生符号:");

     scanf("%d",&number);

     getchar();

     rewind(fp);

     while(!feof(fp))

     {

     fread(&varStu,sizeof(StudentInfor),1,fp);

     if(number==varStu.number){

     flag=1;

     printf("%d%s%.2f",varStu.number,varStu.name,varStu.math);

     printf("%.2f%.2f%.2f\n",varStu.chinese,varStu.english,varStu.average);

     }

     }

     if(!flag)

         printf("您要查找的学生信息不存在!\n");

     printf("你是否继续查询?(y/n)");

     scanf("%c",&ch);

     ch=(ch=='Y')?ch+32:ch;

    }

    fclose(fp);

}










void Insert()

{

FILE *fp;

StudentInfor varStu;

printf("请输入学生的学号,姓名,数学成绩,语文成绩,英语成绩\n");

scanf("%d",&varStu.number);

getchar();

scanf("%s",varStu.name);

getchar();

scanf("%f%f%f",&varStu.math,&varStu.chinese,&varStu.english);

varStu.average=(varStu.math+varStu.chinese+varStu.english)/3;

if((fp=fopen("studentScore.dat","ab"))==NULL)

{

printf("文件无法打开!");

return;

}

fwrite(&varStu,sizeof(StudentInfor),1,fp);

fclose(fp);

}











void Delete()

{

StudentInfor varStu;

int number,exists,i;

FILE *fp,*fp1;

exists=0;

if((fp=fopen("studentScore.dat","rb"))==NULL)

      {

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

      return;

    }

  if((fp1=fopen("studentScore1.dat","wb"))==NULL)

     {

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

    return;

      }

printf("请输入要删除的学生号:");

scanf("%d",&number);

//将文件中的未被删除的学生信息存储到文件studentInfor.dat中

fread(&varStu,sizeof(StudentInfor),1,fp1);

while(!number)

{

if(varStu.number!=number)

     fwrite(&varStu,sizeof(StudentInfor),1,fp1);

else

     exists=1;

fread(&varStu,sizeof(varStu),1,fp);

}

fclose(fp);fclose(fp);

//将删除相关学生信息后的其他信息文件copy到文件studentScore.dat中

system("copy studentScore1.dat studentScore.dat");

if(exists)

     printf("学号为%d的学生已删除!\n",number);

else

     printf("您要删除的学生信息不存在!");

}










void Select(float score,int Num[])

{//判断一门课的成绩

   int level;

   level=(int)(score)/10;

   switch(level)

   {

    case 0:

    case 1:

    case 2:

    case 3:

    case 4:

    case 5:Num[0]++;break;

    case 6:Num[1]++;break;

    case 7:Num[2]++;break;

    case 8:Num[3]++;break;

    case 9:

    case 10:Num[4]++;break;

   }

}










void Count()//统计

{

FILE *fp;

int mathNum[5],chineseNum[5],englishNum[5],averageNum[5];//五分制

int i,level;

StudentInfor varStu;

    {

  mathNum[i]=0;

  chineseNum[i]=0;

  averageNum[i]=0;

 }

if((fp=fopen("studentScore.dat","rb"))==NULL)

{

printf("文件无法打开!");

return;

}

while(!feof(fp))

{

fread(&varStu,sizeof(varStu),1,fp);

Select(varStu.math,mathNum) ;

Select(varStu.chinese,chineseNum);

Select(varStu.english,englishNum);

Select(varStu.average,averageNum);

}

   fclose(fp);



printf("\t 60分以下的人数:%d\n",mathNum[0]);

printf("\t 60到70:%d\n",mathNum[1]);

printf("\t 70到80:%d\n",mathNum[2]);

printf("\t 80到90:%d\n",mathNum[3]);

printf("\t 90分以上:%d\n",mathNum[4]);

printf("===============\n");

printf("语文成绩:\n");

printf("\t 60分以下的人数:%d\n",chineseNum[0]);

printf("\t 60到70:%d\n",chineseNum[1]);

printf("\t 70到80:%d\n",chineseNum[2]);

printf("\t 80到90:%d\n",chineseNum[3]);

printf("\t 90分以上:%d\n",chineseNum[4]);

printf("===============\n");

printf("英语成绩:\n");

printf("\t 60分以下的人数:%d\n",englishNum[0]);

printf("\t 60到70:%d\n",englishNum[1]);

printf("\t 70到80:%d\n",englishNum[2]);

printf("\t 80到90:%d\n",englishNum[3]);

printf("\t 90分以上:%d\n",englishNum[4]);

printf("===============\n");

printf("平均成绩:\n");

printf("\t 60分以下的人数:%d\n",averageNum[0]);

printf("\t 60到70:%d\n",averageNum[1]);

printf("\t 70到80:%d\n",averageNum[2]);

printf("\t 80到90:%d\n",averageNum[3]);

printf("\t 90分以上:%d\n",averageNum[4]);

}

   







 void Show()

 {

  FILE *fp;

  StudentInfor varStu;

  if((fp=fopen("studentScore.dat","rb"))==NULL)

  {

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

  return;

 }

 printf("输出学生的所有信息\n");

 printf("学号     姓名     数学     语文    英语   平均分\n");

 fread(&varStu,sizeof(varStu),1,fp);

 while(!feof(fp))

 {

  printf("%6d%8s%7.1f",varStu.number,varStu.name,varStu.math);

  printf("%8.1f%8.2f%8.3f\n",varStu.chinese,varStu.english,varStu.average);

  fread(&varStu,sizeof(varStu),1,fp);

 }

 fclose(fp);

 }

八、课程设计总结及其感悟

通过这次C语言的课程设计,我明白了很多也知道了很多,更收获了很多。在课程设计的过程中出现过困难,三周的课程设计已经结束了。回想学习C语言的过程中,既有快乐又有烦恼,回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到的问题,这毕竟独立做的,难免会遇到各种各样的问题,同时在设计的过程中发现自己的不足之处,对以前所学的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识从新温故。

这次课程设计不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,才能提高自己的实际动手能力和独立思考能力。同时,我也感受到了编程是一项非常烦琐周密的活动,他不但需要一个人周密的思考问题的能力,处理问题的能力,还需要有足够的耐心和严谨治学的作风,来不得半点马虎。

通过本次课程设计,我也初步,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料的能力,它使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题。最后一点,就是编程时思路一定要清楚。因为编程本身就是一个严密的逻辑过程,实现每一步的操作需要那些命令,哪些条件都是清清楚楚,明明了了的,来不得半点遗漏。总的来说,编程是件复杂的脑力劳动,要有科学严谨的科学态度,细心的习惯和耐心才能作好,要做到以上的要求我们还要做许多许多。

我对C语言的兴趣日益升温,对C语言进行更深探索的想法愈加浓烈,我相信,虽然C语言结课了,但对C语言更高的追求方面而言,这次课程设计的完结只是一个新的开始,我坚信我可以把对高级语言的兴趣坚持下去,学以致用,有所突破。

  • 18
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值