N88-Basic言語

以前の記事で、yamatoさんから、BASIC言語のソースコードの解説を依頼されたのでここで行います。
ただし、プログラム言語に素養にある方からすると、へんてこなコードになっています。
少し先に言い訳をしておきます。

  • 質問者は、プログラム言語をはじめたばかりであり、あまりトリッキーなコードを書くことは避けたほうがよい。
  • 質問者が依頼した言語はU-BASICであり、私が書いたコードはN-88BASICである。若干互換性がある[かもしれない]んで無難な路線で。
  • 私自身BASIC言語を扱うのは、7年ぶりなので、[7年間にやったときも、5年ぶりだった。]かなり命令を忘れている。
  • 私自身、プログラミングセンスがない。

以下の上で解説をします.

100 cls 3
110 printwrite down evaluate num”:input TRYCOUNT
200 hitnum=0
300 dim iBox$(3100)
400 randomize

100で、画面をクリアしています。普通はこれに screen 3,0,0,1:console 0,25,0,1なんてのがつくんですが。
110で、TRYCOUNTに数字を入力させています。TRYCOUNTには、乱数で生成する個数を入れます。ここでは、
評価回数と名づけています。300で、iBox$(3100)と定義しているので、3099個以上は生成することができません。
200では、hitnumとして生成した乱数と、指定した文字列とを比較していったとき、一致した個数が入ります。
400で、乱数の種を決めうちさせないようにしています。

500 for iCounter = 0 to TRYCOUNT-1 step 1
600 iRnd = int(rnd*4)+1
700 if iRnd = 1 then print ”No”;iCounter;” ”;iRnd;”:U”:iBox$(iCounter)=”U”
800 if iRnd = 2 then print ”No”;iCounter;” ”;iRnd;”:G”:iBox$(iCounter)=”G”
900 if iRnd = 3 then print ”No”;iCounter;” ”;iRnd;”:A”:iBox$(iCounter)=”A”
1000 if iRnd = 4 then print ”No”;iCounter;” ”;iRnd;”:C”:iBox$(iCounter)=”C”
1100 next iCounter

ここでは、乱数を生成しています。
500から1100まで 先に指定したTRYCOUNT回分繰り返し処理を行います。
600では、1から4までの範囲で乱数を生成させています。
700から1000までで、U,G,A,Cという文字列に変換しています。ここの処理は、
本来はU,G,A,Cという塩基配列らしいのですが、U,G,A,Cという文字列を乱数でダイレクトに
生成させるのはあまりにもめんどくさいので、先に1から4までの乱数を生成しておき、
それが1だったらU,2=>G,3=>A,4=>Cというように、数字と文字を対応付けているだけです。

ぶっちゃけた話、今回の場合パターン一致すればOKなはずなので、ぜんぜんU,G,A,Cという文字に
変換する作業は必要ではありません。

なお、ここで生成した文字列はiBox$配列に取り込まれるので、乱数で生成した文字列が配列化されます。
したがって、UUGACという塩基配列の場合、iBox$(0)=U,iBox$(1)=U iBox$(2)=G iBox$(3)=A,iBox$(4)=C
という風に関連付けられます。[ここも本当は一つの文字列でやってしまうほうが普通だと思います。]

1500 printWrite Down Keywords”:input ZX$
1600 print ”Search Words [”;ZX$;”]”
1700 iLength=len(ZX$)
1800 print ”strlen=”;iLength

ZXに意味はありません。適当に作ったからです。すみません・・・。
検索する文字列を入れているだけです。
iLengthには、この文字列の長さを入れます。

1810 color 1:print ”----------------- ANALYSIS -----------------”:color 7
1900 for j=0 to TRYCOUNT-iLength step 1
2000 X$=””
2100 for i=0 to iLength-1 step 1
2200 X$=X$+iBox$(j+i)
2300 next i
2400 print ”compare with[”;ZX$;”]/[”;X$;”]”
2500 if ZX$=X$ then gosub 3300
2600 next j

