- 论坛徽章:
- 0
|
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- int num[100];
- char name[100][10];
- int mark[100];
- int tag[100];
- int n1,n2;
- int comp(const void *a,const void *b);//比较函数
- main()
- {
-
- int i,k=0;
- while(scanf("%d%d",&n1,&n2)&&n1)
- { for(i=0;i<n1;i++) //循环输入数据
- {
- scanf("%d%s%d",&num[i],name[i],&mark[i]);
- tag[i]=i;
- }
- qsort(tag,n1,sizeof(int),comp);//根据comp函数来排序tag数组
- printf("Case %d:\n",++k);
- for(i=0;i<n1;i++)
- printf("%06d %s %d\n",num[tag[i]],name[tag[i]],mark[tag[i]]);//根据tag排序结果输出数组相应值
- }
- }
- int comp(const void *a,const void *b)
- {int *x=(int*)a; //将a,b强制成整形指针
- int *y=(int*)b;
- int c,d;
- c=x-(int *)tag;//计算指针到数组开始位置的距离
- d=y-(int *)tag;
- if(n2==2)//从这里开始应用得到的距离c,d进行相应比较
- {
- if(strcmp(name[c],name[d])!=0)
- return(strcmp(name[c],name[d]));
- }
- else if(n2==3)
- {
- if(mark[c]!=mark[d])
- return (mark[c]-mark[d]);
- }
- return num[c]-num[d];
- }
- 这是一道acm题
- 输入:
- 3 1 //第一行的意思是总共有3行数据输入,按第1列排序,如果输入为3 2,则
- 000007 James 85 //按第2列排序,如果第2列有重复数据,则按第1排序
- 000010 Amy 90
- 000001 Zoe 60
- ,
- 结果:
- Case 1:
- 000001 Zoe 60
- 000007 James 85
- 000010 Amy 90
- 是不是comp强制转换问题啊,当按第2,3列排序是总是出错
- 请各位给看看
- 谢谢
复制代码
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1862
[ 本帖最后由 我是害虫 于 2008-3-12 00:41 编辑 ] |
|