C言語の基本|流れ図の基本

いきなりコードに迷ったら、まず手順を図にしよう。流れ図で処理を見える形にすると、C言語の条件分岐や繰り返しが書きやすくなる。

アルゴリズムは、問題を解決するための手順です。

簡単な処理であれば、頭の中だけでも手順を整理できるかもしれません。しかし、条件によって処理が分かれたり、同じ処理を何度も繰り返したりすると、少しずつ流れを追いにくくなります。

たとえば、次のような処理です。

  • 数値を入力する
  • 入力された値を基準値と比較する
  • 条件によって表示内容を変える
  • 複数のデータに同じ処理を繰り返す
  • 条件を満たすまで処理を続ける

このような手順をいきなりC言語で書こうとすると、どこにifが必要なのか、forの中に何を書けばよいのか分からなくなることがあります。

そこで役立つのが、アルゴリズムを文章や図で表現する方法です。

コードを書く前に、手順を箇条書きにしたり、表で整理したり、流れ図で表したりすると、処理全体を確認しやすくなります。

この記事では、アルゴリズムの表現方法の中でも、処理の順番を視覚的に確認できる流れ図を中心に解説します。

アルゴリズムを表現する必要性

アルゴリズムには、順次、分岐、繰り返しという基本的な流れがあります。

基本的な流れ内容
順次決められた順番に処理する入力、計算、表示の順に実行する
分岐条件によって処理を分ける点数が70以上なら合格と表示する
繰り返し同じ処理を何度も実行する5個のデータを順番に表示する

順次だけで構成されたアルゴリズムは、比較的簡単に説明できます。

しかし、順次の途中に分岐があり、その分岐の中に繰り返しが含まれるようになると、文章だけでは処理のつながりを把握しにくくなります。

そのような場合は、次の方法で処理を見える形にします。

  • 箇条書きで手順を順番に並べる
  • 表を使って条件と処理の対応を整理する
  • 流れ図を使って処理の進む方向を示す

処理を見える形にすると、自分でアルゴリズムを確認しやすくなるだけでなく、ほかの人にも説明しやすくなります。

図1:アルゴリズムを構成する3つの基本的な流れ

この図から分かること

順次では、処理を決められた順番に実行します。入力した値を計算し、その結果を表示する流れが代表的です。

分岐では、条件の結果によって次に実行する処理が変わります。条件が成立した場合と成立しなかった場合で、別々の方向へ進みます。

繰り返しでは、指定された回数や条件に従って同じ処理を何度も実行します。

多くのプログラムは、この3つの流れを組み合わせて作られています。

アルゴリズムの主な表現方法

アルゴリズムを表現する方法には、それぞれ特徴があります。

表現方法特徴向いている場面
箇条書き手順を短い文章で順番に並べる処理の概要をすばやく整理したい場合
条件と処理を対応させて整理する複数の条件や結果を比較したい場合
流れ図記号と矢印で処理の流れを示す分岐や繰り返しを視覚的に確認したい場合

箇条書きは、アルゴリズムを考え始めるときに便利です。思いついた処理を順番に書くだけでも、抜けている手順を見つけやすくなります。

表は、条件と処理の組み合わせが多い場合に役立ちます。どの条件で、どの処理を実行するのかを横に並べて確認できます。

流れ図は、矢印を使って処理の進む方向を表します。処理がどこで分かれ、どこで合流し、どこへ戻るのかを確認しやすい方法です。

これらの方法は、どれか1つだけを使わなければならないわけではありません。最初に箇条書きで整理し、必要に応じて表や流れ図に置き換える方法もあります。

流れ図とは

流れ図は、処理の内容を記号で表し、それらを矢印でつないだ図です。フローチャートとも呼ばれます。

基本的には、開始から終了へ向かって上から下に処理を並べます。

条件によって処理が分かれる場合は、矢印を複数の方向へ分岐させます。同じ処理を繰り返す場合は、以前の処理へ戻る矢印を使います。

