【C语言】简易计算器的模拟实现

2023-10-26

前言

最近在复习指针和数组,发现之前没写过利用函数指针数组来实现计算器的博客,所以今天就来写一下。

引入

先来复习一下函数指针和函数指针数组的知识

函数指针

语法格式:

(函数返回类型) (*pf)(函数各个参数的类型) = 函数名;

例子

#include<stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int x = 2;
	int y = 3;
	int (*pfAdd)(int, int) = Add;
	int ret = (*pfAdd)(x, y);
	printf("%d\n", ret);

	return 0;
}

函数指针数组

在格式上,只需要写成如下即可


(函数返回类型) (*pf[数组元素个数])(函数各个参数的类型) = 函数名;

原始版(不使用函数指针数组)

思路

如果不使用函数指针数组的话,可以直接用switch语句,输入数字,找到对应的运算,一直循环运算,直到决定停止循环

代码

 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;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误, 重新选择\n");
			break;
		}
	} while (input);

	return 0;
}

缺点

我们可以发现,当我们想增加计算器的功能时,比如按位与、按位或、左移、右移这些操作时,我们会增大switch语句的代码量,看起来很复杂

并且,我们可以发现,每一条case语句中,都有大量的重复的语句:

			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			printf("ret = %d\n", ret);

简化版(使用函数指针数组)

思路

当我们使用函数指针数组的时候,就可以大大减少代码量
具体就是创建一个函数指针数组,把需要用到的函数存在里面,想调用时,直接通过下标,即可调用这个函数

代码

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;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		int (*pfArr[])(int, int) = {NULL, Add, Sub, Mul, Div};

		if (0 == input)
		{
			printf("退出计算器\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = pfArr[input](x, y);
			printf("ret = %d\n", ret);
		}
		else
		{
			printf("选择错误,重新选择!\n");
		}
	} 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;
}

