ps:这题的输入我看到括号以为要用字符串,谁知道看了大神的才知道可以这样"scanf("%d(%d)",&a,&b);" 觉得好神奇.. 然后知道了scanf()返回的是接收的个数,如果只有一个就会返回1,2个返回2,这样就可以很好的解决这个问题了。。。
还有一个很大很大的收获。就是qsort里面的cmp,可以自己编写,编写的格式:
int cmp(const void *a,const void *b){
}
里面会用到指针,所以一开始的形参会用const void *a和const void *b,要是你要比较的是其他类型的,必须改变他.比如整型, int *q=(int *)a.
然后就是返回,返回值是一个int型的数,如果大于0,就认为a>b,小于0,就认为a<b. 如果return a-b ,就会得到升序,return b-a就会得到降序.
贴上代码;
#include "stdio.h" #include "string.h" #include "stdlib.h" int cmp(const void *a,const void *b); typedef struct people{ char name[15]; int time; int num; }people; people peo1[1010]; int main(){ int n,m,num,time,num1,i,a,b; char name[15]; num1=0; scanf("%d%d",&n,&m); while(~scanf("%s",&name)){ num=time=0; for(i=0;i<n;i++){ if(scanf("%d(%d)",&a,&b)==2){ num++; time+=(a+b*m); } else{ if(a>0){ num++; time+=a; } } } strcpy(peo1[num1].name,name); peo1[num1].time=time; peo1[num1].num=num; num1++; } qsort(peo1,num1,sizeof(people),cmp); for(i=0;i<num1;i++){ printf("%-10s %2d %4d\n",peo1[i].name,peo1[i].num,peo1[i].time); } return 0; } int cmp(const void *a,const void *b){ people *p = (people*)a,*q=(people *)b; if(p->num!=q->num) return q->num-p->num; if(p->time!=q->time) return p->time-q->time; return strcmp(p->name,q->name); }