流れ図を作成すると、次の点を確認しやすくなります。

  • 処理がどこから始まるのか
  • 最初に何を実行するのか
  • どの条件で処理が分かれるのか
  • 分岐した後に何を実行するのか
  • 繰り返しはどこからどこまでなのか
  • どの時点で処理が終了するのか

流れ図は、コードを書く前の設計図として利用できます。

流れ図を使う利点

目的流れ図を使う利点
処理手順を整理する実行する順番を矢印で確認できる
条件分岐を確認する条件が成立した場合と成立しない場合を分けて確認できる
繰り返しを確認するどの処理へ戻るのかが分かる
コードを書く準備をするifやforが必要な場所を判断しやすくなる
ほかの人に説明する処理全体を視覚的に伝えられる
間違いを探す処理の抜けや、終了できない流れを発見しやすくなる

特に初心者にとって大きな利点は、C言語の制御構文との対応が見えることです。

流れ図に条件による分かれ道があれば、C言語ではifやif elseが必要になります。矢印が以前の処理へ戻っていれば、forやwhileなどの繰り返しが必要になると考えられます。

最初に覚えたい流れ図の記号

流れ図では、処理の種類ごとに異なる記号を使います。標準的な記号はJISなどで定められていますが、最初からすべてを覚える必要はありません。

まずは、使用頻度の高い次の5つを覚えるとよいでしょう。

記号の名前一般的な形役割記述例
端子角を丸くした長方形や楕円処理の開始と終了を表す開始、終了
処理長方形計算や代入などの処理を表す合計を計算する
判断ひし形条件を判定して流れを分ける点数は70以上?
データ平行四辺形データの入力や受け渡しを表す点数を入力する
表示画面出力を表す形結果やメッセージの表示を表す判定結果を表示する

端子は、流れ図の始まりと終わりに配置します。どこから処理が始まり、どこで終了するのかを示す記号です。

処理記号には、加算、代入、値の更新などを記述します。

判断記号には、成立または不成立を判定できる条件を記述します。判断記号から出る矢印には、はいといいえ、真と偽などの結果を付けます。

データ記号は、キーボードからの入力や処理で使用するデータを表します。

表示記号は、計算結果や判定結果を画面に表示する処理を表します。

図2:最初に覚えたい5つの流れ図記号

この図から分かること

流れ図では、すべての処理を同じ形で表すのではなく、処理の役割に合わせて記号を使い分けます。

開始と終了には端子、計算や代入には処理、条件分岐には判断を使います。入力にはデータ、画面への出力には表示を使います。

記号の形を見るだけで、その場所が入力なのか、計算なのか、条件分岐なのかを判断できます。同じ意味の処理に同じ記号を使うことで、流れ図全体が読みやすくなります。

順次を流れ図で表す

順次は、処理を上から下へ決められた順番に実行する流れです。

たとえば、2つの数値を加算して表示する場合は、次の順番になります。

  1. 処理を開始する
  2. 2つの数値を入力する
  3. 2つの数値を加算する
  4. 加算結果を表示する
  5. 処理を終了する

流れ図では、開始から終了までを下向きの矢印でつなぎます。途中に分岐や戻りがないため、最も基本的な形です。

C言語でも、上に書かれた文から下へ順番に実行されます。そのため、順次の流れ図はコードの記述順と対応させやすくなります。

分岐を流れ図で表す

分岐は、条件によって実行する処理を変える流れです。

たとえば、入力された点数が70以上かどうかを判定する場合は、次の手順になります。

  1. 処理を開始する
  2. 点数を入力する
  3. 点数が70以上か判定する
  4. 条件が成立した場合は合格と表示する
  5. 条件が成立しない場合は再学習が必要と表示する
  6. 処理を終了する

判断記号からは、2本以上の矢印が出ます。それぞれの矢印には、はいといいえなどの判定結果を付けます。

この分岐は、C言語のif elseに対応します。

繰り返しを流れ図で表す

繰り返しは、同じ処理を決められた回数、または条件を満たしている間だけ実行する流れです。

