C课程设计学生成绩管理系统.doc
二一二一一 学年第 一 学期信息科学与工程学院课程设计报告书课程名称: 班 级: 学 号: 姓 名: 指导教师: 二一 年 九 月学生成绩管理程序一、 需求分析:设计要求:u 能录入学生信息存储在文件中,每位学生录入的信息有:姓名、学号、性别、班级、和三门功课(数学,英语,计算机)的成绩。如: 学号 姓名 性别 班级 数学 英语 计算机 0701 王鹏 男 1班 70 58 980702 李燕 女 2班 68 88 950703 赵亚芳 女 3班 58 48 96 0704 刘飞 男 4班 67 78 58u 能够统计每个学生三门课程的总成绩;u 能按学生学号查询其三门功课成绩并显示;u 能浏览全部学生成绩;u 能按总成绩由高到低显示学生信息。系统功能分析: 该学生成绩管理系统有八大功能:1. 录入功能:能录入学生的学号,姓名,性别,英语,计算机等2. 排序功能:能按总分排序3. 查询功能:能按姓名查找该生的成绩并且显示其全部成绩4. 删除功能:能按学号删除某一个学生的成绩5. 修改功能:能按姓名修改某个学生的成绩6. 插入功能:能在已输入的成绩中插入一个新学生的成绩7. 显示功能:操作完以上的功能后每次返回主菜单选择该项便可将结果显示出来8. 保存与读取功能:能将数据自定义的txt格式保存在外部磁盘并且读取,二、 概要设计:(1) 主函数结构图: 主 函 数 录 入 模 块 排 序 模 块 删 除 模 块 修 改 模 块 插 入 模 块 显 示 模 块 查 询 模 块保 存 和 入 读 模 块(2)模块功能详细说明及思路:A、录入模块:此模块可以连续输入80个学生的资料,若学生数少于80,录入完后输入n就可退出此模块,输入y可以继续B、排序模块:在此模块可以将已经输入进来的学生按总分进行排序,此处排序使用的冒泡排序法C、查询模块:此模块中使用学生姓名对比查找,如对比存在就显示出来D、修改模块:此模块中先通过姓名对比找到要修改的学生成绩,然后覆盖原来已有的成绩从而达到修改某一个学生的任何一门功课的成绩E、删除模块:此模块中用到的删除原理为覆盖要删除的学生的资料。过程简述,先输入要删除的学生的学号,系统找到此学生的信息后会给一个提示,是否删除信息,如是系统会再次要求输入学号并给它复制下一个学生的信息,给下一个学生的纪录复制下下一个学生的信息,一直到最后一个学生的信息复制给倒数第二个学生的信息为止。然后文件中的学生总数减一。F、插入模块:此模块能是在定义num当前已有的学生个数后,通过循环在后面加入的,直到输入N或n为止,即可完成插入函数G、显示模块:此模块能是被其它函数调用执行一次操作,再回到主菜单调用显示出经过以上操作的最终结果H、保存和读入模块:此模块能将信息以txt形式保存在外部磁盘上,并且也能从外部磁盘读入给程序使用三、详细设计: (1)各个模块的程序流程图开始输入添加的学号i输入各门科的成绩结束输入添加的姓名i输入添加的性别和班级录入模块: 删 除 模 块:stui=stunum-1;Multii=numstui.no=inumsystem("cls");i+i<numi=0输入序号i求和函数:stui.sum=stui.math+stui.english+stui.computer;Int i;i+i<numi=0排序模块:temp=stuj;j+j<=num-ij=1i+i<numi=1Struct student temp;stuj-1.sum<stuj.sum查询模块:Multii+i<numi=0system("cls");!asInt i;printf("输入要查询的学生姓名:");printf("tt按任意键返回主菜单.");插入模块ch!='n'&&ch!='N'Char ch;printf("ntt输入新插入学生信息n");修改模块:break;system("cls");system("cls");i+i<numi=0inti;保存模块:stui.sum=stui.math+stui.english+stui.computer;printf("n保存失败!");fclose(fp);i+i<numi=0FILE*fp;(fp=fopen(filepath,"w")=NULL打开模块:fscanf(fp,"t学号t姓名t性别t班级t数学t英语t计算机t平均分t总分n");fclose(fp);i+i<MAX&&!feof(fp)i=0num=0;FILE*fp;(fp=fopen(filepath,"r")=NULLprintf("找不到%s文件!n",filepath);三、 主要程序代码清单及关键注释1,程序源代码:#include<stdio.h>#include <stdlib.h>#include<string.h>#define MAX 80void input();/*原始数据录入函数*/void output();/*显示操作结果函数*/void sortall();/*对总分分排序*/void find();/*根据姓名查找成绩*/void insert();/*插入一个成绩*/void del();/*删除成绩记录*/void change();/*修改记录*/void save();/*保存函数*/void read();/*读入函数*/void average();/*求平均分*/int num=0; struct student /学生信息 int no; char name20; char sex4; char ban8; float math; float english; float computer; float ave; float sum;struct student stuMAX,*p;void main()/*主函数*/ int as; int i;start: printf("%55sn", "3武汉科技大学学生成绩管理系统3n"); printf("t444444444444444444444444444444444444444444444444444444444444n"); printf(" 制作者:武汉科技大学信息科学与工程学院自动化0901 肖小龙 n"); do for (i = 0; i < 80; i+) putchar('='); putchar('n'); printf(" 5 1 输入信息 5 2 输出信息n"); printf(" 5 3 按平均分排序 5 4 按姓名查找n"); printf(" 5 5 插入 5 6 按学号删除n"); printf(" 5 7 按姓名修改 5 8 保存到文件 n"); printf(" 5 9 读取文件 5 0 退出n");for (i = 0; i<= 79; i+) putchar('='); putchar('n'); printf("%sn", "6请输入各操作对应的序号:"); fflush(stdin); scanf("%d",&as); switch(as) case 1:system("cls");input();break; case 2:system("cls");output();break; case 3:system("cls");sortall();break; case 4:system("cls");find();break; case 5:system("cls");insert();break; case 6:system("cls");del();break; case 7:system("cls");change();break; case 8:system("cls");save();break; case 9:system("cls");read();break; case 0:system("exit");exit(0); default:system("cls");goto start; while(1);void input()/*原始数据录入模块*/ int i=0; char ch; do printf("tttt1.录入学生信息n5请输入第%d个学生的信息5n",i+1); printf("111111111111111111n"); printf("111111111111111111n"); printf("n6输入学生学号:"); scanf("%d",&stui.no); fflush(stdin); printf("n6输入学生姓名:"); fflush(stdin); gets(stui.name); printf("n6输入学生性别:"); fflush(stdin); gets(stui.sex); printf("n6输入学生班级:"); fflush(stdin); gets(stui.ban); printf("n6输入学生数学成绩:"); fflush(stdin); scanf("%f",&stui.math); printf("n6输入学生英语成绩:"); fflush(stdin); scanf("%f",&stui.english); printf("n6输入学生计算机成绩:"); fflush(stdin); scanf("%f",&stui.computer); printf("nn"); i+; num=i; printf("是否继续输入?(Y/N)"); fflush(stdin); ch=getchar(); system("cls"); while(ch!='n'&&ch!='N'); system("cls");void output()/*显示数据函数*/ int i; char as; average(); do printf("ttt5班级学生信息表5n");for(i=0;i<80;i+) putchar('-');printf("t|学号t|姓名t|性别t|班级t|数学t|英语t|计算机t|平均分t|总分");putchar('n'); for(i=0;i<80;i+) putchar('='); for(i=0;i<num&&stui.name0;i+) printf("t%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2f",stui.no,stui.name,stui.sex,stui.ban,stui.math,stui.english,stui.computer,stui.ave,stui.sum); putchar('n'); for(i=0;i<80;i+) putchar('='); putchar('n'); printf("按回车键继续:"); getchar(); getchar(); as=getchar(); while(!as);system("cls");void average()/*求平均数*/ int i; for(i=0;i<num;i+) stui.sum=stui.math+stui.english+stui.computer; stui.ave=stui.sum/3; void sortall()/*按总分排序数据函数*/ struct student temp; int i,j; average(); for(i=1;i<num;i+) for(j=1;j<=num-i;j+) if(stuj-1.sum<stuj.sum) temp=stuj; stuj=stuj-1; stuj-1=temp; void find()/*查询函数*/ int i; char str20,as; do printf("tt3欢迎进入查询系统3n"); printf("4请输入要查询的学生姓名:"); fflush(stdin); gets(str); for(i=0;i<num;i+) if(!strcmp(stui.name,str) printf("t|学号t|姓名t|性别t|班级t|数学t|英语t|计算机t|平均分t|总分|n"); printf("t%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn",stui.no,stui.name,stui.sex,stui.ban,stui.math,stui.english,stui.computer,stui.ave,stui.sum); for(i=0;i<80;i+)putchar('='); putchar('n'); printf("tt4按任意键返回主菜单."); fflush(stdin); as=getchar(); while(!as); system("cls");void insert()/*插入数据函数*/ char ch; do printf("tt3欢迎进入插入系统:3n"); printf("ntt6请输入新插入学生信息n"); printf("n6输入学生学号:"); scanf("%d",&stunum.no); fflush(stdin); printf("n6请输入学生姓名:"); fflush(stdin); gets(stunum.name); printf("n6请输入学生性别:"); fflush(stdin); gets(stunum.sex); printf("n6请输入学生班级:"); fflush(stdin); gets(stunum.ban); printf("n6请输入学生数学成绩:"); fflush(stdin); scanf("%f",&stunum.math); printf("n6请输入学生英语成绩:"); fflush(stdin); scanf("%f",&stunum.english); printf("n6请输入学生计算机成绩:"); fflush(stdin); scanf("%f",&stunum.computer); printf("nn"); num=num+1; sortall(); printf("是否继续输入?(Y/N)"); fflush(stdin); ch=getchar(); system("cls"); while(ch!='n'&&ch!='N');void del()/*删除数据函数*/ int inum,i; char ch; printf("tt3欢迎进入删除系统:3n"); printf("5输入要删除学员的编号:"); scanf("%d",&inum); printf("6你真想删除该学生的信息吗?一但删除不能恢复6n"); printf("是否继续?(Y/N)"); fflush(stdin); ch=getchar(); system("cls"); if(ch='y'|ch='Y') printf("6请再次输入要删除学员的编号:"); scanf("%d",&inum); else goto a; for(i=0;i<num;i+) if(stui.no=inum) if(i=num) num-=1; else stui=stunum-1; num-=1; sortall(); break; printf("删除成功!"); a:; system("cls");void change()/*修改数据函数*/ int i; char str20; printf("tt欢迎进入成绩修改系统:"); printf("6输入要修改的学生姓名:"); fflush(stdin); gets(str); for(i=0;i<num;i+) if(!strcmp(stui.name,str) system("cls"); printf("ntt6请输入新插入学生信息n"); printf("n输入学生学号:"); scanf("%d",&stui.no); fflush(stdin); printf("n6输入学生姓名:"); fflush(stdin); gets(stui.name); printf("n6输入学生性别:"); fflush(stdin); gets(stui.sex); printf("n6输入学生班级:"); fflush(stdin); gets(stui.ban); printf("n6输入学生数学成绩:"); fflush(stdin); scanf("%f",&stui.math); printf("n6输入学生英语成绩:"); fflush(stdin); scanf("%f",&stui.english); printf("n6输入学生计算机成绩:"); fflush(stdin); scanf("%f",&stui.computer); printf("nn"); sortall(); break; system("cls");void save()/*保存数据函数*/ FILE *fp; int i; char filepath20; printf("输入要保存的文件路径:"); fflush(stdin); gets(filepath); if(fp=fopen(filepath,"w")=NULL) printf("n保存失败!"); exit(0); fprintf(fp,"t|学号t|姓名t|性别t|班级t|数学t|英语t|计算机t|平均分t|总分n"); for(i=0;i<num;i+) stui.sum=stui.math+stui.english+stui.computer; stui.ave=stui.sum/3; fprintf(fp,"t%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn",stui.no,stui.name,stui.sex,stui.ban,stui.math,stui.english,stui.computer,stui.ave,stui.sum); fclose(fp); printf("学生信息已保存在%s中!n",filepath); system("pause"); system("cls");void read()/*读取功能*/ FILE *fp; int i; char filepath20; printf("输入要读入的文件路径:"); fflush(stdin); gets(filepath); if(fp=fopen(filepath,"r")=NULL) printf("找不到%s文件!n",filepath); system("pause"); exit(0); num=0; for(i=0;i<MAX&&!feof(fp);i+) fscanf(fp,"t学号t姓名t性别t班级t数学t英语t计算机t平均分t总分n"); fscanf(fp,"t%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn",stui.no,stui.name,stui.sex,stui.ban,stui.math,stui.english,stui.computer,stui.ave,stui.sum); num+; fclose(fp); printf("保存的在文件%s中的所有信息已经读入!n",filepath); system("pause"); system("cls"); 五,调试分析过程描述:数据测试1、 菜单主页面2、 选择输入信息添加完毕后回到主菜单,选择2,显示添加成功可以看到总分一栏并未被排序,返回主菜单选择3,再选择2即可显示可以看到排序成功,证明排序功能存在3、 选择4按姓名查找4、 选择5插入功能5、 选择删除功能6、 选择修改功能7可以看到修改后刘飞的总成绩变为266,原为2037、 选择保存8可以重新打开看到记事本中已有记录,说明保存成功8、 对程序调试过程的思考:1.每次录入信息时,如果出错时,很难更改,不能进行重新更改功能,经调试和修改还未能解决,另外没能将删除的信息进行恢复,2.有部分函数执行后不能立即显示结果,需要返回到主菜单调用其他的。3.另外在录如时不能检查是否因误录入导致学号相同,再删除时只能删掉一个4.对调试的看法,首先要要按一定的步骤来处理,昨天由于没有按一定的步骤,结果花了很长时间也未能搞好。六、课程设计小结:1、在设计过程中的感受:首先经过的是暑期在家准备编写程序,并在开学第一周进行调试,并最后附一段的报告总结,我对C这门语言有了新的认识,应该是获益不浅!在此过程中给我最大的体会是要想编写一个准确、高效并有使用价值的程序,一定先1.要对课本知识熟悉,因为,在调试过程中,可以发现好多出错误是在基本的知识上,2.还要掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。就光调试程序用的时间最对,稍改一点,就可能得不到预期的结果。这次课程设计,让我对C语言了解更进一层,而且还得到了用C语言解决实际问题的宝贵经验。其次, 通过此次编程我也发现了自己在学习中的错误和不足,不仅复习了以前学过的知识。同时也学到了一些没学过的知识,让我从中收益非浅,也为即将到来的计算机二级考试准备了一下!更重要的是培养了独立思考问题和解决问题的能力,熟悉了一些基本操作和解决问题的方法!再则, 因为初次接触等原因此次设计遇到了许多问题,我深刻体会到网络所发挥的重要作用,因为好多不懂的在网上基本能找到相关的解答。C语言程序对我们来说比较难,在匆匆忙忙的学习中更是难上加难,似乎觉得自己仅是个匆匆过客,虽然匆忙但是初步了解如何调试,以后还得多练习,才能有所提高。特别是在程序能按预期的目标显示时 ,体会到原来编程也挺有意思的。最后,我也体会到编程不易,编一个好的程序更不容易。