CプログラミングⅠ
繰り返し処理 : for文
繰り返し処理
例えば,“ Hello World ! ”を10回出力したいとき
繰り返し文 を使うと
文字列を10回表示する
1:2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
#include <stdio.h>
int main(void) {
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
printf("Hello World !¥n");
return 0;
}
メンドクサイ!
繰り返し文を用いる
1:2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#include <stdio.h>
int main(void) {
int i;
for(i = 0; i < 10; i++) { printf("Hello World !¥n");
}
return 0;
}
スッキリ!
繰り返し処理
繰り返し処理とは
同じ処理を何度も繰り返す
プログラム制御の基本の一つ
C言語での繰り返し処理
次の繰り返し文を用いて記述できる
for文
while文
do~while文
繰り返しの例1
資格試験に合格するまでは
勉強して,試験を受け続ける.
カウントが200未満
腕立てする.
カウントを1増やす.
腕立て伏せ 資格取得 200回
繰り返しの例2
繰り返し処理 : for文
for文
初期値設定
条件式
文
後処理 真
偽
① 初期値設定(初期化)
② 条件式の判定
③-1 条件式の判定結果が真の場合
ブロック内の文を実行した後,後処理を実行し,
②に戻る
③-2 条件式の判定結果が偽の場合
ブロック内の文を実行せずに繰り返しを終了する
条件式が真の間 ブロック内の文を 繰り返し実行する for文の書式
for( 初期値設定 ; 条件式 ; 後処理 ){
文;
文;
:
}
繰り返し処理 : for文
for文のプログラム例
for文による文字列の繰り返し表示 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>
int main(void) {
int i;
for(i = 0; i < 3; i++ ) { printf("Hello World !¥n");
}
return 0;
}
① i に0を初期設定( i に0を代入)
② i(=0)は3より小さいか?を判定
③ 小さいので,printf文を実行,
④ i を1増やす( i ←1)
⑤ i(=1)は3より小さいか?を判定
⑥ 小さいので,printf文を実行,
⑦ i を1増やす( i ←2)
⑧ i(=2)は3より小さいか?を判定
⑨ 小さいので,printf文を実行,
⑩ i を1増やす( i ←3)
⑪ i(=3)は3より小さいか?を判定
⑫ 小さくない(等しい)ので,
printf文を実行せずに繰り返し終了
① ⑪⑧⑤② ⑩⑦④
③ ⑥ ⑨
繰り返し処理 : for文
for文のプログラム例
for文による文字列の繰り返し表示 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>
int main(void) {
int i;
for(i = 0; i < 3; i++ ) { printf("Hello World !¥n");
}
return 0;
}
for文の処理を書き下すと・・・
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
i = 0;
if(i < 3){
printf("Hello World !¥n");
i++;
}
if(i < 3){
printf("Hello World !¥n");
i++;
}
if(i < 3){
printf("Hello World !¥n");
i++;
}
if(i < 3){
printf("Hello World !¥n");
i++;
} iは4実行されないになっているので
繰り返し処理 : for文
for文のフローチャート
式2
処理 真 for 偽
式3
式1
式1; 式2; 式3処理
フローチャート1
フローチャート2 繰り返し終了
この講義では,なるべく フローチャート1 の記述法を用いる.
for ( 式1; 式2; 式3 ) { 文;
・ ・ ・ }
初期化 繰り返し条件
値の更新
(後処理)
処理内容
どちらも同じ処理内容
を意味する
繰り返し処理 : for文
i <= 5 start
真
for偽
i++
i = 1
i=1; i<=5; i++
start
end
終了
i繰り返して います.
繰り返しが終 わりました.
繰り返して います.
繰り返しが終 わりました.
end
文字列を5回表示する
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
#include <stdio.h>
int main(void) {
int i;
for(i = 1; i <= 5; i++){
printf("繰り返しています.¥n");
}
printf("繰り返しが終わりました.¥n");
return 0;
}
for文のフローチャート例
実行結果
繰り返しています.
繰り返しています.
繰り返しています.
繰り返しています.
繰り返しています.
繰り返しが終わりました.
繰り返し処理 : for文
for文のプログラム例
繰り返し処理の中での変数の利用
繰り返し処理の中での変数の利用
1:2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
#include <stdio.h>
int main(void) {
int i;
for(i = 1; i <= 5; i++){
printf("%d番目の繰り返しです.¥n", i);
}
printf("繰り返しが終わりました.¥n");
return 0;
}
実行結果
1番目の繰り返しです.
2番目の繰り返しです.
3番目の繰り返しです.
4番目の繰り返しです.
5番目の繰り返しです.
繰り返しが終わりました.
繰り返し処理の中で 変数 i を利用する
繰り返しのたびに
値が1増える
繰り返し処理 : for文
for文のプログラム例
繰り返し処理の中での変数の利用
繰り返し処理の中での変数の利用
1:2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
#include <stdio.h>
int main(void) {
int i;
for(i = 1; i <= 5; i++){
printf("%d番目の繰り返しです.¥n", i);
}
printf("繰り返しが終わりました.¥n");
return 0;
}
実行結果
1番目の繰り返しです.
2番目の繰り返しです.
3番目の繰り返しです.
4番目の繰り返しです.
5番目の繰り返しです.
繰り返しが終わりました.
① i に1を初期設定(
iに
1を代入)
② i(
= 1)は
5以下か?
③
5以下なので,1番目… を表示
④
i++を実行(
i← 2 )
⑤ i(
= 2 )は 5以下か?
⑥
5以下なので,2番目… を表示
⑦
i++を実行(
i← 3 )
⑧ i(
= 3)は
5以下か?
⑨
5以下なので,3番目… を表示
⑩
i++を実行( i ← 4 )
⑪ i(
= 4)は
5以下か?
⑫
5以下なので,4番目… を表示
⑬
i++を実行( i ← 5 )
⑭ i(
= 5)は 5以下か?
⑮
5以下なので,5番目… を表示
⑯
i++を実行( i ← 6 )
⑰
i(
= 6)は
5以下か?
⑱
5以下ではないので,繰り返し終了
⑲ 繰り返しが終わりました 表示
式の値
for文における条件式の判定 : 「式の値」の判定
0以外 0
① 初期値設定
② 式の値を判定
③-1 式の値が0以外の場合,
文を実行(複数の文があれば,それらを実行)した後,
後処理を実行し,②に戻る
③-2 式の値が0の場合,
文を実行せずに繰り返しを終了する
式の値が0以外の間 文を繰り返し実行する
初期値設定
式の値
文
後処理
for文の書式
for( 初期値設定 ; 式の値 ; 後処理 ){
文;
文;
:
}
式の値
条件式の値
条件式が成り立つ(真)とき 条件式の値は1
条件式が成り立たない(偽)とき 条件式の値は0
代入文の値
代入した値が,代入文(式)の値となる
たとえば,「 i = 5;」 という代入文の値は 「5」 となる.
for(i = 5; i = 5; i++) { printf("iの値は%d¥n", i);
}
“ i の値は5”が繰り返しずっと出力される i に5が代入され続ける(式の値が5)
for(i = 5; i == 5; i++) { printf("iの値は%d¥n", i);
}
“ i の値は5”が1回だけ出力される
i が5と等しいのが最初の1回のみ
入力した数だけ*を出力
1:2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
#include <stdio.h>
int main(void) {
int num;
int i;
printf("いくつ*を出力しますか?¥n");
scanf("%d",&num);
for(i = 1; i <= num; i++){
printf("*");
}
printf("¥n");
return 0;
}
for文の応用
start
end
"*"の出力.
改行
いくつ*を出力しますか?
numに入力
実行結果
いくつ*を出力しますか?
8[Enter]
********
入力値に応じた繰り返し処理(1)
i
が
1から
numまで 処理(*の出力)を繰り返す
繰り返しの 回数を入力
num個の*が出力される
入力した個数の*が出力
i <= num i = 1
i++
真
偽
for文の応用
num = 5 の場合 i = 1 * を 1個表示
i = 2 * を 1個表示(1個目の * の右隣に表示)
i = 3 * を 1個表示(2個目の * の右隣に表示)
i = 4 * を 1個表示(3個目の * の右隣に表示)
i = 5 * を 1個表示(4個目の * の右隣に表示)
i = 6 繰り返し終了 改行を表示
入力値に応じた繰り返し処理(1)
「入力した数だけ * を出力」の 実行過程
start
end
"*"の出力.
改行
いくつ*を出力しますか?
numに入力
i <= num i = 1
i++
真
偽
実行結果
いくつ*を出力しますか?
5[Enter]
*****
入力した数までの合計を求める
1:2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
#include <stdio.h>
int main(void) {
int num=0,sum=0;
int i;
printf("いくつまでの合計を求めますか?¥n");
scanf("%d",&num);
for(i = 1; i <= num; i++){
sum += i;
}
printf("1から%dまでの合計値は%dです.¥n", num, sum);
return 0;
}
for文の応用
実行結果
いくつまでの合計を求めますか?
10[Enter]
1から10までの合計値は55です.
入力値に応じた繰り返し処理(2)
1 + 2 + 3 + ... + num
の値を 計算するプログラム
sum
に
iの値(1, 2, ... , num) を次々と足していく
start
end
合計はsumです いくつまでの合計?
numに入力
i <= num i = 1
i++
num=0 sum=0
sum += i
真 偽
for文の応用
num = 5 の場合
i = 1 sum + 1 を sum に代入 (sumの値は 1 ) i = 2 sum + 2 を sum に代入 (sumの値は 3 ) i = 3 sum + 3 を sum に代入 (sumの値は 6 ) i = 4 sum + 4 を sum に代入 (sumの値は 10 ) i = 5 sum + 5 を sum に代入 (sumの値は 15 ) i = 6 繰り返し終了
sum=0
sum には 1 + 2 + 3 + 4 + 5 の値が入る 繰り返し開始前
入力値に応じた繰り返し処理(2)
「入力した数までの合計を求める」の 実行過程
start
end
合計はsumです いくつまでの合計?
numに入力
i <= num i = 1
i++
num=0 sum=0
sum += i
真 偽
文のネスト
ネスト
入れ子(箱の中に箱が入っている)
プログラミング言語では,なんらかの構文中の処理の中に 構文を記述することを『ネスト』するという
for文のブロック中にfor文を記述する(2重ループ)
for文のネスト
構文
for (式1-1; 式1-2; 式1-3) {
・ ・ ・
for (式2-1; 式2-2; 式2-3) {
・ ・ ・
}}
for ( ) {
}
for
文の中に
for文を書ける
for ( ) { }
for文をネストする 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>
int main(void) {
int i, j;
for(i = 0; i < 5; i++){
for(j = 0; j < 3; j++){
printf("iは%d:jは%d¥n", i, j);
} }
return 0;
}
文のネスト
iは0:jは0 iは0:jは1 iは0:jは2 iは1:jは0 iは1:jは1 iは1:jは2 iは2:jは0 iは2:jは1 iは2:jは2
実行 結果
iは3:jは0iは3:jは1 iは3:jは2 iは4:jは0 iは4:jは1 iは4:jは2
ネストした ブロックは 一段字下げ
for文をネストする
for文がネストされている
start
end j < 3 j = 0
i++
i=0
j++
真
偽
"iは%d:jは%d¥n"
i < 5
真 偽
for文をネストする 1:
2:
3:
4:
5:
6:
7:
8:
9:
int i, j;
for(i = 0; i < 5; i++){
for(j = 0; j < 3; j++){
printf("iは%d:jは%d¥n", i, j);
} }
文のネスト
for文をネストする 実行結果
iは0:jは0 iは0:jは1 iは0:jは2 iは1:jは0 iは1:jは1 iは1:jは2 iは2:jは0 iは2:jは1 iは2:jは2 iは3:jは0 iは3:jは1 iは3:jは2 iは4:jは0 iは4:jは1 iは4:jは2
i
が
0のとき,
j が
0, 1, 2と 繰り返される
i
が
1となったとき,
j
の値が
0に 初期化された上で
1, 2と繰り返される
iが
2となったとき,
j
の値が
0に 初期化された上で
1, 2と繰り返される
i
が
4となったとき,
j
の値が
0に 初期化された上で
1, 2と繰り返される
内側ループによりprintf文が3回実行されることが,
外側のループにより5回繰り返される
if文との組み合わせ 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14 15:
16:
17:
18:
19 20:
#include <stdio.h>
int main(void) {
int i, j, ch = 0;
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++){
if(ch == 0){
printf("*");
ch = 1;
} else{
printf("-");
ch = 0;
} }
printf("¥n");
}
return 0;
}
文のネスト
i=0; i<5; i++
start
end
j=0; j<5; j++
終了
i終了
jch==0
"*" "-"
ch=1 ch=0
真
if偽
改行
ch=0
if文との組み合わせ
実行結果
*-*-*
-*-*-
*-*-*
-*-*-
"*"の次は"-"を
出力するように
chを1にする
"-"の次は"*"を
出力するように
chを0にする
内側のループが
終了したら改行する
① i に
0を代入
②
iは
5より小さいか?
③
5より小さいので,内側の繰り返し実行
④
jに
0を代入
⑤
j( = 0)は
5より小さいか?
⑥
5より小さいので,if文実行
⑦
ch(
= 0)は
0か?
⑧
0なので
* を表示⑨
chに
1を代入
⑩
j++を実行(
jに
1が入る)
⑪
j( = 1)は
5より小さいか?
⑫
5より小さいので,if文実行
⑬
ch(⑨で
1が入った)は
0か?
⑭
0ではないので
-を表示
⑮
chに
0を代入
⑯
j++を実行(
jに
2が入る)
⑰
j( = 2)は
5より小さいか?
⑱
5より小さいので,if文実行
⑲
ch(⑮で
0が入った)は
0か?
⑳
0なので
* を表示㉑
chに
1を代入
㉒
j++を実行(
jに
3が入る)
if文との組み合わせ 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14 15:
16:
17:
18:
19 20:
#include <stdio.h>
int main(void) {
int i, j, ch = 0;
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++){
if(ch == 0){
printf("*");
ch = 1;
} else{
printf("-");
ch = 0;
} }
printf("¥n");
}
return 0;
}
文のネスト
if文との組み合わせ
実行結果
*-*-*
-*-*-
*-*-*
㉓
j( = 3)は
5より小さいか?
㉔
5より小さいので,if文実行
㉕
ch(㉑で
1が入った)は
0か?
㉖
0ではないので
-を表示
㉗
chに
0を代入
㉘
j++を実行(
jに
4が入る)
㉙
j( = 4)は
5より小さいか?
㉚
5より小さいので,if文実行
㉛
ch(㉗で
0が入った)は
0か?
㉜
0なので
* を表示㉝
chに
1を代入
㉞
j++を実行(
jに
5が入る)
㉟
j( = 5)は
5より小さいか?
㊱
5より小さくないので内側繰り返し終了
㊲ 改行を表示
㊳
i++を実行(
iに
1が入る)
㊴
iは
5より小さいか?
㊵
5より小さいので,内側の繰り返し実行
㊶
jに
0を代入
※ ㉝で
chに
1が入ったので 次は
-から表示される
if文との組み合わせ1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14 15:
16:
17:
18:
19 20:
#include <stdio.h>
int main(void) {
int i, j, ch = 0;
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++){
if(ch == 0){
printf("*");
ch = 1;
} else{
printf("-");
ch = 0;
} }
printf("¥n");
}
return 0;
}
文のネスト
if文との組み合わせ
実行結果
*-*-*
-*-*-
*-*-*
-*-*-
講義のまとめ
繰り返し処理
同じ処理を何度も繰り返す
プログラム制御のひとつ
for文
前判定繰り返し処理
繰り返しの回数が分かっている場合に用いられること が多い
文のネスト
箱の中に箱が入っているのと同じように,for文の中に for文が入っている(2重ループ)