たとえば、配列に保存された5個の値を表示する場合は、次の手順になります。

  1. 繰り返しに使用する変数を0にする
  2. 変数が5より小さいか判定する
  3. 条件が成立していれば配列の要素を表示する
  4. 変数を1増やす
  5. 条件の判定へ戻る
  6. 条件が成立しなくなったら処理を終了する

流れ図では、処理から以前の判断記号へ戻る矢印を描きます。

繰り返しでは、どこに戻るのかを明確にすることが大切です。また、いつか条件が成立しなくなるように、繰り返しに使用する値を正しく更新する必要があります。

点数を判定するアルゴリズムを流れ図にする

ここでは、入力された点数が70以上なら合格、70未満なら再学習が必要と表示するアルゴリズムを考えます。

最初に、文章で手順を整理します。

  1. 処理を開始する
  2. 点数を入力する
  3. 点数が70以上か判定する
  4. 70以上なら合格と表示する
  5. 70未満なら再学習が必要と表示する
  6. 処理を終了する

この手順を流れ図にすると、点数の入力にはデータ記号、70以上かどうかの判定には判断記号、判定結果の出力には表示記号を使用します。

図3:入力した点数を条件分岐で判定する流れ図

この図から分かること

開始後、最初に点数を入力します。その点数が70以上かどうかを判断記号で判定します。

70以上の場合は、はいの矢印へ進み、合格と表示します。70未満の場合は、いいえの矢印へ進み、再学習が必要と表示します。

どちらか一方の表示処理が終わると、2つの流れが合流して終了へ進みます。

この流れ図を見ると、C言語では点数を入力する処理、条件を判定するif else、結果を表示する処理が必要になることが分かります。

流れ図をC言語のプログラムに置き換える

流れ図で整理した点数判定を、C言語で実行できる形にします。

入力した点数から合否を判定するプログラム

ファイル名:7_3_1.c

#include <stdio.h>

int main(void)
{
    int score;

    printf("点数を入力してください。\n");
    printf("点数 > ");
    scanf("%d", &score);

    /* 点数が70以上かどうかを判断する */
    if (score >= 70) {
        printf("判定結果: 合格です。\n");
    } else {
        printf("判定結果: 再学習が必要です。\n");
    }

    printf("流れ図で条件分岐の手順を整理しました。\n");

    return 0;
}
実行結果の例

点数として82を入力した場合は、70以上なので合格と表示されます。

点数を入力してください。
点数 > 82
判定結果: 合格です。
流れ図で条件分岐の手順を整理しました。

点数として65を入力した場合は、70未満なので再学習が必要と表示されます。

点数を入力してください。
点数 > 65
判定結果: 再学習が必要です。
流れ図で条件分岐の手順を整理しました。
プログラムの詳しい解説

流れ図の記号とC言語の処理は、次のように対応しています。

流れ図の内容C言語の記述役割
開始int main(void)main関数から処理を開始する
点数を入力scanf("%d", &score);入力された整数をscoreに保存する
点数は70以上?if (score >= 70)scoreが70以上か判定する
合格と表示printf("判定結果: 合格です。\n");条件が成立した場合の結果を表示する
再学習が必要と表示elseとprintf条件が成立しない場合の結果を表示する
終了return 0;プログラムを正常終了する

int score;では、入力された点数を保存するint型の変数scoreを宣言しています。

scanfでは、変換指定子%dを使って整数を読み取ります。&scoreによって、読み取った整数をscoreの保存場所へ格納します。

ifの条件はscore >= 70です。scoreの値が70以上なら条件が真になり、ifの直後にある処理が実行されます。

scoreが70未満なら条件が偽になり、elseの処理が実行されます。

scoreの値score >= 70の結果実行される処理
82合格と表示する
70合格と表示する
69再学習が必要と表示する
65再学習が必要と表示する

70は70以上という条件に含まれるため、合格と表示されます。比較演算子が>ではなく>=であることがポイントです。

流れ図の判断記号から出ていた2本の矢印は、ifとelseの2つの処理に対応しています。図とコードを対応させることで、条件分岐の構造を確認しやすくなります。

流れ図を作るときの注意点

開始と終了を明確にする

