この章では、FOR~NEXT文について学びます。
FOR~NEXT文は、それがあるだけでプログラムリストを読むのがぐっと難しくなるというおそろしい命令です。
プログラムした人は意味があって使っているしその意味もわかっているのですが、そのリストを読むほうはたまったものじゃありません。
それでも使うのはなぜかといえば、とてもベンリだからです。
これがあるだけでプログラムの手間はものすごく少なくなります。
あんがい悪くないですね。プラマイでいえばプラスじゃないでしょうか。
さらにこの章では、DIM命令、いわゆる配列変数についても学びます。
配列変数というものはパッと頭で理解するのがなかなかむずかしく、プログラムをおぼえはじめた人はみんなひっかかるポイントです。
正直わたしも何度か「こんなものなけりゃいいのに」と思いました。
「なんの役にたつんだ?」とも思いました。
「なくていいじゃん」とも思いました。
でも、そういうものが意外とけっこう役にたつということは、ここまでこの講座を読んできた人なら知っているはずです。
くやしいことにこれが本当に役にたつのです。
この章では、できるだけじっくりと配列変数のことをおぼえていきます。
あんまりじっくりすぎて途中でめんどくさくなるかもしれませんが、カベをのりこえるためだと思ってじっくり読んでみてください。
「くりかえし命令」と言ってどんな命令を想像するかな?
GOTOで作る無限ループなんか、「くりかえし」になるんじゃねえか?
- @MUGEN
- PRINT”くりかえし”
- GOTO @MUGEN
たしかに何度もくりかえしているね。じゃあ、無限ループじゃなく10回くり返したら途中でループをやめる、とするとどうすればいいかな?
ムリじゃねえの?
ず、ずいぶんアキラメが早いね。ええと、変数を使って、ループのたびに変数の中身を変えて、IF~THEN文で変数によって別のラベルまで……
ウォオー! 話を聞いてるだけでめんどクセエうえに、言ってるイミもよくわかんねえぜ!
なかなか難しいよね。そこで役に立つのがFOR (フォー)~NEXT (ネクスト)命令なんだ。
まずこのプログラムを見てごらん。
- FOR A=1 TO 10
- PRINT”くりかえし”
- NEXT
ほとんどゼンブ新しい命令じゃねえか! とりあえずRUNしてみるか。
ちゃんとくりかえしを10回書いたところで終わったね。
3行のプログラムにしちゃナカナカやるじゃねえか。どうやらクワシク話をきかなきゃならねェようだな!
英語で「FOR (フォー)」は「~から」、「TO (トゥ)」は「~まで」という意味になるね。
FOR A=1 TO 10は「A=1から10まで」と読んでもいいだろう。
そして「NEXT (ネクスト)」は「次にいく」というところかな。「次のくりかえしを始める」って考えればこれはわかるよね。
NEXTの方はだいたいワカッたぜ。しかしFORの方、「A=1から10まで」ってのはイミわからねェな。フツウ「1から10まで」じゃねえのか?
あれ? たしかBASICでイコール記号を使うのは変数のときだけだから……?
よくおぼえていたね。そう、このAは変数なんだ。
なんでココで変数が出てくんだ……?
話が見えてこねェぞ! ワカるようにセツメイしやがれ!
ジッサイにプログラムで見てもらうのが早いかな? ちょっと書きかえてみよう。
- FOR A=1 TO 10
- PRINT”くりかえし”;A
- NEXT
これをするとこうなるね。
1から10まで、くりかえすたびに変数Aがふえている、のかな?
そう考えてマチガイじゃないね。これがFOR~TOのむずかしいトコロなんだけど、「A=1から始めて、変数Aが10になるまで、変数Aを1ふやしながらくりかえす」というのがFOR A=1 TO 10の正しいイミなんだ。
ズイブンいろいろなコトがはぶいて書いてあんだな、FOR~TO文にはよォ! わかりづれェ!
そのまま書いても長い命令になって、打ちづらいだろうしね。これくらいがちょうどいいんじゃないかな。
おっと待てよ、オレのギモンがカイケツしてないままだったぜ! なんで変数がかならず出てくんだ? はじめの方で使ったこのプログラムだけは、変数いらねえじゃねえか!
- FOR A=1 TO 10
- PRINT”くりかえし”
- NEXT
それはもっともかもしれないね。FOR~NEXT文では変数を使うことの方がずっと多いから……としか言えないかな。じっさい、変数を使わないループなら変数のことはムシすればいいんだし、別にモンダイはないだろう?
ウムム……タシカに。
うっかり別のところで変数Aを使ってると、FOR命令で変数のナカミが変わっちゃうから、それだけは気をつけないとね。
なんだかマルメこまれた気がしねェでもないが……
次はこのFOR~NEXT文と相性のいい、DIM命令について説明するよ!
まずサイショに、「配列変数 (はいれつへんすう)」について知っておこうか。
イヤなヨカンだな……。漢字が4コ以上つづいたコトバはムズカシいモンと決まってるぜ!
まあまあ。いままでにおぼえた変数とたいした違いはないんだよ。
ホントに?
使いかたがトクシュだからとまどうかもしれないけど、変数と同じように使うものだってコトさえ忘れなければ、けっこうカンタンなはずさ。 まず、いつもの変数を考えてみようか。
- APPLE=56
- PRINT”りんご”;APPLE;”こ”
おぼえてるかな? サンプルプログラム1でこんな使いかたをしたよね。
オボエてなくたって、リストを読めばイミはわかるぜ。えーと、"RUN"!
- りんご56こ
- OK
そうそう、変数APPLEのナカミ56をPRINTするんだゼ!
(ワンパク君、わすれかけてたな……)
これを配列変数に変えてみよう。
- DIM APPLE[1]
- APPLE[0]=56
- PRINT”りんご”;APPLE[0];”こ”
1行目からさっそく新しい命令が2つ……
ああ、そこは今は気にしないでいいトコロだから、2行目から読むようにしてね。
ン? じゃあ変わったのは、変数のウシロに[0]がついただけってコトか? それとも変数のウシロに[0]がつくと、何か変数がチガってくんのか?
いいや、APPLE[0]のナカミは56でマチガイないよ。
- りんご56こ
- OK
じゃあナマエ以外ゼンブ同じじゃねェかよ!
変数と同じだって言ったじゃないか。こういうものなんだよ。
うーん……これはワンパク君じゃなくても、フツウの変数でいいじゃないかって思うな。
よし、その気持ちをわすれずに、配列変数の使い方その2にいってみよう!
- DIM APPLE[2]
- APPLE[0]=56
- APPLE[1]=32
- PRINT”りんご”;APPLE[0];”こ”
- PRINT”りんご”;APPLE[1];”こ”
やっぱり1行目はムシして読んでね!
テメー……まさか、ソレもこのフツウの変数と同じだって言うんじゃねェだろうな……
- APPLE0=56
- APPLE1=32
- PRINT”りんご”;APPLE0;”こ”
- PRINT”りんご”;APPLE1;”こ”
合ってるよワンパク君! ちゃんとわかってるじゃないか。
ウオォー! ガキあつかいもタイガイにしやがれー! 変数のナマエが違うだけじゃねえか!!
そうそう、名前くらいのちがいだって思えばいいんだよ。教えやすくてたすかるなあ。
チッ、ここまではテメーのオモワクどおりってワケか。だが、そろそろ配列変数だけができるワザを言わねえと、オレもダマっちゃいないぜ!
配列変数ならではって言うと……こういうのはどうかな?
- DIM APPLE[32]
- APPLE[1]=56
- APPLE[2]=32
- APPLE[3]=71
- :
- :
- APPLE[31]=45
- PRINT”1にちめ りんご”;APPLE[1];”こ”
- PRINT”2にちめ りんご”;APPLE[2];”こ”
- PRINT”3にちめ りんご”;APPLE[3];”こ”
- :
- :
- PRINT”31にちめ りんご”;APPLE[31];”こ”
あんまり長いから途中ははぶいたけど、31日分のリンゴを数えるプログラムなのはわかるよね。
つまり……カッコの中の数字があるからわかりやすいって感じ……?
フザケんじゃねエー! だからソレ、こう書いても同じじゃねえか!
- APPLE1=56
- APPLE2=32
- APPLE3=71
- :
- :
- APPLE31=45
- PRINT”1にちめ りんご”;APPLE1;”こ”
- PRINT”2にちめ りんご”;APPLE2;”こ”
- PRINT”3にちめ りんご”;APPLE3;”こ”
- :
- PRINT”31にちめ りんご”;APPLE31;”こ”
- :
そうだよワンパク君! よくここまでガマンしたね! ここまでは本当に変数といっしょなんだ。これから、配列変数だけの使い方に変えていくよ。
お、おう……? ガマンしたオボエはあんまりねェが、とにかくのぞむトコロだぜ!
- DIM APPLE[32]
- APPLE[1]=56
- APPLE[2]=32
- APPLE[3]=71
- :
- :
- APPLE[31]=45
- FOR DAY=1 TO 31
- PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
- NEXT
!!
わかってきたかな。34行目からはおぼえたばかりのFOR~NEXTを使っているね。
変数DAYを1から順にふやしながら、31までくりかえすんだよね。
変数DAYが1のトキは、35行目のイミはPRINT 1;”にちめ りんご”;APPLE[1];”こ”ってコトになる……
だがFOR~NEXTでくりかえしてDAYが2になったら、同じ35行目でもPRINT 2;”にちめ りんご”;APPLE[2];”こ”に……!
これが31まで自動でくりかえされるってワケか!
これは配列変数じゃないとできないだろう。こういう使い方もできるね。
- INPUT”なんにちめを しらべますか”;DAY
- PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
INPUTで数字を変数DAYに入れて、34行目で配列変数APPLE[DAY]をPRINTするわけだね。
うーん、これを普通の変数でやろうとすると、変数名を入力させて……いやいや配列変数じゃないとダメか……
みんなもわかったみたいだね。つまり配列変数は「変数名に変数を使える」ベンリな変数なんだ。
ヘンスウメイをヘンスウにツカえるヘンスウ……
ごめんごめん、「変数」というコトバばっかりでわかりづらかったね。こういうふうに、口で説明するのがムズカシいのが配列変数なんだ。だから今回はできるだけジッセン的に説明したよ。
ヘッ、なかなかヤルじゃねえかクソッタレー!
それ、ほめてるの?
配列変数についてわかってきたところで、DIM命令もおぼえておこう。
配列変数を使うときはいつも1行目に書いてあったね。
- DIM APPLE[32]
DIM APPLE[32]というのは、これから配列変数をAPPLE[0]~APPLE[31]まで用意する、という命令だよ。
いちいち前もって数を決めておかないといけないの?
そう。このことを「配列宣言」と言うんだけど、かならず配列宣言するのはちょっとめんどうではあるね。
メンドウなコトなんざやってられるか! イキナリ書けばいいじゃねえか!
- APPLE[31]=1
- Undefined valiable in 0:1
- OK
というエラーが出るんだよね。
ヤロー! こうすりゃいいんだろ! 負けたキブンだぜ!
- DIM APPLE[32]
- APPLE[31]=1
- OK
使うのはAPPLE[31]までなのに、DIM APPLE[32]と書かなきゃいけないのがフシギなんだけど……。
そのDIMだと、用意されるのはAPPLE[0]~APPLE[31]だからね。数を数えてみるとわかるよ。
……タシカに、32コあるな。しかし言われねえとピンとこねえハナシだぜ!
LOCATE命令でもそうだったけど、ゼロから数えるから、頭で考える数より1つズレちゃうんだね。これは気をつけないといけないかな。
いっそありえないくらい大きく宣言したら?
ところがプチコンが用意できる変数の数は無限ではないんだ。数値の変数だけならだいたい100万個ぐらいまでなら大丈夫だけど、文字列の変数だと入れる文字列が長いほど使える量が減っていったりするし、あとになって足りなくなったら困るだろ?
チッ、なにかとメンドウだぜ!
しかしまあワリと今回はジュウジツしたな。デカいヤマを乗りこえたって感じだゼ!
あ、でもその前にもう1つ、おぼえておきたいコトが……
マジでか。
配列変数の説明に使ったこのプログラムだけど……
- DIM APPLE[32]
- APPLE[1]=56
- APPLE[2]=32
- APPLE[3]=71
- :
- :
- APPLE[31]=45
- FOR DAY=1 TO 31
- PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
- NEXT
いま見直しても、2~32行目がずいぶん長いって思うよね。
でもコロンで2行や3行をまとめても、まだけっこう長いしなあ。
こういうデータをまとめたいときに役にたつのがDATA (データ) とREAD (リード) のコンビなのさ。 まずはDATAの使い方を先に見てみよう!
- DATA 56,32,71,40,64,73,61,10,45,80
- DATA 25,71,63,54,98,23,14,66,58,47
- DATA 94,36,31,26,45,71,24,76,66,58,46
ホントにデータって感じだね。
やってるコトは「,」で区切りながらリンゴの数を順に並べてるだけ……みたいだな。
リンゴの数の種類は全部で31。4行目だけ1つ飛び出してるけど、これはいいの?
DATA文はかなり自由だから、1行に何個データがあってもいいんだ。2行目では10個、3行目も10個、4行目では11個。プログラムしていて見やすければそれが一番だと思うよ。
だがイマんとこ、ただ数をズラッと書いてるだけじゃねえか! DATAの使いミチにはほど遠いゼ!
そこがポイントだね。DATA命令はそのままだと何のイミもないんだ。そこでREAD命令の出番になるよ。
READ、日本語で言えば「読む」だね。
いちばんカンタンなREAD命令の使いかたはこうかな。
- READ APPLE
さっきのDATA文の後にこう書くと、最初のデータ56が変数APPLEに入るよ!
31コあるデータなのに、入る数字は最初の1つだけかよ。どういうこった!
いくつもデータを読み込むなら、READのあとに変数を並べて書くね。今回使うのは配列変数だから……
- READ APPLE[1],APPLE[2],APPLE[3]
- READ APPLE[4],APPLE[5],APPLE[6]
- :
こんなふうに10行ほど続けると全部のデータが読み込めるよ。
ゼンゼン長ったらしいゼ、まだまだ使えたもんじゃねェな!
あれ、待ってよ。配列変数っていうことは……?
そう、気がついたようだね。今のREAD文を短くまとめると、こうなるんだ。
- FOR DAY=1 TO 31
- READ APPLE[DAY]
- NEXT
ココでもまたFOR~NEXTか……。オボエたての命令だが、ずいぶんアチコチで使うんだな。
特に配列変数やREADにはベンリな命令だからね。31行あった文が6行におさまったのはFOR~NEXT文のおかげだね。
いままでのプログラムリストを全部書いてみると、こうなるね。
- DIM APPLE[32]
- DATA 56,32,71,40,64,73,61,10,45,80
- DATA 25,71,63,54,98,23,14,66,58,47
- DATA 94,36,31,26,45,71,24,76,66,58,46
- FOR DAY=1 TO 31
- READ APPLE[DAY]
- NEXT
- FOR DAY=1 TO 31
- PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
- NEXT
ウオォ、いつのまにか10行まで短くなってたのか!
5~10行目はかぶってるところがあるから、まとめちゃおう。
- DIM APPLE[32]
- FOR DAY=1 TO 31
- READ APPLE[DAY]
- PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
- NEXT
- DATA 56,32,71,40,64,73,61,10,45,80
- DATA 25,71,63,54,98,23,14,66,58,47
- DATA 94,36,31,26,45,71,24,76,66,58,46
こんなふうにDATAはプログラムリストのどこに置いてもいいんだよ。READすると自動的にリストの中で最初にあるデータをさがして順番に読みこむからね。
オイオイ、8行におさまっちまったぞ!
やっていることは同じでも、はじめのころの63行あったプログラムとくらべると、かなりコンパクトになったろう。
あんまり短くしすぎると書いてる自分もこんがらがるので考えものじゃが、目で追えるていどならセイリしてまとめるのは良いことじゃな。こういうのもプログラムのひとつのダイゴミじゃ。
あ、ハカセ。いつから……?
ジジイの言うこともワカる気がするゼ。ケッキョク配列変数もFOR~NEXTもナシで書いた方がワカりやすさじゃイチバンなんじゃねえか? とか思ったモンだが……
今までの話を全部だいなしにしそうな発言だね。
しかし、BASICの命令をクシして、めんどクセェことをゼンブはぶいたのはロックだゼ! オレのパンクスピリットにもウッタエるモノがあったな!
ワカッてくれたようでうれしいのう。そんなパンクキッズのキミのために、次のサンプルプログラムはサウンドをフィーチャーしてみたぞい。
やってやろうじゃねェかコノヤロー! さっさと見せやがれェ!
(なんだろうこのテンカイ……)
- FOR (変数)=(最初の数) TO (終わる数)
- NEXT
最初の数から始めて、変数を1ずつふやしながら、終わる数までFOR~NEXTまでをくり返します。
A[(数字)]という形の変数が配列変数です。たとえばA[1]とA[2]はまったく別のものとして、違う数が中に入ります。
- DIM (変数)[(数)]
配列変数に使う数を決める「配列宣言」をします。たとえばDIM A[10]ならA[0]~A[9]まで10個の配列変数が用意されます。
- DATA (データ),(データ),……
変数に入れるデータ(数字など)を「,」でくぎって連続で書くことができます。
- READ (変数)
変数にDATA文で書いたデータを読みこみます。データはプログラムの中で先の方にあるものから順に呼びだされます。
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.420 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:09 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30