ここで、実際の解析をしています。
1900から2400の間では、検索する文字列分を、iBoxから評価するために抽出しています。
2500で、実際に一致しているかどうかを評価しています。もし一致していた場合、3300へ飛びます。gosubなので、また帰ってきます。

3300 print ”iBox(”;j;”) is answer.”
3400 RESULT(hitnum)= j:hitnum=hitnum+1
3500 return

これが、gosubで飛んでいった中身ですw。3500のreturnを受けて2500へ戻ります。
もし、検索文字列と乱数文字列が一致していたら、ヒットした回数を増やしています。また、
RESULT(hitnum)に、j番目が一致しましたよ。と何番目が一致していたのかを、RESULTに入れておきます。

2690 color 2:print ”---------------- RESULT -------------------”:color 7
2700 if hitnum = 0 then 2800 else 2900
2800 color 6:print ”can not find the answer”:color 7:end
2900 for i = 0 to hitnum - 1 step 1
3000 color 6:print ”iBox(”;RESULT(i);”) is answer.”
3100 next i

最後に結果を表示しています。

蛇足ながら、TRYCOUNTがソースコードを読んで、なんのために存在しているのか、お分かりでないということでしたら、
この説明でも、理解できないと思います。
一度、BASICの文法書をよく読んでみて、もっと簡単なプログラムを自分自身で書いてみるなどの訓練を経てから
ゼミの課題に挑まれたほうが、結局回り道なようで、一番近道である気がします。
おこがましくいうと、プログラミングは一度自分自身で書いて見なければいつまでたっても、
わからないと思いますよ。
私も、最初はぜんぜんかけませんでした。
http://www5f.biglobe.ne.jp/~ymlab/program/N88.htm
最初のうちは、本をびりびりと破きたくなるほど難儀すると思いますが、
がんばってくださいね。

ソースコード

100 cls 3
110 print ”write down evaluate num”:input TRYCOUNT
200 hitnum=0
300 dim iBox$(3100)
400 randomize
500 for iCounter = 0 to TRYCOUNT-1 step 1
600 iRnd = int(rnd*4)+1
700 if iRnd = 1 then print ”No”;iCounter;” ”;iRnd;”:U”:iBox$(iCounter)=”U”
800 if iRnd = 2 then print ”No”;iCounter;” ”;iRnd;”:G”:iBox$(iCounter)=”G”
900 if iRnd = 3 then print ”No”;iCounter;” ”;iRnd;”:A”:iBox$(iCounter)=”A”
1000 if iRnd = 4 then print ”No”;iCounter;” ”;iRnd;”:C”:iBox$(iCounter)=”C”
1100 next iCounter
1200 rem for j=0 to TRYCOUNT
1300 rem print iBox$(j)
1400 rem next j
1500 print ”Write Down Keywords”:input ZX$
1600 print ”Search Words [”;ZX$;”]”
1700 iLength=len(ZX$)
1800 print ”strlen=”;iLength
1810 color 1:print ”----------------- ANALYSIS -----------------”:color 7
1900 for j=0 to TRYCOUNT-iLength step 1
2000 X$=””
2100 for i=0 to iLength-1 step 1
2200 X$=X$+iBox$(j+i)
2300 next i
2400 print ”compare with[”;ZX$;”]/[”;X$;”]”
2500 if ZX$=X$ then gosub 3300
2600 next j
2690 color 2:print ”---------------- RESULT -------------------”:color 7
2700 if hitnum = 0 then 2800 else 2900
2800 color 6:print ”can not find the answer”:color 7:end
2900 for i = 0 to hitnum - 1 step 1
3000 color 6:print ”iBox(”;RESULT(i);”) is answer.”
3100 next i
3110 color 7
3200 end
3300 print ”iBox(”;j;”) is answer.”
3400 RESULT(hitnum)= j:hitnum=hitnum+1
3500 return