Document

第5章
制御文
制御式を書
く
if (aa > 100)
bb = 200;
else
bb = 300;
ーこの条件が取れたら
ーこれを実行
ーそうでなければ
ーこれを実行
単一文を制御す
る
int i;
for (i=1; i<=3; i++)
printf(“aaaa\n”);
-3回繰り返せ
-この文を
int i;
for (i=1; i<=3; i++)
printf(“aaaa\n”);
printf(“bbbb\n”);
-このfor文は
-このひとつの文だけを制御
-この文はfor文の制御範囲にない
複合文(ブロック)を使
う
int i;
for (i=1; i<=3; i++) {
printf(“aaaa\n”);
printf(“bbbb\n”);
}
-この{から
-この}までを繰り返す
空文を使う
for (i=1; i<=10000; i++)
;
-1万回ループする
-その間何もしない
if (aa > 100)
-1万回ループする
;
-その間何もしない
else
ーそうでないときは
bb = 200;
ーこれを実行する
if文の書式
if (式) {
文1
}
else {
文2
}
・式が新なら文1を、偽なら文2を実行する
・else以下は不要なら省略できる
・文がひとつなら{}は省略できる
式
文1
文2
例1 被制御文が単文の
例
if (b > 10)
b = 0;
else
++b;
-bが10より大なら
ーこれを実行
ーさもなくば
ーこちらを実行
例2 被制御文が複数の
例
if (a == 2) {
x = 1;
y = 2;
}
else {
x = 3;
y = 4;
}
-aが2なら
これを実行
ーさもなくば
こちらを実行
リスト if文の使用例
#include <stdio.h>
int main(void)
{
int n1, n2, n3;
printf(“数値1: “);
scanf(“%d”,&n1);
if (n1%2 ==1) {
-2で割った余りが1なら奇数
printf(“数値1は奇数\n”);
}
else {
printf(“数値1は奇数\n”);
}
printf(“数値2: ”);
scanf(“%d, &n2);
printf(“数値3: “);
scanf(“%d”, &n3);
if (n2 > n3)
-else ifによる多方向分岐
printf(“数値2の方が数値3より大きい\n”);
else if (n2 < n3)
printf(“数値2より数値3の方が大きい\n”);
else
printf(“数値2と数値3は等しい\n”);
return 0;
}
for文の書式
初期化式
for (初期化式; 継続条件式; 再設定式) {
文
}
偽
継続条件式
真
・まずループ処理に入る前に初期化式を実行する
文
・その後、継続条件式が真の間、文を実行する
・各ループ処理のたびに文の実行後、再設定式を実行する
再設定式
・文がひとつなら{}は省略できる
◆for文の決まり文句◆
for (i=
; i<=
から
; i++)
まで
実際の意
味
変数iを1にしろ(初期化)
iが10以下の間ループしろ(継続条件
ループのたびにiを1加算しろ(再設定)
for (i=1; i<=10; i++) {
・・・
}
リスト for文の使用
例#include <stdio.h>
int main(void)
{
int i, sum, mul;
sum = 0;
mul = 1;
for (i=1; i<=5; i++) {
sum = sum + i;
mul = mul + i;
}
printf(“和=%d\n”, sum);
printf(“積=%d\n”, mul);
-1~5の加算と乗積をする
-合計値を出力
ー乗算値を出力
for (i=40; i>=20; i=i-2) {
printf(“%d ”, i);
}
printf(“\n”);
return 0;
}
-カウントダウンfor文
-途中値を出力
ー最後に開業する
while文の書式
while (式) {
文
}
偽
式
真
文
・式が真である間、文を繰り返し実行する
・while文は次のループに「入る条件」を判断する
・式がはじめから偽の場合は1度も実行されない
・文がひとつなら{}は省略できる
リスト while文の使用例
#include <stdio.h>
1
int main(void)
{
int i, de[ ] = {100, 200, 300, -1, 400};
i = 0;
while (dt[i] i = -1) {
printf(“%d\n”, dt[i]);
i++;
}
return 0;
}
ーdt[i]が-1でない間ループせよ
ー内容を表示
ー次の継続条件のための準備
リスト while文の使用例
#include <stdio.h>
2
int main(void)
{
int nn, sum = 0;
scanf(“%d”, &nn);
while (nn != 0) {
printf(“入力値=%d\n”, nn);
sum = sum + nn;
scanf(“%d”, &nn);
}
printf(“合計値=%d\n”, sum);
return 0;
}
-最初のデータ入力
ーデータが0でなければループする
ー値の出力
ー加算する
-2回目以降のデータ入力
-加算結果の出力
do-while文の書
式
do {
文
} while (式);
文
真
式
偽
・式が真なら処理を継続する
・do-while文では最低1回は文を実行する
・do-while文は現在のループを「続行する条件」を判断する
・文がひとつなら{}は省略できる
・式の後ろに’;’が必要
{ }を省略しない
do
a[i] = b[i];
while (a[i++]);
-この行だけを見るとwhile文のように見える
do {
a[i] = b[i];
} while (a[i++]);
-’}’があるのでdo-whileだろうと推測できる
リスト do-while文の使用例
#inclede <stdio.h>
int main(void)
{
int n;
char ss[ ] = “ABCDE”;
printf(“%s\n”, ss);
n = -1
do {
++n;
printf(“%d”, ss[n]);
} while(ss[n] != ‘0’);
printf(“\n”);
return 0;
}
-文字列は最後に’\0’をもっている
ー文字列を出力
ーループ開始
-数値で出力
-’\0’でなければループ継続
-最後に改行する
switch文の書式
switch (式) {
case 定数式1;
文1
break;
case 定数式2;
文2
break;
・
・
・
case 定数式n;
文n
break;
default:
文
式
case
定数式1
文1
case
定数式2
文2
default
case
定数式n
文n
文
}
・式の値を評価し、その値と一致する定数式のcase部分にジャンプし、対応する文を実行する
・式は整数を結果とするものでなければならない
・定数式は定数で表現した式を書く(変数名を使ってはいけない)
・break文に出会うと処理を終了してswitch文全体を終了する
・一致する定数式がないときはdefault部分に記述された文を実行する
・default部は不要なら省略できる
リスト switch文で分岐する
#inclede <stdio.h>
int main(void)
{
int a;
for (a=1; a<=5; a++) {
printf(“--------%d\n”, a);
switch (a) {
case 1:
printf(“a=1\n”);
break;
case 3:
printf(“a=3\n”);
break;
終
case 5:
了
printf(“a=5\n”);
break;
default:
printf(“その他\n”);
}
}
return 0;
}
aの値で分岐
a=1のときここにくる。’:’が必要
実行される文(いくつ書いてもよい)
breakでcase1を終了する
a=3のときここにくる
a=5のときここにくる
その他のときここにくる
break文の書式
break;
・break文はseitch文の終了、またはfor,while,do-whileのループから脱出する
ための文である
・break文を使うとスマートにループを脱出することができる
・switch文以外で用いるbreak文は、if文と併用することが多い
・ループがネスト構造になっているときは、break文の存在するループをひとつだけ抜ける
リスト 基本的なbreak処理
#inclede <stdio.h>
int main(void)
{
int i, dt[10];
printf(“----- for loop\n);
for (i=0; i<10; i++) {
scanf(“%d”, &dt[i]);
if (dt[i] == 0) break;
―とりあえず10回ループせよ
―データ格納
―データが0ならループを打ち切れ
}
printf(“----- while loop\n”);
i = 1;
while (1) {
―無限ループせよ
printf(“%d”, i);
if (i> 1000) break;
―iの値が1000を超えたら理を打ち切れ
i = i * 2;
―数値を2倍にする
}
printf(“\n”);
―改行
return 0;
}
リスト 多重ループでのbreak文の効果
#include <stdio.h>
int main(void)
{
int i, j;
for (i=1, i<=4, i++) {
printf(“i=%d: “, i);
for (j=1, j<=4; j++) {
printf(“j=%d
“, j):
if (j == 2) break;
}
printf(“\n”);
}
return 0;
}
ひとつだけル
ープ脱出
内側の
ループ
外側の
ループ
break文の書式
continue;
・continueはfor,while,do-whileの中で使用する
・ループ処理をその回だけスキップし、以降の処理は継続(continue)する
・continue記述位置から、ループ終端部までに書かれた記述をスキップす
る
リスト breakとcontinueの違いを見る
#include <stdio.h>
int main(void)
{
int i;
printf(“----- break test\n”);
for (i=1; i<=4; i++) {
printf(“i=%d start\n”, i);
if (i == 2) break;
―iが2ならcontinue
printf(“i=%d end\n”, i);
}
printf(“----- continue test\n”);
for (i=1; i<=4; i++) {
printf(“i=%d start\n”, i);
if (i == 2) continue;
printf(“i=%d end\n”, i);
}
return 0;
}
―iが2ならbreak
練習問題1 解答例
#include <stdio.h>
int main(void)
{
int sum;
sum = 0;
for (i=1; i<=100; i++) {
sum = sum + i;
}
printf(“sum=%d\n”, sum);
sum = 0; i = 1;
while (i<=100){
sum = sum + i;
++i;
}
printf(“sum=%d\n”, sum);
sum = 0; i = 1;
do {
sum = sum + i;
++i;
} while (i <= 100);
printf(“sum=%d\n”, sum);
return 0;
}
練習問題2 解答例
1900年から2000年の間で、うるう年である年号を、for文とif文を使って、次
のように表示しなさい。
#include <stdio.h>
int main(void)
{
int n;
for (n=1900; n<=2000; n++) {
if (n%4==0 && n%100!=0)
printf(“%d “,n);
else if (n%400 == 0)
printf(“%d ”, n);
}
printf(“\n”)
return 0;
}