| 2006/08/14(Mon) 03:06:02 編集(投稿者)
んん・・どこから説明が必要でしょうか?
・処理が間違っている事が分からない ・処理のどこが間違っているか分からない ・間違っている場所は分かるが、どのように直せばいいか分からない など、分からない具合によって説明の量が大きく変わってくるので 正直困るのですが・・・・
とりあえず、No.18988で提示された同一文字列除外処理の間違いについてから、間違っている点を中心に書きます。
優しく、になるかどうか自信はさっぱりですが、できるだけ丁寧に、とは。 その分確実に長くなりますけど。
================================================= No.18988の同一文字列除外処理は以下のようなものでした。
(変数名がバケバケバケラッタしていたので、 思わず{このレスの間バケラッタ以外喋らない俺罰ゲーム!}なんて血迷った事を口走りそうに・・・はどうでもよくて、と、いや失礼。
変数名が個人的に見辛いと思ったので適当に短くしてます。 人それぞれかと思いますのでこれはこれで見辛かったらすいません。変数名以外、内容は変えておりません)
#==========
For バ番号 = 1 To 5400 //----------------※その1 If バ順 = 0 Then //----------------※その2 Incr バ順 オリバケ[バ順] = バケ名[バ番号] #最初の文字列 "バケ名[1]" はそのまま "オリバケ[1]" に。 ElseIf バ順 >= 1 Then //-------------※その3
#------問題部分ここから-------------------※その4 For ワルツ = 1 To バ順 //--------*1 #それまでに現れた文字列と順番に比較していく
If InStr(オリバケ[ワルツ],バケ名[バ番号]) = 0 Then Incr バ順 オリバケ[バ順] = バケ名[バ番号] Break EndIf Next #------問題部分ここまで EndIf Next
#==========
※その1 処理前の文字列数=バケラッタ名(バケ名) の個数だけ繰り返せばいいのですから、文字列の数以上は不要でしょう。 指定した配列の要素数が返って来るCount関数を使い、 "for バ番号 = 1 to Count(バケ名)" とすれば無駄が省けます。
※その2 このifコマンドの部分はまとめられると思います。 まあ色々やりかたはあるかと思いますが。間違っているわけでもありませんし。 まとめた方が記述が少し省略でき、多少処理が早くなりそう、という程度で。
※その3 Elseifではなく、単にElseで良いと思います。 バ番号は最低0なので、最初以外は必ず "バ順 >= 1" という条件を満たすのですから。 まあ、間違っているわけでも(以下略
そもそも※その2と合わせてこのif自体も省けるでしょうし。
省き方は、最初に「バ順=1」としておき、 問題部分における「Incr バ順」 と、オリバケへの代入処理 の順番を入れ替えれば済みます。 (順を追って確認していけば、ifを使った場合と結果が同じになることが分かるはずです)
#------------- バ順 = 1 For バ番号 = 1 To Count(バケ名) For ワルツ = 1 To バ順 If InStr(オリバケ[ワルツ],バケ名[バ番号]) = 0 Then オリバケ[バ順] = バケ名[バ番号] Incr バ順 Break EndIf Next Next #-------------- まあ、これでは同一文字列除外処理にはならないままですが。
※その4 本題で、問題の部分です。 詳しくは以下に。
==========================
上の同一文字列除外処理が上手く動かない事の実例を示します。
まず例えば、 バケ名[1]=あああ バケ名[2]=いいい バケ名[3]=いいい だった場合を考えてみます。
すると、まず オリバケ[1]=あああ オリバケ[2]=いいい となります。ここまでの動作には問題ありません。
問題は、 "バ番号=3" の時です。 (この時 "バ順=2" になっています。(順を追って確認してみてください)) ・バ順=2 ですので、※その3 の条件を満たします。 ・*1の forコマンドです。まず "ワルツ=1" ・オリバケ[ワルツ]=オリバケ[1]=あああ 。 バケ名[バ番号]=バケ名[3]=いいい よって、Then以下が実行されます。
・ "オリバケ[3]" に、 "バケ名[3]" の文字列「いいい」が入ってしまいます、なんてこった。
・処理が終わります ・結果は、 オリバケ[1]=あああ オリバケ[2]=いいい オリバケ[3]=いいい となり、確かに同一文字列の除外処理はされません。
=========================
つまり、この内容における問題は、 「 "オリバケ[1]" と比較し、違っていたら即、新しい "オリバケ[]" に代入してしまう」 という所にあります。
たとえ "オリバケ[1]" と同じであっても、 "オリバケ[2]" と違う文字列であれば "オリバケ[]" に入ってしまいます。 そして "オリバケ[1]" と "オリバケ[2]" は別の文字列ですので、 結局どんな文字列でも "オリバケ[]" に代入されてしまい、同一文字列の除外処理には全くなりません。
===============================
同一文字列を除外するためには、 本来は、 「オリバケ[1]と比較、違うならオリバケ[2]と比較、それとも違うのならオリバケ[3]と・・・・」 のように、 「その時にある、全てのオリバケ[]と違うかどうか」 を調べなければなりません。 そして、全てのオリバケ[]と違うことが確認されて初めて、 「新しいオリバケ[]として文字列を代入する」 という処理を行うようにするわけです。
============================
ですから、 問題部分で行うべき内容 は、
No.18988における >「算出された文字列をそれまでに現れた文字列と比較し、少しでも違うならば別な変数に保存する」 という表現に合わせると、
「算出された文字列を、それまでに現れた全ての文字列と、順番に比較し、 もしも、その"算出された文字列"が、それまでに現れたどの文字列とも違うなら、 "算出された文字列"を、別の変数に保存する」
となるかと思います。 問題部分を、上の「」内の内容に即したものに書き換えれば良いわけです。
=======================
以上です。 バケラッタ
|