back 2000/5/24 加筆(一部の言い回し訂正) 1999/10/25

C言語 - 比較や反復

この Web page の利用方法は,
ここ...最低限のプログラム実行例... (Windows 版 Visual C++ を利用している人)
で確認しよう!!
もくじ

2.0 比較(if)
2.1 比較を使ったちょっと実用的(風な)プログラムの例
2.2 繰り返し-0(その基礎)
2.3 繰り返し-1(while)
2.4 繰り返し-2(do)
2.5 繰り返し-3(for)
2.6 繰り返し-4(その他の繰り返し処理)
2.7 特別な制御文(switch)
2.8 ちょっと実用的(風な)プログラムの例

この Web Page を作るに際し,下記の文献を参考にしました。
サイエンス社 NSライブラリ(4) ザ・C [第2版] -ANSI C 準拠- 戸川隼人 1997年



2.0 比較(if)

V-C

#include <stdio.h> #include <math.h> main() { double a,sq; printf("Input a Number = ? "); scanf("%lf", &a); printf("bool : %d %d\n", a>=0.0, a<0.0); if(a<0.0){ sq=sqrt(-a); printf("sqrt = %lf I \n ", sq); }else{ sq=sqrt(a); printf("sqrt = %lf\n", sq); } }
用語の確認
  1. math.h ... sqrt
  2. 比較の種類 : ( == != > < >= <=)
  3. 論理記号 : ( && || !) ... (かつ または でない)
  4. True = 1, False = 0
  5. if は入れ子にできる。(if の中で さらに if を使う事ができる)
  6. else が無い場合
  7. }else if(a==0){ を付ける場合
課題:
  1. いろんな数値を入力してみよう。最低でも,10.0, 0.0, -10.0 の3つは試みる事。


2.1 比較を使ったちょっと実用的(風な)プログラムの例

V-C

Text p.56 2次方程式の根
課題:
  1. 自分でプログラムを書いてみよう。


2.2 繰り返し-0(その基礎)

V-C
ここでは C言語風の文法にしたがって,くり返し処理の基本を考える。
注意:以下のプログラムは C言語でありませんから,実行できません

繰り返し-1 (1回以上の繰り返し...条件判断が最後) i=1; /* 繰り返しの,前準備 */ j10: printf("%d %d\n", i, i*i); /* くり返す処理 */ i=i+1; /* 状態の変更(カウント) */ if(i>10) goto j20; /* 条件判断 */ goto j10; j20:
繰り返し-1 (0回以上の繰り返し...条件判断が最初) i=1; /* 繰り返しの,前準備 */ j10: if(i>=10) goto j20; /* 条件判断 */ printf("%d %d\n", i, i*i); /* くり返す処理 */ i=i+1; /* 状態の変更(カウント) */ goto j10; j20:
用語の確認
  1. 前準備
  2. goto 文 によるループ(jump文の場合もある)
  3. 繰り返す処理
  4. 条件判断が満たされれば,繰り返しからの抜け出す
  5. 条件判断に対応した,状態の変更
    上記の例では,(i<10) と i=i+1
    他にも,例えば (i<100) と i=2*i
    など,いろいろなくり返し処理がある。
  6. 繰り返しの回数が最初から分かっている場合は, 上記の例のように,一つの変数をカウンタとして用いる。


2.3 繰り返し-1(while)

V-C

#include <stdio.h> main() { int i,j; i=1; j=0; while(i<=4){ j=j+i; printf("i = %d, j = %d \n", i, j); i=i+1; } }
注意
  1. while は,くり返し処理のための構文です
  2. 条件判断が最初にあるため,最小の回数は0回です。

  3. 最初 変数 i に設定される値 = 1 は,4よりも小さいため, 条件判断が真になり,次にくり返し処理が実行されることになります。
  4. 1回目のくり返し部は,i=1 として処理されます。
  5. くり返し部の最後で,i は 1 加算され,2 になります。
  6. 続いて,条件判断に戻ります
  7. 2回目の条件判断では,i の値(=2)は,4よりも小さいため, 条件判断が真になり,次にくり返し処理が実行されることになります。
  8. 2回目のくり返し部は,i=2 として処理されます。
  9. くり返し部の最後で,i は 1 加算され,3 になります。
  10. 続いて,条件判断に戻ります
  11. 3回目の条件判断では,i の値(=3)は,4よりも小さいため, 条件判断が真になり,次にくり返し処理が実行されることになります。
  12. 3回目のくり返し部は,i=3 として処理されます。
  13. くり返し部の最後で,i は 1 加算され,4 になります。
  14. 続いて,条件判断に戻ります
  15. 4回目の条件判断では,i の値(=4)は,4と等しいため, 条件判断が真になり,次にくり返し処理が実行されることになります。
  16. 4回目のくり返し部は,i=4 として処理されます。
  17. くり返し部の最後で,i は 1 加算され,5 になります。
  18. 続いて,条件判断に戻ります
  19. 5回目の条件判断では,i の値(=5)は,4を超えているため, 条件判断が偽になり,くり返し処理が終了します。

  20. 結局このプログラムでは,printf 文により表示されるのは, i は 1 から 4 までです。 j の値は i の総和ですから,表示されるのは 1 から 10 までです。
課題:
  1. while 文の条件判断を,(i<5)としてみよう。


2.3-b 繰り返し-1b(whileを使った別の例)

V-C

#include <stdio.h> main() { int i,j; i=0; j=0; while(i<4){ i=i+1; j=j+i; printf("i = %d, j = %d \n", i, j); } }
注意
  1. カウンタの増加を,くり返し処理の前に持ってきました。
  2. このプログラムでも, 前のものとまったく同じ結果が得られます。
  3. もちろん,カウンタの操作はどこにおいてもいいのですが, プログラムの見易さを考えると,本当にどこでも良いとは言い切れません。
  4. プログラムの見易さを考慮すると, カウンタの操作は,while文の中の最初か最後にすべきです。


2.4 繰り返し-2(do)

V-C

#include <stdio.h> main() { int i,j; i=1; j=0; do{ j=j+i; printf("i = %d, j = %d \n", i, j); i=i+1; }while(i<=4); }
注意 :
  1. do を使った繰り返しは,条件判断がループの最後にあるため, 最低でも1回はループをします。
  2. このプログラムは,決められた回数だけ処理を繰り返します:
    すなわち,変数 i をカウンタとし,iが4以下のあいだ繰り返すのです。 したがって,くり返し回数は4回です。
課題:
  1. while の条件式を変えながら, 同じ動作をする,プログラムを作りたい。 そのためには,どういう条件式にしたら良いか考え, 実際にプログラムを修正して走らせなさい。


2.5 繰り返し-3(for)

V-C

次の2つのプログラムは,まったく等価です。 (I) for( @; A; B){ C; } (II) @; while( A ){ C; B; }

#include <stdio.h> main() { int i,j; j=0; for(i=1; i<=4; i++){ j=j+i; printf("i = %d, j = %d \n", i, j); } }
注意
  1. (I)と(II)を比べると,(I)のほうが,@とBの処理を構文中に取り込んでいるため, ループ回数の制御部分と,実際の処理(C)とが明確に分かれており, 人が見てわかりやすいというメリットがあります。
  2. (I)と(II)を比べると,(II)のほうが,より原始的な構文のため, かえって柔軟性が高く,さまざまな繰り返し処理を 無理なく書くことが出来ます。
課題:
  1. for の条件式(A)を変えながら, 同じ動作をする,プログラムを作りたい。 そのためには,どういう条件式にしたら良いか考え, 実際にプログラムを修正して走らせなさい。


2.6 繰り返し-4(その他の繰り返し処理)

V-C

#include <stdio.h> main() { int i; i=0; while( 1 ){ i=i+1; printf("i = %d \n", i); } }
// これ以外の無限ループの使用例 for(;;){ i=i+1; printf("i = %d \n", i); }

注意:(1つめのプログラムについて)
  1. 無限に繰り返されるループは,while(1) を使えば良い。
  2. キー操作 [Ctrl]+[C] により,強制終了できる。
  3. プログラム例後半のような使い方もあり。
  4. プログラム例後半のほうがむしろよく使われる。

2.6b 繰り返し-4b(その他の繰り返し処理)

V-C

#include <stdio.h> main() { int i,j; i=1; for(j=1; j<=100; j=j+1){ printf("i = %d \n", i); if(i>=10) break; i=i+1; } }

注意:(2つめのプログラムについて)
  1. break 文を使うことにより,ループを途中で抜け出すことが可能。
  2. このプログラムの場合,for の部分が無限ループを指定してあっても, 同じ結果になる。
課題:
  1. for の行を,for(;;){ や, while(1){ に置き換えても同じ実行結果が得られることを確認しなさい。
  2. break の行を書き換えて,4回の繰り返しで終了するプログラムに修正しなさい。


2.7 特別な制御文(switch)

V-C

#include <stdio.h> main() { #define PI 3.14159 double r,a; int i; printf("radius (HaNKeI) = "); scanf("%lf",&r); printf("1 : EN No GaIShuU \n"); printf("2 : EN No MeNSeKi \n"); printf("3 : KyuU No MeNSeKi \n"); printf("4 : KyuU No TaISeKi \n"); scanf("%d",&i); switch(i){ case 1: a=2.0*PI*r; break; case 2: a=PI*r*r; break; case 3: a=4.0*PI*r*r; break; case 4: a=(4.0/3.0)*PI*r*r*r; break; default: a=0; } printf("KoTaE Ha %lf DeSu.\n",a); }
注意
  1. 以上の構文のうち,switch() の括弧の中には式を書き, case の行には 定数を書きます。
  2. これにより,いちいち else if を重ねなくても, 処理の進み方を複数通りに振り分けることができます。


2.8 ちょっと実用的(風な)プログラムの例

プログラムとそのコメント
  1. 最大,最小値
  2. 掛け算表
  3. 10進数を2進数に
  4. 2進数を10進数に
  5. 数当てゲーム(0-1000) , 改良1 , 改良2
  6. 数当てゲーム(マスターマインド)

注意:
  1. とにかく各プログラムを動かしてみよう。
  2. 興味を持ったプログラムについては,自分なりに修正してみよう。
  3. その他,教科書にあるプログラムも打ち込んで,動かしてみよう。
//