#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
#define MAX 3
int scorecmp(const void *a, const void *b);
int ComparePlayerScore( const void* ap , const void* bp );
int CompareInt( const int a , const int b );
typedef struct {
double score;
int player_num;
} player_t;
struct top3_players {
player_t *top[3];
};
void top3_determine(struct top3_players *top, player_t *players, size_t n) {
player_t *top1 = NULL;
player_t *top2 = NULL;
player_t *top3 = NULL;
for (size_t i = 0; i < n; i++) {
player_t *player = &players[i];
if (top1 == NULL || ComparePlayerScore(player, top1) < 0) {
top3 = top2;
top2 = top1;
top1 = player;
} else if (top2 == NULL || ComparePlayerScore(player, top2) < 0) {
top3 = top2;
top2 = player;
} else if (top3 == NULL || ComparePlayerScore(player, top3) < 0) {
top3 = player;
}
}
top->top[0] = top1;
top->top[1] = top2;
top->top[2] = top3;
}
int
main(int argc, char *argv[]) {
int i;
int player_numbers[] = {1, 2, 3, 4, 5, 6};
double scores[] = {0.765, 0.454, 0.454, 0.345, 0.643, 0.532};
player_t
*players
= malloc(SIZE
* sizeof(player_t
));
for (i = 0; i < SIZE; i++) {
players[i].score = scores[i];
players[i].player_num = player_numbers[i];
}
struct top3_players top;
top3_determine(&top, players, SIZE);
for (i = 0; i < MAX; i++) {
printf("Player %d: Score: %.3f\n", top.
top[i
]->player_num
, top.
top[i
]->score
); }
return 0;
}
int ComparePlayerScore( const void* ap , const void* bp ) {
const player_t* const a = ap;
const player_t* const b = bp;
if( a->score == b->score ){
return CompareInt( a->player_num , b->player_num );
}
else if( a->score > b->score ) {
return -1;
}
else {
return 1;
}
}
int CompareInt( const int a , const int b ) {
if( a < b ){
return -1;
}
else if( a > b ){
return 1;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgU0laRSA2CiNkZWZpbmUgTUFYIDMKCmludCBzY29yZWNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKaW50IENvbXBhcmVQbGF5ZXJTY29yZSggY29uc3Qgdm9pZCogYXAgLCBjb25zdCB2b2lkKiBicCApOwppbnQgQ29tcGFyZUludCggY29uc3QgaW50IGEgLCBjb25zdCBpbnQgYiApOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgZG91YmxlIHNjb3JlOwogICAgaW50IHBsYXllcl9udW07Cn0gcGxheWVyX3Q7CgpzdHJ1Y3QgdG9wM19wbGF5ZXJzIHsKICBwbGF5ZXJfdCAqdG9wWzNdOwp9OwoKdm9pZCB0b3AzX2RldGVybWluZShzdHJ1Y3QgdG9wM19wbGF5ZXJzICp0b3AsIHBsYXllcl90ICpwbGF5ZXJzLCBzaXplX3QgbikgewogIHBsYXllcl90ICp0b3AxID0gTlVMTDsKICBwbGF5ZXJfdCAqdG9wMiA9IE5VTEw7CiAgcGxheWVyX3QgKnRvcDMgPSBOVUxMOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICBwbGF5ZXJfdCAqcGxheWVyID0gJnBsYXllcnNbaV07CiAgICBpZiAodG9wMSA9PSBOVUxMIHx8IENvbXBhcmVQbGF5ZXJTY29yZShwbGF5ZXIsIHRvcDEpIDwgMCkgewogICAgICB0b3AzID0gdG9wMjsKICAgICAgdG9wMiA9IHRvcDE7CiAgICAgIHRvcDEgPSBwbGF5ZXI7CiAgICB9IGVsc2UgaWYgKHRvcDIgPT0gTlVMTCB8fCBDb21wYXJlUGxheWVyU2NvcmUocGxheWVyLCB0b3AyKSA8IDApIHsKICAgICAgdG9wMyA9IHRvcDI7CiAgICAgIHRvcDIgPSBwbGF5ZXI7CiAgICB9IGVsc2UgaWYgKHRvcDMgPT0gTlVMTCB8fCBDb21wYXJlUGxheWVyU2NvcmUocGxheWVyLCB0b3AzKSA8IDApIHsKICAgICAgdG9wMyA9IHBsYXllcjsKICAgIH0KICB9CiAgdG9wLT50b3BbMF0gPSB0b3AxOwogIHRvcC0+dG9wWzFdID0gdG9wMjsKICB0b3AtPnRvcFsyXSA9IHRvcDM7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIGludCBpOwoKICAgIGludCBwbGF5ZXJfbnVtYmVyc1tdID0gezEsIDIsIDMsIDQsIDUsIDZ9OwogICAgZG91YmxlIHNjb3Jlc1tdID0gezAuNzY1LCAwLjQ1NCwgMC40NTQsIDAuMzQ1LCAwLjY0MywgMC41MzJ9OwoKICAgIHBsYXllcl90ICpwbGF5ZXJzID0gbWFsbG9jKFNJWkUgKiBzaXplb2YocGxheWVyX3QpKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgcGxheWVyc1tpXS5zY29yZSA9IHNjb3Jlc1tpXTsKICAgICAgICBwbGF5ZXJzW2ldLnBsYXllcl9udW0gPSBwbGF5ZXJfbnVtYmVyc1tpXTsKICAgIH0KCiAgICBzdHJ1Y3QgdG9wM19wbGF5ZXJzIHRvcDsKICAgIHRvcDNfZGV0ZXJtaW5lKCZ0b3AsIHBsYXllcnMsIFNJWkUpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBNQVg7IGkrKykgewogICAgICAgIHByaW50ZigiUGxheWVyICVkOiBTY29yZTogJS4zZlxuIiwgdG9wLnRvcFtpXS0+cGxheWVyX251bSwgdG9wLnRvcFtpXS0+c2NvcmUpOwogICAgfQoKICAgIGZyZWUocGxheWVycyk7CgogICAgcmV0dXJuIDA7Cn0KCmludCBDb21wYXJlUGxheWVyU2NvcmUoIGNvbnN0IHZvaWQqIGFwICwgY29uc3Qgdm9pZCogYnAgKSB7CiAgICBjb25zdCBwbGF5ZXJfdCogY29uc3QgYSA9IGFwOwogICAgY29uc3QgcGxheWVyX3QqIGNvbnN0IGIgPSBicDsKCiAgICBpZiggYS0+c2NvcmUgPT0gYi0+c2NvcmUgKXsKICAgICAgICByZXR1cm4gQ29tcGFyZUludCggYS0+cGxheWVyX251bSAsIGItPnBsYXllcl9udW0gKTsKICAgIH0KICAgIGVsc2UgaWYoIGEtPnNjb3JlID4gYi0+c2NvcmUgKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cn0KCmludCBDb21wYXJlSW50KCBjb25zdCBpbnQgYSAsIGNvbnN0IGludCBiICkgewogICAgaWYoIGEgPCBiICl7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZWxzZSBpZiggYSA+IGIgKXsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=