《计算机能力训练》课程设计实验实验报告*学生成绩管理系统*学号:姓名:班级:学院2009.092一、实验目的利用TURBOC2.0实现学生成绩管理系统的录入、查询、删除、统计等基本操作。进一步巩固C语言的学习,以提高学生对开发环境的进一步认识和综合编程能力。二、需要处理的基础数据学生基本信息:学号(例如2003级12班6号写作20031206)、姓名、性别、年龄、课程名称(外语SCORE[0]、高数SCORE[1]、C语言SCORE[2]、马哲SCORE[3])、考试成绩等。三、系统功能1.学生基本情况录入。2.允许对已经录入的数据进行显示。3.允许进行数据的插入。4.删除基本数据的相关信息。5.基于姓名的查询。如:姓张的所有同学。6.基于各种基本数据的统计计算。如:①统计每个学生各门功课的平均成绩,并按平均成绩从高到低的次序排名输出每个学生各门功课的综合成绩和平均成绩(名次、学号、姓名、平均成绩、各门功课的考试成绩)。②列出90分以上(包括90)、80分以上(包括80)、70分以上(包括70)、60分以上(包括60)、不及格学生清单(学号、姓名、不及格的课程和成绩)。③统计并输出各门功课的平均成绩和总平均成绩。四、实验模块功能Main()主函数主函数是程序的入口,采用模块化设计。首先声明必要的变量,然3后进行链表的初始化,完成程序入口。init()初始化单链表需要一个头指针指向表的第一个结点,对单链表的访问使从头指针开始的,初始化单链表为空。空用NULL表示,该值在头文件stdio.h中定义为常数0._menu主菜单程序引用putch()输出图形符号的ASCII码值来实现边框。利用window函数制作显示窗口,该窗口比边框略小一些,正好包含于边框之中。通过key()实现对光标键的捕捉,光条的移动通过ups()和dns()实现。同时检测ENTER键,若捕捉到此键,则执行相应的函数模块。create()创建单链表进入主菜单中的“Enterlist”选项,进入创建链表函数,即输入学生信息,按照提示信息输入学号,姓名,性别,课程成绩,每输入一个数按一下回车,当输入学号字符为@时结束输入,返回主函数,单链表创建完毕,输入界面如图:数据完整性的验证由两个函数create()和inputs()完成。设置头指针为空,申请内存空间,如果申请不到,则内存空间满,无法保存数据,则返回主函数,否则输入数据,并进行相应的校监,成绩就在create()中边输入边验证,以保证输入和法数据。当成绩输入后,系统自动计算生成总分和平均分,并将名次数据先置1,待排序后再赋予新值。数据输入后,将其后继结点指针指向前头的结点,新头指针指向新插入的结点,这样新插入的结点总在前头。数据输入结束后返回链表的头指针,返回_menu()函数,进行其他操作。delete()删除结点删除指定学号的学生记录。首先输入要删除结点的学号,输入后根据学号顺序查找结点,如果没找到,则输出没找到信息;否则,显示找到的结点信息,按任意键后显示已删除信息。注意删除结点时的操作,如果该结点是首结点,则要修改头指针,否则,将该结点的前趋指针的后继指向其后继结点,然后释放该结点。print()显示单链表本函数实现显示链表数据功能。由于链表只能采取顺序访问的方法,所以定义一个指向结点的临时变量p,初值为单链表的头指针,输出指针所指的记录的数据后,将指针后移一个记录,直到p指针值为空值,则所有记录输出完毕。search()查找结点按照姓名查找结点,从头结点开始顺序查找,成功显示记录信息,4失败,显示没找到。姓名是字符串,比较功能利用字符串比较函数strcmp()实现。save()保存记录到文件将学生信息保存到指定文件中。按照文件读写要求,先定义一个指向文件的指针,输入要保存的磁盘文件名,如果输入的是绝对路径,则文件保存到指定位置;如果只给文件名,则文件保存在TurboC默认的路径下,load()从文件中读取记录按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然后确定文件的大开放式。如果文件打不开,则退出函数,否则选择一种度文件方式,从文件头开始,将记录读入内存,直到文件尾。computer()计算各门课程的总分和课程平均分头指针开始,每读一条记录,分别累加各科成绩,并统计记录条数,当所有数据处理完毕,求出平均分,最后输出结果为所有学生各门课程的总分和平均分。insert()插入结点插入结点需要输入插入位置和新结点信息。输入某个结点的学号,新结点将插入在这个指定结点之前。申请空间得到指针info,输入新结点信息,存放到新申请的空间info中。设链表的头指针为h,p为指定结点的指针,q为p的前驱指针,从头结点开始循环移动指针p查找指定的结点,查找和插入时分一下几种情况处理:①指针为空,如果p等于头h,说明链表为空,则新结点为头结点,修改指针h=info,否则,说明没有指定结点。则新结点在表尾部,此时q所指的结点时最后一个结点,所以修改指针q-next=info。②指针p不为空,如果p=h,说明新结点插入在当前结点之前,为新的头结点,修改指针info=next=p,h=info。否则,说明新结点的位置在p和q之间,修改指针为info-next=p,q-next=infosort()分类统计从头指针开始,分别对学生的各门功课成绩进行判别,并按照科目输出处于各个分数段的学生学号,姓名,成绩。五、系统功能模块结构图5六、要求1、只能使用C语言,源程序要有适当的注释,使程序容易阅读。2、要有用户界面。要求至少采用文本菜单界面;鼓励采用图形菜单界面。3、必须使用结构和链表等数据结构。4、使用文件保存数据。七、实验流程图主程序初始化菜单界面输入退出分类插入计算读取保存查找显示删除6否是开始欢迎界面初始化是否键入Enter捕捉菜单光条位置输入记录删除记录显示记录查找计录保存文件读取文件计算成绩分类汇总退出程序返回菜单界面7八、程序#includestdio.h#includedos.h#includestdlib.h#includestring.h#includememory.h#includectype.h#includemalloc.h#defineLENsizeof(STUDENT)typedefstructstu{charnum[8];charname[8];intscore[3];intsum;floataverage;intorder;structstu*next;}STUDENT;STUDENT*init();intmenu_select();STUDENT*create();voidprint(STUDENT*head);voidsearch(STUDENT*head);STUDENT*delete(STUDENT*head);STUDENT*sort(STUDENT*head);STUDENT*insert(STUDENT*head,STUDENT*new);voidsave(STUDENT*head);STUDENT*load();main(){STUDENT*head,new;head=init();for(;;){switch(menu_select()){case1:head=create();break;case2:print(head);break;8case3:search(head);break;case4:head=delete(head);break;case5:head=sort(head);break;case6:head=insert(head,&new);break;case7:save(head);break;case8:head=load();break;case9:exit(0);}}}STUDENT*init(){returnNULL;}menu_select(){intn;printf(pressanykeytoenterthemenu......);getchar();system(cls);printf(********************************************************************************\n);printf(\t\tWelcometo\n);printf(\n\t\tThestudentscoremanagesystem\n);printf(*************************************MENU***************************************\n);printf(\t\t\t1.Entertherecord\n);printf(\t\t\t2.Printtherecord\n);printf(\t\t\t3.Searchrecordonname\n);printf(\t\t\t4.Deletearecord\n);printf(\t\t\t5.Sorttomakenewafile\n);printf(\t\t\t6.Insertrecordtolist\n);printf(\t\t\t7.Savethefile\n);printf(\t\t\t8.Loadthefile\n);printf(\t\t\t9.Quit\n);printf(\n\t\tMadeby:WangZhiFu.\n);printf(********************************************************************************\n);9do{printf(\n\t\t\tEnteryourchoice(1~9):);scanf(%d,&n);}while(n1||n9);return(n);}STUDENT*create(){inti,s;STUDENT*head=NULL,*p;system(cls);for(;;){p=(STUDENT*)malloc(LEN);if(!p){printf(\nOutofmemory.);return(head);}printf(Enterthenum(0:listend):);scanf(%s,&p-num);if(p-num[0]=='0')break;printf(Enterthename:);scanf(%s,&p-name);printf(Pleaseenterthe%dscores\n,3);s=0;for(i=0;i3;i++){do{printf(score%d:,i+1);scanf(%d,&p-score[i]);if(p-score[i]0||p-score[i]100)printf(Dataerror,pleaseenteragain.\n);}while(p-score[i]0||p-score[i]100);s=s+p-score[i];}p-sum=s;p-average=(float)s/3;p-order=0;p-next=head;10head=p;}return(head);}voidprint(STUDENT*head){inti=0;STUDENT*p;system(cls);p=head;printf(\n************************************STUDENT************************************\n);printf(-------------------------------------------------------------------------------\n);printf(|Rec|Num|Name|Sc1|Sc2|Sc3|Sum|Ave|Order|\n);printf(------------------------