. .
Cプログラミング入門
(2018)
第6回 ─ 制御構造:繰り返し ─ 松田七美男 2018年5月24日繰り返し
.
.
パラメータを変化させながら同じ様な処理
を繰り返し実行する機構
必要な構成要素
I制御変数
:初期化,
(
継続
)
判定,調整
I構文:
while (
判定式
)
文
do
文
while (
判定式
);
for (
初期化式
;
判定式
;
調整式
)
文
繰り返し
.
.
パラメータを変化させながら同じ様な処理
を繰り返し実行する機構
必要な構成要素
I制御変数
:初期化,
(
継続
)
判定,調整
I構文:
while (
判定式
)
文
do
文
while (
判定式
);
for (
初期化式
;
判定式
;
調整式
)
文
while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.while
文
. .int i = 0;
while (
i < 100
) {
printf("i = %3d\n", i);
i++;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出.例題:
ex15.c
int main(int argc, char **argv) {
int i = 10, imax; printf("imax = "); scanf("%d", &imax); while (i <= imax) {
printf("i = %3d\t i**2 = %5d\n", i, i * i); i++; } return 0; } . コンパイル命令 . . .
例題:
ex15.c
int main(int argc, char **argv) {
int i = 10, imax; printf("imax = "); scanf("%d", &imax); while (i <= imax) {
printf("i = %3d\t i**2 = %5d\n", i, i * i); i++; } return 0; } . コンパイル命令 . . .
do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出do while
文
. .int i = 0;
do {
printf("i = %3d\n", i);
i++;
} while (
i < 100
) ;
. . 制御変数i
の初期化 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 継続条件の判定:2<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=3
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 内容本体の処理 3 制御変数 i の調整(1増加) 4 継続条件の判定 以下継続条件が真である限り2 – 4を繰り返す 4’ 継続条件が偽となって,ループから脱出例題:
ex16.c
int main(int argc, char **argv) {
int i = 10, imax; printf("imax = "); scanf("%d", &imax); do {
printf("i = %3d\t i**2 = %5d\n", i, i * i); i++; } while (i <= imax); return 0; } . コンパイル命令 . . .
例題:
ex16.c
int main(int argc, char **argv) {
int i = 10, imax; printf("imax = "); scanf("%d", &imax); do {
printf("i = %3d\t i**2 = %5d\n", i, i * i); i++; } while (i <= imax); return 0; } . コンパイル命令 . . .
for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出for
文
. .for (
i = 0
;
i < 100
;
i++
) {
printf("i = %3d\n", i) ;
}
. . 制御変数i
の初期化 . 継続条件の判定:0<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=1
. 継続条件の判定:1<100
より真 . 内容本体の処理 . 制御変数i
の調整:i=2
. 継続条件の判定:100>=100
より偽 1 制御変数 i の初期化 2 継続条件の判定 3 内容本体の処理 4 制御変数 i の調整(1増加) 以下継続条件が真である限り2 – 4を繰り返す 2’ 継続条件が偽となって,ループから脱出例題:
ex17.c
int main(int argc, char **argv) {
int i, imax;
printf("imax = "); scanf("%d", &imax);
for (i = 10; i <= imax; i++) {
printf("i = %3d\t i**2 = %5d\n", i, i * i); } return 0; } . コンパイル命令 . . .
例題:
ex17.c
int main(int argc, char **argv) {
int i, imax;
printf("imax = "); scanf("%d", &imax);
for (i = 10; i <= imax; i++) {
printf("i = %3d\t i**2 = %5d\n", i, i * i); } return 0; } . コンパイル命令 . . .
例題:
ex18.c
二重ループ
int main(int argc, char **argv) { int i, j, n; for (i = 0; i < 16; i++) { for (j = 0; j < 8; j++) { n = 8 * i + j; printf("%3d(x%02x) ", n, n); } printf("\n"); } return 0; }
無条件分岐
. .判定なしに,無条件で指定された場所に制御を移す
命令
return 関数の実行を終了して呼び出し元に戻る. break 繰り返し文やswitch文の外側(直後の文)に抜 ける. continue 繰り返し文において,繰り返し本体の残り部分を 飛ばす. goto 同じ関数内の任意の位置(ラベル名で指定)に 跳ぶ.無条件分岐
. .判定なしに,無条件で指定された場所に制御を移す
命令
return 関数の実行を終了して呼び出し元に戻る. break 繰り返し文やswitch文の外側(直後の文)に抜 ける. continue 繰り返し文において,繰り返し本体の残り部分を 飛ばす. goto 同じ関数内の任意の位置(ラベル名で指定)に 跳ぶ.例題:
ex19.c
int main(int argc, char **argv) { char c; while (1) { printf("Input a character "); scanf(" %c", &c); if (c == ’q’ || c == ’Q’) break; printf("%c\n", c); } printf("Now quit\n"); return 0; }