質問: 10個の値と探索する値を問い、その探索する値が入力した数値の中に存在するか存在しないかを出力させるプログラムを作成したいのですが、何番目のデータにそれが存在するのかを出力する方法がわかりませんでした。 私は以下のようにプログラムを作成しました。 **ソースコード** ``` #include /* size個 の入力されたデータを 配列の先頭から順番に格納する */ void readIntArray(int a[], int size) { int i; for (i=0;i
回答: ``` for(i=1;i<10;i++) if (memberOf(x, data, 10)) { printf(" data[%d]=%d .\n",i ,x); } else { printf(" %d は存在しない.\n", x); } ``` 現在のコードは、「`data`に値`x`が入っているかどうかを表示する、を9回繰り返す」になっています。 `data`に値`x`が複数個入っている場合に、最初に見つかった添字だけを表示すれば良い場合は、`memberOf()` が見つかった添字を返すようにすれば良いでしょう。見つからなかった場合は`-1`や配列サイズを返します。そういった仕様にしたうえで、`memberOf()` を `indexOf()` に名前を変えると、呼び出し側は以下のようになります: ``` i = indexOf(x, data, 10); if (i <= 0 && i < 10) { printf(" data[%d]=%d .\n", i, x); } else { printf(" %d は存在しない.\n", x); } ``` 見つかった複数の添字を表示する必要がある場合は、`memberOf()`は使わないほうがシンプルです。 ``` #include ... 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); ``` または、`memberOf()` の中で表示してしまえば良いでしょう。 ``` 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); } ``` ちなみに、Ubuntu ですと、gdb や lldb という無骨なデバッガが利用可能かもしれません。