模板-学生成绩管理.docx_第1页
模板-学生成绩管理.docx_第2页
模板-学生成绩管理.docx_第3页
模板-学生成绩管理.docx_第4页
模板-学生成绩管理.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

衡阳师范学院数据结构课程设计题 目:学生成绩管理系统系 别: 计算机科学系 专 业: 物联网工程 班 级: 1201班 学生姓名: 李 明 齐 学 号: 1200117 指导老师: 姚丽君 完成日期: 2014年*月*日 目录一、需求分析3二、概要设计3三、详细设计41)宏定义,定义全局变量、结构体:42)主函数的算法如下:43)创建学生信息的算法如下:54)排序函数的算法如下:55)写入文件的算法如下:66)读取文件的算法如下:67)查找的算法如下:68)插入的算法如下:79)删除的算法如下:710)修改的算法如下:7四、设计与调试分析8五、用户手册8六、测试成果9七、附录(源程序清单)10八、课程设计心得16一、需求分析要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。问题是将输入的信息保存入文件和从文件输出。这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C+知识(本次我将使用C实现),以及丰富的程序调试经验。二、概要设计首先由于程序中要有对学生信息的增加和减少,定义一个全局变量n,在此程序的任意的模块中均可以使用。宏定义,用LEN来代替开辟地址空间,定义三个结构体变量,学号num,姓名name,分数marks,设计实现主要功能的函数有:创建学生信息的子函数creat();排序的子函数print();查找的子函数search();文件保存的子函数wfile();文件读取的子函数frile();插入信息的子函数insert();修改信息的子函数xg();删除转学学生的信息的子函数del();然后在main()函数中使用一个switch()语句实现对各个子函数的调用。为了使用的方便,程序中将设计三种排序的方式,按照学号排序funnum(),按照姓名的首字母排序funname(),按照分数排序funmarks()。在排序子函数print()中还要用一个switch()语句用于对不同的排序方法的函数的调用。为了直观的看到操作以后的结果,还要有一个输出显示的函数listall()。程序运行中,为了保持屏幕的清楚和美观,时刻进行清屏也是必要的。抽象数据类型线性表的定义如下:ADT List数据对象:D=ai|aiElemSet,i=1,2,3,n,n0数据关系:R1=|ai-1,aiD,i=1,2,3,,n基本操作:Insert(&L,i,j)初始条件:线性表L已存在,1in+1。操作结果:在L中第i个位置之前插入新的数据元素j,L的长度加1Del(&L,i,j)初始条件:线性表L已存在,1in。操作结果:删除L的第i个数据元素,L的长度减1Xg(&L,i,j)初始条件:线性表L已存在。操作结果:用新的输入数据项j代替原有的指定要修改的数据项i。Search(&L,i,e)初始条件:线性表L已存在。操作结果:查找指定的某元素i,并将值赋给e,用e输出。三、详细设计1)宏定义,定义全局变量、结构体:#defineLENsizeof(structstudent)/*宏定义*/staticintn;/*n为静态全局变量,本文件模块中各函数均可使用它*/charnumstr100;/*全局变量*/structstudent/*定义结构体*/longnum;charname10;doublemarks;stu1000,temp;2)主函数的算法如下:voidmain()jm:system(cls);dochoice=getchar();getchar();switch(choice)/*switch语句用于循环选择所要的选项*/case1:creat();gotojm;break;case2:print();gotojm;break;case3:search();gotojm;break;case4:wfile();gotojm;break;case5:frile();gotojm;break;case6:insert();gotojm;break;case7:xg();gotojm;break;case8:del();gotojm;break;case0:exit(0);default:/*用户使用错误*/puts(nEnteronlyselectionslisted);break;/*结束switch语句*/while(1);/*结束while语句*/*结束main函数*/3)创建学生信息的算法如下:creat(void)/*创建学生成绩信息*/while(ch=Y|ch=y)gets(numstr);/输入学号stun.num=atoi(numstr);gets();/输入姓名gets(numstr);/输入成绩stun+.marks=atof(numstr);ch=getchar();getchar();/*用于输入y或者n*/4)排序函数的算法如下:intprint(void)/*排序输出*/ch=getchar();/*输入a,b,c的语句*/switch(ch)/*选择排序的方式*/casea:funname();/*调用按姓名查找的函数*/getchar();break;caseb:funmarks();/*调用按成绩查找的函数*/getchar();break;casec:funnum();/*调用按学号查找的函数*/getchar();break;funname(void)/*按照姓名排序*/if(n1)printf(tt该文件为空!n);elsefor(i=0;in;i+)for(j=i+1;j0)temp=stui;stui=stuj;stuj=temp;funmarks(void)/*按照成绩排序*/if(n1)printf(tt该文件为空!n);Elsefor(i=0;in;i+)for(j=i+1;jstuj.marks)temp=stui;stui=stuj;stuj=temp;funnum(void)/*按照学号排序*/if(n1)printf(tt该文件为空!n);elsefor(i=0;in;i+)for(j=i+1;jstuj.num)temp=stui;stui=stuj;stuj=temp;5)写入文件的算法如下:wfile(void)/*写入文件*/FILE*fptr;if(n1)printf(t文件为空,无法写操作!n);elsefwrite(stu,sizeof(stu0),n,fptr);fclose(fptr);6)读取文件的算法如下:frile(void)/*读出文件*/FILE*fptr;while(fread(&stui,sizeof(stu0),1,fptr)=1)i+;n=i;fclose(fptr);7)查找的算法如下:search(void)/*查找*/flag=0;for(i=0;in;i+)if(strcmp(numstr,)=0)|atol(numstr)=stui.num)printf(%ld,stui.num);printf(%s,);printf(%.2f,stui.marks);flag=1;getchar();return0;8)插入的算法如下:insert(void)/*插入*/gets(numstr);stun.num=atoi(numstr);gets();gets(numstr);stun+.marks=atof(numstr);funname();9)删除的算法如下:del(void)/*删除*/printf(tt请输入要删除的学号:n);gets(numstr);for(i=0;in;i+)if(stui.num=atol(numstr)j=i;flag=1;if(flag=1)for(i=j;in;i+)stui=stui+1;n-;10)修改的算法如下:xg(void)/*修改*/flag=0;charch;gets(numstr);for(i=0;in;i+)if(stui.num=atol(numstr)j=i;flag=1;if(flag=1)switch(ch)case1:printf(t请输入修改后的姓名:);gets();break;case2:printf(t请输入修改后的成绩:);gets(numstr);stuj.marks=atof(numstr);break;case0:return0;11)各个模块之间的调用关系如下:四、设计与调试分析从上面的算法和调用关系可以看出,这个程序的基本样子已经非常的清楚,但是真正的程序中还要考虑各种限制条件。例如在查找的过程中,可能不存在要查找的信息,就要给出不存在此信息的提示等。还有就是涉及到返回值得问题和程序中所要用到的变量的问题。在调试的过程中所遇到的问题很多,其中最难的两个问题是给出的六个警告错误,在5.0的版本下就是两个使得程序无法运行的错误。其中五个是因为在变量的声明中因为使用了浮点型和双精度型两种而造成在某些模块中两个变量相互赋值时类型不匹配。另一个是在查找的子函数中忘记了需要的返回语句,return1.五、用户手册1、本程序可以在vc+5.0和vc+6.0的环境下运行。2、在vc中创建一个工程,将源程序复制到.cpp中,编译链接就可以。3、选择编译、运行以后会出现运行界面,选择相应的选项,根据提示即可进行演示。界面如下:4、创建信息就是把最开始要输入的信息输入到系统里。5、浏览信息就是按照要求的顺序浏览已经输入的信息。6、保存信息就是把输入的信息保存如指定的磁盘。7、打开文件就是把保存的信息从磁盘读取保存的信息。8、插入,修改,删除分别是对指定的某信息进行相应的操作。六、测试成果七、附录(源程序清单)/*计算机051班XXX的课程设计题目,选题是:学生成绩管理系统*/#includestdio.h/*头文件*/#includestring.h#includestdlib.h#defineLENsizeof(structstudent)/*宏定义*/staticintn;/*n为静态全局变量,本文件模块中各函数均可使用它*/charnumstr100;/*全局变量*/structstudent/*定义结构体*/longnum;charname10;doublemarks;stu1000,temp;creat(void)/*创建学生成绩信息*/charch=y;while(ch=Y|ch=y)printf(tt请输入学号:);gets(numstr);stun.num=atoi(numstr);printf(tt请输入姓名:);gets();printf(tt请输入成绩:);gets(numstr);stun+.marks=atof(numstr);printf(tt是否继续添加?(y/n);ch=getchar();/*用于输入y或者n*/getchar();printf(tt按任意键返回.);getchar();/*按键返回的输入函数*/return0;intprint(void)/*排序*/intfunnum(void);/*函数声明*/intfunname(void);/*函数声明*/intfunmarks(void);/*函数声明*/charch;printf(ta.按姓名首字母排序b.按成绩排序c.按学号排序n);printf(tt请按键选择);ch=getchar();getchar();/*输入a,b,c的语句*/switch(ch)/*选择排序的方式*/casea:funname();/*调用按姓名排序的函数*/printf(t按任意键返回.);getchar();break;caseb:funmarks();/*调用按成绩排序的函数*/printf(t按任意键返回.);getchar();break;casec:funnum();/*调用按学号排序的函数*/printf(t按任意键返回.);getchar();break;default:printf(tt对不起选择错误n);printf(t按任意键返回.);getchar();break;return0;funname(void)/*按照姓名排序*/inti,j;intlistall(void);/*函数声明*/if(n1)printf(tt该文件为空!n);elsefor(i=0;in;i+)/*按照姓名排序的循环语句*/for(j=i+1;j0)/*比较姓名的首字母进行相应交换操作*/temp=stui;stui=stuj;stuj=temp;listall();/*调用listall函数显示排序以后的信息*/return0;funmarks(void)/*按照成绩排序*/inti,j;intlistall(void);/*函数声明*/if(n1)printf(tt该文件为空!n);Elsefor(i=0;in;i+)/*按照成绩进行排序的循环语句*/for(j=i+1;jstuj.marks)/*如果前面的成绩大于后面的就进行交换*/temp=stui;stui=stuj;stuj=temp;listall();/*调用listall函数显示盘许以后的信息*/return0;funnum(void)/*按照学号排序*/inti,j;intlistall(void);/*函数声明*/if(n1)printf(tt该文件为空!n);elsefor(i=0;in;i+)/*按照学号进行排序的循环语句*/for(j=i+1;jstuj.num)temp=stui;stui=stuj;stuj=temp;listall();/*调用listall函数显示盘许以后的信息*/return0;doublesub(void)/*求总分数的函数*/inti;doublesub=0;for(i=0;in;i+)sub+=stui.marks;returnsub;/*把学生的分数相加,返回总分数sub*/listall(void)/*输出显示排序的信息*/intj;doublemark;if(n0)printf(ntt空文件!);printf(t按任意键返回.);getchar();elseprintf(t学号姓名成绩);for(j=0;jn;j+)printf(nt%ldt,stuj.num);printf(t%st,);printf(t%.2f,stuj.marks);mark=sub()/n;/*调用求总分数的子函数,除以学生人数n求出平均分*/printf(nt平均分是:%.2f,mark);printf(n);return0;wfile(void)/*写入文件*/FILE*fptr;if(n1)printf(t文件为空,无法写操作!n);printf(t按任意键返回.);getchar();return0;printf(t请输入要保存的路径及文件名(例如c:stus.txt):);scanf(%s,numstr);getchar();/*输入需要保存的磁盘,可以是c,d,e等任意磁盘*/if(fptr=fopen(numstr,wb)=NULL)printf(ntt无法打开!%sn,numstr);printf(t按任意键返回.);getchar();elsefwrite(stu,sizeof(stu0),n,fptr);/*把信息写入磁盘的函数*/fclose(fptr);printf(tt有%d个记录保存成功!n,n);printf(t按任意键返回.);getchar();return0;frile(void)/*读出文件*/FILE*fptr;inti=0;printf(t请输入要打开的文件(例如c:stus.txt):);scanf(%s,numstr);getchar();if(fptr=fopen(numstr,rb)=NULL)printf(ntt不能打开%s!n,numstr);printf(t按任意键返回.);getchar();elsewhile(fread(&stui,sizeof(stu0),1,fptr)=1)/*从磁盘读取数据的函数*/i+;n=i;printf(tt成功打开%d个记录!n,i);fclose(fptr);printf(t按任意键返回.);getchar();return0;search(void)/*查找*/inti,flag=0;printf(t请输入要查询的关键字。例:姓名、学号n);gets(numstr);for(i=0;in;i+)if(strcmp(numstr,)=0)|atol(numstr)=stui.num)/*把要查找的信息和存储的信息进行比较,如果相同就找到,并输出。用|表示可以有姓名或者学号两种查找方式。*/printf(t学号tt姓名tt成绩n);printf(t%ldtt,stui.num);printf(t%stt,);printf(t%.2fn,stui.marks);flag=1;printf(t按任意键返回.);getchar();return0;if(flag!=1)/*当计数不为1的时候,查不到所要的信息*/printf(tt不存在这样的信息!n);printf(t按任意键返回.);getchar();return1;insert(void)/*插入*/intfunnum(void);printf(t请输入学号:);gets(numstr);stun.num=atoi(numstr);printf(t请输入姓名:);gets();printf(t请输入成绩:);gets(numstr);stun+.marks=atof(numstr);funname();/*调用按照姓名排序的函数,显示添加以后所有学生的信息,并且按照姓名排序的方式输出*/printf(t按任意键返回.);getchar();return0;del(void)/*删除*/charch;inti,j,flag;printf(tt请输入要删除的学号:n);gets(numstr);printf(tt确定?(y/n)n);ch=getchar();getchar();if(ch=y|ch=Y)for(i=0;in;i+)if(stui.num=atol(numstr)/*比较学号相同时找到相应得信息进行删除*/j=i;flag=1;if(flag=1)printf(t正在删除,请稍后.n);for(i=j;in;i+)stui=stui+1;printf(tt删除成功!n);n-;funname();printf(t按任意键返回.);getchar();return0;xg(void)/*修改*/inti,j,flag=0;charch;printf(t输入您要修改的学号:);gets(numstr);for(i=0;in;i+)if(stui.num=atol(numstr)j=i;flag=1;if(flag=1)printf(t0.退出修改1.姓名2.成绩n);printf(t请输入您要修改的项:n);ch=getchar();getchar();switch(ch)/*循环语句选择相应的修改选项*/case1:printf(t请输入修改后的姓名:);gets();printf(修改成功n);break;case2:printf(t请输入修改后的成绩:);gets(numstr);stuj.marks=atof(numstr);printf(tt修改成功n);break;case0:return0;if(flag!=1)printf(t不存在这样的信息.n);printf(t按任意键返回.);getchar();return0;voidmain()charchoice;jm:system(cls);printf(n);printf(+学生成绩管理系统+n);printf(+-+n);printf(+(请按相应的

温馨提示

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

评论

0/150

提交评论