成绩统计系统数据结构课程设计Word格式文档下载.doc
《成绩统计系统数据结构课程设计Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《成绩统计系统数据结构课程设计Word格式文档下载.doc(14页珍藏版)》请在冰点文库上搜索。
4.总体设计
(1)模块划分:
<
1>
初始化函数:
Node*Init();
2>
直接插入法排序函数:
float*Sort();
3>
相同名次处理函数:
intDel_Same();
4>
打印函数voidDisplay();
5>
主函数:
voidmain()
语文
数学
英语
物理
处理相同分数
排
序
输入成绩
输入学号
输入姓名
欢迎进入成绩统计系统
2、组成框图:
3、流程图
<
直接插入法:
float*Sort();
相同名次处理:
intDel_Same();
<
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
6.测试与调试
1、输入数据:
2.打印成绩
7.源程序清单
#include<
stdio.h>
string>
float.h>
iostream>
iomanip>
#definen3/*学生数*/
#definem4/*课程数*/
usingnamespacestd;
//---声明一个结构----
//------函数声明---------------------------
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<
n;
++i)
{
printf("
请输入第%d/%d名学生的信息:
\n"
i+1,n);
请输入姓名:
"
);
scanf("
%s"
name);
\n请输入学号:
%d"
&
id);
for(j=0;
j<
m;
++j)
{
printf("
\n录入第%d/%d门课程成绩:
"
j+1,m);
scanf("
%f"
score[j]);
}
\n"
//---赋值过程---------------
strcpy((stu+i)->
m_Name,name);
//修改成指针访问形式.
(stu+i)->
m_ID=id;
j++)
(stu+i)->
m_Score[j]=score[j];
//-------计算成绩总和写入到sum[]中--------
*(Asum+i)=0.0;
(*(Asum+i))+=((stu+i)->
m_Score[j]);
}
}//for(n)
printf("
成功!
~数据录入完毕!
returnstu;
}
voidDisplay(Node*stu,intnN,float*Asum,intnSum,float*Agrade,intnGreadeSize)
{//打印。
按名次从第一名到最后一名。
cout<
endl<
========================================================================="
endl;
============================打印名次信息================================="
名次======学号======姓名======总分=====名科成绩===="
for(inti=0;
nGreadeSize;
{
for(intj=0;
{
if(Asum[j]==Agrade[i])
{
cout<
setw(10)<
left<
i+1//名次。
<
stu[j].m_ID//学号。
stu[j].m_Name//姓名。
Asum[j];
//总分。
for(intk=0;
k<
++k)
cout<
stu[j].m_Score[k];
//名科成绩。
}
//cout<
}
float*Sort(float*Agrade,intnSize)
{//练习一下直接插值排序法。
。
nSize表示grade[]中实际元素的个数。
for(inti=1;
nSize;
{
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;
nSum;
++i)//sum[]
for(intj=0;
nElem;
++j)//grade[]
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语言写很简单。
如果想把本学期数据结构的知识应用到程序中还是很有挑战性的。
我采用的是直接插入排序法,刚开始把书上的程序照搬过来,结果发现有许多的错误。
改了很久才改对。
最难的是相同成绩处理的函数,我刚开始以为很简单,但是前面各个成绩采用的是指针结构体,很难处理,最后在网上查找了一下才对照着改正过来。
最后我学会的是可以先把数据输入数组内,在用指针直接指向数据就可以了,这样比输入数据时就用指针要简单的多。
11