- ベストアンサー
C言語初心者向けの配列操作
- C言語における配列の要素を検索する基礎知識を学びます。
- 演習問題として、指定した値と等しい配列要素の添字を取得する関数を作成します。
- プログラムがうまく組めない方に向けて、具体的なコーディングの解説を行います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
残念ですが、回答No.3への補足の内容では正解にはなりません。 keyと等しい要素の一つめの添字がidx[0]ではなくidx[1]に入ってしまうからです。 下記のように、idx[j]へのアクセスを終えてからjの値を増やさないと。 if (v[i] == key) { idx[j] = i; printf("idx[%d] =%d\n",j,idx[j]); j++; }
その他の回答 (3)
- _kappe_
- ベストアンサー率68% (1581/2304)
回答No.2への補足からprintfの行を消して、idx[j]に代入する行を追加して、 return j;の後の閉じ括弧}を足せばsearch_idxについては答えになります。 idx[j]に何を代入するのか、その処理をどこに追加するのかはご自分で考えてください。 >if (v[i] == key) としているのが誤りなのでしょうか? その部分は間違っていません。 >要素数5としているにも関わらず要素数が3つしか入れれなかったり7つ入れれたりします。 配列の添字が有効な範囲に収まっているかどうかをチェックしないのはC言語の仕様です。それによってプログラムの実行を高速化している反面、間違いを起こしやすくなります。 他のプログラミング言語だと添字の範囲チェックを行うものもあります。 関連して、mainの下記の部分には問題があります。 > int i, n, ky, idx; > int v[n],x[n]; nの値を初期化していないのにv[n], x[n]でnを参照してしまっています。コンパイルが通ってもプログラムとしては間違いです。 もしまだmallocを習っていない場合、nを実行時に入力できるようにするのは諦めてください。
補足
下記のプログラムで求められている事は、クリアーされていますか。mallocというのはまだ、習っていないです。 main()関数の部分で要素数を5に設定しました。 idxの格納について問題文をよく読みました。 実行が上手くいかない事から頭がまわりませんでした。 #include <stdio.h> int search_idx(const int v[], int idx[],int key,int n) { int i; int j = 0; for (i = 0; i < n; i++){ if (v[i] == key){ j++; idx[j] = i; printf("idx[%d] =%d\n",j,idx[j]); } } return j; } int main(void) { int i, ky, idx; int n = 5; int v[n],x[n]; for (i = 0; i < n; i++){ printf("v[%d] =", i); scanf("%d", &v[i]); } printf("探す値:"); scanf("%d", &ky); idx = search_idx(v,x,ky,n); printf("idxへの格納数%d", idx); return 0; }
- _kappe_
- ベストアンサー率68% (1581/2304)
補足ありがとうございます。 search_idx()の中で、変数jは何のために使っているものでしょうか。 最後にreturn j;を実行しているので、jは「keyと等しい要素の個数」である必要があります。個数を数えるなら、普通はjを0で初期化し、keyと等しい要素を見つけるたびにjを1ずつ増やすはずです。しかし、補足内のプログラムではそうなっていません。 それから、idx[j] = v[i];にも誤りがあります。idxに格納するのは配列の添字であって、配列vの要素の値(v[i])ではありません。問題文をよく読みましょう。
補足
int search_idx(const int v[], int idx[],int key,int n) { int i; int j = 0; for (i = 0; i < n; i++){ if (v[i] == key){ j++; } printf("idx[%d] = %d\n", i, v[i]); } return j; if (v[i] == key) としているのが誤りなのでしょうか?jでカウントする様にしました。 idxが添字という事からidx[j]=v[i]をなくしました。確かに、単なる添字であれば必要 ない様に思いました。printf文を改良しました。constを気にし過ぎた様です。 後、プログラムと関係がない事ですみませんが、VS codeを使用してコンパイル・実行は、コマンドプロンプトで行っています。VS code初心者で使い方が分かっていないです。要素数5としているにも関わらず要素数が3つしか入れれなかったり7つ入れれたりします。探索の値が入力出来る様になったりならなかったりもします。 idxへの格納もおかしいです。 プログラムがおかしいからだと思います。ご指導の程、宜しくお願いします。
- _kappe_
- ベストアンサー率68% (1581/2304)
宿題の丸投げっぽい質問に答える人は少ないので、途中まででもいいので自分で書いたプログラムを補足に示してください。 たとえば、配列idxに結果を格納する部分は一旦忘れて、配列vの中でkeyと等しい要素を数えて返すだけの関数なら作れますか?
補足
ご指摘はごもっともです。 頑張って考えましたが、ほのかに形になった程度です。 もしかしたら、何をしたいプログラムか分からない様な物かもしれませんが、途中経過のものを出します。 少しのヒント有難う御座います。実行結果が、不安定です。どこが可笑しいのかお導きお願いします。 #include <stdio.h> int search_idx(const int v[], int idx[],int key,int n) { int i ; int j; for (i = 0; i < n; i++){ if (v[i] == key){ j = i; idx[j] = v[i]; } printf("idx[%d]=%d\n",j,idx[j]); } return j; } int main(void) { int i, n, ky, idx; int v[n],x[n]; printf("要素数:"); scanf("%d", &n); for (i = 0; i < n; i++){ printf("v[%d] =", i); scanf("%d", &v[i]); } printf("探す値:"); scanf("%d", &ky); idx = search_idx(v,x,ky,n); printf("idxへの格納数%d", idx); return 0; }
お礼