• 締切済み

線形と二分探索により探索を行うプログラムについて教えてください

20個の配列にデータを入れ(プログラム内で初期化と代入を行って良い)入力した数を探索するプログラムをCmachineで作成したいのですが、線形探索により探索を行うプログラムと二分探索により探索を行うプログラムの作り方を教えていただけないでしょうか?

  • brq
  • お礼率0% (0/5)

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

C の規格では bsearch はあっても lsearch はありませんし, ヘッダも search.h ではなく stdlib.h です. 念のため.

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

> 「Cmachine」(C言語学習用ソフト)で作成したいみたいなので、標準ライブラリは使えないかもしれません。 といわれて、ctmk110.lzhで確認したところ、確かに、search.hとかありませんでした。以降のバージョンではあるのかもしれませんが。 ですので、glibcのソースを紹介。LGPLに則って利用してください。 これが、Cmachineで動くかは確認してません。

参考URL:
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/bsearch.c?rev=1.7&cvsroot=glibc
  • edomin
  • ベストアンサー率32% (327/1003)
回答No.3

#2の方へ 「Cmachine」(C言語学習用ソフト)で作成したいみたいなので、標準ライブラリは使えないかもしれません。 ダウンロードしてみたけど、結構おもしろいソフトでした。(遊ぶには・・・) なお、コンパイルも出来ませんので実装するのではなく、あくまでも「学習用」でした。 コンパイラ+リンカと書いてありましたが、使う方からするとクローズドなインタプリンタみたいな物です。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

Cの標準ライブラリに、既にlsearchおよびbsearchがあります。 こちらを使えば、わざわざ自分で実装する必要はないと思います。

参考URL:
http://docs.hp.com/ja/B2355-60104-06/bsearch.3C.html,http://www.linux.or.jp/JM/html/LDP_man-pages/man3/lsearch.3.html
  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

全部教えるのは難しいでしょう。 線形探索や2分探索のプログラムを実際に作ってみて実行させてみたけど、「エラーがでた」や「結果が思ったのと違う」ので、どこがおかしいのだろう? と言う質問の方が回答がつきやすいですよ。 アルゴリズムの本を参考にして、とりあえず作ってみましょう。

