第二回(if文、switch文)


標準入力

if文、switch文に入る前に、標準入力について説明しておきます。標準入力とは、オペレーティングシステム(OS)の実行するプログラムがデータを受け入 れるデフォの入り口・・・まあWindowsやLinuxの場合は、キーボードからの入力と考えてもらえばいいです。
ようするに、プログラムである文字を入れると、の文字が望んだ位置に表示されたり、ある数字を入れたら、その数字だからその数字によって処理を変えたり・・・とかするときのものです。 標準入力用の関数は、いろいろあるので、特によく使うものをあげておきます。

fgets

fgetsの引数は、第一引数が文字を格納する変数、第二引数がそのとりたい文字の最大数(最後に\0が付加されるので、実際は最大文字数より1文字減ります。 )、第三引数はstdin(standard inの略です。)です。
入力は1行できます。(改行が来るまで、つまり、Enterキーを押すと終了します。(それと同時に末尾に\nも入ります。))
※getsという関数がありますが、セキュリティの関係で使うことは推奨されていません。(僕自身、gets関数は一度も使ったことがありません。)

サンプルソース
#include<stdio.h>

int main(void);

int main(void){
	
	char str[256];
	
	fgets(str, 256, stdin);
	
	printf("%s", str);
	
	return(0);
}

このプログラムを実行して、256文字(実際は\0がはいるので、255文字)までの好きな文字(半角文字だと255文字、全角だと、127文字まで)を入力して、入 れると、このソースの変数宣言にある[256]は配列の添字で、これは0番目から255番目までの256個の変数をとったという意味です。 配列については第五回の配列で説明します。

また、これを使って入力した数字の文字列("100"など)を数字に変えたい場合、atoiという関数を用います。使い方の例はこのような感じです。

サンプルソース
#include<stdio.h>
#include<stdlib.h>

int main(void);

int main(void){
	
	char str[256];
	int x;
	
	fgets(str, 256, stdin);
	x = atoi(str);
	
	printf("%s↓\n%d\n", str, x);
	
	return(0);
}
atoi

atoiという関数は、第一回で話した#include<stdio.h>というヘッダファイルに入っていません。 そのため、atoi関数の入った、#include<stdlib.h>というヘッダファイルを使います。
atoi関数の使い方は、char型の文字列変数をfgetsを使うときと同じように使います、また、変換後の数字を入れたいint型の変数を宣言しておきます。
そして、変換後の数字を入れたいint型の変数 = atoi(char型の文字列変数)という形で入れます。
この場合はchar型のstrという文字列変数を、xというint型の変数に数字に変換して入れています。

getchar

getcharには引数はありません。返り値として、入力した文字が返ります。入力できる文字は半角1文字だけです。(例えば、abcと入力しても、最初のaしか返りません。)

サンプルソース
#include<stdio.h>

int main(void);

int main(void){
	
	char c;
	
	c = getchar();
	
	printf("%c", c);
	
	return(0);
}
実行例
abc
a

if文

ではif文です。if文は単純に「もし、条件式が成り立つなら動作をする」という感じのものです。形としては、

#include<stdio.h>

int main(void);

int main(void){
	
	if(条件式){
		動作
	}
	return(0);
}

のような感じです。

関係演算子

条件の部分で扱えるものを関係演算子と言います。比較演算子とも言います。これはいろいろとありますが、数式で書くように=を書きたい場合は==と表現するなど、少し違うところがあります。 =だと、C言語では代入になってしまい、そこがエラーの原因になったりします。そこについて説明します。

== 等しいの意味です。
> 大なりです。(右より左のほうが大きいの意味です。)
< 小なりです。(右より左のほうが小さいの意味です。)
>= 大なりイコールです。(右より左のほうが大きい、または等しいの意味です。)
<= 小なりイコールです。(右より左のほうが小さい、または等しいの意味です。)
!= 等しくないの意味です。

真と偽

関係演算子で条件が成立した場合を真といい、0以外を返します。逆に成立しなかった場合を偽といい、0を返します。
ちなみにif文の条件式は0以外の整数が入っていれば通り、0が入れば通りません。
※一般的には真は0以外の値で、偽は0です。

一般的なif文

C言語の基本的なif文は、if、else if、elseに分かれています。まずは単純な例を見てみましょう。

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 1;
	
	if(x == 1){
		printf("ifを通りました。");
	}
	else{
		printf("elseを通りました。");
	}
	
	return(0);
}
実行結果
ifを通りました。

逆に次はifの条件が成立しないようにしてみました。

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 2;
	
	if(x == 1){
		printf("ifを通りました。");
	}
	else{
		printf("elseを通りました。");
	}
	
	return(0);
}
実行結果
elseを通りました。

プログラムは上から実行されていくので、if文→else if(else ifは複数あってもいいです。)→ elseという流れで条件を読みます。そのため、上から細かな条件をつけていく必要があります。正しい例と間違った例とその実行結果を載せておきます。

