第6回[平成15年5月29日(木)]:PN03ー06.ppt 多岐選択(switch文)と 繰り返し構造 (do文、while文) 今日の内容 1 2 3 4 5 構造化プログラム、選択構造(if文)(復習) 論理演算子と演算子の優先順位 多岐選択構造(switch文) 繰り返し構造(do文、while文) 演習 皆さんのレポートから 理解度:75%(4人) • ちょうどよかった。比較的簡単だ。 • 演習問題は、解説を聞けば分かるのだが、自分 では、なかなか答えられない。問題を出されると、 すぐできない。 → たくさん問題を解いて慣れていくのが良い • 2時限目には1時限目と同じ説明をする必要はな いと思う。2時限目は課題だけをセンターモニター に出しておいて、実践をもっとさせるべきです。 → 皆さんの意見を聞いてから実施しましょう。 • もう少し速くても良い。 pptの印刷を忘れず • 復習をもう少しやってほしい。に持参して下さい! • もっと詳しく説明してほしい。 復習 構造化プログラミング • 順次構造 A B • 選択構造 true 判断 ・二者択一、 複数場合分け A ・if文、switch文 false B • 繰り返し(反復)構造 ・定数回繰り返し、前判断、後判断 ・for文、while文、do文 どの構造も入口と出口 が一つだけ false 判断 true A 選択構造 復習 • 条件判断によって処理を選択していく構造 • 判断の結果は 非0 : true(Yes) または true false 0 : false(No) 条件 if (条件) 文1 //true 文1 文2 else 文2 //false 菱形の中:0又は非0の結果を持つ式 関係演算子と等価演算子(p.42-) 復習 • 関係演算子:値の大小関係を比較する 関係成立:1(true)、不成立:0(false) a < b aがbより小さいなら 1(条件成 立) a <= b aがbより小さいか等しいなら 1 a > b aがbより大きいなら 1 a >= b aがbより大きいか等しいなら 1 • 等価演算子:値が等しいかどうかを判定する 関係成立:1(true)、不成立:0(false) a == b aとbが等しいなら 1 a != b aとbが等しくないなら 1 論理演算子(p.52-) p,q は 非0(true,1)又は0(false)とする • 論理否定演算子(!) → !p p が非0(true,1) ならば !p は 0(false) 0(false) 1(true) • 論理AND演算子(&&) → p && q pとqが共に非0(true,1) の時のみ 1(true) • 論理OR演算子(||) → p || q 演算子の優先順位:教科書177頁を常に参照 pとqのいずれかが非0(true,1)なら 論理演算:真(○)偽(×)値表 p q p && q p || q !p !q ○ ○ ○ ○ × × ○ × × ○ × ○ × ○ × ○ ○ × × × × × ○ ○ 演 算 の 優 先 順 位 177 頁 順 位 高 低 種 類 論理否定 乗除演算 加減演算 関係演算 等価演算 論理 AND 論理 OR 代入 演 算 子 ! * / % + < > <= >= = = != && || = 演習 次のif文で、年齢(age)が20歳以上 かつ所持金(money)が1000円以上の 場合、に変更してみよう if ( { ) puts("You can drink beer"); puts("You can drink wine"); } else 演算子の優先順位 < > <= >= == != 0(false) a=1; b=2; c=3; d=4; a != b < c && 1(true) a <= b && c == d 1(true) 0(false ) a == b >= c || d 0(false)0(false) 0(false ) || 1(true) 値4は非0(true) 演習(1) a,b,c,d,L を以下のような型と値を持つ 変数とするとき、次の論理式の値を求めよ。 double a = 5.7 ; int c = 7 ; double b = 8.2 ; int d = 4 ; char L = ‘W’ ; 変数宣言の時 (1) a < b 初期値を入れる (2) L == ‘$’ ことが出来る (初期化) (3) ‘q’ < ‘r’ (4) -(a-b) > 2.0 (5) (c <= d) || (a == b) 演習(2) a,b,c,d,L を以下のような型と値を持つ 変数とするとき、次の論理式の値を求めよ。 double a = 5.7 ; int c = 7 ; double b = 8.2 ; int d = 4 ; char L = ‘W’ ; (6) !(5 == d + 1) (7) c+d == (c ? 10 : 11) (8) 1 || b <= 8 (9) (a > 0) && (c != 7) (10) c*d == L - 59 演習(3) 次の数学上での条件を論理式で表現せよ (1) x = 5 (2) x ≠ 0 (3) x ≧ 2 (4) 0 < x ≦ 10 (5) x < 0 または x > 10 (6) xは負 または 5 以上で 10 を除く値 演習(4) 西暦 y 年が閏年かどうかを表示せよ ・[yが、4で割り切れて100で割り切れないか、 400で割り切れる年が閏年である] ・『 「 y が 4 で割り切れる」 かつ 「 y が 100 で割り切れない」 』 または 『 y が 400 で割り切れる』 if( ( || else && ) ) puts("閏年だ"); puts("閏年じゃあない"); 多岐選択(p.54-) • 複数の選択肢から選ぶ • 式の値によって処理を選択 • 選択肢は幾つあっても良い • 以下の処理を避けるために break文を使う •該当する選択肢が無い場合 は、その他の処理を実行 •その他は無くても良い break 式 値1 処理A 値2 処理B 値3 処理C その他 処理D switch文 • ラベルは式の取りうる値 • break により switch文を抜ける switch (式) { case ラベル1 : 文1 break; case ラベル2 : 文21 文22 break; case ラベル30 : case ラベル31 : 文31 case ラベル32 : 文32 break; : default : 文n [break;] } defaultの部分は省略可能 switch文の例 • month を調べて、日数を days に与える • month が 1~12 以外の時は ‘入力ミ ス’と出力する switch ( month ) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: days = 28; break; default : printf("入力ミス");break;} 演習 • 入力された 年(year) と 月(month) から、その月の 日数(days) を与える プログラム(部分)を switch文 で書け year と month は入力済みとす る month を調べて days を与える ただし、month が 2 の時は、 year の値によって、閏年かどうかを 判断し、 days を与える switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: _________; ______ case 4: ________________________ days = 30; ______ case 2:if ( _____________________ ____________________ _____________________ ) days = 29; else days = 28; _______ _________ printf("月の入力ミス"); } 不定数回の繰り返し(反復)構造 ・不定数回反復とは 繰返しの回数が、前もって分からない反復 ・継続条件式が満たされている間は繰り返す do 文 while (条件式); do {文1 ... 文n} while (条件 式); 実行したい文が複数ある→複合文,複文 while (条件式) 文 while (条件式) {文1 文2 ... 文 do文 • 継続条件式が真(true)の間は文繰り返す do 文 while ( 条件式 ); do { 文1 ... 文n } while ( 条件 式 ); k = 1; do { printf("A"); k = k + 1; } while( k<=20000 ); k=1; printf("A"); k = k + 1; true k<=20000 反復を繰り返す条件 false while文 • 継続条件式が 真(true)の間は文を繰り返す while ( 条件式 ) 文 while ( 条件式 ) {文1 文2 ... 文n} 反復を続ける条件 k = 1; while ( k<=20000 ) { printf("A"); k = k + 1; } k=1; false k<=20000 true printf("A"); k = k + 1; 今回の課題 • キーボードから負の整数が入力されるまで、 整数を入力しそれらを個数を求める部分を 書け。(doの場合とwhileの場合を書く) int a, count=0; do { printf("整数=>"); scanf("%d",&a); if ( ) count = ; } while ( ); 提出用紙に質問・意見・感想・提案等も書いて下さい 今回の課題(続き:do場合の別解) int a, count=0; printf("整数=>"); scanf("%d",&a); if ( a >= 0 ) do { ; printf("整数=>"); scanf("%d",&a); } 今回の課題(続き:whileの場合) int a, cnt=0; printf("整数=>"); scanf("%d",&a); while ( ) { ; printf("整数=>"); scanf("%d",&a); } いずれの場合も結果出力の部分は省略した P入門(第6回)は 終了です。 次回(第7回)は 6月5日 続いて、P演習に入ります。 では、しばらく休憩します。
© Copyright 2024 ExpyDoc