人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

プログラムの概念をつかむための例について質問します(ある本に紹介されていたいたものです)。

添付した図の「スタート」から「ゴール」に行くまでのプラミングとして、

「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「前に進む」「前に進む」というふうに紹介されています。

で、上記の「ここまで」というのが、なぜ必要なのか、理解できないんです。「ここまで」はなくても、

「前に進む」「もしも(進めなかったら)」「右に回る」「前に進む」「前に進む」で良いと思うのですが。

よろしくお願いいたします。

1449802230
●拡大する

●質問者: torimaki
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● outofjis
ベストアンサー

永久ループを防ぐためですね。
「ここまで?」と書いたほうがわかりやすいかもしれません。
手詰まりを判定しているんだと思います。

例図のみに対応したプログラムであれば必要ないですけど。

ランダムで生成するmapなどで、仮にスタートの四方が壁だった場合、
永久に条件判断が発生してしまうためです。


基本設計上起こりえないことでも、
条件として存在しうる(この場合はどこにも進めない)処理は
書くべき、というのが条件分岐の基本です。

あとからプログラムを書き換えて条件が増えたときなんかに
バグの元ですからね。


torimakiさんのコメント
「永遠ループ」を防ぐため。理解できたような気がします。 「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「前に進む」「前に進む」でしたら、このようになりますが、 [f:id:torimaki:20151212105758j:image] 「ここまで」がないばあい、 「前に進む」「もしも(進めなかったら)」「右に回る」「前に進む」「前に進む」でしたら、このような「永遠ループ」になってしまう。こんなイメージでしょうか。 [f:id:torimaki:20151212105812j:image]

outofjisさんのコメント
どうも。 でも補足で出された図を見る限り、私の回答は考えすぎの回答ですね。 必要な処理であることは確かですが。 ほかの方が書いている通り、条件分岐を表していますね。 ただ、単純な分岐ではなく 処理ループ(この言葉を書くと、今度は永久ループと混同しそうですが)の 始まり(もしも)と終わり(ここまで) を指していることは明らかです。 「ここまでを繰り返す」 と書いてあれば親切だったのだと思います。 ここでは、前に進めない限り、 「右に回る」 を繰り返しています。 「進めない」、という条件を満たす限り、 もしも?ここまで の間に書かれた「右に回る」という行動を行うということです。 逆に、前に進めるときは、 もしも?ここまで の間の「右に回る」という行動は行わずに(無視して)次に進みます。 そのために、色分けと字下げが行われているのですね。

torimakiさんのコメント
わかりやすい説明、ありがとうございます。助かります!

2 ● TransFreeBSD

「ここまで」というのをどういう意味と理解されていますか?

単体で「ここまで」と言われても意味が分かりません。
ただ、「プログラムの概念をつかむための例」と図から、たぶん「もしも」に対応する言葉なのでしょう。
もう少しマシに書くとしたら、

「前に進む」「もしも(進めなかったら「ここまで」まで行う)」「右に回る」「ここまで」

となるんじゃないかと思いました。もしくは

「前に進む」「もしも進めなかったら以下を行う」「右に回る」「以上」


元の書き方でいえば、「ここまで」がなければ「前に進む。もしも進めなかったら右に回って二歩進む。」という解釈も出来るわけなので。
まあ、それで良いじゃないかともいえるけど、そういうの言い出すと、「前に1歩右に2歩進む」で良いとか、「ゴールに進む」で良いとかになっちゃうし。

ただ、元のも、だから何を言いたいんだって感じはするんで、あんまり良い例じゃない気がするけど。
どういう意図なのかいまいちわからない感じ。


torimakiさんのコメント
本文を読んでみますと、「処理」(前に進む、右に回る)と、「制御構造」(もしも)を、超初心者にもイメージできるよう、著者は事例を出されているようです。 「自然言語」という言葉は、本屋さんを ぶらついたり、ネット上で、目に触れることがあり、好奇心だけはあるのですが。。。ま、でも、おっしゃっていることは、なーんとなくイメージできます。 初心者だからなのか、個人的な資質なのか分かりませんが、どうも、この一冊に固執していたようです。アドバイス、ありがとうございます。ハッと思い、本書を相対化することができました。分からないところは飛ばし、他の書籍も参考にしてゆきたいと思います。

