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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vuecli3 执行 npm run build 打包命令报错:TypeError: file.split is not a function

问题 今天有个项目在打包的时候遇到了一个问题&#xff0c;就是执行 npm run build 命令的时候报错了&#xff0c;如下&#xff1a; 解决 我排查了一下&#xff0c;模拟代码如下&#xff1a;在打包的时候用了 MinChunkSizePlugin const webpack require("webpack"…

2024阿里云GPU服务器租用价格表(包月/按小时/学生价)

阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用&#xff0c;阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折优惠&#xff0c;阿里云百科aliyunbaike.com分享阿里云GPU服务器…

Docker容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…

波纹扩散效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>波纹扩散</title><style>body {disp…

学习 Redis 基础数据结构,不讲虚的。

学习 Redis 基础数据结构&#xff0c;不讲虚的。 一个群友给我发消息&#xff0c;“该学的都学了&#xff0c;怎么就找不到心意的工作&#xff0c;太难了”。 很多在近期找过工作的同学一定都知道了&#xff0c;背诵八股文已经不是找工作的绝对王牌。企业最终要的是可以创造价…

DePIN+GameFi+顶级电竞团队,GAIMIN如何颠覆Web3游戏赛道

DePIN带动互联网进入去中心化时代 自从智能合约和去中心化应用DApp普及之后&#xff0c;越来越多的从业者开始将目光放在区块链对互联网的升级和改造之上&#xff0c;这里主要进行了三类&#xff0c;第一类是通过节点的去中心化来实现的&#xff0c;这样确保了基础设施的分散&a…

双指针专题2 数组元素的目标和

数组元素的目标和 C代码实现: #include<iostream> using namespace std; const int N1000000;int a[N],b[N]; int main(){int n,m,x;cin>>n>>m;cin>>x;for(int i0;i<n;i){cin>>a[i];}for(int j0;j<m;j){cin>>b[j];}for(int i0,jm-1…

Java利用阿里云OSS/本地存储实现文件上传功能

目录 1、简介 2、本地存储 3、阿里云OSS 3.1、准备 3.2、入门 3.3、项目实施 3.4、注意 4、图片删除 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和…

零基础学编程系列,从入门到精通,中文编程开发语言工具下载,编程构件容器件之控制面板构件用法

零基础学编程系列&#xff0c;从入门到精通&#xff0c;中文编程开发语言工具下载&#xff0c;编程构件容器件之控制面板构件用法 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载…

vite项目配置根据不同的打包环境使用不同的请求路径VITE_BASE_URL,包括报错解决

vite环境配置可以看官方文档&#xff1a;环境变量和模式 | Vite 官方中文文档 创建环境配置文件 在项目根目录下面创建.env和.env.production文件&#xff0c;.env是开发环境使用的&#xff0c;.env.production是生产环境使用的。 .env文件&#xff1a; # 基本环境 VITE_APP…

敏捷产品是双轨开发而非双轨制

长话短说&#xff1a; 如果你以前听说过“双轨开发”这个术语&#xff0c;本文将解释它的来源和含义。以下是要点 开发工作侧重于可预测的结果和可保证的质量 探索工作侧重于快速学习和快速验证 探索和发展被可视化为两条轨道&#xff0c;因为这是两种工作&#xff0c;两种思…

Leetcode3020. 子集中元素的最大数量

Every day a Leetcode 题目来源&#xff1a;3020. 子集中元素的最大数量 解法1&#xff1a;哈希 枚举 用一个哈希表统计数组 nums 中的元素及其出现次数。 暴力枚举数组中的数&#xff0c;作为 x&#xff0c;然后不断看 x2,x4,⋯ 在数组中的个数。直到个数不足 2 个为止&a…

微信小程序新手入门教程四:样式设计

WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式&#xff0c;决定了 WXML 的组件会怎么显示。 WXSS 具有 CSS 大部分特性&#xff0c;同时为了更适合开发微信小程序&#xff0c;WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比&#xff0c;WXSS …

Unity AnimationRigging无法修改权重?

个人理解&#xff0c;已解决无法修改权重的问题: unity自带的动画系统是在FixUpdate和Update之后LateUpdate之前执行&#xff0c;如果在这FixedUpdate或Update函数内更新AnimationRigging内的权重后&#xff0c;内部动画系统会覆盖权重的修改&#xff0c;导致无法正确更新&…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞复现

0x01 产品简介 网神SecGate 3600防火墙是基于状态检测包过滤和应用级代理的复合型硬件防火墙,是专门面向大中型企业、政府、军队、高校等用户开发的新一代专业防火墙设备,支持外部攻击防范、内网安全、网络访问权限控制、网络流量监控和带宽管理、动态路由、网页内容过滤、邮…

【开源】JAVA+Vue.js实现社区买菜系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

SQL在云计算中的新角色:重新定义数据分析

文章目录 1. 云计算与数据分析的融合2. SQL在云计算中的新角色3. 分布式SQL查询引擎4. SQL-on-Hadoop解决方案5. SQL与其他数据分析工具的集成6. 实时数据分析与SQL7. SQL在云数据仓库中的角色8. 安全性与隐私保护9. SQL的未来展望《SQL数据分析实战&#xff08;第2版&#xff…

【MySQL进阶之路】BufferPool底层设计(中)

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

u8 bit0 :1; “:”位字段的声明(也称为位段)

在C语言中&#xff0c;冒号&#xff08;:&#xff09;用于声明bit字段&#xff0c;也称为位域(Bit-field)。位域允许我们在结构体中对结构成员进行位级的精确操作&#xff0c;主要用于对寄存器和硬件操作进行描述和访问。冒号后面的数字表示该位域的位宽度。 在通信中&#xff…

Airtest实现在手机界面快速批量采集数据

Airtest实现在手机界面快速批量采集数据 一、问题 Airtest使用的poco方法比较慢,寻找差不多一周,看完这篇文章能节省一周时间,希望帮到大家。二、解决思路 使用Airtest图像识别,这样就会速度上提升效率。 三、解决办法 使用页面规律,要找到每条数据的附近规律(一般是图…
最新文章