88884


C言語で, datファイルから数値を読み取ってそれを降順に番号を振るプログラムを作っているのですが, 同じ大きさの数値同士ではないにもかかわらず,
番号が重複してしまいます. どなたか教えてくださると幸いです. 以下datとcのソースコードです.

[code]

    コンパイル;gcc test.c -o test
    実行;./test test.dat
    実行結果;
    11は4番
    2は4番
    842は1番
    675は2番
    435は3番
    
[/code]

test.c

[code]

    #include <stdio.h>
    
    #define N 5
    
    int main(int argc, char *argv[])    
    {
      FILE *fp;                                 /* 変数定義 */
      int a[N];
      int i,data;
      int j;
      int juni;
    
    /*------- ファイルからデータの読み込み ---------*/
    
      if(argc != 2){                            /* 引数は２つあるか */
        puts("Parameter Error");
        return 0;
      }
    
      if((fp = fopen(argv[1],"r")) == NULL){    /* ファイルは存在するか */
        puts("File Open Error"); 
        return 0;
      }
    
      for(i=0;i<N;i++){
        fscanf(fp, "%d", &data);
        a[i] = data;
        juni = 1;
    
        for(j=0;j<N;j++){
            if(a[i] < a[j]){
                //printf("%d\n",a[j]);
                juni++;
                //printf("%dと%dを比較!\n", a[i],a[j]);
            }
        }
        printf("%dは%d番\n",a[i],juni);
      }
    
      fclose(fp);
      return 0;
    }
    
[/code]

test.dat

[code]

    11
    2
    842
    675
    435
    
[/code]


CC BY-SA 4.0
2022-05-15T12:48:18.283
88835
2022-05-17T14:58:37.287
50923
question
c array
C言語で降順に番号を振りたいが、番号が被る


一度datファイルから数値を全部読み込んでから、降順にソートした方がいいと思います。  
実装例は以下のようになります。

[code]

    #include <stdio.h>
    
    #define N 5
    
    // 降順ソート用の構造体
    typedef struct{
        // ファイルから読み取った値を格納
        int score;
        // ソート前のindexを格納
        int index;
    } element;
    
    // qsort関数用の降順ソート用の関数
    int compare(const void *a, const void *b) {
        return  ((element*) b)->score - ((element*) a)->score;
    }
    
    int main(int argc, char *argv[])
    {
      FILE *fp;                                 /* 変数定義 */
      int a[N];
      // 順位格納用
      int juni[N];
      // ソート用の配列
      element elements[N];
      int i,data;
    
    /*------- ファイルからデータの読み込み ---------*/
    
      if(argc != 2){                            /* 引数は２つあるか */
        puts("Parameter Error");
        return 0;
      }
    
      if((fp = fopen(argv[1],"r")) == NULL){    /* ファイルは存在するか */
        puts("File Open Error");
        return 0;
      }
    
      // ファイルから読み込む
      for(i=0;i<N;i++){
        fscanf(fp, "%d", &data);
        a[i] = data;
      }
      
      // ソート用の配列へ値の設定
      for(int i=0;i<N;i++){
          // ファイルから読み取った値を格納する
          elements[i].score = a[i];
          // ソート前のindexを格納する
          elements[i].index = i;
      }
    
      // 降順ソートを実施する
      qsort(elements,N,sizeof(element),compare);
    
      // 降順ソートした結果を順位の配列に格納する
      for(int i=0;i<N;i++){
          juni[elements[i].index] = i + 1 ;
      }
    
      // 結果を出力する
      for(i=0;i<N;i++){
          printf("%dは%d番\n",a[i],juni[i]);
      }
    
      fclose(fp);
      return 0;
    }
    
[/code]


CC BY-SA 4.0
2022-05-17T14:58:37.287
88884
2022-05-17T14:58:37.287
52603
88835
answer