ページ 11

無題

Posted: 2009年6月24日(水) 10:18
by ユーリ
0番目の配列要素にテストのテストの点数を初期設定してある配列がある。
int data[10][10]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}};
これを一番目の列要素に点数の高い順からの順位を格納するにはどういったふうにすればよろしいでしょうか?
ヒントをお願いします。

Re:無題

Posted: 2009年6月24日(水) 10:21
by ねこ
「降順 ソート」で検索して下さい。

Re:無題

Posted: 2009年6月24日(水) 11:09
by ユーリ
結果を
点数 RANK
67 5
43 9
56 7
97 1
30 10
88 2
76  4
55 8
66 6
78 3
のよう表示したいのですがどうしたらいいですかね?

Re:無題

Posted: 2009年6月24日(水) 11:16
by non
総当たりで点数を比較し、小さい方の順位を+1します。

Re:無題

Posted: 2009年6月24日(水) 16:56
by dic
配列の数が決まってるので ねこさんのおっしゃるように
まず、得点順に並び替えて、そのあと順番に順位をつけていけばいいかと思います

Re:無題

Posted: 2009年6月24日(水) 20:36
by やそ
番号 点数 順位
 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:無題

Posted: 2009年6月24日(水) 21:05
by やそ
連投失礼^^;

【やそでもわか??る解説】
解説用に配列は縮小させてもらいました。
番号  点数 順位
やそ  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:無題

Posted: 2009年6月24日(水) 21:51
by non
比較回数を減らすなら
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]++; //点数が低かったら順位を下げるの。このバカチンが~!!
    }
  }
}

Re:無題

Posted: 2009年6月30日(火) 21:12
by ユーリ
#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:無題

Posted: 2009年6月30日(火) 21:48
by 初級者
その二重ループで順位を正しくセットしているのであれば、
No.35632でご自身が提示されたように出力するためのループを組むだけですよ。
どこがわかりませんか?

Re:無題

Posted: 2009年6月30日(火) 22:05
by 山崎
仮に規約に無いとしても、トピックには、何を尋ねたいのかわかるタイトルをつけることをお勧めしますよ。
きれいにタイトルをまとめるのが難しくても、努力してみることは必要です。
いつも無題のまま投稿なさいますね。

表示なら、printf関数を使うとよいでしょう。
テストの点と順位はint型変数に格納してありますから、printfの書式の中では%dをつかえば
整数型の値を表示することができます。

もう少し、何がわからないのか具体的に質問してみてはいかがでしょうかな。
やはり、教えてあげる側としてもそうしてくれると助かりますし、何よりやる気が出ますからね。
何をすればいいのか全くわからないのか、
printfで書式付の表示のやり方がわからないのか、
ソートのやり方がわからないのか、
はたまた、課題の答となるプログラムをただ書いてほしいだけなのか・・・。

プログラムの大まかな流れを示してほしいだけにしても、
「どのような流れにすればいいのか、指針を教えてください」なり書き込めると思います。
どこまではわかっているのか、それも示してくれるとなお助かります。

すいません

Posted: 2009年6月30日(火) 22:10
by ユーリ
No:35632のように表示したいのですが、どのようにしたらいいのかわかりません

Re:無題

Posted: 2009年6月30日(火) 22:33
by 初級者
10人分の成績を出力したいので、10回まわるループを組む、ということはわかりますか?

Re:無題

Posted: 2009年6月30日(火) 22:38
by ユーリ
はい、わかります

Re:無題

Posted: 2009年6月30日(火) 23:09
by non
前に投稿したときミスがありました。訂正してお詫びします。
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]++; //点数が低かったら順位を下げるの。このバカチンが~!!
    }
  }
}

Re:無題

Posted: 2009年6月30日(火) 23:14
by 初級者
その、10回まわるループで、

・0回目に出力したいデータは何ですか?
・1回目に出力したいデータは何ですか?

・9回目に出力したいデータは何ですか?

できれば・・・

Posted: 2009年7月01日(水) 09:25
by ユーリ
#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:できれば・・・

Posted: 2009年7月01日(水) 09:51
by non
ソートする部分と、表示する部分を分けて考えたらどうですか?
上のプログラムのforの2重ループはソートするためのものです。
これが終わった後に、
for文で出力する部分を作成します。

Re:無題

Posted: 2009年7月01日(水) 09:56
by 初級者
自分で考えることに意味があると思います。

Re:無題

Posted: 2009年7月01日(水) 13:37
by やそ
ユーリさんへ
私や皆さんの回答(ソースプログラム)は理解できましたでしょうか。

点数の順位付け(ランキング)の仕方がわかったら、今度はそれを表示しないことには
上手くできているのかわかりませんよね^^;

で、表示するタイミングとしては、ランキングが全て終わった後でいいでしょう。
main()
{
 ランキング処理

 表示処理
}
とすればいいです。
表示処理では
全員(10人)分表示するのですからループさせる必要があります。
forでもwhileでもよいです。

表示文はprintf()関数を使えばいいでしょう。
data[0]とdata[1]をスペースを空けて並べて表示して、改行。

がんばってね~

Re:無題

Posted: 2009年7月01日(水) 22:15
by conio
ソートはあくまでもソートなので、その中に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:無題

Posted: 2009年7月06日(月) 17:34
by ユーリ
#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]);
ここがいまいちわからないんですよね

Re:無題

Posted: 2009年7月06日(月) 17:41
by non
for(h=0;h<10;h++){
	printf("%d    %d",data[0],data[1]);
	printf("\n");
}

hをカウンタ変数として回しているのだから、配列のINDEXもhを使わなきゃ駄目よ。

Re:無題

Posted: 2009年7月06日(月) 17:42
by box
> こういうことでしょうか?

ご自分のところで実行してみましたか?
思ったとおりの結果を得ましたか?

Re:無題

Posted: 2009年7月06日(月) 20:56
by ユーリ
実行しましたが、思った通りの結果は得られませんでした

Re:無題

Posted: 2009年7月06日(月) 22:05
by ねこ
>ユーリさん
なんでnonさんの書き込み無視?
ほぼ答えな回答してくれてると思うんですが。

すいません

Posted: 2009年7月06日(月) 22:21
by ユーリ
もうしわけないです。
気づきませんでした
ありがとうございました。解決いたしました
長期に渡りみなさん本当にありがとうございました。