正しい例
#include<stdio.h>

int main(void);

int main(void){
	
	int x = 77;
	
	if(x >= 100){
		printf("100以上です。\n");
	}
	else if(x >= 50){
		printf("50以上です。\n");
	}
	else if(x >= 10){
		printf("10以上です。\n");
	}
	else{
		printf("10未満です。\n");
	}
	
	return(0);
}
実行結果
50以上です。
間違った例
#include<stdio.h>

int main(void);

int main(void){
	
	int x = 77;
	
	if(x >= 10){
		printf("10以上です。\n");
	}
	else if(x >= 100){
		printf("100以上です。\n");
	}
	else if(x >= 50){
		printf("50以上です。\n");
	}
	else{
		printf("10未満です。\n");
	}
	
	return(0);
}
実行結果(この実行結果は間違っています。)
10以上です。

さらに細かな条件の場合の正しい例と間違った例を載せておきます。

正しい例
#include<stdio.h>

int main(void);

int main(void){
	
	int x = 20;
	
	if(x == 20){
		printf("20です。\n");
	}
	else if(x >= 100){
		printf("100以上です。\n");
	}
	else if(x >= 50){
		printf("50以上です。\n");
	}
	else if(x >= 10){
		printf("10以上です。\n");
	}
	else{
		printf("10未満です。\n");
	}
	
	return(0);
}
実行結果
20です。
間違った例
#include<stdio.h>

int main(void);

int main(void){
	
	int x = 20;
	
	if(x >= 100){
		printf("100以上です。\n");
	}
	else if(x >= 50){
		printf("50以上です。\n");
	}
	else if(x >= 10){
		printf("10以上です。\n");
	}
	else if(x == 20){
		printf("20です。\n");
	}
	else{
		printf("10未満です。\n");
	}
	
	return(0);
}
実行結果(この実行結果は間違っています。)
10以上です。

if文のネスト

if文のネストとはif文の入れ子・・・わかりやすく言うと、if文の中にif文を書くことです。そうすれば、ifの中でさらに細かな条件をつけることが出来ます。 以下に例のプログラムを示します。

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 60;
	
	if(x >= 10){
		if(x >= 100){
			printf("100以上です。\n");
		}
		else if(x >= 50){
			printf("50以上です。\n");
		}
		else if(x >= 10){
			printf("10以上です。\n");
		}
	}
	else{
		printf("10未満です。\n");
	}
	
	return(0);
}
実行結果
50以上です。

条件演算子

条件演算子とは、条件に応じて使う値を変えることができる演算子です。形は、 条件 ? A : Bという形で、Aは条件を満たしている(真) ときの値で、Bが条件を満たしていない(偽)ときの値を入れます。実際の例をみてみましょう。

サンプルソース
#include<stdio.h>
#include<stdlib.h>

int main(void);

int main(void){
	
	char number[256];
	int num;
	
	fgets(number, 256, stdin);
	num = atoi(number);
	
	num = num > 100 ? 100 : num;
	
	printf("num = %d\n", num);
	return(0);
}
実行結果1
10
num = 10
実行結果2
120
num = 100

これは、if文でも表現することができます。以下は条件演算子を使わずに書いてみた例です。

サンプルソース
#include<stdio.h>
#include<stdlib.h>

int main(void);

int main(void){
	
	char number[256];
	int num;
	
	fgets(number, 256, stdin);
	num = atoi(number);
	
	if(num > 100){
		num = 100;
	}
	
	printf("num = %d\n", num);
	return(0);
}

論理演算子

論理演算子とは、if文に2つ以上の条件をつけたい場合に用います。これをうまく使えば、ネストする必要がないことも多々あります。 特に使う2つを載せておきます。

&&

&&は"かつ"の意味を持ちます。if(Aの条件 && Bの条件)となっている場合、AとBの条件が両方成立したときのみ入ります。
ちなみにこちらはAの条件が成立しなかった時点でBの条件を評価(実行)しません。

||

||は"または"の意味を持ちます。if(Aの条件 || Bの条件)となっている場合、AとBの条件が両方成立しないときのみ入りません。
こちらはAの条件が成立した時点でBの条件を評価(実行)しません。

!

!は否定の意味を持ちます。


以下に論理演算子の例のプログラムを載せておきます。
まず、&&を使用した例のプログラムです。

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 10, y = 20;
	
	if(x == 10 && y == 20){
		printf("両方の条件が成り立っています。\n");
	}
	else if(x == 10){
		printf("yの条件のみ成り立っています。\n");
	}
	else if(y == 20){
		printf("xの条件のみ成り立っています。\n");
	}
	else{
		printf("両方の条件が成り立っていません。\n");
	}
	
	return(0);
}
実行結果
ソースそのままのとき、
両方の条件が成り立っています。

x = 5; y = 20;のとき、
yの条件のみ成り立っています。

x = 10; y = 10;のとき、
xの条件のみ成り立っています。

