C程序找零钱

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语言编程中非常重要,掌握这些知识点可以帮助我们编写出高质量的程序。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签