フローチャート フローチャートとは プログラムの処理の流れを整理し 図的に順序立てて描いたもの 流れ図流れ図ともいう 例 : 始め 半径 R 端子 : 開始 終了 停止などを示す 手操作入力 : キーボードなどから手で操作して入力することを示す 面積 S πr 2 処理 : あらゆる種類の処理を示す S 終わり 表示 : ディスプレイ表示を示す このようにフローチャートでは 記号形状自体が処理の意味を示している
主なフローチャートの図記号 端子 : フローチャートの開始 終了の端子を意味する 処理 : 一般的な処理を意味する 準備 : 初期値設定などの準備を意味する 手操作入力 : キーボードからの手操作入力を意味する 表示 : 画面への情報表示を意味する
判断 : 比較 判断を意味する 結合子 : フローチャートの他の処理への出口 または他の処理からの入口を意味する 繰り返しループ : 反復処理の始まりと終わりを意味する (for 文のときに使用 )
フローチャートの書き方 フローチャートの流れは基本的に上から下 左から右に進行する それ以外の場合は 流れ線に矢印を入れる 流れ線は交差してもよい 交差しても合流は意味しない 合流なし 合流あり 結合子には番号や名前を入れ 相互に結合していることを示す 1 1
条件分岐のフローチャートは下記のようなバリエーションがある A>0 No < A:0 > Yes = A A 1 2 3 その他 1 2 3 その他
順次処理 選択処理 反復処理のフローチャート 命令 1 命令 2 命令 3 No 条件 Yes 命令 1 命令 2 条件 Yes 命令 1 No 順次処理 選択処理 反復処理
例 : 絶対値を求めるプログラムのフローチャート 始まり実数値 val val < 0 Yes val -val No キーボードから実数値を入力し 変数 val に書き込む val < 0 が成り立てば val の符号を反転して変数 val に書き戻す 条件が成立しなければ val の値はそのまま val 変数 val の値を画面に表示 終わり
練習問題 1 次のプログラムのフローチャートを記述せよ キーボードから入力した整数値が 10 であったら 10 です 10 以外であったら 10 以外です と表示するプログラム
選択処理 if 文 (pp.45-4747 pp.138-143 143) 例題 1: キーボードから実数値を入力し その絶対 値を表示するプログラムを作成せよ #include <stdio.h> main( ){ double val; scanf("%lf", &val); if(val < 0){ val = -val; printf("val = %f n", val); if の括弧内の条件が成り立っている場合は 中括弧 { 内の処理を行う
if 文の書式の書式とフローチャート if( 式 ){ 文 ; 式が成立した時は { 内の文を実行し 成立しない場合は文を実行しない 式が成立した場合を条件が真 (True) であるといい 成立しない場合を条件が偽 (False) であるという { 内は字下げすると見やすくなる 文が一つの場合は 中括弧を省略できる 例 : 先ほどのプログラムのif 文は 中括弧を省略して次のように書くことができる : if(val < 0) val = -val; 文が複数ある場合は 括弧は省略不可 if(val > 0){ val = -val; printf("val=%f n", val); 式 Yes 文 No
関係演算子と等値演算子 (pp.110-112) 関係演算子 : 値の大小関係を比較する演算子 < <= > >= がある =< や => は間違い 等号は必ず後ろにつく 等値 否定演算子 : 値が等しいか等しくないかを比較する演算子 == : 値が等しいかどうかを比較する!= : 値が等しくないかどうかを比較する 例 : よくある間違い if(a = b){... = は代入演算子なので 等価を示すときは == を使わないといけない! この例では bの値をaに代入し その値で条件判断をすることになる C 言語の場合 aの値が0 以外の場合は全て真となってしまう
if - else 文 (pp.138-142) 例題 2: キーボードから入力した値が10であったら 10 です 10 以外であったら 10 以外です と表示するプログラムを作成せよ #include <stdio.h> main( ){ int val; scanf("%d", &val); if(val == 10){ printf("10 です n"); else{ printf("10 以外です n"); if 文の括弧内の条件が成立すれば次の中括弧内の命令を実行し 条件が成立しなければ else に続く中括弧内の命令を実行する
if-else 文の書式の書式とフローチャート if( 式 ){ 文 1; else{ 文 2; 式が成り立つ場合は文 1 を実行し 成り立たない場合は文 2 を実行する 文 1 もしくは文 2 が 1 文の場合 それを囲む中括弧は省略できる 式 Yes 文 1 No 文 2
else if 文の使い方 if ( 式 1){ 文 1; else if ( 式 2){ 文 2; 式 1が成り立つ場合は 文 1を実行し 成り立たない場合は 式 2を評価する そこで 式 2が成り立つ場合は 文 2を実行する 式 1 Yes No 文 1 式 2 文 2 Yes No
else if 文の意味 else if( 式 2){ 文 2; と else{ if( 式 2){ 文 2; は等価である
例題 3: テストの点数を入力し 60 点以上で100 点以下なら good 60 未満なら no good と表示するプログラムを作成せよ ただし 100 点を超える点数が入力された場合は データの誤り と表示する 始め 得点入力 score score > 100 Yes データの誤り No score 100 score > =60 Yes good No score<60 no good 60 score 100 終わり
#include <stdio.h> main( ){ int score; printf(" 得点は :"); scanf("%d", &score); if(score > 100){ printf(" データの誤り else if(score >= 60){ printf("good n"); "); else{ printf("no good n"); データの誤り n"); 変数 score の値が 100 よりも大きい場合は 画面に データの誤り ( 改行 ) と表示し 100 以下の場合は 次の else if 文を実行する ten の値が 60 以上の場合 ( つまり score の値が 100 以下 60 以上の場合 ) 画面に good( 改行 ) と表示する 60 未満の場合は 次の else 文を実行する
if-else 文の入れ子構造 if( 式 1){ if( 式 2){ 文 1; else{ 文 2; 式 1 が成立し かつ式 2 が成立する場合は 文 1 を 式 1 が成立し かつ式 2 が成立しない場合は文 2 を実行する if-else ブロック内にさらに if-else ブロックを入れられる ( 入れ子 ) 式 1 Yes 式 2 Yes No No 文 1 文 2
例題 4: 西暦年数を入力させ うるう年の判定をせよ うるう年の判定 : 400 で割り切れる年数または 4 で割り切れ かつ 100 で割り切れない年数 複数の条件が組み合わされて 1 つの条件となっている 論理演算子を利用すると良い
論理演算子の利用 (pp.110-112) 論理演算 : 複数の条件 ( 式 ) を組み合わせて表現する演算例 : a は b より大きく かつ b は c より大きい 論理演算子 : 論理演算を行うために用意された演算子論理積 : 条件 1 が成立し かつ条件 2 が成立するとき 全体の演算結果を真とする演算 記号は && を使用 例 : (a > b) && (b > c) 論理和 : 条件 1 が成立するか または条件 2 が成立するとき 全体の演算結果を真とする演算 記号は 注 : パイプ記号は delete キーの左隣のキー例 : (a > b) (b > c) 否定 : 条件が成立しない場合 演算結果を真とする演算 記号は! 例 :!(a > b)
例題 4を論理演算子を用いて解いてみるいてみる うるう年の条件 : (400 で割り切れる年数 ) または (4 で割り切れる年数で かつ 100 で割り切れない年数 ) 上記の条件を if 文で表現 (n に西暦年が入っているとする ) if((n % 400 == 0) ((n % 4 == 0) && (n % 100!= 0))) printf(" うるう年 n"); else printf(" うるう年ではない n"); 処理範囲と処理順を明確にするために 各条件と処理の固まりは括弧で括った方がわかりやすい
switch 文 (pp.154-158) 158) switch 文の形式とフローチャート switch( 整数式 ){ case 定数式 1: 文 1; break; case 定数式 2: 文 2; break;... default: 文 ; break; 整数式 定数式 1 定数式 2 定数式 n default 文 1 文 2 文 n 文
整数や文字の値に応じて多方向分岐が必要な処理では switch 文を使うと便利 switch 文の構造説明 switchに続く ( ) 内に分岐の指標となる整数式を書く case に続く定数式の値 ( 整数 ) が switchの括弧内の式の値と一致した時 case 以降に続く文を実行する case 内にbreakがある場合は そこで switchのブロックから抜け出す default に続く文は 式の値がcase 文のどの定数式にも当てはまらない場合に実行される この場合 default 文がない場合は switchのブロックから抜ける caseの記述順序は拘らない( 全てのcase 内にbreakを含む場合のみ ) ただし 上のcase 文から評価される case 文の定数式の値は各々異なっている必要がある
switch に続く ( ) 内には整数式 ( 結果的に整数となる式や値 文字でも良い ) を書く 良い例 1: int data=2; switch(data){... 良い例 2: char moji='a'; switch(moji){... 悪い例 : double real=3.4; switch(real){... /* 実数値は使用不可 */
case 文内にbreak 文がないと 処理は次のcase 文に移ってしまう 例 : switch(data){ case 20: printf("data = 20 n"); case 21: printf("data = 21 n");... break 文がないと 次の case 文が実行される data の数値が 20 の場合は 両方の printf 文が実行され 数値が 21 の場合は下の printf 文だけが実行される
異なる式の値でも同一の文を実行させる例 switch(data){ case 1: case 2: printf("%d is 1 or 2 n", data); break;... data が 1 のときも 2 のときもこの printf 文が実行される このように case 1 に何の命令文も書かないと data の値が 1 の場合は 自動的に case 2 に実行が移る 従って data の値が 1 でも 2 でも 同一の文を実行することになる
例題 5: キーボードから整数値を入力し 入力値が1 または2なら A 3なら B それ以外なら C を表 示するプログラムを作成せよ フローチャート 始め num num 1 または 2 3 default switch 文 A B C で表現可能 終わり
プログラムの主要部分 switch(num){ case 1: case 2: printf("a n"); break; case 3: printf("b n"); break; default: printf("c n"); break; num には評価をしたい整数値が入っている num の値が 1 または 2 の場合 次の printf 文を実行する この break で switch のブロックから抜ける num の値が 3 の場合は 次の printf 文を実行する num の値が上記の case に合致しない場合
まとめ 1 if 文 : 式が成り立った場合に中括弧内の文を実行する if( 式 ){ 文 ; if - else 文 : 式が成り立った場合にはif 文の次の中括弧内の文を実行し 成り立たない場合はelse 文の次の文を実行する if( 式 ){ 文 1; else{ 文 2; 式の部分には関係演算子 (<, <=, >, >=) や等価演算子 (==,!=) を入れて数値の比較が可能
まとめ 2 if-elseブロック内にさらにif-elseブロックを挿入可能 else ブロック内に ifブロックが入る場合は else if と記述可能 条件式が複数ある場合は 論理演算子を用いて一つの条件式にまとめることが可能な場合あり 論理積 : 日本語の かつ に相当 記号 && 論理和 : 日本語の または に相当 記号 否定 : 日本語の ~でない に相当 記号!
まとめ 3 整数や文字の値に応じて多方向分岐が必要な処理では switch 文を使うと便利 switch 文の一般形 : switch( 整数式 ){ case 定数式 : 文 ; break;... default: 文 ; break;
参考文献 学生のためのC 東京電機大学出版 ISBN4-501-52310-7 ポケットコンピュータ SHARP PC-G850V 取り扱い説明書 はじめてのC 技術評論社 ISBN4-7741-1264-X