掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24080

配列を使った順位付けについて
投稿者---seiki(2005/11/10 19:18:25)


今、大学で課題が出ていて、内容は
「配列とrand関数を使って25人分の30点満点の得点に順位をつける。」
というものなのですが、25人分の得点を配列にセットするところまでしか
できなくてその後が自分では進まなくて書き込ませていただきました。
答えではなくていいのでヒントなどをいただけないでしょうか?
あと、NIN、UPPERは課題を作るときに指定されたものです。

#include <stdio.h>
#include <stdlib.h>

#define NIN 25
#define UPPER 30

void main(void)
{
    int ten[NIN];
    int cnt[UPPER+1]={0};
    int i;
    
    printf("得点\n");
    for(i=0; i<NIN; i++){
        ten[i]=rand() % (UPPER+1);
        printf("%3d", ten[i]);
    }
    printf("\n");
    
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列を使った順位付けについて 24081 とろり 2005/11/10 19:42:34
<子記事> Re:配列を使った順位付けについて 24083 気分屋 2005/11/10 19:57:36


No.24081

Re:配列を使った順位付けについて
投稿者---とろり(2005/11/10 19:42:34)


こんにちは。

>答えではなくていいのでヒントなどをいただけないでしょうか?

降順にソートして、順位をつけるのが良いように思います。
「ソート・アルゴリズム」で検索すればサンプルソースがあると思います。


この投稿にコメントする

削除パスワード

No.24082

Re:配列を使った順位付けについて
投稿者---seiki(2005/11/10 19:56:52)


早いレスありがとうございます。

>降順にソートして、順位をつけるのが良いように思います。

とありますが、なるべく元の並び方で順位を付けられたら
うれしいのですが・・・
理想としては、
「
得点
 25  3 15 11  0
順位
  1  4  2  3  5
」

のような感じで表示したいです。


この投稿にコメントする

削除パスワード

No.24084

Re:配列を使った順位付けについて
投稿者---とろり(2005/11/10 20:24:16)


>なるべく元の並び方で順位を付けられたらうれしいのですが・・・

ソート無しに順位をつけるとなると、良いアイディアはパッとは思いつきませんねぇ。
30点25人くらいなら、最大30×25回ループを回す方法が思いつきますけどね。
これだけで分かるかな?

私が作るとすれば、ソート前後の配列の位置をマッピングしてやりますかね。


この投稿にコメントする

削除パスワード

No.24086

Re:配列を使った順位付けについて
投稿者---seiki(2005/11/10 20:35:08)


>30点25人くらいなら、最大30×25回ループを回す方法が思いつきますけどね。
>これだけで分かるかな?

1から添え字を数えていけばいいのでしょうか?
そうでしたら、もう少しヒントがほしいです。
最初そんな感じでやっていたのですが、コンパイラして
実行したらいつもエラーが出てたんでネットで探しているうちに
ここにたどり着いたので・・・


この投稿にコメントする

削除パスワード

No.24087

Re:配列を使った順位付けについて
投稿者---iijima(2005/11/10 20:46:35)


こんな方法ではいかが?
※左向き矢印は値の代入の方向を示す。

rank[NIN](順位の配列)
mark(順位) ← 1
score(点数)をUPPERから0点まで1点ずつ減じながら繰り返し
{
    counter(順位をつけた人数) ← 0
    学生番号iを0からNIN未満まで1ずつ増やしながら繰り返し
    {
        学生番号iの得点(ten[i])がscoreに等しければ
        {
            rank[i](学生iの順位) ← mark
            counter ← counter + 1
        }
    }
    mark ← mark + counter (次の点数の学生の順位)
}



この投稿にコメントする

削除パスワード

No.24092

Re:配列を使った順位付けについて
投稿者---とろり(2005/11/10 21:26:39)


>>30点25人くらいなら、最大30×25回ループを回す方法が思いつきますけどね。
>>これだけで分かるかな?

ごめんなさい。ループは30回です。30×25回するのは比較ですね。。。

たとえば、30点からスタートして、全ての要素と点数を比較します。30点と等しければ順位(1位)を入れます。
30点から1点減じて、29点と全ての要素を比較します。29点と等しければ順位(2位)を入れます。
30位になるまで続けます。
注意点としては、同点の場合どうするかですかね。

よく見ていないのですが、iijimaさんの例が同じような気がします。(違うかも)


この投稿にコメントする

削除パスワード

No.24093

Re:配列を使った順位付けについて
投稿者---iijima(2005/11/10 21:45:05)


>よく見ていないのですが、iijimaさんの例が同じような気がします。

同じだと思います。
前回、とろりさんがおっしゃった

>30点25人くらいなら、最大30×25回ループを回す方法

に対して、seikiさんが「もう少しヒントがほしい」とのことでしたので出しゃばったものですから^^

>注意点としては、同点の場合どうするかですかね。

私のヒントの方法では、同点の人は同じ順位とし、欠番が出るようにしています。
例えば、得点順で並べたときに
{ 30, 30, 30, 25, 20, 20, 15 ... }
の場合、順位は
{ 1, 1, 1, 4, 5, 5, 7 ... }
となります(3, 6は欠番)。
これで良いのかどうかは、問題中に仕様が明記されていないのでなんとも言えません。


この投稿にコメントする

削除パスワード

No.24088

Re:配列を使った順位付けについて
投稿者---Hermit(2005/11/10 20:48:09)



>私が作るとすれば、ソート前後の配列の位置をマッピングしてやりますかね。
と書かれた、とろりさんと同じ意味かもしれないけど、

2次元配列 25*3 にして
番号、得点を入れる。
得点でソート。
順位を入れる。
番号でソート。

でもとの順番に戻る気がしますが。
それじゃだめ?


この投稿にコメントする

削除パスワード

No.24107

Re:配列を使った順位付けについて
投稿者---まきじ(2005/11/11 00:02:00)


>なるべく元の並び方で順位を付けられたら

順位様の配列を用意して、順位が付いてない要素ら
から最大値を探して順位を付けるとか。


この投稿にコメントする

削除パスワード

No.24121

Re:配列を使った順位付けについて
投稿者---shu(2005/11/11 23:13:27)


データを作った後に、
ten[i]よりも大きな値の個数+1が順位になると思います。


この投稿にコメントする

削除パスワード

No.24083

Re:配列を使った順位付けについて
投稿者---気分屋(2005/11/10 19:57:36)


5人分の簡単な例

1人目 2人目 3人目 4人目 5人目
10点 24点 5点 30点 13点
と出た場合。

● 選択法を使用

初期状態
10点 24点 5点 30点 13点

1番目と2番目を比較し2番目が1番目より大きければ交換
24点 10点 5点 30点 13点

1番目と3番目を比較
24点 10点 5点 30点 13点

1番目と4番目を比較
30点 10点 5点 24点 13点

1番目と5番目を比較
30点 10点 5点 24点 13点

★この時点で1番目は必ず一番大きい値が来ているので固定する

2番目と3番目を比較
24点 10点 5点 30点 13点

2番目と4番目を比較
30点 24点 5点 10点 13点

2番目と5番目を比較
30点 24点 5点 10点 13点

★2番目が固定される

3番目と4番目を比較
30点 24点 10点 5点 13点

3番目と5番目を比較
30点 24点 13点 5点 10点

★3番目が固定される

4番目と5番目を比較
30点 24点 13点 10点 5点

★終了



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