第6章の2 if文

1. if文

if文は、条件分岐を実現するための基本的な制御文です。特定の条件が満たされた場合にだけ処理を実行します。条件が満たされない場合は、その処理をスキップして次の処理に進みます。

条件式(関係演算子論理演算子を用いる)を判断し、2分岐選択制御を行います。

(1) 基本形

【書き方】
if (条件式)
  文1;
else
  文2;

タブで字下げ

【フローチャート】

条件式が
・ 真なら文1 を実行
・ 偽なら文2 を実行

// 例
int a = 10;
if (a > 10)     // a が 10 より大なら
    a = 0;      // a に 0 を代入
else            // そうでなければ(a が 10 以下なら)
    a++;        // a をインクリメントする

(2) else節の省略形

【書き方】
if (条件式)
  文1;

【フローチャート】

・ 条件式が真なら文1 を実行

// 例
int a = 0;
if (a == 0)       // a が 0 と等しければ
    a = 2;    // a に 2 を代入する

(3) 複合文の形式

{}で囲んだ文の集合を複合文と呼びます。複数行の文は{} で囲んで複合文にします。

【書き方】
if (条件式) {
  文11;
  文12;
}
else {
  文21;
  文22;
}

【フローチャート】

条件式が
・ 真なら文11 と文12 を実行
・ 偽なら文21 と文22 を実行

// 例
int a = 10, b;
if (a < 10){     // a が 10 未満なら
    a = 1;       // a に 1 を代入
    b = 2;       // b に 2 を代入
}
else {           // そうでなければ(a が 10 以上なら)
    a = 3;       // a に 3 を代入
    b = 4;       // b に 4 を代入
}

if文の使用例 サンプルプログラム

#include    <stdio.h>

int main(void)
{
    double x,y,z;

    printf("浮動小数点数 x を入力しなさい > ");
    scanf("%lf",&x);                // 浮動小数点数xの入力
    printf("浮動小数点数 y を入力しなさい > ");
    scanf("%lf",&y);                // 浮動小数点数yの入力
    
    if (x >= y) {     // xはy以上のとき
        z = x - y;    // x - y の計算
        printf("x - y = %f\n",z);
    }
    else {            // それ以外のとき
        z = y - x;    // y - x の計算
        printf("y - x = %f\n",z);
    }
         return 0;
}

【実行結果例】
浮動小数点数 x を入力しなさい > 12.3
浮動小数点数 y を入力しなさい > 12.4
y – x = 0.100000

水色文字はキーボードからの入力

〇 演習問題

問1

次のフローチャートに基づいてプログラムを作成しなさい。

【実行結果例】
整数値を2つ入力 5 5
aは10以下
aとbは等しい
bは10より小さい
a = 6 b = 6

水色文字はキーボードからの入力

問2

キーボードから入力したキーが、アルファベットの大文字ならば、小文字に変換して、画面に出力しなさい。
それ以外なら、そのまま画面に出力しなさい。ただし、文字コードはASCIIとする。

【実行結果例】
文字を入力しなさい F
ch = f

水色文字はキーボードからの入力

解答例

// 問1
#include <stdio.h>

int main(void)
{
    int a, b;

    printf("整数値を2つ入力 ");
    scanf("%d", &a );
    scanf("%d", &b );

    if (a > 10)
        printf("aは10より大きい\n");
    else
        printf("aは10以下\n");

    if (a == b)
        printf("aとbは等しい\n");

    if (b >= 10) {
        printf("bは10以上\n");
        a = 0;
        b = 0;
    }
    else {
        printf("bは10より小さい\n");
        a = a + 1;
        b = b + 1;
    }
    printf("a = %d \t b = %d\n", a, b);

    return 0;
}
// 問2
#include <stdio.h>

int main( void )
{
    char ch;
    
    printf("文字を入力しなさい ");
    scanf("%c", &ch );
    
    if (ch >= 'A' && ch <= 'Z') {
        ch = ch + ('a' - 'A');
    }
    printf("ch = %c\n", ch) ;
    
    return 0;
}

ASCIIコードではアルファベットの
 小文字は ’a’:97 ’b’:98 ’c’:99 ・・・ ’z’:122
 大文字は ’A’:65 ’B’:66 ’C’:67 ・・・ ’Z’:90
というように順にコードが割り当てられています。

