指针的使用——两位整数计算器
思路
首先我们建立一个菜单,用户输入1为加法(Add),输入2为减法(Sub),输入3为乘法(Mul),输入4为除法(Div),输入0退出计算器,输入其它数字要求重新输入。
菜单
我们完成菜单mune()函数,用户根据菜单进行输入input;
多次输入,用do……while实现,当input=0时为假时退出循环(当input不为0直接进入循环因此省略);
- 至此,代码如下
#include<stdio.h>
//打印菜单
void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit ***********\n");
printf("***********************\n");
printf("请输入运算符号:>");
}
int main()
{
int input = 0;
do{
mune();
scanf("%d", &input);
} while (input);
return 0;
}
加减乘除函数
接下来完成运算函数
//运算函数
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y ;
}
int Div(int x, int y)
{
return x / y;
}
选择语句
根据input用switch语句确认符号函数,输入x、y两整数,调用函数将结果放入ret中。
- 代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//运算函数
int Add(int x, int y)
{
return x+y;
}
int Sub(int x, int y)
{
return x-y;
}int Mul(int x, int y)
{
return x * y ;
}int Div(int x, int y)
{
return x/y;
}
void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit ***********\n");
printf("***********************\n");
printf("请输入运算符号:>");
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do{
mune();
scanf("%d", &input);
switch (input)
{
case 1 :
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("%d\n", ret);
break;
case 0 :
printf("已退出。\n");
break;
default:
printf("输入错误,请重新输入;\n");
break;
}
} while (input);
return 0;
}
- 至此,1.0版本实现
迭代
2.0版本(函数回调)
我们发现1.0版本在switch语句中每次一个运算符都要进行一次输入说明,导致代码冗杂,浪费空间,所以针对这一点进行如下优化。
观察冗余空间,我们可以将运算符函数放入Calc( )(calculate)计算函数中,将运算符函数传入该函数中去,函数回调,在主函数中直接使用;
int Calc(int (*pf)(int, int){} 函数的形参为int(*)(int,int);,为函数指针类型;
- 2.0版本代码如下
#include<stdio.h>
//运算函数
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}int Mul(int x, int y)
{
return x * y;
}int Div(int x, int y)
{
return x / y;
}
int Calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入:");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("%d\n", ret);
}
void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit ***********\n");
printf("***********************\n");
printf("请输入运算符号:>");
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do {
mune();
scanf("%d", &input);
switch (input)
{
case 1:
Calc(Add);
break;
case 2:
Calc(Sub);
break;
case 3:
Calc(Mul);
break;
case 4:
Calc(Div);
break;
case 0:
printf("已退出。\n");
break;
default:
printf("输入错误,请重新输入;\n");
break;
}
} while (input);
return 0;
}
- 至此,2.0版本实现
3.0版本(转移表)
在2.0中,我们通过函数指针完成了对运算符函数的回调。在此版本中我们利用函数指针数组的特点完成计算器的使用;
将运算符函数封装进函数指针数组内,
函数指针数组类型为int (*pf[5])(int ,int)
int (*pf[5])(int ,int )={Add,Sub,Mul,Div};
在主函数中我们之间通过数组下标(input)来确认符号函数(为方便用户,我们在下标为0处位置放入空指针NULL)。
通过指针”pf“函数指针直接调用函数。
- 至此,3.0代码如下
//转移表
void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit **********\n");
printf("*************************\n");
}
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}int Mul(int x, int y)
{
return x * y;
}int Div(int x, int y)
{
return x / y;
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
mune();
printf("请选择符号:>");
scanf("%d", &input);
//指针函数数组
int (*pf[5])(int, int) = { NULL,Add,Sub,Mul,Div };
if (input > 0 && input < 5)
{
printf("请输入:");
scanf("%d %d", &x, &y);
ret = pf[input](x, y);
printf("ret=%d\n", ret);
}
else if (input == 0)
{
printf("退出成功!\n");
break;
}
else
{
printf("输入错误,请重新输入;\n");
}
} while (input != 0);
return 0;
}
- 至此,3.0版本计算器完成
写在最后
非常感谢你的阅读!创作不易,如果觉得其中一点有帮助,还请关注我,一起进步。
当然来一个点赞也是可以的哦!🚀Live long and Prosper!🖖🏼
爱你呦~~❤️❤️❤️❤️❤️