プチコン3号&BIGまとめWiki

プチコン3号&BIG 非公式初心者講座 : 第6章 くりかえし命令と配列変数

パンくずリスト

プログラマーからひとこと

この章では、FOR〜NEXT文について学びます。

FOR〜NEXT文は、それがあるだけでプログラムリストを読むのがぐっと難しくなるというおそろしい命令です。
プログラムした人は意味があって使っているしその意味もわかっているのですが、そのリストを読むほうはたまったものじゃありません。

それでも使うのはなぜかといえば、とてもベンリだからです。
これがあるだけでプログラムの手間はものすごく少なくなります。
あんがい悪くないですね。プラマイでいえばプラスじゃないでしょうか。

さらにこの章では、DIM命令、いわゆる配列変数についても学びます。
配列変数というものはパッと頭で理解するのがなかなかむずかしく、プログラムをおぼえはじめた人はみんなひっかかるポイントです。
正直わたしも何度か「こんなものなけりゃいいのに」と思いました。
「なんの役にたつんだ?」とも思いました。
「なくていいじゃん」とも思いました。
でも、そういうものが意外とけっこう役にたつということは、ここまでこの講座を読んできた人なら知っているはずです。
くやしいことにこれが本当に役にたつのです。

この章では、できるだけじっくりと配列変数のことをおぼえていきます。
あんまりじっくりすぎて途中でめんどくさくなるかもしれませんが、カベをのりこえるためだと思ってじっくり読んでみてください。

FOR〜NEXT命令

インテリくん

「くりかえし命令」と言ってどんな命令を想像するかな?

ワンパクくん

GOTOで作る無限ループなんか、「くりかえし」になるんじゃねえか?

  1. @MUGEN
  2. PRINT”くりかえし”
  3. GOTO @MUGEN
インテリくん

たしかに何度もくりかえしているね。じゃあ、無限ループじゃなく10回くり返したら途中でループをやめる、とするとどうすればいいかな?

ワンパクくん

ムリじゃねえの?

神崎

ず、ずいぶんアキラメが早いね。ええと、変数を使って、ループのたびに変数の中身を変えて、IF〜THEN文で変数によって別のラベルまで……

ワンパクくん

ウォオー! 話を聞いてるだけでめんどクセエうえに、言ってるイミもよくわかんねえぜ!

インテリくん

なかなか難しいよね。そこで役に立つのがFOR (フォー)〜NEXT (ネクスト)命令なんだ。
まずこのプログラムを見てごらん。

  1. FOR A=1 TO 10
  2. PRINT”くりかえし”
  3. NEXT
ワンパクくん

ほとんどゼンブ新しい命令じゃねえか! とりあえずRUNしてみるか。

screenshot_loop.jpg
神崎

ちゃんとくりかえしを10回書いたところで終わったね。

ワンパクくん

3行のプログラムにしちゃナカナカやるじゃねえか。どうやらクワシク話をきかなきゃならねェようだな!

インテリくん

英語で「FOR (フォー)」は「〜から」、「TO (トゥ)」は「〜まで」という意味になるね。
FOR A=1 TO 10は「A=1から10まで」と読んでもいいだろう。
そして「NEXT (ネクスト)」は「次にいく」というところかな。「次のくりかえしを始める」って考えればこれはわかるよね。

ワンパクくん

NEXTの方はだいたいワカッたぜ。しかしFORの方、「A=1から10まで」ってのはイミわからねェな。フツウ「から10まで」じゃねえのか?

神崎

あれ? たしかBASICでイコール記号を使うのは変数のときだけだから……?

インテリくん

よくおぼえていたね。そう、このは変数なんだ。

ワンパクくん

なんでココで変数が出てくんだ……?
話が見えてこねェぞ! ワカるようにセツメイしやがれ!

インテリくん

ジッサイにプログラムで見てもらうのが早いかな? ちょっと書きかえてみよう。

  1. FOR A=1 TO 10
  2. PRINT”くりかえし”;A
  3. NEXT
インテリくん

これをするとこうなるね。

