用C语言构建简单计算器:函数指针的奇妙之旅
????????在这篇博客中,我们将深入探讨使用C语言编写的简单计算器。这个计算器不仅支持基本的加法、减法、乘法、除法,还包括异或运算。我们将利用函数指针和菜单驱动的方法,展示如何创建一个灵活且具有组织性的计算器。
第一种代码展示:
int add(int x,int y ) {
int z = x + y;
}
int sub(int x, int y) {
int z = x - y;
}
int cdd(int x, int y) {
int z = x * y;
}
int fcc(int x, int y) {
if (y != 0) {
int z = x / y;
return z;
} else {
printf("错误:除数不能为零\n");
}
}
int xor(int x, int y) {
int z = x ^ y;
}
muen() {
printf("******************************\n");
printf("*1.和 2.差 3.积 4.商 5.异或 *\n");
printf("*********** 0.退出 ***********\n");
printf("******************************\n");
}
int main() {
int input = 0;
int x = 0;
int y = 0;
do
{
muen();
printf("请输入你要计算的类型>");
scanf("%d",&input);
switch (input)
{
case 1:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", add(x, y));
break;
case 2:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", sub(x, y));
break;
case 3:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", cdd(x, y));
break;
case 4:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", fcc(x, y));
break;
case 0:
printf("退出");
break;
default:
printf("请重新输入!\n");
break;
}
} while (input);
代码分析(Code Analysis):
1. 函数定义:
int add(int x, int y) {
int z = x + y;
}
int sub(int x, int y) {
int z = x - y;
}
int cdd(int x, int y) {
int z = x * y;
}
int fcc(int x, int y) {
int z = x / y;
}
这四个函数(add
、sub
、cdd
、fcc
)用于执行基本的算术运算。
2. 菜单函数:
void muen() {
printf("******************************\n");
printf("*1.和 2.差 3.积 4.商 5.异或 *\n");
printf("*********** 0.退出 ***********\n");
printf("******************************\n");
}
这个函数 muen
打印了一个简单的计算器程序菜单,这个可以自己按照自己喜好
3. 主函数:
int main() {
int input = 0;
int x = 0;
int y = 0;
do {
muen();
printf("请输入你要计算的类型>");
scanf("%d", &input);
switch (input) {
case 1:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", add(x, y));
break;
case 2:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", sub(x, y));
break;
case 3:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", cdd(x, y));
break;
case 4:
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", fcc(x, y));
break;
case 0:
printf("退出");
break;
default:
printf("请重新输入!\n");
break;
}
} while (input);
}
这个主函数包含一个简单的菜单循环,允许用户选择不同的操作。用户可以输入数字来选择操作类型。然后,程序根据用户的选择执行相应的操作,包括调用上述四个函数。循环在用户输入 0
时结束。
这个代码是一个简单的计算器实现,但还需要一些改进来提高其功能性和可靠性。
第二种代码展示:
int add(int x,int y ) {
int z = x + y;
}
int sub(int x, int y) {
int z = x - y;
}
int cdd(int x, int y) {
int z = x * y;
}
int fcc(int x, int y) {
if (y != 0) {
int z = x / y;
return z;
} else {
printf("错误:除数不能为零\n");
}
}
int xor(int x, int y) {
int z = x ^ y;
}
void xyz(int (*paa)(int,int)) {//函数回调:将函数地址传给函数指针,这样传的什么函数就执行该函数
int x = 0;
int y = 0;
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", paa(x, y));
}
muen() {
printf("******************************\n");
printf("*1.和 2.差 3.积 4.商 5.异或 *\n");
printf("*********** 0.退出 ***********\n");
printf("******************************\n");
}
int main() {
int input = 0;
int x = 0;
int y = 0;
//优化
do
{
muen();
printf("请输入你要计算的类型>");
scanf("%d",&input);
switch (input)
{
case 1:
xyz(add);//函数回调
break;
case 2:
xyz(sub);
break;
case 3:
xyz(cdd);
break;
case 4:
xyz(fcc);
break;
case 0:
printf("退出");
break;
default:
printf("请重新输入!\n");
break;
}
解释:
对函数回调的解释
-
函数指针的定义:
void xyz(int (*paa)(int, int));
这里的
paa
是一个函数指针,它指向一个接受两个整数参数并返回整数的函数。在xyz
函数中,通过调用paa
来执行具体的数学运算。 -
函数回调的调用:
xyz(add);
在主程序中,通过将
add
函数的地址传递给xyz
函数,实现了函数回调。这里add
是一个函数,可以是加法运算,而xyz
函数会调用add
函数进行计算。 -
xyz 函数的实现:
void xyz(int (*paa)(int, int)) { int x = 0; int y = 0; printf("请输入两个数>"); scanf("%d%d", &x, &y); printf("%d\n", paa(x, y)); }
在
xyz
函数中,首先通过用户输入获取两个整数x
和y
。然后,通过调用函数指针paa
执行具体的数学运算。由于paa
是一个函数指针,它可以指向不同的数学运算函数,实现了根据用户选择的不同数学运算类型来动态调用相应的函数。
????????通过使用 xyz(add)
、xyz(sub)
等方式,实现了根据用户输入选择不同数学运算类型,并通过函数回调执行相应的计算。这种设计使得代码更具灵活性,可以轻松地扩展和修改支持的数学运算。
第三种代码展示:
int add(int x,int y ) {
int z = x + y;
}
int sub(int x, int y) {
int z = x - y;
}
int cdd(int x, int y) {
int z = x * y;
}
int fcc(int x, int y) {
if (y != 0) {
int z = x / y;
return z;
} else {
printf("错误:除数不能为零\n");
}
}
int xor(int x, int y) {
int z = x ^ y;
}
muen() {
printf("******************************\n");
printf("*1.和 2.差 3.积 4.商 5.异或 *\n");
printf("*********** 0.退出 ***********\n");
printf("******************************\n");
}
int main() {
int input = 0;
int x = 0;
int y = 0;
int(*pa[])(int,int) = {0,add,sub,cdd,fcc,xor};//利用函数指针数组--存储函数
do
{
muen();
printf("请输入你要计算的类型>");
scanf("%d", &input);
if (input>=1 && input<=5)
{
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", pa[input](x, y));
}
else if (input == 0)
{
printf("退出\n");//input == 0(为假)
}
else
{
printf("请重新输入\n");
}
} while (input);
解释:
函数指针数组定义:
int (*pa[])(int, int) = {0, add, sub, cdd, fcc, xor};
-
这行代码定义了一个函数指针数组
pa
,它包含了六个元素。每个元素都是一个指向函数的指针,这些函数接受两个整数参数并返回整数。数组的第一个元素为0
,主要是为了占位,使得数组的索引从1开始对应不同的数学运算。 -
用户输入和函数调用:
在主程序中,通过用户的输入
scanf("%d", &input)
获取用户选择的数学运算类型。然后,通过pa[input]
来访问函数指针数组中对应索引的元素,即获取用户选择的数学运算函数的指针。
printf("请输入你要计算的类型>");
scanf("%d", &input);
根据用户选择调用相应函数:
如果用户输入的数字在数组范围内(1到5),程序会要求用户再输入两个数,并通过 pa[input](x, y)
调用相应的数学运算函数。这样,根据用户的选择,程序动态地调用了不同的数学运算函数。
if (input >= 1 && input <= 5) {
printf("请输入两个数>");
scanf("%d%d", &x, &y);
printf("%d\n", pa[input](x, y));
}
程序的退出条件:
在 do-while
循环中,如果用户输入了 0(为假)
,即选择退出,循环会结束,程序退出。
} while (input);
通过使用函数指针数组,你实现了一个更加灵活的计算器,用户可以通过输入选择不同的数学运算类型,而程序会相应地调用相应的函数进行计算。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!