3. C/C++とフローチャート

ここでは、具体的にC/C++(C言語、C++)とフローチャートの対応関係について書きます。ソースコードとフローチャートを順番に書くことで、ソースコードの処理の流れを明確にします。

3.1. 三項の条件演算子

C/C++での三項の条件演算子は「条件付き実行」を使います。

条件付き実行の構文

条件 ? 式1: 式2

条件 真偽を意味する演算式
式1 条件が真のときの計算される
式2 条件が偽のときの計算される

条件付き実行の例

c_conditional_op.c

#include <stddef.h>
#include <stdio.h>

int main(){
    int sum = 10;
    int num = 0;
    char* str = NULL;
    str = sum >= 60 ? "合格" : "不合格";
    printf(str);//「不合格」を表示
}

条件付き実行のフローチャート

_images/sanko.gif

3.2. if...else文

if文は条件によって、処理を分岐したときに利用します。

if..elseの構文

if(条件式1){
    命令文1;
}
else if(条件式2){
    命令文2;
}
else{
    命令文3;
}
条件式1 条件が真のとき命令文1を実行する条件式
命令文1 条件式1を満たす時に実行される
条件式2 条件が真のとき命令文2を実行する条件式。条件式1の条件を満たさないときに判定される
命令文2 条件式2を満たす時に実行される
else どの条件式も満たさないときに命令文3を実行する
命令文3 elseのときに実行される

if..elseのフローチャート

_images/ifelse.gif

if..elseの例

c_if_else.c

#include <stddef.h>
#include <stdio.h>

int main(){
    int age = 16;
    char* result = NULL;
    if (age >= 70){
        result="心の欲する所に従って矩を踰えず";
    }
    else if(age >= 60){
        result="耳順う";
    }
    else if(age >= 50 ){
        result="天命を知る";
    }
    else if(age >= 40 ){
        result="惑わず";
    }
    else if(age >= 30 ){
        result="立つ";
    }
    else if(age >= 15 ){
        result="学に志す";
    }
    else{
        result="無し";
    }
    printf(result);//=> 学に志す
    return 0;
}

if..elseの例のフローチャート

_images/rongo.gif

3.3. switch文

switch文の構文

swtich(式){
    case 値1:
        命令文1;
        break;
    case 値2:
        命令文2;
        break;
    default:
        命令文3;
        break;
}

※ 式:値を返す式を記載する。 値:式の計算結果。

値1 式が値1を返したとき、命令文1を実行する
命令文1 式が値1のとき実行される
値2 式が値2を返したとき、命令文1を実行する
命令文2 式が値2のとき実行される
default 式が指定してない値(値1、値2以外)を返したとき、命令文3を実行する
命令文3 式が指定してない値のき実行される


switch文のフローチャート
_images/switch.gif

switch文の例

c_case.c

#include <stddef.h>
#include <stdio.h>

int main(){
    int month=2;
    char* result=NULL;
    switch(month){
      case 1:
        result="January";break;
      case 2:
        result="February";break;
      case 3:
        result="March";break;
      case 4:
        result="April";break;
      case 5:
        result="May";break;
      case 6:
        result="June";break;
      case 7:
        result="July";break;
      case 8:
        result="August";break;
      case 9:
        result="September";break;
      case 10:
        result="October";break;
      case 11:
        result="November";break;
      case 12:
        result="December";break;
      default:
        break;
    }
    printf(result);//Februaryを表示
}

switch文例のフローチャート

_images/switch_ex.gif

3.4. for文

for文の構文

for(初期化式; 条件式; 再初期化式) {
    命令文;
}
   
初期化式 「i=0」など、forループ内で使われる変数などの初期化を行う
条件式 ループ処理が継続する条件を「i < 10」などの条件式で書かれる
再初期化式 「i=i+1」などのように初期化式で設定された変数を再設定するのに使われる

for文のフローチャート

_images/for.gif

1~10の合計を求めるfor文の例

c_for.c

#include <stddef.h>
#include <stdio.h>

int main(){
    int sum = 0;
    int i=0;
    for(i=1; i <= 10; i++){
        sum += i;
    }
    printf("%d",sum);//55を表示
}

※「i++」は「i = i + 1」のことを表します。

※「sum += i」は「sum = sum + i」のことを表します。


for文例のフローチャート

_images/for_ex.gif

3.5. for-each文

foreachはC++11(ISO標準 ISO/IEC 14882:2011)でC++に取り入れらた仕様です。
コンパイルオプションには、以下のように「-std=c++11」を付けないと構文エラーになります。
また、Cには対応していません。

g++ -std=c++11 c_for_each.cpp -o c_for_each


foreachのループ文の説明

for-each文の構文

for(型名 変数 : 配列){
    命令文;
}

foreach文は配列・コレクションの数だけ、変数に配列の要素を順番に格納しながら処理をを繰り返します。

1~10の合計を求める。for-each文の例


c_for_each.cpp
#include <stdio.h>

//g++  -std=c++11   c_for_each.cpp   -o c_for_each

int main(){
    int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum=0;
    for(int num : nums){
        sum = sum + num;
    }
    printf("%d",sum);//#55を表示
}

for-each文のフローチャート

_images/for_each.gif

3.6. while文

while文の構文

while( 継続条件式){
    命令文;
}

while文のフローチャート

_images/while.gif

1~10の合計を求める。while文の例

c_while.c

