第4章 演習問題 解答例

4.1 算術演算子

a4-1-1.c

早朝の時給:1200円、昼間の時給:900円、深夜の時給:1500円のときに、それぞれx時間、y時間、z時間働いた場合の平均時給を求めるプログラムを作成してください。

/* a4-1-1.c */
#include <stdio.h>

#define ASA 1200    // 早朝
#define HIRU 900    // 昼間
#define YORU 1500   // 深夜

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

    printf("早朝は何時間働きましたか。> ");
    scanf("%d", &x);
    printf("昼間は何時間働きましたか。> ");
    scanf("%d", &y);
    printf("深夜は何時間働きましたか。> ");
    scanf("%d", &z);

    // 平均時給を表示する
    printf("平均時給は%d円です。\n",
        (x * ASA + y * HIRU + z * YORU) / (x + y + z));

    return 0;
}

x + y + z を()で囲むのを忘れないようにしてください。

[Back]

4.2 代入演算子

a4-2-1.c

コメントを参考に空欄部を埋めてプログラムを完成してください。このプログラムは、商品a、b、cの合計金額と送料込みの金額、税込み金額を求めます。

/* a4-2-1.c */
#include <stdio.h>

int main(void)
{
    int a = 600, b = 800, c = 700;
    int kekka;

    // 合計金額を求める
    kekka = a + b + c;
    printf("合計金額 = %d円\n", kekka);

    // 500円の送料込みの金額を求める
    kekka += 500;
    printf("送料込み金額 = %d円\n", kekka);

    // 10%の税込み金額を求める
    kekka *= 1.1;
    printf("税込み金額 = %d円\n", kekka);

    return 0;
}

それぞれの金額を格納する変数を用意した場合には複合代入演算子を使う必要はありませんが、ここでは練習用に複合代入演算子を使いました。

[Back]

a4-2-2.c

買い物のお釣りの札と硬貨の枚数を求めるプログラムを作成してください。

/* a4-2-2.c */
#include <stdio.h>

int main(void)
{
    int kingaku;
    int kaimono;
    int turi, maisu;

    printf("何円の買い物をしましたか。> ");
    scanf("%d", &kaimono);
    printf("何円出しましたか。> ");
    scanf("%d", &kingaku);

    printf("\n【お釣りの枚数】\n");

     // 5000円札の枚数を求める
    turi = kingaku - kaimono;
    maisu = turi / 5000;
    printf("5000円札の枚数 = %d\n", maisu);

    // 1000円札の枚数を求める
    turi %= 5000;
    maisu = turi / 1000;
    printf("1000円札の枚数 = %d\n", maisu);

    // 500円玉の枚数を求める
    turi %= 1000;
    maisu = turi / 500;
    printf("500円玉の枚数  = %d\n", maisu);

    // 100円玉の枚数を求める
    turi %= 500;
    maisu = turi / 100;
    printf("100円玉の枚数  = %d\n", maisu);

    // 50円玉の枚数を求める
    turi %= 100;
    maisu = turi / 50;
    printf("50円玉の枚数   = %d\n", maisu);

    // 10円玉の枚数を求める
    turi %= 50;
    maisu = turi / 10;
    printf("10円玉の枚数   = %d\n", maisu);

    // 5円玉の枚数を求める
    turi %= 10;
    maisu = turi / 5;
    printf("5円玉の枚数    = %d\n", maisu);

    // 1円玉の枚数を求める
    maisu = turi % 5;
    printf("1円玉の枚数    = %d\n", maisu);

    return 0;
}

468円の買い物をして10000円札を出した場合で考えてみましょう。
それぞれの変数はint型なので小数点以下は切り捨てられます。ですから、釣り銭を5000で割ると釣りの5000円札の枚数を求めることができます。
 maisu = turi / 5000;
 1枚 ← 9532 / 5000

次に、9532円の中から5000円札を釣りとして用意したので、9532円を5000で割った余りが残りの釣りになります。
 turi %= 5000;
 4532 ← 9532 % 5000

釣り4532円を1000で割ると、釣りの1000円札の枚数が求められます。
 maisu = turi / 1000;
 4枚 ← 4532 / 1000

この手順で5円玉の枚数まで求めることができます。最後に残った数が1円玉の枚数になります。

[Back]

4.3 増分・減分演算子

a4-3-1.c

次のプログラムの実行結果を考えてください。

/* a4-3-1.c */
#include <stdio.h>

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

    a = 3;
    ++a;
    b = ++a;
    printf("前置演算 : a = %d b = %d\n", a, b);

    a = 3;
    a++;
    c = a++;
    printf("後置演算 : a = %d c = %d\n", a, c);

    return 0;
}
【実行結果】

前置演算 : a = 5 b = 5
後置演算 : a = 5 c = 4

a = 3;
++a;    aは+1され4になります。
b = ++a;  先にaが+1されてからbに代入されます。

a = 3;
a++;    aは+1され4になります。
c = a++;  先にaがcに代入されます。代入の後にaは+1されます。

[Back]

