無題
Re:無題
番号 点数 順位 0 67 1 1 43 1 2 56 1 3 97 1 4 30 1 5 88 1 6 76 1 7 55 1 8 66 1 9 78 1という点数の配列があって、点数の高い順にランキングしたいという意図はわかりました。
点数の並びは変えたくないということですね。
そうすると普通に点数をソートしてはいけないという罠なんでしょうか(笑)
順位として1が入っているというのがヒントになっているようです。
for(i=0;i<10;i++) { for(j=0;j<10;j++) { if(data[0]<data[j][0]) { data[1]++; } } }
自分自身との比較もしているので無駄があるといえばあるのですが、できるだけシンプルにしてみたつもりです。
同じ点数がある場合など、詳細な検証はしていませんが、どうでしょう?
Re:無題
連投失礼^^;
【やそでもわか??る解説】
解説用に配列は縮小させてもらいました。
班のメンバーの点数は貼り出されているので一目瞭然(笑)
上から順に見ていくと・・・
やそくんvsやそくん
(って自分や~ん!)順位はそのまま1位(笑)
やそくんvsユーリくん
やそくんの勝ち!とりあえず1位^^
やそくんvsaaaくん(誰?)
やそくんの勝ち!まだ何とか1位^^;
やそくんvsbbbくん(だから誰だってば!?)
bbbくんの勝ち!やそくん1つ順位を下げて2位確定!
やそくんは余計なお世話で皆の順位を調べ始めた!!
ユーリくんvsやそくん
やそくんの勝ち!ユーリくんの順位がひとつ下がった(ドラクエで呪いがかかった時のBGMで読もう!)
ユーリくんvsユーリくん
(だから自分同士だってば)
ユーリくんvsaaaくん
aaaくんの勝ち!ユーリくんの順位がひとつ下がった!!
ユーリくんvsbbbくん
bbbくんの勝ち!ユーリくんの順位がひとつ下がった!!
ユーリくんは4位(最下位)に確定した!!
・
・
・
ってことを繰り返していくことで順位付けが出来ると思うんよ。
余計わかりにくかったらゴメンナサイ^^;
【やそでもわか??る解説】
解説用に配列は縮小させてもらいました。
番号 点数 順位 やそ 67 1 ユーリ 43 1 aaa 56 1 bbb 97 1やそくんは自分の点数が班のなかで何番目なのかとても気になりました。
班のメンバーの点数は貼り出されているので一目瞭然(笑)
上から順に見ていくと・・・
やそくんvsやそくん
(って自分や~ん!)順位はそのまま1位(笑)
やそくんvsユーリくん
やそくんの勝ち!とりあえず1位^^
やそくんvsaaaくん(誰?)
やそくんの勝ち!まだ何とか1位^^;
やそくんvsbbbくん(だから誰だってば!?)
bbbくんの勝ち!やそくん1つ順位を下げて2位確定!
やそくんは余計なお世話で皆の順位を調べ始めた!!
ユーリくんvsやそくん
やそくんの勝ち!ユーリくんの順位がひとつ下がった(ドラクエで呪いがかかった時のBGMで読もう!)
ユーリくんvsユーリくん
(だから自分同士だってば)
ユーリくんvsaaaくん
aaaくんの勝ち!ユーリくんの順位がひとつ下がった!!
ユーリくんvsbbbくん
bbbくんの勝ち!ユーリくんの順位がひとつ下がった!!
ユーリくんは4位(最下位)に確定した!!
・
・
・
ってことを繰り返していくことで順位付けが出来ると思うんよ。
for(i=0;i<10;i++) { for(j=0;j<10;j++) { if(data[0]<data[j][0]) //お互いの点数を比べるの♪ { data[1]++; //点数が低かったら順位を下げるの。このバカチンが~!! } } }
余計わかりにくかったらゴメンナサイ^^;
Re:無題
#include <stdio.h> int main(void) { int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}}; int i,j; for(i=0;i<9;i++) { for(j=i+1;j<10;j++) { if(data[0]<data[j][0]) { data[1]++; } if(data[0]>data[j][0]) { data[1]++; } } } return 0; }
どういった感じで表示すればいいのでしょうか?
Re:無題
仮に規約に無いとしても、トピックには、何を尋ねたいのかわかるタイトルをつけることをお勧めしますよ。
きれいにタイトルをまとめるのが難しくても、努力してみることは必要です。
いつも無題のまま投稿なさいますね。
表示なら、printf関数を使うとよいでしょう。
テストの点と順位はint型変数に格納してありますから、printfの書式の中では%dをつかえば
整数型の値を表示することができます。
もう少し、何がわからないのか具体的に質問してみてはいかがでしょうかな。
やはり、教えてあげる側としてもそうしてくれると助かりますし、何よりやる気が出ますからね。
何をすればいいのか全くわからないのか、
printfで書式付の表示のやり方がわからないのか、
ソートのやり方がわからないのか、
はたまた、課題の答となるプログラムをただ書いてほしいだけなのか・・・。
プログラムの大まかな流れを示してほしいだけにしても、
「どのような流れにすればいいのか、指針を教えてください」なり書き込めると思います。
どこまではわかっているのか、それも示してくれるとなお助かります。
きれいにタイトルをまとめるのが難しくても、努力してみることは必要です。
いつも無題のまま投稿なさいますね。
表示なら、printf関数を使うとよいでしょう。
テストの点と順位はint型変数に格納してありますから、printfの書式の中では%dをつかえば
整数型の値を表示することができます。
もう少し、何がわからないのか具体的に質問してみてはいかがでしょうかな。
やはり、教えてあげる側としてもそうしてくれると助かりますし、何よりやる気が出ますからね。
何をすればいいのか全くわからないのか、
printfで書式付の表示のやり方がわからないのか、
ソートのやり方がわからないのか、
はたまた、課題の答となるプログラムをただ書いてほしいだけなのか・・・。
プログラムの大まかな流れを示してほしいだけにしても、
「どのような流れにすればいいのか、指針を教えてください」なり書き込めると思います。
どこまではわかっているのか、それも示してくれるとなお助かります。
できれば・・・
#include <stdio.h> int main(void) { int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}}; int i,j; for(i=0;i<9;i++) { for(j=i+1;j<10;j++) { if(data[0]<data[j][0]) { data[1]++; } if(data[0]>data[j][0]) { data[j][1]++; printf("%4d",data[j]); } } } printf("\n"); return 0; }
何が違うのでしょうか?
できれば、解答をいただけるとうれしいです
Re:できれば・・・
ソートする部分と、表示する部分を分けて考えたらどうですか?
上のプログラムのforの2重ループはソートするためのものです。
これが終わった後に、
for文で出力する部分を作成します。
上のプログラムのforの2重ループはソートするためのものです。
これが終わった後に、
for文で出力する部分を作成します。
Re:無題
ユーリさんへ
私や皆さんの回答(ソースプログラム)は理解できましたでしょうか。
点数の順位付け(ランキング)の仕方がわかったら、今度はそれを表示しないことには
上手くできているのかわかりませんよね^^;
で、表示するタイミングとしては、ランキングが全て終わった後でいいでしょう。
表示処理では
全員(10人)分表示するのですからループさせる必要があります。
forでもwhileでもよいです。
表示文はprintf()関数を使えばいいでしょう。
data[0]とdata[1]をスペースを空けて並べて表示して、改行。
がんばってね~
私や皆さんの回答(ソースプログラム)は理解できましたでしょうか。
点数の順位付け(ランキング)の仕方がわかったら、今度はそれを表示しないことには
上手くできているのかわかりませんよね^^;
で、表示するタイミングとしては、ランキングが全て終わった後でいいでしょう。
main() { ランキング処理 表示処理 }とすればいいです。
表示処理では
全員(10人)分表示するのですからループさせる必要があります。
forでもwhileでもよいです。
表示文はprintf()関数を使えばいいでしょう。
data[0]とdata[1]をスペースを空けて並べて表示して、改行。
がんばってね~
Re:無題
ソートはあくまでもソートなので、その中にprintf文を入れてしまうと ソートの途中経過がズラーと表示されるだけになりますよ。 ソート終了後、添え字が0~9までの得点とRankを表示するようにすれば問題ないかと。 配列の受け渡しなどすると分かりづらくなると思い、とりあえず二次元配列dataはグローバルにして 処理ごとに関数にしてみました。 なお、下記のShowData()は完成しておりません。 for文を使えば2行程度で記述できますので、頑張ってみてください。 (添え字が0~9までの得点とRankを、順に表示する処理) ---------------------------------------------------------------------------------------- #include<stdio.h> int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}}; void Rank(void) { for(int i = 0; i < 9; i++) { for(int j = i+1; j < 10; j++) { if(data[0] < data[j][0]) { data[1]++; } if(data[0] > data[j][0]) { data[j][1]++; } } } } void ShowData(void) { //data[0]の得点を表示 Rankを表示 //data[1]の得点を表示 Rankを表示 //data[2]の得点を表示 Rankを表示 //data[3]の得点を表示 Rankを表示 //data[4]の得点を表示 Rankを表示 //data[5]の得点を表示 Rankを表示 //data[6]の得点を表示 Rankを表示 //data[7]の得点を表示 Rankを表示 //data[8]の得点を表示 Rankを表示 //data[9]の得点を表示 Rankを表示 } int main(void) { Rank(); ShowData(); return(0); } ----------------------------------------------------------------------------------------
Re:無題
#include <stdio.h> int main(void) { int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}}; int i,j,h; for(i=0;i<9;i++) { for(j=i+1;j<10; j++) { if(data[0]<data[j][0]) { data[1]++; } if(data[0]>data[j][0]) { data[j][1]++; } } } for(h=0;h<10;h++){ printf("%d %d",data[0],data[1]); printf("\n"); } return 0; }
こういうことでしょうか?
printf("%d %d",data[0],data[1]);
ここがいまいちわからないんですよね