投稿する

大原本  問69 [5388]

 まきさん(No.1) 
次のプログラムで(1)がi-j+1とはなぜならないのでしょうか
なぜi←i-j+2となるのでしょうか?
2文字ずつを比較した場合に一文字ずつずれるならi-j+1となると思いますが

Strings_search(文字型配列:moji,文字型:m,文字型配列:ptn,文字型:n)
整数型:i,j,cnt
論理型:flg
cnt←0
i←1
while(i<=(m-m+1))
flg←true
j←1
while(j<=n)
if(moji[i]≠ptn[j])
flg←false
break
endif
i←i+1
j←j+1
endwhlie
if(flg=true)
cnt←cnt+1
endif
i←i-j+2 (1)
endwhile
cntの表示
2024.04.04 20:17
jjon-comさん(No.2) 
FE ゴールドマイスター
具体的な値を仮定してみます。
i=1, j=1 で異なる文字だったとき if(moji[1]≠ptn[1])
i←i-j+1 であるとすると i←1-1+1 つまり i←1 であり iは次の文字に進みません。

i=★  , j=1, if(moji[★]=ptn[1])
i=★+1, j=2, if(moji[★+1]=ptn[2])
i=★+2, j=3, if(moji[★+2]=ptn[3])
i=★+3, j=4, if(moji[★+3]≠ptn[4]) …ここで異なる文字を発見

という場合、
iの値を★の位置に戻す式は i-(j-1) すなわち i-j+1 です。
その上でiの値を★の1つ隣に動かしたいので、i-j+1(+1) すなわち i-j+2 です。
2024.04.05 15:52
 まきさん(No.3) 
解説ありがとうございました。
i←i-j+2の場合
i=★  , j=1, if(moji[★]=ptn[1])
i←i-j+2
2  1-1+2
i=★+1, j=2, if(moji[★+1]=ptn[2])ここを1文字目
i←i-j+2
2  2-2+2
i=★+2, j=3, if(moji[★+2]=ptn[3])2文字目移ってまた1文字目になる
i←i-j+2
2  3-3+2
i=★+3, j=4, if(moji[★+3]≠ptn[4])また2文字目移る
…ここで異なる文字を発見
ということですか?これでは2文字目でずっと比較しているみたいで動くイメージが湧きません

i←i-j+1の場合
i=★  , j=1, if(moji[★]=ptn[1])
i←i-j+1
1  1-1+1
i=★+1, j=2, if(moji[★+1]=ptn[2])
i←i-j+1
1  2-2+1
i=★+2, j=3, if(moji[★+2]=ptn[3])
i←i-j+1
1  3-3+1
i=★+3, j=4, if(moji[★+3]≠ptn[4]) …ここで異なる文字を発見
i←i-j+2
1  4-4+1

>i=1, j=1 で異なる文字だったとき if(moji[1]≠ptn[1])
i←i-j+1 であるとすると i←1-1+1 つまり i←1 であり iは次の文字に進みません。
という意味は分かりました
2024.04.05 20:51
chihiroさん(No.4) 
FE プラチナマイスター
横から失礼します。
>i=★+2, j=3, if(moji[★+2]=ptn[3])2文字目移ってまた1文字目になる
>i=★+3, j=4, if(moji[★+3]≠ptn[4])また2文字目移る
書籍を所持していないので本スレッドの情報だけでしか判断できないのですが、本問では、ptnは2文字であると決められているのでしょうか?

moji[]:BEDCGAFBCFAFD…
ptn[] :AFBDF
私はこのようにmojiもptnも任意の文字数であると判断していました。
例えばi=6から(BEDCGA…のAから)比較を始めた場合、
>i=6, j=1, if(moji[6]=ptn[1]) 
"A"と"A"で一致、i←i+1=7,j←j+1=2
>i=7, j=2, if(moji[7]=ptn[2])
"F"と"F"で一致、i←i+1=8,j←j+1=3
>i=8, j=3, if(moji[8]=ptn[3])
"B"と"B"で一致、i←i+1=9,j←j+1=4
>i=9, j=4, if(moji[9]=ptn[4])
"C"と"D"で不一致、flg←falseとしてwhile文をbreak
i←i-j+2=9-4+2=7とし、次はBEDCGAF…のFから比較を始める

以上のような比較をイメージしました。
2024.04.05 22:08
jjon-comさん(No.5) 
FE ゴールドマイスター
No.3への回答はいったん保留して。

配列moji[]←{'A','A','A','B','A','A','A','B'}  配列長 m←8
配列 ptn[]←{'A','A','B'}  配列長 n←3

のとき、次のように動くはずだ、という理解はできているのでしたっけ?

i←1 のときのループ
if (moji[1]=ptn[1]) は真 'A'='A'
if (moji[2]=ptn[2]) は真 'A'='A'
if (moji[3]=ptn[3]) は偽 'A'≠'B'
moji[1]から始まる箇所に"AAB"は見つからなかった

i←2 のときのループ
if (moji[2]=ptn[1]) は真 'A'='A'
if (moji[3]=ptn[2]) は真 'A'='A'
if (moji[4]=ptn[3]) は真 'B'='B'
moji[2]から始まる箇所に"AAB"が見つかった

i←3 のときのループ
if (moji[3]=ptn[1]) は真 'A'='A'
if (moji[4]=ptn[2]) は偽 'B'≠'A'
moji[3]から始まる箇所に"AAB"は見つからなかった

i←4 のときのループ
if (moji[4]=ptn[1]) は偽 'B'≠'A'
moji[4]から始まる箇所に"AAB"は見つからなかった

i←5 のときのループ
if (moji[5]=ptn[1]) は真 'A'='A'
if (moji[6]=ptn[2]) は真 'A'='A'
if (moji[7]=ptn[3]) は偽 'A'≠'B'
moji[1]から始まる箇所に"AAB"は見つからなかった

i←6 のときのループ
if (moji[6]=ptn[1]) は真 'A'='A'
if (moji[7]=ptn[2]) は真 'A'='A'
if (moji[8]=ptn[3]) は真 'B'='B'
moji[2]から始まる箇所に"AAB"が見つかった

iが7になって (m-n+1)=8-3+1=6 を越えたのでループ終了。
2024.04.05 22:11
まきさん(No.6) 
>chihiroさん
>書籍を所持していないので本スレッドの情報だけでしか判断できないのですが、本問では、ptnは2文字であると決められているのでしょうか?

いえ、ptn[1]~ptn[n]と等しいパターンが含まれるということなので何文字でもよいです
比較対象する、される関係無しにです

解法としてのイメージはこういったことかと覚えておきます

>jjon-comさん
解説ありがとうございました。
解説の通り文字の動きはそうなるとは分かっています。

ただ問題はのプログラムだけ見たら解説にある通りに具体的に思い浮かべれたかというと出来ませんでした。
2024.04.07 09:28
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop