概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C アルゴリズム演習
2006年08月17日 (木) | 編集 |
ポインタの章も終わり、ということでアルゴリズム演習の3だ。
つっても両者に関連性無いけどな。
多分。

今回のアルゴリズム演習は順位付けについてだ。
ある数値の集合があった時に、特定の条件によって順位付けしようっていう話だな。

勝利条件:
「適当に配列を作り、大きさで順位付けて表示する」


とりあえず配列を作ろう。

static int a[]={936,1005,1407,954,585,1214,2050,1128,925,614,623,888};

さて、順位付け。
例えば最初の936が全体の中で何位に位置するかは、936より大きい数字が出る度にカウントを+1していけばいいわけで、上記の配列の場合は

1005、1407、954、1214、2050、1128

の数値が該当しているので、これら6回分をカウントすればカウントの初期値を1として1+6=7、7位という結果が得られることになる。

よく出来てるな。

後はこれを全ての数値において繰り返せばいい。
要するにa[0]をa[1]~[12]まで比較するという処理をa[0]~[12]まで繰り返すということだな。お馴染みの2重ループっていう奴だ。比較部分にはif文を使えばOK。

日本語で書くと、

配列a[i]を最初から最後まで試行する
 配列a[j]の最初から最後まで
  比較してa[j]がa[i]より大きければ
   カウントnに+1する
今試行したa[i]とその順位(カウントn)を表示する


こんな感じか。
forを2回使っているのでそれぞれのループ変数も宣言して、
ついでにカウント用に変数nも宣言して

int i,j,n;

for(i=0;i<12;i++){
 n=1;
   for(j=0;j<12;j++){
    if(a[j]>a[i])
     n++;
   }
 printf("%dは%d番目に高いHPだぜ\n",a[i],n);
}


と記述すればいいことになる。多分。

numbering_test.jpgnumbering_test2.jpg
こんな感じ。概ね問題ないようだ。

さて、これでも条件は満たしているのだが、入門書では別の手法を使っているのでそちらの方法も見てみることにする。

static int a[]={936,1005,1407,954,585,1214,2050,1128,925,614,623,888};
int b[12];
int i,j;


どうするのかというと、それぞれの順位を求める、ということで順位用にもう1つ配列を用意してしまうのである。a[i]の順位はb[i]に格納してしまおうというわけだ。
後の流れは大差無い。

for(i=0;i<12;i++){
 b[i]=1
  for(j=0;j<12;j++){
   if(a[j]>a[i])
    b[i]++;
  }
}


最初の方法と同様、ループの始まりの際に順位のカウントを初期化して、a[i]をa[0]~[11]まで比較し、a[i]より大きい数値があればカウントし、配列b[i]に格納していく。
後はそれを表示すればOK。

for(i=0;i<12;i++)
 printf("%dは%d番目に高いHPだぜ\n",a[i],b[i]);


numbering_test3.jpgnumbering_test4.jpg
こんな感じ

違うとしたらループを抜けてから表示することが出来るというくらいか。
だが勿論ループを抜ける前に表示する事も可能であるし、配列そのものも色々と便利なので、こっちの方法に慣れた方がいいかもしれない。


おまけ
配列2つ使うってことは二次元配列でもいけるんじゃねーということで

numbering_test5.jpgnumbering_test6.jpg
こんなんでも条件を満たすことは可能

どれも一応条件は満たしているので、効率的、且つ楽な方法を選べばいいだろう。
個人的には二次元配列は書くのがダルかった。

スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。