つまり、大文字を小文字に変換する場合には、大文字それぞれに小文字との差分「32」を加えればよいことになります。
それを、ストレートに ch = ch + 32; とはせずに、大文字と小文字の差分を加えるのだということを明確にするために ch = ch + ( ‘a’ – ‘A’ ); としました。

ただし、このような計算により大文字を小文字に変換できるのは、ASCIIコードのように大文字と小文字のコードの差が一定のときに限られます。
学習が進んだ段階では、tolower関数を用いるようにしてください。

2. else if

(1) if ~ else if ~ else ~

条件式を判断して多分岐選択制御を行います。

【書き方】
if (条件1) {
  文1;
}
else if (条件2) {
  文2;
}
  :
  :
else if (条件n) {
  文n;
}
else {
  文;
}

  • 文1~文n、及び文は複合文({ }で囲んだ文)でも可。
  • 複数行の文の場合には { } が必要。単文の場合には { } は省略可能。

【フローチャート】

条件1 が真ならば文1 を実行
そうではなく、
条件2 が真ならば文2 を実行
そうではなく、
条件n が真ならば文n を実行
いずれでもないならば文を実行

// 例
int a = 123;
if (a > 1000)
    printf("a は 1000 より大きい\n");
else if (a > 500)
    printf("a は 1000以下で500より大きい\n");
else if (a > 100)
    printf("a は 500以下で100より大きい\n");
else
    printf("a は 100以下\n");

【実行結果例】
a は 500以下で100より大きい

〇 演習問題

次のフローチャートに基づいてプログラムを作成しなさい。ただし、文字コードはASCIIとする。

【実行結果例】
文字を入力しなさい 5
数字です

緑色文字はキーボードからの入力

解答例

#include <stdio.h>

int main(void)
{
    char moji;

    printf("文字を入力しなさい ");
    scanf("%c", &moji);

    if (moji >= 'A' && moji <= 'Z') {
        printf("英大文字です\n");
    }
    else if (moji >= 'a' && moji <= 'z') {
        printf("英小文字です\n");
    }
    else if (moji >= '0' && moji <= '9') {
        printf("数字です\n");
    }
    else {
        printf("英字でも数字でもありません\n");
    }

    return 0;
}

上記の方法により大文字や小文字を判別できるのは、ASCIIコードのように
大文字や小文字のコードが連続して並んでいるときに限られます。
学習が進んだ段階では、isupper関数islower関数を用いるようにしてください。

(2) if文の入れ子(ネスト)

if文の中にまた if文が入る形です。

【書き方】
if (条件1) {
  if (条件2) {
    文1;
  }
  else {
    文2;
  }
}
else {
  文3;
}

  • { } の数と位置に注意
  • インデント(字下げ)で見やすく
  • 文1 ~文3 は複合文でも可。
  • 複数行の文の場合には { } で囲み複合文に。単文の場合には { } は省略可能。
  • これ以外にも様々なパターンで if文は入れ子が可能。

【フローチャート】

条件1 が真で
 条件2 が真ならば、文1 を実行
 条件2 が偽ならば、文2 を実行
条件1 が偽ならば、文3 を実行

// 例
if (a > 10)
    if (b == 1)
        a = 0;
    else
        a = 1;
else
    a++;

〇 演習問題

次のフローチャートに基づいてプログラムを作成しなさい。

【実行結果例】
科目を入力してください(k:国語 s:数学) > k
点数を入力してください > 73
国語の点数は平均点以上です

水色文字はキーボードからの入力

解答例

#include <stdio.h>

int main(void)
{ 
    char kamoku;
    int ten;

    printf("科目を入力してください(k:国語 s:数学)> ");
    scanf("%c", &kamoku);
    printf("点数を入力してください > ");
    scanf("%d", &ten);

    if (kamoku == 'k') {
        if (ten >= 73 && ten <= 100) {
            printf("国語の点数は平均点以上です\n");
        }
        else if (ten >= 0 && ten < 73) {
            printf("国語の点数は平均点未満です\n");
        }
        else {
            printf("点数の入力エラーです\n");
        }
    }
    else if (kamoku == 's') {
        if (ten >= 61 && ten <= 100) {
            printf("数学の点数は平均点以上です\n");
        }
        else if (ten >= 0 && ten < 61) {
            printf("数学の点数は平均点未満です\n");
        }
        else {
            printf("点数の入力エラーです\n");
        }
    }
    else {
        printf("科目の入力エラーです\n");
    }

    return 0;
}

コメント