C言語ケーススタディ 金額から紙幣・貨幣の枚数を求める




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



入力した金額がどのような紙幣・貨幣から構成されるかを調べるプログラムを作ってみましょう。

(1)金額の入力

まずは、キーボードから金額を入力する部分を作ってみましょう。エラー処理などを考えるとscanfを、そのまま使用するのは好ましくないですがその辺の処理については別のケーススタディで取り上げることにします。 今回は入力は単にscanf関数を使用して下記のように行います。

main()
{
        int     yen;

        scanf("%d", &yen);
        printf("%d円\n", yen);
}

(2)一万円札が何枚使われているかの検査

入力した金額(変数yenに保持されます)に一万円札が何枚含まれているか調べます。 これは、金額(整数演算として)を10000で割ってしまえば調べることができます。プログラムは下記のようになります。

main()
{
        int     yen;

        scanf("%d", &yen);
        printf("%d円は\n", yen);

        if(yen / 10000 > 0)
                printf("一万円札が%d枚\n", yen/10000);
}
(3)一万円札以外の紙幣・貨幣の調査

一万円札を使用した残りの金額を算出する必要があります。これは10000で割った余りに相当するのでyen % 10000で求めることができます。 また、千円札の枚数も一万円札と同様に算出していきます

main()
{
        int     yen;

        scanf("%d", &yen);
        printf("%d円は\n", yen);

        if(yen / 10000 > 0)
                printf("一万円札が%d枚\n", yen/10000);
        yen = yen % 10000;
        if(yen / 5000 > 0)
                printf("5千円札が%d枚\n", yen/5000);
}

(4)残りの紙幣・貨幣の調査

残りの紙幣・貨幣の調査も同様な作業を繰り返すことで行います。

main()
{
        int     yen;

        scanf("%d", &yen);
        printf("%d円は\n", yen);

        if(yen / 10000 > 0)
                printf("一万円札が%d枚\n", yen/10000);
        yen = yen % 10000;

        if(yen / 5000 > 0)
                printf("千円札が%d枚\n", yen/5000);
        yen = yen % 5000;

        if(yen / 1000 > 0)
                printf("5千円札が%d枚\n", yen/1000);
        yen = yen % 1000;

        if(yen / 500 > 0)
                printf("500円玉が%d枚\n", yen/500);
        yen = yen % 500;

        if(yen / 100 > 0)
                printf("100円玉が%d枚\n", yen/100);
        yen = yen % 100;

        if(yen / 50 > 0)
                printf("50円玉が%d枚\n", yen/50);
        yen = yen % 50;

        if(yen / 10 > 0)
                printf("10円玉が%d枚\n", yen/10);
        yen = yen % 10;

        if(yen / 5 > 0)
                printf("5円玉が%d枚\n", yen/5);
        yen = yen % 5;

        if(yen > 0)
                printf("1円玉が%d枚\n", yen);
}

(5)汎用に使用できる関数に改造

main内でprintfと混ぜて作りましたが、これを汎用に使用できる関数として作り直します。 構造体を使って結果を返す構成にしたので、構造体をまだ勉強していない方は読み飛ばしてください。

struct StrMoney {
        int     mon_10000;
        int     mon_5000;
        int     mon_1000;
        int     mon_500;
        int     mon_100;
        int     mon_50;
        int     mon_10;
        int     mon_5;
        int     mon_1;
};


void    CheckMoney(int yen, struct StrMoney *mon)
{
        mon->mon_10000 = mon->mon_5000 = mon->mon_1000 = mon->mon_500 =
                mon->mon_100 = mon->mon_50 = mon->mon_10 = mon->mon_5 = mon->mon_1 = 0;
        /* またはmemset(mon, 0x00, sizeof(struct StrMoney)); */

        if(yen / 10000 > 0)
                mon->mon_10000 = yen/10000;
        yen = yen % 10000;

        if(yen / 5000 > 0)
                mon->mon_5000 = yen/5000;
        yen = yen % 5000;

        if(yen / 1000 > 0)
                mon->mon_1000 = yen/1000;
        yen = yen % 1000;

        if(yen / 500 > 0)
                mon->mon_500 = yen/500;
        yen = yen % 500;

        if(yen / 100 > 0)
                mon->mon_100 = yen/100;
        yen = yen % 100;

        if(yen / 50 > 0)
                mon->mon_50 = yen/50;
        yen = yen % 50;

        if(yen / 10 > 0)
                mon->mon_10 = yen/10;
        yen = yen % 10;

        if(yen / 5 > 0)
                mon->mon_5 = yen/5;
        yen = yen % 5;

        if(yen > 0)
                mon->mon_1 = yen;
}

main()
{
        struct StrMoney
                money;
        int     yen;

        scanf("%d", &yen);
        printf("%d円は\n", yen);

        CheckMoney(yen, &money);

        if(money.mon_10000 > 0)
                printf("一万円札が%d枚\n", money.mon_10000);
        if(money.mon_5000 > 0)
                printf("5千円札が%d枚\n", money.mon_5000);
        if(money.mon_1000 > 0)
                printf("千円札が%d枚\n", money.mon_1000);
        if(money.mon_500 > 0)
                printf("500円玉が%d枚\n", money.mon_500);
        if(money.mon_100 > 0)
                printf("100円玉が%d枚\n", money.mon_100);
        if(money.mon_50 > 0)
                printf("50円玉が%d枚\n", money.mon_50);
        if(money.mon_10 > 0)
                printf("10円玉が%d枚\n", money.mon_10);
        if(money.mon_5 > 0)
                printf("5円玉が%d枚\n", money.mon_5);
        if(money.mon_1 > 0)
                printf("1円玉が%d枚\n", money.mon_1);
}

今回は、2000円札には対応しなかったので自分で改造してみましょう。

【参照関数】
printf

【関連項目】
C言語ケーススタディ 駐車料金の計算