コンテンツ
C言語入門 Lesson3 条件式
C言語入門 Lesson3のゴール
キーボードで入力した数字(1~10)が
「"1"のときは"100円です。"
"2"のときは"200円です。"
"それ以外は"1000円です。"」
と出力するプログラムを作ろう。
今回は新たに“1のとき,2のとき,それ以外の場合について、判断を行う条件式”について学びます。
Lesson3ではLesson2で学んだ
①キーボードから入力した数字を受け取る
②入力した数字を、[変数]という箱に格納する
を使います。
さらに新たに以下の点を学びます。
③[変数]に入った値を、[条件式]を使って判断する
④判断の結果を標準出力関数で出力する
というプログラムを作成します。
C言語での条件式の表現方法は2つ
①if~else~を使う方法(Lesson3-1として紹介)
条件式で使うifの文法[1]if~else if ( 条件判定1 ) { 条件判定1が成立した場合に行う処理 } else { 条件判定1が成立しなかった場合に行う処理 }
条件式で使うifの文法[2]if~elseif~else if ( 条件判定1 ) { 条件判定1が成立した場合に行う処理 } else if ( 条件判定2 ) { 条件判定1が成立しなかった場合、かつ 条件判定2が成立した場合に行う処理 } else { 条件判定1,条件判定2 ともに成立しなかった場合に行う処理 }
文法に記載した通り、条件判定を行いたい値を「条件判定1」、「条件判定2」の値とします。そして、ifで条件判定1の値が成立するかどうかを判断します。もし条件が成立した場合は、ifの中の処理を行い、条件が成立しなかった場合はelse側の処理を行います。
else ifの場合も同様ですが、先にifで条件判定1の判断を行い、条件判定1が成立しなかった場合にelse ifの条件判定2の処理を行います。
②switch~caseを使う方法(Lesson3-2として紹介)
条件式で使うswitch~case~の文法 switch ( 条件判定 ) { case 条件判定の値1: 条件判定の値が1の時に行う処理 break; case 条件判定の値2: 条件判定の値が2の時に行う処理 break; ・・・ default : ※条件判定1~の値で成立しなかった場合に行う処理 break; }
switch~case~で条件判定を行う場合は、条件判定に使った値について、複数の条件判断ができます。そして、いずれの値も満たせなかった場合には、defaultの処理を行います。
なお、case~default~いずれの処理でも、「break」の一文があります。この「break」を入れるとその場所で処理が終了し、switch~case~の処理から抜けることを意味します。
if~else~の処理について、次のサンプルプログラムで確認します。キーボードで”1″、”2″、”その他”を入力して、違う値を出力することを確認します。
Lesson3-1 サンプルプログラム
<サンプルプログラム ソースファイル [Lesson3-1.c] >
/* Lesson3 Sample Program */
#include <stdio.h>
void main ( void )
{
/* int型は、数字を扱うという意味の定義です。 */
/* int型のnumberという変数を定義します。
このnumberにキーボードで入力した数字を代入します。 */
int number;
/* int型のmoneyという変数を定義します。
このmoneyに結果で表示したい金額を代入します。 */
int money;
printf("キーボードで数字(1~10)を入力してください。\n");
/* 「scanf」の関数を使って、キーボードで入力した数字を
"number"という変数に代入します。*/
scanf("%d", &number);
/* キーボードで入力した数字が"1"の場合、
という条件式を作ります。*/
/* キーボードで入力した数字が"1"の場合のみ、
if分の { } で囲まれた処理を行います。 */
if ( number == 1 ) {
/* numberが"1"の場合はmoneyに100を代入します。 */
money = 100;
}
/* キーボードで入力した数字が"1"ではなかった場合、
次の"else if"の判定処理を行います。 */
/* キーボードで入力した数字が"2"の場合、
という条件式を作ります。*/
else if ( number == 2 ) {
/* numberが"2"の場合はmoneyに200を代入します。 */
money = 200;
}
/* キーボードで入力した数字が"1"でも"2"でも
なかった場合、次の"else"の中の処理を行います。 */
else {
/* numberが"1"でもなく"2"でもない場合は
moneyに1000を代入します。 */
money = 1000;
}
/* 変数 moneyを使って結果を出力します。 */
printf("%d 円です。\n", money);
/* 関数の出力をreturnで行います。
main関数がvoid(空)なので、何も値をreturnしません。 */
return;
}
<実行結果 [Lesson3_1.c]>
PS C:\Cprogram> gcc lesson3_1.c -o lesson3_1.exe
PS C:\Cprogram> .\lesson3_1.exe
キーボードで数字(1~10)を入力してください。
1
100 円です。
PS C:\Cprogram> .\lesson3_1.exe
キーボードで数字(1~10)を入力してください。
2
200 円です。
PS C:\Cprogram> .\lesson3_1.exe
キーボードで数字(1~10)を入力してください。
10
1000 円です。
<サンプルプログラム ソースファイル [Lesson3-2.c] >
/* Lesson3-2
キーボードで入力した数字が
「"1"のときは"100円です。"
"2"のときは"200円です。"
それ以外は"1000円です。"」
と出力しよう。 */
#include <stdio.h>
void main(void)
{
int number;
int money;
printf("キーボードで数字(1~10)を入力してください。\n");
/* 「scanf」の関数を使って、キーボードで
入力した数字を"number"という変数に代入します。*/
scanf("%d", &number);
/* switch文を使って、条件判定を行います。 */
switch (number)
/* numberの値が、case文の条件に一致するかの判定を行います。 */
{
case 1: /* numberが"1"の場合 */
/* numberが"1"の場合はmoneyに100を代入します。 */
money = 100;
break;
case 2: /* numberが"2"の場合 */
/* numberが"2"の場合はmoneyに200を代入します。 */
money = 200;
break;
default: /* numberが"1"でもなく"2"でもない場合 */
/* numberが"1"でもなく"2"でもない
場合はmoneyに1000を代入します。 */
money = 1000;
break;
}
/* moneyを使って結果を出力します。 */
printf("%d 円です。\n", money);
return;
}
<実行結果 [Lesson3_2.c]>
PS C:\Cprogram> gcc lesson3_2.c -o lesson3_2.exe
PS C:\Cprogram> .\Lesson3_2.exe
キーボードで数字(1~10)を入力してください。
1
100 円です。
PS C:\Cprogram> .\Lesson3_2.exe
キーボードで数字(1~10)を入力してください。
2
200 円です。
PS C:\Cprogram> .\Lesson3_2.exe
キーボードで数字(1~10)を入力してください。
10
1000 円です。
Lesson3_1.cとLesson3_2.cは、(if~else~)と(switch~case~)で文法が異なりますが、同じ出力結果を得ることができました。C言語では、異なるプログラムでも同じ結果を得ることができます。なお、ifを使うかswitchを使うかについては、どのようなプログラムを作るかによって、用途に応じて使い分けを行います。
if文など条件式の有効範囲
if文については、以下の通り条件判定が成立した時に行う処理がありますが、{ }をつけなくてもif文を使うことができます。その場合、どこまでif文で判定されるかを確認します。以下のサンプルプログラムの結果がどうなるか確認してみましょう。
Lesson3-3 サンプルプログラム
<サンプルプログラム ソースファイル [Lesson3-3.c] >
/* Lesson3 Sample Program */
#include <stdio.h>
void main(void)
{
int number = 0;
int moneyA = 0;
int moneyB = 0;
if ( number == 1 )
moneyA = 100;
moneyB = 500;
printf("moneyA は %d 円です。\n", moneyA);
printf("moneyB は %d 円です。\n", moneyB);
return;
}
変数 number,moneyA,moneyBともに0で初期化を行います。そして、次のif条件式でnumberが1の場合に実行する処理を追加しています。
<実行結果 [Lesson3_3.c]>
PS C:\Cprogram> gcc lesson3_3.c -o lesson3_3.exe
PS C:\Cprogram> .\Lesson3_3.exe
moneyA は 0 円です。
moneyB は 500 円です。
実行結果を確認すると、moneyAは0円、moneyBは500円となっています。つまり、numberが0なので、以下のnumber==1の場合はmoneyA=100という処理の部分が実行されませんでした。次のmoneyB = 500;の処理は実行されて、0から500に値が代入されています。
if ( number == 1 )
moneyA = 100;
条件式の有効範囲まとめ
{ }で括られている範囲はすべて実行されますが、{ }で括られていない場合は、1行のみ実行されます。
C言語条件式 演習問題(Lesson3)
Lesson3 – Problem1
次のプログラムの実行結果、変数「ans」の値が何になるかを答えなさい。
#include <stdio.h>
void main(void)
{
int number = 0;
int ans = 0;
int sum = 0;
number = number + 1;
if ( number == 1 ) {
sum = number + 1;
} else {
sum = number;
}
ans = sum;
printf("ans は %d です。\n", ans);
return;
}
Lesson3 – Problem2
次のプログラムの実行結果、変数「ans」の値が何になるかを答えなさい。
#include <stdio.h>
void main(void)
{
int number = 0;
int ans = 0;
int sum = 0;
number = number + 1;
sum = number;
if ( number == 1 )
ans = sum + 2;
sum = number + ans;
ans = sum * sum;
printf("ans は %d です。\n", ans);
return;
}
Lesson3 – Problem1解答
number = number +1;の処理を実行すると、numberの値は 0 + 1なので1になります。そうすると、if (number == 1)の条件が成立することになるため、sum = number + 1 つまり 1 + 1 の処理を実行します。ans = sumで代入を行うため、ansの値は2になります。
<実行結果 [Lesson3_P1.c]>
PS C:\Cprogram> gcc lesson3_P1.c -o lesson3_P1.exe
PS C:\Cprogram> .\Lesson3_P1.exe
ans は 2 です。
Lesson3 – Problem2解答
number = number +1;の処理を実行すると、numberの値は 0 + 1なので1になります。sum = number;でsumにnumberの値を代入するため、sumの値は1になります。
if (number == 1) の条件が成立することになるため、ans = sum + 2;の処理を実行します。ansの値は 1 + 2 = 3になります。
次にsum = number + ans つまり 1 + 3の処理を実行し、sumの値は4になります。ans = sum * sum つまり 4 * 4の値がansになるため、ansの値は16になります。
<実行結果 [Lesson3_P2.c]>
PS C:\Cprogram> gcc lesson3_P2.c -o lesson3_P2.exe
PS C:\Cprogram> .\Lesson3_P2.exe
ans は 16 です。