- ベストアンサー
C言語でデータのソートを行う方法
- C言語でデータのソートを行う方法について説明します。具体的には、データをクラスごとにソートし、さらに平均点の高い順に並び替える方法を紹介します。
- ソートのためにint型、double型、char型のデータを入れ替える関数を用意する必要があります。
- データのソートと入れ替えの関数の使い方を具体的なコード例を交えて説明します。最終的には、クラスごとにソートされたデータと平均点の高い順に並び替えられたデータが表示されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず、データを交換する関数は void swap (data *from, data *to); だけで良いです。 data temp = *from; *to = *from; *from = temp; で丸ごと交換可能。 あと、大小判定の関数を作るのが良いでしょう。 bool isLarge(data a, data b) // a > b なら true; { if (strcmp(a.type_of_class, b.type_of_class) == 0) {// 同じクラスなら return (a.average > b.average); // 平均で大小判定 } else if (strcmp(a.type_of_class, b.type_of_class) > 0) { return true; } else { return false; } } これで、ソートのアルゴリズムを調べて if (a[i] > a[j]) ... とかあるところを、 if (isLarge(seiseki[i], seiseki [j])) に swap(&a, &b) ... を、swap(&seiseki[i], &seiseki[j]); とかに書き換えれば、それらしいものが出来るはずですが。 ソートのアルゴリズムは、「大小判定」して、順番が違っていたら「入れ替え る」ですから。
その他の回答 (3)
- yama5140
- ベストアンサー率54% (136/250)
☆クラスと平均点を結合し、いっしょくたにソートしています。 #include <stdio.h> #define Bias(c) (('Z'-c)*1000.0) // A から Z クラス限定、ソートキーの下駄 #define NIN 6 typedef struct{ int num; char name[20]; char type_of_class[8]; double average; }STUDENT; STUDENT sgWork[ NIN ] = { // 構造体の初期化 { 1, "山田太郎", "A_class", 66.2 }, { 2, "鈴木二郎", "B_class", 43.1 }, { 3, "佐藤三郎", "A_class", 39.1 }, { 4, "加藤四郎", "B_class", 93.6 }, { 5, "石田五郎", "B_class", 57.9 }, { 6, "草田六郎", "A_class", 6.2 } // 六ちゃん、ガンバ }; void Output( void ) { int i; for( i = 0; i < NIN; i++ ){ printf( "%d,", sgWork[ i ].num ); printf( "%s,", sgWork[ i ].name ); printf( "%c,", sgWork[ i ].type_of_class[ 0 ] ); // 先頭文字のみ printf( "%5.1lf\n", sgWork[ i ].average ); } printf( "\n" ); } void SwapStruct( STUDENT *sBig, STUDENT *sSml ) { STUDENT sTemp; sTemp = *sBig; *sBig = *sSml; *sSml = sTemp; } void main( void ) { int i, j; double dMax, dNext; Output(); for( i = 0; i < ( NIN - 1 ); i++ ){ dMax = Bias( sgWork[ i ].type_of_class[ 0 ] ) + sgWork[ i ].average; for( j = ( i + 1 ); j < NIN; j++ ){ dNext = Bias( sgWork[ j ].type_of_class[ 0 ] ) + sgWork[ j ].average; if( dNext < dMax ) continue; SwapStruct( &sgWork[ j ], &sgWork[ i ] ); dMax = dNext; } } Output(); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
- Tacosan
- ベストアンサー率23% (3656/15482)
入れ替える関数なんか作っても無意味で, 比較する関数を作ることが重要. 比較関数は #2 でもいいけど int cmp(const void *a, const void *b) { const data *pa = a, *pb = b; int diff = strcmp(pa->type_of_class, pb->type_of_class); if (diff) { return diff; } else if (pa->average > pb->average) { return 1; } else if (pa->average < pb->average) { return -1; } else { return 0; } } とすれば qsort がつかえてお手軽 (ただし効率は無視).
- zaqwe
- ベストアンサー率0% (0/1)
ミスでは? seiseki[0]とかにしないとダメだとおもうよ それか data seiskeiを seiseki data[100]にするか
補足
また盛大にみすってます。 data[○].□ → seiseki[○].□です。