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;
}