無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ユーリ

無題

#1

投稿記事 by ユーリ » 16年前

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:無題

#2

投稿記事 by ねこ » 16年前

「降順 ソート」で検索して下さい。

ユーリ

Re:無題

#3

投稿記事 by ユーリ » 16年前

結果を
点数 RANK
67 5
43 9
56 7
97 1
30 10
88 2
76  4
55 8
66 6
78 3
のよう表示したいのですがどうしたらいいですかね?

non

Re:無題

#4

投稿記事 by non » 16年前

総当たりで点数を比較し、小さい方の順位を+1します。

dic

Re:無題

#5

投稿記事 by dic » 16年前

配列の数が決まってるので ねこさんのおっしゃるように
まず、得点順に並び替えて、そのあと順番に順位をつけていけばいいかと思います

やそ

Re:無題

#6

投稿記事 by やそ » 16年前

番号 点数 順位
 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:無題

#7

投稿記事 by やそ » 16年前

連投失礼^^;

【やそでもわか??る解説】
解説用に配列は縮小させてもらいました。
番号  点数 順位
やそ  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]++; //点数が低かったら順位を下げるの。このバカチンが~!!
    }
  }
}


余計わかりにくかったらゴメンナサイ^^;

non

Re:無題

#8

投稿記事 by non » 16年前

比較回数を減らすなら
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:無題

#9

投稿記事 by ユーリ » 16年前

#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:無題

#10

投稿記事 by 初級者 » 16年前

その二重ループで順位を正しくセットしているのであれば、
No.35632でご自身が提示されたように出力するためのループを組むだけですよ。
どこがわかりませんか?

山崎

Re:無題

#11

投稿記事 by 山崎 » 16年前

仮に規約に無いとしても、トピックには、何を尋ねたいのかわかるタイトルをつけることをお勧めしますよ。
きれいにタイトルをまとめるのが難しくても、努力してみることは必要です。
いつも無題のまま投稿なさいますね。

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

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

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

ユーリ

すいません

#12

投稿記事 by ユーリ » 16年前

No:35632のように表示したいのですが、どのようにしたらいいのかわかりません

初級者

Re:無題

#13

投稿記事 by 初級者 » 16年前

10人分の成績を出力したいので、10回まわるループを組む、ということはわかりますか?

ユーリ

Re:無題

#14

投稿記事 by ユーリ » 16年前

はい、わかります

non

Re:無題

#15

投稿記事 by non » 16年前

前に投稿したときミスがありました。訂正してお詫びします。
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:無題

#16

投稿記事 by 初級者 » 16年前

その、10回まわるループで、

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

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

ユーリ

できれば・・・

#17

投稿記事 by ユーリ » 16年前

#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;

  }

何が違うのでしょうか?
できれば、解答をいただけるとうれしいです

non

Re:できれば・・・

#18

投稿記事 by non » 16年前

ソートする部分と、表示する部分を分けて考えたらどうですか?
上のプログラムのforの2重ループはソートするためのものです。
これが終わった後に、
for文で出力する部分を作成します。

初級者

Re:無題

#19

投稿記事 by 初級者 » 16年前

自分で考えることに意味があると思います。

やそ

Re:無題

#20

投稿記事 by やそ » 16年前

ユーリさんへ
私や皆さんの回答(ソースプログラム)は理解できましたでしょうか。

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

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

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

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

がんばってね~

conio

Re:無題

#21

投稿記事 by conio » 16年前

ソートはあくまでもソートなので、その中に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:無題

#22

投稿記事 by ユーリ » 16年前

#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]);
ここがいまいちわからないんですよね

non

Re:無題

#23

投稿記事 by non » 16年前

for(h=0;h<10;h++){
	printf("%d    %d",data[0],data[1]);
	printf("\n");
}

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

box

Re:無題

#24

投稿記事 by box » 16年前

> こういうことでしょうか?

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

ユーリ

Re:無題

#25

投稿記事 by ユーリ » 16年前

実行しましたが、思った通りの結果は得られませんでした

ねこ

Re:無題

#26

投稿記事 by ねこ » 16年前

>ユーリさん
なんでnonさんの書き込み無視?
ほぼ答えな回答してくれてると思うんですが。

ユーリ

すいません

#27

投稿記事 by ユーリ » 16年前

もうしわけないです。
気づきませんでした
ありがとうございました。解決いたしました
長期に渡りみなさん本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る