c语言课程设计网_学生成绩管理系统4(20页).doc
-c语言课程设计网_学生成绩管理系统4-第 21 页(一)、 课程设计题目学生成绩管理系统的设计与实现(二)、 课程设计目的1、 进一步掌握和利用C语言进行程设计的能力;2、 进一步理解和运用结构化程设计的思想和方法;3、 初步掌握开发一个小型实用系统的基本方法;4、 学会调试一个较长程序的基本方法;5、 学会利用流程图或N-S图表示算法;6、 掌握书写程设计开发文档的能力(书写课程设计报告);(三)、 设计内容1、每一条记录包括一个学生的学号、姓名、3门课成绩、平均成绩。2、输入功能:可以一次完成若干条记录的输入。3、显示功能:完成全部学生记录的显示。4、查找功能:完成按姓名查找学生记录,并显示。5、排序功能:按学生平均成绩进行排序。6、插入功能:按平均成绩高低插入一条学生记录。7、将学生记录存在文件score中。8、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!(四)、 设计要求1、 用C语言实现系统;2、 利用结构体数组实现学生成绩的数据结构设计;3、 系统具有增加,查询,插入,排序等基本功能;4、 系统的各个功能模块要求用函数的形式实现;5、 完成设计任务并书写课程设计报告。6、 将学生成绩信息存在文件中。(五)、提交材料1、课程设计报告1)课程设计题目、内容、要求。2)总体设计(包含几大功能模块)。3)详细设计(各功能模块的具体实现算法流程图)4)数据结构设计描述,各模块(函数)的功能介绍,参数说明等。5)调试分析(包含各模块的测试用例,及测试结果。)6)总结(课程设计完成了哪些功能,还有哪些地方需要改进,及通过一周的课程设计有何收获,调试程序的体会等)二:本程序共有八个功能与数据结构说明:学生记录的输入(一次性输入,输入个数由用户决定,最大可容纳80记录,最大数可以在源程序中改) 。追加学生记录。(追加后不能超过最在值80)。修改记录。删除记录。浏览全部记录。查找记录(按姓名查找)。插入记录。对记录进行排序(按平均成绩排序)。退出。10数据结构是这样的:学号只能由数字字符组成,最大可以个字符;姓名由字符组成,最大可以个字符;三门科目分数都是整型;平均成绩是实型。11程序中定义了学生的容量为个。容量可以在源程序宏定义中改,本程序宏定义#define N 50#include<string.h>#include<stdio.h>/*控制学生记录的容量*/#define N 50struct studentchar num11; char name20; int score3; float ave;stuN;/*全新保存函数*/save(int n) /*保存函数,保存n个记录*/FILE *fp; int i; if(fp=fopen("score.txt","wb")=NULL) /*以输出打开方式,在此前的记录被覆盖*/ printf("nCannot open filen"); return NULL; for(i=0;i<n;i+) if(stui.ave!=0) /*stui.ave=0表此记录已删除*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("file write errorn"); fclose(fp); /*加载记录或可以计算记录个数的函数*/load() /*加载记录或可以计算记录个数的函数*/FILE *fp; int i; if(fp=fopen("score.txt","rb")=NULL) /*以输出打开方式,在此前的记录被覆盖*/ printf("nCannot open filen"); return NULL; for(i=0;!feof(fp);i+) fread(&stui,sizeof(struct student),1,fp); fclose(fp); return(i-1); /*返回记录个数*/*一个任务结束时的选择浏览还是返回的函数*/void printf_back() /*一个任务结束时的选择浏览还是返回*/int k,w; printf("nntSuccessful. _nn"); printf("What do you want to do? nnt1).Browse all nowt2).Back: bb"); scanf("%d",&w); if(w=1) browse(); else menu();/*显示数据结构项目函数*/void printf_face() /*显示数据结构项目*/printf("ntNO. name score1 score2 score3 averagen");average(int i) /*对第i个记录的分数求平均值*/int j,sum; for(sum=0,j=0;j<3;j+) sum+=stui.scorej; stui.ave=sum/3.0;/*学号输入函数*/no_input(int i,int n) /*i表示第i个的学生信息,n表示比较到第n个学生*/int j,k,w1; do w1=0; printf("NO.:"); scanf("%s",stui.num); for(j=0;stui.numj!='0'j+) /*学号输入函数,作了严格规定*/ if(stui.numj<'0'|stui.numj>'9') /*判断学号是否为数字*/ puts("Input error! Only be made up of (0-9).Please reinput!n"); w1=1;break; if(w1!=1) for(k=0;k<n;k+) /*比较到第n个学生*/ /*排除第i个学生记录即你要修改的*/ if(k!=i&&strcmp(stuk.num,stui.num)=0) /*判断学号是否有雷同*/ puts("This record is exist. please reinput!n"); w1=1;break; while(w1=1);/*对分数输入*/score_input(int i)int j; for(j=0;j<3;j+) printf("score %d:",j+1); scanf("%d",&stui.scorej); /*输入一个记录函数*/input(int i) /*输入一个记录函数*/ no_input(i,i); /*调用学号输入函数*/ printf("name:"); scanf("%s",stui.name); score_input(i); /*调用分数输入函数*/ average(i); /*调用求平均值函数*/ /*显示一个记录的函数*/printf_one(int i) /*显示一个记录的函数*/int j; printf("%11s %-17s",stui.num,stui.name); for(j=0;j<3;j+) printf("%9d",stui.scorej); printf("%n",stui.ave);void puts_() /*显出-函数*/puts("n-");/*修改记录函数*/modify_data(int i,int n) /*修改数据函数,修改第i个记录*/int c,w1; do /*输入选择作个判断*/ puts("nmodify by =>nn 1).NO. 2.name 3).score1 4).score2n 5).score3 6).all score 7).all data 8).cancel and back"); printf("Which you needed?: bb"); scanf("%d",&c); if(c>8|c<1) puts("nChoice error! Please again!"); /*判断选择是否错误,若是则重新选择性*/ getchar(); /*当输入是字符时可以防止死循环*/ while(c>8|c<1); do switch(c) /*选择要修改的项目*/ case 1:no_input(i,n);break; /*调用学号输入函数*/ case 2:printf("name:");scanf("%s",stui.name);break; case 3:printf("score1:");scanf("%d",&stui.score0);break; case 4:printf("score2:");scanf("%d",&stui.score1);break; case 5:printf("score3:");scanf("%d",&stui.score2);break; case 6:score_input(i);break; /*调用分数输入函数*/ case 7:input(i);break; /*调用输入整条学生记录*/ case 8:menu(); /*直接返回主介面*/ if(c>2&&c<7) average(i); /*调用求平均值函数*/ puts("nNow:n"); printf_face(); /*调用显示数据结构项目函数*/ printf_one(i); /*修改后的记录让用户确认*/ printf("nAre you sure?nnt1).Sure 2).No and remodify 3).Back without save in this time bb"); /*是否确定*/ scanf("%d",&w1); /*选择2则表示这次修改错误要重新修改*/ while(w1=2); return(w1); /*返回控制值*/ /*输入模块*/enter() /*输入模块*/int i,n; printf("How many students(0-%d)?:",N); scanf("%d",&n); /*要输入的记录个数*/ printf("nEnter data nownn"); for(i=0;i<n;i+) printf("nInput %dth student record.n",i+1); input(i); /*调用输入函数*/ if(i!=0) save(n); /*调用保存函数*/ printf_back(); /*一个任务结束时让用户选择是浏览还是返回*/ /*追加模块*/add() /*追加模块*/int i,n,m,k; FILE *fp; n=load(); printf("How many students are you want to add(0-%d)?:",N-n); scanf("%d",&m); /*输入要追加的记录个数*/ k=m+n; for(i=n;i<k;i+) printf("nInput %dth student record.n",i-n+1); input(i); /*调用输入函数*/ if(fp=fopen("score.txt","ab")=NULL) /*以ab方式打开文件,追加保存*/ printf("cannot open filen"); return; for(i=n;i<k;i+) /*输入出到文件*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("file write errorn"); fclose(fp); printf_back(); /*一个任务结束时的选择浏览还是返回*/ /*修改模块*/modify() /*修改模块*/struct student s; FILE *fp; int i,n,k,w0=1,w1,w2=0; n=load(); do clrscr(); k=-1; /*给用户看全部记录以便确认要修改的记录*/ puts_(); /*显示-*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) if(i!=0)&&(i%10=0) /*目的是分屏显示*/ printf("nnRemember NO.which needed modify. pass any key to contiune . . ."); getch(); puts("nn"); printf_one(i); /*调用显示一个记录的函数*/ puts_(); do printf("nnEnter NO. that you want to modify! NO.:"); scanf("%s",s.num); /*输入要修改的数据的学号*/ for(i=0;i<n;i+) /*查找要修改的数据*/ if(strcmp(s.num,stui.num)=0) k=i; /*找到要修改的记录*/ s=stui; /*把stui(即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/ if(k=-1) printf("nnNO exist! please again"); while(k=-1); /*当K=-1表示没有找到*/ printf_face(); /*调用显示数据结构项目函数*/ printf_one(k); /*调用显示一个记录的函数*/ w1=modify_data(k,n); /*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/ if(w1=1) /*W1等于1时则表示用户确定这次修改*/ printf("nSuccessful _.nnAre you modify another?nnt1).Yes 2).Back with savet bb"); scanf("%d",&w0); w2=1; /*来控制保存,使w2=1是标记已有过修改*/ else w0=0; if(w2=1) stuk=s; /*走到这里是由于用户没有确认这次修改(在调用修改函数w1=modify_data(k,n);时没有确认). 使W0=0,为了让终止循环, stuk=s,则把备份的s恢复给stuk(即当次修改的),这样的好处是确保在此之前修改过的成功保存,而本次(用户没有确认的)不修改*/ if(w0!=1&&w2=1) /*W0不等于1则表示正常返回,w2=1表示在此之前有过修改,这时就保存用户已确认修改的并返回*/ save(n); /*w2不等于1表示在此次之前没有修改过(即:第一次),而又反悔这次修改,则不保存返回*/ while(w0=1); menu();/*删除模块*/del() /*删除模块*/struct student s; FILE *fp; int i,j,n,k,c,w0=1; n=load(); do clrscr(); k=-1; /*给用户看全部记录以便确认要删除的记录*/ puts_(); printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) if(stui.ave!=0) if(i!=0)&&(i%10=0) /*目的是分屏显示,每10个一屏*/ printf("nnRemember NO. which needed del. pass any key to contiune . . ."); getch(); puts("nn"); printf_one(i); /*调用显示一个记录的函数*/ puts_(); do printf("nnEnter NO. that you want to Delete! NO.:"); scanf("%s",s.num); /*输入要修改的数据的学号*/ for(i=0;i<n;i+) /*查找要修改的数据*/ if(strcmp(s.num,stui.num)=0) k=i; /*找到要修改的记录的下标赋给K*/ s=stui; if(k=-1) printf("nnNO exist! please again"); /*K=-1,表示没有找到相同之的*/ while(k=-1); puts("n"); printf_face(); /*调用显示数据结构项目函数*/ printf_one(k); /*调用显示一个记录的函数*/ printf("nAre you sure?nt1).sure 2).no and del another 3).back without save all bb"); scanf("%d",&c); if(c=1) stuk.ave=0; /*stuk.ave=0用来标识这个记录是要删除的.保存时则不保存stuk.ave=0的数据*/ printf("nnSuccessful _.nnAre you again?nt1).again 2).back to menut bb"); /*问是否继续*/ scanf("%d",&w0); if(c=3) w0=0; /*w0=0不删除直接返回*/ if(w0!=1&&c!=3) /*只有当确认删除后返回才保存,不删除直接返回则不保存,且不保存在此之前删除过的记录*/ save(n); while(w0=1); menu(); /*返回主介面*/*浏览(全部)模块*/browse() /*浏览(全部)模块*/int i,j,n; n=load(); /*加载记录*/ clrscr(); puts_(); printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) if(i!=0)&&(i%10=0) /*目的是分屏显示*/ printf("nnPass any key to contiune . . ."); getch(); puts("nn"); printf_one(i); /*调用显示一个记录的函数*/ puts_(); printf("tThere are %d record.n",n); printf("nPass any key to back . . ."); getch(); /*按任意健*/ menu(); /*查找模块*/search() /*查找模块*/int i,n,k,w1=1,w2,w3,w4; struct student s; n=load(); do do k=-1; printf("nnEnter name that you want to search! name:"); scanf("%s",s.name); /*输入要修改的数据的学号*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) /*查找要修改的数据*/ if(strcmp(s.name,stui.name)=0) k=i; /*找到要修改的记录*/ printf_one(k);break; /*调用显示一个记录的函数*/ if(k=-1) printf("nnNO exist! please"); printf("nnAre you again?nt1).again 2).NO and back bb"); scanf("%d",&w1); while(k=-1&&w1=1); /*如果w1不等于1则直接返回*/ w4=0;w3=0; if(k!=-1) /*k不等于-1表示找到,如果找到则选择操作*/ printf("nnWhat do you want to do?nt1).Search another 2).Modify 3).Delete 4).Back menu bb"); scanf("%d",&w2); switch(w2) case 2:w3=modify_data(k,n);break; /*调用修改数据函数*/ case 3:printf("nAre you sure?nt1).Sure 2).No and back bb"); scanf("%d",&w4); if(w4=1) stuk.ave=0; /*表示删除*/ break; if(w3=1|w4=1) save(n); printf("nnSuccessful. _."); printf("nnWhat do you want to do?nt1).Search another 2).Back bb"); scanf("%d",&w2); while(w2=1); menu();/*插入模块*/insert() /*插入模块*/int i,j,n,c; struct student s; n=load(); puts("nInput one data.n"); do input(n); /*输入到第n个记录,即插入到最后*/ printf_face(); printf_one(n); printf("nnAre you sure?nnt1).Suret2).cancel snd againt3).Back withuot save bb"); scanf("%d",&c); if(c=1) for(j=0;j<n;j+) /*用起泡法排序*/ for(i=n;i>j;i-) if(stui.ave>stui-1.ave) s=stui-1;stui-1=stui;stui=s; save(n+1); printf_back(); else if(c!=2) menu(); while(c=2); /*排序模块(按平均成绩)*/order() /*排序模块(按平均成绩)*/int i,j,k,n; struct student s; n=load(); for(i=0;i<n-1;i+) /*选择法排序*/ k=i; for(j=i+1;j<n;j+) if(stuj.ave>stuk.ave) k=j; s=stui;stui=stuk;stuk=s; save(n); puts("nn"); printf_back(); /*主界面*/menu() /*主界面*/int n,w1; do clrscr(); /*清屏*/ puts("nttt Copy right by CHEN LIN BIN!"); puts("tttt 24/06/2005!nn"); puts("tt*MENU*nn"); puts("tttt1.Enter new data"); puts("tttt2.Addition data"); puts("tttt3.Modify data"); puts("tttt4.Delete data"); puts("tttt5.Browse all"); puts("tttt6.Search by name"); puts("tttt7.Insert data"); puts("tttt8.Order by average"); puts("tttt9.Exit"); puts("nntt*n"); printf("Choice your number(1-9): bb"); scanf("%d",&n); if(n<1|n>9) /*对选择的数字作判断*/ w1=1;getchar(); else w1=0; while(w1=1); /*选择功能*/ switch(n) case 1:enter();break; /*输入模块*/ case 2:add();break; /*追加模块*/ case 3:modify();break; /*修改模块*/ case 4:del();break; /*删除模块*/ case 5:browse();break; /*浏览模块*/ case 6:search();break; /*查找模块*/ case 7:insert();break; /*插入模块*/ case 8:order();break; /*排序模块*/ case 9:exit(0); /*退出*/ /*主函数*/main()menu();点击此处下载报告