C语言---简易计算器的实现
创始人
2025-01-16 03:37:57
0次

序言:在学习了C语言函数调用、函数指针数组、回调函数后,我们可以用三种方法实现简易计算器的功能。

一、利用常规函数实现

  

#include   void menu() {     printf("******************************\n");     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, y;     int z = 0;     do     {         menu();         printf("请选择:");         scanf("%d", &input);         switch (input)         {         case 1:             printf("请输入两个操作数:");             scanf("%d %d", &x, &y);             z = Add(x, y);             printf("%d\n",z);             break;         case 2:             printf("请输入两个操作数:");             scanf("%d %d", &x, &y);             z = Sub(x, y);             printf("%d\n", z);             break;         case 3:             printf("请输入两个操作数:");             scanf("%d %d", &x, &y);             z = Mul(x, y);             printf("%d\n", z);             break;         case 4:             printf("请输入两个操作数:");             scanf("%d %d", &x, &y);             z = Div(x, y);             printf("%d\n", z);             break;         case 0:             printf("推出计算器\n");             break;         default:             printf("选择错误,请重新选择\n");             break;          }     } while (input);          return 0; }

  上面的代码完成了两个整数的加减乘除四个基本的运算,若我们想增加其他运算功能(>>、<<、&、|、^、&&、|| 等等),我们只需修改菜单、增加函数运算,以及补充case语句即可完成。

二、利用函数指针数组实现(转移表 )

  随着运算功能的增加,case语句会越来越长,写起来也会很麻烦,于是我们可以用转移表的方式来简化代码。

其本质就是创建一个函数指针数组,把以上函数地址存储起来。为了让数组下标与菜单相匹配,我们需要在数组中添加一个0。

int (*pfarr[5])(int, int) = { 0, Add,Sub,Mul,Div };

这样就可以通过访问数组中函数的地址来实现函数的调用。

z = pfarr[input](x, y);
#include  void menu() {     printf("******************************\n");     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, y;     int z = 0;  //创建一个函数指针的数组   -------  转移表     int (*pfarr[5])(int, int) = { 0, Add,Sub,Mul,Div };      do     {          menu();         printf("请选择:");         scanf("%d", &input);          if (input >= 1 && input <= 4)         {             printf("请输入两个操作数:");                 scanf("%d %d", &x, &y);                 z = pfarr[input](x, y);                 printf("%d\n", z);         }         else if (input == 0)         {             printf("退出计算器");         }         else         {             printf("输入正确的操作数\n");         }               } while (input);      return 0; } 

  同样,若想添加两个整数的运算功能,只需添加函数和函数指针的数组、修改菜单就行。

三、利用回调函数实现

  我们观察第一种方式,会发现case语句中有太多类似的代码,造成代码冗余。所以现在的问题就在于:想把重复的代码实现成函数,同时这个函数又能完成不同的任务。

  在case语句中的代码,只有调用函数的逻辑是有差异的,我们可以把调用的函数的地址以参数的形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这其实就是回调函数的功能。

void cal(int(*pf)(int, int)) {     int x, y;     int z = 0;     printf("请输入两个操作数:");     scanf("%d %d", &x, &y);     z = pf(x, y);     printf("%d\n", z); }
#include   void menu() {     printf("******************************\n");     printf("******* 1.add  2.sub   *******\n");     printf("******* 3.mul  4.div   *******\n");     printf("******* 0.exit         *******\n");     printf("******************************\n"); }  void cal(int(*pf)(int, int)) {     int x, y;     int z = 0;     printf("请输入两个操作数:");     scanf("%d %d", &x, &y);     z = pf(x, y);     printf("%d\n", z); } 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;          do     {         menu();         printf("请选择:");         scanf("%d", &input);         switch (input)         {         case 1:             cal(Add);             break;         case 2:             cal(Sub);             break;         case 3:             cal(Mul);             break;         case 4:             cal(Div);             break;         case 0:             printf("退出计算器\n");             break;         default:             printf("选择错误,请重新选择\n");             break;          }     } while (input);          return 0; } 

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...