プログラミング入門 第4回講義 選択(分岐) - if, switch/case データ構造とアルゴリズム(2) プログラム制御の基本構造(4) 条件式(6) 多岐選択(11) switch-case(14) 良くあるミス(20) マークのあるサンプルプログラムは /home/course/prog0/public_html/2013/lec/source/ 下に置いてありますから、各自自分のディレクトリに コピーして、コンパイル・実行してみてください Prog-0 2013 Lec04-1 Copyright (C) 1999 - 2013 by Programming-0 Group データ構造 データとは問題を解くために必要な情報のこと データ構造とは データを管理する方法 のこと 1 データ構造は、変数の様々な型や組み合わせによっ て実現される 通常の変数以外に、例えばプログラミング入門では 「配列」、後期プログラミングCでは「構造体」や「連結 リスト」などが登場する C++,Javaなどの「オブジェクト指向言語」では 「オブジェクト」とも呼ばれる Prog-0 2013 Lec04-2 Copyright (C) 1999 - 2013 by Programming-0 Group アルゴリズム アルゴリズムとは 問題を解く手順 のこと いろいろなアルゴリズムに関して、2年前期の 「アルゴリズムとデータ構造」にて講義がある アルゴリズムを表現するために、言葉やフロー チャート(後述)で図示する等の方法がある データ構造を用いてアルゴリズムを実現した ものが プログラム である 2 3 Prog-0 2013 Lec04-3 Copyright (C) 1999 - 2013 by Programming-0 Group プログラム制御の基本構造 連接 4 (これまで習った) 手続き(処理、文)を上から順に実行 選択(条件判断) (今日習う) 5 条件の真偽で、次の手続きを選択する 繰り返し(ループ) (次回習う) 6 繰り返し条件が真のとき、繰り返し範囲の手続き を繰り返し実行する プログラムは、以上3つの要素の 組み合わせで出来ている! Prog-0 2013 Lec04-4 Copyright (C) 1999 - 2013 by Programming-0 Group 選択(if文)(p.102) 図的表現例 フローチャート(p.60) 選択(条件式の真偽による) 条件式が真の時だけ、 文を実行 7 if文の形(単文・複文) if ( 条件式 ) 文 ; 条件式 真 偽 文(文並び) 文が複文の場合は{}で囲む if(score >= 50) { printf("得点は%d点でした。\n", score); 表示:“A” printf("合格です。\n"); } /home/course/prog0/public_html/2013/lec/source/lec04-1.c Prog-0 2013 Lec04-5 Copyright (C) 1999 - 2013 by Programming-0 Group 条件式のポイント(p.104) 条件式の値 真 (1) または 偽 (0) を返す 条件式の構文 Cでは、0が偽、 0以外は真である。 つまり、if (0)は常に偽、 if (1), if(3)等は常に真 オペランド1 関係演算子 オペランド2 数学記号 = ≠ ≧ ≦ < > Prog-0 2013 Lec04-6 関係演算子 == != >= <= < > 例 a==b a!=b a>=b a<=b a<b a>b 定数,変数, 式のこと 関係演算子の使用上の注意 1. >= を逆に =>と、 <= を =< と書いてはいけない 2. 関係演算子の間にスペー スを入れて、< =などと書 いてはいけない Copyright (C) 1999 - 2013 by Programming-0 Group 条件式の拡張(p.107) 複数関係の表現 条件式の値は真または偽 真または偽を値とする演算→論理演算 8 条件式1 論理演算子 条件式2 意味 論理演算 論理演算子 演算記号 PまたはQ 論理和 OR || PかつQ 論理積 AND && Pでない 否定 NOT ! 表現例 P || Q P && Q !P (なお、否定論理演算子の場合は条件式1は不要) Prog-0 2013 Lec04-7 Copyright (C) 1999 - 2013 by Programming-0 Group 条件式の例 if(0 <= x && x <= 100) printf(..); もし 0≦x かつ x≦100 が真ならば、条件式が1となり 表示を実行 (つまり0≦x≦100 の時printfを実行する) 注意: if(0 <= x <= 100) とは書けない!! if(y <= 0 || y >= 100) printf(..); もし y≦0 または y≧100 が真ならば、条件式が1となり 表示を実行 if( !(x == 3) ) printf(..); 9 もし xが3でない(3以外) が真ならば、条件式が1となり 表示を実行 Prog-0 2013 Lec04-8 Copyright (C) 1999 - 2013 by Programming-0 Group 双岐選択if-else文(p.116) 双岐選択 条件の 真偽 で文(または複文)を選択する 10 双岐選択(if-else)の形 if ( 条件式 ) 文1 ; else 文2 ; 例:数aの正負を判定し、aの絶対値 の2倍を求め、変数ansに代入する if(a>0)ans=2*a; else ans=-2*a; (文は複文も可) Prog-0 2013 Lec04-9 図的表現例 フローチャート a>0 真 正:2*a 偽 負又は0:-2*a Copyright (C) 1999 - 2013 by Programming-0 Group 双岐選択if–else文サンプル if( a > 0 ){ ansにaの絶対値 printf("%dは正\n",a); の2倍を代入 ans = 2 * a; } else { printf("%dは負又はゼロ\n ",a); ans = -(2 * a); } 11 /home/course/prog0/public_html/2013/lec/source/lec04-2.c Prog-0 2013 Lec04-10 Copyright (C) 1999 - 2013 by Programming-0 Group 更に、多岐選択のプログラミング 多岐条件文 いくつもの条件が重なり合った選択 「多岐条件文」の例(p.123~) if ( 信号 が 青 else if( 信号 が 赤 else if( 信号 が 黄 else 信号の色の誤り; Prog-0 2013 Lec04-11 それぞれのif-elseのペ アを色分けしてある ) 進む; ) 止まる; ) 注意; /*赤青黄以外*/ Copyright (C) 1999 - 2013 by Programming-0 Group 交通信号機:if~else if版(p.125) #include <stdio.h> main() { int signal; printf("0:red, 1:green, 2:yellow : "); scanf("%d",&signal); if(signal == 0) printf("Stop\n"); else if(signal == 1) printf("Go\n"); else if(signal == 2) printf("Be careful\n"); else printf("Look at the traffic signal\n"); } /home/course/prog0/public_html/2013/lec/source/lec04-3.c Prog-0 2013 Lec04-12 Copyright (C) 1999 - 2013 by Programming-0 Group if~else if~else文の図的表現 フローチャート if(条件式1) 偽 else if(条件式2) 偽 else if(条件式3) 真 文1 真 文2 真 文3 if(条件式1) 文1; else if(条件式2) 文2; else if(条件式3) 文3; else 文4; 偽 文4 Prog-0 2013 Lec04-13 Copyright (C) 1999 - 2013 by Programming-0 Group 多岐選択のもう一つの方法-switch文-(p.117) 条件式の値が、定数式で表せるときは!! case 2: switch文 が便利 case 3: case 1: case 4: 式の値 = 3のとき、 case 3: の文を選択 switch~case 文の効果 case 5: その他 case 6: Prog-0 2013 Lec04-14 Copyright (C) 1999 - 2013 by Programming-0 Group switch-case文の書式 switch(式){ case 定数式1: 文1; 文2; … break; case 定数式2: … break; default: … break; } Prog-0 2013 Lec04-15 式の値と定数式の値が 等しい時、「:」に続く文を選択 12 複数の文を書けるが、{}は 必要ない! switch文か ら抜ける 13 どのcaseとも値が 不一致のとき選択 14 default中のbreakは なくても良い Copyright (C) 1999 - 2013 by Programming-0 Group 入賞者の判別プログラム (p.118) scanf("%d",&jyuni); switch(jyuni) { case 1: printf("一位\n"); break; 15 case 2: printf("二位\n"); break; case 3: printf("三位\n"); break; default: printf("残念\n"); } Prog-0 2013 Lec04-16 変数 jyuni の値によって 1なら「一位」と表示 2なら「二位」と表示 3なら「三位」と表示 1,2,3位以外なら 「残念」と表示 Copyright (C) 1999 - 2013 by Programming-0 Group switch~case文のポイント(1) 式の値は、整数(又は文字) 定数式の値は、整数(又は文字) default は、必ずcase文の最後に記述 一つのswitch-case文の中で、定数式の値が等 しい複数のcase文が存在するのは誤り 16 case 1: ... break; case 1: ... break; Prog-0 2013 Lec04-17 Copyright (C) 1999 - 2013 by Programming-0 Group switch~case文のポイント(2) 通常はcaseの最後に必ず break 文をつける。但し、意図して つけない場合は必ずコメントにてその旨を説明しておく 17 switch(month) { /* 以下の7つの月は同じ処理なのでbreak省略 */ case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("31日まである月\n"); break; default: printf("短い月\n"); } コメントとは? 「/*」と「*/」で囲まれた区間の事で、 この中に記述された事はプログラム には影響しない。 コメントにはこの例のような注意点 などのメモや、実行方法、作者名、日 付など後で見た時にプログラムを理 解し易くする事を記載する。 /home/course/prog0/public_html/2013/lec/source/lec04-4.c Prog-0 2013 Lec04-18 Copyright (C) 1999 - 2013 by Programming-0 Group 交通信号機:switch版(p.125) #include <stdio.h> main() { 見かけはif-else-if版より int signal; 長いが、読み易い printf("0:red, 1:green, 2:yellow : "); scanf("%d",&signal); switch(signal) { case 0: printf("Stop\n"); break; case 1: printf("Go\n"); break; case 2: printf("Be careful\n"); break; default: printf("Look at the traffic signal\n"); } /home/course/prog0/public_html/2013/lec/source/lec04-5.c } Prog-0 2013 Lec04-19 Copyright (C) 1999 - 2013 by Programming-0 Group 良くあるミス(if編1) {}のつけ忘れ このprintfはif文の外なの で、必ず実行される! if (a != b) a = b; printf("a,b were not equal\n"); 正しくは if (a != b){ a = b; printf("a,b were not equal\n"); } Prog-0 2013 Lec04-20 Copyright (C) 1999 - 2013 by Programming-0 Group 良くあるミス(if編2) if文の内で条件式の後ろに「;」をつけてし まう(a != b); if printf("a,b were not equal\n"); 正しくは 条件式に;を付けると、この printfはif文の外になり、常 に実行! if (a != b) printf("a,b were not equal\n"); Prog-0 2013 Lec04-21 Copyright (C) 1999 - 2013 by Programming-0 Group 良くあるミス(if編3) =と==の間違い a = 0; b = 1; if (a = b){ printf("a,b were equal\n"); } 正しくは 条件式中のaへの代入が実行され、 条件式の値はbの値(1,真)となる。 つまりa,bの値が異なるのに「a,b were equal」と表示されてしまう。 なお、これは文法ミスではないので、コン パイル時にエラーにはならない。 a = 0; b = 1; if (a == b){ printf("a,b were equal\n"); } Prog-0 2013 Lec04-22 Copyright (C) 1999 - 2013 by Programming-0 Group 良くあるミス(switch編1) switch文にbreakを付け忘れる switch(a){ case 1: printf("a=1\n"); /* break つけ忘れ */ case 2: printf("a=2\n"); break; .. } Prog-0 2013 Lec04-23 aが1の時、2つとも 表示される。 aが2の時は正常 に動作する。 Copyright (C) 1999 - 2013 by Programming-0 Group 良くあるミス(switch編2) case文に書けるのは整定数(又は文字定数*)だけ switch(a){ case 5.2: printf("a>5\n"); break; case 2: printf("a=2\n"); break; .. } 「case label does not reduce to an integer constant」 と言うメッセージが出てコンパイルエラーになる Prog-0 2013 Lec04-24 *注:文字に関しては後期プロ グラミングCにて習う Copyright (C) 1999 - 2013 by Programming-0 Group
© Copyright 2024 ExpyDoc