C语言学生成绩管理系统_第1页
C语言学生成绩管理系统_第2页
C语言学生成绩管理系统_第3页
C语言学生成绩管理系统_第4页
C语言学生成绩管理系统_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录问题的描述总体设计思路功能模块的具体设计功能模块的调试及测试五、参考资料六、分工与合作七、总结一问题的描述1.项目开发的目标:程序运行后,能够在屏幕上显示主菜单,查询某学生的成绩,修改某学生的成绩,以及添加新的学生成绩记录,能够在完成运行后退出程序。2.基本要求 1)能够实现学号、成绩、专业和五门功课成绩的录入;2)能够实现添加、删除、修改学生记录;3)能够计算某学生的总分和平均分;4)能够按照总分排序输出。二总体设计思路本系统首先设计出了主函数,然后根据去要实现的功能分别设计了,排列、删除、查找、修改、添加功能的子函数。排列函数执行前先执行构造链表的子函数,然后通过返回的链表首指针按总分排列、显示出学生记录。删除函数的设计是首先从文件内找到要删除的人,然后将其标志位置零,这样在其他子函数不会对该记录进行操作。查找是先打开文件,用一个字符串对比的方法找出用户要查找的人,然后打印出来。修改也是先打开文件,用一个字符串对比的方法找出用户要修改的人,并将该记录读入内存,进行修改,然后写入磁盘原位置。添加函数是通过追加方式打开文件,并写入一条记录,从而实现添加功能。下面是总的程序流程图: 开始 开始 执行init1()函数执行init1()函数执行chuangjian()函数 执行chuangjian()函数选择C 选择C调用retrieve1()函数调用makelist()函数调用retrieve2()函数调用system(cls)函数调用shanchu()函数调用xiugai2()函数调用xiugai1()函数调用调用retrieve1()函数调用makelist()函数调用retrieve2()函数调用system(cls)函数调用shanchu()函数调用xiugai2()函数调用xiugai1()函数调用tianjia()函数调用displaystu()函数调用displaylist()函数三.功能模块的具体设计1.界面分析 a.开始界面输入文件名并创建纪录:如果文件不存在则会进行创建。b.功能选择界面根据输入的字符进行不同的操作。c.查找功能:通过n:用姓名来查找学生的成绩记录通过m:用学号来查找学生的成绩记录d.排列功能:通过s按总分从高到低排列输出学生成绩记录e.添加功能:通过a添加学生成绩记录f.修改功能界面:通过x按姓名修改学生记录或通过y按学号修改学生记录d.删除功能界面:g.通过p清除屏幕数据并重新出现提示信息2.程序设计主要内容.#include<stdio.h>#include<string.h>#include<stdlib.h>#include<windows.h>#defineSWN5/*课程数*/#defineNAMELEN20/*姓名最大字符数*/#defineMAJORLEN20/*专业名称最大字符数*/#defineCODELEN10/*学号最大字符数*/#defineFNAMELEN80/*文件名最大字符数*/#defineBUFLEN80/*缓冲区最大字符数*/charsubject[SWN][NAMELEN+1]={"高等数学","线性代数","c语言","大学物理","概率论"};charstuf[FNAMELEN];inttotal[SWN];/*各课程总分*/intn;longk;charz;/*声明结构体*/structrecord{ charname[NAMELEN+1]; charmajor[MAJORLEN+1]; charcode[CODELEN+1]; intmarks[SWN]; inttotal; floatave; intflag;}stu;structnode{charname[NAMELEN+1];/*姓名*/charmajor[MAJORLEN+1];charcode[CODELEN+1];/*学号*/intmarks[SWN];/*各课程成绩*/inttotal;/*总分*/floatave;intflag;structnode*next;/*后续表元指针*/}*head;/*链表首指针*//*添加学生记录*/inttianjia(char*stuf){ inti,j; FILE*fp; structrecords; fp=fopen(stuf,"a+"); printf("\n请输入您想要添加的记录数:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n"); s.total=0; printf("请输入第%d名学生的姓名:",i+1); scanf("%s",&); printf("请输入该学生的专业:"); scanf("%s",&s.major); printf("请输入该学生的学号:"); scanf("%s",&s.code); s.flag=1; for(j=0;j<SWN;j++) { printf("请输入%s分数:",subject[j]); scanf("%d",&s.marks[j]); s.total=s.total+s.marks[j]; } s.ave=s.total/5.0; fwrite(&s,sizeof(structrecord),1,fp); } fclose(fp);}/*按姓名修改学生记录*/intxiugai1(char*stuf,char*buf){ intj; FILE*fp; structrecords; charc; if((fp=fopen(stuf,"r+"))==NULL) { printf("Can'topenfile%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if(strcmp(,buf)==0) { if(s.flag==0) {printf("学生%s不在文件%s中.\n",buf,stuf);break;} k=ftell(fp); fseek(fp,k-(long)(sizeof(structrecord)),0); printf("输入一个命令修改下列项目,或退出修改!\n"); puts("n:姓名."); puts("m:专业."); puts("c:学号."); puts("u:高等数学成绩."); puts("v:线性代数成绩."); puts("z:c语言成绩."); puts("x:大学物理成绩."); puts("y:概率论成绩"); puts("p:清屏"); puts("q:退出修改."); while(1) { puts("请输入命令来修改记录或退出修改!:"); getchar(z); scanf("%c",&c);/*输入选择命令*/ if(c=='q'||c=='Q') { system("cls"); printf("\n"); puts("==========."); puts("结束修改!"); puts("=========="); init(); printf("\n"); puts("现在您可以通过输入一个命令来管理这些记录"); puts("n:通过姓名查找成绩记录."); puts("c:通过学号查找成绩记录."); puts("s:按总分从高到低列出所有成绩记录."); puts("a:添加学生记录."); puts("x:按姓名修改学生记录."); puts("y:按学号修改学生记录."); puts("d:按姓名删除学生记录."); puts("p:清屏."); puts("q:退出系统!"); break;/*q,结束程序运行*/ } switch(c) { case'N': case'n': printf("请输入新姓名:\n"); scanf("%s",&);printf("\n");break; case'M': case'm': printf("请输入新专业:\n"); scanf("%s",&s.major);printf("\n");break; case'C': case'c': printf("请输入新学号:\n"); scanf("%s",&s.code);printf("\n");break; case'u': case'U': printf("请输入新成绩:\n"); scanf("%d",&s.marks[0]);printf("\n");break; case'v': case'V': printf("请输入新成绩:\n"); scanf("%d",&s.marks[1]);printf("\n");break; case'z': case'Z': printf("请输入新成绩:\n"); scanf("%d",&s.marks[2]);printf("\n");break; case'x': case'X': printf("请输入新成绩:\n"); scanf("%d",&s.marks[3]);printf("\n");break; case'y': case'Y': printf("请输入新成绩:\n"); scanf("%d",&s.marks[4]);break; case'p': case'P': system("cls"); printf("输入一个命令修改下列项目,或退出修改!\n"); puts("n:姓名."); puts("m:专业."); puts("c:学号."); puts("u:高等数学成绩."); puts("v:线性代数成绩."); puts("z:c语言成绩."); puts("x:大学物理成绩."); puts("y:概率论成绩"); puts("p:清屏"); puts("q:退出修改.");break; } } s.total=0; for(j=0;j<SWN;j++) s.total=s.total+s.marks[j]; s.ave=s.total/5.0; fwrite(&s,sizeof(structrecord),1,fp); fclose(fp); } } }/*按学号修改学生记录*/intxiugai2(char*stuf,char*buf){ intj; FILE*fp; structrecords; charc; if((fp=fopen(stuf,"r+"))==NULL) { printf("Can'topenfile%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if(strcmp(s.code,buf)==0) { if(s.flag==0) {printf("学生%s不在文件%s中.\n",buf,stuf);break;} k=ftell(fp); fseek(fp,k-(long)(sizeof(structrecord)),0); printf("输入一个命令修改下列项目,或退出修改!\n"); puts("n:姓名."); puts("m:专业."); puts("c:学号."); puts("u:高等数学成绩."); puts("v:线性代数成绩."); puts("z:c语言成绩."); puts("x:大学物理成绩."); puts("y:概率论成绩"); puts("p:清屏"); puts("q:退出修改."); while(1) { puts("请输入命令来修改记录或退出修改!:"); getchar(z); scanf("%c",&c);/*输入选择命令*/ if(c=='q'||c=='Q') { system("cls"); printf("\n"); puts("==========."); puts("结束修改!"); puts("=========="); init(); printf("\n"); puts("现在您可以通过输入一个命令来管理这些记录"); puts("n:通过姓名查找成绩记录."); puts("c:通过学号查找成绩记录."); puts("s:按总分从高到低列出所有成绩记录."); puts("a:添加学生记录."); puts("x:按姓名修改学生记录."); puts("y:按学号修改学生记录."); puts("d:按姓名删除学生记录."); puts("p:清屏."); puts("q:退出系统!"); break;/*q,结束程序运行*/ } switch(c) { case'N': case'n': printf("请输入新姓名:\n"); scanf("%s",&);printf("\n");break; case'M': case'm': printf("请输入新专业:\n"); scanf("%s",&s.major);printf("\n");break; case'C': case'c': printf("请输入新学号:\n"); scanf("%s",&s.code);printf("\n");break; case'u': case'U': printf("请输入新成绩:\n"); scanf("%d",&s.marks[0]);printf("\n");break; case'v': case'V': printf("请输入新成绩:\n"); scanf("%d",&s.marks[1]);printf("\n");break; case'z': case'Z': printf("请输入新成绩:\n"); scanf("%d",&s.marks[2]);printf("\n");;break; case'x': case'X': printf("请输入新成绩:\n"); scanf("%d",&s.marks[3]);printf("\n");break; case'y': case'Y': printf("请输入新成绩:\n"); scanf("%d",&s.marks[4]);printf("\n");break; case'P': case'p': system("cls"); printf("输入一个命令修改下列项目,或退出修改!\n"); puts("n:姓名."); puts("m:专业."); puts("c:学号."); puts("u:高等数学成绩."); puts("v:线性代数成绩."); puts("z:c语言成绩."); puts("x:大学物理成绩."); puts("y:概率论成绩"); puts("p:清屏"); puts("q:退出修改.");printf("\n");break; } } s.total=0; for(j=0;j<SWN;j++) s.total=s.total+s.marks[j]; s.ave=s.total/5.0; fwrite(&s,sizeof(structrecord),1,fp); fclose(fp); } }return0; }/*删除学生记录*/intshanchu(char*stuf,char*buf){ intnum=0,j; FILE*fp; structrecords; charc; if((fp=fopen(stuf,"r+"))==NULL) { printf("Can'topenfile%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if(strcmp(,buf)==0) { k=ftell(fp); fseek(fp,k-(long)(sizeof(structrecord)),0); s.flag=0; fwrite(&s,sizeof(structrecord),1,fp); fclose(fp); break; } } puts(" ****************"); puts(" *删除记录成功*"); puts(" ****************"); printf("\n"); return0;}/*构造链表*/structnode*makelist(char*stuf){ FILE*fp;structrecords;structnode*p,*u,*v,*h;inti;if((fp=fopen(stuf,"r"))==NULL){ printf("Can'topenfile%s.\n",stuf); returnNULL;}h=NULL;p=(structnode*)malloc(sizeof(structnode));while(fread((structrecord*)p,sizeof(structrecord),1,fp)==1){ v=h; while(v&&p->total<=v->total) { u=v; v=v->next; } if(v==h) h=p; else u->next=p; p->next=v; p=(structnode*)malloc(sizeof(structnode));}free(p);fclose(fp);returnh;}/*创建学生记录*/intchuangjian(){ structrecords; charcj; intn,i,j; FILE*fp; label:printf("请输入您要操作的记录文件名:"); scanf("%s",stuf); if((fp=fopen(stuf,"r"))==NULL) { printf("该文件不存在,您是否要创建它?(Y/N)"); getchar(); cj=getchar(); if(cj=='Y'||cj=='y') { fp=fopen(stuf,"w"); printf("\n请输入您想要创建的记录数:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n"); s.total=0; printf("请输入第%d名学生的姓名:",i+1); scanf("%s",&); printf("请输入该学生的专业:"); scanf("%s",&s.major); printf("请输入该学生的学号:"); scanf("%s",&s.code); s.flag=1; for(j=0;j<SWN;j++) { printf("请输入%s分数:",subject[j]); scanf("%d",&s.marks[j]); s.total=s.total+s.marks[j]; s.ave=s.total/5.0; } fwrite(&s,sizeof(structrecord),1,fp); } fclose(fp); } elsegotolabel; } getchar(); return0;}/*顺序显示链表各表元*/intdisplaylist(structnode*h){while(h!=NULL){ displaystu((structrecord*)h); printf("\n"); h=h->next;}return0;}/*显示学生记录*/intdisplaystu(structrecord*p){ if(p->flag==1) { inti; printf("\nName:%s\n",p->name); printf("Major:%s\n",p->major); printf("Code:%s\n",p->code); printf("Marks:\n"); for(i=0;i<SWN;i++) printf("%-15s:%4d\n",subject[i],p->marks[i]); printf("Total:%4d\n",p->total); printf("Ave:%6.2f%\n",p->ave); } return0;}/*按姓名查找记录*/intretrieve1(char*stuf,char*buf){ FILE*fp; intc=0; structrecords; if((fp=fopen(stuf,"r"))==NULL) { printf("无法打开文件%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if((strcmp(,buf)==0)&&s.flag==1) { displaystu(&s); c++; } } fclose(fp); if(c==0) printf("学生%s不在文件%s中.\n",buf,stuf); return1;}/*按学号查找记录*/intretrieve2(char*stuf,char*buf){ FILE*fp; intc=0; structrecords; if((fp=fopen(stuf,"r"))==NULL) { printf("无法打开文件%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if((strcmp(s.code,buf)==0)&&s.flag==1) { displaystu(&s); c++; } } fclose(fp); if(c==0) printf("学生%s不在文件%s中.\n",buf,stuf); return1;}/*操作函数*/intoperate(){ inti,j; charc,buf[BUFLEN]; printf("\n"); puts("现在您可以通过输入一个命令来管理这些记录"); puts("n:通过姓名查找成绩记录."); puts("c:通过学号查找成绩记录."); puts("s:按总分从高到低列出所有成绩记录."); puts("a:添加学生记录."); puts("x:按姓名修改学生记录."); puts("y:按学号修改学生记录."); puts("d:按姓名删除学生记录"); puts("p:清屏."); puts("q:退出系统!"); while(1) { puts("请输入命令:"); scanf("%c",&c);/*输入选择命令*/ if(c=='q'||c=='Q') { printf("\n"); system("cls"); puts("*********************"); puts("*感谢使用*"); puts("**"); puts("*再见!!*"); puts("*********************"); break;/*q,结束程序运行*/ } switch(c) { case'n':/*按学生的姓名寻找记录*/ case'N': printf("请输入您想要查找的学生的姓名:"); scanf("%s",buf); retrieve1(stuf,buf); break; case'c':/*按学生的学号寻找记录*/ case'C': printf("请输入您想要查找的学生的学号:"); scanf("%s",buf); retrieve2(stuf,buf); break; case's':/*按总分从高到低排列显示*/ case'S': if((head=makelist(stuf))!=NULL) displaylist(head); break; case'A':/*添加学生记录*/ case'a':tianjia(stuf);break; case'X': case'x': printf("请输入您想要修改的学生记录的姓名:"); scanf("%s",buf); printf("\n"); xiugai1(stuf,buf);break;/*按姓名修改学生记录*/ case'Y': case'y': printf("请输入您想要修改的学生记录的学号:"); scanf("%s",buf); printf("\n"); xiugai2(stuf,buf);break;/*按学号修改学生记录*/ case'D': case'd': printf("请输入您想要删除的学生记录的姓名:"); scanf("%s",buf); shanchu(stuf,buf);break;/*按姓名删除学生记录*/ case'P': case'p': system("cls"); init(); printf("\n"); puts("现在您可以通过输入一个命令来管理这些记录"); puts("n:通过姓名查找成绩记录."); puts("c:通过学号查找成绩记录."); puts("s:按总分从高到低列出所有成绩记录."); puts("a:添加学生记录."); puts("x:按姓名修改学生记录."); puts("y:按学号修改学生记录."); puts("d:按姓名删除学生记录"); puts("p:清屏."); puts("q:退出系统!"); } }return0;}intinit1(){ printf("==============================================\n"); printf("欢迎使用学生成绩管理系统!\n\n"); printf("请先输入一个需要操作的文件名,若该文件不存在\n\t\t则会进行创建!如:D:\\123.txt\n"); printf("==============================================\n\n"); return0;}intinit(){ printf("==============================================\n\n"); printf("欢迎使用学生成绩管理系统!\n\n"); printf("==============================================\n\n"); return0;} intmain(){ init1(); chuangjian(); operate(); return0;}3.算法流程图a.主函数模块流程图 执行init1()函数执行init1()函数开始 执行chuangjian()函数 执行chuangjian()函数 执行operate执行operate()函数结束是I结束是If语句判断否否 选择C调用retrieve1()函数调用makelist()函数调用retrieve2()函数调用system(cls)函数调用shanchu()函数调用xiugai2()函数调用xiugai1()函数调用选择C调用retrieve1()函数调用makelist()函数调用retrieve2()函数调用system(cls)函数调用shanchu()函数调用xiugai2()函数调用xiugai1()函数调用tianjia()函数调用displaystu()函数调用displaylist()函数b.retrieve1(),retrieve2()查找函数流程图开始 开始IIf语句判断执行printf()函数是执行printf()函数是结束结束否否while语句判断while语句判断IIf语句判

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论