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


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

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

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

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2015/12/11 11:50:30
  • 終了:2015/12/13 10:35:34

ベストアンサー

id:outofjis No.1

outofjis回答回数10ベストアンサー獲得回数52015/12/11 12:29:52

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

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

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


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

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

他1件のコメントを見る
id:outofjis

どうも。

でも補足で出された図を見る限り、私の回答は考えすぎの回答ですね。
必要な処理であることは確かですが。


ほかの方が書いている通り、条件分岐を表していますね。

ただ、単純な分岐ではなく
処理ループ(この言葉を書くと、今度は永久ループと混同しそうですが)の
始まり(もしも)と終わり(ここまで)
を指していることは明らかです。
「ここまでを繰り返す」
と書いてあれば親切だったのだと思います。


ここでは、前に進めない限り、
「右に回る」
を繰り返しています。

「進めない」、という条件を満たす限り、
もしも~ここまで
の間に書かれた「右に回る」という行動を行うということです。

逆に、前に進めるときは、
もしも~ここまで
の間の「右に回る」という行動は行わずに(無視して)次に進みます。


そのために、色分けと字下げが行われているのですね。

2015/12/12 20:38:52
id:torimaki

わかりやすい説明、ありがとうございます。助かります!

2015/12/13 08:41:15

その他の回答(5件)

id:outofjis No.1

outofjis回答回数10ベストアンサー獲得回数52015/12/11 12:29:52ここでベストアンサー

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

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

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


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

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

他1件のコメントを見る
id:outofjis

どうも。

でも補足で出された図を見る限り、私の回答は考えすぎの回答ですね。
必要な処理であることは確かですが。


ほかの方が書いている通り、条件分岐を表していますね。

ただ、単純な分岐ではなく
処理ループ(この言葉を書くと、今度は永久ループと混同しそうですが)の
始まり(もしも)と終わり(ここまで)
を指していることは明らかです。
「ここまでを繰り返す」
と書いてあれば親切だったのだと思います。


ここでは、前に進めない限り、
「右に回る」
を繰り返しています。

「進めない」、という条件を満たす限り、
もしも~ここまで
の間に書かれた「右に回る」という行動を行うということです。

逆に、前に進めるときは、
もしも~ここまで
の間の「右に回る」という行動は行わずに(無視して)次に進みます。


そのために、色分けと字下げが行われているのですね。

2015/12/12 20:38:52
id:torimaki

わかりやすい説明、ありがとうございます。助かります!

2015/12/13 08:41:15
id:TransFreeBSD No.2

TransFreeBSD回答回数657ベストアンサー獲得回数2632015/12/11 12:59:48

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

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

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

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

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


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

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

他1件のコメントを見る
id: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段階です。

ちなみに迷路の解き方に「右手法」または「左手法」というのがあって、右側または左側どちらかの壁にそっていけば(若干の条件はありますが)ゴールにたどり着けるというのがあります。
この左側の壁にそっていく左手法は
「右に回る」「右に回る」「右に回る」「もしも(進めなかったら)」「右に回る」「ここまで」「もしも(進めなかったら)」「右に回る」「右に回る」「ここまで」「前に進む」

の繰り返しです。じつは。

2015/12/16 20:16:39
id:torimaki

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

2015/12/17 10:37:44
id:cubick No.3

cubick回答回数122ベストアンサー獲得回数352015/12/11 14:53:49

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


・begin ~ end
・{ ~ }

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

id:wild_yamato

同感です。
「質問者から」の内容を読むと次のことだと思いました。

IF 進める
then 前へ進む
else 右へ進む
endif

条件文"if"の区切りとして”endif"を使用するプログラム言語がありますが、これが”ここまで”にそうとします。

それにしても、”ここまで”を”もしも(進めなかったら)”と同じレベルであつかっているのは、プログラムの概念としての説明にはなっていないと思います。
”ここまで”は、”もしも(進めなかったら)”の一部でしかないのです。
上に上げた例文は、レベルを明示するための構造的な記法ですが、それをそのまま概念として説明してしまったのですね。

不適切な教科書だと思います。
理解できないのは当然ですし、理解できないことがわかったことが素晴らしい。
分からないことが分かるのは、分かるようになる肝心な一歩です。

2015/12/12 09:50:25
id:torimaki

いぜん、WordPressをPHPで云々という分厚い書籍を購入し、あえなく「撃沈」した思い出があります。

その書籍に「条件処理」「If 」「then」「else」「endif」の解説があり、その概念がさっぱり、つかめませんでした。

ご指摘いただき、理解が(亀の歩みのように)進んだ気がします。ありがとうございます!

2015/12/12 11:57:29
id:torimaki

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

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

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

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

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

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

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

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

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

◎事例

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

f:id:torimaki:20151211155051p:image

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

f:id:torimaki:20151211155052p:image

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

id:takejin No.4

たけじん回答回数1464ベストアンサー獲得回数1892015/12/11 20:18:37

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

id:torimaki

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

2015/12/12 11:57:34
id:NAPORIN No.5

なぽりん回答回数4608ベストアンサー獲得回数8452015/12/12 16:27:43

「………………………………」
↑if文のはじまりですよ  ↑ifはここまでですよ
 
if文は「という始まりカッコのようなもんです。
「という始まりカッコだけあって終わりカッコがない会話文を読むと人間でも混乱します。
 