screenshot_loop2.jpg
神崎

1から10まで、くりかえすたびに変数がふえている、のかな?

インテリくん

そう考えてマチガイじゃないね。これがFORTOのむずかしいトコロなんだけど、「A=1から始めて、変数10になるまで、変数を1ふやしながらくりかえす」というのがFOR A=1 TO 10の正しいイミなんだ。

ワンパクくん

ズイブンいろいろなコトがはぶいて書いてあんだな、FORTO文にはよォ! わかりづれェ!

インテリくん

そのまま書いても長い命令になって、打ちづらいだろうしね。これくらいがちょうどいいんじゃないかな。

ワンパクくん

おっと待てよ、オレのギモンがカイケツしてないままだったぜ! なんで変数がかならず出てくんだ? はじめの方で使ったこのプログラムだけは、変数いらねえじゃねえか!

  1. FOR A=1 TO 10
  2. PRINT”くりかえし”
  3. NEXT
インテリくん

それはもっともかもしれないね。FOR〜NEXT文では変数を使うことの方がずっと多いから……としか言えないかな。じっさい、変数を使わないループなら変数のことはムシすればいいんだし、別にモンダイはないだろう?

ワンパクくん

ウムム……タシカに。

神崎

うっかり別のところで変数を使ってると、FOR命令で変数のナカミが変わっちゃうから、それだけは気をつけないとね。

ワンパクくん

なんだかマルメこまれた気がしねェでもないが……

インテリくん

次はこのFOR〜NEXT文と相性のいい、DIM命令について説明するよ!

配列変数

インテリくん

まずサイショに、「配列変数 (はいれつへんすう)」について知っておこうか。

ワンパクくん

イヤなヨカンだな……。漢字が4コ以上つづいたコトバはムズカシいモンと決まってるぜ!

インテリくん

まあまあ。いままでにおぼえた変数とたいした違いはないんだよ。

神崎

ホントに?

インテリくん

使いかたがトクシュだからとまどうかもしれないけど、変数と同じように使うものだってコトさえ忘れなければ、けっこうカンタンなはずさ。 まず、いつもの変数を考えてみようか。

  1. APPLE=56
  2. PRINT”りんご”;APPLE;”こ”

おぼえてるかな? サンプルプログラム1でこんな使いかたをしたよね。

ワンパクくん

オボエてなくたって、リストを読めばイミはわかるぜ。えーと、"RUN"!

  1. りんご56こ
  2. OK

そうそう、変数APPLEのナカミ56PRINTするんだゼ!

神崎

(ワンパク君、わすれかけてたな……)

インテリくん

これを配列変数に変えてみよう。

  1. DIM APPLE[1]
  2. APPLE[0]=56
  3. PRINT”りんご”;APPLE[0];”こ”
神崎

1行目からさっそく新しい命令が2つ……

インテリくん

ああ、そこは今は気にしないでいいトコロだから、2行目から読むようにしてね。

ワンパクくん

ン? じゃあ変わったのは、変数のウシロに[0]がついただけってコトか? それとも変数のウシロに[0]がつくと、何か変数がチガってくんのか?

インテリくん

いいや、APPLE[0]のナカミは56でマチガイないよ。

  1. りんご56こ
  2. OK
ワンパクくん

じゃあナマエ以外ゼンブ同じじゃねェかよ!

インテリくん

変数と同じだって言ったじゃないか。こういうものなんだよ。

神崎

うーん……これはワンパク君じゃなくても、フツウの変数でいいじゃないかって思うな。

インテリくん

よし、その気持ちをわすれずに、配列変数の使い方その2にいってみよう!

  1. DIM APPLE[2]
  2. APPLE[0]=56
  3. APPLE[1]=32
  4. PRINT”りんご”;APPLE[0];”こ”
  5. PRINT”りんご”;APPLE[1];”こ”

やっぱり1行目はムシして読んでね!

ワンパクくん

