連載
【問題2】入力した金額からお札、硬貨の枚数を求める:完全マスター! 組み込みC言語プログラミング(3)(2/2 ページ)
C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。今回は、入力された金額から、お札と硬貨の枚数を計算して表示するプログラムに挑戦。3つのサンプルプログラムを基に詳しく解説します。
ショートコーディングに挑戦!
さて、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;
}
プログラム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", &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;
}
プログラム3 「money3.c」
宿題3:入力された値の中から最大値を表示
それでは、次回の宿題です。
Copyright © ITmedia, Inc. All Rights Reserved.