71332


10個の値と探索する値を問い、その探索する値が入力した数値の中に存在するか存在しないかを出力させるプログラムを作成したいのですが、何番目のデータにそれが存在するのかを出力する方法がわかりませんでした。

私は以下のようにプログラムを作成しました。

**ソースコード**

[code]

    #include <stdio.h>
    
    /* size個 の入力されたデータを 配列の先頭から順番に格納する */
    void readIntArray(int a[], int size)
    {
        int i;
        
        for (i=0;i<size;i=i+1) {
            printf("%d 番目? ", i+1);
            scanf("%d", &a[i]);
        }
    }
    
    
    /* na個 のデータが入っている集合に x と等しい要素があるかどうかを判定する \ */
    int memberOf(int x, int a[], int na)
    {
         int i,result=0;
         for(i=0;i<na;i=i+1) {
           if (x==a[i]) {
             result = 1;
            }
         }
         return result;
    }
    
    
    int main(void)
    {
        int data[1024];
        int i,x;
        
        readIntArray(data, 10);
        
        printf("探索する数字を入力してください: ");  scanf("%d",&x);
    
      
        for(i=1;i<10;i++)
        if (memberOf(x, data, 10)) {
            printf(" data[%d]=%d ．\n",i ,x);
        } else {
            printf(" %d は存在しない．\n", x);     
        }   
    
        return 0;
    }
    
[/code]

**実行結果**

[code]

    $ ./a.out
    1 番目? 1
    2 番目? 2
    3 番目? 3
    4 番目? 4
    5 番目? 5
    6 番目? 6
    7 番目? 7
    8 番目? 8
    9 番目? 9
    10 番目? 10
    探索する数字を入力してください: 6
     data[1]=6 ．
     data[2]=6 ．
     data[3]=6 ．
     data[4]=6 ．
     data[5]=6．
     data[6]=6 ．
     data[7]=6 ．
     data[8]=6 ．
     data[9]=6 ．
    
[/code]

単に十個の値と、探索する値を入力して、その入力した値が存在するのか存在しないのかを調べるためのプログラムなら実装できるのですが、何番のデータにそれが存在するのか出力すべく`data[%d]`を読み込む関数の実装方法がわかりません。  
`for(i=1;i<=10;i++)`では上記のように繰り返しとなるためすべてのデータ番号が出力され、`for`文を入力せずにコンパイルをすると`data[0]=6`のように出力されてしまいます。

どのようにすればデータ番号がうまく出力されるのでしょうか。

**期待する実行結果**

[code]

    $ ./a.out
    1 番目? 1
    2 番目? 2
    3 番目? 3
    4 番目? 4
    5 番目? 5
    6 番目? 6
    7 番目? 7
    8 番目? 8
    9 番目? 9
    10 番目? 10
    探索する数字を入力してください: 6
    data[6]=6
    
[/code]


CC BY-SA 4.0
2020-10-19T13:24:13.967
71330
2020-10-19T17:00:54.353
2020-10-19T14:58:07.990
32986
41837
question
c
data[%d]の部分の出力の仕方がイマイチわかりません

[code]

        for(i=1;i<10;i++)
        if (memberOf(x, data, 10)) {
            printf(" data[%d]=%d ．\n",i ,x);
        } else {
            printf(" %d は存在しない．\n", x);     
        }   
    
[/code]

現在のコードは、「`data`に値`x`が入っているかどうかを表示する、を9回繰り返す」になっています。

`data`に値`x`が複数個入っている場合に、最初に見つかった添字だけを表示すれば良い場合は、`memberOf()`
が見つかった添字を返すようにすれば良いでしょう。見つからなかった場合は`-1`や配列サイズを返します。そういった仕様にしたうえで、`memberOf()`
を `indexOf()` に名前を変えると、呼び出し側は以下のようになります:

[code]

        i = indexOf(x, data, 10);
        if (i <= 0 && i < 10) {
            printf(" data[%d]=%d .\n", i, x);
        } else {
            printf(" %d は存在しない．\n", x);
        }
    
[/code]

見つかった複数の添字を表示する必要がある場合は、`memberOf()`は使わないほうがシンプルです。

[code]

    #include <stdbool.h>
    ...
        bool found = false;
        for (i = 0; i < 10; ++i) {
            if (data[i] == x) {
                printf(" data[%d]=%d ．\n", i ,x);
                found = true;
            }
        }
        if (!found)
            printf(" %d は存在しない．\n", x);     
    
[/code]

または、`memberOf()` の中で表示してしまえば良いでしょう。

[code]

    int memberOf(int x, int a[], int na)
        ...
           if (x == a[i]) {
               result = 1;
               printf(" data[%d]=%d ．\n", i, x);
           }
    ...
      
        if (!memberOf(x, data, 10)) {
            printf(" %d は存在しない．\n", x);     
        }   
    
[/code]

ちなみに、Ubuntu ですと、gdb や lldb という無骨なデバッガが利用可能かもしれません。


CC BY-SA 4.0
2020-10-19T16:52:57.847
71332
2020-10-19T17:00:54.353
2020-10-19T17:00:54.353
3475
3475
71330
answer