digirakuda ようこそ!  コンピュータの世界へ!

第5回 while文,break文,for文,#include文

内 容


このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.

5-1. while文,break文

[課題5-1] while文を使って1から10までの合計を計算しましょう.

[プログラム例5-1]


1: #include <stdio.h>
2: void main(void){
3: int i, sum;
4:
5: sum=0;
6: i=1;
7: while( i<=10 ){
8: sum+=i;
9: printf( "i=%d sum=%d\n", i, sum );
10: i++;
11: }
12: getchar();
13: }
  1. 5~6行目→変数sumとiをそれぞれ初期化します.
  2. 7行目→while文の条件式(i<=10)が真(正しい)あいだ中while文以降のブロックを繰り返します.10行目との組み合わせで10回繰り返されます.条件式(i<=10)が偽(誤り)になったとき次の処理(12行目)に移ります.
  3. 8行目→変数sumに変数iの値を加えます.sum = sum + i;と同じ意味です.
  4. 9行目→変数i,sumを画面に表示します.
  5. 10行目→変数iに1だげ加えます.i = i + 1;と同じ意味です.

[結果5-1]

コンパイル・実行すると,画面に次のように出力されます.

i=1 sum=1

i=2 sum=3
i=3 sum=6
i=4 sum=10
i=5 sum=15
i=6 sum=21
i=7 sum=28
i=8 sum=36
i=9 sum=45
i=10 sum=55

その後,リターンキーを押すとプログラムは終了します.

あなたの予想通り,7行目の条件式(i<=10)(意味:変数iが10以下のとき)を条件式(i<=100)に変更したら1~100までの合計を表示する事ができます.8行目を sum *= i;( sum = sum * i; と同じ)に変更したらどうなるでしょうか?ためしに実行してみて下さい.
while文の構成は次のようになります.

while(条件式){

条件式が真(正しい)のあいだ繰り返し実行するブロック 単文(1つの文)または複文(複数の文)で構成 条件式中の変数を変化させる文
} while文の構成

条件式中の変数を変化させる文が10行目のi++;にあたります.

これであなたは,C言語を使って繰り返しの計算ができるようになりました.いくら繰り返しても条件式が真のままのプログラムを作ると,無限にwhileブロックの実行を繰り返すプログラム(無限ループのプログラム)になってしまいますから注意して下さい.

5-2. for文

[課題5-2]for文を使って1から10までの合計を計算しましょう.

[プログラム例5-2]


1: #include <stdio.h>
2: void main(void){
3: int i, sum;
4:
5: sum=0;
6: for( i=1; i<=10; i++ ){
7: sum+=i;
8: printf( "i=%d sum=%d\n", i, sum );
9: }
10: getchar();
11: }
  1. 5行目→変数sumを初期化します.
  2. 7行目→for文の1項目 i=1; で変数iが一回だけ初期化されます.
  3. 2項目の条件式 i<=10; が真(正しい)あいだ中for文以降のブロックを繰り返します.
  4. ブロックの最後に実行される3項目i++ との組み合わせで10回繰り返されます.
  5. 条件式 i<=10;が偽(誤り)になったとき次の処理(10行目)に移ります.
  6. ブロックの最後に3項目i++が実行されます.

[結果5-2]

コンパイル・実行すると,[結果5-1]と全く同じ結果が得られます
つまり[課題5-1]と[課題5-2]のプログラムは全く等価であるといえます.for文は次のような構成になります.

for( 初期化式; 継続条件式; 再初期化式 ){

継続条件式が真(正しい)のあいだ繰り返し実行するブロック
単文(1つの文)または複文(複数の文)で構成
}
初期化式は最初の1回だけ実行されます. 再初期化式はブロックの最後に到達するごと,その都度実行されます. for文の構成

また,「+=」の種類の演算子には,他に次のような種類があります.

演算子使い方意味同じ意味の書き方
+=a+=b;変数aに変数bだけを加えるa=a+b;
-=a-=b;変数aから変数bだけ減ずるa=a-b;
*=a*=b;変数aに変数bを掛ける a=a*b;
/=a/=b;変数aを変数bで割る a=a/b;
%=a%=b 変数aにaを変数bで割った余りを代入a=a%b;

注意:このときaが整数なら小数点下は切り捨てられます.

また,「++」の種類の演算子には,他に次のような種類があります.

