Namaran

Code daily. Without assist.

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のように既に総順序を返してくれる関数はそのまま副キーとして使えます。これは参考実装であり、唯一の正解ではありません。