1、数据结构实习报告河 南 工 程 学 院实 习 报 告 课 程 数据结构 系(部) 计算机学院 专 业 计算机科学与技术 班 级 XXX班 姓 名 XXX 学 号 XXXXX 2013年 6 月 25 日实 习 (训) 报 告 评 语等 级: 评阅人: 职称: 年 月 日 河南工程学院实习(训)报告 实习内容: 学生成绩管理系统 实习时间:自 6 月 24 日 至 6 月 29 日 共 5 天 实习地点: 学校机房 实习单位: 计算机学院 指导教师: 李芳 系主任: 曲宏山 目 录一、设计目标 1二、课题分析与设计 11课题需求分析 12 存储结构设计 23 算法设计 24.程序流程图 5三、程
2、序清单 6四、测试 201测试数据 202 测试结果及分析 20五、总结 241收获 242 不足 24一、设计目标 要求能够实现输入记录、查询记录、维护记录、排序记录等功能。1. 输入记录。对每个学生的学号、姓名、性别、班级、数学、英语、语文成绩进行输入并存储,在程序的运行过程中,数据的存储可以采用结构体数组或者链表,但是最终应该存储在文件中。2. 维护记录。能够实现添加、删除、修改学生记录。3. 查询记录。根据姓名查询学生的成绩。如果查询时学生数据并没有读入到结构体数组或者链表中,则应该先从文件中读出数据并存储在结构体数组或者链表中,然后在结构体数组或者链表中查询满足条件的数据。4. 排序
3、记录。可以按总分、平均分、课程、单科成绩进行排序。二、课题分析与设计1课题需求分析1.在设计时考虑以下几个方面:操作简单。因为使用者多为非计算机专业人员,所以该系统要求设计的界面美观,操作方便。要充分考软件界面友好和操作方便,便愈使用人员快速上手。易于维护。一个软件的好坏,关键在于产品的可靠,稳定,便于维护。2开发语言的选择针对世界上流行的大量软件和开发工具,经过认真分析其优缺点,结合目前的软硬件开发环境,选用微软WINDOWS平台下的Visual C+作为软件开发工具。选用工具有几下几方面优点:1 C语言简洁、紧凑、使用方便、灵活。有32个关键字。C语言程序比其他许多高级语言简练,源程序短,
4、因此输入程序时工作量小。2 运算符丰富。3 数据类型丰富,具有现代语言的各种数据结构。4 C语言是完全模块化和结构化的语言。用函数作为程序的模块单位,便于实现程序的模块化。5 语法限制不太严格,程序设计自由度大。6 生成目标代码质量高,程序执行效率高。7 用C语言编写的程序可移植性好。综上所述,Visual C+可以满足学生成绩管理的要求,所以用来开发学生成绩管理系统是非常合适的。2存储结构设计void SaveLinkToFile(void)STUDENT *p;FILE *fp;p=headLink-next;if(p=NULL)printf(现在没有学生信息,请先输入学生信息nn);re
5、turn;fp=fopen(student.txt,w+);if(!fp)printf(文件不存在n);return;while(p)fprintf(fp,%s %s %s %f %f %fn,p-studentNumber,p-studentName,p-className,p-mark1,p-mark2,p-mark3);p=p-next;fclose(fp);保存链表数据到文件中3算法设计 void main()CreateHeadLink();ReadInfoFormFile();DesplayMenu(); 主函数调用,对整个模块进行总体概括。switch(choose)case 1
6、:OutputInformation();/*显示所有学生的信息*/break;case 2:DesplayInfoBystudentName();break;case 3:p=MallocNode();/*先申请一个新结点*/GetInformation(p);/*要求用户输入信息到新结点中*/InsertOneNode(p);/*将新结点加到链表中*/break;case 4:DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/break;case 5:ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/break;case
7、6:ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/break;case 7:SaveLinkToFile();/*保存数据*/break;case 8:DesplayMarkSegment();/*显示不及格的学生成绩*/break;case 9:CompositorByTotalMark();/*按平均成绩排序*/break;case 10: CompositorByeachMark1(); break;case 11: CompositorByeachMark2(); break;case 12: CompositorByeachMark3(); brea
8、k;case 13:SaveLinkToFile();/*保存数据后再退出*/free(headLink);break;default:break;DesplayMenu();/*递归调用*/功能:定义菜单函数,通过输出函数显示系统功能。利用switch语句实现多分支选择结构,完成递归调用。算法思路:switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句4.程序流程图三、程序清单程序清单:#incl
9、ude#include#include#includetypedef struct STUDENT char studentSex5;char studentNumber10;/*学生学号*/char studentName20;/*学生姓名*/char className20;/*班级名称*/char yearName20;/*学期名称*/float mark1;/*第1门成绩*/float mark2;/*第2门成绩*/float mark3;/*第3门成绩*/struct STUDENT *next;STUDENT;STUDENT *headLink;/*链表表头指针*/*以下是函数声明
10、*/void ReadInfoFormFile(void);void DesplayMenu(void);void CreateHeadLink(void);STUDENT *MallocNode(void);void GetInformation(STUDENT *t);void OutputInformation(void);void DesplayInfoBystudentName(void);void DesplayOneNode(STUDENT *t);void InsertOneNode(STUDENT *t);void DeleteNodeBystudentNumber(void
11、);void ChangeMarkByName(void);void ChangeMarkByNumber(void);void SaveLinkToFile(void);void DesplayMarkSegment(void);void CompositorByTotalMark(void);void CompositorByeachMark1(void);void CompositorByeachMark2(void);void CompositorByeachMark3(void);int choose;/*用于接受用户的选择*/*主函数*/void main()CreateHeadL
12、ink();ReadInfoFormFile();DesplayMenu();/*函数功能:从文件中读学生信息到链表中*/void ReadInfoFormFile(void)FILE *fp;STUDENT *p;fp=fopen(student.txt,r);if(!fp)printf(文件不存在n);return;p=MallocNode();while(fscanf(fp,%s%s%s%f%f%f,p-studentNumber,p-studentName,p-className,&(p-mark1),&(p-mark2),&(p-mark3)0)InsertOneNode(p);p=
13、MallocNode();fclose(fp);/*函数功能:显示菜单,根据用户的输入完成相应的功能*/void DesplayMenu(void)STUDENT *p;printf(*请选择相应功能*nn);printf(| 1 按班级输出学生成绩单 |n);printf(| 2 按姓名查询 |n);printf(| 3 增加学生 |n);printf(| 4 删除学生 |n);printf(| 5 按班级修改学生成绩 |n);printf(| 6 按学期修改学生成绩 |n);printf(| 7 保存所有学生信息 |n);printf(| 8 显示不及格学生成绩 |n);printf(|
14、9 按总成绩或平均成绩排序并输出成绩 |n);printf(| 10 按语文成绩排序并输出成绩 |n);printf(| 11 按英语成绩排序并输出成绩 |n);printf(| 12按数学成绩排序并输出成绩 |n);printf(| 13 退出 |n);/printf(| 10 |nn);scanf(%d,&choose);/*取得用户的选择*/switch(choose)case 1:OutputInformation();/*显示所有学生的信息*/break;case 2:DesplayInfoBystudentName();break;case 3:p=MallocNode();/*先
15、申请一个新结点*/GetInformation(p);/*要求用户输入信息到新结点中*/InsertOneNode(p);/*将新结点加到链表中*/break;case 4:DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/break;case 5:ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/break;case 6:ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/break;case 7:SaveLinkToFile();/*保存数据*/break;case 8:DesplayMarkS
16、egment();/*显示不及格的学生成绩*/break;case 9:CompositorByTotalMark();/*按平均成绩排序*/break;case 10: CompositorByeachMark1(); break;case 11: CompositorByeachMark2(); break;case 12: CompositorByeachMark3(); break;case 13:SaveLinkToFile();/*保存数据后再退出*/free(headLink);break;default:break;DesplayMenu();/*递归调用*/*函数功能:建立链
17、表表头*/void CreateHeadLink(void)STUDENT *p;p=(STUDENT*)malloc(sizeof(STUDENT);headLink=p;p-next=NULL;/*函数功能:申请一个新结点,并将其初始化*/STUDENT *MallocNode(void)STUDENT *p;int i;p=(STUDENT*)malloc(sizeof(STUDENT);if(p=NULL)return NULL;for(i=0;istudentNumberi=0;for(i=0;istudentNamei=0;for(i=0;iclassNamei=0;p-mark1
18、=0.0;p-mark2=0.0;p-mark3=0.0;p-next=NULL;return p;/*函数功能:取得用户输入的学生信息*/void GetInformation(STUDENT *t)printf(*请输入学生学号:n);scanf(%s,t-studentNumber);printf(*请输入学生姓名:n);scanf(%s,t-studentName);printf(*请输入学生性别:n);scanf(%s,t-studentSex);printf(*请输入该生所在班级:n);scanf(%s,t-className);printf(*请输入语文成绩:n);scanf(%
19、f,&(t-mark1);printf(*请输入英语成绩:n);scanf(%f,&(t-mark2);printf(*请输入数学成绩:n);scanf(%f,&(t-mark3);/*函数功能:在链表的结尾处增加一个结点*/void InsertOneNode(STUDENT *t)STUDENT *p;p=headLink;while(p-next)p=p-next;p-next=t;/*函数功能:根据用户输入的学生姓名显示该学生的信息*/void DesplayInfoBystudentName(void)STUDENT *p;char studentName20;char flag=0
20、;p=headLink-next;printf(请输入学生姓名:n);scanf(%s,studentName);while(p)if(strcmp(p-studentName,studentName)=0)printf(学号 t姓名 t班级 t语文 t英语 t数学 t总成绩 t平均成绩nn);DesplayOneNode(p);flag=1;break;p=p-next;if(!flag)printf(对不起,不存在姓名为 %s 的学生n,studentName);/*函数功能:输出一个结点的信息*/void DesplayOneNode(STUDENT *t)printf(%st,t-st
21、udentNumber);printf(%st,t-studentName);printf(%st,t-className);printf(%.2ft,t-mark1);printf(%.2ft,t-mark2);printf(%.2ft,t-mark3);printf(%.2ft,t-mark1+t-mark2+t-mark3);printf(%.2ftn,(t-mark1+t-mark2+t-mark3)/3);/*函数功能:根据用户输入的学号删除该学生*/void DeleteNodeBystudentNumber(void)char studentNumber10;STUDENT *p
22、,*q;char flag=0;printf(请输入要删除的学生学号:);scanf(%s,studentNumber);p=headLink;q=headLink-next;while(q) if(strcmp(q-studentNumber,studentNumber)=0) p-next=q-next; free(q); flag=1; break; p=p-next; q=q-next; if(!flag)printf(不存在该学号的学生n);return;printf(成功删除n);/*函数功能:显示所有学生的信息*/void OutputInformation(void)STUDE
23、NT *p;p=headLink-next;if(p=NULL)printf(现在没有学生信息,请先输入学生信息nn);return;printf(学号t姓名t班级t语文t英语t数学t总成绩t平均成绩nn);while(p)DesplayOneNode(p);p=p-next;/*函数功能:根据输入的班级修改成绩*/void ChangeMarkByName(void)STUDENT *p;int a;char studentName20;char flag=0;float mark1,mark2,mark3;p=headLink-next;printf(请输入学生班级:n);scanf(%d
24、,&a);printf(请输入学生姓名:n);scanf(%s,studentName);while(p)if(strcmp(p-studentName,studentName)=0)printf(请输入新的语文成绩:n);scanf(%f,&mark1);printf(请输入新的英语成绩:n);scanf(%f,&mark2);printf(请输入新的数学成绩:n);scanf(%f,&mark3);p-mark1=mark1;p-mark2=mark2;p-mark3=mark3;flag=1;printf(修改成功n);break;p=p-next;if(!flag)printf(对不起,不存在班级为 %s 的学生n,studentName);/*函数功能:根据输入的学期修改成绩*/void ChangeMarkByNumber(void)STUDENT *p;int b;char studentNumber20;char flag=0;float mark1,mark2,mark3;p=headLink-next;printf(请输入学生所在学期:n);scanf(%d,&b);printf(请输入学生学号:n);scanf(%s,studentNumber);while(p)if(strcmp(p-studentNumber,studentNumber)=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1