您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 学生成绩管理系统,数据结构课程设计
课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目:学生成绩管理系统已知技术参数和设计要求:现有学生成绩信息文件1(cj1.txt),内容如下姓名学号语文数学英语张明明01677882李成友02789188张辉灿03688256王露04564577陈东明05673847….......…学生成绩信息文件2(cj2.txt),内容如下:姓名学号语文数学英语陈果31576882李华明32889068张明东33484256李明国34504587陈道亮35475877….......…试编写一管理系统,其基本功能要求:实现对两个文件数据进行合并,生成新文件cj3.txt抽取出三科成绩中有补考的学生并保存在一个新文件cj4.txt对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)要求使用结构体,链或数组等实现上述要求.采用多种方法且算法正确者,可适当加分.要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)数据结构课程设计说明书一、需求分析1、问题描述现如今,学校人数的暴涨,对学生基本信息的录入,保存量越来越大,为了简化对工作人员的操作,故设计一个程序来完成对学生基本信息的录入,保存,编辑等简单操作。2、基本任务(1)对学生信息表cj1和cj2进行合并;(2)把合并的信息生成cj3;(3)把cj3中有补考的学生信息生成cj4;(4)对合并后的文件3.txt中的数据按总分降序排序;(5)输入一个学生姓名后,能查找到此学生的信息并输出结果。二、概要设计为了完成需求分析的基本任务,主要从以下3个方面进行设计:1、主界面设计为了实现学生成绩管理系统的各项功能,设计了一个含有多个菜单项的主控菜单模块以链接系统的各项功能,以方便用户使用系统。系统主控菜单运行界面如图1所示:图1学生成绩管理系统主菜单2、数据结构设计系统采用链表的顺序存储结构。一个字符数组存储学生姓名。四个整型数存储学生学号﹑语文成绩﹑数学成绩﹑英语成绩。和一个结构体数组。3、系统功能设计(1)从c盘下读取cj1.txt和cj2.txt中的学生成绩信息。程序会给出提示,因为如果在c盘下不存在这两个文件那么程序将不能继续会自动退出。(2)程序给出选择是否将从c盘读取的学生信息保存到c盘下cj3.txt中,如果您选择是,那么程序将执行。如果在c盘存在一个名为cj3.txt的文件,那么程序将用读取的信息将其覆盖。如果不存在,则系统会自动生成一个名为cj3.txt的文件将数据放入其中。(3)程序会给出选择是否将cj3.txt中有补考的学生信息生成一个cj4.txt的文件。如果您选择是。那么程序将会执行。对于在c盘是否有名为cj4.txt的文件的处理和上面一样。(4)程序会给出按总分大小排序的选项。程序设计了两种排序方法—直接插入法排序和冒泡排序。(5)最后程序设计了一个循环,实现根据学生姓名查找学生成绩信息。如果你所输入的学生姓名不存在,程序将会输出“查无此人”的提示符并提示是否继续查找。你可根据需要选择。如果选择否,程序退出。三、模块设计【主程序模块】:voidmain(){fp=fopen(c:\\cj1.txt,rt);//从文本文件cj1.txt中读取数据传向cj3.txtfp=fopen(c:\\cj2.txt,rt);//从文本文件cj2.txt中读取数据接到cj3.txt的后面fp=fopen(c:\\cj3.txt,rt);//从合成后的cj3.txt读取数据,生成链表fp=fopen(c:\\cj4.txt,wt);//把三科成绩中有补考的学生信息放入cj4.txtfor(i=1;i10;i++){}//直接插入法排序for(i=0;i9;i++){}//冒泡法排序do{}while(i==1);}【功能模块调用关系图】主程序模块排序查找读取学生信息【模板详细设计】typedefstructLNode{charname[6];intno;intyw;intsx;intyy;structLNode*next;}LinkList;structNameNo{intno;intyw;intsx;inttotal;charname[6];}st[10];四、详细设计(1)在c盘根目录下打开cj1.txt,用一个FILE型指针*fp指向cj1.txt,fp=fopen(c:\\cj1.txt,rt)。再用一个FILE型指针*fp1打开cj3.txt。使用fp1=fopen(c:\\cj3.txt,wt)对cj3.txt只写。然后循环使用ch=fgetc(fp)和fputc(ch,fp1)把cj1.txt的信息复制到cj3.txt中。主要代码实现:if((fp=fopen(c:\\cj1.txt,rt))==NULL)//从文本文件cj1.txt中读取数据传向成绩管理系统读取数据合并数据成绩排序退出本系统从cj1.txt中从cj2.txt中生成cj3.txt直接插入法生成cj4.txt打乱冒泡法姓名查找输入姓名cj3.txt{printf(无cj1.txt文本文件,程序结束。\n);//无cj1.txt程序将无法进行。return;//程序退出}fp1=fopen(c:\\cj3.txt,wt);//打开cj3.txt只写ch=fgetc(fp);//从cj1.txt中读取一个字符存入ch中while(ch!=EOF)//循环{fputc(ch,fp1);//把ch中的字符写入cj3.txtch=fgetc(fp);}fclose(fp1);fclose(fp);(2)再打开cj2.txt,用FILE型指针指向cj2.txt只读。fp=fopen(c:\\cj2.txt,rt)。用*fp1打开cj3.txt追加。因为cj2.txt中第一行是提示,在cj1.txt中已经存在,所以它是多余的,循环fgetc(fp)三十六次把指针移动到下一行。ch=fgetc(fp)和fputc(ch,fp1)把cj2.txt的信息追加到cj3.txt中尾部。(3)将合成后的cj3.txt中的数据存放到链表,由于cj3.txt中的数据比较乱,既有姓名学号还有三科成绩,所以这是一个要非常仔细的过程。每一行构成一个链表节点,也就组成一个循环,前六个字符存放到链表数据域中的字符数组中,然后有五个空格用五次fgetc(fp)将指针后移五次,在读取一个字符减去48得到这个字符对应打整数,再读取一个字符减去48,把这两个前面一个作为十位后一个作为各位存放到链表的数据域,后面的三科成绩用同样的方法处理存入链表的数据域作为语文﹑数学和英语的成绩。主要代码:p=(LinkList*)malloc(sizeof(LinkList));p-next=NULL;fp=fopen(c:\\cj3.txt,rt);//从合成后的cj3.txt读取数据,生成链表for(i=0;i36;i++)fgetc(fp);ch=fgetc(fp);while(ch!=EOF){s=(LinkList*)malloc(sizeof(LinkList));fgets(s-name,7,fp);for(i=0;i5;i++)fgetc(fp);x=fgetc(fp)-48;x=x*10+fgetc(fp)-48;s-no=x;for(i=0;i5;i++)fgetc(fp);x=fgetc(fp)-48;x=x*10+fgetc(fp)-48;s-yw=x;for(i=0;i5;i++)fgetc(fp);x=fgetc(fp)-48;x=x*10+fgetc(fp)-48;s-sx=x;for(i=0;i5;i++)fgetc(fp);x=fgetc(fp)-48;x=x*10+fgetc(fp)-48;s-yy=x;s-next=p-next;p-next=s;ch=fgetc(fp);}fclose(fp);(4)把有补考的同学存入cj4.txt中。在链表中扫面,如果有一科成绩不及格怎存放到cj4.txt。实现方法和前面相似。主要代码:fp=fopen(c:\\cj4.txt,wt);//把三科成绩中有补考的学生信息放入cj4.txtfputs(姓名学号语文数学英语,fp);fclose(fp);fp=fopen(c:\\cj4.txt,a);s=p-next;while(s!=NULL){if(s-yw60||s-sx60||s-yy60){ch='\n';fputc(ch,fp);fputs(s-name,fp);for(i=0;i5;i++){ch='';fputc(ch,fp);}ch=s-no/10+48;fputc(ch,fp);ch=s-no-(s-no/10)*10+48;fputc(ch,fp);for(i=0;i5;i++){ch='';fputc(ch,fp);}ch=s-yw/10+48;fputc(ch,fp);ch=s-yw-(s-yw/10)*10+48;fputc(ch,fp);for(i=0;i5;i++){ch='';fputc(ch,fp);}ch=s-sx/10+48;fputc(ch,fp);ch=s-sx-(s-sx/10)*10+48;fputc(ch,fp);for(i=0;i5;i++){ch='';fputc(ch,fp);}ch=s-yy/10+48;fputc(ch,fp);ch=s-yy-(s-yy/10)*10+48;fputc(ch,fp);s=s-next;}elses=s-next;}fclose(fp);(5)用一个结构体数组存放学生信息,然后用直接插入法和冒泡法进行总分降序排列,先用直接插入法排好序后打乱,再用冒泡法排序,这两个过程比较简单,就不多作介绍。(6)最后是查找,分别在数组和链表中查找,这个过程也比较简单,但要注意的是在输入要查找的人的姓名时如果人名为两个字则要在中间加两个空格。这样才能成功查找到。五、调试分析(1)编译,调试过后,运行程序。(2)输入选择,进行两表的合成和生成cj4.txt。(3)合成成功后,选择对总分进行直接插入法排序。(4)打乱排序,再用冒泡法排序。(5)输入姓名进行查找六、用户手册1、本程序的特点是我们不在需要从键盘上输入数据,而是直接从已有文件中读取数据,这在数据量很大时或者需要反复使用同一个数据时有很大的优势。2、要程序运行的关键是在c盘下存在cj1.txt和cj2.txt两个文件,用户在使用是需得注意。3、本人在写程序时重心主要放在对数据的处理上,所以在界面设计方面还做得不好,请多多包涵。4、程序操作很简单,只要按提示操作即可完成要求的内容。七、参考文献1、《数据结构教程(第三版)》李春葆尹为民等编著清华大学出版社2、《C语言程序设计(第三版)》何钦铭颜晖主编高等教育出版社3、《数据结构教程上机实验指导》李春葆编著清华大学出版社八、程序设计总结通过两个星期的折腾,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。是啊,读了那么多年的书,课程设计可是第一次。看着劳动成果,很欣慰!虽然这不是我一个人做的,是大家的共同努力得来的。“也许完成不了!”两个星期前我们这样说,“完成他没问题!”一个星期前我们这样说,现在我们可以说:“哈哈,完成啦”!刚开始,可以说是没有头绪,于是就去图书馆找资料,找到了一些关于画图方面的,可是这点小进展远远不够,这只是一个小小的开始。下一步是上网查,找到了些与我们题目相似的,那时我们每个人都很高兴,可是那还不是我们要的,于是又上网查到了些有关的函数等等,终于在我们大家的努力下,完成了这个程序。虽然对着电脑做程序,有点累有点热,可是当看到劳动成果时,真是别有一番滋味在心头啊!世上无难事,只怕有心人,的确如此。做完这个程序最大的收获就是感受到了集体的力量,当然个人的智慧也是很重要的哦!做
本文标题:学生成绩管理系统,数据结构课程设计
链接地址:https://www.777doc.com/doc-4482060 .html