1、学生成绩管理系统 学生成绩管理系统一、 课程设计的目的1、 进一步掌握和利用C语言进行程设计的能力; 2、 进一步理解和运用结构化程序设计的思想和方法 3、 初步掌握开发一个小型实用系统的基本方法 4、 学会编辑一个较长程序的基本方法 5、 学会利用流程图表示算法 6、 掌握书写程序设计的能力(书写课程设计报告)二、 设计方法论证1、 设计思路可以通过所学过的方法检查姓名和输入学生学号的正确性来建设程序。因为学生的分数是0-100之间,所以可以通过IF语句判断输入的分数是否合理来建立程序。我们用指针、读取等知识可以建一个学生信息的列表,这样我们可以通过姓名的查找来了解学生的成绩,还可以统计成绩
2、优秀的人的个数。最后附加时间、指导教师等完善课程设计,使程序更充实。2、 设计方法和基本原理1、功能要求:要求完成以下功能:1)判断输入的姓名和学号是否存在2)从屏幕上读取一个学生的信息(包括学号、姓名、年龄)并将信息存入到数据文件中。3)能够按学号、姓名、年龄对学生的信息进行检索并将检索结果显示在屏幕上。4)可以按学号录入学生成绩(语文、数学、英语),并求出成绩及格和优秀的雪生。5)要求有错误提示功能,例如姓名只能以字符形式输入,输入错误提示重新输入。2、分析系统中的各个函数之间的关系;1)、f1()查看学生信息用来查看学生信息记录,如学生学号、姓名、年龄等。2)、f2()输入学生成绩3)、
3、f3()按学号查找可按“学号”查询;能给方式出查询记录的信息;查询的信息不存在,输出提示信息。4)、f4()按姓名查找可按“姓名”查询方式;能给出查询记录的信息;查询的信息不存在,输出提示信息。5)、f5()列出所有学生成绩6)、f6()统计 为查找提供方便。3、 流程图 4、 程序 #include #include /*头文件*/#include#include#include#include#include#include#define NULL 0#define ESC /* 退出 */#define F1 /* 查看帮助信息,调用HelpMassage()函数 */#define F
4、2 /*输入学生成绩*/#define F3 /*按学号查找*/#define F4 /*按姓名查找*/#define F5 /*列出所有学生成绩*/#define F6 /*统计*/suct stuType /*定义结构体变量*/ char NO11; /*学号长度为10*/ char XM10; float CJ4; /*包含4门成绩*/;int JY_NO(char *stu_num,FILE *fp) /*检验学号的正确性*/ suct stuType stud; int NO; char *p=stu_num; if(scmp(stu_num,#)=0) return 1; /*若输
5、入#返回真值,不再循环输入*/ while(*p!=0) /*学号必须是数字,否则返回重新输入*/ NO=(int)*p; if(NO57) puts(非法学号!请重新输入!n); return 0; else p ; /*指针加1*/ if(slen(stu_num)!=10) /*若学号长度不为10,则返回重新输入*/ puts(学号长度不对!n); return 0; if(getchar()!=n) /*若学号后面的字符不是回车符,则学号长度大于10*/ printf(学号长度大于10个!请重新输入!n); dowhile(getchar()!=n); /*用getchar接收多余的字
6、符*/ return 0; else rewind(fp); /*使文件指针指向头*/ while(!feof(fp) /*若文件指针未到结尾,就继续执行下面的循环,feof遇到文件结束符返回非零值,否则返回0*/ fread(&stud,sizeof(suct stuType),1,fp); /*读取一定长度的数据*/ if(scmp(stu_num,stud.NO)=0) /*学号的唯一性*/ printf(学号重复,请重新输入!n); printf(该学生成绩如下:n); printf(语文:%.1fn,stud.CJ0); printf(数学:%.1fn,stud.CJ1); prin
7、tf(英语:%.1fn,stud.CJ2); printf(总评:%.1fn,stud.CJ3); return 0; return 1;int JY_NO2(char *stu_num) /*检验学号*/ int NO; char *p=stu_num; if(scmp(stu_num,#)=0)return 1; /*若输入“#”,则返回真值结束*/ if(slen(stu_num)!=10) /*学号长度为10*/ puts(ttt学号长度不对!n); return 0; while(*p!=0) /*学号必须用数字,若包含有字母,或其它字符则返回假值重新输入*/ NO=(int)*p;
8、 if(NO57) puts(ttt非法学号!请重新输入!n); return 0; else p ; /*指针加1*/ if(getchar()!=n) /*检验学号长度是否大于10,并把多余的字符去掉*/ printf(ttt学号长度大于10个!请重新输入!n); dowhile(getchar()!=n); return 0; return 1;int JY_XM(char *stu_XM) /*检验姓名*/ int PD; char *p; p=stu_XM; while(*p!=0) /*姓名只能用中文*/ PD=(int)*p; if(PD0) puts(姓名只能用中文,请重新输入
9、!n); return 0; else p ; /*使指针加1,指向下一汉字*/ if(getchar()!=n) /*姓名长度不得大于5个*/ printf(姓名长度大于5个!请重新输入!n); dowhile(getchar()!=n); return 0; return 1; /*字符串全为汉字返回真*/int JY_CJ(float stu_CJ) /*学生成绩只能在0100之间*/ if(stu_CJ100) printf(输入错误,成绩只能在0100之间!n); return 0; return 1;void CreatFile() /*输入文件*/ FILE *fp; suct
10、stuType stu,stu0=,; /*对stu0先赋值*/ fp=fopen(stu.dat,wb ); /*打开或创建一个二进制文件,打开时将原来的内容删除*/ if(fp=NULL) printf(文件打开失败!n按任意键返回.); getch(); return; else while(1) stu=stu0; do printf(n请输入学号:); /*输入学号并检验其正确性*/ scanf(.s,stu.NO); while(!JY_NO(stu.NO,fp); if(scmp(stu.NO,#)=0)break; do printf(n请输入姓名:); /*输入姓名并检验其正
11、确性*/ scanf(.s,stu.XM); while(!JY_XM(stu.XM); do printf(请输入语文成绩:); /*输入成绩并检验其正确性*/ scanf(%f,&stu.CJ0); while(!JY_CJ(stu.CJ0); do printf(n请输入数学成绩:); /*同上*/ scanf(%f,&stu.CJ1); while(!JY_CJ(stu.CJ1); do printf(n请输入英语成绩:); scanf(%f,&stu.CJ2); while(!JY_CJ(stu.CJ2); do printf(n请输入总评成绩:); scanf(%f,&stu.CJ
12、3); while(!JY_CJ(stu.CJ3); fwrite(&stu,sizeof(suct stuType),1,fp); /*写文件*/ fclose(fp); /*关闭文件*/void Search_Xuehao() /*按学号查询*/ FILE *fp; int flag; suct stuType stu,stud; fp=fopen(stu.dat,rb); if(fp=NULL) /*若文件打不开则输出下面的信息*/ printf(文件打开失败!n按任意键返回.); getch(); return; else do puts(n输入“#”结束查询); do printf(
13、请输入要查询的学号:); scanf(.s,stu.NO); while(!JY_NO2(stu.NO); if(scmp(stu.NO,#)=0)break; /*若输入“#”则结束循环*/ flag=0; rewind(fp); while(fread(&stud,sizeof(suct stuType),1,fp) /*检查文件指针结束*/ if(scmp(stu.NO,stud.NO)=0) /*比较学号*/ puts(t该学生成绩如下:); printf(学号:%sn,stud.NO); printf(姓名:%sn,stud.XM); printf(语文:%.1fn,stud.CJ0
14、); printf(数学:%.1fn,stud.CJ1); printf(英语:%.1fn,stud.CJ2); printf(总评:%.1fn,stud.CJ3); flag=1; /*记录学号是否查到*/ if(flag=0)puts(无此学号!); while(scmp(stu.NO,#)!=0); fclose(fp); /*关闭文件*/void Search_Xingming() /*按姓名查找*/ FILE *fp; int flag=0; suct stuType stu,stud; fp=fopen(stu.dat,rb); if(fp=NULL) printf(文件打开失败!
15、n按任意键返回.); getch(); return; else do do printf(请输入要查询的学生姓名:); scanf(.s,stu.XM); while(!JY_XM(stu.XM); rewind(fp); /*文件指针指向头*/ while(fread(&stud,sizeof(suct stuType),1,fp) if(scmp(stu.XM,stud.XM)=0) /*比较姓名是否相同*/ puts(该学生姓名如下:); printf(学号:%sn,stud.NO); printf(姓名:%sn,stud.XM); printf(语文:%.1fn,stud.CJ0);
16、 printf(数学:%.1fn,stud.CJ1); printf(英语:%.1fn,stud.CJ2); printf(总评:%.1fn,stud.CJ3); flag=1; /*记录姓名是否被查到*/ if(flag=0)puts(n无此学生!); puts(是否继续(y-继续,其他返回)?); while(getch()=y); fclose(fp); /* puts(请按任意键继续.);*/ /* getch();*/int ListFile(void) /*输出文件,列出所有学生成绩*/ FILE *fp; int REC=0; /*记录学生人数*/ suct stuType st
17、u; fp=fopen(stu.dat,rb); if(fp=NULL) printf(文件打开失败!n按任意键返回.); getch(); return 1; else printf(学生成绩如下:n); printf(学号t姓名t语文t数学t英语t总评n); rewind(fp); while(fread(&stu,sizeof(suct stuType),1,fp) /*每读取一个长度的数据就输出*/ printf(%s,stu.NO); printf(t%s,stu.XM); printf(t%.1f,stu.CJ0); printf(t%.1f,stu.CJ1); printf(t%
18、.1f,stu.CJ2); printf(t%.1f,stu.CJ3); printf(n); REC ; if(REC =0) /*每输出20个学生成绩,停一下*/ printf(请按任意键继续.n); getch(); fclose(fp); /*关闭文件*/ printf(请按任意键继续.); getch();void Statistics() /*统计及格和优秀人数*/ FILE *fp; int REC=0,pass4=0,good4=0; /*REC-记录个数,即人数,pass-及格人数,good-优秀人数*/ float highest4=0,score4=0; /*highes
19、t-最高分,score-总分*/ suct stuType stu; fp=fopen(stu.dat,rb); if(fp=NULL) printf(文件打开失败!n按任意键返回.); getch(); return; else rewind(fp); while(fread(&stu,sizeof(suct stuType),1,fp) REC ; score0=score0 stu.CJ0; /*语文*/ if(stu.CJ0=60)pass0 ; if(stu.CJ0=80)good0 ; if(highest0=60)pass1 ; if(stu.CJ1=80)good1 ; if(
20、highest1=60)pass2 ; if(stu.CJ2=80)good2 ; if(highest2=60)pass3 ; if(stu.CJ3=80)good3 ; if(highest3stu.CJ3)highest3=stu.CJ3; if(REC=0) /*可以防止记录为0是REC作除数而造成的错误*/ printf(未输入学生记录!按任意键返回.); getch(); return; else printf(语文t 数学t 英语t 总评n); /*输出统计信息*/ printf(ttt平均分: %.1ft %.1ft %.1ft %.1fn,score0/REC,score1/
21、REC,score2/REC,score3/REC); printf(ttt最高分: %.1ft %.1ft %.1ft %.1fn,highest0,highest1,highest2,highest3); printf(ttt优秀人数:%dt %dt %dt %dn,good0,good1,good2,good3); printf(ttt及格人数:%dt %dt %dt %dn,pass0,pass1,pass2,pass3); fclose(fp); printf(n请按任意键继续.); getch(); /*从键盘读取一个字符,但不显示于屏幕*/ void HelpMessage()
22、clrscr(); printf(nnnnn 此系统是应老师所布置的作业编制而成,该系统具有存贮学生数据,按学号、姓名查询,列出学生成绩和统计功能。n n 使用方法:系统输入数据后,将在当前目录中建立一个名为stu.dat文件,用于保存输入的数据。学号输入只能用数字输入,并且学号只能是10位。姓名输入符合中国人的姓名,只能用中文,且最长为5个汉字。n 此程序在Turbo C2.0下运行通过nn 由于是初学者,水平有限此系统还有许多不够完整和严密性,敬请指正!); getch();int GetKey(void) /*此函数返回一个按键的数值*/ int key; key=bioskey(0);
23、 /*bioskey为调用BIOS键盘接口*/ if(key8) /*位移*/ key=key&0x00ff; return key; /*返回按键*/void main() int key; suct date d; /*定义时间结构体*/ geate(&d); /*读取系统日期并把它放到结构体d中*/ clrscr(); /*清除屏幕*/ printf(nnnnn); printf(*n); /*版本信息*/ printf(学生成绩管理系统1.0 n); printf(*n); printf( 制作群: 404 1工作室 n); printf( 指导老师:- n); printf( 制作时
24、间:2004年5月 n); printf(*n); printf(请按任意键继续.); /*while(!kbhit();*/ getch(); /*从键盘读取一个字符,但不显示于屏幕*/ system(cls); /*调用DOS的清屏函数,TC中可用clrscr代替*/ while(1) /*主菜单*/ printf(nnnnn); printf(*n); printf(*tF1 -帮助 *n); printf(*tF2 -输入数据并存入文件 *n); printf(*tF3 -根据学号查询成绩 *n); printf(*tF4 -根据姓名查询成绩 *n); printf(*tF5 -输出文
25、件内容 *n); printf(*tF6 -统计及格和优秀人数 *n); printf(*tESC-退出系统 *n); printf(*n); printf(n请输入选项tt%d年%d月%d日nn,d.da_year,d.da_mon,d.da_day); /*提示信息,并显示当前系统日期*/ key=GetKey(); /*调用自定义函数,读取一个键*/ switch(key) case F1: HelpMessage(); break; case F2: CreatFile(); break; case F3: Search_Xuehao(); break; case F4: Search_Xingming();break; case F5: L
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1