Comments
Description
Transcript
1回のプログラム実行で
条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定 ・月を入力して,その季節を表示 1回のプログラム実行で, ・うるう年かどうかの判定 1回だけ判定 同じ判定を何回か繰り返すには? 第3回 プログラミング入門2 2 1 ソースファイル名: list0317.c 読み込んだ整数値を3で割った 剰余を表示(if文使用) /* 読み込んだ整数値を3で割った余りを表示 */ #include <stdio.h> int main(void) { int num; printf("整数を入力してください:"); scanf("%d", &num); 同じ式が2回登場 → 無駄? if (num % 3 == 0) puts(“3で割った余りは0です"); else if (num % 3 == 1) puts(" 3で割った余りは1です"); else puts(“3で割った余りは2です"); 処理を自分で記述 return (0); } 第2回 プログラミング入門2 3 単一の条件式の値によって,処理を複数に分岐させる場合 → if文よりも簡潔に記述できる! ソースファイル名: list0318.c /* 読み込んだ整数値を3で割った余りを表示 */ #include <stdio.h> int main(void) { int num; printf("整数を入力してください:"); scanf("%d", &num); switch ( num % 3 ) { case 0 : puts(“3で割り切れます ); break ; case 1 : puts(“余りは1です ); break ; case 2 : puts(“余りは2です ); break ; } return (0); } 第2回 プログラミング入門2 4 2 条件式① switch ( num % 3 ) { ①の値が 0の場合 case 0 : puts(“3で割り切れます ); break ; case 1 : puts(“余りは1です ); break ; case 2 : puts(“余りは2です ); break ; 1の場合 2の場合 } (Switch文終了) break で switch文を抜ける ()カッコ内の式を評価し,case で書かれた 値と一致するところにプログラムの流れを移行 プログラミング入門2 第2回 5 ソースファイル名: list0319.c /* switch文の動作を確認するプログラム */ #include <stdio.h> int main(void) { int sw; printf("整数を入力してください:"); scanf("%d", &sw); switch (sw) { case 1 : puts("A"); case 2 : puts("C"); case 5 : puts("D"); case 6 : case 7 : puts("E"); default : puts("F"); } return (0); } 第2回 puts("B"); break; break; break; break; 新しい default : break; がない break; がない switch文の動作を確認 プログラミング入門2 6 3 switch (sw) { case 1 case 2 case 5 case 6 case 7 : puts("A"); puts("B"); break; : puts("C"); : puts("D"); break; : : puts("E"); break; default : puts("F"); break; } “sw” が 1, 2, 5, 6, 7 以外の場合 第2回 プログラミング入門2 7 Switch文 → 単一の式の値によって,プログラムの流れを分岐 if 文 → 複数の式の値によって,複雑な条件判断 を行い,処理を分岐することができる 第2回 プログラミング入門2 8 4 同じ処理を繰り返すには・・・ プログラム中に同じ命令を何度も繰り返して書く? 数回なら良いが,数百回,数千回↑となったら… 条件により,繰り返し処理をするかをどうかを決定 C言語では, do∼ while文 while文 for文 を用途に応じて使い分ける プログラミング入門2 第3回 9 問)1から100までの8の倍数を全て表示しなさい。 例) #include <stdio.h> int main(void) { int a, b; a = 1; b = 8 * a; printf( “%d\n“, b ); a = 2; b = 8 * a; printf( “%d\n“, b ); ・・・・・・ ・・・・・・省略 a = 12; b = 8 * a; printf( “%d\n“, b ); return (0); } 第3回 プログラミング入門2 10 5 問)1から100までの8の倍数を全て表示しなさい。(for文使用) 例) #include <stdio.h> int main(void) { int b, i ; for ( i=1; i <= 12; i++ ){ b=8*i; printf( “%d\n“, b ); for文 } return (0); } 一定回数の繰り返し処理に使用 3つの部分からなる A B i : 繰り返す回数を制御する ための変数(添え字) C for ( i=1; i <= 12; i++ ){ Aでiを1で初期化 b=8*i; printf( “%d\n“, b ); Bが満たされているか評価 × ループ本体 } 11 プログラミング入門2 第3回 A 前処理: 繰り返しを行う前に一度だけ実行 ループを脱出 ○ ループ本体 を実行 Cを実行 B 制御式: 条件式Bを満たしていれば(非0ならば),ループの本体を実行 C 後処理: ループ本体の最後に実行 第3回 プログラミング入門2 12 6 A B C i : 繰り返す回数を制御する ための変数(添え字) for ( i=1; i <= 12; i++ ){ b=8*i; printf( “%d\n“, b ); Aでiを1で初期化 Bが満たされているか評価 ループ本体 } × ループを脱出 A 前処理: 添え字 i を1で初期化(1からスタート!) ○ ループ本体 を実行 Cを実行 B 制御式: i が12以下の間,ループの本体を実行 C 後処理: ループ本体を実行後, i++ (iの値を1だけ増やす) 13 プログラミング入門2 第3回 以下のプログラムを,値を変えて実行し,for文の動作を理解 せよ。(カウントアップ) #include <stdio.h> int main(void) { int i; 初期化の値 終了条件 for ( i=1; i <= 12; i++ ){ printf( “%d\n“, i ); } いくつずつ値を 増やすか? 例えば, i += 2 i += 3 などと変更してみると? return (0); } 第3回 プログラミング入門2 14 7 以下のプログラムを,値を変えて実行し,for文の動作を理解 せよ。(カウントダウン) #include <stdio.h> int main(void) { int i; for ( i=12; i >=1 ; i-- ){ 変更! printf( “%d\n“, i ); } return (0); } プログラミング入門2 第3回 15 読み込んだ整数の個数だけ,*を連続表示 ソースファイル名: list0413.c (p.76) #include <stdio.h> int main(void) { int i, no; printf(“input number:"); scanf("%d", &no); 文が一つだけなら, For文の{ }は省略可能 (if文と同様) for (i = 1; i <= no; i++) putchar( ’*’ ); putchar('\n'); putchar ( ’* ); return (0); } 第3回 内の1文字を出力する命令 プログラミング入門2 16 8 for (i = 1; i <= no; i++) putchar( ’*’ ); 1 ∼ nまで, n回の繰り返し for (i = 0; i < no; i++) putchar( ’*’ ); 0 ∼ n-1 まで, n回の繰り返し 第3回 プログラミング入門2 17 整数を入力し,それが5の倍数かどうかを判定する。 判定後,もう一度処理を続けるかどうかを確認して,要望に応じて処 理を繰り返す → プログラムを起動しなおす必要がなく,何度でも繰り返すことが可能とな る!! 第3回 プログラミング入門2 18 9 #include <stdio.h> ・ファイル名 : list0401.c (p.60) int main(void) { int cont; int no; do { これまでのプログラム printf("input number : "); scanf( "%d", &no ); if( no % 5 ) puts("5の倍数ではない"); else puts("5の倍数です"); printf("Continue? Yes=0, No=9 : "); scanf("%d", &cont); 繰り返し制御 (do ∼ while文) } while(cont == 0); return(0); } 19 プログラミング入門2 第3回 構文 do { 文 } while(式) • 「文」をまずは必ず一回は実行 • その後,式の値を評価し, • 式の結果が非0(真)だったら、再度文を実行 • 式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける do { 命令文 printf("Continue? Yes=0, No=9 : "); scanf("%d", &cont); cont は0 } while (cont == 0); cont は非0 第3回 プログラミング入門2 20 10 ソースファイル名: list0404.c 1から5までの和を求めて表示 ポイント: do文の動作理解と変数の初期化 #include <stdio.h> int main(void) { int no = 1; int sum = 0; do { sum = sum + no; no = no + 1; 注目! } while (no <= 5); printf( “1+2+3+4+5= %d\n", sum); return(0); } プログラミング入門2 第3回 21 初期化: 変数の生成時に,指定された値である初期値を格納 変数宣言と初期化を同時に行う場合 int no = 1; 変数 no を宣言し,1で初期化 変数宣言と初期化を別に行う場合 int no; no = 1; 変数 no を宣言 noに1を代入 重要 変数を宣言する時には,特に不要でない限り, 必ず初期化を行うこと!! 初期化しない場合,変数には適当な値 がセットされている(値の保証がない) 第3回 プログラミング入門2 22 11 List 4-4 : 1から5までの和を求めるプログラム int no = 1; int sum = 0; noを初期化(これを1∼5まで変化させる) 和を格納するための変数 do { sum = sum + no; no = no + 1; } while (no <= 5); ループ1回目 sum = 0 + 1; no = 1 + 1; → sum=1, no=2 ループ4回目 sum = 6 + 4; no = 4 + 1; → sum=10, no=5 ループ2回目 sum = 1 + 2; no = 2 + 1; → sum=3, no=3 ループ5回目 sum = 10+ 5; no = 5 + 1; → sum=15, no=6 no が5以下の間,繰り返す ループ3回目 sum = 3+ 3; no = 3 + 1; → sum=6, no=4 while (no <= 5); 条件満たさず ループ脱出! プログラミング入門2 第3回 23 複合代入演算子 演算と代入を同時に実行 sum = sum + no; → 元々のsumの値にnoを足した値を,新しいsumとする(代入) no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入) 複合代入演算子を用いて 簡単に表すと・・・ sum += no; no += 1; sumの値をnoだけ増やす noの値を1だけ増やす 他に,-=, *=, /=, %= など 第3回 プログラミング入門2 24 12 複合代入演算子 演算と代入を同時に実行 sum = sum + no; → 元々のsumの値にnoを足した値を,新しいsumとする(代入) no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入) 複合代入演算子を用いて 簡単に表すと・・・ sum += no; no += 1; sumの値をnoだけ増やす noの値を1だけ増やす 他に,-=, *=, /=, %= など 25 プログラミング入門2 第3回 後置増分・減分演算子 変数の値を1つだけ増やす,減らす no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入) 複合代入演算子を用いて 簡単に表すと・・・ no += 1; noの値を1だけ増やす 後置増分演算子を用いて 簡単に表すと・・・ no = no – 1; no -= 1; no -- ; no++; 後置減分演算子 後置増分演算子 第3回 プログラミング入門2 26 13 #include <stdio.h> int main(void) { int i; for ( i=1; i <= 12; i++ ){ printf( “%d\n“, i ); i+=2 iを2づつ増やす } return (0); } プログラミング入門2 第3回 27 ・list0404を複合代入演算子,後置増分演算子を使って書き換えよ。 #include <stdio.h> int main(void) { int no = 1; int sum = 0; do { sum += no; no ++; } while (no <= 5); printf( “1+2+3+4+5= %d\n", sum); return(0); } 第3回 プログラミング入門2 28 14 List4-6を do-while文でなく, for文で実現せよ。 時間: 5分 #include <stdio.h> int main(void) { int i; int sum = 0; for ( i=1; i <=5; i++) { sum += i; } printf( “1+2+3+4+5= %d\n", sum); return(0); } 第3回 プログラミング入門2 29 構文 while(式){ 文 } • 式の値を評価し, • 式の結果が非0(真)の間,文を繰り返し実行 • 式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける 最も簡単な繰り返し制御文 条件によっては,一度も文を実行しないこともある。 → do, while文は必ず一度文を実行 第3回 プログラミング入門2 30 15 ソースファイル名: loop.c #include <stdio.h> int main(void) { int i=0; 常に非0(真)! 無限に繰り返す! while ( 1 ) { i++; printf( “羊が%d匹”, i ); } return(0); 見飽きたら,CTRL+C で終了! } プログラミング入門2 第3回 31 100匹目まで数えたら,寝る #include <stdio.h> int main(void) { int i; カウンタ変数の初期化 i = 0; 繰り返しの条件 ? while ( ) { カウンタ変数のカウントアップ i++; printf( “羊が%d匹\n”, i ); } printf( “グーグー\n” ); return(0); } 第3回 for文と同じような動作 プログラミング入門2 32 16 i = 0; カウンタ変数の初期化 繰り返しの条件 while ( i < 100 ) { カウンタ変数のカウントアップ i++; printf( “羊が%d匹\n”, i ); } for ( i=1; i <= 100; i++ ) { printf( “羊が%d匹\n”, i ); } まとめて記述! For文: カウンタ変数の初期化と増減のさせ方,終了条 件をまとめて記述 → 見やすく簡潔な表現!! プログラミング入門2 第3回 33 ソースファイル名: break.c #include <stdio.h> int main(void) { int i; for ( i=0; i < 10; i++ ){ if( i == 5 ){ break; } printf( “%d\n“, i ); ループを 強制的に脱出 } return (0); } 第3回 プログラミング入門2 34 17 ソースファイル名: continue.c #include <stdio.h> int main(void) { int i; for ( i=0; i < 10; i++ ){ if( i == 5 ){ continue; } printf( “%d\n“, i ); iが5の時だけ, ループを飛ばす } return (0); } 第3回 プログラミング入門2 35 while文 最も単純 ある条件の真・偽で繰り返すかどうかを判定 場合によっては,一度も文を実行しないこともある do∼while文 ある条件の真・偽で繰り返すかどうかを判定 必ず一度は文を実行 → 一度処理を実行し,その後キーボードからの入力により 繰り返し処理を行うかどうかを決める場合に有効 for文 一定回数だけ処理を繰り返す場合,while文よりも見やすく記述できる ※ループを強制的に終了: break ※ループをスキップ: continue 第3回 プログラミング入門2 36 18 1.Switch文を使用し,月を数字で読込み,その月が何日あるかを表示するプログラムを作 れ。なお、1 12以外の数字を入力した際には、”1 12までの数字を入力してくださ い”と表示すること。 ただし, ・2月 →28日 ・ 4, 6, 9, 11 → 30日 ・1,3,5,7,8,10,12 → 31日 ファイル名:kadai3-1.c 2. 読み込まれた整数値以下である正の2のべき乗の数を昇順(小さい順)に表示するプログラムを作 成せよ。 例) 整数を入力してください : 19 2 4 8 16 ファイル名:kadai3-2.c 3.Kadai3-1 で作成した月を数字で読込み,その月が何日あるかを表示するプ ログラムを,繰り返して判定できるように変更せよ。ただし,0を入力した時に,ループを終了するようにせよ。 (do – while文を使用) ポイント:入力された数が0でない間,処理を繰り返す ファイル名:kadai3-3.c 第3回 プログラミング入門2 37 4.キーボードから生徒数を整数で入力し,その人数分のテストの点数 (0点∼100点満点)を入力,点数の合計点と平均点を表示する プログラムを作成せよ。 ファイル名:kada3-4.c 注) ・人数分の点数の読込みと合計点算出には,繰り返し文を用いること! ・平均点は小数で求めること。 第3回 プログラミング入門2 38 19 次回講義内容 配列 同じ型のデータの集合を効率良く扱うには? 第3回 プログラミング入門2 39 20