• ベストアンサー

線形探索について

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番目に見つかりました と出力したいのですがうまくいきません 線形探索で同じ数値を探索するにはどうすればよいのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

#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)

回答No.3

#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); }

回答No.2

#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; }

関連するQ&A