BM法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hata88bou

BM法について

#1

投稿記事 by hata88bou » 12年前

C言語 ボイヤー・ムーア法について
私は、ネットなどを利用して、趣味でC言語の勉強をしているのですが、ボイヤー・ムーア法の項目で躓いてしまいました。
ランダムに単語をならべ、そこからある単語を検索して、文字を比べた回数(文字比較の回数)を表示したいと思っているのですが、意図しない回数が表示されてしまいます。さぐりさぐりな状態で、「そんなこともわからんのか」と言われてしまうかもしれませんが、アドバイスを頂けたら、と思います。

#include<stdio.h>

static char text[30]="is he your happy Monday night";
static char key[4]="your";

int shift(char a)
{
if (a==key[0]) return 3;
else if (a==key[1]) return 2;
else if (a==key[2]) return 1;
else return 4;
}

int main()
{
int i,j,k;

k=0;
i=3;
while (i<=29)
{
k=k+1;
if (text==key[3])
{
k=k+1;
if (text[i-1]==key[2])
{
k=k+1;
if (text[i-2]==key[1])
{
k=k+1;
if (text[i-3]==key[0])
{
printf("The word was found.\n");
i=i+30;
}
else j=shift(text[i-3]);
}
else j=shift(text[i-2]);
}
else j=shift(text[i-1]);
}
else j=shift(text);

i=i+j;
if(j<4)k=k+1;
}

printf(" %d times.\n", k);

return 0;
}

hata88bou

Re: BM法について

#2

投稿記事 by hata88bou » 12年前

コード:

で囲うというのが良く分からず、そのまま投稿してしまいました。申し訳ないです。

box
記事: 2002
登録日時: 15年前

Re: BM法について

#3

投稿記事 by box » 12年前

まずは、使っている変数の意味を説明してみてください。
hata88bou さんが書きました:

コード:

static char key[4]="your";
1バイト足りないのではないでしょうか。key[5]ではありませんか?

あと、コード全体を見て感じることは、「そのtext[]とkey[]限定版ですか?」ということです。
本来、BM法というのは任意の長さの探索対象文字列とキー文字列に対して
適用できるはずだと思います。
hata88bou さんが書きました:

コード:

    i=3;
初期値が3である理由は何ですか?上に書いた「限定版ですか?」と関係ありますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る