Lesson 2 条件分岐処理

1
Lesson 2 条件分岐処理
僕らは日常の生活でも、「もし∼だったら・・・をし、そうでなかったら***をする」というような条
件判断をしながら生活している。たとえば「明日いい天気だったら、布団を干そう」などのように、僕らの
生活は様々な条件によって分岐しながら進んでいる(条件分岐)。プログラミングにおいて、上記の「もし
(if)」を扱う文法を if文 と呼ぶ。 if文はきわめて重要で、これがなければまともにプログラムは書けない
ほどである。今回は if文をつかった条件分岐処理を学ぼう。
2-1 if文
ある変数 a が与えられたとき、その絶対値 |a| を計算するプログラムを作成したい。このプログラムに
は、条件分岐処理が必要である。というのも、もしa が正であれば何もする必要はなく、|a|=a である。a
が負であれば、|a|=-a である。この一連の処理をプログラムで書くと、次のようになる。
sample5.c
/*
sample5.c 値aの絶対値を出力するプログラム
*/
#include<stdio.h>
main()
{
double a, abs_a; /*abs_aは絶対値を格納するための変数*/
printf("値を入力してください:");
scanf("%lf", &a);
/*aの値をキーボードから入力*/
}
if( a >= 0 )
/*条件分岐処理*/
{
abs_a = a;
}else{
abs_a = -a;
}
printf("%lfの絶対値は%lfです。\n", a, abs_a);
実行結果は以下の通り。
[m02354@cad23 ~]# ./a.out
値を入力してください:-0.01
-0.010000の絶対値は0.010000です。
[m02354@cad23 ~]#
・if文の文法
上のプログラムsample5.cの動きを見れば分かるように、if文の文法は
if(条件式)
{
処理A;
}else{
処理B;
}
2
となっている。条件式が「真」ならば、if(条件式)直後の{...}内の処理Aだけが行われる。逆に「偽」な
らば else 後の{...}内の処理Bだけが行われる 1 。条件式は、等号や不等号をつかって記述する。以下に、
条件式に使われる記号を列挙しておこう:
演算子
使い方
等号
a == b
a>b (a<b)
不等号
a>=b (a<=b)
a != b
意味
aとbが等しいときに真
aがbより大きい(小さい)ときに真
aがbと等しいか、それより大きい(小さい)ときに真
aとbが異なるときに真
また、条件が複数存在するときは、次の記号を使う。
and記号 a==b && c>d aがbと等しく、かつ、cがdより大きいときに真。
or記号 a==b || c>d aがbと等しいか、または、cがdより大きいときに真。
ちなみに、条件式 a==b は、aとbが等しいとき式全体が値1を持つようになっている。つまり、もし
x=(a==b)
という代入を実行すれば、xは1になる。数字の1は「真」という意味に使われる。
if(1)
{
処理A;
}
を試してみよう。処理Aは必ず実行される。逆に0は、「偽」の意味を代弁する。if(0){ ... }では、{ }の中身は必ず
スキップされる。
2-2 if文のバリエーション
if文にはいくつかバリエーションがあって、様々な条件分岐を記述できる。単純なものとして例えば、
else{ ... }以下は省略できる。
if( a==b )
{
処理A;
}
と書いた場合、aとbが等しかったときだけ「処理A」が行われる。なのでaとbが等しくなければ、何もしな
いことになる。また、上の文で「aとbが等しかった場合において、特にcよりdが大きかった場合にかぎり処
理Aを行う」と記述したい場合は次のような二通りの方法がある:
if(
{
}
a==b )
if(c>d)
{
処理A;
}
if( a==b && c>d )
{
処理A;
}
上の二つのif文は全く同じ働きをするが、右の例の方がすっきりしているので、普通は右のように書く。右
の記号 && は論理演算子と呼ばれ、日本語でいう「かつ」、英語で言う and を意味する。論理式
a==b && c>d
1
else は「∼でなければ」という意味を持っている。
3
はaとbが等しいと同時に、cがdより大きい場合にのみ真となる。論理式はほかに || があり、これは日本語
で言う「または」、英語で言う or を意味する。論理式
a==b || c>d
はaとbが等しいかあるいは、cがdより大きい場合に真となる。もう一つ、 !
もよく用いられるこれは日本
語で言う「∼でない」、英語でいう not を意味する。論理式
!(c>d)
はcがdより大きいということが成り立っていないときに真になる。つまりc<dと同じ意味になる。
演算子
使い方
意味
&&
a==b && c>d
aとbが等しく、かつ、cがdより大きいとき、真
||
a==b || c>d
aとbが等しいか、あるいは、 cがdより大きいとき、真
!
!(a==b)
a==bが成り立っていないとき、真
また「aとbが等しくなかった時には、eよりfが小さい場合に限り処理Bを行う」ことを追加したいとしよ
う。そのときは右のif文にさらに追加して
if( a==b )
{
処理A;
}else if( e>f ){
処理B;
}
if( a==b )
{
処理A;
}else{
if( e>f ){
処理B;
}
}
と書く。この二つも、全く同じ内容である。次のプログラムは、xy平面上の点(x,y)の座標値を取得して、そ
の点がどの象限に属するかを出力するプログラムである。if文の働きを確認しよう。
sample6.c
/* sample6.c (x,y)の属する象限を出力する */
#include<stdio.h>
main()
{
double x, y;
int shogen;
printf("x座標の値:"); scanf("%lf", &x);
printf("y座標の値:"); scanf("%lf", &y);
if( x>=0 && y>=0 ){
shogen = 1;
}else if(x<0 && y>=0){
shogen = 2;
}else if (x<0 && y<0){
shogen = 3;
}else{
shogen = 4;
}
printf("点(%lf, %lf)は第%d象限に属する。\n", x, y, shogen);
}
4
【Problem】sample6.cを作成し、動作を確認せよ。if文の組み合わせ方は他にも可能である。思いつく限
り試してみよ。
【提出課題】2次方程式(a 0)
ax2 + bx + c = 0
は判定式
D = b2 − 4ac
が正であるときに2つの実数解をもち、負であるときは二つの虚数解を持つ。ゼロならば、一つの実数解を
もつ。係数a,b,cを取得して、二次方程式が上の三つのうちどの種類の解を持つかを判定するプログラムを作
れ。
【発展課題】上のプログラムをに、二次方程式の解を出力する機能を付け加えよ。