テメー……まさか、ソレもこのフツウの変数と同じだって言うんじゃねェだろうな……

  1. APPLE0=56
  2. APPLE1=32
  3. PRINT”りんご”;APPLE0;”こ”
  4. PRINT”りんご”;APPLE1;”こ”
インテリくん

合ってるよワンパク君! ちゃんとわかってるじゃないか。

ワンパクくん

ウオォー! ガキあつかいもタイガイにしやがれー! 変数のナマエが違うだけじゃねえか!!

インテリくん

そうそう、名前くらいのちがいだって思えばいいんだよ。教えやすくてたすかるなあ。

ワンパクくん

チッ、ここまではテメーのオモワクどおりってワケか。だが、そろそろ配列変数だけができるワザを言わねえと、オレもダマっちゃいないぜ!

インテリくん

配列変数ならではって言うと……こういうのはどうかな?

  1. DIM APPLE[32]
  2. APPLE[1]=56
  3. APPLE[2]=32
  4. APPLE[3]=71
  5.    :
  1.    :
  2. APPLE[31]=45
  3. PRINT”1にちめ りんご”;APPLE[1];”こ”
  4. PRINT”2にちめ りんご”;APPLE[2];”こ”
  5. PRINT”3にちめ りんご”;APPLE[3];”こ”
  6.    :
  1.    :
  2. PRINT”31にちめ りんご”;APPLE[31];”こ”

あんまり長いから途中ははぶいたけど、31日分のリンゴを数えるプログラムなのはわかるよね。

神崎

つまり……カッコの中の数字があるからわかりやすいって感じ……?

ワンパクくん

フザケんじゃねエー! だからソレ、こう書いても同じじゃねえか!

  1. APPLE1=56
  2. APPLE2=32
  3. APPLE3=71
  4.    :
  1.    :
  2. APPLE31=45
  3. PRINT”1にちめ りんご”;APPLE1;”こ”
  4. PRINT”2にちめ りんご”;APPLE2;”こ”
  5. PRINT”3にちめ りんご”;APPLE3;”こ”
  6.    :
  1. PRINT”31にちめ りんご”;APPLE31;”こ”
  2.    :
インテリくん

そうだよワンパク君! よくここまでガマンしたね! ここまでは本当に変数といっしょなんだ。これから、配列変数だけの使い方に変えていくよ。

ワンパクくん

お、おう……? ガマンしたオボエはあんまりねェが、とにかくのぞむトコロだぜ!

  1. DIM APPLE[32]
  2. APPLE[1]=56
  3. APPLE[2]=32
  4. APPLE[3]=71
  5.    :
  1.    :
  2. APPLE[31]=45
  3. FOR DAY=1 TO 31
  4. PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
  5. NEXT
ワンパクくん

!!

インテリくん

わかってきたかな。34行目からはおぼえたばかりのFOR〜NEXTを使っているね。

神崎

変数DAYから順にふやしながら、31までくりかえすんだよね。

ワンパクくん

変数DAYのトキは、35行目のイミはPRINT 1;”にちめ りんご”;APPLE[1];”こ”ってコトになる……
だがFOR〜NEXTでくりかえしてDAYになったら、同じ35行目でもPRINT 2;”にちめ りんご”;APPLE[2];”こ”に……!
これが31まで自動でくりかえされるってワケか!

インテリくん

これは配列変数じゃないとできないだろう。こういう使い方もできるね。

  1. INPUT”なんにちめを しらべますか”;DAY
  2. PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
神崎

INPUTで数字を変数DAYに入れて、34行目で配列変数APPLE[DAY]PRINTするわけだね。
うーん、これを普通の変数でやろうとすると、変数名を入力させて……いやいや配列変数じゃないとダメか……

インテリくん

みんなもわかったみたいだね。つまり配列変数は「変数名に変数を使える」ベンリな変数なんだ。

ワンパクくん

ヘンスウメイをヘンスウにツカえるヘンスウ……

インテリくん

ごめんごめん、「変数」というコトバばっかりでわかりづらかったね。こういうふうに、口で説明するのがムズカシいのが配列変数なんだ。だから今回はできるだけジッセン的に説明したよ。

