统计成绩 [问题描述] 给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。对学

是数据结构课设的一题目,用c语言都成
2025-04-08 14:21:35
推荐回答(2个)
回答1:

收下此问题。----vc6.0测试通过--------------
/*******************************************
[问题描述]
给出n个学生的m门考试的成绩表,
每个学生的信息由学号、姓名以及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
[基本要求]
(1) 按总数高低次序,打印出名次表,分数相同的为同一名次;
(2) 按名次打印出每个学生的学号、姓名、总分以及各科成绩。
[测试数据]
由学生依据软件工程的测试技术自己确定。注意测试边界数据。
[选作内容]
对各科成绩设置不同的权值。
//---既然是没有删除等操作,那我就用数组来做了。
里有一些极小值的宏定义,可以拿来使用。例如

#define FLT_EPSILON 1.19209290E-07F
#define LDBL_EPSILON 1.084202172485504E-19

可以用来判断float,long double 的相等问题。

//---copyright By kuaidh00 ---200801/08----------

******************************************/

#include
#include
#include
#include
#include
#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 {
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;
//stu[i].m_Score=score;//此步骤?????(不可行。)
for(j=0;j {
(stu+i)->m_Score[j]=score[j];
}
//-------计算成绩总和写入到sum[]中--------
*(Asum+i)=0.0;
for(j=0;j {
//(*(Asum+i))=(*(Asum+i))+((stu+i)->m_Score[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< cout<<"============================打印名次信息================================="< cout<<"========================================================================="< cout<<"名次======学号======姓名======总分=====名 科 成 绩===="<
for(int i=0;i {
for(int j=0;j {
if(Asum[j]==Agrade[i])
{
cout< < < < for(int k=0;k cout< }
//cout< }
}
}

float* Sort(float* Agrade,int nSize)
{//练习一下直接插值排序法。会用到“哨兵”。nSize表示grade[]中实际元素的个数。
for(int i=1;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 {
for(int j=0;j {
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);
}

回答2:

题目都不完整