当前位置: 首页 > news >正文

简易计算器的制作(函数指针数组的实践)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-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;
}

相关文章:

简易计算器的制作(函数指针数组的实践)

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

HBase相关面试准备问题

为什么选择HBase 1、海量存储 Hbase适合存储PB级别的海量数据&#xff0c;在PB级别的数&#xff0c;能在几十到几百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正是因为Hbase良好的扩展性&#xff0c;才为海量数据的存储提供了便利。 2、列式存储 这里的列式存储其实说的…...

sklearn实现数据标准化(Standardization)和归一化(Normalization)

标准化&#xff08;Standardization&#xff09; sklearn的标准化过程&#xff0c;即包括Z-Score标准化&#xff0c;也包括0-1标准化&#xff0c;并且即可以通过实用函数来进行标准化处理&#xff0c;同时也可以利用评估器来执行标准化过程。接下来我们分不同功能以的不同实现…...

做技术的应该是没有什么你不会

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

MySQL进阶45讲【10】MySQL为什么有时候会选错索引?

1 前言 前面我们介绍过索引&#xff0c;在MySQL中一张表其实是可以支持多个索引的。但是&#xff0c;写SQL语句的时候&#xff0c;并没有主动指定使用哪个索引。也就是说&#xff0c;使用哪个索引是由MySQL来确定的。 大家有没有碰到过这种情况&#xff0c;一条本来可以执行得…...

网络安全-端口扫描和服务识别的几种方式

禁止未授权测试&#xff01;&#xff01;&#xff01; 前言 在日常的渗透测试中&#xff0c;我们拿到一个ip或者域名之后&#xff0c;需要做的事情就是搞清楚这台主机上运行的服务有哪些&#xff0c;开放的端口有哪些。如果我们连开放的端口和服务都不知道&#xff0c;下一步针…...

【分布式】雪花算法学习笔记

雪花算法学习笔记 来源 https://pdai.tech/md/algorithm/alg-domain-id-snowflake.html概述 雪花算法是推特开源的分布式ID生成算法&#xff0c;以划分命名空间的方式将64位分割成多个部分&#xff0c;每一个部分代表不同的含义&#xff0c;这种就是将64位划分成不同的段&…...

6.函数表达式 - JS

函数表达式 function (someArgs) { someStatements } function name(someArgs) { someStatements } (someArgs) > { someStatements }函数表达式就是要&#xff0c;在一个表达式中定义一个函数&#xff1b;箭头函数也是一个简洁的函数表达式&#xff1b;执行完函数表达式&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异常

问题现象 终端设备离线&#xff0c;现场根据设备ip&#xff0c;ping不通。查看路由器。 同一个路由器显示的终端设备&#xff08;走同一个wifi模块接入&#xff09;&#xff0c;包含不同网段的ip。 现场是基于三层的无线漫游&#xff0c;多个路由器wifi配置了相同的ssid信息&a…...

Hack The Box-Challenges-Misc-M0rsarchive

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

验证码倒计时:用户界面的小细节,大智慧

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 验证码倒计时&#xff1a;用户界面的小细节&#xff0c;大智慧 前言为什么需要验证码倒计时防止滥用&#xff1a;用户心理&#xff1a; 设计考量可见性&#xff1a;友好性&#xff1a;适应性&#xff…...

Web后端:CSRF攻击及应对方法

CSRF攻击是开发Web后端时需要重点解决的问题。 那么什么是CSRF攻击呢&#xff1f; CSRF跨站点请求伪造(Cross—Site Request Forgery)&#xff0c;其主要利用的是Cookie的一个弱点&#xff0c;就是Cookie 最初被设计成了允许在第三方网站发起的请求中携带&#xff1a; 关于Co…...

【手写数据库toadb】toadb表对象访问操作,存储管理抽象层软件架构设计思想应用

21 表文件访问秘密 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便…...

SpringBoot使用Rabbit详解含完整代码

点击下载《SpringBoot使用Rabbit详解含完整代码》 1. 摘要 本文将详细介绍如何在Spring Boot应用程序中集成和使用RabbitMQ消息队列。RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;用于通过轻量级和可靠的消息在应用程序或系统之间进行异步通信。本文将通过步骤说明…...

深度学习本科课程 实验3 网络优化

一、在多分类任务实验中实现momentum、rmsprop、adam优化器 1.1 任务内容 在手动实现多分类的任务中手动实现三种优化算法&#xff0c;并补全Adam中计算部分的内容在torch.nn实现多分类的任务中使用torch.nn实现各种优化器&#xff0c;并对比其效果 1.2 任务思路及代码 imp…...

Eclipse 安装使用ABAPGit

Eclipse->Help->Install New software 添加地址 https://eclipse.abapgit.org/updatesite/ 安装完成打开 选择abapGit repositories,先添加仓库 点下图添加自己仓库 如图添加仓库地址 添加完仓库后&#xff0c;点击我的仓库 右键选中行&#xff0c;可以进行push和pu…...

std::mutex std::recursive_mutex std::shared_mutex

std::mutex C11。最简单的互斥锁&#xff0c;1个线程内&#xff0c;不支持重复加锁。 std::lock_guard<std::mutex> lock(mutex) std::recursive_mutex C11。可以替代st::mutex&#xff0c;但性能会下降。1个线程内&#xff0c;支持重复加锁&#xff08;可重入&#x…...

vscode的vetur文档格式化失效

如果vscode安装了vetur插件之后&#xff0c;shiftAltF又无法格式化vue文件代码。 解决办法&#xff1a;打开文件 ---> 首选项 ---> 设置&#xff0c;搜索 vetur.format.defaultFormatter.html后将prettier替换勾选为js-beautify-html 注&#xff1a;设置下划线了并可以在…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 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 上运行的目标代码(字节码),就可以…...