ワンパクくん

ヘッ、なかなかヤルじゃねえかクソッタレー!

神崎

それ、ほめてるの?

DIM命令

インテリくん

配列変数についてわかってきたところで、DIM命令もおぼえておこう。

神崎

配列変数を使うときはいつも1行目に書いてあったね。

  1. DIM APPLE[32]
インテリくん

DIM APPLE[32]というのは、これから配列変数をAPPLE[0]APPLE[31]まで用意する、という命令だよ。

神崎

いちいち前もって数を決めておかないといけないの?

インテリくん

そう。このことを「配列宣言」と言うんだけど、かならず配列宣言するのはちょっとめんどうではあるね。

ワンパクくん

メンドウなコトなんざやってられるか! イキナリ書けばいいじゃねえか!

  1. APPLE[31]=1
  1. Undefined valiable in 0:1
  2. OK
インテリくん

というエラーが出るんだよね。

ワンパクくん

ヤロー! こうすりゃいいんだろ! 負けたキブンだぜ!

  1. DIM APPLE[32]
  2. APPLE[31]=1
  1. OK
神崎

使うのはAPPLE[31]までなのに、DIM APPLE[32]と書かなきゃいけないのがフシギなんだけど……。

インテリくん

そのDIMだと、用意されるのはAPPLE[0]APPLE[31]だからね。数を数えてみるとわかるよ。

array_matrix.png
ワンパクくん

……タシカに、32コあるな。しかし言われねえとピンとこねえハナシだぜ!

インテリくん

LOCATE命令でもそうだったけど、ゼロから数えるから、頭で考える数より1つズレちゃうんだね。これは気をつけないといけないかな。

神崎

いっそありえないくらい大きく宣言したら?

インテリくん

ところがプチコンが用意できる変数の数は無限ではないんだ。数値の変数だけならだいたい100万個ぐらいまでなら大丈夫だけど、文字列の変数だと入れる文字列が長いほど使える量が減っていったりするし、あとになって足りなくなったら困るだろ?

ワンパクくん

チッ、なにかとメンドウだぜ!
しかしまあワリと今回はジュウジツしたな。デカいヤマを乗りこえたって感じだゼ!

インテリくん

あ、でもその前にもう1つ、おぼえておきたいコトが……

ワンパクくん

マジでか。

DATA命令・READ命令

インテリくん

配列変数の説明に使ったこのプログラムだけど……

  1. DIM APPLE[32]
  2. APPLE[1]=56
  3. APPLE[2]=32
  4. APPLE[3]=71
  5.      :
  1.      :
  2. APPLE[31]=45
  3. FOR DAY=1 TO 31
  4. PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
  5. NEXT

いま見直しても、2〜32行目がずいぶん長いって思うよね。

神崎

でもコロンで2行や3行をまとめても、まだけっこう長いしなあ。

インテリくん

こういうデータをまとめたいときに役にたつのがDATA (データ) とREAD (リード) のコンビなのさ。 まずはDATAの使い方を先に見てみよう!

  1. DATA 56,32,71,40,64,73,61,10,45,80
  2. DATA 25,71,63,54,98,23,14,66,58,47
  3. 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命令の使いかたはこうかな。

  1. READ APPLE

さっきのDATA文の後にこう書くと、最初のデータ56が変数APPLEに入るよ!

ワンパクくん

31コあるデータなのに、入る数字は最初の1つだけかよ。どういうこった!

インテリくん

いくつもデータを読み込むなら、READのあとに変数を並べて書くね。今回使うのは配列変数だから……

  1. READ APPLE[1],APPLE[2],APPLE[3]
  2. READ APPLE[4],APPLE[5],APPLE[6]
  3.      :

こんなふうに10行ほど続けると全部のデータが読み込めるよ。

ワンパクくん

ゼンゼン長ったらしいゼ、まだまだ使えたもんじゃねェな!

神崎

あれ、待ってよ。配列変数っていうことは……?

インテリくん

