投稿
けい kei0baisoku
【WHILEやFORの命令が分からない人、覚えた人向け】 REPEAT、WHILE、FORの命令を分かりやすく理解するため、「GOTOで地道に書いたらこうなる」という例をもとにまとめてみました。(でんぺんさん提案です) …が、書いてみて自分でも分かりやすいのかどうかが分からなくなってきました………(-ω-;) どうでしょうか。 ↓コメントへ
15そうだね
プレイ済み
返信[1]
親投稿
けい kei0baisoku
まずはとてもよくある、「Aボタンが押されるまで待つ」という処理です。 REPEATに置き換えられます。
2そうだね
プレイ済み
返信[2]
親投稿
けい kei0baisoku
次に「画面内の間、少しずつ右へ移動」という処理です。 見て気がついたかもしれませんが、REPEATとWHILEはよく似てます。
1そうだね
プレイ済み
返信[3]
親投稿
けい kei0baisoku
最後、10回何かを処理させるプログラムです。 配列や連番のデータを扱うときに大活躍です。 むしろ配列や連番のデータを使うのに、こういったループ処理をさせないなら、ほとんど利点がありません(´ω`)
1そうだね
プレイ済み
返信[4]
親投稿
れい rei-nntnd
IFとGOTOがあれば全部できるのになんでこんなに命令があるのかねぇ… おぼえるの大変なのに。
0そうだね
プレイ済み
返信[5]
親投稿
たぶん、例のように、ルールを決めて使い方を限定すれば、分かりやすいですが、GOTOはすごく便利なので、つい他の使い方をしたくなって、プログラムが分かりにくくなりがちだからだと思います。 あと、個人的な理由としては、BREAKやCONTINUEと併用すると、ほとんどGOTOを使う必要がなくなり、ラベル名を考えなくて済むようになります。(繰り返しは、3つしかないけど、ラベル名はいっぱいあって、考えるのが大変だから、めんどくさいです。)
0そうだね
プレイ済み
返信[6]
親投稿
・ラベル名を考える手間が省ける。 ・IF THENとか書かずにWENDで済む。 とか...なんか僕は気が楽だと思う。 覚えるのが面倒なら、 @LOOP 'これでループさせとけばいいじゃん。 GOTO @LOOP 人のプログラム見るときは、 自分の知らない指令があったら [?]押せばいいし、自分の使わない指令は、 別に覚えなくてもいいと思う。
1そうだね
プレイ済み
返信[7]
親投稿
[訂正]繰り返しはもう一つありました、数学の再帰的定義をほぼそのままプログラムにする「再帰呼び出し」というのがあります。3号ではDEFで関数定義をして使います。
0そうだね
プレイ済み
返信[8]
親投稿
ASA fusuian
IFとGOTOだけでどんなプログラムだって組めるんですが、IFとGOTOで組んだ大きなプログラムはなんというか、ヤワなんです。 プログラムがヤワってわかりにくい感覚だと思うから、IFとGOTOでいいじゃんと思ったらそれでドンドンプログラムを書きましょう。 自分で書いたプログラムなのに直しにくいなと感じたら、そのときDEFやWHILE、REPEATなんかのことを思い出せばいいのです。
3そうだね
プレイ済み
返信[9]
親投稿
昔はなかったわけだし、逆になんでこの命令があるのか(出来たのか)を考えてみるのもいいのかもしれませんね。 それにこの程度の制御構文の数なんて命令の数に比べたら微々たるものだし、それよりも新しい言語の概念の方が憶えることが多くて大変ですねー…。
1そうだね
プレイ済み
返信[10]
親投稿
Godot orz_127
れいさんの言う通り色々覚えることがありすぎな気が…。 ただでさえ昔と違ってスプライトの概念も追加されているのに…。 とりあえず、IF、GOTOだけでも組めますが自分的にはBASICなら、FOR、GOSUBも仲間に入れて欲しいですw まずは、この辺りから初めて ある程度プログラムの流れが作れるようになってから、WHILEやREPEATにステップアップの方がプログラムの理解という点ではし易い気がします。 逆にプチコン3待望wのDEFが追加されてとても便利に使わせてもらっていますが最早関数型言語です。 GOTO、GOSUB、@ラベルが無くても生きていけますw 別の言語の様になってしまいます…^^; あとオブジェクト指向がはいればVB? なので初めのうちはDEFも使わず、GOSUBを使ったプログラムで良いのかなとも。 ちょっと話がそれましたm(__)m
1そうだね
プレイ済み
返信[11]
親投稿
けい kei0baisoku
>れいさん 何故、無くても済む命令がわざわざ用意されているのか。当たり前なようでなかなか深い質問ですね(`・ω・´) 分かりやすい答えは他の方に任せるとして、あえて全然違うもので例えるならば、人間が車に乗る理由と同じようなものかもしれないと唱えてみます。 歩けばどこにだって行けるのに、何故わざわざ高価で操作も難しくて進める道も色々制限がある車を使おうとするのか。
1そうだね
プレイ済み
返信[12]
親投稿
けい kei0baisoku
>コータさん 幸い、私はお目にかかった事がないですが、GOTOだらけで分かりづらいと言うのは、弊害として真っ先によく聞きますね。あえてGOTOだらけでぐちゃぐちゃに作ったプログラムを提示してみるのも、GOTOの短所やWHILEなどの構文の長所が分かりやすいのかなと、ふと思いました。 少し前にプチコンでプログラム覚えた人で、Aボタン待ちを全部IFとGOTOで組んでるのを見たことがあるのですが、ラベル名は@A1、@A2、@A3、@A4………が20くらいまで続いてました。 うん、やっぱそうなりますわな(^^;
0そうだね
プレイ済み
返信[13]
親投稿
>けいさん そうですね〜。 それになぜ今になっても新しい言語が生み出されているのかという事にも繋がりますね。出来る出来ないだけでいえばアセンブラで完結しちゃうかもしれないですしね。 まあでも今回の話しに出ている構文レベルはどの言語でも出てきますし憶えておいて損はないレベルだと思います。
1そうだね
プレイ済み
返信[14]
親投稿
けい kei0baisoku
>Newあっキーさん ワンセットになってるので気が楽と言うのは、意外と大きいですね(^O^) ASAさんが言ってるのにも繋がるかもしれませんが、ラベルを付けなくていいと言うのは、手間だけでなくバグの出る出ないや、直しやすさにもストレートに関わってきますね。
0そうだね
プレイ済み
返信[15]
親投稿
Godot orz_127
先日、昔のBASICのプログラムを移植しましたが ラベル名は面倒くさいので そのまま行番号の頭にに「@L」を付けたものとしましたw @L100 GOTO @L100
0そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
>ASAさん はじめは単純な方法を覚えて使って、もっと便利な方法が欲しくなったら広げてみるというのが、覚えるステップとしては素直で分かりやすいですね(´ω`) ヤワなプログラムになるのって、経験積むと当たり前の感覚になりますが、改めて何でかを説明しようとするとちょっと悩みますね。 強いて言うなら、ラベルもGOTOもグローバルに影響していて、数が増えれば増えるほど予期せぬ処理が混じり込むリスクが増えるから………みたいな感じかなと思います。
0そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
すべてのループ命令はIF文とGOTOで同等の動作するものを記述できます。 ただし、Aボタン入力待ちのWHILE~WENDループも条件式が同じ状態でIF文で記述するとこのようになります。 WHILE BUTTON(2)!=16 VSYNC WEND @WHILE IF BUTTON(2)!=16THEN ELSE @WEND VSYNC GOTO @WHILE @WEND 条件式が同じ状態だとTHEN ELSEみたいな分かりにくい状態になるためけいさんがやっているように条件式の真偽を入れ替える必要があります。 これが、IF文やGOTOは理解できてもWHILE~WENDやREPEAT~UNTILで躓いてしまう1つの要因だと私は思います。 この辺は私のサイトのプチコン3号入門講座で詳しく書く予定です。
0そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
命令というのは必要な状態になって初めて使う意味があるもので不要なのに無理に覚える必要はないです。 IFとGOTOばかりではラベルがたくさん増えて管理が大変とか、もっと簡潔に記述する方法はないだろうかという時になってようやくWHILE~WENDやREPEAT~UNTILの真価が発揮できます。 便利な命令の便利さを知るには不便な状態を知っておく必要があります。(不便さを感じないならば便利さも感じない)
3そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
>でんぺんさん そうそう、本題からは外れますが、プログラムの勉強を始めようという人に「なんでプラグラム言語っていくつもあるの?」って聞かれて意外と答えに窮しました。 まず思い付いた答えは「環境や用途によって必要なものや制限などに差があり、それぞれ別の目的のために生まれた」だったのですが、「ニーズによって完全に別々の言語が多数あるより、一つのルールに統一してそれが常に使える方が、メリットはずっと大きい」ともし言われたら、そっちの方がずっと説得力がある気がしまして(´ω`) 結局、用途が違うに加えて「理系の人間は個性を抑えて協調するより各々が主張する傾向があるから」という深そうな説も伝えました(^^;
1そうだね
プレイ済み
返信[20]
親投稿
エスペラントが、あまり普及しなかったのと似たようなことが、起きたのでは?
0そうだね
プレイ済み
返信[21]
親投稿
けい kei0baisoku
>Godotさん 今回は触れてませんが、DEFもGOSUBから入った方が断然分かりやすそうですよね。(だいたいの人は自然とそうなると思いますが) 私、BASICは今回がほぼ初めてだったのですが、「こんなにCに近かったっけ?」と結構驚きました。むしろ構造体が無いのに違和感を覚えるくらい………(^^; スプライトは私もはじめ苦労したのですが、初心者の人たちは割合さくっと入れてるのを見ると、先入観や時代の差なのかも知れないと少し感じました。
0そうだね
プレイ済み
返信[22]
親投稿
けい kei0baisoku
>おちゃめさん そうそう、そうなんです。今回GOTOに分解してはじめて意識しましたが、WHILEやREPEATで表記する条件式と、内部のジャンプする条件式って逆なんですよね。 学び方の順番として、分からなくていいから取りあえず正しい方法に体で慣れるみたいなのもありますが、こういったものだと「不便さを感じないなら便利さも感じない」ってまさにその通りだと思います。
0そうだね
プレイ済み
返信[23]
親投稿
けい kei0baisoku
>コータさん 習得しやすい世界共通の第二言語を目指して作られたあれですね。 私も名前は聞いたことがありましたが、プログラムはそもそも「統一しよう」という本格的な動き自体を聞いたことないな?と思った次第です。 ………と思って今軽く検索してみたら、アメリカで今そういうプロジェクトがあるのを1つ見つけました。 1つに統一するのがいいか色々あるのがいいかと言われると私は少し迷いますが、面白い試みですね(´ω`)
0そうだね
プレイ済み
返信[24]
親投稿
pinfu ANNAININ
WHILEは使うようになったけど、BREAKって使った事ないなぁ・・・ 『BREAK』の響きが嫌で(何かが壊されそうだからw)ループ条件は単純にA==0みたいにしている・・・ そして、CONTINUEを確認してみたら、FOR~NEXTでめっさ使えそう! 新しい事を覚えるタイミングって難しい・・・
0そうだね
プレイ済み
返信[25]
親投稿
けい kei0baisoku
あっいいな そう思ったら 使いどき
0そうだね
プレイ済み
返信[26]
親投稿
けい kei0baisoku
ブレークは終了条件で代わりには出来ないので、今まで必要な状況が無かったのかなと思います。 無限ループにして、いくつかのifでブレークするのをよくやります。
0そうだね
プレイ済み
返信[27]
親投稿
理想はすばらしいのですが、現実には、人は自分が使いやすいと思ったものを使うように行動するので、学校で基本科目として教えるとか、使う人にそれを使いたいと思わせる何かが無いと難しいと思います。それに、人の好みは様々ですから・・・
1そうだね
プレイ済み
返信[28]
親投稿
pinfu ANNAININ
むむ?? 終了条件で代わりには出来ないとはどーゆーことなのでしょうか?? WHILE A==0 IF ある条件 THEN A=1 WEND この場合、A=1でループは終わりますよね??私は、何か、重大な勘違いをしている予感が・・・
0そうだね
プレイ済み
返信[29]
親投稿
けいさんへ APLが多目的の先駈け(当時の)だったと思います。 pinfuさんへ その例なら、BREAKに置き換え可能と思います。
0そうだね
プレイ済み
返信[30]
親投稿
[訂正]APLではなく、PL/Iのまちがいです。失礼しました。
0そうだね
プレイ済み
返信[31]
親投稿
pinfu ANNAININ
コータさん、ありがとうございます! あれっ?? そーなのですか!? てっきり、初心者ならでは勘違いがあるのではないかと思ってしまいました(笑) ついでにもう1つ質問を・・・ 単純にループさせたい時は、A==0という条件を用意するよりかは、 WHILE TRUE IF ある条件 THEN BREAK WEND みたいな方が、普通の使い方(?)なのでしょうか?? HELPをみると、強制的にループを抜ける。との記述があったので、強制的→なんかイレギュラーな時に使う。って勝手なイメージを持っているのですが、特に気にする事はないのでしょうか?
0そうだね
プレイ済み
返信[32]
親投稿
ASA fusuian
BREAKって強い響きですが、ループを即座に脱出できる便利命令としてわりと良く使います。 ミニゲームだと原則無限ループで、ミス即終了という感じでWHILE 1ループからBREAKで抜けてエンドという流れがキレイだなと思います。
2そうだね
プレイ済み
返信[33]
親投稿
BREAKで抜けるのは普通だと思いますよ〜。 あとWHILEの条件で抜ける場合の欠点としてはフラグを立ててもそのWHILEの最後までは実行されてしまうので、その次点で完全に抜けたい場合には不便ですしね。 言語の共通化は理想ではあるけど実際問題では難しい面があったり、言語によってはそもそも概念が違くて相容れないものもあったりしますしね。 まあある意味英語(アルファベット)を使ってるだけマシなのかもしれません。(ぴゅう太除く、笑)
0そうだね
プレイ済み
返信[34]
親投稿
pinfu ANNAININ
ASAさん、ありがとうございます! ふーむ。なるほど・・・ これからは、出たい時にはBREAK便利って感じで使っていこうと思います! しかし、こういった上級者が多くコメントしている投稿には、強引にでも割り込んでいくものですなぁ(笑) 私の中では、投稿の質問より比較的気楽に思った事を質問出来る感じなんですよね・・・
0そうだね
プレイ済み
返信[35]
親投稿
pinfu ANNAININ
でんぺんさん、ありがとうございます! なるほど! 条件で抜ける場合とBREAKで抜ける場合の違い、分かりやすかったです!上手く使いこなせたら、どちらも便利そうですね♪
0そうだね
プレイ済み
返信[36]
親投稿
けい kei0baisoku
>コータさん PL/I、初めて聞く名前だったので調べてみました(^O^) Cより古い汎用言語ですか。こんなのがあったのですね。面白いです。 ちなみに、私がイメージしてた「プログラム言語の統一」というのはもっと強い仕組みで、例えば「世界プログラミング機構」みたいなのが言語仕様の統一を図った上で仕様変更なども管理し、世界の全てのソフトウェアが同じ言語で作られてる保証がある………みたいな感じです。 うん、具体的に書けば書くほど絶対にそんな方向には向かわない気がしました(^^; プログラムに馴染みの無い人からすると、国によって数字が10進数なのか12進数なのか50進数なのかがバラバラなのは不便だから、統一すりゃいいじゃん、みたいな風に見えてるようです。
0そうだね
プレイ済み
返信[37]
親投稿
けい kei0baisoku
>pinfuさん BREAKの件、投げっぱなしですいません(^^; コータさん、ASAさん、でんぺんさん、補足ありがとうございます。 せっかくなので、私からは実際のゲープログラムから使用例を紹介してみます。
1そうだね
プレイ済み
返信[38]
親投稿
けい kei0baisoku
某ネコのゲームから、タイトル画面のタイトル文字を書いている処理です。 選択部分がWHILEのブロックです。
0そうだね
プレイ済み
返信[39]
親投稿
けい kei0baisoku
やってることは、DATA文からREADしてPRINTして………の繰り返しです。 DATA文に工夫がしてあって、空文字列が来たら終わりになってます。その判定が484行目のBREAKです。 判定がループの始めでも終わりでもなく途中にあるため、BREAKで抜けるのが一番自然です。 処理の順番を頑張って入れ換えればWHILEの条件式で抜けられると思いますが、流れの自然さを考えてこのような方法にしています。
0そうだね
プレイ済み
返信[40]
親投稿
けい kei0baisoku
使用例その二。奇遇にも()こちらもネコのゲームからです。 選択しているFOR文で、空いているスプライトを探しています。
0そうだね
プレイ済み
返信[41]
親投稿
けい kei0baisoku
1107行目のif文が空いてるかどうかの判定ですが、フラグを使って色々やってるので細かいところは無視して下さい。 大事なのは、見つかったら変数WKにIを代入してBREAKしているところです。 目的は「空きを探すこと」なので、1つ見つかったらもうループを続ける必要が無いわけです。
0そうだね
プレイ済み
返信[42]
親投稿
pinfu ANNAININ
やはり、使われ方の実例+解説があるとどんなものなのかイメージし易いです! なるほど、ループを抜けたい時に抜けるって、こういった事なのか!とおもいました(笑) 解説、ありがとうございます!
1そうだね
プレイ済み