流れ図には、処理の開始と終了を記述します。

開始と終了がないと、どこから流れを読み始め、どこで処理が完了するのか分かりにくくなります。

特に分岐がある場合は、すべての分岐先が最後に終了へ到達するかを確認します。

基本的に上から下へ流す

流れ図は、上から下へ処理が進むように作成するのが基本です。

左右への分岐は必要ですが、不必要に上下左右へ矢印を伸ばすと、処理の方向が分かりにくくなります。

以前の処理へ戻る必要がある場合は、戻り先が分かるように矢印をはっきり描きます。

判断記号の条件を明確にする

判断記号には、真または偽を判定できる条件を記述します。

次のように、判定結果を明確にできる条件が適しています。

  • 点数は70以上?
  • 入力値は0?
  • 繰り返し回数は5未満?
  • 2つの値は等しい?

判断記号から出る矢印には、はいといいえ、または真と偽などを記述します。どちらの矢印がどの結果を表しているのかを明確にします。

同じ役割には同じ記号を使う

入力処理を長方形で表したり、別の場所では平行四辺形で表したりすると、図を読む人が迷ってしまいます。

同じ意味の処理には、同じ種類の記号を使います。

  • 開始と終了には端子
  • 計算や代入には処理
  • 条件判定には判断
  • 入力にはデータ
  • 画面出力には表示

記号の使い方を統一すると、処理内容を形から判断できるようになります。

1つの記号に処理を詰め込みすぎない

1つの処理記号に多くの内容を書くと、流れ図が読みにくくなります。

たとえば、入力、計算、判定、表示を1つの長方形にまとめると、処理の順番が分かりません。

処理の役割ごとに記号を分けると、流れを追いやすくなります。

一方で、細かい処理をすべて別の記号にすると、流れ図が大きくなりすぎることがあります。その場合は、関連する処理を定義済み処理としてまとめるなど、全体を分割して考えます。

繰り返しの戻り先を明確にする

繰り返しを表す場合は、次の点を確認します。

  • どの条件を判定するのか
  • 条件が成立した場合に何を実行するのか
  • 繰り返しに使用する値をどこで更新するのか
  • どの処理へ戻るのか
  • どの条件で繰り返しを終了するのか

戻り先が分からない流れ図では、繰り返しの範囲を判断できません。

また、繰り返しを終了する条件がなければ、同じ処理を続ける無限ループになる可能性があります。

流れ図を複雑にしすぎない

流れ図は処理を分かりやすくするためのものです。すべての細かい処理を1枚に詰め込むと、矢印が交差して読みにくくなります。

流れ図が大きくなりすぎる場合は、次のように分割します。

  • 全体の流れを表す流れ図を作る
  • 詳しい処理は別の流れ図に分ける
  • 繰り返し部分を独立させる
  • 共通処理を1つにまとめる

最初は、1つの順次、1つの分岐、1つの繰り返しというように、小さなアルゴリズムから練習すると理解しやすくなります。

開発現場と学習での流れ図の使い方

開発規模が大きくなると、すべての処理を1枚の流れ図にするのは難しくなります。図が大きくなり、矢印や分岐を追いにくくなるからです。

実際の開発では、処理の目的に応じて、モジュール構成を示す図やデータの関係を表す図など、ほかの設計方法も使われます。

それでも、流れ図が不要になるわけではありません。小さな処理や複雑な条件分岐を整理する場面では役立ちます。

特にC言語を学び始めた段階では、次の対応を理解するために便利です。

流れ図の流れC言語で対応するもの
上から下へ進む処理文を記述した順番に実行する
条件による分岐if、if else
回数を決めた繰り返しfor
条件による繰り返しwhile
入力scanf
表示printf

コードを書く前に、最初は短い文章で手順を並べます。次に、その手順を流れ図にして分岐や繰り返しを確認します。最後に、流れ図の各記号をif、for、scanf、printfなどへ置き換えます。

この順番で考える習慣を付けると、いきなりコードを書き始めるよりも、アルゴリズムを落ち着いて組み立てられるようになります。