前回の練習問題の解答例

#include <stdio.h>

int main(void)
{
	double time, temperature, speed, distance;
	
	printf("雷鳴が聞こえるまでの時間(秒):");
	scanf("%lf",&time);
	printf("気温(℃):");
	scanf("%lf",&temperature);

	speed=331.5+0.61*temperature;
	distance=speed*time;
	printf("雷までの距離は%.0fmである。\n",distance);
	return 0;
}
4つの実数型変数のうち、測定値である time と temperature の2つを scanf関数で代入している。 scanf の直前の printf では、「秒」「℃」と単位の表示も必要である。
実数型変数なので、scanf関数の第1引数は「%lf」である。「%f」でないことに注意。 また、time と temperature の前に「&」を付けるのを忘れないようにしなければならない。

条件分岐

条件分岐とは、処理を実行するかどうか、あるいは複数の処理のどれを実行するかを条件によって決める命令のことである。 C言語には条件分岐を記述する文が何種類かあるが、ここではif文だけを学ぶ。

if文の書き方(1) 処理を実行するかどうかを決める


書き方:
	if (条件) {
		処理;
	}

if から } までが if文 である。
条件は、次表の比較演算子を使った論理式(答が真か偽のどちらかになる式)で表す。
比較演算子
比較演算子意味読み方
==イコール
!=ノットイコール
>大なり
<小なり
>=大なりまたはイコール
<=小なりまたはイコール

キーボードから点数を入力し、60点以上の時だけ「合格」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int score;
		
	printf("点数:");
	scanf("%d",&score);
		
	if (score>=60) {
		printf("合格\n");
	}
	return 0;
}


if文の書き方(2) 2つの処理のどちらを実行するか決める


書き方:
	if (条件) {
		処理1;
	} else {
		処理2;
	}
この場合、if から1つめの } までを if文、else から最後の } までを else文 と呼ぶ。
キーボードから整数の点数を入力し、60点以上なら「合格」、それ以外なら「不合格」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int score;
		
	printf("点数:");
	scanf("%d",&score);
	
	if (score>=60) {
		printf("合格\n");
	} else {
		printf("不合格\n");
	}
	return 0;
}


if文の書き方(3) 3つ以上の処理のどれを実行するか決める


書き方(処理が4つの例):
	if (条件1) {
		処理1;
	} else if (条件2) {
		処理2;
	} else if (条件3) {
		処理3;
	} else {
		処理4;
	}
else if から次の } までを else if文 と呼ぶ。 else if文は、if文より後ろ、else文より前に、何個でも追加することができる。 また、else文を使わず、if文とelse if文だけを書くこともできる。
上の書き方の例では、if文とelse文の間に2つのelse if文を書いている。

キーボードから点数を入力し、59点以下なら「不可」、60〜69点なら「可」、70〜79点なら「良」、それ以外なら「優」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int score;
		
	printf("点数:");
	scanf("%d",&score);
		
	if (score<=59) {
		printf("不可\n");
	} else if (score<=69) {
		printf("可\n");
	} else if (score<=79) {
		printf("良\n");
	} else {
		printf("優\n");
	}
	return 0;
}


数式を使った論理式

論理式には数式を書くこともできる。 代入文と違い、論理式では右辺だけでなく左辺にも数値や数式を書くことができる。

整数を入力すると、偶数なら「当たり!」、奇数なら「はずれ」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int num;
		
	printf("整数:");
	scanf("%d",&num);
		
	if (num%2==0) {
		printf("当たり!\n");
	} else {
		printf("はずれ\n");
	}
	return 0;
}
イコールは「=」ではなく「==」であることに注意。

論理演算

論理式に対する演算を論理演算という。 論理演算には次表の論理演算子を使う。
論理演算子
論理演算子意味読み方
&&論理積(∧)(2つの論理式を結びつけて)〜かつ〜
||論理和(∨)(2つの論理式を結びつけて)〜または〜
!否定(¬)(1つの論理式に付けて)〜でない

以下では論理積と論理和だけを扱う。否定は扱わない。

論理積の例

キーボードから点数を入力し、0〜59点なら「不合格」、60〜100点なら「合格」と表示し、それ以外なら何も表示しないプログラム:
#include <stdio.h>

int main(void)
{
	int score;
		
	printf("点数:");
	scanf("%d",&score);
		
	if (score>=0 && score<=59) {
		printf("不合格\n");
	} else if (score>=60 && score<=100) {
		printf("合格\n");
	}
	return 0;
}


論理和の例

整数を入力すると、その整数が
 ・777
 ・偶数
のどちらかの時だけ「当たり!」と表示し、それ以外の時は「はずれ」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int num;
		
	printf("整数:");
	scanf("%d",&num);
		
	if (num==777 || num%2==0) {
		printf("当たり!\n");
	} else {
		printf("はずれ\n");
	}
	return 0;
}


演算順序

複数の論理演算子がある場合の演算順序は、
  1. 左から順に実行される。
  2. ただし、論理積が論理和より優先される。
  3. ただし、丸括弧()がある場合は、丸括弧の中が優先される。
となる。
(なお、否定は論理積・論理和よりも優先され、さらに比較演算子よりも優先される。)

論理積と論理和が混在する例

整数を入力すると、その整数が
 ・777
 ・100未満の偶数
のどちらかの時だけ「当たり!」と表示し、それ以外の時は「はずれ」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int num;
		
	printf("整数:");
	scanf("%d",&num);
		
	if (num==777 || num<100 && num%2==0) {
		printf("当たり!\n");
	} else {
		printf("はずれ\n");
	}
	return 0;
}
論理積が論理和より優先されるので、「num<100 && num%2==0」が先である。

練習問題

地球の公転周期は約365.2422日である。1年を365日にすると、地球が1周し切る前にカレンダーは次の年になるので、日付と季節がだんだんずれていってしまう。 そこで、数年に1度カレンダーに閏日を挿入することになっている。閏日を挿入する年を閏年と呼び、閏年でない年を平年と呼ぶ。
閏年の条件: 西暦を入力すると、その年が閏年か平年かを答えてくれるプログラムを作りなさい。

(ちなみに1年の長さの平均は、1つめの条件だけだと365.25日、2つめの条件を加えると365.24日、3つめまで加えると365.2425日となる。季節とカレンダーが1日ずれるのに3000年以上かかることになる。)