List 2-13に示した身体検査データの配列を、qsort 関数を用いてソートするプログラムを作成せよ。身長の昇順、視力の降順など、複数の条件でソートすること。 |
/* 演習6-13 qsort関数を利用して整数配列の要素を値の昇順にソート */ #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- 身体検査データ型 ---*/ typedef struct { char name[20]; /* 氏名 */ int height; /* 身長 */ double vision; /* 視力 */ } PhysCheck; /*--- PhysCheck型の比較関数(氏名昇順ソート用) ---*/ int PhysCheck_NameCmp(const PhysCheck *a, const PhysCheck *b) { return (strcmp(a->name, b->name)); } /*--- PhysCheck型の比較関数(身長昇順ソート用) ---*/ int PhysCheck_HeightCmp(const PhysCheck *a, const PhysCheck *b) { if (a->height > b->height) return (1); else if (a->height < b->height) return (-1); else return (0); } /*--- PhysCheck型の比較関数(視力降順ソート用) ---*/ int PhysCheck_VisionRCmp(const PhysCheck *a, const PhysCheck *b) { if (a->vision < b->vision) return (1); else if (a->vision > b->vision) return (-1); else return (0); } int main(void) { int i; PhysCheck x[] = { {"AKANE Kouichi", 170, 2.0}, {"TOKUTOMI Shyuji", 173, 1.5}, {"NISHIDA Taro", 170, 0.5}, {"TSUJINO Jiro", 175, 0.4}, {"MATSUO Keiji", 167, 0.6}, {"OHYAMA Kazuhiro", 168, 0.2}, {"KITAYAMA Takuya", 179, 0.6}, {"TANAKA Rina", 158, 0.9}, }; int nx = sizeof(x) / sizeof(x[0]); /* 人数 */ qsort(x, nx, sizeof(PhysCheck), (int (*)(const void *, const void *))PhysCheck_NameCmp); puts("名前の昇順にソートしました。"); puts("■□■ 身体検査一覧表 ■□■"); puts(" 氏名 身長 視力 "); puts("----------------------------"); for (i = 0; i < nx; i++) printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); putchar('\n'); qsort(x, nx, sizeof(PhysCheck), (int (*)(const void *, const void *))PhysCheck_HeightCmp); puts("身長の昇順にソートしました。"); puts("■□■ 身体検査一覧表 ■□■"); puts(" 氏名 身長 視力 "); puts("----------------------------"); for (i = 0; i < nx; i++) printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); putchar('\n'); qsort(x, nx, sizeof(PhysCheck), (int (*)(const void *, const void *))PhysCheck_VisionRCmp); puts("視力の降順にソートしました。"); puts("■□■ 身体検査一覧表 ■□■"); puts(" 氏名 身長 視力 "); puts("----------------------------"); for (i = 0; i < nx; i++) printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); return (0); }