XXX
《数据结构》
课程设计
设计题目:学生成绩管理
系别数学与计算机科学系班级XXX
学生姓名XXX 学号XXX
指导教师XXX职称教师
起止日期:2011 年12月19 日起——至2011年12 月23日止
XXX
《数据结构》
课程设计任务书
课程设计题目:学生成绩管理
系别数学与计算机科学系班级XXX
学生姓名XXX学号XXX
指导教师XXX职称XX
课程设计进行地点:XXX
任务下达时间:20 11 年12 月19 日
起止日期:2011年12月19日起——至2011年12月23日止
一、课程设计的目的
课程设计比教学实验复杂一些,涉及的深度广些并更加接近实用。目的一方面是通过课程设计的综合训练,帮助学生系统掌握该门课程的主要内容,更好地完成教学任务;另一方面,通过课程设计使学生进一步加深对课程内容的理解,利用程序设计的基本思想进行程序的开发,进一步掌握编程方法和技巧,培养学生的实际分析问题、编程和动手能力,提高学生用程序的思想来解决实际问题的能力。
二、课程设计要求
1、遵守课程设计时间安排,按时上机。
2、认真查找相关的资料,理解相关的知识内容。
3、认真调试程序,组员之间应加强团队合作,取长补短,共同分析问
题解决问题。
4、根据设计题目规定的具体要求进行具体规范操作。
5、认真撰写课程设计报告,避免相互抄袭。
三、对课程设计说明书撰写内容、格式、字数的要求
1.课程设计报告是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、实验器材、设计原理及内容、设计具体步骤、遇到的问题及解决方法、设计总结、参考文献等。一般不应少于3000字。
2.在适当位置配合相应的实验原理图、实验数据表、问题分析流程图等图表进行说明。应做到文理通顺,内容正确完整,书写工整,装订整齐。
3.设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。
4.课程设计报告打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距20磅。文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。
5.课程设计报告装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。
四、设计题目
五、成绩评定
评定成绩根据系统功能、界面效果,系统操作的方便性、灵活性等方面进行,主要从三个方面进行考虑:
1、对问题的理解程度;
2、成果的好坏;
3、设计报告。
评定结果:不及格、及格、中、良好、优秀。
六、时间进度安排
七、主要参考文献
铜陵学院数学与计算机科学系
《数据结构》课程设计成绩评定表
教研室:信管教研室班级: 10信管本学生姓名:胡美乐
摘要关键字:
1、课程设计的目的
2、课程设计说明书
3、心得体会
4、结论
5、感谢
6、参考文献
目录
摘要 (6)
第1章引言 (1)
第2章课程设计目的 (1)
第3章课程设计说明书 (3)
第4章心得体会 (24)
结论 (25)
致谢 (26)
参考文献 (27)
第1章引言
随着科学技术发展的日新日异,当今计算机应用在是生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术十分重要的。
作为计算机基础课程之一的数据结构是更深入学习计算机知识的基础,因此,努力将数据结构学以致用对学习计算机的学生来说是一件重要而基础的任务。
第2章课程设计目的、任务与要求
第3章课程设计说明书
1、需求分析
要求用到数据结构课上学到的结构体和数组的知识,所以就要充分而清晰的理解关于线性表的知识。
要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。
问题是将输入的信息保存入文件和从文件输出。这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。
综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C++知识(本次我们将使用C实现),以及丰富的程序调适经验。
2、概要设计
首先由于程序中要有对学生信息的增加和减少,定义一个全局变量num,在此程序的任意的模块中均可以使用。定义一个结构体变量student其成员包括学生学号ID,姓名Name,三门课的成绩Mark1, Mark2, Mark3.
设计实现主要功能的函数有:求学生平均成绩的子函数Avg();通过学号查询数组下标函数Student_SearchByIndex();通过姓名查询数组下标函数Student_SearchByName();学生信息输出函数Student_DisplaySingle(),插入学生信息函数Student_DisplaySingle(),修改学生信息函数Student_Modify(),删除学生信息函数Student_Delete(),按姓名查询函数Student_Select(),按平均值排序函数Student_SortByAverage(),显示学生信息函数Student_Display(),将学生信息从文件读出函数IO_ReadInfo(),将学生信息写入文件函数IO_WriteInfo(),然后在main()函数中使用一个switch()语句实现对各个子函数的调用。
为了直观的看到操作以后的结果,还要有一个输出显示的函数Student_Display()。
程序运行中,为了保持屏幕的清楚和美观,时刻进行清屏也是必要的。
结构体数据类型的定义如下:
struct Student /*定义学生结构体*/
{
char ID[20]; /*学生学号*/
char Name[20]; /*学生姓名 */
float Mark1; /*成绩1 */
float Mark2; /*成绩2*/
float Mark3; /*成绩3 */
float Average;/*求三门成绩平均数*/
};
3、详细设计
(1)定义结构体,全局变量
struct Student /*定义学生结构体*/
{
char ID[20];
char Name[20];
float Mark1;
float Mark2;
float Mark3;
float Average;
};
int num=0;
(2)主函数的算法如下:
main() /*主程序*/
{
int choice;
IO_ReadInfo();
while(1)
{
printf("\n------ 学生成绩管理系统------\n"); /*主菜单*/ printf("1. 增加学生记录\n");
printf("2. 修改学生记录\n");
printf("3. 删除学生记录\n");
printf("4. 按姓名查询学生记录\n");
printf("6. 退出\n");
printf("请选择(1-6):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Insert(); break;
case 2:
Student_Modify(); break;
case 3:
Student_Delete(); break;
case 4:
Student_Select(); break;
case 5:
Student_SortByAverage();
Student_Display(); break;
case 6: return 0; break;
}
IO_WriteInfo();
}
}
(3) 学生成绩的子函数Avg(struct Student stu)的算法如下:
float Avg(struct Student stu) /*求平均值*/
{
return (stu.Mark1+stu.Mark2+stu.Mark3)/3;
}
(4)通过学号查询数组下标函数Student_SearchByIndex()的算法如下: int Student_SearchByIndex(char id[]) /*通过学号返回数组下标*/ {
int i;
for (i=0;i { if (strcmp(students[i].ID,id)==0) { return i; } } return -1; } (5)通过姓名查询数组下标函数Student_SearchByName()的算法如下: int Student_SearchByIndex(char id[]) /*通过学号返回数组下标*/ { int i; for (i=0;i if (strcmp(students[i].ID,id)==0) { return i; } } return -1; } (6)学生信息输出函数Student_DisplaySingle()的算法如下: void Student_DisplaySingle(int index) /*显示单条学生记录*/ { printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩1","成绩2","成绩3","平均成绩"); printf("-------------------------------------------------------------\n"); printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name , students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index ].Average); } (7)插入学生信息函数Student_DisplaySingle() void Student_Insert() /*插入学生信息*/ { while(1) { printf("请输入学号:"); scanf("%s",&students[num].ID); getchar(); printf("请输入姓名:"); scanf("%s",&students[num].Name); getchar(); printf("请输入成绩1:"); scanf("%f",&students[num].Mark1); getchar(); printf("请输入成绩2:"); scanf("%f",&students[num].Mark2); getchar(); printf("请输入成绩3:"); scanf("%f",&students[num].Mark3); getchar(); students[num].Average=Avg(students[num]); num++; printf("是否继续?(y/n)"); if (getchar()=='n') { break; } } (8)修改学生信息函数Student_Modify() void Student_Modify() /*修改学生信息*/ { float mark1,mark2,mark3; while(1) { char id[20]; int index; printf("请输入要修改的学生的学号:"); scanf("%s",&id); getchar(); index=Student_SearchByIndex(id); if (index==-1) { printf("学生不存在!\n"); } else { printf("你要修改的学生信息为:\n"); Student_DisplaySingle(index); printf("-- 请输入新值--\n"); printf("请输入学号:"); scanf("%s",&students[index].ID); getchar(); printf("请输入姓名:"); scanf("%s",&students[index].Name); getchar(); printf("请输入成绩1:"); scanf("%f",&students[index].Mark1); getchar(); printf("请输入成绩2:"); scanf("%f",&students[index].Mark2); getchar(); printf("请输入成绩3:"); scanf("%f",&students[index].Mark3); getchar(); students[index].Average=Avg(students[index]); } printf("是否继续?(y/n)"); if (getchar()=='n') { break; } } (9)删除学生信息函数Student_Delete() void Student_Delete() /*删除学生信息*/ { int i; while(1) { char id[20]; int index; printf("请输入要删除的学生的学号:"); scanf("%s",&id); getchar(); index=Student_SearchByIndex(id); if (index==-1) { printf("学生不存在!\n"); } else { printf("你要删除的学生信息为:\n"); Student_DisplaySingle(index); printf("是否真的要删除?(y/n)"); if (getchar()=='y') { for (i=index;i { students[i]=students[i+1]; } num--; } getchar(); } printf("是否继续?(y/n)"); if (getchar()=='n') { break; } } } (10)按姓名查询函数Student_Select() void Student_Select() /*按姓名查询*/ { while(1) { char name[20]; int index; scanf("%s",&name); getchar(); index=Student_SearchByName(name); if (index==-1) { printf("学生不存在!\n"); } else { printf("你要查询的学生信息为:\n"); Student_DisplaySingle(index); } printf("是否继续?(y/n)"); if (getchar()=='n') { break; } } } (11)按平均值排序函数Student_SortByAverage() void Student_SortByAverage() /*按平均值排序*/ { int i,j; struct Student tmp; for (i=0;i { for (j=1;j { if (students[j-1].Average { tmp=students[j-1]; students[j-1]=students[j]; students[j]=tmp; } } } } (12)显示学生信息函数Student_Display() void Student_Display() /*显示学生信息*/ { int i; printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩"); printf("-------------------------------------------------------------\n"); for (i=0;i { students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average); } } (13)将学生信息从文件读出函数IO_ReadInfo() void IO_ReadInfo() /*将学生信息从文件读出*/ { FILE *fp; int i; if ((fp=fopen("Database.txt","rb"))==NULL) { printf("不能打开文件!\n"); return; } if (fread(&num,sizeof(int),1,fp)!=1) { num=-1; } else { for(i=0;i { fread(&students[i],sizeof(struct Student),1,fp); } } fclose(fp); } (14)将学生信息写入文件函数IO_WriteInfo() void IO_WriteInfo() /*将学生信息写入文件*/ { FILE *fp; int i; if ((fp=fopen("Database.txt","wb"))==NULL) { printf("不能打开文件!\n"); return ; } if (fwrite(&num,sizeof(int),1,fp)!=1) { printf("写入文件错误!\n"); } for (i=0;i { if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1) { printf("写入文件错误!\n"); } fclose(fp); } 4、设计与调试分析 从上面的算法和调用关系可以看出,这个程序的基本样子已经非常的清楚,但是真正的程序中还要考虑各种限制条件。例如在查找的过程中,可能不存在要查找的信息,就要给出不存在此信息的提示等。 还有就是涉及到返回值得问题和程序中所要用到的变量的问题。在调试的过程中所遇到的问题很多,其中最难的两个问题是给出的六个警告错误,在5.0的版本下就是两个使得程序无法运行的错误。其中五个是因为在变量的声明中因为使用了浮点型和双精度型两种而造成在某些模块中两个变量相互赋值时类型不匹配。另一个是在查找的子函数中忘记了需要的返回语句,return 1. 5、用户手册 (1)本程序可以在vc++6.0 的环境下运行。 (2)在vc中创建一个工程,将源程序复制到.cpp中,编译链接就可以。 (3)选择编译、运行以后会出现运行界面,选择相应的选项,根据提示即可进行演示。界面如下: (5)修改学生信息 (6)删除学生信息