質問<1539>2004/1/4
from=インテル
「プログラムについて」


(問い)n個の値a[0],a[1].....a[n-1]が与えられたとき、
a[i]の順位rを求めるプログラムをかけ。
ただし、順位=(自分より大きいものの個数+1)である。
お願いします。


お便り2004/1/30
from=naoya


C言語とBASICの二つでいちおう書いてみました。
C言語のほうは動作確認をしましたが、BASICのほうは確認していません。
多分動くと思いますけれど・・・。本当はa[k](k = 0,1,2,...,n-1)の値を入力させるほうがいいのでしょうが、
ここでは三次関数の値を入れています。

まず順位を求める配列rnk[k](k = 0,1,2,...,n-1)に順位の初期値0を与え、
2変数i, jを用いて二重ループを回してa[i] < a[j]となったらrnk[i]を一つ
増やすことで順位を求めます。

<C言語>
#include <stdio.h>

#define MAX     10

/*
   順位を求める関数rank()
   a[]に順位を求めたい値の入った配列
   rnk[]にa[]の順位が入る
   nは配列の要素の個数を指定する
*/

void rank(int a[], int rnk[], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        rnk[i] = 1;  /* 順位の初期値は1 */

        for (j = 0; j < n; j++)
            if (a[i] < a[j])
                rnk[i]++; /* 自分より大きい値があった */
    }
}

/* テストルーチン */
int main(void)
{
    int a[MAX], rnk[MAX], i;
    
    for (i = 0; i < MAX; i++)
        a[i] = (i-3)*(i-5)*(i-7);
        /* a に適当な値を代入する */
    
    /* 順位を rnk に求める */
    rank(a, rnk, MAX);
    
    /* 順位を表示 */
    for (i = 0; i < MAX; i++)
        printf("a[%d] = %4d :rank = %d\n",
               i, a[i], rnk[i]);
    
    return 0;
}

<BASIC>
C言語版と同じことをしているので、コメントはCのほうを参照(;^_^A
150-190までが順位を求めるところです。

100 dim a(10), rnk(10)
110 for i=0 to 9
120   a(i) = (i-3)*(i-5)*(i-7)
140 next i
150 for i=0 to 9
155   rnk(i) = 1
160   for j=0 to 9
170     if a(i) < a(j) then rnk(i) = rnk(i) + 1
180   next j
190 next i
200 for i=0 to 9
210   print "a[";i;"]:rank="rnk(i)
220 next i