授業/C言語基礎/for文
をテンプレートにして作成
開始行:
*同じ処理を繰り返し行う [#p95b0769]
コンピューターは、同じ処理を繰り返し行うことが得意です。
次のようなプログラムを考えてみましょう。
Hello World!と10回画面に表示する
これをそのままプログラムにすると、次のようになります。
#geshi(c){{
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");
}}
全く同じ命令が10回繰り返されています。
''for文''は、このような同じ処理を繰り返し行うことができま...
for文は、次の形をしています。
#geshi(c){{
int i;
for (i = 1; i <= 繰り返し回数; i++) {
処理
}
}}
ここで、''++'' は''増分演算子''(インクリメント演算子)で...
後で詳しく説明します。
for文を使って上のプログラムを書くと、次のようになります(...
#geshi(c){{
int i;
for (i = 1; i <= 10; i++) {
printf("Hello World!\n");
}
}}
これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
}}
**演習1 [#rce0b366]
プログラム1を作成し、実行結果を確認せよ。
*カウント変数 [#ke44bbbd]
for文で使われている変数 i は、繰り返し回数をカウントする...
繰り返し回数をカウントしているので、''カウント変数''と呼...
カウント変数の名前は、i でなくても構いません。
上のプログラムに、変数 i の値を出力する命令を追加します(...
#geshi(c){{
int i;
for (i = 1; i <= 10; i++) {
printf("%d\n", i);
printf("Hello World!\n");
}
}}
これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1
Hello World!
2
Hello World!
3
Hello World!
4
Hello World!
5
Hello World!
6
Hello World!
7
Hello World!
8
Hello World!
9
Hello World!
10
Hello World!
}}
**演習2 [#tddc3255]
プログラム1をプログラム2に変更し、実行結果を確認せよ。
*増分・減分演算子 [#b42c48af]
for文の中で使われている ''++'' という演算子は、''増分演算...
増分演算子と同じ仲間に、変数の値を1減らす''減分演算子''(...
|優先順位|演算子|使用例|意味|h
|2|++|i++|iの値を1増やす|
|~|~|++i|~|
|~|−−|i−−|iの値を1減らす|
|~|~|−−i|~|
演算子が変数の前についている場合(前置)と変数の後につい...
*for文 [#m3ff44a2]
上では、for文の形を次のように説明しました。
#geshi(c){{
int i;
for (i = 1; i <= 繰り返し回数; i++) {
処理
}
}}
正確に説明すると、for文は次の形をしています。
#geshi(c){{
for (初期化; 繰り返し条件; 更新処理) {
処理
}
}}
if文と同じように、for文の波括弧 { } に含まれる命令文が0ま...
for文は、次のように実行されます。
+「初期化」を行う
+「繰り返し条件」を評価する
--条件を満たしていれば、波括弧 { } の中の「処理」を行い、...
--そうでなければ、for文の次の処理に移る
+2へ戻る
したがって、カウント関数は1からでなく、0から始めることも...
また、カウント関数を1ずつ増やすのではなく、2ずつ増やした...
たとえば、10から0までカウントダウンするプログラムは、次の...
#geshi(c){{
int i;
for (i = 10; i >= 0; i--) {
printf("%d\n", i);
sleep(1);
}
}}
**演習3 [#me0ecdb9]
プログラム3を作成し、実行結果を確認せよ。
**無限ループと強制停止 [#afb3951c]
for文は、条件を満たしている間繰り返し続けますので、条件を...
これを''無限ループ''といいます。
たとえば、次のプログラムについて考えてみます(プログラム4...
#geshi(c){{
int i;
for (i = 1; i = 10; i++) {
printf("%d\n", i);
printf("Hallo World!\n");
}
}}
繰り返し条件の演算子を間違えて、代入演算子にしてしまって...
繰り返し条件を評価すると、カウント変数に10が代入されます。
このとき、結果が0でないので、条件を満たしていると判断され...
更新処理によってカウント変数は11になりますが、繰り返し条...
このようなとき、''コントロール・キー''を押しながら''C''キ...
コントロール・キーを押しながらCキーを押す操作を、''Ctrl+C...
**演習4 [#ha668b44]
プログラム2をプログラム4に変更し、実行して強制停止せよ。
*一度も処理しないfor文 [#p95b0237]
for文の繰り返し条件が一度も満たされないとき、for文の波括...
たとえば、次のプログラムについて考えてみます(プログラム5...
#geshi(c){{
int i;
for (i = 10; i <= 0; i--) {
printf("%d\n");
sleep(1);
}
printf("\n");
}}
カウントダウンするプログラム(プログラム3)において、繰り...
これを実行すると、繰り返し条件が最初から満たされていない...
**演習5 [#y7ac9e32]
プログラム3をプログラム5に変更し、実行結果を確認せよ。
*合計を求める [#c9a294dc]
繰り返し処理を用いてよく行われることの一つが、合計を求め...
1から100までの整数の和を求めることを考えてみます。
そのままプログラムにすると次のようになります。
#geshi(c){{
int sum = 1 + 2 + 3 + 4 + 5 + ... + 99 + 100;
printf("%d\n", sum);
}}
もちろん、...の部分も省略せずに書かなければなりませんが、...
この処理は、2を加える、3を加える、4を加える ... という加...
そこで、この処理を、次のように同じ命令文の繰り返しの形に...
#geshi(c){{
int sum = 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
...
sum = sum + 99;
sum = sum + 100;
printf("%d\n", sum);
}}
ここで、
#geshi(c){{
sum = sum + 2;
}}
は、右辺の計算をしてから代入が行われるため、変数sumの値に...
つまり、変数 sum の値に2を加えます。
加える数をカウント変数 i で表すと、繰り返し行われている加...
#geshi(c){{
sum = sum + i;
}}
という形で書くことができます。
したがって、加える数をカウント変数とし、カウント変数を2に...
#geshi(c){{
int i, sum = 1;
for (i = 2; i <= 100; i++) {
sum = sum + i;
}
printf("%d\n", sum);
}}
これでも間違いではありませんが、普通は、合計を表す変数の...
つまり、
#geshi(c){{
int sum = 0 + 1 + 2 + 3 + ... + 99 + 100;
printf("%d\n", sum);
}}
と変形して、次のようなプログラムにします(プログラム7)。
#geshi(c){{
int i, sum = 0;
for (i = 1; i <= 100; i++) {
sum = sum + i;
}
printf("%d\n", sum);
}}
これだと、合計を求める範囲が変わったときに、カウント変数...
(プログラム6は、sumの初期値も変えなければなりません。)
**演習6 [#v07f34ae]
プログラム7を作成し、実行結果を確認せよ。
*複合代入演算子 [#oacd17e7]
合計を求めるプログラムで出てきたような、変数の値にある値...
#geshi(c){{
sum = sum + i
}}
このため、算術演算と代入を同時に行う演算子として、''複合...
上の処理の場合、加算用の複合代入演算子 ''+='' を使って、...
#geshi(c){{
sum += i;
}}
したがって、プログラム7は、次のように書くことができます(...
#geshi(c){{
int i, sum = 0;
for (i = 1; i <= 100; i++) {
sum += i;
}
printf("%d\n", sum);
}}
算術演算の複合代入演算子には、次のようなものがあります。
|優先順位|演算子|使用例|意味|h
|15|+=|a += b|aとbの和をaに代入する(加算代入)|
|~|−=|a −= b|aとbの差をaに代入する(減算代入)|
|~|*=|a *= b|aとbの積をaに代入する(乗算代入)|
|~|/=|a /= b|aをbで割ったときの商をaに代入する(除算代入)|
剰余算の複合代入演算子はありません。
**演習6 [#dbd5c59c]
プログラム7をプログラム8に変更し、実行結果を確認せよ。
*繰り返し計算ゲーム [#qc2efe39]
Lesson 04で作成した[[計算ゲーム>授業/C言語基礎/計算ゲーム...
問題の作成、出題、入力の受付、正解・不正解の判定を、for文...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, j, k, a, cnt;
srand((unsigned int) time(NULL));
cnt = 0;
for (k = 1; k <= 10; k++) {
i = rand() % 99 + 1;
j = rand() % 99 + 1;
printf("第%d問: %d + %d = \n", k, i, j);
scanf("%d", &a);
if (a == i + j) { cnt++; }
}
printf("%d問正解!\n", cnt);
return 0;
}
}}
ここで、k は新たに用意したfor文のカウント変数、cnt は正解...
**演習7 [#z61939b3]
プログラム9を作成し、実行結果を確認せよ。
*for文のネスト [#l153c748]
for文の中にfor文を入れることを''ネスト''(入れ子構造)と...
for文をネストするとき、外側のfor文と内側のfor文では異なる...
つぎのプログラムは、九九の計算をします(プログラム10)。
#geshi(c){{
int i, j, k;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
k = i * j;
printf("%d * %d = %d\n", i, j, k);
}
}
}}
外側のfor文のカウント変数が i、内側のfor文のカウント変数...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1 * 1 = 1
1 * 2 = 2
...
1 * 9 = 9
2 * 1 = 2
2 * 2 = 4
...
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
...
9 * 8 = 72
9 * 9 = 81
}}
ネストされたfor文では、外側のfor文が[math]N[/math]回、内...
プログラム10の改行を少なくして、表の形で出力すると、次の...
#geshi(c){{
int i, j, k;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
k = i * j;
printf("%3d", k);
}
printf("\n");
}
}}
内側のfor文では改行せずに、外側のfor文だけで改行している...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
}}
for文のネストを使うと、次のようなこともできます(プログラ...
#geshi(c){{
int i, j;
for (i = 1; i <= 10; i++) {
for (j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
}}
内側のfor文の繰り返し回数が、外側のfor文のカウント変数の...
つまり、外側のfor文は「内側のfor文と改行だけを出力するpri...
改行は、外側のfor文によって、内側のfor文が実行された後に...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
*
**
***
****
*****
******
*******
********
*********
**********
}}
**演習8 [#ubbd4d1e]
プログラム10-12を作成し、実行結果を確認せよ。
----
*まとめ [#sde5ec47]
回数が決まっている繰り返し処理には''for文''を使います。
for文では、''カウント変数''の''初期化''、''繰り返し条件''...
カウント変数の更新処理では、''増分演算子''(インクリメン...
繰り返し条件が常に満たされるとき、プログラムを実行すると'...
実行時に無限ループになったら、''^C''でプログラムの実行を'...
for文を用いて''合計を求める''処理がよく行われます。
合計を求めるときは、合計を表す変数を0に初期化し、''複合代...
for文で繰り返し行う処理にfor文を用いることを、for文の''ネ...
ネストされたfor文では、外側のfor文と内側のfor文で異なるカ...
ネストされたfor文において、内側のfor文の繰り返し条件が外...
----
*練習問題 [#m19fe966]
練習問題は[[こちら>授業/C言語基礎/for文/練習問題]]。
終了行:
*同じ処理を繰り返し行う [#p95b0769]
コンピューターは、同じ処理を繰り返し行うことが得意です。
次のようなプログラムを考えてみましょう。
Hello World!と10回画面に表示する
これをそのままプログラムにすると、次のようになります。
#geshi(c){{
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");
}}
全く同じ命令が10回繰り返されています。
''for文''は、このような同じ処理を繰り返し行うことができま...
for文は、次の形をしています。
#geshi(c){{
int i;
for (i = 1; i <= 繰り返し回数; i++) {
処理
}
}}
ここで、''++'' は''増分演算子''(インクリメント演算子)で...
後で詳しく説明します。
for文を使って上のプログラムを書くと、次のようになります(...
#geshi(c){{
int i;
for (i = 1; i <= 10; i++) {
printf("Hello World!\n");
}
}}
これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
}}
**演習1 [#rce0b366]
プログラム1を作成し、実行結果を確認せよ。
*カウント変数 [#ke44bbbd]
for文で使われている変数 i は、繰り返し回数をカウントする...
繰り返し回数をカウントしているので、''カウント変数''と呼...
カウント変数の名前は、i でなくても構いません。
上のプログラムに、変数 i の値を出力する命令を追加します(...
#geshi(c){{
int i;
for (i = 1; i <= 10; i++) {
printf("%d\n", i);
printf("Hello World!\n");
}
}}
これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1
Hello World!
2
Hello World!
3
Hello World!
4
Hello World!
5
Hello World!
6
Hello World!
7
Hello World!
8
Hello World!
9
Hello World!
10
Hello World!
}}
**演習2 [#tddc3255]
プログラム1をプログラム2に変更し、実行結果を確認せよ。
*増分・減分演算子 [#b42c48af]
for文の中で使われている ''++'' という演算子は、''増分演算...
増分演算子と同じ仲間に、変数の値を1減らす''減分演算子''(...
|優先順位|演算子|使用例|意味|h
|2|++|i++|iの値を1増やす|
|~|~|++i|~|
|~|−−|i−−|iの値を1減らす|
|~|~|−−i|~|
演算子が変数の前についている場合(前置)と変数の後につい...
*for文 [#m3ff44a2]
上では、for文の形を次のように説明しました。
#geshi(c){{
int i;
for (i = 1; i <= 繰り返し回数; i++) {
処理
}
}}
正確に説明すると、for文は次の形をしています。
#geshi(c){{
for (初期化; 繰り返し条件; 更新処理) {
処理
}
}}
if文と同じように、for文の波括弧 { } に含まれる命令文が0ま...
for文は、次のように実行されます。
+「初期化」を行う
+「繰り返し条件」を評価する
--条件を満たしていれば、波括弧 { } の中の「処理」を行い、...
--そうでなければ、for文の次の処理に移る
+2へ戻る
したがって、カウント関数は1からでなく、0から始めることも...
また、カウント関数を1ずつ増やすのではなく、2ずつ増やした...
たとえば、10から0までカウントダウンするプログラムは、次の...
#geshi(c){{
int i;
for (i = 10; i >= 0; i--) {
printf("%d\n", i);
sleep(1);
}
}}
**演習3 [#me0ecdb9]
プログラム3を作成し、実行結果を確認せよ。
**無限ループと強制停止 [#afb3951c]
for文は、条件を満たしている間繰り返し続けますので、条件を...
これを''無限ループ''といいます。
たとえば、次のプログラムについて考えてみます(プログラム4...
#geshi(c){{
int i;
for (i = 1; i = 10; i++) {
printf("%d\n", i);
printf("Hallo World!\n");
}
}}
繰り返し条件の演算子を間違えて、代入演算子にしてしまって...
繰り返し条件を評価すると、カウント変数に10が代入されます。
このとき、結果が0でないので、条件を満たしていると判断され...
更新処理によってカウント変数は11になりますが、繰り返し条...
このようなとき、''コントロール・キー''を押しながら''C''キ...
コントロール・キーを押しながらCキーを押す操作を、''Ctrl+C...
**演習4 [#ha668b44]
プログラム2をプログラム4に変更し、実行して強制停止せよ。
*一度も処理しないfor文 [#p95b0237]
for文の繰り返し条件が一度も満たされないとき、for文の波括...
たとえば、次のプログラムについて考えてみます(プログラム5...
#geshi(c){{
int i;
for (i = 10; i <= 0; i--) {
printf("%d\n");
sleep(1);
}
printf("\n");
}}
カウントダウンするプログラム(プログラム3)において、繰り...
これを実行すると、繰り返し条件が最初から満たされていない...
**演習5 [#y7ac9e32]
プログラム3をプログラム5に変更し、実行結果を確認せよ。
*合計を求める [#c9a294dc]
繰り返し処理を用いてよく行われることの一つが、合計を求め...
1から100までの整数の和を求めることを考えてみます。
そのままプログラムにすると次のようになります。
#geshi(c){{
int sum = 1 + 2 + 3 + 4 + 5 + ... + 99 + 100;
printf("%d\n", sum);
}}
もちろん、...の部分も省略せずに書かなければなりませんが、...
この処理は、2を加える、3を加える、4を加える ... という加...
そこで、この処理を、次のように同じ命令文の繰り返しの形に...
#geshi(c){{
int sum = 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
...
sum = sum + 99;
sum = sum + 100;
printf("%d\n", sum);
}}
ここで、
#geshi(c){{
sum = sum + 2;
}}
は、右辺の計算をしてから代入が行われるため、変数sumの値に...
つまり、変数 sum の値に2を加えます。
加える数をカウント変数 i で表すと、繰り返し行われている加...
#geshi(c){{
sum = sum + i;
}}
という形で書くことができます。
したがって、加える数をカウント変数とし、カウント変数を2に...
#geshi(c){{
int i, sum = 1;
for (i = 2; i <= 100; i++) {
sum = sum + i;
}
printf("%d\n", sum);
}}
これでも間違いではありませんが、普通は、合計を表す変数の...
つまり、
#geshi(c){{
int sum = 0 + 1 + 2 + 3 + ... + 99 + 100;
printf("%d\n", sum);
}}
と変形して、次のようなプログラムにします(プログラム7)。
#geshi(c){{
int i, sum = 0;
for (i = 1; i <= 100; i++) {
sum = sum + i;
}
printf("%d\n", sum);
}}
これだと、合計を求める範囲が変わったときに、カウント変数...
(プログラム6は、sumの初期値も変えなければなりません。)
**演習6 [#v07f34ae]
プログラム7を作成し、実行結果を確認せよ。
*複合代入演算子 [#oacd17e7]
合計を求めるプログラムで出てきたような、変数の値にある値...
#geshi(c){{
sum = sum + i
}}
このため、算術演算と代入を同時に行う演算子として、''複合...
上の処理の場合、加算用の複合代入演算子 ''+='' を使って、...
#geshi(c){{
sum += i;
}}
したがって、プログラム7は、次のように書くことができます(...
#geshi(c){{
int i, sum = 0;
for (i = 1; i <= 100; i++) {
sum += i;
}
printf("%d\n", sum);
}}
算術演算の複合代入演算子には、次のようなものがあります。
|優先順位|演算子|使用例|意味|h
|15|+=|a += b|aとbの和をaに代入する(加算代入)|
|~|−=|a −= b|aとbの差をaに代入する(減算代入)|
|~|*=|a *= b|aとbの積をaに代入する(乗算代入)|
|~|/=|a /= b|aをbで割ったときの商をaに代入する(除算代入)|
剰余算の複合代入演算子はありません。
**演習6 [#dbd5c59c]
プログラム7をプログラム8に変更し、実行結果を確認せよ。
*繰り返し計算ゲーム [#qc2efe39]
Lesson 04で作成した[[計算ゲーム>授業/C言語基礎/計算ゲーム...
問題の作成、出題、入力の受付、正解・不正解の判定を、for文...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, j, k, a, cnt;
srand((unsigned int) time(NULL));
cnt = 0;
for (k = 1; k <= 10; k++) {
i = rand() % 99 + 1;
j = rand() % 99 + 1;
printf("第%d問: %d + %d = \n", k, i, j);
scanf("%d", &a);
if (a == i + j) { cnt++; }
}
printf("%d問正解!\n", cnt);
return 0;
}
}}
ここで、k は新たに用意したfor文のカウント変数、cnt は正解...
**演習7 [#z61939b3]
プログラム9を作成し、実行結果を確認せよ。
*for文のネスト [#l153c748]
for文の中にfor文を入れることを''ネスト''(入れ子構造)と...
for文をネストするとき、外側のfor文と内側のfor文では異なる...
つぎのプログラムは、九九の計算をします(プログラム10)。
#geshi(c){{
int i, j, k;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
k = i * j;
printf("%d * %d = %d\n", i, j, k);
}
}
}}
外側のfor文のカウント変数が i、内側のfor文のカウント変数...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1 * 1 = 1
1 * 2 = 2
...
1 * 9 = 9
2 * 1 = 2
2 * 2 = 4
...
2 * 9 = 18
3 * 1 = 3
3 * 2 = 6
...
9 * 8 = 72
9 * 9 = 81
}}
ネストされたfor文では、外側のfor文が[math]N[/math]回、内...
プログラム10の改行を少なくして、表の形で出力すると、次の...
#geshi(c){{
int i, j, k;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
k = i * j;
printf("%3d", k);
}
printf("\n");
}
}}
内側のfor文では改行せずに、外側のfor文だけで改行している...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
}}
for文のネストを使うと、次のようなこともできます(プログラ...
#geshi(c){{
int i, j;
for (i = 1; i <= 10; i++) {
for (j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
}}
内側のfor文の繰り返し回数が、外側のfor文のカウント変数の...
つまり、外側のfor文は「内側のfor文と改行だけを出力するpri...
改行は、外側のfor文によって、内側のfor文が実行された後に...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
*
**
***
****
*****
******
*******
********
*********
**********
}}
**演習8 [#ubbd4d1e]
プログラム10-12を作成し、実行結果を確認せよ。
----
*まとめ [#sde5ec47]
回数が決まっている繰り返し処理には''for文''を使います。
for文では、''カウント変数''の''初期化''、''繰り返し条件''...
カウント変数の更新処理では、''増分演算子''(インクリメン...
繰り返し条件が常に満たされるとき、プログラムを実行すると'...
実行時に無限ループになったら、''^C''でプログラムの実行を'...
for文を用いて''合計を求める''処理がよく行われます。
合計を求めるときは、合計を表す変数を0に初期化し、''複合代...
for文で繰り返し行う処理にfor文を用いることを、for文の''ネ...
ネストされたfor文では、外側のfor文と内側のfor文で異なるカ...
ネストされたfor文において、内側のfor文の繰り返し条件が外...
----
*練習問題 [#m19fe966]
練習問題は[[こちら>授業/C言語基礎/for文/練習問題]]。
ページ名: