前提・実現したいこと
ファイルからデータを読み込んでそのデータを選択ソートで整列させた後、二分探索法で、探索キーと一致する配列要素の添え字を全て表示するプログラムを作成しています。しかし、探索キーと一致する要素が複数存在するときはその添え字の全てを表示するプログラムを作成したいのですが、どうやっても1つしか表示できません。改良方法が知りたいです。まだまだプログラミング初学者なため出来るだけ簡単に分かりやすくご教授いただければ幸いです。よろしくお願いします。(c言語)
**
発生している問題・エラーメッセージ
探索キーと一致する要素が複数存在するときその添え字の全てを表示したいが1つしか表示できず、全ての添え字を表示する方法がわからない。
### 該当のソースコード #include <stdio.h> #define MAXDATE 10000 #define _YES 1 #define _NO 0 int main(void) { int n, i, j, k, x; int v[MAXDATE]; int highid, lowid, midid; int tmp; char filename[20]; FILE *fin; puts("ファイル名を入力してください。");//データの読み込み printf("file name ="); scanf("%s", filename); if ((fin = fopen(filename, "r"))==NULL) { printf("ファイルを開くことが出来ません。\n"); return 1; } n = 0; while (fscanf(fin, "%d", &v[n])==1) n++; fclose(fin); for (i = 0; i < n; i++) { fscanf(fin, "%d", &v[i]); } for (i = 0; i < n - 1; i++) { //選択ソートによるデータの並び替え j = i; for (k = i + 1; k < n; k++) { if (v[j] > v[k]) { j = k; } } tmp = v[j]; v[j] = v[i]; v[i] = tmp; } while (scanf("%d", &x)==1) { //二分探索による探索 highid = n - 1; lowid = 0; int found = _NO; while (lowid <= highid) { midid = (lowid + highid) / 2; if (v[midid] == x) { found = _YES; break; } else if (v[midid] < x) { lowid = midid + 1; } else { highid = midid - 1; } } if (found == _YES) { printf("%dはv[%d]と一致しました。\n", x, midid); } else { printf("%dはデータから見つかりませんでした。\n", x); } } printf("さようなら。\n"); return 0; } ```c言語
回答3件
あなたの回答
tips
プレビュー