関連するQ&A

  • 線形探索と二分探索

    線形探索と二分探索のプログラムを作成中です。 自力(本やwebに落ちているサンプルを参考にして)でここまで作りましたが正直自信がありません。どうかお願いします。 #include <stdio.h> #define ARRAYI1_MAX sizeof(array1) #define ARRAYI2_MAX sizeof(array2) //int binary_search(int*,int,int); //二分探索関数のプロトタイプ宣言 int liner_search(int*,int,int); //線形探索関数のプロトタイプ宣言 void main(void) { int array1[]={2,3,5,8,12,20,32,52}; int array2[]={22,34,65,66,12,33,43,5,1}; int result,key; printf("探す文字を入力して下さい。\n"); sacnf("%d",&key); result=liner_search(array1,ARRAYI1_MAX,key); if(result<0){ printf("見つかりませんでした\n");} else{ printf("%d番目に見つかりました\n",result);} } //線形探索 int liner_search(int*array,int num_array,int key) { int i=0; for(i=0;i<result;i++) } /*二分探索 int binary_search(int*array,int num_array,int key) { }*/

  • 線形探索

    c++で線形探索をするプログラムを教えてください。 キーボードから入力した数字の中からある値があるかどうか調べるものです。

  • 線形探索と2分探索

    「線形探索」と「2分探索」について、それぞれ違いが分かるように説明しなさい。またそれぞれがもう一方より優れているのはどのような場合か、その理由とともに示しなさい。 という問題の説明がうまくできません。 どうしたら分かりやすく説明できるでしょうか?

  • 線形探索について

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

  • pascalでの二分探索(バイナリサーチ)

    ファイルからデータを読み込み,それを整列し,入力された値をデータの中から二分探索によって探索することを繰り返すプログラムが作りたいのですが,どのように記述すればよいのか分かりません。教えてください。

  • 探索プログラムの速さの計算方法を教えてください。

    以下が問題です。 「長さがNの系列に対して3nμ秒で探索を完了する線形プログラムと 4log_2(n)μ秒で探索を完了する二分探索プログラムと 2nlog_2(n)μ秒で整列を完了するプログラムがある。 これらのプログラムを利用して、長さが1024の未整列のデータ系列Sに対し、ある要素が含まれているかどうか探索したい。このとき以下の問いに答えよ。ここでの検索要求とは「系列Sにある要素Xが含まれているかどうか判定すること」とする。」 ・検索要求が1回、5回、10回の場合それぞれの最も速い探索方法とその時間を述べよ。 計算方法と答えを教えてください。

  • 二分探索のアルゴリズム

    分からない問題があります。 ・2分探索における計算量を答えなさい。また、なぜそのようになるのかについてわかりやすく説明しなさい。 ・線形探索の計算量と2分探索の計算量を比べるとどちらの方が計算量が大きいか。理由をつけて説明しなさい。 2分探索の計算量が O(logn) 線形探索の計算量が O(n)となるのはわかりますが そのようになる説明をどのようにしたらいいか。また logn<n となるのは わかるのですが理由をどう説明したらいいのか分かりません。 どなたかお教え下さい。

  • 線形探索法のプログラムについて

    配列Aに格納されている数字を検索するプログラムより、 Aのプログラムでは配列Aに格納されている数字を検索(scanf("%d" , j)で入力)した にもかかわらず、「該当するデータがありませんでした」と表示されてしまいます。 Bのプログラムでは、配列Bに格納されている数字を検索(scanf("%d" , j)で入力)すると 「該当するデータがありました」と表示されます。 Aのプログラムで、------でかこってある部分に問題があると思われ、 いろいろと試してみましたが、未だにその理由をつかむことができません。 その理由を知りたく、書き込みを致しました。 ご教授の程宜しくお願い致します。 A. main(){ int i , j; int k = 0; int A[5] = {4 , 1 , 3 , 4 , 5}; printf("検索する数値を入力してください > "); scanf("%d" , j); --------------------------------------------------------------- for(i=0 ; i<5 ; i++){ if(A[i] == j){ printf("該当するデータはあります"); k++; } } --------------------------------------------------------------- if(k <= 0){ printf("該当するデータがありませんでした\n"); } return; } B #include<stdio.h> main(){ int i , j , k; int A[5] = {4 , 1 , 3 , 4 , 5}; printf("検索する数値を入力してください > "); scanf("%d" , j); for(i=0 ; i<5 ; i++){ if(A[i] == j){ k++; } } if(k>0){ printf("該当するデータはありました"); }else{ printf("該当するデータはありませんでした"); } return; }

  • ファイルから文字列を読み込んで、検索するプログラム

    以下のようなプログラムをつくりたいのですが、 どうしたらよいでしょうか?? 文字列を配列型に入れるときにわからなくなって しまうのですが。。。 ファイルからデータを順番に読み込み,メモリ上に一次元配列構造に並べて線形探索するプログラムを作成せよ. データの仕様 一行に、 「番号(スペース)読み仮名(スペース)文字列(住所)」 があり、これが10~1000行ほど、ファイルに(.dat) 入っている。 ファイルを配列に読み込んだあと、 番号を入力すると、住所が検索されてでてくる。 問題文も微妙なのですが、 これは番号の配列と住所の配列は別にして、 検索したほうがいいですよね、、? 何かヒントになることだけでも良いので、 よろしくお願いします!

  • 線形探索(番兵法)のプログラムについて。

    線形探索(番兵法)のプログラムについて考えています。 メイン関数からsearch関数に値を渡してそこで探索させるのですが、 int search(int a[], int n, int key) { int i = 0; a[n] = key; while (1) { if (a[i] == key) break; i++; } return (i == n ? -1 : i); } のwhileを使ったやり方からfor文を使ったやり方に変更したいと思っています。 色々な方法でプログラムを考えてみたいので。 そうすると、なんかうまくいきません。 for文だとどのように考えたらいいのでしょうか?

専門家に質問してみよう