简易计算器的制作(函数指针数组的实践)
个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-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 注:设置下划线了并可以在…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...
uniapp获取当前位置和经纬度信息
1.1. 获取当前位置和经纬度信息(需要配置高的SDK) 调用uni-app官方API中的uni.chooseLocation(),即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...
