资源描述
洛 阳 理 工 学 院
课 程 设 计 报 告
课程名称 数据构造课程设计
设计题目 成绩记录系统
专 业 计算机科学与技术
课 程 设 计 任 务 书
设计题目:给出n个学生m门考试成绩表,每个学生信息由学号、姓名以及各科成绩构成。对学生考试成绩进行关于记录,并打印登记表。
设计内容与规定:
(1) 按总数高低顺序,打印出名次表,分数相似为同一名次;
(2) 按名次打印出每个学生学号、姓名、总分以及各科成绩。
课 程 设 计 评 语
成绩:
指引教师:_______________
年 月 日
1. 问题描述
给出n个学生m门考试成绩表,每个学生信息由学号、姓名以及各科成绩构成。对学生考试成绩进行关于记录,并打印登记表。
2. 基本规定
(1) 按总数高低顺序,打印出名次表,分数相似为同一名次;
(2) 按名次打印出每个学生学号、姓名、总分以及各科成绩。
3、数据构造类型定义
struct Student
{
char m_Name[20];
unsigned int m_ID;
float m_Score[m];
};
4. 总体设计
(1)模块划分:
<1>初始化函数: Node* Init();
<2>直接插入法排序函数: float* Sort();
<3>相似名次解决函数: int Del_Same();
<4>打印函数void Display();
<5>主函数:void main()
语文
数学
英语
物理
解决相似分数
排
序
输入成绩
输入学号
输入姓名
欢迎进入成绩记录系统
2、构成框图:
3、流程图
<1>初始化函数: Node* Init(); <2>直接插入法:float* Sort();
<3>相似名次解决:int Del_Same(); <4>打印函数void Display();
5. 详细设计
1.声明一种构造体:
typedef struct Student Node;
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 <stdio.h>
#include <string>
#include <float.h>
#include <iostream>
#include <iomanip>
#define n 3/*学生数*/
#define m 4/*课程数*/
using namespace std;
//---声明一种构造----
struct Student
{
char m_Name[20];
unsigned int m_ID;
float m_Score[m];
};
typedef struct Student Node;
//------函数声明---------------------------
Node* Init(Node* stu,const int cN,float* Asum,int nSum);
float* Sort(float* Agrade,int nSize);
int Del_Same(float* Asum,int nSum,float* Agrade,int nGreade);
void Display(Student* stu,int nN,float* Asum,int nSum,float* Agrade,int nGreadeSize);
//------函数实现---------------------------
//----录入数据------
Node* Init(Node* stu,const int cN,float* Asum,int nSum)
{
char name[20];
unsigned int id;
float score[m];
int i,j;
for(i=0;i<n;++i)
{
printf("请输入第%d/%d名学生信息:\n ",i+1,n);
printf("请输入姓名:");
scanf("%s",name);
printf("\n请输入学号:");
scanf("%d",&id);
for(j=0;j<m;++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<m;j++)
{
(stu+i)->m_Score[j]=score[j];
}
//-------计算成绩总和写入到sum[]中--------
*(Asum+i)=0.0;
for(j=0;j<m;++j)
{
(*(Asum+i))+=((stu+i)->m_Score[j]);
}
}//for(n)
printf("成功!~数据录入完毕! ");
return stu;
}
void Display(Node* stu,int nN,float* Asum,int nSum,float* Agrade,int nGreadeSize)
{//打印。按名次从第一名到最后一名。 cout<<endl<<"========================================================================="<<endl;
cout<<"============================打印名次信息================================="<<endl;cout<<"========================================================================="<<endl;
cout<<"名次======学号======姓名======总分=====名 科 成 绩===="<<endl;
for(int i=0;i<nGreadeSize;++i)
{
for(int j=0;j<n;++j)
{
if(Asum[j]==Agrade[i])
{
cout<<setw(10)<<left<<i+1//名次。
<<setw(10)<<left<<stu[j].m_ID//学号。
<<setw(10)<<left<<stu[j].m_Name//姓名。
<<setw(10)<<left<<Asum[j];//总分。
for(int k=0;k<m;++k)
cout<<setw(10)<<left<<stu[j].m_Score[k];//名科成绩。
}
//cout<<endl;
}
}
}
float* Sort(float* Agrade,int nSize)
{//练习一下直接插值排序法。会用到"哨兵"。nSize表达grade[]中实际元素个数。
for(int i=1;i<nSize;++i)
{
Agrade[nSize]=Agrade[i];//将它放到哨兵里
for(int j=i-1;j>=0;)
{
if(Agrade[nSize]>Agrade[j])//从大到小顺序。一定要注意,是拿"哨兵"来与之比较才对。
{
Agrade[j+1]=Agrade[j];
j--;
}
else
{
break;
}
}//for内
Agrade[j+1]=Agrade[nSize];// 从哨兵中取出这个值来
}//for 外
return Agrade;
}
int Del_Same(float* Asum,int nSum,float* Agrade,int nGreade)
{//将sum[n]中不重复元素放到grade[n]中,函数返回grade[]中实际元素个数。
int Find;//有无重复标记:1为有,0为无。
int nElem=1;//gread[]中实际元素个数。
Agrade[0]=Asum[0];
for(int i=0;i<nSum;++i)//sum[]
{
for(int j=0;j<nElem;++j)//grade[]
{
if(Asum[i]==Agrade[j])//判断两个浮点数相等条件。
{
Find=1;
break;
}
else
{
Find=0;
}
}
if(Find==0)
{
Agrade[nElem]=Asum[i];
nElem++;
}
}//for(最外)
return nElem;
}
//------------
void main()
{
Node Stu[n];
Node* pStu;
pStu=Stu;//声明n个Student对象一种数组。
float sum[n],grade[n+1];//由于想在grade[]中用到直接插值排序法,要用到"哨兵"。因此构造n+1.
pStu=Init(pStu,n,sum,n);
int nGrade_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语言写很简朴。如果想把本学期数据构造知识应用到程序中还是很有挑战性。我采用是直接插入排序法,刚开始把书上程序照搬过来,成果发既有许多错误。改了好久才改对。最难是相似成绩解决函数,我刚开始觉得很简朴,但是前面各个成绩采用是指针构造体,很难解决,最后在网上查找了一下才对照着改正过来。最后我学会是可以先把数据输入数组内,在用指针直接指向数据就可以了,这样比输入数据时就用指针要简朴多。
展开阅读全文