表の中の数字を大きい順から並び替えるには?


初心者  2009-06-26 20:39:12  No: 70457

#include"stdio.h"
#include "math.h"
#define n 9
#define m 7
void main()
{
  char namae[n][5]={"名前","太郎","二郎","三郎","四郎","春子","夏子","秋子","冬子"};
  char kamoku [7][5]={"科目","国語","算数","理科","社会","英語","合計"};
  double seiseki[n][m]={{0,0,0,0,0},{80,90,75,70,70},{70,85,80,80,85},{75,95,65,90,95},{65,70,80,75,80},{90,100,85,90,85},{100,95,80,85,80},{60,75,90,70,85},{85,80,85,90,95}},G;
  int i,j,k;
  double goukei[n];
  for(i=0;i<m;++i){
    printf(" %s ",kamoku[i]);
  }
  printf("\n");
  for(i=1;i<n;++i){
    goukei[i]=0;
    printf("%s",namae[i]);
    for(j=0;j<5;++j){
      printf("%6.0f",seiseki[i][j]);
      goukei[i]+=seiseki[i][j];
    }
    printf("%6.0f\n",goukei[i]);
  }
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  for(i=0;i<9;++i){
    for(j=2;j<10;++j){
      if(goukei[j-i]<goukei[j]){
        G=goukei[j];
        goukei[j]=goukei[j-1];
        goukei[j-1]=G;
        printf("%s %3d",namae[9],goukei[j]);
      }
    }
  }
}
合計の並び替えをしたいのですが、できません\以降が並び替えのプログラムなのですがどこが間違っていますか?  ¥より前は表をつくっているもので
ここは変数を新たに定義する以外は変えないでしたいのですが
あと  各科目でも合計と同じことをしたいのですがよろしければそれもおしえてください


wclrp ( 'o')  2009-06-26 21:59:09  No: 70458

バブルソートか。
ソートなら別の方法があるよ。
バブルソートなら色々説明があると思うので説明はしない。

配列は1始まりで使っているのか。

nが人数でmが科目数か。
俺にはいい名前の付け方が思いつかないけど、判りやすくしてほしい。
最近の俺はループ変数もi,j,kとつけるのは意味が判らないので嫌いになってきた。

for(i=1;i<n-1;++i)
for(j=i+1;j<n;++j)
nとか使うべきでは?
既に比較済みを比較する必要ない。

goukei[j-i]ってバッファオーバーランしている。

合計で並べ変えたら、名前もそれに合わせたい。
やり方はいくつかある。
プログラムはわかりにくくなるけどnarabi配列を使ってみた。

    int tmp;
    TRACE("\n");

    for(i=1;i<n-1;++i){
        for(j=i+1;j<n;++j){
            if(goukei[narabi[i]]<goukei[narabi[j]]){
                int tmp=narabi[i];
                narabi[i]=narabi[j];
                narabi[j]=tmp;
            }
        }
    }

    TRACE("\n");
    for(i=1;i<n;++i){
        TRACE("%s\t%6.0f\n",namae[narabi[i]],goukei[narabi[i]]);
    }


wclrp ( 'o')  2009-06-26 22:04:04  No: 70459

漏れてた

  int narabi[n];
  for(i=1;i<n;++i){
    narabi[i]=i;
  }


初心者  2009-06-27 07:40:43  No: 70460

質問に答えていただき本当にありがとうございます。
TRACEやtmpはnarabi[]が私にはよくわからないのでできれば\\\\\以降の
プログラムの修正点を教えていただけませんか?
  あと各科目の並び変えは合計の並び替えと同じプログラムでいいですか?


wclrp ( 'o')  2009-06-27 08:22:57  No: 70461

TRACEはprintfと同じ。表示する場所が違うだけ。
tmpはGと同じ用途。tmpが2箇所にあるのは間違え。

各科目をどう並び替えるのか?
科目の並び替えなんて必要ないのでは。
文字列をあいうえお順に並び替えるなんて無理。

合計点だけ並び替えても名前もそれと同じにならないと無意味。
合計点を並び替えた後に名前を並び替えるのは無意味。
合計点の並び替えと同時に名前を並び替える

文字列の入れ替えは面倒なのでやりたくない。
namae[1]は山田君。
goukei[1]は山田君の合計点。
つまり1は山田君の番号。
narabi[1]は最も合計点の高い人の番号5になる。
narabi[8]は最も合計点の低い人の番号4になる。

    char tmpNamae[5];

    for(i=1;i<n-1;++i){
        for(j=i+1;j<n;++j){
            if(goukei[i]<goukei[j]){
                G=goukei[j];
                goukei[j]=goukei[i];
                goukei[i]=G;
                strcpy(tmpNamae,namae[j]);
                strcpy(namae[j],namae[i]);
                strcpy(namae[i],tmpNamae);
            }
        }
    }

    for(i=1;i<n;++i){
        printf("%s\t%6f\n",namae[i],goukei[i]);
    }


初心者  2009-06-27 09:24:47  No: 70462

strcpyと%6fの前の\tってなんですか?
あと各科目を並び替えるというのは各科目別に点数の高い順に並び替えると
言うことです説明不足でしたすみません。


中級者  2009-07-01 23:03:48  No: 70463

元のソースを尊重して作りました

ーーーーーーーーーーーーーーーーーーーーーー
for(i=1;i<9;++i){
for(j=2;j<9-i+1;++j){
if(goukei[j-1]<goukei[j]){
G=goukei[j];
goukei[j]=goukei[j-1];
goukei[j-1]=G;
}
}
}

for(i=1;i<9;++i){
printf("%6.0f\n", goukei[i]);
}
ーーーーーーーーーーーーーーーーーーーーーー

突っ込みどころとしては
define名は大文字、そして分かりやすい名前で。
逆に変数は小文字、もちろん分かりやすい名前で。
Gはスワップ用なのでtmpが一般的だね
namaeに"名前"、kamokuに"科目"はデータとして不要。
点数を扱うのならintを使えばいいんじゃない
C覚えた頃を思い出して懐かしくなりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加