成绩统计系统数据结构课程设计.docx
《成绩统计系统数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《成绩统计系统数据结构课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
成绩统计系统数据结构课程设计
洛阳理工学院
课程设计报告
课程名称数据结构课程设计
设计题目成绩统计系统
专业计算机科学与技术
课程设计任务书
设计题目:
给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
设计内容与要求:
(1)按总数高低次序,打印出名次表,分数相同的为同一名次;
(2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。
课程设计评语
成绩:
指导教师:
_______________
年月日
1.问题描述
给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
2.基本要求
(1)按总数高低次序,打印出名次表,分数相同的为同一名次;
(2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。
3、数据结构类型定义
structStudent
{
charm_Name[20];
unsignedintm_ID;
floatm_Score[m];
};
4.总体设计
(1)模块划分:
<1>初始化函数:
Node*Init();
<2>直接插入法排序函数:
float*Sort();
<3>相同名次处理函数:
intDel_Same();
<4>打印函数voidDisplay();
<5>主函数:
voidmain()
2、组成框图:
3、流程图
<1>初始化函数:
Node*Init();<2>直接插入法:
float*Sort();
<3>相同名次处理:
intDel_Same();<4>打印函数voidDisplay();
5.详细设计
1.声明一个结构体:
typedefstructStudentNode;
2.录入数据
将复制形式修改为指针访问形式,计算成绩总和写入到sum[]中。
3.打印,按名次从第一名到最后一名。
4.下直接插值排序法
会用到"哨兵",nSize表示grade[]中实际元素的个数。
5.处理相同成绩的名次
将sum[n]中的不重复的元素放到grade[n]中,函数返回grade[]中实际元素的个数。
测试数据:
姓名
语文
数学
英语
物理
黄
54
53
52
51
赵
98
97
96
95
李
100
99
99
98
6.测试与调试
1、输入数据:
2.打印成绩
7.源程序清单
#include
#include
#include
#include
#include
#definen3/*学生数*/
#definem4/*课程数*/
usingnamespacestd;
//---声明一个结构----
structStudent
{
charm_Name[20];
unsignedintm_ID;
floatm_Score[m];
};
typedefstructStudentNode;
//------函数声明---------------------------
Node*Init(Node*stu,constintcN,float*Asum,intnSum);
float*Sort(float*Agrade,intnSize);
intDel_Same(float*Asum,intnSum,float*Agrade,intnGreade);
voidDisplay(Student*stu,intnN,float*Asum,intnSum,float*Agrade,intnGreadeSize);
//------函数实现---------------------------
//----录入数据------
Node*Init(Node*stu,constintcN,float*Asum,intnSum)
{
charname[20];
unsignedintid;
floatscore[m];
inti,j;
for(i=0;i{
printf("请输入第%d/%d名学生的信息:
\n",i+1,n);
printf("请输入姓名:
");
scanf("%s",name);
printf("\n请输入学号:
");
scanf("%d",&id);
for(j=0;j{
printf("\n录入第%d/%d门课程成绩:
",j+1,m);
scanf("%f",&score[j]);
}
printf("\n");
//---赋值过程---------------
strcpy((stu+i)->m_Name,name);//修改成指针访问形式.
(stu+i)->m_ID=id;
for(j=0;j{
(stu+i)->m_Score[j]=score[j];
}
//-------计算成绩总和写入到sum[]中--------
*(Asum+i)=0.0;
for(j=0;j{
(*(Asum+i))+=((stu+i)->m_Score[j]);
}
}//for(n)
printf("成功!
~数据录入完毕!
");
returnstu;
}
voidDisplay(Node*stu,intnN,float*Asum,intnSum,float*Agrade,intnGreadeSize)
{//打印。
按名次从第一名到最后一名。
cout<cout<<"============================打印名次信息================================="<cout<<"名次======学号======姓名======总分=====名科成绩===="<for(inti=0;i{
for(intj=0;j{
if(Asum[j]==Agrade[i])
{
cout<<<<for(intk=0;kcout<}
//cout<}
}
}
float*Sort(float*Agrade,intnSize)
{//练习一下直接插值排序法。
会用到"哨兵"。
nSize表示grade[]中实际元素的个数。
for(inti=1;i{
Agrade[nSize]=Agrade[i];//将它放到哨兵里
for(intj=i-1;j>=0;)
{
if(Agrade[nSize]>Agrade[j])//从大到小的顺序。
一定要注意,是拿"哨兵"来与之比较才对的。
{
Agrade[j+1]=Agrade[j];
j--;
}
else
{
break;
}
}//for内
Agrade[j+1]=Agrade[nSize];//从哨兵中取出这个值来
}//for外
returnAgrade;
}
intDel_Same(float*Asum,intnSum,float*Agrade,intnGreade)
{//将sum[n]中的不重复的元素放到grade[n]中,函数返回grade[]中实际元素的个数。
intFind;//有无重复的标记:
1为有,0为无。
intnElem=1;//gread[]中的实际元素个数。
Agrade[0]=Asum[0];
for(inti=0;i{
for(intj=0;j{
if(Asum[i]==Agrade[j])//判断两个浮点数相等条件。
{
Find=1;
break;
}
else
{
Find=0;
}
}
if(Find==0)
{
Agrade[nElem]=Asum[i];
nElem++;
}
}//for(最外)
returnnElem;
}
//------------
voidmain()
{
NodeStu[n];
Node*pStu;
pStu=Stu;//声明n个Student对象的一个数组。
floatsum[n],grade[n+1];//因为想在grade[]中用到直接插值排序法,要用到"哨兵"。
所以构造n+1.
pStu=Init(pStu,n,sum,n);
intnGrade_size;
nGrade_size=Del_Same(sum,n,grade,n+1);
float*pGrade=0;
pGrade=Sort(grade,nGrade_size);
Display(pStu,n,sum,n,grade,nGrade_size);
}
八、心得体会
这次我抽到的题目很简单,但是这是指用基础的C语言写很简单。
如果想把本学期数据结构的知识应用到程序中还是很有挑战性的。
我采用的是直接插入排序法,刚开始把书上的程序照搬过来,结果发现有许多的错误。
改了很久才改对。
最难的是相同成绩处理的函数,我刚开始以为很简单,但是前面各个成绩采用的是指针结构体,很难处理,最后在网上查找了一下才对照着改正过来。
最后我学会的是可以先把数据输入数组内,在用指针直接指向数据就可以了,这样比输入数据时就用指针要简单的多。