ID非公開

2022/7/3 11:58

22回答

C言語のqsortのソート方法についての質問です。 以下のような構造体で年、組、出席番号の3つをキー?にして昇順ソートしたいです。作った処理だと年で昇順ソートすることは出来ました。

ベストアンサー

0

その他の回答(1件)

0

(ID非公開) 構造体のName以外はint型に変更しました 例: #include <stdio.h> #include <stdlib.h> typedef struct _Student{ //生徒構造体 int Grade; //1年1組の年の部分。 int Class; //1年1組の組の部分。 int ClassNum; //出席番号。 char Name[30 + 1]; //名前。"竈門炭治郎"のようなフルネーム int Age; //年齢 int Sei; //性別。男性なら0、女性なら1 }Student; Student sd[500]={ {2,2,2,"遠藤陽菜",17,1}, {1,2,1,"石田麻衣",16,1}, {3,2,1,"渡邊里美",17,1}, {2,1,1,"齋藤亮",17,0}, {1,1,1,"青木太郎",16,0}, {3,1,1,"田中聡",18,0}, {3,2,2,"渡部絵里",18,1}, {1,1,2,"青山金太郎",15,0}, {2,1,2,"佐藤翔太", 17,0}, {3,1,2,"田中浩二", 18,0}, {2,2,1,"上田哲", 16,0}, {1,2,2,"石山純", 16,0}, }; int cnt=12; //データ数 void dsp(Student *d,int n){ int i; char *sx[]={"男","女"}; puts("-------------------------------"); for(i=0;i<n;i++){ printf("%d年%d組 %d番 %s %d歳 %s\n", d[i].Grade, d[i].Class, d[i].ClassNum, d[i].Name, d[i].Age, sx[d[i].Sei%2]); } } int key(Student *a){ return a->Grade*100 + a->Class*10 + a->ClassNum; } int StudentCmp(const void *a, const void *b){ Student *p,*q; int x,y; p = (Student*)a; q = (Student*)b; return key(p) - key(q); } int main(void){ dsp(sd,cnt); puts("\nsort"); qsort(sd, cnt, sizeof(Student), StudentCmp); dsp(sd,cnt); return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ------------------------------- 2年2組 2番 遠藤陽菜 17歳 女 1年2組 1番 石田麻衣 16歳 女 3年2組 1番 渡邊里美 17歳 女 2年1組 1番 齋藤亮 17歳 男 1年1組 1番 青木太郎 16歳 男 3年1組 1番 田中聡 18歳 男 3年2組 2番 渡部絵里 18歳 女 1年1組 2番 青山金太郎 15歳 男 2年1組 2番 佐藤翔太 17歳 男 3年1組 2番 田中浩二 18歳 男 2年2組 1番 上田哲 16歳 男 1年2組 2番 石山純 16歳 男 sort ------------------------------- 1年1組 1番 青木太郎 16歳 男 1年1組 2番 青山金太郎 15歳 男 1年2組 1番 石田麻衣 16歳 女 1年2組 2番 石山純 16歳 男 2年1組 1番 齋藤亮 17歳 男 2年1組 2番 佐藤翔太 17歳 男 2年2組 1番 上田哲 16歳 男 2年2組 2番 遠藤陽菜 17歳 女 3年1組 1番 田中聡 18歳 男 3年1組 2番 田中浩二 18歳 男 3年2組 1番 渡邊里美 17歳 女 3年2組 2番 渡部絵里 18歳 女