「きのうまちこにあったとき「かぜひいたっていってたからくすりかってきていってあげた「まじかりょうこは「ずるやすみしてっていってた
 
こんな文章にならないため両方のカッコをそろえます。
例示の文章の答え図では赤い四角のセットが二つずつあって、カッコに入れている感じを出しています。
 
あまり高度ではないプログラミングなので「右フック型迷路か左フック型迷路だけしか与えられない場合を考えている」わけです。本来迷路を万能にとけるプログラミングなら「前へ進めることを検出してif文を停止する」と「連続4方向とも進めないことと確認してif文を停止する」も両方の機能をもたなくてはいけません。さらに例示の永久ループを防ぐには「左から先に試す」もやらないとどの迷路も解けるようにはなりません。。
とりあえず、そういうブサイクな例から始まったんだとおもって読み進めたらより高度な説明が出るとおもいます。

id:torimaki

ご回答、ありがとう。

2015/12/12 20:24:47
id:Tortuous_Capacitor No.6

Tortuous Capacitor回答回数4ベストアンサー獲得回数12015/12/12 16:29:21

 この本でいう「ここまで」というのは、「右方向への回転(方向転換)を停止する」ということを意味しているようです。

id:torimaki

ご回答、ありがとさん。

2015/12/12 20:25:10
  • id:TransFreeBSD
    やっぱり「もしも○○だったら××する」の「××」がどこまでかを表す「ここまで」のようです。

    プログラミング言語は自然言語ではないので不自然になります。
    その不自然な文を日本語にしたところで自然にはなりません。
    それでもこの事例はひどい方な気がします。

    まあ、これ一つで本全体の事は言えませんし、わかりやすさも人によるので何とも言えませんが、
    あまりこだわらず、分からなければ先に進んで、それで分かればよし、分からなければ戻ってみたり、別の本をググってみたり立ち読みしてみたり、で、自分に合うのを探す感じで、大変だと思いますが気楽に地道に頑張ってください。
  • id:takejin
    プログラミング作法 より前の段階かな?
  • id:cubick
    蛇足ですが「右に回る」も正確には「*90度*右に回る」と説明されていないと、不親切じゃないかなぁという気がします。
  • id:TransFreeBSD
    すみません。質問は終了されているのですが、誤解があると良くないかなと思いコメントしておきます。
    >ただ、単純な分岐ではなく
    これが、実は単純な分岐を表しています。
    そうでなければ、補足にある、この後の2回連続の右回りの意味がなくなります。
    というか、1度右にまわり、前に進めない場合にもう一度右に回ると、後ろを向いて元に戻る方に(進めるので)進んでしまいます。

    話的には、おそらく最初はまっすぐの迷路(というか通路?)があって、前に進む3回でゴールできる(順次)
    右曲り迷路は?→「右に回る」を追加すればいい
    まっすぐと右曲りの両方に対応するには?→条件付きにすればいい
    左曲がりは?→条件付きのをもう一つ追加
    といった感じと想像しました。
    で、この後、曲がり角が2ヶ所なら?→同じように追加→長くなったら?→同じように追加→似たような事の繰り返しだね→反復登場
    とか?
    で、これで長い迷路も解ける→さらにちょっと追加でこんな単純な手順で普通の迷路が解ける左手法になる
    とか?
    そんな展開もありえるんじゃないでしょうか。

    あと、「自然言語」は日本語とか英語とか人の話す言語です。
    プログラミング言語はいわばコンピュータと話すための言語で、人からすればどうしても不自然なものとなります。それを単語だけ自然言語に置き換えても不自然さはなくならないと思います。
  • id:torimaki
    TransFreeBSDさま、コメントありがとうございます。

    コメントを読み込み、理解したいと存じます。しばし、お待ちを。



  • id:torimaki

    TransFreeBSDさま

    お書きになっている前段の部分、「補足」の図の分岐については、おそらく理解していると思います。

    さて後段ですが。

    皆さまとの「人力検索」のやりとりの後、もういちど、あらたな目で本書を読んでみました。

    おっしゃる通り、本質問に添付した(Lを右90度に倒した)通路は、まっすぐな通路とカップリングなっていました。

    で、自分なりに解釈するため、それぞれの動きを分解した図を作成してみました。順次と条件分岐という言葉も使ってみました(まちがっていたら、どうぞ、ご指摘ください)。

    なお、その図は、コメントに図を貼ると小さくなる故、はてブに貼っています。ご容赦くださいませ。
    http://torimaki.hatenablog.com/entries/2015/12/15

    で、この図は自分なりに理解しやすいのですが、TransFreeBSDさんのおっしゃるところの、

    「左曲がりは?→条件付きのをもう一つ追加
    といった感じと想像しました。
    で、この後、曲がり角が2ヶ所なら?→同じように追加→長くなったら?→同じように追加→似たような事の繰り返しだね→反復登場
    とか?
    で、これで長い迷路も解ける→さらにちょっと追加でこんな単純な手順で普通の迷路が解ける左手法になる
    とか?」

    という部分が、どうにも分からないのであります(はなしの流れから、上記の作成した図のことを指していると推測しているのですが、もしかすると、補足の図について、おっしゃっているのかな、とも思ったりして)。
  • id:TransFreeBSD
    長くなったので上のコメントの部分に書きました。
    http://q.hatena.ne.jp/1449802230#ac117266
    まあ、既に質問/回答からずれていますけど(^^;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません