程序员测试题:PAT 乙级 1015 德才论6(自设计的排序函数排序函数myqsort) (C语言版本)
PAT原题
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
struct node
{
unsigned int card;
unsigned int de;
unsigned int cai;
unsigned int level; //记录人员档次
}personarr[100000],person;
void myswap(void *a,void *b,unsigned int size)
{
int i;
char temp;
char* _a = (char*)a;
char* _b = (char*)b;
for(i=0;i<size;i++){
temp = *(_a+i);
*(_a+i) = *(_b+i);
*(_b+i) = temp;
}
}
void pristr(struct node arr[],unsigned int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d %d %d\n",arr[i].card,arr[i].de,arr[i].cai);
}
if(i!=len)
{
printf("\n");
}
}
int mycmp(const void *a,const void *b)//myqsort使用该函数进行回调,德才分》德分>准考证
{
const struct node *local_a = a;
const struct node *local_b = b;
if(local_a->level!=local_b->level)
{
return (local_a->level-local_b->level);
}
else if((local_a->cai+local_a->de)!=(local_b->cai+local_b->de))
{
return ((local_b->cai+local_b->de) - (local_a->cai+local_a->de));
}
else if(local_b->de!=local_a->de)
{
return (local_b->de - local_a->de);
}
else
{
return (local_a->card-local_b->card);
}
}
void myqsort(void *arr,unsigned int len, unsigned int size, int(*cmp)(const void*,const void*))//只适合int类型的mysort,从大到小排列
{
struct node* local_arr = arr;
int i,j;
for(i=0;i<len;i++)
{
for(j=0;j<len;j++)
{
if(cmp(&local_arr[j],&local_arr[j+1])>0)
{
myswap(&local_arr[j],&local_arr[j+1],size);
}
}
}
}
int main()
{
unsigned int num,low,high;
scanf("%d%d%d",&num,&low,&high);
int i=0;//记录有效数据的个数
int level=0;//记录人员排序等级:1级:德才都大于high 2级:德大于high,才低于high 3级 德才都小于high但是德大于才 4 其他的德才都大于low
while(num--)
{
scanf("%d%d%d",&person.card,&person.de,&person.cai);
if(person.de>=low&&person.cai>=low)
{
if(person.de>=high&&person.cai>=high)
{
personarr[i].level = 1;
personarr[i].card = person.card;
personarr[i].de = person.de;
personarr[i].cai = person.cai;
i++;
}
else if(person.de>=high)//符合1级条件的数据录入
{
personarr[i].level = 2;
personarr[i].card = person.card;
personarr[i].de = person.de;
personarr[i].cai = person.cai;
i++;
}else if(person.de>=person.cai)
{
personarr[i].level = 3;
personarr[i].card = person.card;
personarr[i].de = person.de;
personarr[i].cai = person.cai;
i++;
}else
{
personarr[i].level = 4;
personarr[i].card = person.card;
personarr[i].de = person.de;
personarr[i].cai = person.cai;
i++;
}
}
}
printf("%d\n",i);
myqsort(personarr,i-1,sizeof(struct node),mycmp);
pristr(personarr,i);
return 0;
}
通过自定义qsort函数实现德才论,但是还是出现了大量错误。