x = 1; y = 3;のとき、
両方の条件が成り立っていません。

次に||を使用した例のプログラムです。

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 10, y = 20;
	
	if(x == 10 || y == 20){
		printf("どちらかの条件が成り立っています。\n");
	}
	else{
		printf("両方の条件が成り立っていません。\n");
	}
	
	return(0);
}
実行結果
ソースそのままのとき、
どちらかの条件が成り立っています。

x = 5; y = 20;のとき、
どちらかの条件が成り立っています。

x = 10; y = 10;のとき、
どちらかの条件が成り立っています。

x = 1; y = 3;のとき、
両方の条件が成り立っていません。

switch文

switch文は、条件に書いたのと一緒の条件がきたとき、その中を実行します。if文よりより具体的な数で分ける場合には便利なものです。 「もし、条件1なら、条件1の中の動作1を行う」といった感じです。一般的な形は以下のようなものです。

#include<stdio.h>

int main(void);

int main(void){
	
	switch(数値や文字、数式や変数){
		case (条件1):
			動作1
			break;
		case (条件2):
			動作2
			break;
		case (条件3):
			動作3
			break;
		default:
			動作4
			break;
	}
	return(0);
}

重要なところとしては、各caseの中にbreak;を書くことです。これを書くことによって、switch文の中から出ます。 もし、break;を書かなかった場合、それ以下のswitch文内の動作をすべて行ってしまいます。そのため、break;を書くのを忘れないようにしましょう。

一般的なswitch文

流れとしては、switch文の上から順番に条件を見ていくようです。それでは例のプログラムを2つ用意したので、見てみましょう。

条件が数字の場合のプログラム
#include<stdio.h>

int main(void);

int main(void){
	
	int x = 5;
	
	switch(x){
		
		case 1:
			printf("1です\n");
			break;
		case 3:
			printf("3です\n");
			break;
		case 5:
			printf("5です\n");
			break;
		default:
			printf("偶数、または7以上の数字です\n");
			break;
	}
	return(0);
}
実行結果
5です

x = 2のとき、
偶数、または7以上の数字です

x = 1のとき、
1です

x = 77のとき、
偶数、または7以上の数字です
条件が文字の場合のプログラム
#include<stdio.h>

int main(void);

int main(void){
	
	char c = '1';
	
	switch(c){
		
		case '1':
			printf("1です\n");
			break;
		case 'R':
			printf("Rです\n");
			break;
		case 'C':
			printf("Cです\n");
			break;
		default:
			printf("その他です\n");
			break;
	}
	return(0);
}
実行結果
1です

x = 'R'のとき、
Rです

x = 1のとき、
その他です

※x = '1'のように1という文字ではなく、1という数字を入れています。そのため、その他と判断されました。

また、switch文も複数の条件をつけることもできます。例のプログラムをどうぞ

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 1;
	
	switch(x){
		
		case 1:
		case 3:
		case 5:
		case 7:
		case 9:
			printf("10以内の奇数です。\n");
			break;
		case 2:
		case 4:
		case 6:
		case 8:
		case 10:
			printf("10以内の偶数です。\n");
			break;
		default:
			printf("10を超えています。\n");
			break;
	}
	return(0);
}
実行結果
10以内の奇数です。

x = 6のとき、
10以内の偶数です。

x = 12のとき、
10を超えています。

if文とswitch文の使い分け

if文はもし、1〜9なら・・・や、もし、23〜77なら・・・など、かなり長い範囲での条件の場合に便利です。switch文は もし、1なら・・・や、もし、5か6なら・・・といった、はっきりとした範囲での条件で使うと便利です。ちなみに僕自身は、if文を多用しています。

標準入力を用いたif文

標準入力を用いると、いちいち、変数に数を代入してコンパイル&実行する手間がなくなり便利です。例のプログラムを載せておきます。

#include<stdio.h>
#include<stdlib.h>

int main(void);

int main(void){
	
	char str[256];
	int buff;
	
	printf("何か数字を入れてください。\n");
	fgets(str, 256, stdin);
	buff = atoi(str);
	
	if(buff >= 0 && buff <= 20){
		printf("%dは0〜20の中です。\n", buff);
	}
	else if(buff > 20 && buff <= 50){
		printf("%dは21〜50の中です。\n", buff);
	}
	else if(buff > 50 && buff <= 100){
		printf("%dは51〜100の中です。\n", buff);
	}
	else{
		printf("%dは0未満、または100以上です。\n", buff);
	}
	return(0);
}

基本問題

if文で標準入力から数字を入力して、それが偶数か、奇数かを表示するプログラムを作ってください。また、switch文でも作ってください。

応用問題

左下の座標が(10, 20)、右上の座標が(30, 40)の正方形の中に点Aがあるかどうかを出力するプログラムを作成してください。 点Aの座標は標準入力し、正方形の線上は内部とします。

次回予告

次回は反復制御文のfor文、while文について説明します。

戻る