さて、money.cで問題なくプログラムは動作しました。今回はせっかくですので、ショートコーディングもしてみましょう。
動作は同じですが、money.cよりもすっきりとしたコードになります。その例がmoney2.cです。
#include <stdio.h>
int main(void)
{
    int yen;
    printf("金額を入力してください->");
    scanf("%d", &yen);
    printf("10000円札は%d枚\n", yen / 10000);
    yen %= 10000;
    printf(" 5000円札は%d枚\n", yen / 5000);
    yen %= 5000;
    printf(" 1000円札は%d枚\n", yen / 1000);
    yen %= 1000;
    printf("  500円玉は%d枚\n", yen / 500);
    yen %= 500;
    printf("  100円玉は%d枚\n", yen / 100);
    yen %= 100;
    printf("   50円玉は%d枚\n", yen / 50);
    yen %= 50;
    printf("   10円玉は%d枚\n", yen / 10);
    yen %= 10;
    printf("    5円玉は%d枚\n", yen / 5);
    printf("    1円玉は%d枚\n", yen % 5);
    return 0;
}
 
money2.cは、printf関数にお札や硬貨の枚数を求める式を直接記述することで変数の数を減らしたプログラムです。
C言語には演算と代入が組み合わさった代入演算子と呼ばれるものがあり、例えば、
yen = yen % 10000;
を代入演算子で記述すると、
yen %= 10000;
となります。
また、お札または硬貨の枚数を求める式を、直接printf関数の引数に書いています。例えば、
printf("10000円札は%d枚\n", yen / 10000);
では、yenを10000で割った値がprintf関数に渡されます。つまり関数の引数に式を記述した場合、その関数に式がそのまま渡されるのではなく、式を実行した結果の値が渡されるのです。
さらにプログラムを短くするために、別のアリゴリズムを探してみましょう。money3.cは、問題2が求める結果の規則性に着目して、繰り返しと配列を用いました。
同じ問題でも数パターンの解答があることが、プログラミングの面白いところですね。
#include <stdio.h>
int main(void)
{
    int yen, i;
    int unit[] = {10000, 5000, 1000, 500, 100, 50, 10, 5, 1};
    char *s[] = {"札", "札", "札", "玉", "玉", "玉", "玉", "玉"};
    printf("金額を入力してください->");
    scanf("%d", &yen);
    for (i = 0; unit[i] > 1; i++) {
        printf("%5d円%sは%d枚\n" ,unit[i], s[i], yen / unit[i]);
        yen %= unit[i];
    }
    printf("    1円玉は%d枚\n", yen);
    return 0;
}
 
それでは、次回の宿題です。
Copyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク