while(継続条件){ 処理内容 }
while は,最初に継続条件判断を行ってから処理内容を行い,継続条件判断
へ戻る.
ポイント継続条件が満たされていない
場合は,1度も「処理内容」を行わない.
do{ 処理内容 }while(継続条件) ;
do ~ whileは,最初に処理内容を行ってから継続条件判断を行い,処理内容
へ戻る.
ポイント処理内容は,必ず1度は行われる.
whileの後に";"があることに注意。whileループ,
forループ の後にはない
for(初期設定; 継続条件; 再設定){ 処理内容 }
for は,ループに入る前に初期設定を行ってから,継続条件判断を行い,処
理内容を行う.
また,処理内容が終わったら再設定を行い,継続条件判断へ戻る.
初期設定 while(継続条件){ 処理内容 再設定 }
ポイント 初期設定,再設定を記述できるの
で,便利.
最もよく用いられる繰り返し処理
whileループを用いた,以下のプログラムを実行してみよう.
example33.c
#include <stdio.h> int main(void) { int i; i=0; while(i<5){ printf("iの値は%dです\n",i); i++; } printf("iの値は%dなので、whileループを抜けました\n",i); return 0; } |
while(条件)は,条件が正しい間,while直後の1ブロック(あるいは1文) を実行し続ける.
したがって,上記のプログラムは以下のように動作する.
実行する文 iの値 説明 i=0; 0 まず、iに0を代入 条件 i<5 0 0<5は正しいので、処理内容を実行 printf(…) 0 iの値は0です と表示 i++ 1 iに1を加える 条件 i<5 1 1<5は正しいので、処理内容を実行 printf(…) 1 iの値は1です と表示 i++ 2 iに1を加える 条件 i<5 2 2<5は正しいので、処理内容を実行 printf(…) 2 iの値は2です と表示 i++ 3 iに1を加える 条件 i<5 3 3<5は正しいので、処理内容を実行 printf(…) 3 iの値は3です と表示 i++ 4 iに1を加える 条件 i<5 4 4<5は正しいので、処理内容を実行 printf(…) 4 iの値は4です と表示 i++ 5 iに1を加える 条件 i<5 5 5<5は正しくないので、whileループをぬける. printf(…) 5 iの値は5なので、whileループを抜けました と表示
do ~whileループを用いた,以下のプログラムを実行してみよう.
example34.c
#include <stdio.h> int main(void) { int i; i=0; do{ printf("iの値は%dです\n",i); i++; }while(i<5); printf("iの値は%dなので、do~ whileループを抜けました\n",i); return 0; } |
do ~while(条件)も,条件が正しい間,while直後の1ブロック(あるいは1 文)を実行し続けるが,先に処理内容を一度実行する点が異なる.
したがって,上記のプログラムは以下のように動作する.
実行する文 iの値 説明 i=0; 0 まず、iに0を代入 printf(…) 0 iの値は0です と表示 i++ 1 iに1を加える 条件 i<5 1 1<5は正しいので、処理内容を実行 printf(…) 1 iの値は1です と表示 i++ 2 iに1を加える 条件 i<5 2 2<5は正しいので、処理内容を実行 printf(…) 2 iの値は2です と表示 i++ 3 iに1を加える 条件 i<5 3 3<5は正しいので、処理内容を実行 printf(…) 3 iの値は3です と表示 i++ 4 iに1を加える 条件 i<5 4 4<5は正しいので、処理内容を実行 printf(…) 4 iの値は4です と表示 i++ 5 iに1を加える 条件 i<5 5 5<5は正しくないので、whileループをぬける. printf(…) 5 iの値は5なので、whileループを抜けました と表示
while ループとの違いが分かりましたか?
while ループと,do ~ whileの違いを明白にするために,次の2つのプログ ラムを実行し,比較してみよう.
exampe35.c
#include <stdio.h> int main(void) { int i; i=10; while(i<5){ printf("iの値は%dです\n",i); i++; } printf("iの値は%dなので、whileループを抜けました\n",i); return 0; } |
#include <stdio.h> int main(void) { int i; i=10; do{ printf("iの値は%dです\n",i); i++; }while(i<5); printf("iの値は%dなので、do~ whileループを抜けました\n",i); return 0; } |
これまでのプログラム example33.c, example34.c と異なる点は,i=10で初期化しているところだけである.
しかし,上のプログラムの実行結果は
iの値は10なので、whileループを抜けました下のプログラムの実行結果は
iの値は10です iの値は11なので、do~whileループを抜けましたと異なる.do ~ whileループが必ず1度は処理内容部分を実行するが, whileループは1度も実行せずにループを抜けることができる.
さて,whileループを実行するとき,変数の初期化,変数のカウントアップ等 を別々の行に書いた. (C言語では、通常1行1文とする)
これらを一つにまとめたものが,forループである example33.cと同じ動作をするプログラムは,
#include <stdio.h> int main(void) { int i; for(i=0;i<5;i++){ printf("iの値は%dです\n",i); } printf("iの値は%dなので、whileループを抜けました\n",i); return 0; } |
他に,while と for を置き換えた例題を示す.
i++は,その文を実行した後にiに1を加える.
また,++iは文を実行する前にiに1を加える.
しがって,次の例では
m=++n では nに1を加えてから m に代入
m=n++ では,mにnを代入してから nに1を加える
と動作する.
#include <stdio.h> int main(void) { int m,n; n=3; m=++n; printf("n=%d, m=%d\n",n,m); n=3; m=n++; printf("n=%d, m=%d\n",n,m); return 0; } |
これまで,C言語の変数,あるいは定数には型があることを述べてきた. 違う型同士の計算では,精度の高い方(情報量の多い方)に自動的に 変換される. すなわち,整数型と実数型の演算では,整数型が実数型に変換されてから 計算が行われる.
また,演算は,左から順に行われるため気をつける必要がある.
#include <stdio.h> int main(void) { double a, b, c, d, e; a = 2/3; printf("a = %f\n",a); b = 2.0/3; printf("b = %f\n",b); a = 2; b = 3; c = a/b; printf("c = %f\n",c); a = 3; d = 2/3*a; printf("d = %f\n",d); a = 3; e = 2/a*3; printf("e = %f\n",e); return 0; } |
実行結果 a = 0.000000 b = 0.666667 c = 0.666667 d = 0.000000 e = 2.000000 |
ループと,if 文を組み合わせることで,複雑な処理を行うことができる. 例えば,以下の例では,2重ループとif文を組み合わせて,市松模様を描いる.
/* * 白黒円の市松模様を描く */ #include <stdio.h> #define IXMAX 10 #define IYMAX 7 int main(void) { int ix, iy; /* 格子状に○と●を並べる */ for ( ix = 0; ix < IXMAX; ix++ ) { for ( iy = 0; iy < IYMAX; iy++ ) { /* 市松模様になるように○と●を切替え */ if ( (ix+iy)%2 == 0 ) { printf("○"); } else { printf("●"); } } printf("\n"); } return 0; } |
if 文,for, while, や do~while等で,条件が真か偽かで制御が判断されるが, この条件は,”0(偽)”と”0以外(主に1)(真)”で制御されている. したがって論理式の演算 結果が,”0”またはそれ以外の数(”1”)を与えることを意味する.
次の,プログラムは何を表示するのだろうか?
#include <stdio.h> int main(void){ printf("1==0の演算結果は%dである\n",1==0); return 0; } |
また,1>0 や,0<1 はどのような演算結果を示すだろうか?
前述のようにif 文,for, while, や do~while等で,条件が真か偽かは, ”0(偽)”と”0以外(真)”で制御されている. したがって,
while(1){ 文; } |
とすると,無限に繰り返しを行う.
無限に繰り返しを行うと,プログラムを終了させることができなくなるので,
while(1){ 文; if(条件){ break; } } |
として,breakを用いることで,繰り返し処理から抜け出させる. ただし,多重ループの場合,break で抜け出せるのは,breakが書いてある ループからのみである.
#include <stdio.h> int main(void) { double avg, height; int num,ans; avg=0; num=0; while(1){ printf("%d人目の身長を入力してください(cm).終了は負の数を入力\n", num+1); scanf("%lf",&height); if( height < 0){ printf("入力をやめますか?\n"); printf("0:入力を続ける 0以外:入力をやめる\n"); scanf("%d",&ans); if( ans == 0) continue; else break; } avg+=height; num++; } avg/=num; printf("平均身長は %fです\n",avg); return 0; } |
複数の分岐先の中から,条件に合うものを選ぶときには,siwtch~case文を用いる
|
![]() |