1、C语言课程设计报告: 学生成绩管理系统 系统需求 一、 当前学生信息:通过结构体 struct student 来保存学生的姓名,学号,性别,语文,数学,英语和计算机等等相关信息,并且通过cin函数来进行给当前学生输入初始信息. 二、学生成绩查询: 输入一个学号, 在文件中查找此学生, 若找到则输出此学生的全部信息和成绩; 若找不到则输出查找失败的信息. 同时也可以全部把各科的平均成绩,最高和最低分输出。 三、新生插入 :通过给该生的学号来和原班上的学生的学号比较大小,若大就在后,若小则靠前排,将此生的信息保存下来。 四、输出全部学生信息和全部学生成绩。 五、退出系统. 六、附加说明:系统将来
2、完善的功能有:可以通过性别来模糊查询,也可以通过姓名的姓来先进行模糊查询,以便后面精确查找。 总体设计 一、 仔细阅读系统要求,首先将此系统化分为如下模块(即如下函数) 1、输入初始的学生信息:其中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算机等相关信息;可用函数cin(stu *p1)来实现此操作。 2、查询模块:可用 stu *lookdata(stu *p1) 来实现。找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。 3、插入模块:可用 insert( )函数来实现。其中通过学号的大小来比较的,并且以此来排序。 4、输出学生的信息以及成绩:通过学生的姓名
3、来查看学生的语文、数学、英语和计算机等相关成绩,同时也可以分别通过caverage() 、maverage() 、eaverage() 和comaverage() 来输出语文、数学、英语和计算机等成绩的平均分数、最高和最低分数。 5、退出系统:可用一个函数exit()来实现,首先将信息保存到文件中,释放动态创建的内存空间,再退出此程序。 二、系统主模块结构图: 详细设计 一、 界面设计 此系统界面采用图形和数字化菜单设计。 主界面设计如下: 学生成绩管理系统 请选择相应的数字执行相应的功能: 1:是否输入其他数据 2:查看数据 3:插入数据 4:查找数据 5:更新数据 6:保留数据 7:显示或
4、打印数据 8:语文成绩状况 9:数学成绩状况 10:英语成绩状况 11:计算机成绩状况 12:? 13:退出系统 二、 数据结构设计: 程序设计中用到的结构体类型: 学生信息结构体类型: typedef struct student char nameMAX; int numMAX; char sexMAX; int chinese; int mathematic; int english; int computer; struct student *next; 程序代码: /原始密码是123456 #include“stdio.h“ #include“stddef.h“ #include“s
5、tddef.h“ #include“string.h“ #define MAX 10 typedef struct student /*定义结构体*/ char nameMAX; /*姓名*/ int numMAX; /* 学号*/ char sexMAX; /*性别*/ int chinese; /*语文*/ int mathematic; /* 数学*/ int english; /*英语*/ int computer; /*计算机*/ struct student *next; /*结构体指针*/ stu; stu *head; /*头指针*/ void print() /*显示或打印函
6、数*/ system(“cls“); printf(“tttScore Manage Systemn“); /*成绩管理系统*/ printf(“Enter Recordt“); /*输入数据*/ printf(“Displayt“); /*显示*/ printf(“Insertt“); /*插入数据*/ printf(“Questt“); /*访问数据*/ printf(“Updatet“); /*以前数据*/ printf(“Savet“); /*保留数据*/ printf(“Fresht“); /*更新数据*/ printf(“Chinese Averaget“); /*语文平均成绩*/
7、 printf(“Math Averaget“); /*数学平均成绩*/ printf(“English Averaget“); /*英语平均成绩*/ printf(“Computer Averaget“); /*计算机平均成绩*/ printf(“Quittn“); /*退出*/ void cin(stu *p1) /*输入相关数据的函数*/ printf(“Enter name:n“); scanf(“%s“, printf(“Enter num:n“); scanf(“%d“, printf(“Enter sex:n“); scanf(“%s“, printf(“Enter score:
8、n“); printf(“Enter chinese:n“); scanf(“%d“, printf(“Enter math:n“); scanf(“%d“, printf(“Enter English:n“); scanf(“%d“, printf(“Enter Computer:n“); scanf(“%d“, stu *cindata() /*其他数据是否继续输入的函数*/ stu *p1,*p2; int i=1; char ch; p1=(stu *)malloc(sizeof(stu); head=p1; while(i) cin(p1); printf(“Do you Want
9、to Continue?yes or no“); /*是否继续输入数据*/ ch=getchar(); ch=getchar(); if(ch=n|ch=N) i=0; p1-next=NULL; else p2=p1; p1=(stu *)malloc(sizeof(stu); p2-next=p1; return(p1-next); stu *lookdata(stu *p1) /*查看数据的函数*/ while(p1!=NULL) printf(“Num:%dt“,p1-num); printf(“Name:%st“,p1-name); printf(“Sex:%st“,p1-sex);
10、 printf(“n“); printf(“Chinese:%dt“,p1-chinese); printf(“Math:%dt“,p1-mathematic); printf(“English:%dt“,p1-english); printf(“Computer:%dt“,p1-computer); printf(“n“); p1=p1-next; return p1; void insert() /*通过比较学号来插入数据的函数*/ stu *p1,*p3,*p2; char ch; p1=head; p3=(stu *)malloc(sizeof(stu); p3-next=NULL;
11、if(head=NULL) head=p3; return; cin(p3); while(p1!=NULLp1=p1-next; if(p2=head) p3-next=head; head=p3; return; p3-next=p1; p2-next=p3; find(stu *p2) /*通过姓名查找查看数据的函数*/ char name20; int b=0; printf(“Enter the name of the student you want to find:“); /*通过姓名查看*/ scanf(“%s“,name); while(p2!=NULL) if(strcmp
12、(name,p2-name)=0) printf(“The data you want has be foundn“); printf(“ Name:%st“,p2-name); printf(“Num:%dt“,p2-num); printf(“sex%st“,p2-sex); printf(“n“); printf(“Chinese:%dt“,p2-chinese); printf(“Math:%dt“,p2-mathematic); printf(“English:%dt“,p2-english); printf(“Computer:%dt“,p2-computer); printf(“
13、n“); b=1; else if(b=0) printf(“sorry not find data!“); p2=p2-next; if(b=1) print(); printf(“Find onen“); else print(); printf(“Not findn“); void caverage() /*求各学生语文平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(“not data!“); else for(i=0;
14、p1!=NULL;i+,p1=p1-next) sum+=p1-chinese; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxchinese) max=p1-chinese; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-chinese) min=p1-chinese; printf(“Chinese Average:%f“,aver); printf(“Chinese Max:%f“,max); printf(“Chinese Min:%f“,min); void
15、maverage() /*求各学生数学平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(“not data!“); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-mathematic; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxmathematic) max=p1-mathematic; p1=head; fo
16、r(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-mathematic) min=p1-mathematic; printf(“Mathe Average:%f“,aver); printf(“Mathe Max:%f“,max); printf(“Mathe Min:%f“,min); void eaverage() /*求各学生英语平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(“not dat
17、a!“); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-english; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxenglish) max=p1-english; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-english) min=p1-english; printf(“English Average:%f“,aver); printf(“English Max:%f“,max); printf(“English
18、Min:%f“,min); void comaverage() /*求各学生计算机平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(“not data!“); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-computer; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxcomputer) max=p1-compu
19、ter; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-computer) min=p1-computer; printf(“Computer Average:%f“,aver); printf(“Computer Max:%f“,max); printf(“Computer Min:%f“,min); update(stu *p2) /*通过姓名查找来更新数据*/ char name10; /*p2为指向结构体struct student的指针*/ int b=0; printf(“Enter The Name“); /*输入姓名*/ s
20、canf(“%s“,name); while(p2!=NULL) if(strcmp(name,p2-name)=0) printf(“Find you datan“); scanf(“Name:%s“,p2-name); scanf(“Num:%s“,p2-num); scanf(“Sex:%s“,p2-sex); scanf(“Chinese:%d“,p2-chinese); scanf(“Math:%d“,p2-mathematic); scanf(“english:%d“,p2-english); scanf(“Computer:%d“,p2-computer); printf(“Su
21、ccess!“); b=1; else if(b=0) printf(“Sorry not Find data!“); p2=p2-next; if(b=0) print(); printf(“Sorry not Find data!“); else print(); printf(“Finish!“); save(stu *p2) /*保留数据函数*/ FILE *fp; char file10; printf(“Enter file name“); /*输入文件名*/ scanf(“%s“,file); fp=fopen(file,“w“); while(p2!=NULL) fprintf
22、(fp,“%s“,p2-name); fprintf(fp,“%s“,p2-num); fprintf(fp,“%s“,p2-sex); fprintf(fp,“%d“,p2-chinese); fprintf(fp,“%d“,p2-mathematic); fprintf(fp,“%d“,p2-english); fprintf(fp,“%d“,p2-computer); p2=p2-next; fclose(fp); char password7=“123456“; /*定义初始密码*/ void main() /*主函数*/ int choice; stu *p2; char s8; i
23、nt flag=0,i; /*标志项*/ int n=3; do printf(“Enter password:n“); scanf(“%s“,s); if(!strcmp(s,password) /*进行密码匹配验证*/ printf(“PASSnnn“); flag=1; break; else printf(“Error Enter again:n“); n-; while(n0); if(!flag) printf(“you have Enter 3 times!“); /*输入密码超过了3次! */ exit(0); /*自动退出*/ /*密码验证成功后进入的界面*/ printf(
24、“tttn“); /*操作界面*/ printf(“ttWelcom to the Misn“); printf(“Author:-tClass:-tNum:-n“); /*作者,班级和号码*/ printf(“Adress:HGn“); /*地址*/ printf(“%n“); printf(“ttEnter OP:n“); printf(“nnnn“); printf(“=tt=n“); printf(“=tt=n“); printf(“ttEnter the MIS yes or non“); /*问进入系统与否*/ scanf(“%d“, if(choice=n|choice=N) e
25、xit(1); print(); while(1) printf(“Enter choice:“); scanf(“%d“, if(i13) printf(“Enter num from 1 to 13:n“); /*再从1-13中进行选择*/ exit(1); switch(i) case 1: p2=cindata(); /*其他数据是否继续输入的函数*/ break; case 2: p2=lookdata(head); /*查看数据的函数*/ break; case 3: insert(); /*通过比较学号来插入数据的函数*/ break; case 4: find(head); /
26、*通过姓名查找查看数据的函数*/ break; case 5: update(head); /*通过姓名查找来更新数据*/ break; case 6: save(head); /*保留数据函数*/ break; case 7: print(); /*显示或打印函数*/ break; case 8: caverage(); /*求各学生语文平均分、最高和最低分成绩的函数*/ break; case 9: maverage(); /*求各学生数学平均分、最高和最低分成绩的函数*/ break; case 10: eaverage(); /*求各学生英语平均分、最高和最低分成绩的函数*/ brea
27、k; case 11: comaverage(); /*求各学生计算机平均分、最高和最低分成绩的函数*/ break; case 12: ; /*空操作*/ case 13: exit(1); /*退出*/ break; scanf(“%d“, 程序中出现的问题及解决方法 问题一、学生初始信息模块: 其中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算机等相关信息;可用函数cin(stu *p1)来实现此操作。当正确输入存在的学生学号,系统进行判断时,提示不存在此学生。 解决办法及步骤: 1、一个个输出所有的学生的学号,检查文件中是否有此学生,发现有。 2、既然有此学生,那么检查循环
28、判断是否有此学生的语句发现没有错 3、输出用于循环检查语句中的学生信息,发现乱码 4、仔细分析乱码的原因,最后发现是变量的类型错误,错将学生类型的结构体指针变量定义为了其他类型的指针变量。 问题二、查询模块: 可用stu *lookdata(stu *p1) 来实现。找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。当正确输入查找信息时,系统却不能够得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。 解决办法及步骤: 1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。 2、检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样的话,我们应当仔细输入查找信息。 问题三、插入模块: 可用 insert( )函数来实现。其中通过学号的大小来比较的,并且以此来排序。当我们输入插入信息时,系统却提示插入不进数据。 解决办法及步骤: 1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入插入信息看能否插入进去得到所要插入的学生信息以及学生的语文、数学、英语和计算机的成绩。 2、检查当我们在输入插入信息时,看是否我们输入的插入信息有