ボイヤー・ムーア法について

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

ボイヤー・ムーア法について

#1

投稿記事 by ageha22 » 13年前

textの中にkeyと同じ文字が何文字目にあるかを見つけて出力するプログラムをつくろうと思ってます
プログラムの流れは

1.textを入力(長文)
2.keyを入力(1つの単語)
3.keyの文字数を確認
4.keyのスキップ表を作成
5.textの1文字目とkeyの後ろから比較していきtext==key[j]だったらお互い1引いていきj=0のとき一致なので場所を出力
pは現在の場所、jはkeyの文字さす、iはtextの文字をさしてます

間違いを指摘してくれるとうれしいです

#include<stdio.h>

int main(){
int i,n,m,p,kazu,memo,check;
char text[1000],key[10];
int table[10];

kazu=0;
/*キーワードの入力*/
printf("キーワードを入力してください\n");
scanf("%s",&text);

printf("探すキーワードを入力してください\n");
scanf("%s",&key);
i=0;
/*文字数を確認*/
while(1){
kazu++;
i++;
if(key=='\0'){
break;
}
}
/*テーブル作成*/
memo=1;
for(i=kazu-2;i>=0;--i){
table=memo;
memo++;
}
table[kazu-1]=kazu;

/*文字検索*/
i=kazu-1;
j=kazu-1;
p=0;
memo=0;
while(p!=1000){
memo++;
while(text==key[j]){
i--;
j--;
if(j==0){
break;
}
}
if(j==0){
printf("%d文字目が一緒でした\n",memo);

p=+table[kazu-1];
j=kazu-1;
i=p;
}else{
while(text!=key[j]){
j--;
if(j>0){
break;
}
}
if(j>0){
p=+table[j];
j=kazu-1;
}else{
p=+table[kazu-1];
j=kazu-1;
}
}
}
return 0;
}

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

Re: ボイヤー・ムーア法について

#2

投稿記事 by box » 13年前

ageha22 さんが書きました: 間違いを指摘してくれるとうれしいです
ということは、今は正しく動いていないのですね。
どういう風に正しく動かないか、現象を説明してくださると大いに助かります。
ageha22 さんが書きました:

コード:

  scanf("%s",&text);
  scanf("%s",&key);
& は必要でしょうか。
ageha22 さんが書きました:

コード:

      p=+table[kazu-1];
      p=+table[j];
	  p=+table[kazu-1];
文法的には正しい(コンパイルエラーは出ない)のかもしれませんが、
何がしたいのかは意味不明です。
= と + の順序は本当に正しいでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ageha22

Re: ボイヤー・ムーア法について

#3

投稿記事 by ageha22 » 13年前

わざわざ返信ありがとうございます

このプログラムを実行したところ
x文字目が一緒でした
という表示が永遠に表示されつづけます(xは0からはじまり無限に1づつ増分していく)

すいません間違えました&不要です

p=+table[kazu-1];
p=+table[j];
p=+table[kazu-1];

についてですが
それぞれ
pにtableの[kazu-1]番目の数字を加算
pにtableの[j]番目の数字を加算
pにtableの[kazu-1]番目の数字を加算
という風にしようと思いました

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

Re: ボイヤー・ムーア法について

#4

投稿記事 by box » 13年前

ageha22 さんが書きました:

コード:

      p=+table[kazu-1];
このコードが
ageha22 さんが書きました: pにtableの[kazu-1]番目の数字を加算
本当にその意図どおりに動くでしょうか。
私には、pにtableの[kazu-1]番目の数字を『代入』している
(つまり、現状では + を書いても書かなくても同じ動き)ように見えます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ageha22

Re: ボイヤー・ムーア法について

#5

投稿記事 by ageha22 » 13年前

ありがとうございます
p=+table[kazu-1];

p=p+table[kazu-1];
に戻したところ無限ループが終わりました

今は
1文字目が同じです
2文字目が同じです
・・・
20文字目が同じです
とすべて同じになってる状況です

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

Re: ボイヤー・ムーア法について

#6

投稿記事 by box » 13年前

今さらかもしれませんが、
ageha22 さんが書きました:textの中にkeyと同じ文字が何文字目にあるかを見つけて出力するプログラムをつくろうと思ってます
1.textを入力(長文)

コード:

  char text[1000],key[10];
text[] と key[] の具体例を示していただけないでしょうか。
仮に、text[] の中身が英文で、空白で区切ってある複数の単語からなるものだとすると、BM法以前の話で、
ageha22 さんが書きました:

コード:

  scanf("%s",text);
scanf() では text[] に想定どおりの内容が入らないような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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