Document

プログラミング入門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