プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満 今回の講義内容 これまでのプログラム ・整数を入力し,その数が5の倍数かどうかを判定 ・月を入力して,その季節を表示 ・うるう年かどうかの判定 1回のプログラム実行で, 1回だけ判定 同じ判定を何回か繰り返すには? 第3回 プログラミング入門2 2 繰り返しの実現 同じ処理を繰り返すには・・・ プログラム中に同じ命令を何度も繰り返して書く? 数回なら良いが,数百回,数千回↑となったら… 条件により,繰り返し処理をするかをどうかを決定 C言語では, do~ while文 while文 for文 を用途に応じて使い分ける 第3回 プログラミング入門2 3 例題 ~ 繰り返し処理 問)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 4 例題 ~ 繰り返し処理 問)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 5 for 文による繰り返し処理 問)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回 プログラミング入門2 6 for文の構文説明 一定回数の繰り返し処理に使用 3つの部分からなる A B C for ( i=1; i <= 12; i++ ){ Aでiを1で初期化 b=8*i; printf( “%d\n“, b ); Bが満たされているか評価 × ループ本体 } i : 繰り返す回数を制御する ための変数(添え字) A 前処理: 繰り返しを行う前に一度だけ実行 ループを脱出 ○ ループ本体 を実行 Cを実行 B 制御式: 条件式Bを満たしていれば(非0ならば),ループの本体を実行 C 後処理: ループ本体の最後に実行 第3回 プログラミング入門2 7 for文の構文説明 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だけ増やす) 第3回 プログラミング入門2 8 for文の動作確認プログラム1 以下のプログラムを,値を変えて実行し,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 9 for文の動作確認プログラム2 以下のプログラムを,値を変えて実行し,for文の動作を理解 せよ。(カウントダウン) #include <stdio.h> int main(void) { int i; for ( i=12; i >=1 ; i-- ){ printf( “%d\n“, i ); 変更! } return (0); } 第3回 プログラミング入門2 10 for文 ~ 一定回数の繰り返し 読み込んだ整数の個数だけ,*を連続表示 ソースファイル名: list0413.c (p.76) #include <stdio.h> int main(void) { int i, no; printf(“input number:"); scanf("%d", &no); for (i = 1; i <= no; i++) putchar( ’*’ ); 文が一つだけなら, For文の{ }は省略可能 (if文と同様) putchar('\n'); putchar ( ’*’ ); return (0); ’’内の1文字を出力する命令 } 第3回 プログラミング入門2 11 for文 ~ 一定回数の繰り返し 説明 for (i = 1; i <= no; i++) putchar( ’*’ ); 1 ~ nまで, n回の繰り返し 出力結果は同じ for (i = 0; i < no; i++) putchar( ’*’ ); 第3回 プログラミング入門2 0 ~ n-1 まで, n回の繰り返し 12 do文 ~ 条件による繰り返しの制御 整数を入力し,それが5の倍数かどうかを判定する。 判定後,もう一度処理を続けるかどうかを確認して,要望に応じて 処理を繰り返す → プログラムを起動しなおす必要がなく,何度でも繰り返すことが可能と なる!! 第3回 プログラミング入門2 13 do文 ~ 条件による繰り返しの制御 #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); } while(cont == 0); return(0); } 第3回 プログラミング入門2 14 do文 の構文説明 構文 do { 文 } while(式) •「文」をまずは必ず一回は実行 •その後,式の値を評価し, •式の結果が非0(真)だったら、再度文を実行 •式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける do { 命令文 printf("Continue? Yes=0, No=9 : "); scanf("%d", &cont); cont は0 } while (cont == 0); cont は非0 第3回 プログラミング入門2 15 初期化子 (p.64) ソースファイル名: 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); } 第3回 プログラミング入門2 16 初期化子 ~解説 (p.64) 初期化: 変数の生成時に,指定された値である初期値を格納 変数宣言と初期化を同時に行う場合 int no = 1; 変数 no を宣言し,1で初期化 変数宣言と初期化を別に行う場合 int no; no = 1; 変数 no を宣言 noに1を代入 重要 変数を宣言する時には,特に不要でない限り, 必ず初期化を行うこと!! 初期化しない場合,変数には適当な値 がセットされている(値の保証がない) 第3回 プログラミング入門2 17 変数の値の変化を見てみよう 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 第3回 プログラミング入門2 while (no <= 5); 条件満たさず ループ脱出! 18 複合代入演算子 複合代入演算子 演算と代入を同時に実行 sum = sum + no; → 元々のsumの値にnoを足した値を,新しいsumとする(代入) no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入) 複合代入演算子を用いて 簡単に表すと・・・ sum += no; no += 1; sumの値をnoだけ増やす noの値を1だけ増やす 他に,-=, *=, /=, %= など 第3回 プログラミング入門2 19 複合代入演算子 複合代入演算子 演算と代入を同時に実行 sum = sum + no; → 元々のsumの値にnoを足した値を,新しいsumとする(代入) no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入) 複合代入演算子を用いて 簡単に表すと・・・ sum += no; no += 1; sumの値をnoだけ増やす noの値を1だけ増やす 他に,-=, *=, /=, %= など 第3回 プログラミング入門2 20 後置増分・減分演算子 後置増分・減分演算子 変数の値を1つだけ増やす,減らす no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入) 複合代入演算子を用いて 簡単に表すと・・・ no += 1; noの値を1だけ増やす 後置増分演算子を用いて 簡単に表すと・・・ no = no – 1; no -= 1; no -- ; no++; 後置減分演算子 後置増分演算子 第3回 プログラミング入門2 21 for文の中にも・・・ #include <stdio.h> int main(void) { int i; for ( i=1; i <= 12; i++ ){ printf( “%d\n“, i ); } i+=2 iを2づつ増やす return (0); } 第3回 プログラミング入門2 22 List4-4を書き換えると・・・ ・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 23 練習問題 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 24 while文による繰り返し処理 (p.68) 構文 while(式){ 文 } • 式の値を評価し, •式の結果が非0(真)の間,文を繰り返し実行 •式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける 最も簡単な繰り返し制御文 条件によっては,一度も文を実行しないこともある。 → do, while文は必ず一度文を実行 第3回 プログラミング入門2 25 While文の条件指定 ソースファイル名: loop.c #include <stdio.h> int main(void) { int i=0; 常に非0(真)! 無限に繰り返す! while ( 1 ) { i++; printf( “羊が%d匹”, i ); } return(0); 見飽きたら,CTRL+C で終了! } 第3回 プログラミング入門2 26 While 文の条件指定 100匹目まで数えたら,寝る #include <stdio.h> int main(void) { int i; カウンタ変数の初期化 i = 0; 繰り返しの条件 ? while ( ){ カウンタ変数のカウントアップ i++; printf( “羊が%d匹\n”, i ); } printf( “グーグー\n” ); return(0); for文と同じような動作 } 第3回 プログラミング入門2 27 while 文 ~ for文との違い i = 0; カウンタ変数の初期化 繰り返しの条件 while ( i < 100 ) { カウンタ変数のカウントアップ i++; printf( “羊が%d匹\n”, i ); } for ( i=1; i <= 100; i++ ) { printf( “羊が%d匹\n”, i ); } まとめて記述! For文: カウンタ変数の初期化と増減のさせ方,終了条 件をまとめて記述 → 見やすく簡潔な表現!! 第3回 プログラミング入門2 28 ループの脱出(break)とスキップ(contitue) ソースファイル名: 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 29 ループの脱出(break)とスキップ(contitue) ソースファイル名: 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 30 繰り返し処理 まとめ while文 最も単純 ある条件の真・偽で繰り返すかどうかを判定 場合によっては,一度も文を実行しないこともある do~while文 ある条件の真・偽で繰り返すかどうかを判定 必ず一度は文を実行 → 一度処理を実行し,その後キーボードからの入力により 繰り返し処理を行うかどうかを決める場合に有効 for文 一定回数だけ処理を繰り返す場合,while文よりも見やすく記述できる ※ループを強制的に終了: break ※ループをスキップ: continue 第3回 プログラミング入門2 31 今日の課題 (1/2ページ) 1.1~300までの13の倍数を全て表示せよ。また,1~300までの13の倍数の個数をカウン トして表示せよ。(for文かwhile文) ファイル名:kadai3-1.c 2. 読み込まれた整数値以下である正の2のべき乗の数を昇順に表示するプログラムを作成せよ。 例) 整数を入力してください : 19 2 4 8 16 ファイル名:kadai3-2.c 3.第3回演習で作成した月を数字で読込み,その月が何日あるかを表示するプ ログラムを,繰り返して判定できるように変更せよ。ただし,0を入力した時に,ループを終了するようにせよ。 (do – while文を使用) ファイル名:kadai3-3.c ポイント:入力された数が0でない間,処理を繰り返す 第3回 プログラミング入門2 32 今日の課題 (2/2ページ) 4.キーボードから生徒数を整数で入力し,その人数分のテストの点数 (0点~100点満点)を入力,点数の合計点と平均点を表示する プログラムを作成せよ。 ファイル名:kada3-4.c 注) ・人数分の点数の読込みと合計点算出には,繰り返し文を用いること! ・平均点は小数で求めること。 ソースファイル3つ(それぞれ,kadai4-1.c 〜 kadai4-3.c) をメールに 添付して提出せよ。 注:授業中にできた課題は授業中にチェックしてもらうこと。 注:授業中チェック済みの人も、メールにて課題を提出すること。 提出方法: メールの題名(subjet)を, pro2-4 学籍番号 自分の苗字 (全て半角英数文字にて)とする。 例) pro2-4 L02001 aoki 提出先: [email protected] (青木アドレス) 提出期限: 10月29日(月) 13:00まで(時間厳守) 第3回 プログラミング入門2 33 次回の講義予定 次回講義内容 配列 同じ型のデータの集合を効率良く扱うには? 第3回 プログラミング入門2 34
© Copyright 2024 ExpyDoc