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