用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;
}

这四个函数(addsubcddfcc)用于执行基本的算术运算。

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;}

解释:

对函数回调的解释

  1. 函数指针的定义:
    void xyz(int (*paa)(int, int));

    这里的 paa 是一个函数指针,它指向一个接受两个整数参数并返回整数的函数。在 xyz 函数中,通过调用 paa 来执行具体的数学运算。

  2. 函数回调的调用:
    xyz(add);

    在主程序中,通过将 add 函数的地址传递给 xyz 函数,实现了函数回调。这里 add 是一个函数,可以是加法运算,而 xyz 函数会调用 add 函数进行计算。

  3. 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 函数中,首先通过用户输入获取两个整数 xy。然后,通过调用函数指针 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};
  1. 这行代码定义了一个函数指针数组 pa,它包含了六个元素。每个元素都是一个指向函数的指针,这些函数接受两个整数参数并返回整数。数组的第一个元素为 0,主要是为了占位,使得数组的索引从1开始对应不同的数学运算。

  2. 用户输入和函数调用

    在主程序中,通过用户的输入 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);

通过使用函数指针数组,你实现了一个更加灵活的计算器,用户可以通过输入选择不同的数学运算类型,而程序会相应地调用相应的函数进行计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毅速:3D打印随形水路已经逐步向压铸模具普及

随着科技的不断发展&#xff0c;3D打印技术已经逐渐渗透到各个领域。其中&#xff0c;3D打印随形水路在注塑模具中已经广泛应用&#xff0c;目前正逐渐向压铸模具普及。 传统CNC等减材工艺的水路制造&#xff0c;可以在模具中生产出平直的冷却水路&#xff0c;但这种工艺难以加…

FMQL开发环境搭建

FMQL开发环境搭建 一、概述 此篇记录上海复旦微电子JFMQL15T开发板开发环境搭建&#xff0c;包含procise安装、vivado2018.3安装破解、IAR安装&#xff0c;以及vivado2018.3 IP_PATCH打补丁全过程&#xff0c;为后续开发基础。 二、IAR安装 安装IAR的软件版本是IAR 8.32.1,…

多用户商城系统哪个好,我的B2B2C电商系统选型之路

选择适合自己的B2B2C电商系统需要考虑多个因素&#xff0c;包括系统功能、易用性、扩展性、安全性和成本等。以下是一些常见的多用户商城系统供您参考&#xff1a; 1. 商淘云 基本情况&#xff1a;广州商淘信息科技有限公司旗下品牌&#xff0c;这家起步过程在国内商户中算比较…

【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

Opencv中的滤波器

一副图像通过滤波器得到另一张图像&#xff0c;其中滤波器又称为卷积核&#xff0c;滤波的过程称之为卷积。 这就是一个卷积的过程&#xff0c;通过一个卷积核得到另一张图片&#xff0c;明显发现新的到的图片边缘部分更加清晰了&#xff08;锐化&#xff09;。 上图就是一个卷…

攻防世界——Hello, CTF

运行可以发现这是输入型的flag &#xff08;re题目分为两类&#xff0c;一种你直接输入flag&#xff0c;还有一种就是你完成某个操作后&#xff0c;给你flag&#xff09; 可以发现关键字符串就是wrong 和 input 32位 IDA打开 进入直接进入字符串界面&#xff0c;发现关键字符…

Java小案例-讲一下Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理

目录 前言 Nacos 如何进行服务自动注册&#xff1f; 服务自动注册三板斧 服务实例数据封装--Registration 服务注册--ServiceRegistry 服务自动注册--AutoServiceRegistration Ribbon OpenFeign 总结 前言 注册中心要集成SpringCloud&#xff0c;想实现SpringCloud的…

驱动开发-1

一、驱动课程大纲 内核模块字符设备驱动中断 二、ARM裸机代码和驱动有什么区别&#xff1f; 1、共同点&#xff1a; 都能够操作硬件 2、不同点&#xff1a; 1&#xff09;裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的套路往寄存器里面写值 2&#xff09…

python异常之try/finally分句

1 python异常之try/finally分句 不管try语句代码块是否发生异常&#xff0c;finally分句代码块都会执行。 finally分句用于定义任何情况下都必须执行的清理操作&#xff0c;将会在最后执行。 finally分句用于任何需要保证资源释放的场景。 比如&#xff0c;文件操作后的关闭…

c++11--强枚举类型,智能指针

1.枚举 1.1. c11之前的枚举 实例 #include <iostream>enum Type{ONE,TWO,THREE };int main(){printf("sizeof_%d, ONE_%d\n", sizeof(ONE), ONE);return 0; }具备以下特点&#xff1a; (1). 枚举值直接在父作用域可见。 (2). 枚举底层类型由编译器结合枚举成员…

爬虫工作量由小到大的思维转变---<第二十二章 Scrapy开始很快,越来越慢(诊断篇)>

前言: 相信很多朋友在scrapy跑起来看到速度200/min开心的不得了;可是,越跑到后面,发现速度变成了10-/min;刚开始以为是ip代理的问题,结果根本不得法门... 新手跑3000 ~ 5000左右数据,我相信大多数人没有问题,也不会发现问题; 可一旦数据量上了10W,你是不是就能明显感觉到速度…

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置 一、编辑器模式下的PlayerPrefs存储位置1.Win r 输入regedit进入注册表界面2. HKEY_CURRENT_USER/Software/Unity3.CompanyName和ProjectName可以在Unity->Edit->Project Settings->Player中查看和设置 二、…

华为设备文件系统基础

华为网络设备的配置文件和VRP系统文件都保存在物理存储介质中&#xff0c;所以文件系统是VRP正常运行的基础。只有掌握了对文件系统的基本操作&#xff0c;网络工程师才能对设备的配置文件和VRP系统文件进行高效的管理。 基本查询命令 VRP基于文件系统来管理设备上的文件和目录…

力扣(leetcode)13和14题(Python)

13.罗马数字转整数 题目链接&#xff1a;13.罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符数值I1V5X10L50C100D500M1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的…

【低照度图像增强系列(1)】传统方法(直方图、图像变换)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

广行天下车GO项目经验

1.如果有对象返回已有对象,没有创建新对象 QuesionnairResult result this.get(id).map(QuesionnairMapper.INSTANCE::toResult).orElseGet(QuesionnairResult::new);2.类加上 Transactional(readOnly true)只读数据 创建更新删除方法加上 表示异常就回滚 Transactional(roll…

乐才无代码开发:连接CRM提升电商与营销系统

无缝API连接的商业价值 在电子商务生态系统中&#xff0c;无缝的系统连接是保证业务流程顺畅、提高客户满意度的关键。乐才API提供了一种无需编码的集成方法&#xff0c;使得企业能够在不具备深度技术能力的情况下&#xff0c;实现电商平台与各种服务和工具的紧密连接。这种解…

【Spring实战】04 Lombok集成及常用注解

文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor&#xff0c;AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具&#xff0c;它通过注解的方式简化了 Java 代码的编写&…

建立百科词条能带给企业什么营销价值?

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…

go从0到1项目实战体系二十:单元测试

initRouter\initRouter.go package initRouter import ("github.com/gin-gonic/gin""net/http" )func SetupRouter() *gin.Engine {router : gin.Default()// 添加 Get 请求路由router.GET("/", func(context *gin.Context) {context.String(ht…