わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

制御構造~崩す・移す・意識する

その1

「前のクォーターの科目の予習課題で調査してもらった,C89の予約語の中で,繰り返しに使用するのはdoとforとwhileです.次に,分岐に使用するのはifとelseとswitchです.
 そのほか,制御構造と密接に関連する予約語として,break,continue,goto,returnがあります.
 ところで,構造化プログラミングの三要素といえば,日本語訳にはいくつかバリエーションはありますが,『順接』『分岐』『繰り返し』です.
 では順接を表すための予約語があるのか…というと,ありません.
 プログラムコードを順に書けば,よいのです.
 break,continue,goto,returnは,順接を実現するためのものではありません.順接を,意図的に崩すために使用します

その2

「break文とcontinue文を,学習しましょう.
 まず,break文は『break;』と書きます.switch文,for文,while文,do文のいずれかを実行している最中に,『break;』に出くわすと、各文の処理を終えることになります.
 次に,continue文は『continue;』と書きます.繰り返しのfor文,while文,do文の中で,『continue;』に遭遇したら、繰り返しをやり直すことになります.
 『やり直す』といっても,for文なんかで変数の値の初期化まで,やり直すわけではありません.
 『break文は各文の処理を終える』『contnue文は繰り返しをやり直す』と言っても,分かりにくいです.そこで次のように考えるといいでしょう.
 『break;』の後ろを見ていって,『}』を見つけます.switch文,for文,while文,do文のいずれかの処理に関する『}』であれば,この『}』の直後に,制御が移ります.『}』のすぐあとだから,switchの分岐処理にせよ,繰り返し処理にせよ,おしまいというわけです.
 それに対し『continue;』も,同じように後ろを見ていって,『}』を見つけます.for文,while文,do文のいずれかの処理に関する『}』であれば,この『}』の直前に,制御が移ります.そして『}』ですので,forやwhileなら繰り返しのはじめに戻り,do-whileならwhileの条件判定となるわけです.
このようにしてソースコードを見ながら,制御,言い換えるとプログラムがどの順に実行していくか,を読む際には,関係のない『}』に惑わされないようにしましょう.ifやelseの『{』『}』は,break文・continue文に影響しません.『if (条件) { 何か処理があって,break; }』は,このifの処理のブロックを抜けるのではなく,それより外で最も内側の,switchまたは繰り返しのブロックを抜ける,ということなのです」

その3

「『構造』とは何か…『デジタル大辞泉』という辞書より,抜粋したいと思います.*1
 意味の1番目は,『一つのものを作り上げている部分部分の材料の組み合わせ方。また、そのようにして組み合わせてできたもの。仕組み。』であり,用例としては『家の構造』『構造上の欠陥』などが書かれています.
 このことを踏まえて,プログラムを読むときの心がけとして,次の3つに注意するといいでしょう.
 まず,『1行または数行の処理のかたまりで,何を行うのか?』です.
 そして,『分岐なら,どんな条件のときに,どこを実行するか?』です.
 最後に,『繰返しなら,変数の値はどのように変化するか? いつ繰返し処理を終えるか?』ということです.
 授業資料のプログラムを読むときだけでなく,自分でプログラムを書いてみて,実行する前に,これでいいのかと確認するときにも,読むことが不可欠です.
 構造を意識して,よく読みよく書き,内容を理解しながら,プログラムを完成させましょう」

質問タイム

Q: break文やcontinue文を,「}」のないところで書いたら,どうなりますか?
A: プログラムコードを読むにあたっては,「{」「}」を補って,それから,該当する「}」の直後または直前に移る,と理解してください.
 例えば以下は「{」「}」を使用していませんが適切なC言語のコードです.「{」と「}」を補ったらどうなるか,そして何を出力し,sumの値は最終的に何になるか,考えてみてください*2

int i, sum = 0;
for (i = 1; i <= 10; i++)
  if (i % 2 == 1)
    continue;
  else if (i <= 5)
    printf("Do nothing.\n");
  else
    sum += i;

*1:https://www.weblio.jp/content/%E6%A7%8B%E9%80%A0

*2:補ってできるコード以外の答えを書いておくと,「Do nothing.」を2回出力し,sumの値は6+8+10で24になります.