2026-09-19
rank_players.c
#include <string.h>
typedef struct {
int score;
const char *name;
} Player;
int cmp_player(const void *a, const void *b) {
// write this: qsort comparator for Player. Sort descending by score;
// when scores are equal, break the tie ascending by name (strcmp).
}
cmp_playerを実装してください。スコアで降順に並べ、スコアが同じ場合は名前(strcmp)で昇順にすること。
Reference
int cmp_player(const void *a, const void *b) {
const Player *pa = a;
const Player *pb = b;
if (pa->score != pb->score)
return (pa->score < pb->score) - (pa->score > pb->score);
return strcmp(pa->name, pb->name);
}
比較関数で全順序を作るときは、まず主キー(score)で決着がつくかどうかを確かめ、決着がつかない(同点の)場合にだけ副キー(name)へ進むという順序を守る必要があります。先に副キーだけで比較してしまうと、主キーが違う要素同士でも副キーの大小で結果が決まってしまい、意図した順序になりません。降順にしたいときは、単に昇順の式の左右を入れ替える((pa->score < pb->score) - (pa->score > pb->score))だけでよく、strcmpのように既に総順序を返してくれる関数はそのまま副キーとして使えます。これは参考実装であり、唯一の正解ではありません。