简易计算器的制作(函数指针数组的实践)
个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客
前期思路(菜单的制作等):利用C语言的分支循环少量的函数知识写一个猜数字的小游戏-CSDN博客
计算器的制作其实与游戏没有很大的区别。
#include <stdio.h>
void Add(int x, int y)//加法
{printf("%d\n", x + y);
}void Sub(int x, int y)//减法
{printf("%d\n", x - y);
}void Mul(int x, int y)//乘法
{printf("%d\n", x * y);
}void Div(int x, int y)//除法
{printf("%d\n", x / y);
}void menu()
{printf("****************************\n");printf("**** 1.Add 2.Sub ****\n");printf("**** 3.Mul 4.Div ****\n");printf("****** 0.exit ******\n");printf("****************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;do{menu();printf("请输入您要进行的运算:");scanf("%d", &input);switch (input){case 1:printf("请输入要运算的数:");scanf("%d%d", &x, &y);Add(x,y);break;case 2:printf("请输入要运算的数:");scanf("%d%d", &x, &y);Sub(x, y);break;case 3:printf("请输入要运算的数:");scanf("%d%d", &x, &y);Mul(x, y);break;case 4:printf("请输入要运算的数:");scanf("%d%d", &x, &y);Div(x, y);break;case 0: printf("退出计算器\n");break;default: printf("输入错误,请重新输入:\n");break;}} while (input);return 0;
}
注意上述计算都是整数运算。
上面这个代码虽然能够达到我们想要的目的,但是我们会发现这个比较冗杂,特别是那个switch……case语句。那么我们有没有什么办法,使这个代码看上去简洁一点呢?这个就得用到函数指针数组的知识点(不知道的小伙伴可以去我的主页自取,指针第3篇),通过一个数组存放一些函数的地址,再间接来调用这些函数。
#include <stdio.h>
void Add(int x, int y)
{printf("%d\n", x + y);
}void Sub(int x, int y)
{printf("%d\n", x - y);
}void Mul(int x, int y)
{printf("%d\n", x * y);
}void Div(int x, int y)
{printf("%d\n", x / y);
}void menu()
{printf("****************************\n");printf("**** 1.Add 2.Sub ****\n");printf("**** 3.Mul 4.Div ****\n");printf("****** 0.exit ******\n");printf("****************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;void (*p[5])(int, int) = { 0, Add, Sub, Mul, Div };//数组初始化,对应的运算do{menu();printf("请输入您要进行的运算:");scanf("%d", &input);printf("请输入要运算的数:");scanf("%d%d", &x, &y);switch (input){case 1:p[1](x, y);break;case 2:p[2](x, y);break;case 3:p[3](x, y);break;case 4:p[4](x, y);break;case 0: printf("退出计算器\n");break;default: printf("输入错误,请重新输入:\n");break;}} while (input);return 0;
}
这个代码去计算,确实是没问题。但是如果我们输入错误或者是想退出计算器,就显得有点别扭。
输入错误了或者不想用了,还要我们输入运算数。
怎么解决呢?其实只要我们限制输入的数就行了。
#include <stdio.h>
void Add(int x, int y)
{printf("%d\n", x + y);
}void Sub(int x, int y)
{printf("%d\n", x - y);
}void Mul(int x, int y)
{printf("%d\n", x * y);
}void Div(int x, int y)
{printf("%d\n", x / y);
}void menu()
{printf("****************************\n");printf("**** 1.Add 2.Sub ****\n");printf("**** 3.Mul 4.Div ****\n");printf("****** 0.exit ******\n");printf("****************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;void (*p[5])(int, int) = { 0, Add, Sub, Mul, Div };do{menu();printf("请输入您要进行的运算:");scanf("%d", &input);if ((input >= 1) && (input <= 4))//switch语句在此处用不了{printf("请输入要运算的数:");scanf("%d%d", &x, &y);p[input](x,y);}else if (input == 0){printf("退出计算器\n");}else{printf("输入错误,请重新输入:\n");}} while (input);return 0;
}
如果把if语句写进switch语句中会导致if语句不执行。因为先执行的switch语句,就直接跳到case语句去了,不会理会if语句。
当然这个也可以用函数调用的方法来写。
#include <stdio.h>
void Add(int x, int y)
{printf("%d\n", x + y);
}void Sub(int x, int y)
{printf("%d\n", x - y);
}void Mul(int x, int y)
{printf("%d\n", x * y);
}void Div(int x, int y)
{printf("%d\n", x / y);
}void menu()
{printf("****************************\n");printf("**** 1.Add 2.Sub ****\n");printf("**** 3.Mul 4.Div ****\n");printf("****** 0.exit ******\n");printf("****************************\n");
}void calc(void(*p)(int, int))
{printf("请输入要运算的数:");int x = 0;int y = 0;scanf("%d%d", &x, &y);p(x, y);}int main()
{int input = 0;int x = 0;int y = 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;
}
相关文章:

简易计算器的制作(函数指针数组的实践)
个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 前期思路(菜单的制作等):利用C语言的分支循环少量的函数知识写一个猜数字的小游戏-CSDN博客 计算器的制作其实与游…...

HBase相关面试准备问题
为什么选择HBase 1、海量存储 Hbase适合存储PB级别的海量数据,在PB级别的数,能在几十到几百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正是因为Hbase良好的扩展性,才为海量数据的存储提供了便利。 2、列式存储 这里的列式存储其实说的…...
sklearn实现数据标准化(Standardization)和归一化(Normalization)
标准化(Standardization) sklearn的标准化过程,即包括Z-Score标准化,也包括0-1标准化,并且即可以通过实用函数来进行标准化处理,同时也可以利用评估器来执行标准化过程。接下来我们分不同功能以的不同实现…...

做技术的应该是没有什么你不会
这句话放在现在很多年轻人的观念来评价,肯定是错的。但小编一直捧为真理,也一直践行着。 我记不得这话可能也是谁给我讲的。 先讲故事吧。 小编刚参加工作是做技术支持,我所在公司是给一些软件开发企业提供智能卡读写机具,并配…...

MySQL进阶45讲【10】MySQL为什么有时候会选错索引?
1 前言 前面我们介绍过索引,在MySQL中一张表其实是可以支持多个索引的。但是,写SQL语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由MySQL来确定的。 大家有没有碰到过这种情况,一条本来可以执行得…...
网络安全-端口扫描和服务识别的几种方式
禁止未授权测试!!! 前言 在日常的渗透测试中,我们拿到一个ip或者域名之后,需要做的事情就是搞清楚这台主机上运行的服务有哪些,开放的端口有哪些。如果我们连开放的端口和服务都不知道,下一步针…...

【分布式】雪花算法学习笔记
雪花算法学习笔记 来源 https://pdai.tech/md/algorithm/alg-domain-id-snowflake.html概述 雪花算法是推特开源的分布式ID生成算法,以划分命名空间的方式将64位分割成多个部分,每一个部分代表不同的含义,这种就是将64位划分成不同的段&…...
6.函数表达式 - JS
函数表达式 function (someArgs) { someStatements } function name(someArgs) { someStatements } (someArgs) > { someStatements }函数表达式就是要,在一个表达式中定义一个函数;箭头函数也是一个简洁的函数表达式;执行完函数表达式&a…...
【RK3288 Android10 C30 支持sim卡拔掉不弹窗,及热插拔】
文章目录 【RK3288 Android10 C30 支持sim卡拔掉不弹窗,及热插拔】需求方案patchframework【RK3288 Android10 C30 支持sim卡拔掉不弹窗,及热插拔】 需求 由于3288 硬件上的sim卡座不支持热插拔,是没有顶针来识别sim卡是否被拔掉的。所以在sim被拔掉或者松动的时候,会弹窗…...
python生成docx文件
使用python自动生成一张想要的docx文件 在这其中有指纹和公司盖章 from PIL import Image from docx import Document from docx.oxml.ns import qn from docx.shared import Pt, Inches, Cm from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from xlsxtpl.writerx import …...

网络异常案例四_IP异常
问题现象 终端设备离线,现场根据设备ip,ping不通。查看路由器。 同一个路由器显示的终端设备(走同一个wifi模块接入),包含不同网段的ip。 现场是基于三层的无线漫游,多个路由器wifi配置了相同的ssid信息&a…...

Hack The Box-Challenges-Misc-M0rsarchive
解压压缩包,里面是一张图片和一个新的zip文件 图片放大后的图案是----. 考虑到为莫斯密码,将其解密 密码为9,继续解压缩包 又是一张莫斯密码图加压缩包,写一段脚本去解密图片中的莫斯密码,并自动解压缩包 import re i…...

验证码倒计时:用户界面的小细节,大智慧
欢迎来到我的博客,代码的世界里,每一行都是一个故事 验证码倒计时:用户界面的小细节,大智慧 前言为什么需要验证码倒计时防止滥用:用户心理: 设计考量可见性:友好性:适应性ÿ…...
Web后端:CSRF攻击及应对方法
CSRF攻击是开发Web后端时需要重点解决的问题。 那么什么是CSRF攻击呢? CSRF跨站点请求伪造(Cross—Site Request Forgery),其主要利用的是Cookie的一个弱点,就是Cookie 最初被设计成了允许在第三方网站发起的请求中携带: 关于Co…...
【手写数据库toadb】toadb表对象访问操作,存储管理抽象层软件架构设计思想应用
21 表文件访问秘密 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便…...

SpringBoot使用Rabbit详解含完整代码
点击下载《SpringBoot使用Rabbit详解含完整代码》 1. 摘要 本文将详细介绍如何在Spring Boot应用程序中集成和使用RabbitMQ消息队列。RabbitMQ是一个开源的消息代理和队列服务器,用于通过轻量级和可靠的消息在应用程序或系统之间进行异步通信。本文将通过步骤说明…...
深度学习本科课程 实验3 网络优化
一、在多分类任务实验中实现momentum、rmsprop、adam优化器 1.1 任务内容 在手动实现多分类的任务中手动实现三种优化算法,并补全Adam中计算部分的内容在torch.nn实现多分类的任务中使用torch.nn实现各种优化器,并对比其效果 1.2 任务思路及代码 imp…...

Eclipse 安装使用ABAPGit
Eclipse->Help->Install New software 添加地址 https://eclipse.abapgit.org/updatesite/ 安装完成打开 选择abapGit repositories,先添加仓库 点下图添加自己仓库 如图添加仓库地址 添加完仓库后,点击我的仓库 右键选中行,可以进行push和pu…...
std::mutex std::recursive_mutex std::shared_mutex
std::mutex C11。最简单的互斥锁,1个线程内,不支持重复加锁。 std::lock_guard<std::mutex> lock(mutex) std::recursive_mutex C11。可以替代st::mutex,但性能会下降。1个线程内,支持重复加锁(可重入&#x…...
vscode的vetur文档格式化失效
如果vscode安装了vetur插件之后,shiftAltF又无法格式化vue文件代码。 解决办法:打开文件 ---> 首选项 ---> 设置,搜索 vetur.format.defaultFormatter.html后将prettier替换勾选为js-beautify-html 注:设置下划线了并可以在…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...