【問題2】入力した金額からお札、硬貨の枚数を求める完全マスター! 組み込みC言語プログラミング(3)(2/2 ページ)

» 2014年05月07日 10時00分 公開
[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
前のページへ 1|2       

ショートコーディングに挑戦!

 さて、money.cで問題なくプログラムは動作しました。今回はせっかくですので、ショートコーディングもしてみましょう。

 動作は同じですが、money.cよりもすっきりとしたコードになります。その例がmoney2.cです。


#include <stdio.h>
int main(void)
{
    int yen;
    printf("金額を入力してください->");
    scanf("%d", &ampyen);
    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;
}
 
プログラム2 「money2.c」

 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", &ampyen);
    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;
}
 
プログラム3 「money3.c」

宿題3:入力された値の中から最大値を表示

 それでは、次回の宿題です。

宿題3:

3つの整数を入力し、最も大きい数を表示するプログラムを作成してください。


⇒解答と解説は次回



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.