数据结构课设报告.docx
- 文档编号:24113971
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:34
- 大小:571.46KB
数据结构课设报告.docx
《数据结构课设报告.docx》由会员分享,可在线阅读,更多相关《数据结构课设报告.docx(34页珍藏版)》请在冰豆网上搜索。
数据结构课设报告
洛阳理工学院
课程设计说明书
课程名称数据结构
设计课题统计成绩
专业计算机科学与技术
班级B130503
学号
姓名
完成日期2015年1月4号
课程设计任务书
设计题目:
统计成绩
设计内容与要求:
给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
(1)按总数高低次序,打印出名次表,分数相同的为同一名次;
(2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。
指导教师:
张红霞
年月日
课程设计评语
成绩:
指导教师:
年月日
【问题描述】
给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
【基本要求】
(1)按总数高低次序,打印出名次表,分数相同的为同一名次;
(2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。
【测试数据】
(1)首先输入数据如下:
学号姓名高数英语数据结构体育
1001喜羊羊99.099.099.099.0
1002懒羊羊65.075.074.065.0
1003村长99.099.099.099.0
1004灰太狼89.089.095.099.0
(2)添加数据如下:
学号姓名高数英语数据结构体育
1005美羊羊75.095.085.085.0
1006沸羊羊82.070.086.099.0
【算法思想】
(1)使用函数如下:
main():
主函数;
menu():
菜单;
input():
信息输入函数;
display():
信息输出函数;
display1():
名次表输出函数;
sive():
文件保存函数;
sive0():
文件保存(含格式);
load():
文件读取函数;
total():
求总分函数;
QKSort_total(),QKPass_total():
按总分排序函数;
rank():
按总分排名函数;
(2)函数间调用关系如下图所示:
【模块划分】
(1)main函数
(2)QKSort_total函数
(3)total函数
(4)menu函数
(5)input函数
(6)QKPass_total函数
(7)rank函数
(8)display函数
【数据结构】
structsubjects
{
floatgrade;
charcourse[20];
}sub[maxsize1];
structstudents
{
intnum;
introom;
charname[20];
floattotal;
intrank;
structsubjectssub[maxsize1];
}stu[maxsize0];
typedefstruct
{
intM,N;
structstudentsstu[maxsize0];
structsubjectssub[maxsize1];
}number;
【测试情况】
1.系统界面
2.输入信息
3.输入后数据输出
4.查看名次表
5输出综合成绩表.
6.添加信息
7.输出添加后的综合成绩表
8.退出系统
【心得】
通过本次课设我学习到了许多,同时也温习了一边以前学的知识。
虽然我选择的课设题目以前做过类似的,但是编写程序,调试程序是还是遇到了许许多多的问题。
一开始遇到的问题就是结构体的定义,因为变量比较多,所以一开始定义结构体时感觉无从下手,之后分析了变量之间的关系后,确定了结构体的定义。
由于题目要求是输入n个学生,m门课成绩,所以课程数目应该是可变的。
所以定义结构体里应该包含学号、姓名、科目、成绩、总分、名次。
其中的学号、姓名、总分、名次都是一个学生有一个,所以将它们放到一个结构体students中,将课程与各科成绩放到一个结构体subjects中。
之后为了方便保存,又将这两个结构体放到一个结构体numer中。
又由于成绩是一个学生一门课有一个成绩,所以又将结构体subjects放到了结构体students中。
这样就可以表示出任意一个学生的任意一门课的成绩。
之后遇到问题就是排序出了问题,排序方法使用的是快速排序法对总分从高到低进行排序。
一开始循环条件为while(low
通过一步一步分析程序运行过程,知道了问题所在,之后将条件改为了Num.stu[high].total 排序过程中需要变量之间交换位置,所以就需要学生的学号、姓名、成绩、总分交换位置。 所以定义了结构体变量y=Num.sub[low];通过赋值Num.sub[low]=y;来交换学生成绩信息,之后输出出现问题了,科目没有输出。 之后知道了科目和各科成绩同为结构体subjects的成员,所以赋值过程中使得科目信息丢失。 后来赋值语句改为了Num.sub[low].grade=y.grade;然后输出正常。 在一开始定义的结构体时是将科目、成绩放到了一个结构体里,将学号、姓名、总分、名次放到了一个结构体里,又将第一个结构体放到了第二个中。 在编写输入信息那个函数时就看到其弊端,不能表示每个学生的成绩,只能是一个学生的各科成绩。 所以一开始不应该一股脑的开始编写,应该先用笔纸画一下变量之间的关系,还有大概的编程思路。 这样在开始编程,就不会有不知所措的感觉了。 之后在读取文件时有问题,因为读取过文件后不知道有多少学生的信息,也不知道科目数。 所以在输出时,循环条件就会出问题,不能继续使用人数、科目数作为循环终止条件,这样读取的信息就不能正常输出。 所以就又在结构体number里添加了N、M这两个成员来记录人数、科目数。 之后和输入信息一起保存到文件,之后读取出来,这样就不需要修改或者添加其他函数。 从中知道了编程时遇到问题应该想办法解决,而且办法不只一个是时,应该选择一个最优的办法。 综上所述,通过本次课设我学习到了许多,也更加清楚编写一个程序应该注意什么。 首先就是在编写之前就应该想想怎样实现所需功能,应该有初步的想法。 之后在付诸行动,程序运行一遍出了问题后,就需要读一遍出问题的函数,找到问题所在,修改后再次运行,还有问题的话就需要再次检查。 总之程序编写完成后的调试过程也是非常漫长的,因为不可能一次编好,在这个过程中就需要我们的细心与耐心。 一切都调好了后就是系统界面的优化,这时也需计算应空多少空格,也需一遍一遍运行看看效果。 而且也从这次编程中复习到了以前C语言的知识,同时也学到了一些新的知识,对于过去学习的知识也有了更深的了解。 【源程序】 #include #include #include #include #include #definemaxsize0100 #definemaxsize110 structsubjects { floatgrade; charcourse[20]; }sub[maxsize1]; structstudents { intnum; introom; charname[20]; floattotal; intrank; structsubjectssub[maxsize1]; }stu[maxsize0]; typedefstruct { intM,N; structstudentsstu[maxsize0]; structsubjectssub[maxsize1]; }number; numberNum; inta=0,b=0; voidsave0() { FILE*fp; inti,j,k; if((fp=fopen("Student.txt","w"))==NULL) { printf("\n文件打开失败! \n"); exit(0); } if(Num.stu[0].total! =0) fprintf(fp,"名次"); fprintf(fp,"学号姓名"); for(j=0;j { fprintf(fp,"%s",Num.sub[j].course); } if(Num.stu[0].total! =0) fprintf(fp,"总分\n"); elsefprintf(fp,"\n"); for(i=0;i { if(Num.stu[0].total! =0) fprintf(fp,"%4d",Num.stu[i].rank); fprintf(fp,"%d",Num.stu[i].num); k=strlen(Num.stu[i].name); while(8-k>0) { fprintf(fp,""); k++; } fprintf(fp,"%s",Num.stu[i].name); for(j=0;j { k=strlen(Num.sub[j].course); while(k-4>0) { fprintf(fp,""); k-=2; } fprintf(fp,"%.1f",Num.stu[i].sub[j].grade); } if(Num.stu[0].total! =0) fprintf(fp,"%.1f\n",Num.stu[i].total); elsefprintf(fp,"\n"); } fclose(fp); } voidsave() { FILE*fp; inti; if((fp=fopen("Student.dat","w"))==NULL) { printf("\n不能打开文件\n"); exit(0); } for(i=0;i { if(fwrite(&Num,sizeof(number),1,fp)! =1) printf("文件输入错误\n"); } fclose(fp); save0(); } voidload() { FILE*fp; inti; if((fp=fopen("Student.dat","r"))==NULL) { printf("\n不能打开文件\n"); exit(0); } for(i=0;! feof(fp);i++) { fread(&Num,sizeof(number),1,fp); } fclose(fp); } voidinput() { inti,j,y=0; while(a==0) { printf("请输入将要输入学生的人数: "); scanf("%d",&Num.N); printf("\n请输入将要输入学生科目数: "); scanf("%d",&Num.M); printf("\n"); if(Num.N>maxsize0)printf("输入信息数过多,请重新输入: \n"); elsebreak; } if(a==0) { printf("请输入科目数,并且输入相应数字选择科目或添加科目: \n\n"); printf("\t0.高数1.英语2.数据结构3.数字逻辑\n\t4.模电5.线性代数6.离散数学7.添加课程\n"); } while(y { scanf("%d",&j); switch(j) { case0: strcpy(Num.sub[y].course,"高数");break; case1: strcpy(Num.sub[y].course,"英语");break; case2: strcpy(Num.sub[y].course,"数据结构");break; case3: strcpy(Num.sub[y].course,"数字逻辑");break; case4: strcpy(Num.sub[y].course,"线性代数");break; case5: strcpy(Num.sub[y].course,"模电");break; case6: strcpy(Num.sub[y].course,"离散数学");break; case7: printf("请输入需添加科目: \n"); scanf("%s",Num.sub[y].course);break; } y++; } if(a==1) { printf("请输入将要添加学生信息数: \n"); scanf("%d",&b); } printf("请按顺序输入学生学号、姓名以及各科成绩\n"); printf("学号姓名"); for(y=0;y { printf("%s",Num.sub[y].course); } printf("\n"); if(a==1) { i=Num.N; Num.N=Num.N+b; } elsei=0; for(;i { scanf("%d%s",&Num.stu[i].num,Num.stu[i].name); for(y=0;y { scanf("%f",&Num.stu[i].sub[y].grade); } } } voidtotal() { floatnumber; inti,j; for(i=0;i { number=0; for(j=0;j { number=Num.stu[i].sub[j].grade+number; } Num.stu[i].total=number; } } intQKPass_total(intlow,inthigh) { structstudentsx; structsubjectsy; x=Num.stu[low]; y=Num.sub[low]; while(low { while(low high--; if(low { Num.stu[low]=Num.stu[high]; Num.sub[low].grade=Num.sub[high].grade; low++; } while(low low++; if(low { Num.stu[high]=Num.stu[low]; Num.sub[high].grade=Num.sub[low].grade; high--; } } Num.stu[low]=x; Num.sub[low].grade=y.grade; returnlow; } voidQKSort_total(intlow,inthigh) { intpos; if(low { pos=QKPass_total(low,high); QKSort_total(low,pos-1); QKSort_total(pos+1,high); } } voidrank() { intlow=0,high=Num.N,i,k=1; total(); QKSort_total(low,high); for(i=0;i { Num.stu[i].rank=k; k++; if(Num.stu[i].total==Num.stu[i+1].total) k--; } } voiddisplay() { inti=0,j,k; if(Num.stu[0].total! =0) { printf("\t-------------------"); for(j=0;j { printf("---"); for(k=strlen(Num.sub[j].course);k>0;k--) printf("-"); } printf("---------------"); } else { printf("\t------------------"); for(j=0;j { printf("---"); for(k=strlen(Num.sub[j].course);k>0;k--) printf("-"); } printf("\n\t▏"); } if(Num.stu[0].total! =0) { printf("\n\t▏名次▏"); } printf("学号▏姓名▏"); for(i=0;i printf("%s▏",Num.sub[i].course); if(Num.stu[0].total! =0) { printf("总分▏\n"); } if(Num.stu[0].total! =0) { printf("\t--------------------------"); for(j=0;j { printf("---"); for(k=strlen(Num.sub[j].course);k>0;k--) printf("-"); } printf("--------"); } else { printf("\n\t------------------"); for(j=0;j { printf("---"); for(k=strlen(Num.sub[j].course);k>0;k--) printf("-"); } printf("\t"); } for(i=0;i { if(Num.stu[0].total! =0) { printf("\n\t▏%4.d",Num.stu[i].rank); } elseprintf("\n\t"); printf("▏%d▏",Num.stu[i].num); k=strlen(Num.stu[i].name); while(8-k>0) { printf(""); k++; } printf("%s▏",Num.stu[i].name); for(j=0;j { k=strlen(Num.sub[j].course); while(k-4>0) { printf(""); k-=1; } printf("%.1f▏",Num.stu[i].sub[j].grade); } if(Num.stu[0].total! =0) { printf("%.1f▏",Num.stu[i].total); } printf("\n"); if(Num.stu[0].total! =0) { printf("\t--------------------------"); for(j=0;j { printf("---"); for(k=strlen(Num.sub[j].course);k>0;k--) printf("-"); } printf("--------"); } else { printf("\t------------------"); for(j=0;j { printf("---"); for(k=strlen(Num.sub[j].course);k>0;k--) printf("-"); } } } printf("\n\t***任意键返回主菜单***"); } voiddisplay1() { inti,k; printf("\n\n\t****名次表****\n"); printf("\t---------------------------\n"); printf("\t▏名次▏姓名▏总分▏\n"); printf("\t---------------------------\n"); for(i=0;i { printf("\t▏%4d▏",Num.stu[i].rank); k=strlen(Num.stu[i].name); while(8-k>0) { printf(""); k++; } printf("%s▏",Num.stu[i].name); printf("%.1f▏\n",Num.stu[i].total); printf("\t---------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告