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

本设计通过C语言实现了一个简易的学生信息管理系统,包括学生成绩的录入、查询、统计等功能,旨在提升学生对C语言的综合运用能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、设计目的:

高级语言综合设计是学习“高级语言程序设计”课程后进行的一次全面的综合练习。其目的在于加深对高级语言程序设计基础理论和基本知识的理解,进一步了解和应用丰富的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语言更高的追求方面而言,这次课程设计的完结只是一个新的开始,我坚信我可以把对高级语言的兴趣坚持下去,学以致用,有所突破。

摘 要 高校学生成绩管理工作是高等教育中的一个极为重要的环节,是院校学生管理的基础。面对种类繁多的数据和报表,手工处理方式已经很难跟上现代化管理的步伐,传统的文件管理方式进行成绩管理,效率很低,耗时费力,容易出错,安全性也存在问题。特别是在查询上,由于文件过多,带来很多不便。随着计算机及通讯技术的飞速发展,高等教育对教务管理工作提出了更高的要求。尽快改变传统的管理模式,运用现代化手段进行科学管理。 本设计研究的是基于J2EE的高校成绩管理系统的设计与实现。本系统是基于J2EE开发的成绩管理系统,弥补了人工管理的不足,提高了一定的效率。主要功能包括教师对学生成绩的记录,生成总评成绩成绩单的提交。学生查询相关的成绩信息。管理员对学生、教师,课程、班级进行综合管理。该系统为教务处人员提供了强大的成绩管理功能,为教师提供了对平时成绩和期末成绩方便的管理,为学生提供了一个方便快捷的查询功能。本设计的开发工具使用MyEclipse,数据库使用的MySQL,框架是struts整合hibernate。 关键词:J2EE; 成绩管理; MySQL; MyEclipse Abstract College student grade management is a very important aspect of higher education,is the foundation of college students management. Faced with a wide variety of data and statements, the manual processing methods have been difficult to keep up with the pace of modern management, the traditional document management about grade management, is inefficient, time-consuming effort, error-prone, and also existing security issues. Because too many documents, it brings a lot of inconvenience in the query. With the computer and the rapid development of communication technology, higher education must meet a higher demand. We should change the traditional mode of management and use modern means of scientific management as soon as possible. The design based on J2EE technology mainly research about Implementation of grade management system of universities. The system is based on J2EE platform, cover the deficiencies of manual management, and improve the efficiency of management. Main features including: teachers record the grade of students in the term examines, generate the report card to examine. Students can query their information at any time with this system. Administrator can manage the students, teachers, curriculum, classes together. The system for the Registry staff with a powerful performance management capabilities, provide teachers with the usual results and final results for the management, provide students with a convenient and efficient enquiry function. The development tools is MyEclipse, database is MySQL, integrated framework is struts and hibernate. Key words: J2EE; Grade Management; MySql; MyEclipse 目 录 Abstract II 1 绪论 1 1.1高校学生成绩管理系统实施的背景分析 1 1.2选题的目的及意义 1 2 J2EE平台及其支撑技术 3 2.1 J2EE平台 3 2.1.1 J2EE简介 3 2.1.2 JSP技术 5 2.1.3 Servlet技术 7 2.1.4 EJB技术 8 2.1.5 J2EE发展趋势 9 2.2 MVC模式介绍 10 2.3 Struts框架介绍 14 2.4 Hibernate框架介绍 16 3 基于J2EE技术平台的学生成绩管理分析 18 3.1系统可行性分析. 18 3.1.1技术可行性 18 3.1.2经济可行性 18 3.1.3运行可行性 18 3.2系统需求分析 18 3.3系统整体说明 19 3.4系统模块的功能概述 19 4 系统总体设计 20 4.1.系统结构图 20 4.1.1包组织结构图 20 4.3数据流程图设计 21 4.4.1 E-R图 22 4.3主要功能模块的设计 22 4.2.1用户登录模块设计 22 4.2.2管理管理模块设计 23 4.2.3教师成绩录入和修改模块设计 23 4.2.4学生管理模块设计 23 5 基于J2EE技术平台的系统详细设计 24 5.1数据库详细设计 24 5.1.1 数据库需求分析 24 5.1.2 数据库概念结构设计 25 5.1.3 数据库逻辑结构设计 26 5.1.4 数据库结构的实现 28 5.1.5数据库模型 30 6 系统编码与测试 31 6.1系统编码说明 31 6.1.1系统配置文件 31 6.1.2系统运行效果图示. 35 6.1.3系统主要功能模块详细实现 40 6.1.3.1管理管理模块详细介绍 40 6.1.3.2管理管理模块代码说明 40 6.2 系统开发环境的搭建 47 6.2.1软件环境的配置 47 6.2.2硬件环境的配置 47 6.3系统性能测试 47 6.3.1安全性测试 47 6.3.2稳定性测试 47 7 总结与展望 48 7.1总结 48 7.2展望 48 参考文献: 49 致谢 49
一、课程设计题目 ① 基本要求题目:矩阵乘法。 ② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能: (1)主菜单 (2)各菜单项功能 ① 成绩录入:输入学生的学号、姓名及三门课的成绩; ② 成绩查询:(至少一种查询方式)。  按学号查询学生记录。  查询不及格学生的记录。 ③成绩统计:  计算学生的平均分;  根据学生的平均分高低,对学生的数据进行排序后输出;  对学生单科成绩排序,输出学生姓名与该科成绩; ④退出系统:退出整个系统(即主菜单)。 (3)结构体数组: #define N 30struct student {int num; /* 定义学号*/ char name[20]; /* 定义姓名*/ float score[3]; /* 定义存贮三门课成绩的数组*/ float average; /* 定义平均成绩*/ };struct student stu[N];  /* 定义结构体数组,存贮多个学生的记录*/ 三、数据结构设计描述 系统功能描述 1能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。 2能够以表格的形式输出学生记录 3能够按照学生三科的平均成绩进行排序 4能够按照学生的单科成绩进行排序 5能够按照学号查询学生记录 6往表中插入学生记录 7从表中删除学生记录 8存储记录到文件中 9从文件中读取记录 10退出 数据字典 1数据流条目 数据流名称:全部记录 别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车; 按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。 4、回到主菜单,输入1,回车 每10个暂停显示数据 5、回到主菜单,输入2,回车 出现排序成功信息。 6、回到主菜单,输入3,回车 出现排序成功信息。 7、回到主菜单,输入5,回车 按提示插入一组数据 8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息 9、回到主菜单,输入4,回车 输入学号进行查询 10、回到主菜单,输入1,回车 出现统计信息 11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值