3. C/C++とフローチャート¶
ここでは、具体的にC/C++(C言語、C++)とフローチャートの対応関係について書きます。ソースコードとフローチャートを順番に書くことで、ソースコードの処理の流れを明確にします。
Contents
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);//「不合格」を表示
}
条件付き実行のフローチャート
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のフローチャート
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の例のフローチャート
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文の例
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文例のフローチャート
3.4. for文¶
for文の構文
for(初期化式; 条件式; 再初期化式) {
命令文;
}
初期化式 | 「i=0」など、forループ内で使われる変数などの初期化を行う |
条件式 | ループ処理が継続する条件を「i < 10」などの条件式で書かれる |
再初期化式 | 「i=i+1」などのように初期化式で設定された変数を再設定するのに使われる |
for文のフローチャート
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文例のフローチャート
3.5. for-each文¶
g++ -std=c++11 c_for_each.cpp -o c_for_each
foreachのループ文の説明
for-each文の構文
for(型名 変数 : 配列){
命令文;
}
foreach文は配列・コレクションの数だけ、変数に配列の要素を順番に格納しながら処理をを繰り返します。
1~10の合計を求める。for-each文の例
#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文のフローチャート
3.6. while文¶
while文の構文
while( 継続条件式){
命令文;
}
while文のフローチャート
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文例のフローチャート
3.7. do..while文¶
do-while文の構文
do{
命令文;
}
while(継続条件式);
do-while文のフローチャート
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文のフローチャート
3.8. continue文¶
continueの構文
ループ制御文{
if(条件){
continue;
}
その後の処理;
}
continue文はfor、while、do...whileのループ制御文の「その後の処理」をスキップさせ、ループ処理を継続させます。
continue構文のフローチャート
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文のフローチャート
3.9. break文¶
break文はループ制御文とswitch文を抜けだします。
breakの構文
ループ制御文{
if(条件){
break;
}
その後の処理;
}
break文はfor、foreeach、while、do...whileのループ制御文を抜け出します。
break構文のフローチャート
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文のフローチャート
3.10. ラベル付きcontinue文¶
深さを指定するcontinueの構文
ループ制御文{
ループ制御文{
if(条件){
goto CONTINUE_LABEL;
}
その後の処理;
}
その後の処理1;
CONTINUE_LABEL:{}
};
continue文のフローチャート
これは主に多重ループを抜ける処理をスマートの書くために使います。
深さを指定する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文のフローチャート
3.11. ラベル付きbreak¶
深さを指定するbreakの構文
ループ制御文{
ループ制御文{
if(条件){
goto BREAK_LABEL;
}
その後の処理;
}
その後の処理;
}
BREAK_LABEL:
※ループ制御文(for、foreach、while、do...while)
ループの深さ付きbreak文のフローチャート
ループ深さ付き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文のフローチャート
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文例のフローチャート