投稿
プチコン3号でBASICが少し分かってきた方を対象に軽い問題を出します。今回で2問目。 問題。次のプログラムを実行して 012ABCアイウ と出力したかったのですが、 012012012 と出ました。何故こうなったのか原因と対策を答えなさい。 FOR I=0 TO 2 RESTORE @TT READ T$ PRINT T$; NEXT @TT DATA "012","ABC","アイウ" 答えが分かった方は「ネタバレ」で答えを書いて頂きたいです。正解した方にはそうだねで返します(私が見て無い時でも誰か分かる方がそうだねを押して頂けると助かります)。
8そうだね
プレイ済み
返信[1]
親投稿
くろちく FoliageLamp
前回、添字が[]の中の数字、それをオーバーしていた。 [10]を増やすかTO 10を減らすというのまでは 何とかたどり着いてたのですが…X[I]=I*2の式が どういう意味なのかわからなかったです。 今回は、回答に参加です。 まずTO 2の部分が、表示回数を表してるように思いました 0にしたら、表示が1回になったので。 READは、一番最初のものを読むみたいだったので 以降の文字列が、呼びだされて無いのではと、考えて ABCとアイウに、文字変数を与えたら表示されました。
0そうだね
プレイ済み
返信[2]
親投稿
>LAMPさん 残念、違います。 前回のX[I]=I*2ってのはFORで加算するIに2をかけた数字をX[I]に格納する、という意味です。 例えばIが3の時は X[3]=3*2 で6を入れるという意味です。3×2=6という事です。 今回の問題のヒントですが、何故「同じ012というデータを何度も読み込んでるのか」を理解すれば答えは出ますよ。
0そうだね
プレイ済み
返信[3]
親投稿
けい kei0baisoku
>LAMPさん それでも意図通りに出ると思いますが、このプログラムは3回ループを回してREADする意図なので、ループ回数はそのままで、ほかのところを直すのが多分自然な修正だと思います。
2そうだね
プレイ済み
返信[4]
親投稿
くろちく FoliageLamp
こ、今度こそ!ぐるぐると調べてみました。 RESTOREは,READ文を再び先頭のデータから読む これじゃないでしょうか?RESTOREの行を消したら 問題なく表示されるようになった気がします。 掛け算は理解したのですが、何故添字をオーバーしたのかが… 今回もなんかつまづいている、FOR文の理解が低いようです。 今度、調べ直します、前回の説明ありがとうございました。
3そうだね
プレイ済み
返信[5]
親投稿
pinfu ANNAININ
ム、難しい・・・ ・・・・難しいと言うより、 使ったことのない奴ばかり・・・ しかし、コレをきっかけに勉強だ!! 答えは、READに対応する変数を作る。という理解でOKですか? DIM T$[3] を使い、 READとPRINTへ。
0そうだね
プレイ済み
返信[6]
親投稿
始めはREAD命令を使わない人が多いんで難しく感じるかもですね。がんばれ!
2そうだね
プレイ済み
返信[7]
親投稿
pinfu ANNAININ
DIM T$[3] FOR I=0 TO 2 RESTORE @TT READ T$[I] PRINT T$[I] NEXT @TT DATA ¨012¨,¨ABC¨,¨アイウ¨
0そうだね
プレイ済み
返信[8]
親投稿
ループの中で、毎回RESTOREで「先頭はココね」って指定?してるってことなんですかね? とりあえずFORの上の行にRESTOREを移したら上手くいったんですが、自信はないです…。
4そうだね
プレイ済み
返信[9]
親投稿
pinfu ANNAININ
何度も投稿すいません・・・ READ T$[0],T$[1],T$[2] PRINT T$[I]; これで!!
1そうだね
プレイ済み
返信[10]
親投稿
>LAMPさん、pinfuさん まぁギリギリ正解としましょう。そして >ししょーさん 大正解!その通りです!
0そうだね
プレイ済み
返信[11]
親投稿
pinfu ANNAININ
なに~!! なるほど、FORの上にRESTORE ・・・ 単純じゃないか・・・・・・ 私は、今まで何と戦っていたんだ・・・ ・・・・・・勉強になりました。
1そうだね
プレイ済み
返信[12]
親投稿
>pinfuさん プログラムの動きが読めない時は「自分だったらこれを上からどう読む」かを理解するといいですよ。 そして、今回の問題はそういう意味です。
0そうだね
プレイ済み
返信[13]
親投稿
pinfu ANNAININ
アドバイスありがとうございます! 処理の順を追って確認していく・・・ 心掛けます!
1そうだね
プレイ済み
返信[14]
親投稿
くろちく FoliageLamp
DATAに限らず、先頭がRESTOREなんでしょうか? ?のヘルプとかを見たりしながら考えたので DATAの読み込みにだけに、影響を与えるのかと思いこみ。 大正解見ても、予想外だったので、はたして惜しかったのか。 でも、前回も、今回も、よく考えたので勉強になりました。
0そうだね
プレイ済み
返信[15]
親投稿
>LAMPさん RESTOREはDATAに影響を与える命令です。 「ここから読みたい」のがRESTORE、データの前に付けた@は「ここからですよ」という旗印みたいなものです。付けなかったらデータの先頭又はさっきまで読みこんでいた場所の次からという事です。 小さいプログラムでしたらそこまで気にする必要は無いのですが、大きなプログラムになるほど重要になっていく命令です。
1そうだね
プレイ済み
返信[16]
親投稿
正解なんですね。良かったです。 今回はヘルプとにらめっこして何とか気付けたのですが、やっぱり初心者向けに、もう少し分かりやすく書いてほしかったなぁと思っちゃいます。
0そうだね
プレイ済み
返信[17]
親投稿
>ししょーさん 分からない時はそのままプログラムを打ってみてから考えるのも一つの方法です。 まぁお題自体がちょいレベル上げてましたので次回以降はもう少し違う命令を使った問題にしようかと思ってます。
0そうだね
プレイ済み
返信[18]
親投稿
くろちく FoliageLamp
う、説明を聞いても軽い混乱を覚える、そんな理解力の無さが。 FORの上に行ったら、ループが正しくなったのは 何故なのかがわからない、という状態です。 @TTを最初から繰り返すから、@TTからに変化した?のかな。 たぶん、私の回答ではただDATAを上から順番に読む。 問題集に機会があれば、どういう状態から正解になるのか もしも、記することがあれば、いつか拝読したいです。 まだまだ、説明にさえ追いつけてない。 すでに、回答する人のお邪魔になってそうなので、この辺で。 何度も、ヒントや説明ありがとうございました!
2そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
0そうだね
プレイ済み
返信[20]
親投稿
けい kei0baisoku
分かりづらい命令や複雑なロジックは、頭や紙に図や絵を描いたりすると分かりやすくなります……… ということが言いたかったのですがっ!画力が足りないっ!/(^O^)\グハッ ちなみにこれは、RESTORE命令が存在している目的を図にしたものです。
2そうだね
プレイ済み
返信[21]
親投稿
スー thanks_0u0
なぜRESTOREをFORの外に出すと正解になるか、はFORの中身を順番に見るとわかると思いますよ! まず、RESTOREがFORの中にある場合、日本語訳はこうなります。 DATAは@TTから読んでね→次のDATAを読んでT$に入れてね→T$を表示してね→DATAは@TTから読んでね→次のDATAを読んでT$に入れてね→T$を表示してね→DATAは@TTから読んでね→次のDATAを読んでT$に入れてね→T$を表示してね RESTOREをFORの外に出すとこうなります。 (DATAは@TTから読んでね)→次のDATAを読んでT$に入れてね→T$を表示してね→次のDATAを読んでT$に入れてね→T$を表示してね→次のDATAを読んでT$に入れてね→T$を表示してね FORの中にRESTOREがある場合、読み込む位置が毎回@TTに戻されているのがわかりますでしょうか。
1そうだね
プレイ済み
返信[22]
親投稿
KU kerorinU
ループ内にRESTOREがあるので、@TTの最初にあるDATAだけしか読み込めない、、、説明難しいな
0そうだね
プレイ済み
返信[23]
親投稿
この問題だとRESTOREを無くすだけでも正解になるしプログラム(制作者)の意図が読めないと余計に正しい正解の意味がわからなく感じるのかも…? なので下のDATAのところが @BB DATA "003","FFE","トバス" @TT DATA "012","ABC","アイウ" みたいになっていればRESTOREの必要性がわかるし消しても正解にならないから理解出来るのかな?
1そうだね
プレイ済み
返信[24]
親投稿
皆様解説ありがとうございます。ここでそろそろ答え合わせと私なりの解説を。 まずDATAをプログラムで読む時は必ず「一番上から順に」「次に別のデータを読む時はさっきまで読んでたデータの次」という法則があります。 一見それでもいい様に見えますが、「ここを読んで欲しいのに読みに行ってくれない」という問題が出てしまいます。 そこで出るのがRESTORE。RESTOREでラベルを指定すると「次はここから読んでね」というラベル(即ち旗印)を目指してデータの読み込む位置を変える事が出来ます。 タイトル画面用ロゴなど毎回同じデータを読みに行きたい時やフォントデータやスプライトデータ等初期設定時にあれこれとデータを読みに行きたい時に間違ったデータを読ませないようにコントロールする時などに使います(続く
0そうだね
プレイ済み
返信[25]
親投稿
続き)で、今回のプログラムですが、「FORの後にRESTOREが来ています」。 1番目のデータ"012"を読んで表示した後にNEXTでループするのですが、そこでまた"RESTORE @TT"がありますので「また1番目のデータ"012"を読みに行ってほしい」という指示が出てしまっています。 2番目、3番目のデータを読みに行かせるにはどうすればよいか。 答えは「FORの前にRESTOREを入れる」という事です。そうする事により次のデータを読みに行かせることが出来ます。 今回はちょっと難しかったのか全員満点とまでは行きませんでしたが何となく仕組みを理解して頂けたようで嬉しいです。 また次回問題が思いつけば出しますので。
2そうだね
プレイ済み