C语言 //练习 求出三名学生 三门功课成绩 并排序 通过堆空间来实现 arr[3][3]

int main()
{
//练习 求出三名学生 三门功课成绩 并排序 通过堆空间来实现 arr[3][3]
int ** p = (int **)malloc(sizeof(int *) * 3);
p[0] = (int *)malloc(sizeof(int) * 3);
p[1] = (int *)malloc(sizeof(int) * 3);
p[2] = (int *)malloc(sizeof(int) * 3);

p[0][0] = 70; p[0][1] = 80; p[0][2] = 90;
p[1][0] = 55; p[1][1] = 60; p[1][2] = 40;
p[2][0] = 80; p[2][1] = 66; p[2][2] = 88;

free(p[0]);
free(p[1]);
free(p[2]);
free(p);
return 0;
}

按照你的代码往下写。
动态申请的内存在使用前建议先用if判断一下,防止申请失败,引用到空地址。
关于排序,你没有指明按什么排序以及排序方式。
所以我写的函数根据你传参,分别按各学科成绩/总分进行升序/降序排列。

#include <stdio.h>

#include <malloc.h>

int showArry(int **p,int clo,int row);

void px(int **p,int clo,int row,int x,int flag);//按学科x排序(0~clo-1),x=clo按三科总分排序,flag=1升序排序,flag=0降序排序

int main()

{

int i,x=-1,flag=-1;

int **p=(int **)malloc(sizeof(int *)*3);

if(!p)

return 1;

for(i=0;i<3;i++)

if(!(p[i]=(int *)malloc(sizeof(int)*3)))

return 1;

p[0][0]=70,p[0][1]=80,p[0][2]=90;

p[1][0]=55,p[1][1]=60,p[1][2]=40;

p[2][0]=80,p[2][1]=66,p[2][2]=88;

printf("3名学生3科成绩情况为:\n");

showArry(p,3,3);

printf("请输入排序依据:(0按学科1排序,1按学科2排序,2按学科3排序,3按总分排序):");

while(x<0 || x>3)

scanf("%d",&x);

printf("请输入排序方式:(1升序排列,0降序排列):");

while(flag!=1 && flag!=0)

scanf("%d",&flag);

px(p,3,3,x,flag);

showArry(p,3,3);

free(p[0]);

free(p[1]);

free(p[2]);

free(p);

return 0;

}

int showArry(int **p,int clo,int row)

{

int i,j;

for(i=0;i<row;i++,printf("\n"))

for(j=0;j<clo;j++)

printf("%2d ",p[i][j]);

return 0;

}

void px(int **p,int clo,int row,int x,int flag)

{

int i,j,sum[row],*ps=NULL,ss;

if(x==clo)

{

for(i=0;i<row;i++)

{

sum[i]=0;

for(j=0;j<clo;j++)

sum[i]+=p[i][j];

}

printf("学科成绩总分%s排列:\n",flag?"升序":"降序");

}

else

printf("按照学科%d的成绩%s排列:\n",x,flag?"升序":"降序");

for(i=0;i<row;i++)

for(j=i+1;j<row;j++)

if((x<clo && flag && p[i][x]>p[j][x])||(x<clo && !flag && p[i][x]<p[j][x])||(x==clo && flag && sum[i]>sum[j])||(x==clo && !flag && sum[i]<sum[j]))

ps=p[i],p[i]=p[j],p[j]=ps,ss=sum[i],sum[i]=sum[j],sum[j]=ss;

}

温馨提示:答案为网友推荐,仅供参考
相似回答