TransFreeBSDさんのコメント
ブログのは概ねそう言うことです。 ただ、「もしも、すすめなかったら、という指示はここまで」は「もしも、すすめなかったら」という部分と対になる所なので「分岐」の要素の一部とみなします。 まあ、おそらく概念としては理解しているけど、静止した図としての表現だけの問題だから些末な事とおもいますけど。 >> 左曲がりは?→条件付きのをもう一つ追加 << これは補足にある「右と左に行く2つの迷路」で追加されている >| 「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」 |< の事です。その前の「右に回る」が一つの条件付き(分岐)のものに加えてもう一つ、上行「右に回る」が二つの条件付き(分岐)のものを加えることで、直進、右曲がり、左曲がりの3パターンの迷路に対応出来ました。 補足の部分に対応したのは上記までです。 >> で、この後、曲がり角が2ヶ所なら?→同じように追加→長くなったら?→同じように追加→似たような事の繰り返しだね→反復登場 とか? で、これで長い迷路も解ける→さらにちょっと追加でこんな単純な手順で普通の迷路が解ける左手法になる とか? << の部分は私のまったくの想像です。 以下その想像の詳細 (「S」がスタート「G」がゴール、「#」が通路) >> で、この後、曲がり角が2ヶ所なら? << >|| G G ## ## S S ||< の場合 >> 同じように追加 << >| 「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」 |< >> 長くなったら? << >|| #G G# ## ## S S ||< >> 同じように追加 << >| 「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」 |< >> 似たような事の繰り返しだね << 「似たような事」とは >| 「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」 |< の部分。 一本道ならいくら長くなってもこの部分を繰り返すことで対応可能になるわけです。 多分、この「もしも〜」という話の後で「繰り返し行う」という話が出てくると思います。 教科書的にはこの3つを「順次」「分岐」「反復」といってプログラムの基本にして全てと言え、この3つだけであらゆるプログラムが表現できるとされます。 実際には使いやすいように色々な命令がありますし、呼び方も 順次はあまりに当たり前で意識されないか英語でSequence、 分岐は条件付きとか条件分岐、if、selection、 反復は繰り返し、loop、while、for、iteration など、やっぱり教科書とは違うわけですが、基本中の基本として覚えておく概念だし、 これを使いこなせる事が第1段階です。 ちなみに迷路の解き方に「右手法」または「左手法」というのがあって、右側または左側どちらかの壁にそっていけば(若干の条件はありますが)ゴールにたどり着けるというのがあります。 この左側の壁にそっていく左手法は >| 「右に回る」「右に回る」「右に回る」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」 |< の繰り返しです。じつは。

torimakiさんのコメント
たびたび、お手数をおかけしています。ご回答の内容、おそらく、理解できたと思います。「順次」「分岐」「反復」という言葉に関しては、英語の方が感じがつかめる気がするから、不思議であります、はい。

3 ● cubick

「もし○○なら××する」という処理をプログラムでは「条件処理」といい、
言語によって多少の違いはありますが、条件に一致した時だけに行う処理が
どこから「どこまで」なのかを必ず書く必要があります。


・begin ? end
・{ ? }

この終わりの部分をあえて日本語で説明すると「ここまで」になるんだと思います。


無頼庵さんのコメント
同感です。 「質問者から」の内容を読むと次のことだと思いました。 IF 進める then 前へ進む else 右へ進む endif 条件文"if"の区切りとして”endif"を使用するプログラム言語がありますが、これが”ここまで”にそうとします。 それにしても、”ここまで”を”もしも(進めなかったら)”と同じレベルであつかっているのは、プログラムの概念としての説明にはなっていないと思います。 ”ここまで”は、”もしも(進めなかったら)”の一部でしかないのです。 上に上げた例文は、レベルを明示するための構造的な記法ですが、それをそのまま概念として説明してしまったのですね。 不適切な教科書だと思います。 理解できないのは当然ですし、理解できないことがわかったことが素晴らしい。 分からないことが分かるのは、分かるようになる肝心な一歩です。

torimakiさんのコメント
いぜん、WordPressをPHPで云々という分厚い書籍を購入し、あえなく「撃沈」した思い出があります。 その書籍に「条件処理」「If 」「then」「else」「endif」の解説があり、その概念がさっぱり、つかめませんでした。 ご指摘いただき、理解が(亀の歩みのように)進んだ気がします。ありがとうございます!

質問者から

みなさま、ご回答、ありがとうございます。

まずは、こちらの事情から失礼します。ご容赦ください。

当方、WordPressを利用して、ウェッブサイトを立ち上げていまして。たまにPHP云々が必要な場合は、ネットから関係ありそうなコードをコピー&ペーストして、その場をしのいでいました。

やみくもにやっているわけですから、うまくいかないことも多々あり、なによりも理解せずにやっているせいで、うっ屈した感じがありました。

ならば、時間をみつけて、最初からやってみよう。というわけで、とり急ぎ「よくわかるPHPの教科書」という本をめくっています。

本書の冒頭には、一章を割いて、プログラミングの概念について説明されています。

そこに、先の、アップした質問に記しました「ここまで」が、イキナリ出てくるんですね。

で、「ここまで」の意味を理解したいのですが、どうも分からない。どこが分からないかも、分からない感じです。

なので、本書の筆者に失礼して、同書に書かれている事例を、さらにあげてみますね(げんざいの自分の能力では、このくらいしか思いつきませんです、はい)。

◎事例

以下のような、右と左に行く2つの迷路がある。どうしたら、どちらの迷路もゴールできるようになるか(前に進むこと、右に進むことしかできません)。

f:id:torimaki:20151211155051p:image

本書、答えは以下のとおり。

f:id:torimaki:20151211155052p:image

*図が小さくて見にくいかもしれません。テキストでも記しておきます。
「前に進む」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」「前に進む」


4 ● たけじん

if文がここまで、と言っているのですね。
処理が一行では済まなかったので、ここまでが処理範囲と示しているわけです。


torimakiさんのコメント
ご回答、ありがとうございます。「処理が一行で済まなかったので」という一文が気になりますが、そんなことをお聞きすると、あ、また、俺、どツボにはまりそうだわ。

1-5件表示/7件
4.前の5件|次5件6.
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