原题链接:成绩排序
解题思路:
注意事项:
多组输入代码实现
二级动态数组的内存分配及释放
strcmp及strcpy函数
参考代码:
#include<stdio.h>
#include<string.h>
int main()
{
int m;
while(~scanf("%d",&m)){ //多组输入
char **xm,middle_xm[101]; //建立二级动态姓名数组
int *nl,*cj,i,j,k,n=101,min,middle_nlcj; //建立一级动态年龄成绩数组
//逐级分配二级姓名数组的内存空间
xm=(char **)calloc(m,sizeof(char*));
for(i=0;i<m;i++)
xm[i]=(char *)calloc(n,sizeof(char));
//为年龄和成绩动态数组分配空间
nl=(int *)calloc(m,sizeof(int));
cj=(int *)calloc(m,sizeof(int));
//将输入的姓名字符串及年龄成绩分别放进姓名年龄成绩数组
for(j=0;j<m;j++){
scanf("%s",xm[j]);
scanf("%d",&nl[j]);
scanf("%d",&cj[j]);
}
//从小到大进行排序
for(k=0;k<m;k++){
min=k;
for(i=k+1;i<m;i++){
if(cj[i]<cj[min])
min=i;
if(cj[i]==cj[min]){
if(strcmp(xm[i],xm[min])<0)
min=i;
else if(strcmp(xm[i],xm[min])==0)
if(nl[i]<nl[min])
min=i;
}
}
middle_nlcj=nl[k];
nl[k]=nl[min];
nl[min]=middle_nlcj;
middle_nlcj=cj[k];
cj[k]=cj[min];
cj[min]=middle_nlcj;
strcpy(middle_xm,xm[k]);
strcpy(xm[k],xm[min]);
strcpy(xm[min],middle_xm);
}
//排序后输出
for(j=0;j<m;j++)
printf("%s %d %d\n",xm[j],nl[j],cj[j]);
//释放动态数组
for(i=0;i<m;i++)
free(xm[i]);
free(xm);
free(nl);
free(cj);
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复