第3回 条件分岐

プログラムのひな型

前回の講義で、連絡したファイルのひな型例です。これを活用してください。


#include <stdio.h>
 
void main()
{
    /* 変数の定義 */
    int n;    

    /* 入 力 */
    printf("整数を入力して下さい"); scanf("%d", &n);

    /* 処 理 */

    /* 出 力 */
    printf("%d¥n", n);
}


比較・論理演算と条件分岐

ある整数を入力したとき,その整数が正か負かを判定し,結果を画面に表示するにはどうしたらよいか考えてみよう.
プログラムを作成するときは,課題が与えられたらいきなりプログラミングに取りかからず,必ず計算手順(アルゴリズム)を検討する.

1.整数を入力する

2.正負を判定する

となる.それぞれを,詳細に検討すると,

1.整数を入力する

2.1 整数が0以上か?

2.1T 成立するとき 「正の整数です」
2.1F 不成立のとき 「負の整数です」

これを,C言語を用いてプログラムにしてみよう.


if文,if〜else文による条件分岐

英語でif~, ~, は,「もし~ならば,~」と,条件を表すことができる.
C言語でも同様に条件によってプログラムの流れを切り替える(制御する)方法が必要である.
プログラム中において,変数と数の大小などを比較し,その結果によって処理を変えることを条件分岐と呼ぶ.

C言語の if 文の最も簡単な分岐の例をフローチャートで表すと,

となり,条件が成り立つときは処理1を実行し,成り立たないときは処理1を実行せず,その先に進む.
さらに,if~else~文では,

このように,条件が成り立つときは処理1を実行し,成り立たないときは別の処理2を実行するという流れが実現できる.


比較演算子

数の大小を比較する演算子を比較演算子と呼び,比較の条件が成立した場合を「真(True)」,不成立の場合を「偽(False)」という.

演算子 はたらき  使い方  意味
= = 等しい a = = b a と b は等しい
!= 等しくない a != b a と b は等しくない
< 小なり a < b a は b より小さい
> 大なり a > b a は b より大きい
<= 以下 a <= b a は b 以下
>= 以上 a >= b a は b 以上

注意: =>,=<, =!, ≧, ≦ という比較演算子は存在しない.

論理演算子

複数の条件を組み合わせてより複雑な条件を作るには,論理演算子を用いる.

演算子 はたらき 使い方 意味
&& かつ a = = 5 && b = = 3
|| または a = = 2 || b < -2
! ~ではない ! (a = = 0)

では if 文を使って整数の正負判定プログラムを作ってみよう.


#include <stdio.h>
 
void main()
{
    /* 変数の定義 */
    int n;    

    /* 入 力 */
    printf("整数を入力して下さい"); scanf("%d", &n);

    /* 処 理 */

    /* 出 力 */
    if ( n >=0 ) 
    {
        printf("正の整数です¥n ");  /*整数が0以上の時に実行される 処理1*/
    } else {
        printf("負の整数です¥n ");  /* 整数が0未満の時に実行される 処理2*/
    }    
}


他分岐:宿題から

下の表のように,求めたBMI値により肥満度が分類されている。この判定結果を画面に表示するようなプログラムを書こう。

BMIは、BMI=体重(kg) ÷ 身長2(m) で、キーボードから体重と身長を入力(単位に注意!)すると、計算できる。
ここで、初めから欲張って三つに分岐するプログラムを作らないで、まずは、25以上だけを分岐するようにしてみよう。

BMI 判定
18.5未満 やせ
18.5〜25 普通
25以上 肥満

複数の条件のどれに当てはまるかを検討するためには,if() - else if() - else を組み合わせて使う.
基本的な分岐の流れは,以下のようにプログラム中の上から順に判定・分岐がされる.

1. BMIを計算する.

2. BMIが
2.1 18.5未満 →やせています
2.2 25未満 →普通です
2.4 それ以外 →肥満です


#include <stdio.h>

