1. 程序简介
这是一个C语言程序,用于找零钱计算。输入金额和实际支付金额,程序自动计算需要找回的纸币、硬币数量及面值。本程序能够处理所有人民币现金交易的找零计算。
2. 程序实现
程序共分为8个函数,实现不同的功能,分别为:
2.1 main()函数
函数主要用于接受输入金额与实际支付金额,之后调用其它的函数完成找零计算。
2.2 input_money()函数
函数用于输入金额与实际支付金额。
void input_money(double* total, double* payment);
其中,total是交易金额,payment是实际支付金额。
2.3 calculate_change()函数
函数用于计算需要找回的纸币、硬币数量及面值。
void calculate_change(double total, double payment, int* yuan, int* jiao);
其中,total是交易金额,payment是实际支付金额,yuan是返回的纸币金额及数量,jiao是返回的硬币金额及数量。
2.4 get_yuan()函数
函数用于计算纸币金额及数量。
int get_yuan(double money, int* count, int n);
其中,money是需要计算的金额,count是返回的纸币数量,n是纸币种类数。
2.5 get_jiao()函数
函数用于计算硬币金额及数量。
int get_jiao(double money, int* count, int n);
其中,money是需要计算的金额,count是返回的硬币数量,n是硬币种类数。
2.6 print_change()函数
函数用于输出找零金额及数量。
void print_change(int* yuan, int* jiao, int n1, int n2);
其中,yuan是纸币金额及数量,jiao是硬币金额及数量,n1是纸币种类数,n2是硬币种类数。
2.7 yuan_name()函数
函数用于返回纸币面值名称。
char* yuan_name(int n);
其中,n是纸币面值。
2.8 jiao_name()函数
函数用于返回硬币面值名称。
char* jiao_name(int n);
其中,n是硬币面值。
3. 程序演示
下面是一个程序的演示:
#include <stdio.h>
#include <stdlib.h>
/* 输入金额与实际支付金额 */
void input_money(double* total, double* payment);
/* 计算需要找回的纸币、硬币数量及面值 */
void calculate_change(double total, double payment, int* yuan, int* jiao);
/* 计算纸币金额及数量 */
int get_yuan(double money, int* count, int n);
/* 计算硬币金额及数量 */
int get_jiao(double money, int* count, int n);
/* 输出找零金额及数量 */
void print_change(int* yuan, int* jiao, int n1, int n2);
/* 返回纸币面值名称 */
char* yuan_name(int n);
/* 返回硬币面值名称 */
char* jiao_name(int n);
int main() {
double total, payment;
int yuan[100], jiao[100];
/* 输入金额与实际支付金额 */
input_money(&total, &payment);
/* 计算找零金额及数量 */
calculate_change(total, payment, yuan, jiao);
/* 输出找零金额及数量 */
print_change(yuan, jiao, 6, 2);
system("PAUSE");
return 0;
}
void input_money(double* total, double* payment) {
printf("请输入交易金额:");
scanf("%lf", total);
printf("请输入实际支付金额:");
scanf("%lf", payment);
}
void calculate_change(double total, double payment, int* yuan, int* jiao) {
int yuan_count[6], jiao_count[2];
double change = payment - total;
/* 计算纸币金额及数量 */
int n1 = get_yuan(change, yuan_count, 6);
for (int i = 0; i < n1; i++) {
yuan[i] = yuan_count[i];
}
/* 计算硬币金额及数量 */
int n2 = get_jiao(change - get_yuan(change, yuan_count, 6), jiao_count, 2);
for (int i = 0; i < n2; i++) {
jiao[i] = jiao_count[i];
}
}
int get_yuan(double money, int* count, int n) {
int yuan[6] = {100, 50, 20, 10, 5, 1};
char* name[6] = {"100元", "50元", "20元", "10元", "5元", "1元"};
int i, j;
int total = 0, num = 0;
for (i = 0; i < n; i++) {
count[i] = (int)(money / yuan[i]);
total += count[i] * yuan[i];
num += count[i];
if (count[i] != 0) {
printf("%s %d张\n", yuan_name(yuan[i]), count[i]);
}
money -= count[i] * yuan[i];
if (money == 0) {
break;
}
}
return i + 1;
}
int get_jiao(double money, int* count, int n) {
int jiao[2] = {5, 1};
char* name[2] = {"五角", "一角"};
int i, j;
int total = 0, num = 0;
for (i = 0; i < n; i++) {
count[i] = (int)(money / jiao[i]);
total += count[i] * jiao[i];
num += count[i];
if (count[i] != 0) {
printf("%s %d个\n", jiao_name(jiao[i]), count[i]);
}
money -= count[i] * jiao[i];
if (money == 0) {
break;
}
}
return i + 1;
}
void print_change(int* yuan, int* jiao, int n1, int n2) {
printf("找零金额:\n");
for (int i = 0; i < n1; i++) {
if (yuan[i] != 0) {
printf("%s %d张\n", yuan_name(100 / (int)pow(10, i)), yuan[i]);
}
}
for (int i = 0; i < n2; i++) {
if (jiao[i] != 0) {
printf("%s %d个\n", jiao_name((int)pow(10, i + 1)), jiao[i]);
}
}
}
char* yuan_name(int n) {
switch (n) {
case 100:
return "100元";
case 50:
return "50元";
case 20:
return "20元";
case 10:
return "10元";
case 5:
return "5元";
case 1:
return "1元";
default:
return "";
}
}
char* jiao_name(int n) {
switch (n) {
case 5:
return "五角";
case 1:
return "一角";
default:
return "";
}
}
输入交易金额与实际支付金额,程序会自动计算需要找回的纸币、硬币金额及数量,并输出结果如下:
请输入交易金额:50
请输入实际支付金额:100
找零金额:
50元 1张
4. 程序优化
为了提高程序的效率和可维护性,可以对此程序进行以下的优化:
4.1 修改金额单位为分
为了避免小数计算错误,可以将金额单位修改为分,以整数进行计算。
4.2 修改返回值类型
硬币和纸币的种类数量比较固定,可以将硬币和纸币量中定义的数组大小修改为实际数量。同时,可以将计算得到的硬币和纸币数量改为返回值的形式,而不是通过指针传递。
4.3 合并计算函数
将get_jiao()和get_yuan()函数合并为一个函数,通过参数来判断是计算硬币还是纸币。避免重复编写类似的代码。
4.4 使用更加合理的数据结构
可以考虑使用结构体来存储纸币和硬币的面值和数量,提高代码的可维护性和可读性。
5. 总结
通过学习上述内容,我们可以掌握C语言中的基本控制结构、函数的定义和调用、指针和数组等知识点。这些知识点在C语言编程中非常重要,掌握这些知识点可以帮助我们编写出高质量的程序。