第 8 回 清書(4),if文

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

8-1. if文

if 文の基礎

if 文は条件式が正しい時と正しくない時で動作を変える場合に使用します。 構文は次の通りです(但し、 else 以下は省略することができます)。

if(条件式){
   条件が正しい時の動作
}else{
   条件が正しくない時の動作
}

例えば、方程式 ax +b=0 を満たす xを求めることを考えましょう。 この時、a の値が 0 か 0 でないかで解き方が異なります。 これを C 言語では次のような構文で書きます。

if( a が 0 である){
    a が 0 の時の解法
}else{
    a が 0 でない時の解法
}

「a が 0 である」という条件式は次のように書きます。

   a==0

「等しい」という条件は、イコール記号「=」を二つ続けて書くことに注意して 下さい。一つだけ書くと「変数 a に 0 を記憶しなさい」という別の意味になっ てしまい、エラーは一切出ませんが、プログラムが正常に動作しません。 プログラムミスの中でよく起こり得ることなので、もしプログラムを実行して 正常に動作しない場合は、 if 文などの条件式を確認するようにして下さい。 なお、このミスを予防するために 0==a と書く人もいます。これ だと0=aを誤って書いた時、左辺に変数の来ない代入文になるため、 コンパイラがエラーを出します。 ただ、これは左辺が数字のときだけうまくいくという部分的な解決法なので、 本来必要なプログラムをチェックする能力は上達しない側面もあります。

条件を表現する記号には次のようなものがあります。

a == b
a と b は等しい
a != b
a と b は等しくない
a < b
a は b より小さい
a > b
a は b より大きい
a <= b
a は b 以下
a >= b
a は b 以上

論理演算

条件 A と B があった時、その両方が成立している時だけ文 X を実行するに は次のようにします。

if(A){
  if(B){
    X;
  }
}

一方、条件 A と B のどちらか一方が成立していれば X を実行するには次の ようにします。

if(A){
  X;
}else{
  if(B){
    X;
  }
}

このように if 文であれば複数の条件の組合せを処理することができます。 しかし、これを論理演算を用いて一つの条件文にまとめることができます。 ここでは C 言語での論理演算の表現を学びます。

C 言語において、条件 A と B に対して、両方が成立した時にだけ成立するこ とを表すには (A)&&(B) と書きます。 「a が 0 で b も 0 」という条件文を表すには (a==0)&&(b==0) と書きます。 これは一般にはAND 演算と呼ばれてます。

ABA AND B
成立成立成立
不成立成立不成立
成立不成立不成立
不成立不成立不成立

一方、C 言語において、条件 A と B に対して、どちらか一方が成立すれば成 立することを表すには (A)||(B) と書きます。 「a または b のいずれかが 0 」という条件文を表すには (a==0)||(b==0) と書きます。 これは一般にはOR 演算と呼ばれてます。

ABA OR B
成立成立成立
不成立成立成立
成立不成立成立
不成立不成立不成立

さらに、C 言語において、条件 A に対して、A が不成立のときだけ成 立することを表すには !(A) と書きます。 「a が 0 でない時」は a!=0 とも書けますが、!(a==0) とも書けます。 これは一般にはNOT 演算と呼ばれてます。

ANOT A
不成立成立
成立不成立

上記の例をもう一度とりあげます。 A と B の両方が成立している時 X を実 行するには次のように書きます。

if((A)&&(B)){ X; }

同じように「A と B のどちらか一方が成立している時 X を実行する」は次の ように書けます。

if((A)||(B)){ X; }

8-2. 付録

練習問題

演習8-1

次のプログラムは方程式 ax +b=0 を解くように見えま すが、おかしいところが全部で 5 箇所あるので正しい答を求められません。 このプログラムを正しく動くように直して、次の方程式の解を求めなさい。

  1. 2x -4=0
  2. -2x +1=0
  3. 0x +3=0
  4. 0x +0=0
#include <stdio.h>
main(){
  int a,b,x;
  a=2;
  b=-4;
  if(a=0){
    if(b=0){
      printf("x は任意の数\n");
    }else{
      printf("解なし\n");
    }
  }else{
    x=b/a;
    printf("x = %d\n",x);
  }
}
ヒント

それぞれの解をまず手計算で求めて、プログラムの出力と比較しなさい。

演習8-2

二次方程式 ax2 +bx +c =0 ( a 0 ) の解を求めるプログラムを書きなさい。

そして、作ったプログラムで次の方程式を解きなさい。

  1. 2x2 -5x -3 =0
  2. 4x2 -4x +1 =0
  3. x2 -x -1 =0

演習8-3

方程式 ax +b=0 の解を求める下のプロ グラムを完成させなさい。 また、完成させたプログラムを用いて、次の方程式を解きなさい。

  1. 2x +1=0
  2. 5x +0=0
  3. 0x +3=0
  4. 0x +0=0
#include <stdio.h>
main(){
  float a,b;
  float x;

  a=10;
  b=20;
  printf("%fx+%f=0 の解は",a,b);
  if(/* a も b も 0 */){
    printf("任意の値\n");
  }
  if(/* a は 0 だが、 b は 0 でない*/){
    printf("ない\n");
  }
  if(/* a は 0 でない */){
    /* x の計算 */
   printf("%f\n",x);
  }
}

演習8-4

以下は与えられた数が 2 の倍数、 3 の倍数、 6 の倍数のどれかを判定する プログラムです。 プログラムを完成させなさい。 そして、次の数に対してプログラムを走らせて正しく答が出力されることを確 かめなさい。 なお、 x % y は x を y で割った余りを求めます。

  1. 60
  2. 15
  3. 32
  4. 35
# include <stdio.h>
main(){
  int n,d2,d3;

  n = 100;
  d2 = n % 2;
  d3 = n % 3;
  printf("%d は",n);
  if((d2!=0)&&(d3!=0)){
    printf("2 でも 3 でも割れない\n");
  }else{ 
    if(/* 2 の倍数の判定 */){
      printf("2 の倍数\n");
    }else{ 
      if(/* 3 の倍数の判定 */){
        printf("3 の倍数\n");
      }else{if(/* 6 の倍数の判定 */){
            printf("6 の倍数\n");
           }else{
              /*その他*/
           }
      }  
    }
  }
}

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科