第3回 型変換,キーボード入力,比較・論理演算と条件分岐


第2回の演習の解答例(5/13以降表示可能)


第2回の演習(2)の注意点

a = 6, b = 5 のとき,次の各計算結果を表示するプログラムを作成せよ.

解答例:


#include <stdio.h>

void main()
{
    int a, b;

    a = 6;
    b = 5;

    printf("a = %d ¥n b = %d ¥n ", a, b);
    printf("a + b = %d ¥n", a+b); 
    printf("a - b = %d ¥n", a-b); 
    printf("a x b = %d ¥n", a*b); 
    printf("a / b = %d ¥n", a/b); 
    printf("a %% b = %d ¥n", a%b); /* ここはコメント.%%で画面に%が出力される */
    printf("底辺a,高さbの三角形の面積 = %d¥n", a*b/2); 
    printf("a^2 + ab = %d ¥n", (a+b)*a); 
}


結果:

a = 6
b = 5
a + b = 11
a - b = 1
a x b = 30
a / b = 1
a % b = 1
底辺a,高さbの三角形の面積 = 15
a^2 + ab = 66

あれ,割り算の結果が思い通りになりませんね.
わり算の結果(商)は,実数になるはずなので,


    printf("a / b = %f ¥n", a/b);

としてみよう.さあ,どうでしょう?

    a / b = 0.000000

ますますおかしくなりましたね.これは,同じ型同士で演算をすると結果も同じ型になるからである.

上の例だと,

    [整数]=[整数]÷[整数]

となるため,商が正しく求まりません.そこで,別の実数の変数を用意して,

    [実数]=[整数]÷[整数]

となるように,書き換えてみよう.


#include <stdio.h>

void main()
{
    int a, b;
    float c;
    a = 6;
    b = 5;
    c = a / b;

    printf("a / b = %f¥n", c); 
}

結果:

a / b = 1.000000

まだ,おかしいですね.


型の変換

わり算をうまく行うには,

    [実数]=[実数]÷[実数]

としなくてはならない.そこで整数から実数に変数の型を変換する必要がある. 型を変換することを キャスト と呼ぶ.


#include <stdio.h>

void main()
{
    int a, b;
    float c;

    a = 6;
    b = 5;
    c = (float)a / (float)b;

    printf("a / b = %f ¥n", c); 
}

結果:

a / b = 1.200000

やっと,意図した結果が得られた.

このように,計算の途中で型が思い通りにならないことが多く出てくる.気をつけてプログラムを作ろう.


キーボードからの入力

これまで,プログラム内で扱う値は,あらかじめ(=コンパイル時に)プログラムに記述してあるものしか扱えなかった.

そこで、上のプログラムにおいて,変数 a や変数 b に後から(=実行時に)値を設定できるようにしよう.

キーボードからデータを入力するには scanf()関数を用いる.

基本的な文法は既にに学んだ printf() 関数とよく似ている.

scanf() 関数は,printf() 関数によく似ているが,値を格納する変数の前に必ず & をつける必要がある.

この記号の意味(変数のアドレスを取り出す演算子)は情報処理・演習2(後期)に扱う.


キーボードから変数に値を入力し,画面に表示するプログラム:


#include <stdio.h>

void main()
{
    int a;
    float b;

    printf("a = ");
    scanf("%d", &a);
    
    printf("b = ");
    scanf("%f", &b);

    printf("a = %d ¥n", a);
    printf("b = %f ¥n", b);
}


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

さて今度は,ある整数を入力したとき,その整数が正か負かを判定し,結果を画面に表示するにはどうしたらよいか考えてみよう.

プログラムを作成するときは,課題が与えられたらいきなりプログラミングに取りかからず,必ず計算手順(アルゴリズム)を検討する.

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*/
    }    
}



演習課題

(1)先週の課題(2)において,変数a, b をキーボードから入力して計算するように変更してみよう.

(2)人は1kg減量するためには7500kcal消費する必要があるとする。

  みんながビリーズブートキャンプでダイエットすると1週間のトレーニングで2500kcal消費できる.

  キーボードから今の体重(kg)と目標体重(kg)を入力すると,あと何kcal消費する必要があるか画面に表示するプログラムを作成せよ.

  *体重は浮動小数型で定義しなさい*

(3)次に,もし求めた消費カロリーが2500kcal 以上だったら「一週間以上ビリー確定!」

  と画面に表示されるようにプログラムを改良しよう.

発展問題(余裕がある人はチャレンジしてみよう)

(4)以下の表のように,求めた消費カロリーがさらに細かく分類され,ビリー継続期間を画面に表示するようにプログラムを改良しよう.

消費カロリー(kcal)     ビリー継続期間
 0以内  ビリーとトレーニングする必要はありません 
 0〜2500  ビリーと1週間くらい運動だね 
 2500〜10000  ビリーと1ヵ月頑張ってみよう 
 10000〜20000  ビリーと2ヵ月頑張ってみよう
 20000〜30000  ビリーと3ヵ月頑張ってみよう 
 30000〜40000  ビリーと4ヵ月頑張ってみよう 
 40000以上  やっぱり食生活から見直そう