質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

0回答

797閲覧

線形探索のプログラムを基に二分探索のプログラムを作成

shiro_1822

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/06/07 19:00

前提・実現したいこと

現在辞書ファイルの検索を行うプログラムを作成中で線形探索と二分探索で辞書ファイルの検索を行おうと考えています。線形探索の方はうまくいったのですが、それをもとにした二分探索のプログラムを作成する際にどうしても手詰まりになってしまいます。このソースコードのどこを編集すれば二分探索としてのプログラムが完成するでしょうか。

該当のソースコード

C

1/*線形探索のプログラム*/ 2#include <stdio.h> 3#include <stdlib.h> 4typedef struct { 5 unsigned char s[24]; 6} word; 7int main(int argc, char **argv) { 8 word dict[100000]; 9 FILE *fp; 10 int i = 0,c,k; 11 fp = fopen(argv[1],"r"); 12 if (argc < 2) { 13 fprintf(stderr,"usage: ./a.out dictFile\n"); exit(1); 14 } 15 if ((fp=fopen(argv[1],"r")) == NULL) { 16 fprintf(stderr,"can't open file %s\n",argv[1]); exit(1); 17 } 18 k=0; 19 while((c=fgetc(fp)) != EOF) { 20 if (c == '\n') { 21 dict[i].s[k] = 0; 22 i++; 23 k=0; 24 } else { 25 dict[i].s[k] = c; 26 k++; 27 } 28 } 29 int linecount = i; 30 fclose(fp); 31 unsigned char s[30], *p, *r; 32 while(fgets(s,30,stdin) != EOF) { 33 for(p = s ; *p != 0 ; p++) { 34 if(*p == '\n') { 35 *p = 0; 36 } 37 } 38 39 for(i = 0 ; i < linecount ; i++) { 40 p = s; 41 r = dict[i].s; 42 while((*p == *r) && (*p != 0) && (*r != 0)) { 43 p++;r++; 44 } 45 if((*p == 0) && (*r == 0)) { 46 printf("%d\n", i+1); 47 break; 48 } 49 } 50 51 if(i == linecount) { 52 printf("-1\n"); continue; 53 } 54 } 55 return 0; 56} 57

試したこと

途中にint lower=0とint upper=linecount、それをもとにしたint mid = lower + upper / 2 をつけ足してみようと考えたのですが二分探索のへの生かし方が分からなかったです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/06/07 21:32

「どこを編集すればいいか」という質問の答えとしては後半の for(i = 0 ; i < linecount ; i++) のループでしょうね。なお、課題 (ですよね?) を提出して単位が欲しいだけでなく、本気でプログラミングを上達したいなら、まずインデントが微妙にズレてるのを修正したり、関数を分割することをお勧めします。
episteme

2020/06/07 23:26

「string.h を includeするな、strlen/strcmp/strcpyを使うな」なんてな縛りがあるんですか?
fana

2020/06/08 01:32

文字列ではなく整数値あたりでロジックを組むことを一度やってみてはどうでしょうか. (まずもって「二分探索とは?」が把握できていない限り,どうしようもないですから.) 整数値データに対する二分探索が完成したら,あとはデータの型を変更すればよいだけでしょう.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問