a4-3-2.c

次のプログラムの実行結果を考えてください。

/* a4-3-2.c */
#include <stdio.h>

int main(void)
{
    int array[5] = {1, 2, 3, 4, 5};
    int i;

    i = 0;
    printf("前置演算 array[i] = %d\n", array[++i]);

    i = 0;
    printf("後置演算 array[i] = %d\n", array[i++]);

    return 0;
}
【実行結果】

前置演算 array[i] = 2
後置演算 array[i] = 1

array[++i]  先にiをインクリメントしてから配列要素を参照します。
array[i++]  配列要素を参照してからiをインクリメントします。

[Back]

4.4 関係演算子と論理演算子

a4-4-1.c

真(1)と偽(0)の&&演算、||演算、!演算を調べるプログラムを作成してください。

/* a4-4-1.c */
#include <stdio.h>

int main(void)
{
    const int False = 0, True = 1;

    printf("%d && %d の演算結果は %d です。\n", False, False, False && False);
    printf("%d && %d の演算結果は %d です。\n", False, True, False && True);
    printf("%d && %d の演算結果は %d です。\n", True, False, True && False);
    printf("%d && %d の演算結果は %d です。\n", True, True, True && True);
    printf("%d || %d の演算結果は %d です。\n", False, False, False || False);
    printf("%d || %d の演算結果は %d です。\n", False, True, False || True);
    printf("%d || %d の演算結果は %d です。\n", True, False, True || False);
    printf("%d || %d の演算結果は %d です。\n", True, True, True || True);
    printf("!%d の演算結果は %d です。\n", False, !False);
    printf("!%d の演算結果は %d です。\n", True, !True);

    return 0;
}

[Back]

4.6 型変換

a4-6-1.c

次のプログラムの実行結果を考えてください。

/* a4-6-1.c */
#include <stdio.h>

int main(void)
{
    int a;
    double x;

    printf("10 / 3     = %d\n", 10 / 3);
    printf("10 / 3.0   = %f\n", 10 / 3.0);
    a = 10 / 3;
    printf("10 / 3   a = %d\n", a);
    a = 10 / 3.0;
    printf("10 / 3.0 a = %d\n", a);
    x = 10 / 3;
    printf("10 / 3   x = %f\n", x);
    x = 10 / 3.0;
    printf("10 / 3.0 x = %f\n", x);

    return 0;
}
【実行結果】

10 / 3     = 3
10 / 3.0   = 3.333333
10 / 3   a = 3
10 / 3.0 a = 3
10 / 3   x = 3.000000
10 / 3.0 x = 3.333333

x = 10 / 3; は、右辺演算時に3となるため、double型のxに代入しても小数点以下は切り捨てられたままになります。

[Back]

a4-6-2.c

ローレル指数を求めるプログラムを作成してください。ただし、各変数はint型で宣言してください。
ローレル指数は、 体重(kg)÷身長3(cm)×107 で求めます。身長3は身長を3 個かけ合わせます。

/* a4-6-2.c */
#include <stdio.h>
int main(void)
{
    int height;
    int weight;
    int rohrer;

    printf("身長を入力してください。> ");
    scanf("%d", &height);
    printf("体重を入力してください。> ");
    scanf("%d", &weight);

    rohrer = (double)weight / (height * height * height) * 10000000;
    printf("ローレル指数 = %d\n", rohrer);

    return 0;
}

ローレル指数の算出方法をそのまま式にすると、
 rohrer = weight / (height * height * height) * 10000000;
になります。このとき、各変数はint型なので、「weight / (height * height * height)」を計算した時点で結果が0未満になってしまい、小数点以下が切り捨てられて0になります。ですから、浮動小数点型でキャストする必要があります。

計算結果が0未満にならないように、
 rohrer = weight * 10000000 / (height * height * height);
としてもよいでしょう。

[Back]

a4-6-3.c

連立方程式
 ax + by = c
 dx + ey = f
の解x、yを求めるプログラムを作成してください。ただし、a〜fの変数は整数であり、連立方程式の解が一意に存在するように与えるものとします。

/* a4-6-3.c */
#include <stdio.h>

int main(void)
{
    int a, b, c, d, e, f;
    double x, y;

    printf("a > ");
    scanf("%d", &a);
    printf("b > ");
    scanf("%d", &b);
    printf("c > ");
    scanf("%d", &c);
    printf("d > ");
    scanf("%d", &d);
    printf("e > ");
    scanf("%d", &e);
    printf("f > ");
    scanf("%d", &f);

    x = (double)(c * e - b * f) / (a * e - b * d);
    y = (-a * x + c) / b;

    printf("x = %f\n", x);
    printf("y = %f\n", y);

    return 0;
}

(c * e - b * f) / (a * e - b * d) は int型 / int型 なので小数点以下の数値を扱えません。doubleでキャストをする必要があります。
(-a * x + c) / b は x がdouble型なので暗黙の型変換が働くためキャストの必要はありません。

[Back]


Copyright© 2021 Tomoko Sugawara. All Rights Reserved.