void calc(int (*pf)(int,int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入2个操作数:");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("ret = %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;
}

结语:

对于通过C语言来简单实现计算器的介绍到这里就结束了,顺带着复习了一下指针,我们下篇文章见~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】简易计算器的模拟实现 的相关文章

  • 软件测试|sqlalchemy relationship

    简介 SQLAlchemy是一个流行的Python ORM 对象关系映射 库 它允许我们以面向对象的方式管理数据库 在SQLAlchemy中 relationship 是一个重要的功能 用于建立表之间的关系 在本文中 我们将详细探讨 rel
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

    系统环境 Win10家庭中文版 Qt 5 12 9 链接了一些64位的第三方库 程序编译完运行后出现 qt qpa plugin Could not find the Qt platform plugin windows in 弹窗如下 网
  • 华为OD机试 Java 【计算文件大小】

    题目 一个电脑文件夹系统 每个文件夹里都有一些文件和可能还有其他子文件夹 给定所有文件夹的大小和子文件夹列表 你的任务是找出某一个文件夹及其所有子文件夹里的文件总大小 输入格式 首行有两个数字 文件夹的总数M和你要查询的文件夹ID N 之后
  • 华为OD统一考试 Python【数字转化】

    描述 我们想要一种特殊的整数编码方式 让数字小的时候 编码占的空间也小 编码的方法如下 我们每7位组成一部分来编码 在每个字节里 用前7位来存数字 如果后面还有数据 最高的那一位就是1 否则就是0 数据要按小端序保存 也就是说 小的数据部分
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 华为OD机试2024年最新题库(Java)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Java 解法 问
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 面试官随便问几个问题就知道你究竟做没做过微信支付宝支付

    面试官随便问几个问题就知道你究竟做没做过微信支付宝支付 你知道直连模式和服务商模式吗 网上的课程一般给你演示的都是直连模式 而企业中有不少是申请成为了服务商 因为里面有佣金提成 我粗俗地解释 直连模式 就是说你是一个会做生意的老板 自己会搞
  • (2024最新整理)Java最全八股文及答案!

    Java的特点 Java是一门面向对象的编程语言 面向对象和面向过程的区别参考下一个问题 Java具有平台独立性和移植性 Java有一句口号 Write once run anywhere 一次编写 到处运行 这也是Java的魅力所在 而实
  • Python 文件的复制重命名以及xlsx文件中表格分开保存

    1 需要的头文件 import shutil import os import openpyxl 2 复制文件以及重命名 直接使用shutil库复制 重命名 移动即可 函数封装示例 source path 为全局变量被复制文件路径 dest
  • 春眠不觉晓,Java数据类型知多少?基础牢不牢看完本文就有数了

    俺滴座右铭是不在沉默中爆发 就在沉默中灭亡 一起加油学习 珍惜现在来之不易的学习时光吧 等工作之后 你就会发现 想学习真的需要挤时间 厚积薄发啦 我们知道Java是面向对象的静态型编程语言 在Java的世界里万物皆对象 但我认为是万物皆数据
  • 【go语言】读取toml文件

    一 简介 TOML 全称为Tom s Obvious Minimal Language 是一种易读的配置文件格式 旨在成为一个极简的数据序列化语言 TOML的设计原则之一是保持简洁性 易读性 同时提供足够的灵活性以满足各种应用场景 TOML
  • 学Python,一个月从小白到大神?看你怎么学!

    Python是一门超强大而且超受欢迎的编程语言 它被用在各种领域 比如网站开发 数据分析 人工智能和机器学习 学会Python会给你创造很多职业机会 所以绝对是值得一试的 但你有没有过这样的梦想 一个月时间 从Python小白变成Pytho
  • 计算机Java项目|有机蔬菜商城

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 【js学习之路】遍历数组api之 `filter `和 `map`的区别

    一 前言 数组是我们在项目中经常使用的数据类型 今天我们主要简述作用于遍历数组的api filter 和 map 的区别 二 filter和map的共同点 首先 我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数
  • 计算机Java项目|人体健康信息管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|java游戏账号交易系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板

随机推荐

  • 学生信息管理系统代码全篇

    学生信息管理系统 include
  • centos8重启网卡命令nmcli

    重载所有ifcfg或route到connection 不会立即生效 nmcli c reload ifcfg xxx 1 重载指定ifcfg或route到connection 不会立即生效 nmcli c load etc sysconfi
  • QT获取顶级窗口指针并不是准确的顶级窗口指针解决办法

    在QT中我们可以通过topLevelWidget 函数获取顶级窗口指针 但是获取到的顶级窗口指针并不是该窗口创建的时候的使用的顶级窗口指针 语句如下 MainWindow parentWidget1 MainWindow topLevelW
  • 344.Reverse String

    class Solution public string reverseString string s string strReverse s for int n s size 1 n gt 0 n strReverse s size 1
  • mysql存储过程中使用游标及注意事项

    用户变量一般以 开头 作用于全局范围 局部变量需用 declare 定义格式为 declare 变量名 数据类型 default value mysql 数据类型有 int float date varchar length 等 声明的顺序
  • 声笔码6.00版使用指南

    声笔码6 00版使用指南 声笔码发明人兼设计人 戴石麟 电邮 sbxlm 126 com 一 声笔码简介 1 声笔码6 00版的新特性 与声笔码5 00版相比 声笔码6 00版具有下面一些新的特性 1 对笔画的表示方式进行了调整 原来是用字
  • 解构赋值

    解构赋值是一种表达式 允许您使用数组或对象 将可迭代对象的值或属性分配给变量 解构赋值能让我们用更简短的语法进行多个变量的赋值 大大的减少了代码量 解构表达式有两种 array和object 1 数组 E6之前 我们可以这种形式将数组的内容
  • python点云处理算法汇总(长期更新版)

    目录 测试数据 百度网盘 一 读写显示 二 KD树与八叉树 三 点云特征 四 点云滤波 五 点云配准 六 点云分割拟合 七 mesh操作 八 三维重建 九 可视化 十 RGBD 十一 python 十二 基础操作 测试数据 Open3D算法
  • 【C】cannot convert ‘<brace-enclosed initializer list>‘ to ‘int‘ in assignment

    转载 https blog csdn net modi000 article details 108180978 原因 数组定义与初始化分开时 只能进行单个元素的赋值 而不能进行统一赋值
  • 深度确定性策略梯度(DDPG)

    1 从随机策略到确定性策略 从DDPG这个名字看 它是由D Deep D Deterministic PG Policy Gradient 组成 PG Policy Gradient 我们在强化学习 十三 策略梯度 Policy Gradi
  • Pytorch学习率调整策略

    PyTorch学习率调整策略 学习率可以直接控制模型参数更新的步伐 在整个模型训练过程中学习率并不是一成不变的 而是可以调整变化的 如果想要模型训练到理想的效果 必须在训练后期调整学习率 防止模型训练遇到局部最优就停下来了 PyTorch学
  • 决策树分类和预测算法的原理及实现

    作者 蓝鲸 算法决策树是一种通过对历史数据进行测算实现对新数据进行分类和预测的算法 简单来说决策树算法就是通过对已有明确结果的历史数据进行分析 寻找数据中的特征 并以此为依据对新产生的数据结果进行预测 决策树由3个主要部分组成 分别为决策节
  • Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

    RelativeLayout中子控件常用属性 子控件默认是从父控件的左上角开始排列的 相对于父控件 android layout alignParentTop true 和父控件的顶部对齐 android layout alignParen
  • 编译原理实验一 词法分析

    编译原理实验一 词法分析 实验目的 1 根据 PL 0 语言的文法规范 编写PL 0语言的词法分析程序 或者调研词法分析程序的自动生成工具LEX或FLEX 设计并实现一个能够输出单词序列的词法分析器 2 通过设计调试词法分析程序 实现从源程
  • 微信小程序头部导航栏返回键,返回到指定页面

    onUnload function wx reLaunch url my my onUnload 参考微信小程序页面路由
  • VTK教程(1):VTK基础知识

    VTK教程 1 VTK基础知识 VTK Visualization Toolkit 是一个功能强大的开源图形和可视化库 用于处理和可视化各种类型的数据 包括几何数据 图像 体数据 矢量场等 以下是VTK的基础知识 数据类型和数据集 VTK支
  • 数据库之MySQL基本操作

    数据库之MySQL 可以把MySQL看成一款支持远程操作文件的软件 库 gt gt gt 文件夹 表 gt gt gt 文件 记录 gt gt gt 文件内一行行的数据叫做一条条的记录 表头 就是表格的第一行数据 字段 字段名 字段类型 本
  • 【VUE3+AntV-G2】数据可视化 封装antv G2 气泡图组件

    一些废话 默默做前端 分享一些自己在项目需求实现中遇到的奇妙问题 主要是网上搜索不到解决办法自己解决后的总结方法和解决办法但不全面 自己整理总结的存档 事发背景 原型绘制了需要同时展示多个指标的数据气泡图 想到可以使用antv的气泡图 刚好
  • 顺序表和单链表基本操作的实现

    1 顺序表的建立 取指定元素 返回指定元素位置 2 顺序表中插入新元素 删除指定元素操作的实现 3 单链表的建立 取指定元素 返回指定元素位置 4 单链表中插入新元素 删除指定元素操作的实现 该主要完成单链表中基本操作的实现 单链表中的元素
  • 【C语言】简易计算器的模拟实现

    前言 最近在复习指针和数组 发现之前没写过利用函数指针数组来实现计算器的博客 所以今天就来写一下 引入 先来复习一下函数指针和函数指针数组的知识 函数指针 语法格式 函数返回类型 pf 函数各个参数的类型 函数名 例子 include