1、学籍信息管理系统C 语 言 课 程 实 习 报 告(一) 题目要求 使用下面的数据,设计一个简单的学籍管理系统。 学生基本信息文件(A.TXT)及内容: 学号 姓名 性别 宿舍号码 电话号码 01 张成城 男 501 87732111 02 李成华 女 101 87723112 . . . . 学生成绩基本信息文件(B.TXT) 及内容: 学号 课程编号 课程名称 学分 平时成绩 试验成绩 卷面成绩 综合成绩 实得学分01 A01 大学物理 3 66 78 82 02 B03 高等数学 4 78 -1 90 . . 功能要求及说明:(1) 数据录入功能:录入每个学生的学号,课程编号,课程名称,
2、学分,平时成绩,试验成绩,卷面成绩共7个数据.综合成绩,实得学分根据条件自动运算.综合成绩的计算: a 如果本课程的试验成绩为-1,则表示无实验,综合成=平时成绩*30%+卷面成绩*70%; b 如果试验成绩不为-1,表示本课程有实验,综合成绩=平时成绩*15%+实验成绩*15%+卷面成绩*70%。 实得学分的计算:采用登记学分制。 a 综合成绩在90100之间,应得学分=学分*100% b 综合成绩在8090之间,应得学分=学分*80% c 综合成绩在7080之间,应得学分=学分*75% d 综合成绩在6070之间,应得学分=学分*60% e 综合成绩在60以下,应得学分=学分*0%(2)
3、查询功能:分为学生基本情况查询和成绩查询两种a 学生基本情况查询:输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。b 成绩查询:输入一个学号时,查询出此生的所有课程情况,格式如下:学号:XX 姓名:XXX课程编号:XXX 课程名称:XXX 综合成绩:X X实得学分:X课程编号:XXX 课程名称:XXX 综合成绩:XX 实得学分:X共修:XX 科,实得总学分为:XX(3) 删除功能:当在A.TXT 中删除一个学生时,自动地在B.TXT 中删除此人所有信息.(4) 排序功能:能实现选择按综合成绩或实得学分升序或降序排序并
4、显示数据。 (二)总体设计学生学籍管理系统根据上面的需求分析,可以将这个系统的设计分为如下四大模块:数据的录入及计算,查询,删除,排序。排序删除查询录入及计算(三)详细设计1 .全局变量的声明定义#define N 50#define k 3#include #include #include #include #include /*定义结果体*/struct stud char pro_num10; char pro_name20; int x; int usual; int papsco; int emp; int score; int sco;struct student char nu
5、m10; char name20; char male7; char room5; char telnum10; struct stud stk;stuN; 2 .函数这里主函数提供各功能的选择 【流程图】【程序】void menu() int n,w1; /*变量n保存选择菜单数字,w1判断输入是否在菜单上有的功能*/ do puts(tt*MENU*nn); puts(tttt 1.Enter new data); /*输入学生信息*/ puts(tttt 2.Search); /*查找学生信息*/ puts(tttt 3.Delete data); /*删除学生信息*/ puts(ttt
6、t 4.Orde by score); /*学生信息排序*/ puts(tttt 5.Exit); /*退出*/ puts(tt*n); printf(Choice your number(1-5): bb); scanf(%d,&n); if(n5) /*对选择的数字做判断*/ w1=1; getchar(); else w1=0; while(w1=1); /*选择功能*/ switch(n) case 1:enter();break; case 2:search();break; case 3:del();break; case 4:orde();break; case 5:exit(0
7、); int main() menu();4 .各功能模块设计(1)输入模块/*输入模快*/*算综合成绩函数*/ void score(int i,int j) if(stui.stj.emp=-1) stui.stj.score=stui.stj.usual*3/10 + stui.stj.papsco*7/10; else stui.stj.score=(stui.stj.usual + stui.stj.emp)*15/100 + stui.stj.papsco*7/10;/*求实得学分函数*/void sco(int i,int j) int p; p=stui.stj.papsco/
8、10; if(p6) p=5; if(p=10) p=9; switch(p) case 5: stui.stj.sco= 0; case 6: stui.stj.sco= stui.stj.x * 60 / 100; case 7: stui.stj.sco= stui.stj.x * 75 / 100; case 8: stui.stj.sco= stui.stj.x * 80/ 100; case 9: stui.stj.sco= stui.stj.x ; /*输入成绩信息*/void score_input (int i) int j; for(j=0;jk;j+) scanf(%s%
9、s%d%d%d%d,stui.stj.pro_num,stui.stj.pro_name,&stui.stj.x,&stui.stj.usual,&stui.stj.papsco,&stui.stj.emp); score(i,j); /*调用综合成绩函数*/ sco(i,j); /*调用实得学分函数*/ /*学号记录函数*/void no_input(int i,int n) /*加载记录或可以记录个数的函数*/ int j,s,w1; do w1=0; printf(NO.:); scanf(%s,stui.num); for(j=0;stui.numj!=0;j+) /*学号输入函数,作
10、了严格的规定*/ if(stui.numj9) /*判断学号是否为数字*/ puts(Inout error!Only be made up of(0-9).Please reinput!n); w1=1; break; if(w1!=1) for(s=0;sn;s+) /*比较第n个学生*/ /*排除第i个学生记录即你要修改的*/ if(s!=0&strcmp(stus.num,stuj.num)=0) /*判断学号是否有雷同*/ puts(This record is exisit.Please reinput!n); w1=1; break; while(w1=1);/*输入一个记录*/
11、void intput(int i) no_input(i,i); /*调用学号记录函数*/ printf(name:); scanf(%s,stui.name); printf(male:); scanf(%s,stui.male); printf(room:); scanf(%s,stui.room); printf(tlenum:); scanf(%s,stui.telnum); printf(now intput score:); score_input(i); /*调用分数输入函数*/*输入函数*/ void enter() int i,n; system(cls); printf(
12、hao many student(0-%d)?:,N-1); scanf(%d,&n); printf(nEnter data nownn); for(i=0;in;i+) printf(n Input%dth student record.n,i+1); intput(i); if(i!=0) save(n,0); /*调用保存函数*/ printf_back(); /*调用返回函数*/ (2)查询模块 /*查询模块*/*通过名字或学号查询基本信息函数*/ Y Nvoid search1(int n) int i,flog=0; char s20; printf(nnplease scanf
13、 the num or name which you want search: ); scanf(%s,s.name); /*通过名字查询并输出*/ for(i=0;in;i+) if(strcmp(s,stui.name)=0) printf(nnnum:%stname:%stmale:%stroom:%sttelunm:%snn,stui.num, stui.name,stui.male,stui.room,stui.telnum); flog=1; else if(strcmp(s,stui.num)=0) printf(nnnum:%stname:%stmale:%stroom:%st
14、telunm:%snn,stui.num, stui.name,stui.male,stui.room,stui.telnum); flog=1; if(flog=0) printf(Can not find this member);/*通过宿舍号查询该宿舍所有同学的基本信息函数*/void search2(int n) int i,flog=0; char r5; printf(nnplease scanf room which you want search: ); scanf(%s,r); for(i=0;in;i+) if(strcmp(r,stui.room)=0) /*查找并输出
15、成绩信息*/ printf(nnnum:%stname:%stmale:%stroom:%sttelunm:%snn,stui.num, stui.name,stui.male,stui.room,stui.telnum); flog=1; if(flog=0) printf(Can not find this member); /*通过学号查询成绩信息函数*/void search3(int n) int i,j,s=0,flog=0; char m20; printf(nnplease scanf the num which you want search: ); scanf(%s,&m)
16、; for(i=0;in;i+) if(strcmp(m,stui.num)=0) /*查找所要查找的同学*/ for(j=0;jk;j+)/*输出成绩信息*/ printf(npto_unm:%stpro_name:%stx:%dtusual:%dnpapsco:%dtemp:%dtscore:%dtsco:%dn,stui.stj.pro_num,stui.stj.pro_name, stui.stj.x,stui.stj.usual,stui.stj.papsco,stui.stj.emp,stui.stj.score,stui.stj.sco); s+=stui.stj.sco; pr
17、intf(Project:%dtAll sco:%d,j,s); flog=1; break; if(flog=0) printf(Can not find this member); void search() int n,m,w1;/*;*/ system(cls); n=open_fp(); /*调用将文件里的内容输到结果体函数,并得到学生个数*/ do /*功能选择*/ printf(what do you want to do?nnt1).search by name or num 2).search menmber by room 3).search scorce by num);
18、 printf(Choice your number(1-3): bb); scanf(%d,&m); if(m3) /*对选择的数字做判断*/ w1=1; printf(nnyou choice is error,choice again.nn); else w1=0; while(w1=1); switch(m) case 1:search1(n);break; /*调用通过名字或学号查询基本信息函数*/ case 2:search2(n);break;/*调用通过宿舍号查询该宿舍所有同学的基本信息函数*/ case 3:search3(n);break; /*调用通过学号查询成绩信息函数
19、*/ printf_back();/*;*/*/ (3)删除模块【程序】/*删除模快*/void del() /*修改数据函数,修改第i个记录*/ FILE *fp1,*fp2; int i,j,n,d; char num10; system(cls); n=open_fp(); if(fp2=fopen(A.TXT,wb)=NULL) /*以输出打开方式,在此前的记录被覆盖 */ printf(n Cannot open filen); exit(0); if(fp1=fopen(B.TXT,wb)=NULL) /*以输出打开方式,在此前的记录被覆盖 */ printf(n Cannot o
20、pen filen); exit(0); printf(please input the number witch you want delete: bb);/*;*/ scanf(%s,num); for(i=0;in;i+) if(strcmp(num,stui.num)!=0) /*strcmp(num,stui.num)=0表示此记录已删除*/ fprintf(fp2,n%s %s %s %s %sn,stui.num,stui.name,stui.male, stui.room,stui.telnum); for(j=0;jk;j+) fprintf(fp1,n%s %s %d %d
21、 %d %d %d %dn,stui.stj.pro_num,stui.stj.pro_name, stui.stj.x,stui.stj.usual,stui.stj.papsco,stui.stj.emp,stui.stj.score,stui.stj.sco); fclose(fp1); fclose(fp2); printf_back();(4)排序模块【流程图】【程序】/*排序模快*/void orde()/*对每个学生的成绩按学分或综合得分排序函数*/ int i,j,f,n,w1; struct stud t; system(cls); n=open_fp();/*调用将文件里的
22、内容输到结果体函数,并得到学生个数*/ printf(Choice whitch methud do you wantnnt1).Orde by scoret2).Orde by sconn); printf(please input the number witch you want delete: bb); scanf(%d,&w1); if(w1=1) for(i=0;in;i+)/*对每个学生的成绩综合得分排序*/ for(f=1;fk;f+) for(j=0;jstui.stj+1.score) exchange(&t,&stui.stj); exchange(&stui.stj,&
23、stui.stj+1); exchange(&stui.stj+1,&t); if(w1=2) for(i=0;in;i+) /*对每个学生的成绩按学分排序*/ for(f=1;fk;f+) for(j=0;jstui.stj+1.sco) exchange(&t,&stui.stj); exchange(&stui.stj,&stui.stj+1); exchange(&stui.stj+1,&t); save(n,1); /*排序后调用保存信息函数*/ for(i=0;in;i+)/*排序后输出每个学生信息*/ printf(nnnum:%stname:%stmale:%stroom:%sttelunm:%snn,stui.num, stui.name,stui.male,stui.room,stui.telnum); for(j=0;jpro_num,t-pro_num); strcpy(s-pro_name,t-pro_name); s-x=t-x; s-usual=t-usual; s-papsco=t-papsco; s-emp=t-emp; s-score=t-score; s-sco=t-sco;void printf_back() /*一个任务结束时返回开始*/ void menu(); printf(nntSuccessful._