- ベストアンサー
線形探索について
C言語の線形探索の課題なんですが 5つの整数を入力して その入力した値からみつけたい値を探索する課題なのですが #include <stdio.h> /*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/ int search(const int a[], int n, int key) { int i = 0; while (1) { if (i == n) return (-1); /* 探索失敗 */ if (a[i] == key) return (i); /* 探索成功 */ i++; } } int main(void) { int i, ky, idx; int x[4]; int nx = sizeof(x) / sizeof(x[0]); printf("%d個の整数を入力してください。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d]:", i); scanf("%d", &x[i]); } printf("探す値:"); scanf("%d", &ky); idx = search(x, nx, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); return (0); } ここまではわかるのですが、 x[0]=99 x[1]=99 x[2]=88 x[3]=99 x[4]=22 と入力したときに 99は 1番目に見つかりました 2番目に見つかりました 4番目に見つかりました と出力したいのですがうまくいきません 線形探索で同じ数値を探索するにはどうすればよいのですか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> /*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/ int search(const int a[], int n, int key) { int i = 0; while (1) { if (i == n) return (-1); /* 探索失敗 */ if (a[i] == key) return (i); /* 探索成功 */ i++; } } int main(void) { int i, ky, idx, t, f; int x[5]; int nx = sizeof(x) / sizeof(x[0]); printf("%d個の整数を入力してください。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d]:", i); scanf("%d", &x[i]); } printf("探す値:"); scanf("%d", &ky); t = 0; f = -1; while (t < nx) { idx = search(&x[t], nx - t, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx != -1) { idx += t; printf("%dは%d番目にあります。\n", ky, idx + 1); t = idx + 1; f = 0; } else break; } if (f) puts("探索に失敗しました。"); return (0); }
その他の回答 (2)
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> int search(const int a[], int n, int key) { int i = 0; while(1){ if (i == n) return (-1); if (a[i] == key) return (i); i++; } } int main(void) { int i, ky, idx; int x[4]; int nx = sizeof(x) / sizeof(x[0]); printf("%d個の整数を入力してください。\n", nx); for (i = 0; i < nx; i++){ printf("x[%d]:", i); scanf("%d", &x[i]); } printf("探す値:"); scanf("%d", &ky); for(i = 0; i < 4 && (idx = search(&x[i], nx, ky)) != -1; ){ i += idx + 1; printf("%dは%d番目にあります。\n", ky, i); nx -= idx + 1; } if (i == 0) puts("探索に失敗しました。"); return (0); }
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#include <stdio.h> typedef void (*callback)(int, void*); /*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/ void search(const int a[], int n, int key, callback cb, void* arg) { int i; for ( i = 0; i < n; ++i ) { if (a[i] == key) (*cb)(i, arg); } } void found(int n, void* arg) { printf("%dは%d番目にあります。\n", *(int*)arg, n + 1); } int main() { int x[] = { 99,99,88,99,22 }; int target = 99; search(x, 5, target, &found, &target); return 0; }