C语言程序,请你编写一个程序计算每个学生的平均成绩并按降序排序
答案:2 悬赏:30 手机版
解决时间 2021-11-17 23:35
- 提问者网友:椧運幽默
- 2021-11-17 20:41
C语言程序,请你编写一个程序计算每个学生的平均成绩并按降序排序
最佳答案
- 五星知识达人网友:北城痞子
- 2021-11-17 21:32
你这个可以用链表来写,同类型我已经写过几次链表的,需要你可以去我回答记录里找。
这次,我不用链表,直接用2维数组,冒泡排序,那你参考吧。
原理:1、数组内存的连续性 2、利用指针冒泡排序
#include
#include
#include
void prStu(float *stu);//打印学生成绩 参数:数组首地址
void jx(float *p);//降序排列
int main()
{
float stu[50][6],*p=&stu[0][0],num[4]; //stu:50学生信息 1列为学生编号 2~5列为4科成绩 6列为平均分
int i=0,count=0;
//--这段我是用随机数做50个学生的成绩,我懒得录入200个成绩!!,你要手输,就把这段随机数改成输入函数---
srand(time(NULL));
while(i++<300)
{
count++;
if(count==1)//学生编号存储
*p++=(float)i/6+1;
if(count>1 && count<6)//随机2位数作为4科成绩
*p++=(float)(rand()%100);
if(count==6)
{
count=0;
num[0]=*(p-1);
num[1]=*(p-2);
num[2]=*(p-3);
num[3]=*(p-4);
*p++=(num[0]+num[1]+num[2]+num[3])/4;//4科平均分
}
}
//------------------------------------------------------------
prStu(&stu[0][0]);
jx(&stu[0][0]);
printf("
降序排列后的数据:
");
prStu(&stu[0][0]);
return 0;
}
void jx(float *p)//降序排列
{
int count1=0,count2;
float *p1=NULL,*p2=NULL,id,num[4],pj;
while(count1++<49)
{
p1=p+5;//p1 p2 在迭代中分别指向前后两个学生的平均分
p2=p1+6;
count2=count1-1;
while(count2++<49)
{
if(*p1<*p2)//冒泡排序
{
id=*(p1-5);
*(p1-5)=*(p2-5);
*(p2-5)=id;
num[0]=*(p1-4);
num[1]=*(p1-3);
num[2]=*(p1-2);
num[3]=*(p1-1);
*(p1-4)=*(p2-4);
*(p1-3)=*(p2-3);
*(p1-2)=*(p2-2);
*(p1-1)=*(p2-1);
*(p2-4)=num[0];
*(p2-3)=num[1];
*(p2-2)=num[2];
*(p2-1)=num[3];
pj=*p1;
*p1=*p2;
*p2=pj;
}
p2+=6;
}
p+=6;
}
}
void prStu(float *p)//打印学生成绩 参数:数组首地址
{
int count=0,i=0;
printf("%19s%16s%6s%6s%6s%8s
","学生sID","数学","语文","外语","物理","平均分");
while(i++<300)
{
count++;
if(count==1)
printf("编号%02d的学生4科成绩及平均分为: ",(int)*p++);
if(count>1 && count<6)
printf(" %02d ",(int)*p++);
if(count==6)
{
count=0;
printf(" %.2f
",*p++);
}
}
}
这次,我不用链表,直接用2维数组,冒泡排序,那你参考吧。
原理:1、数组内存的连续性 2、利用指针冒泡排序
#include
#include
#include
void prStu(float *stu);//打印学生成绩 参数:数组首地址
void jx(float *p);//降序排列
int main()
{
float stu[50][6],*p=&stu[0][0],num[4]; //stu:50学生信息 1列为学生编号 2~5列为4科成绩 6列为平均分
int i=0,count=0;
//--这段我是用随机数做50个学生的成绩,我懒得录入200个成绩!!,你要手输,就把这段随机数改成输入函数---
srand(time(NULL));
while(i++<300)
{
count++;
if(count==1)//学生编号存储
*p++=(float)i/6+1;
if(count>1 && count<6)//随机2位数作为4科成绩
*p++=(float)(rand()%100);
if(count==6)
{
count=0;
num[0]=*(p-1);
num[1]=*(p-2);
num[2]=*(p-3);
num[3]=*(p-4);
*p++=(num[0]+num[1]+num[2]+num[3])/4;//4科平均分
}
}
//------------------------------------------------------------
prStu(&stu[0][0]);
jx(&stu[0][0]);
printf("
降序排列后的数据:
");
prStu(&stu[0][0]);
return 0;
}
void jx(float *p)//降序排列
{
int count1=0,count2;
float *p1=NULL,*p2=NULL,id,num[4],pj;
while(count1++<49)
{
p1=p+5;//p1 p2 在迭代中分别指向前后两个学生的平均分
p2=p1+6;
count2=count1-1;
while(count2++<49)
{
if(*p1<*p2)//冒泡排序
{
id=*(p1-5);
*(p1-5)=*(p2-5);
*(p2-5)=id;
num[0]=*(p1-4);
num[1]=*(p1-3);
num[2]=*(p1-2);
num[3]=*(p1-1);
*(p1-4)=*(p2-4);
*(p1-3)=*(p2-3);
*(p1-2)=*(p2-2);
*(p1-1)=*(p2-1);
*(p2-4)=num[0];
*(p2-3)=num[1];
*(p2-2)=num[2];
*(p2-1)=num[3];
pj=*p1;
*p1=*p2;
*p2=pj;
}
p2+=6;
}
p+=6;
}
}
void prStu(float *p)//打印学生成绩 参数:数组首地址
{
int count=0,i=0;
printf("%19s%16s%6s%6s%6s%8s
","学生sID","数学","语文","外语","物理","平均分");
while(i++<300)
{
count++;
if(count==1)
printf("编号%02d的学生4科成绩及平均分为: ",(int)*p++);
if(count>1 && count<6)
printf(" %02d ",(int)*p++);
if(count==6)
{
count=0;
printf(" %.2f
",*p++);
}
}
}
全部回答
- 1楼网友:英雄的欲望
- 2021-11-17 21:51
有偿?追问呵呵呵,我已经会了追答呵呵
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