演算子使い方意味同じ意味の書き方
++a++;変数aに1加えるa=a+1;
--a--;変数aから1減じるa=a-1;

for文の方は再初期化式を明示する必要があるときに好んで使われます.しかし,これまで示してきたようにwhile文,for文は全く同じ用途に使うことができます.

[課題5-3] while(1)文(無限ループ)を使って1から10までの合計を計算しましょう.ループから抜け出すときは,if文とbreak文を使って下さい

[プログラム例5-2]


1: #include <stdio.h>
2: void main(void){
3: int i, sum;
4:
5: sum=0;
6: i=1;
7: while( 1 ){
8: if( i>10 )
9: break;
10: sum+=i;
11: printf( "i=%d sum=%d\n", i, sum );
12: i++;
13: }
14: getchar();
15: }
  1. 7行目→while(1){...}は強制的な無限ループ(永久に実行され続けるブロック)を表します.ループから抜け出すには,適当なbreak文が必要です.
  2. 8~9行目→(i>10)が真のとき9行目のbreak文を実行しループから抜け出します.

[結果5-3]

コンパイル・実行すると,[結果5-2]と全く同じ結果が得られます.通常,break文は例外的処理が必要なときなどに実行しループから抜け出します.

[課題5-4] for文を使って1から10までの合計を計算しましょう.また#defineマクロを使って継続条件を与えましょう

[プログラム例5-4]



1: #include <stdio.h>
2: #define MAX 10
3: void main(void){
4: int i, sum;
5:
6: sum=0;
7: for( i=1; i<=MAX; i++ ){
8: sum+=i;
9: printf( "i=%d sum=%d\n", i, sum );
10: }
11: getchar();
12:}
  1. 2行目→2行目以降にMAXという文字列が現れたら10に置き換えるよう指示します.(一対の""で囲まれた文字列には,効きません.)

[結果5-4]

2行目を追加し,7行目を10をMAXに変更しただけですから,コンパイル・実行すると,[結果5-2]と全く同じ結果が得られます.

このように#define文を使うとおなじ最大値という意味の10という数値をプログラム中で何度も使用するとき,#define文の書換1回で済むので大変便利です.また,10という全く意味のない数値を使うより意味のあるMAXという文字列を使うと大変読みやすいプログラムになります.できるたで,#define文を使って意味のない数値を意味のある文字列に置き換え,読みやすいC言語プログラムを作りましょう.

[文法5]

1.while文
 while( 条件式 ){

文;
}
  1. 条件式はp??の条件式の種類で示したものが使われます.条件式が真のあいだwhile文のループ(ブロックの実行)が繰り返されます.
  2. while文は,最初に入ったときにすでに条件式が偽のときは一度も実行されません.
  3. ブロックが実行されても条件式が真から変化しないときは,無限ループになります.
  4. 文が単文のときは一対の{}を省略できます.
  5. 文は単文でも複文でも構いません.

2.for文]
  for( 初期化式; 継続条件式; 再初期化式 ){
	

}
  1. ①for文は初期化式の実行で始まります.
    ②もし継続条件式が真ならブロックを実行し,もし偽ならforループから抜け出ます.
    ③ブロックの実行後,再初期化式を実行します.
    ④②に戻ります.②~④を繰り返します.
  2. for(;;){文}と書くと無限ループになります.
  3. 文が単文のときは一対の{}を省略できます.
  4. 文は単文でも複文でも構いません.
3.break文
 break;
  1. (1)while文,for文などループから抜け出すときに使用します.
  2. (2)ループが多重のときは,そのbreak文が存在しているループからのみ抜け出します. (さらに外のループからは抜け出せません)
  3. (3)if文など条件を表せる文と組み合わせて使用します.
4.#defineマクロ
 #define  文字列1 文字列2
  1. ソースプログラム内に文字列1が出てくると,文字列2に置き換えられます.(これはプリプロセッサによるものです.
  2. 一対の""で囲まれた文字列中に文字列1があった場合は置き換えられません.
  3. 文字列1は変数名と同様に名前を付けます.しかし変数名と区別するため慣例として,大文字と_(アンダーバー)のみを用いることが多いようです.
  4. #で始まるプリプロセッサ制御文では,文の最後に;(セミコロン)は必要ありません.

[問題5-1]


おつかれさまでした.以上,第5回はwhile文,for文でした.


このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.

2016,12

ssatoh@

足立工科大学 工学部 情報通信工学科