そう、気がついたようだね。今のREAD文を短くまとめると、こうなるんだ。

  1. FOR DAY=1 TO 31
  2. READ APPLE[DAY]
  3. NEXT
ワンパクくん

ココでもまたFOR〜NEXTか……。オボエたての命令だが、ずいぶんアチコチで使うんだな。

インテリくん

特に配列変数やREADにはベンリな命令だからね。31行あった文が6行におさまったのはFOR〜NEXT文のおかげだね。

神崎

いままでのプログラムリストを全部書いてみると、こうなるね。

  1. DIM APPLE[32]
  2. DATA 56,32,71,40,64,73,61,10,45,80
  3. DATA 25,71,63,54,98,23,14,66,58,47
  4. DATA 94,36,31,26,45,71,24,76,66,58,46
  5. FOR DAY=1 TO 31
  6. READ APPLE[DAY]
  7. NEXT
  8. FOR DAY=1 TO 31
  9. PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
  10. NEXT
ワンパクくん

ウオォ、いつのまにか10行まで短くなってたのか!

インテリくん

5〜10行目はかぶってるところがあるから、まとめちゃおう。

  1. DIM APPLE[32]
  2. FOR DAY=1 TO 31
  3. READ APPLE[DAY]
  4. PRINT DAY;”にちめ りんご”;APPLE[DAY];”こ”
  5. NEXT
  6. DATA 56,32,71,40,64,73,61,10,45,80
  7. DATA 25,71,63,54,98,23,14,66,58,47
  8. DATA 94,36,31,26,45,71,24,76,66,58,46

こんなふうにDATAはプログラムリストのどこに置いてもいいんだよ。READすると自動的にリストの中で最初にあるデータをさがして順番に読みこむからね。

ワンパクくん

オイオイ、8行におさまっちまったぞ!

インテリくん

やっていることは同じでも、はじめのころの63行あったプログラムとくらべると、かなりコンパクトになったろう。

ハカセ

あんまり短くしすぎると書いてる自分もこんがらがるので考えものじゃが、目で追えるていどならセイリしてまとめるのは良いことじゃな。こういうのもプログラムのひとつのダイゴミじゃ。

神崎

あ、ハカセ。いつから……?

ワンパクくん

ジジイの言うこともワカる気がするゼ。ケッキョク配列変数もFOR〜NEXTもナシで書いた方がワカりやすさじゃイチバンなんじゃねえか? とか思ったモンだが……

インテリくん

今までの話を全部だいなしにしそうな発言だね。

ワンパクくん

しかし、BASICの命令をクシして、めんどクセェことをゼンブはぶいたのはロックだゼ! オレのパンクスピリットにもウッタエるモノがあったな!

ハカセ

ワカッてくれたようでうれしいのう。そんなパンクキッズのキミのために、次のサンプルプログラムはサウンドをフィーチャーしてみたぞい。

ワンパクくん

やってやろうじゃねェかコノヤロー! さっさと見せやがれェ!

神崎

(なんだろうこのテンカイ……)

今回のまとめ

FOR〜NEXT命令

  1. FOR (変数)=(最初の数) TO (終わる数)
  2. NEXT

最初の数から始めて、変数を1ずつふやしながら、終わる数までFORNEXTまでをくり返します。

配列変数

A[(数字)という形の変数が配列変数です。たとえばA[1]A[2]はまったく別のものとして、違う数が中に入ります。

DIM命令

  1. DIM (変数)[(数)]

配列変数に使う数を決める「配列宣言」をします。たとえばDIM A[10]ならA[0]A[9]まで10個の配列変数が用意されます。

READ命令・DATA命令

  1. DATA (データ),(データ),……

変数に入れるデータ(数字など)を「」でくぎって連続で書くことができます。

  1. READ (変数)

変数にDATA文で書いたデータを読みこみます。データはプログラムの中で先の方にあるものから順に呼びだされます。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 7 人がこのサイトを見ています
  • このページはこれまでに 4873 回、本日は 4 回、昨日は 4 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.096 秒 | このページの最終更新 : 2016/07/12 (火) 16:19:00 (1138d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30