前言:在学习C语言一段时间后,相信我们都能用C语言写出简易的计算器小程序,然而一般方法都会使代码比较冗余,不够简便,代码可变性也会比较差 (见列一);

今天我就使用函数指针数组给大家带来实现起来代码比较简洁,代码后期可变性也高的计算器代码,希望对大家有所帮助~

列一:(常规实现,代码过于冗余)

void menu()
{printf("**********************************\n");printf("******* 1.add     2. sub    ******\n");printf("******* 3.mul     4. div    ******\n");printf("******* 0.exit              ******\n");printf("**********************************\n");//x&y x|y x>>y x<<y x^y
}
int Add(int x, int y)//int (*)(int, int)
{return x + y;
}int Sub(int x, int y)//int (*)(int, int)
{return x - y;
}int Mul(int x, int y)//int (*)(int, int)
{return x * y;
}int Div(int x, int y)//int (*)(int, int)
{return x / y;
}int main()
{int input = 0;do{menu();int x = 0;int y = 0;int ret = 0;printf("请选择:>");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;
}

对于过于冗余的常规代码,我们可以将冗余重复部分进行函数封装,实现函数地址找到函数再进行计算,于是就有了如下优化代码: (这个优化也运用了函数指针知识)

void menu()
{printf("**********************************\n");printf("******* 1.add     2. sub    ******\n");printf("******* 3.mul     4. div    ******\n");printf("******* 0.exit              ******\n");printf("**********************************\n");//x&y x|y x>>y x<<y x^y
}
int Add(int x, int y)//int (*)(int, int)
{return x + y;
}int Sub(int x, int y)//int (*)(int, int)
{return x - y;
}int Mul(int x, int y)//int (*)(int, int)
{return x * y;
}int Div(int x, int y)//int (*)(int, int)
{return x / y;
}
void 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);
}
int main()
{int input = 0;do{menu();printf("请选择:>");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;
}

函数指针数组实现: (大大优化了代码)

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

通过上述优化后的代码我们可以看出,函数指针与函数指针数组可以让冗余代码实现简化并具有后期可变性,也是一个比较重要的C语言知识点,需要重点理解掌握 。

【C语言】三种不同方法实现简易整型计算器 (三个方法递增优化)相关推荐

  1. rw1601可以用C语言写程序吗,用8051+1601LCD设计的整型计算器讲解.doc

    浙江海洋学院 设计题目 用8051+1601LCD设计的整型计算器 摘 要 当今时代,是一个新技术层出不穷的年代.单片机具有体积小.质量轻.价格便宜.为学习.应用和开发提供了便利条件.单片机由运算器. ...

  2. 我的Go+语言初体验——(6)整型有理数数据类型

    我的Go+语言初体验--(6)整型有理数数据类型 "我的Go+语言初体验" | 征文活动进行中- Go+ 语言使用后缀 'r' 表示有理数,支持整型.分数型.浮点型三种有理数数据类 ...

  3. 独家 | 将时间信息编码用于机器学习模型的三种编码时间信息作为特征的三种方法...

    作者:Eryk Lewinson 翻译:汪桉旭 校对:zrx本文约4400字,建议阅读5分钟 本文研究了三种使用日期相关的信息如何创造有意义特征的方法. 标签:时间帧,机器学习,Python,技术演示 ...

  4. SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解

    SEO三种职位类型:编辑型SEO.技术型SEO.营销型SEO详解 网站SEO优化作为营销端的服务之一,这些年也呈现出日新月异的格局.一改过去游兵散将式的小作坊生产模式,不断有力量强大的公司团体加入到这 ...

  5. c语言赋值小数,c语言中将一个浮点型赋值给整型时,会不会四舍五入?

    c语言中将一个浮点型赋值给整型时,不会四舍五入,会直接舍去小数部分的数据,也可以认为是执行了下取整运算. 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分.将整型值赋给浮点型变 ...

  6. python中判断文件是否存在的三种方式_Python中判断文件是否存在的方法

    Python中判断文件是否存在的方法 发布时间:2020-08-06 11:15:42 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍Python中判断文件是否存在的方法,文中介绍的非常详细, ...

  7. C#语言中提供了枚举和整型之间的强制转换功能(SelectItem)

    [csharp] view plain copy   <span style="font-family: Arial, Helvetica, sans-serif;"> ...

  8. Java学生成绩排序输出的三种不同方法

    要实现学生成绩的排序,要从两方面来考虑如何设计程序. 第一方面是选择存储方式 第二方面是选择什么样的排序方式 以下是三种不同类型的实现: 使用对象数组存储学生信息,冒泡法实现排序 使用List存储学生 ...

  9. 三种分布式锁 简易说说(包含前一篇提到的redis分布式锁)

    大多数互联网系统都是分布式部署的,分布式部署确实能带来性能和效率上的提升,但为此,我们就需要多解决一个分布式环境下,数据一致性的问题. 当某个资源在多系统之间,具有共享性的时候,为了保证大家访问这个资 ...

最新文章

  1. 西数硬盘固件刷新工具_鲁大师Q2季度硬盘排行:三星、西数上榜产品最多
  2. C++单元测试学习总结9
  3. Docker Review - docker images 常用命令
  4. workspace-project-target关系与解耦工程结构总结
  5. ts可展开注释_Nike控告WL的始末,和它被TS带货后的几近成名
  6. 阿里程序员常用的 15 个高效工具,大部分已开源!
  7. Java笔记(十七) 异步任务执行服务
  8. linux下的shell脚本(基本)
  9. CDH5.14.0 安装失败,无法接受agent发出的检测信号
  10. LINUX下载编译pcre
  11. 【声学检测】基于matlab MFCC+GMM安全事件声学检测系统【含Matlab源码 1699期】
  12. 2019年 武汉理工大学计算机考研经验分享
  13. android设置默认浏览器下载地址,android手机如何设置默认浏览器?
  14. 博弈论完全信息博弈思维导图
  15. 艺术摄影--曝光与测光(2学时)--SDUST
  16. 第3章 结构之法——电话号码对应英语单词
  17. 【StringUtils】
  18. CSS的表格样式和列表样式
  19. 眼中体:大家眼中的IT男
  20. 物联网解决方案,一个基于WiFi,一个基于ZigBee,两者的优势和劣势有哪些?

热门文章

  1. Spring基础专题——第五章(Aop代理)
  2. CSDN实现自动点赞
  3. 彩色图像到灰度转换 常见方法汇总与对比
  4. 清晰易懂的条件随机场原理总结
  5. 从零开始一起学习SLAM | 掌握g2o顶点编程套路
  6. 【Python基础】Python的深浅拷贝讲解
  7. 卷积神经网络如何处理一维时间序列数据?
  8. 基于GAN的自动驾驶汽车语义分割
  9. 在ActivMQ中添加jmx监控
  10. 嵌入在C++程序中的extern C