• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ソート)

C言語でデータのソートを行う方法

このQ&Aのポイント
  • C言語でデータのソートを行う方法について説明します。具体的には、データをクラスごとにソートし、さらに平均点の高い順に並び替える方法を紹介します。
  • ソートのためにint型、double型、char型のデータを入れ替える関数を用意する必要があります。
  • データのソートと入れ替えの関数の使い方を具体的なコード例を交えて説明します。最終的には、クラスごとにソートされたデータと平均点の高い順に並び替えられたデータが表示されます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

とりあえず、データを交換する関数は 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)
回答No.4

☆クラスと平均点を結合し、いっしょくたにソートしています。 #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)
回答No.3

入れ替える関数なんか作っても無意味で, 比較する関数を作ることが重要. 比較関数は #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)
回答No.1

ミスでは? seiseki[0]とかにしないとダメだとおもうよ それか data seiskeiを seiseki data[100]にするか

minaraiH
質問者

補足

また盛大にみすってます。 data[○].□ → seiseki[○].□です。