プログラムの制御構造を理解して、慣れ親しめば論理的思考が身に着くかも?

こんにちわ。

先日、コンピュータのアルゴリズムについて、かなり簡単に説明しました。

それでも、難しい内容になっちゃいました。

アルゴリズムって、コンピュータの世界で言うとプログラムのこと?
こんにちわ。 パソコンをはじめとするコンピュータのプログラムの話をしていると、よく出てくるのが「アルゴリズム」という言葉です。...

その中でお話したとおりアルゴリズムをプログラムに置き換えていくときに、手続き型のプログラミングにおいて、制御構造という形式にそって置き換えていきます。

スポンサーリンク
スポンサーリンク




プログラムの制御構造

制御構造は、コンピュータ・プログラミング言語、その中でも一般的なプログラミングである手続き型プログラミングにおいて、ループや飛び越しなどといった手続き中の実行の順序を順次実行から変化させたり、サブルーチンとよばれるサブプログラムを呼出すことやその戻り、などといった制御を行うプログラムの構造のことを言います。

制御構造の種類は言語によって多少異なりますが、概ね以下のようなものがあります。

  • 無条件の分岐命令、ジャンプ
  • 条件付き分岐命令、選択
  • ループ
  • サブルーチン呼出
  • 継続
  • プログラムの停止

などです。

概ね、コンピュータはこれらの構造の組み合わせられたプログラムとデータ構造で様々な処理を実現しています。

順次実行や、演算・計算についてはここでは省略して、主な制御構造をそれぞれ簡単にご説明します。

無条件の分岐命令、ジャンプ

分岐命令は、ジャンプ命令ともいい、順次実行している命令のある地点から、任意の命令まで移動して、その命令から継続して処理するような動きを言います。

分岐命令には条件分岐命令と無条件分岐命令があり、厳密には無条件分岐は「分岐」と言えないかもしれません。

代表的な無条件分岐はGoto文です。

goto文は、それ単体では働きを持たせることはできず、必ずラベルか何かによって明示される飛び先が必要です。

機械語における分岐命令の一種である無条件分岐と、アセンブリ言語のラベルをそのまま手続き型プログラミングに持ち込んだものと言えますね。

ただ、以前に実行した場所に戻るというループ用途なのか、それとも単に飛び越したいだけというジャンプ用途なのか、という単純なことすら、goto文ではその見かけからは分からないことから、意図の不明瞭さゆえに、gotoは使うべきではないという意見があります。

Goto ラベル

条件付き分岐命令、選択命令

上記のとおり、無条件分岐では分岐の意図が不明瞭なので、実際には条件付き分岐命令や選択命令と呼ばれるものが使用されることが多いです。

if文

if文はプログラミング言語において、真理値に従って「もしAならば、Bをせよ、さもなくばCせよ」というような条件実行をするものです。

if else文と呼ばれることもあります。

具体的な構文言語によって異なりますが、一般的には、条件式と、条件式の評価結果の値が「真」の場合に実行される「then節」に処理がうつり、「偽」の場合に実行されるelse節と呼ばれる部分の処理が実行されます。

if (条件式)
  then節
else
  else節

switch 文

switch文は、プログラミング言語において、ある式の値に応じて多分岐をおこなう文です。

switch (条件式) {
 case 値1:
     処理1
    break;
case 値2:
     処理2
    break;
default:
     処理3
}

この文は次のような手順で実行されます。

  1. 条件式を評価し、整数値を得る。
  2. その整数値がどれかのcaseで指定された値であるなら、そのcaseに引き続く処理に飛ぶ。
  3. どのcaseでも合致しなければ、defaultに引き続く処理に飛ぶ。
  4. もしdefaultが記述されていなければ、何も実行せずにswitch文を抜ける。

なお、上記の「case」はいくつでも記述することができます。

ループ

ループはソースコード上で1回だけ書かれた処理の並びを繰り返して複数回実行することを言います。

ループの中の処理は指定回数実行されるか、指定されたコレクションの各要素に対応して実行されるか、何らかの条件が成立するまで繰り返し実行されます。

無限に繰り返されることもあるので注意が必要です。

カウント制御ループ(for)

for文はプログラミング言語において条件が真の間だけ与えられた文の実行を繰り返すというループを記述するための文です。

for(初期化; ループの継続条件; カウンタ変数の更新){
   処理1
 処理2
}

このループは次のような手順で実行されます。

  1. 初期化を実行する。
  2. 条件を評価する。条件が「偽」ならば、ループを終了する。
  3. 条件が「真」ならば、処理を実行する。
  4. カウンタ変数の更新を実行する。
  5. 条件の評価に戻る。

条件制御ループ

while文はプログラミング言語における制御構造のひとつで、英単語 while の意味「何々である間」の通り、なんらかの条件式を評価した値が真である間は、ループを実行します。

while (条件) {
    処理1
  処理2
}

このループの実行は、次のような手順となります。

  1. 条件を評価する。条件が偽ならば、ループを終了する。
  2. 処理を実行する。
  3. 条件の評価に戻る。
  4. 条件がはじめから偽の場合は、処理は一度も実行されず、次に移る。

ループには、他の制御方法によるループもありますが、代表的なものは以上の2つですね。

無限ループ

プログラマにとってはあまりいい意味ではない処理に「無限ループ」があります。

一般的には、無限ループはプログラミングのミスで発生します。

ループ終了条件がループ内で全く発生しない場合に、原因で意図しない無限ループとなります。

しかし、場合によっては無限にループする方がプログラムに適していることもあるし、何らかのエラーが発生するまでループさせるということもあります。

たとえば、イベント駆動型プログラムはイベント制御ループを永遠に回し続け、操作者によって何らかのイベントを発生させたときにループを停止するような処理をしています。

サブルーチンの呼出

サブルーチンは、プログラム中で意味や内容がまとまっている処理をひとつの手続きとして分割したものを言います。

繰り返して何度も利用される一連の処理をモジュールとしてまとめたもので、呼び出す側をメインルーチンと呼ぶのに対して、「サブルーチン」と呼ばれます。

サブプログラムとも呼ばれます。

プログラムの中で、繰り返し現れる作業をサブルーチン化することで、可読性や保守性を高く保つことができます。

また、繰り返し現れる作業でなくても、ある一定の意味のある処理のまとまりを示すためにサブルーチン化することもあります。

プログラムの継続と停止

プログラムで言う継続とは、前の状態を引き継ぐことを言います。

プログラムの実行においてある時点において評価されていない残りのプログラムを意味するものであり、手続きとして表現されます。

また、プログラムの停止については、実際的にはexitシステムコールなど、OSのプロセス制御機構を使うことがほとんどで、言語機能として制御構造で持つ意味はあまりないようです。

いずれも概念的なものでプログラミングの制御構造上では、先の条件分岐、ループ、サブルーチンなどを理解しておけば、基本的な部分はOKだと思います。

最初にも言いましたが、これらの制御構造だけでほとんどのプログラムが構成されています。

ある意味、単純な構造の組み合わせで、複雑な問題や課題を解決することになりますので、プログラミングが上達することは、イコール論理的思考も身に着くということなのだと思いますよ。

今回も最後までおつきあい、ありがとうございました。

スポンサーリンク
スポンサーリンク




スポンサーリンク




シェアする

  • このエントリーをはてなブックマークに追加

フォローする