条件判断を利用した計算 


 
  条件判断1

   これまでに学習してきたプログラムは、上から下へ順次実行していくものであった。しかし、条件によって実行する部分を変化させたいときがある。例えば、任意の数が正のときと負のときで処理を変えたい場合などである。条件判断によって処理の流れが変化するのでこれをプログラムの分岐とも呼ぶ。
 以下に条件判断のプログラム例を示す。このプログラムは2つの実数(a,b)を入力し、aがbより大きい場合にそのことを表示するプログラムである(それ以外は何も表示しない)。
 この例のように、ifの次に大小関係などを示す演算子があり、その次の{ }内に実行したい文をおく形となる。 
 なお、この大小関係などを示す演算子の種類を以下の表(左)にまとめる。表の右はその数学表現である。
ここで、aとbが等しいときの表現はa==bであることに注意する。

  
  C言語の条件判断で使える演算子

演算子

数学表現

< a<b
> a>b
<= a≦b
>= a≧b
== a=b
!= a≠b

   

  

  条件判断1
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
/*   if01.c               */
 
#include <stdio.h>
 
int main(void)
{
    double a,b;
 
    scanf("%lf %lf",&a,&b);
 
    if (a>b)  { printf("[a,b]\n");
                printf("a>b\n");  }
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
-
-
-
-
-
-
-
-
-
-
a>b なら [a,b] と表示し、
     次の行に a>b と表示する。
-
-
-


  条件判断2(もう少し複雑な条件判断)
  
 以下のプログラムは、a,bの大小関係を詳しくレポートするものである。すなわち、a==bによって等しいかを判断する。その次の行の else if とは、aとbが等しくなかった場合で、さらに a>b であるかを判定する。その次の行の else は、どれにも該当しなかった場合であり、ここでは a<b となるはずである。  
 なお、{ }内は上の例と同じく複数の文を書くことができる。
 

 

  条件判断2
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
/*   if02.c               */
 
#include <stdio.h>
 
int main(void)
{
    double a,b;
 
    scanf("%lf %lf",&a,&b);
 
    if (a==b)      { printf("a=b\n"); }
    else if (a>b)  { printf("a>b\n"); }
    else           { printf("a<b\n"); }
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
-
-
-
-
-
-
-
-
-
-
aとbが等しかったら  a=b と表示
上以外で a>bならば   a>b と表示
それ以外なので     a<b と表示
-
-
-
 


   [問題06] 任意の実数を読み込み、その値が負ならば、error!! と画面に表示するプログラムを作りなさい。


  演習03 [問題06]の応用

   3つの実数a,b,cを読み込み、”b−4ac” が負ならば、”error!!” と画面に表示するプログラムを作りなさい。


  より複雑な条件判断


    以下のような条件判断を行うことができる。すなわち、”else if” は複数回書くことができ 
    "if"、"else if"、"else"後の中括弧{}内にさらに条件判断文をおくことができる。
    

    if  (a==1)
        {
            if (c==d) { }
            else if (c>d) { }
            else           { }
        }
        else if (a==2)
        {
     if (e==f) { }
            else if (e>f) { }
            else           { }
        }
        else if (a==3)
        {
        }
        else if (a==4)
        {
        }
        else
        {
     if (g==h) { }
            else if (g>h) { }
            else           { }
        }


   ※  上記のように文の中に文を入れることを”ネスト(入れ子構造)”するという。数学の括弧を思い描くとよく、
      中括弧の { } (”開き”と”閉じ”括弧)の数が一致する必要がある。
      例では示していないがさらに深い段階に(深くネストして)文を入れることもできる。
      


  演習04 上記[より複雑な条件判断]の利用

   2つの実数a,bを読み込み、それらの範囲に従って以下のように表示するプログラムを作りなさい。
   (工夫次第では条件判断1、2の知識だけでも実現はできる)

   a=0、b=0 ならば   ”A & B ZERO”
   a>0、b>0 ならば   ”A & B PLUS"
      a<0、b<0 ならば     ”A & B MINUS"
      上の3つ意外ならば  ”ELSE”


  条件判断のいろいろ

 条件判断の方法は上記以外にもいろいろあり、ここではそれらの例を簡単にまとめるてみる。
以下の条件判断式を使う場合は、 上のプログラム例のように if と {} の間に入れればよい。

 例: if  (!(a==b))   { printf("a is not equal to b\n"); }

 

条件判断式

意味

 (!(a==b))

論理否定[!]:aとbが等しいの否定 → aとbが等しくない

 ((a<b) && (b<c))

論理AND[&&]:a<bでかつb<c → a<b<c

 ((a<b) || (a>c))

論理OR[||]:a<bまたはa>c 


  ※ " | " は 縦棒、パイプなどと呼ばれる文字 


    -------------------------------------


  数当てゲームを作ることを考えてみよう!!

   今回の数当てゲームの定義と方法

   (1) 出題者は4ケタの整数(1000〜9999)aを考える。
   (2) 解答者は、(2-1)その整数が異なる2つの整数b,c(b<c)以内に入っているかを出題者に尋ねるか
            (2-2)直接答えの候補dを言う。
   (3)出題者は、(2-1)の場合、正確に b<=a<=c か 否かを 答える(3-1)。
            (2-2)の場合 a=d か 否かを 答える(3-2)。
   (4) (3-2)が成立すれば正解、否の場合 (2)にもどる。
   (5) 出題者と解答者を入れ替えて(2)の回数の少なさを競う。
  
   例 (1) 出題者が考えた数 7654
      (2) 解答者の問1 「その数は 2000以上5000以下ですか?」 (少々ギャンブル) 
      (3) 出題者の答1 「入っていません!」              (目論見失敗)
      (4) 解答者の問2 「その数は 5001以上7500以下ですか?」 
      (5) 出題者の答2 「入っていません!」
      (6) 解答者の問3 「その数は 7501以上8500以下ですか?」 (この範囲にかけてみる) 
      (7) 出題者の答3 「残念ながら、入ってしまいました!!」
         ・・・・・・・・・・・・
     (y) 解答者の問x 「その数は7654ですね?」
     (y+1) 出題者の答x 「そのようです。。。」

   ※ 後に学習する繰り返し処理と疑似乱数生成でより洗練された本数当てゲームを作成することが可能となる。
     (出題者がコンピュータ、解答者は人間) 
  


   [問題07] 任意の実数を読み込み、その値が1.0以上100.0以下なら ”IN” 、それ以外なら ”OUT” と表示する
          プログラムを作りなさい。


  演習05 [条件判断のいろいろ]のさらなる利用

   2つの実数a,bを読み込んで、以下の計算を行い、
      c=a(a-b)
      d=b(a+b)
   -20.5≦c≦30.2 かつ -10.1<d<15.7 なら ”IN” 、
   それ以外なら ”OUT” と表示するプログラムを作りなさい。

 

     前述の数当てゲームプログラムの一例 (ここまでの知識のみ利用なので、遊ぶのは大変)

  (I)  最初に出題者がプログラムソースのa=の値を正確に書き換えて、コンパイル後、解答者にコンピュータを使用させる。
  (II) 解答者は、a.outを起動して、2つの4ケタの整数を入力するか、最初の整数に1000未満の整数と正解候補を入れる。
  (III) プログラムは(2−1)か(2−2)かを判断して解答する。(2−2)かつ正解でなければ、解答者は(II)を繰り返す。

   

 戻る