void main()
{
    /* 変数の定義 */
    float height, mass, bmi;

    /* 入 力 */
    printf("身長(m)="); scanf("%f", &height);
    printf("体重(kg)="); scanf("%f", &mass);

    /* 処 理 */
    bmi = mass / height / height;

    /* 出 力 */
    if ( bmi < 18.5 ) {
        printf("BMI = %fで、やせています¥n", bmi);  /* bmiが18.5未満の時実行 処理1*/
    } else if ( bmi < 25 ) {
        printf("BMI = %fで、普通です¥n", bmi);  /* bmiが25未満の時実行 処理2*/
    } else {
        printf("BMI = %fで、肥満です¥n", bmi);  /* bmiが25以上の時実行 処理3*/
    }
}


よくある間違いの例


#include <stdio.h>

void main()
{
    /* 変数の定義 */
    float height, mass, bmi;

    /* 入 力 */
    printf("身長(m)="); scanf("%f", &height);
    printf("体重(kg)="); scanf("%f", &mass);

    /* 処 理 */
    bmi = mass / height / height;

    /* 出 力 */
    if ( bmi < 18.5 ) {
        printf("BMI = %fで、やせています¥n", bmi);  /* bmiが18.5未満の時実行 処理1*/
    }

    if ( bmi < 25 ) {
        printf("BMI = %fで、普通です¥n", bmi);  /* bmiが25未満の時実行 処理2*/
    }

    if ( bmi >= 25 ) {
        printf("BMI = %fで、肥満です¥n", bmi);  /* bmiが25以上の時実行 処理3*/
    }
}


なぜダメなのかを考えてみよう!!


あまり良くない例


#include <stdio.h>

void main()
{
    /* 変数の定義 */
    float height, mass, bmi;

    /* 入 力 */
    printf("身長(m)="); scanf("%f", &height);
    printf("体重(kg)="); scanf("%f", &mass);

    /* 処 理 */
    bmi = mass / height / height;

    /* 出 力 */
    if ( bmi < 18.5 ) {
        printf("BMI = %fで、やせています¥n", bmi);  /* bmiが18.5未満の時実行 処理1*/
    }

    if ( bmi >= 18.5 && bmi < 25 ) {
        printf("BMI = %fで、普通です¥n", bmi);  /* bmiが25未満の時実行 処理2*/
    }

    if ( bmi >= 25 ) {
        printf("BMI = %fで、肥満です¥n", bmi);  /* bmiが25以上の時実行 処理3*/
    }
}

 

このプログラムも、表示は正しいけれど、たとえば、bmi が30だと3回の条件判断をする。
一方、最初のプログラムでは、2回の条件判断ですむ。


演習課題(Oh-Meiji で提出)

課題1 キーボードから整数値を入力すると、その数が100以上か、100未満かを表示するプログラムを作ってみよう。

課題2 キーボードから整数値を入力すると、偶数か奇数か表示するプログラムを作ってみよう。

課題3 西暦を入力すると、その年がうるう年かどうかを判定するプログラムを組んでみよう。
うるう年は、4で割り切れ,かつ100では割り切れない年,もしくは400で割り切れる年がうるう年.

課題4 テストの点数(0点から100点の整数)をキーボードから入力し,その値によって以下の通り,S,A,B,C,Fを画面に表示するプログラムを組もう(elseをしっかり用いること).

    点数      成績 
90点以上 S
80点以上90点未満 A
70点以上80点未満 B
60点以上70点未満 C
60点未満 F

授業終了時までのプログラムと完成した提出用プログラムをoh-meijiシステムを使って提出すること
授業終了時に送るのは出席の確認用である.完成した課題は提出用の回に送ること
(提出用の回に提出しないと,採点を行わない)


宿題

A君とBさんがじゃんけんをする.グー=1,チョキ=2,パー=3として,A君とBさんの手をそれぞれ入力すると,A君とBさんのどちらが勝ったのかを判定するプログラムを次回は作ります。そこで、以下の作業をして、レポートとして提出してください。

  1. A君とBさんの出す手の、考えられる組み合わせとそのときの勝敗を表にする。
  2. プログラムの流れを、フローチャートに書く。

 

演習:解答例