#include <stdio.h>

int main(){
    int sum=0;
    int i=1;
    while(i <=10){
        sum = sum + i;
        i = i + 1;
    }
    printf("%d",sum);//55を表示
}

while文例のフローチャート

_images/while_ex.gif

3.7. do..while文

do-while文の構文

do{
    命令文;
}
while(継続条件式);

do-while文のフローチャート

_images/do_while.gif

1~10の合計を求める。do-while文の例

c_do_while.c

#include <stdio.h>

int main(){
    int sum = 0;
    int i = 1;
    do{
        sum = sum + i;
        i = i + 1;
    }while(i <= 10);
    printf("%d",sum);//55を表示
}

do-while文のフローチャート

_images/do_while_ex.gif

3.8. continue文

continueの構文

ループ制御文{
    if(条件){
        continue;
    }
    その後の処理;
}

continue文はfor、while、do...whileのループ制御文の「その後の処理」をスキップさせ、ループ処理を継続させます。


continue構文のフローチャート

_images/continue.gif

continue文の例

c_continue.c

#include <stdio.h>

int main(){
    int sum = 0;
    int i = 0;
    for(i=1; i <= 10; i++){
        if(i == 3){
            continue;
        }
        sum = sum + i;
    }
    printf("%d",sum);//52を表示
}

continue文のフローチャート

_images/bat_for_continue_ex.gif

3.9. break文

break文はループ制御文とswitch文を抜けだします。

breakの構文

ループ制御文{
    if(条件){
        break;
    }
    その後の処理;
}

break文はfor、foreeach、while、do...whileのループ制御文を抜け出します。


break構文のフローチャート

_images/break.gif

break文の例

c_break.c

#include <stdio.h>

int main(){
    int sum = 0;
    int i = 0;
    for(i=1; i <= 10; i++){
        sum=sum+i;
        if(sum >= 30){
             break;
        }
    }
    printf("%d",sum);//36を表示
}

break文のフローチャート

_images/bat_for_break_ex.gif

3.10. ラベル付きcontinue文

ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。
C/C++ではラベル付continue文はありません。代わりに、goto文を使ってその後の処理をスキップします。
※goto文の利用は嫌われますので、使うのはこの場面だけにしたほうがよいです。

深さを指定するcontinueの構文

ループ制御文{
    ループ制御文{
        if(条件){
            goto CONTINUE_LABEL;
        }
        その後の処理;
    }
    その後の処理1;
CONTINUE_LABEL:{}
};
「ループ制御文1」の「その後の処理」、「ループ制御文2」の「その後の処理1」をスキップします。
「CONTINUE_LABEL:{}」とわざと「{}」を書いています。ラベルは処理につけるものなので、処理のない場所のラベルには無処理の処理を書いています。

continue文のフローチャート

_images/label_continue.gif

これは主に多重ループを抜ける処理をスマートの書くために使います。



深さを指定するcontinue文の例

c_double_loop_continue.c

#include <stdio.h>

int main(){
    int sum = 0;
    int i=0;
    int j=0;
    for(i=1; i <= 10; i++){
        for(j=1; j <= 10; j++){
            if(i == 3){
                goto CONTINUE_LABEL;
            }
            sum=sum+i*j;
        }
        
CONTINUE_LABEL:
        {}//複合文の最後にラベルがあります」エラー対策として、ラベルの後にnop処理を追加します。
    }
    printf("%d",sum);//2860を表示
}
 

ラベル付きcontinue文のフローチャート

_images/bat_for_double_continue_ex.gif

3.11. ラベル付きbreak

ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。
C/C++ではラベル付break文はありません。代わりに、goto文でループ処理を抜けます。
※goto文の利用は嫌われますので、使うのはこの場面だけにしたほうがよいです。

深さを指定するbreakの構文

ループ制御文{
    ループ制御文{
        if(条件){
            goto BREAK_LABEL;
        }
        その後の処理;
    }
    その後の処理;
}
BREAK_LABEL:

※ループ制御文(for、foreach、while、do...while)


ループの深さ付きbreak文のフローチャート

_images/label_break.gif

ループ深さ付きbreak文の例

c_double_loop_break.c

#include <stdio.h>

int main(){
    int sum = 0;
    int i,j;
    for(i=1; i <= 10; i++){
        for(j=1; j <= 10; j++){
            sum = sum + i * j;
            if(sum >= 15){
                goto BREAK_LABEL;
            }
        }
    }
BREAK_LABEL:
    printf("%d",sum);//15を表示
}

ループ深さ付きbreak文のフローチャート

_images/bat_for_double_break_ex.gif

3.12. goto文

goto文は指定したラベルに実行行をジャンプさせます。

なお、goto文を使うことは推奨されませんので、利用の際は計画的に使ってください。

gotoの構文

goto ラベル名;

ラベルの構文

ラベル名: ジャンプさせたい処理;

※たまにあるのですが、スコープの最後のように「ジャンプさせたい処理」が何もない時には「{ }」などの無処理の処理を書きます。そうしないと文法エラーになります。

goto文例

c_goto.c

#include <stdio.h>

int main(){
    goto B;
    A:
    //処理しない
    printf("01");
    
    B:
    //処理する
    printf("02");
    goto D;
    
    C:
    //処理しない
    printf("03");
    
    D:

    //02を表示する
    return 0;
}

goto文例のフローチャート

_images/bat_goto_ex.gif