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

news2025/1/17 22:56:07

个人主页(找往期文章):我要学编程(ಥ_ಥ)-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.coloradmin.cn/o/1432349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JupyterLab 更换内核 使用 conda 虚拟环境

未有conda虚拟环境default先创建环境 conda create -n default python3.8 ipykernel已有conda虚拟环境default激活后安装ipykernel conda activate defaultpip install ipykernel将虚拟环境写入 jupyter notebook 的 kernel 中 python -m ipykernel install --user --name 虚…

详解洛谷P2912 [USACO08OCT] Pasture Walking G(牧场行走)(lca模板题)

题目 思路 一道模板题&#xff0c;没啥好说的&#xff0c;直接见代码 代码 #include <bits/stdc.h> using namespace std; int n,q,a,to[100001][22],b,deep[100001],c,t[1000001]; struct ff {int id,len; }; vector<ff> vec[100001]; void dfs(int x,int fa,i…

<设计模式>单例模式懒汉和饿汉

目录 一、单例模式概述 二、懒汉模式和饿汉模式 1.饿汉模式 1.1代码实现 1.2实现细节 1.3模式优劣 2.懒汉模式 2.1代码实现 2.2实现细节 2.3模式优劣 三、多线程下的线程安全问题 1.懒汉和饿汉线程安全问题分析 1.1安全的饿汉模式 1.2不安全的懒汉模式 2.懒汉线程…

牛客周赛 Round 31

D. 思路&#xff1a;使用map构造两个链表。 #include <bits/stdc.h> using namespace std;map<int,int> l,r; int main() {int q;cin>>q;int op-1e9-1;int ed1e91;r[op]ed;l[ed]op;while(q--){int a;cin>>a;if(a1){int x,y;cin>>x>>y;int…

SpringBoot:实例一

一、实现的效果 在浏览器地址栏输入http://localhost:8080/hello&#xff0c;当前页面显示hello world 实例一代码&#xff1a;点击查看LearnSpringBoot01 点击查看更多的SpringBoot教程 二、 效果图 三、 pom.xml代码 <?xml version"1.0" encoding"UTF-…

JS(react)图片压缩+图片上传

上传dome var fileNodeTakeStock: any createRef();<inputref{fileNodeTakeStock}onChange{showPictureTakeStock}style{{ display: "none" }}id"fileInpBtn"type"file"accept"image/*" //限制上传格式multiple{false}capture&qu…

JS 基本语句

函数调用&#xff0c;分支&#xff0c;循环&#xff0c;语句示例。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

20240203在WIN10下安装Anaconda

20240203在WIN10下安装Anaconda 2024/2/3 20:45 缘起&#xff1a;最近学习stable-diffusion-webui.git&#xff0c;在Ubuntu20.04.6下配置SD成功。 不搞精简版本&#xff1a;Miniconda了。直接上Anacoda&#xff01; 百度搜索&#xff1a;Anaconda 下载 https://www.anaconda.c…

Django的web框架Django Rest_Framework精讲(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置&#xff08;1&#xff09;DRF需要以下依赖&#xff08;2&#xff09;创建django项目 4.序列化器的使用&#xff08;1&#xff09;创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…

特种作业题不会怎么搜答案?推荐你使用这六个公众号和工具 #其他#学习方法特种作业题不会怎么搜答案?推荐你使用这六个公众号和工具 #其他#学习方法

作为当代大学生&#xff0c;我们常常面临着繁重的学业压力和众多的学习任务。在这个信息爆炸的时代&#xff0c;如何高效地进行搜题和学习成了我们迫切需要解决的问题。幸运的是&#xff0c;随着科技的不断进步&#xff0c;我们拥有了许多方便、实用的日常搜题和学习软件。 1.…

SpringBoot 过滤器Filter 拦截请求 生命周期

介绍 当用户请求接口时&#xff0c;请求会先到过滤器&#xff0c;在到处理逻辑的接口&#xff0c;在过滤器中可以可以判断用户权限&#xff0c;如&#xff1a;是否登录&#xff0c;或请求前的一些操作&#xff0c;完成一下比较通用的操作&#xff0c;如&#xff1a;前端的AXIO…

GNSS模块的惯导技术:引领定位科技的前沿

全球导航卫星系统&#xff08;GNSS&#xff09;模块的惯导技术是一项颇具前瞻性的科技&#xff0c;它结合了全球定位系统和惯性导航技术&#xff0c;为各个领域的定位需求提供了更为精准和可靠的解决方案。本文将深入探讨GNSS模块的惯导技术&#xff0c;以及它如何在多个领域中…

[word] word页面视图放大后,影响打印吗? #笔记#学习方法

word页面视图放大后&#xff0c;影响打印吗&#xff1f; word文档的页面视图又叫普通视图&#xff0c;又叫打印视图&#xff0c;是系统默认的视图&#xff0c;是用户用的最多最常见的视图。 问&#xff1a;怎样打开页面视图&#xff1f; 答&#xff1a;两种方法 方法一、点…

14:中断

中断 1、中断的引入2、使用单片机外部中断来处理按键2.1、外部中断2.2、参考数据手册中示例代码写程序2.2.1、外部中断0的测试程序2.2.2、完整程序 1、中断的引入 任务&#xff1a;独立数码管循环显示0-9&#xff0c;同时按键控制LED1亮灭。 代码如下&#xff1a; #include …

笔记---求组合数

总&#xff1a; ①10w次询问——1 < b < a < 2000——递推求—— N N N2 ②1w次询问——1 < b < a < 105——公式求—— N l o g N NlogN NlogN ③20次询问——1 < b < a < 1018——Lucas定理 ④1次询问——1 < b < a < 5000——拆分质因子…

ensp实验合集(一)

实验1 双绞线制作...................................................................... - 1 - 实验2 光纤熔接.......................................................................... - 3 - 实验3 eNSP模拟软件使用.........................................…

数据分析:当当网书籍数据可视化分析

当当网书籍数据可视化分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&…

面试经典150题——文本左右对齐(困难)

​"It always seems impossible until it’s done." - Nelson Mandela 1. 题目描述&#xff1a; 这个题目标为困难题目&#xff0c;但是如果我们静下心来把题目读懂了&#xff0c;其实无非就是不同情况下不同考虑而已&#xff0c;也没什么思维上的复杂&#xff0c;还…

Ainx框架实现 一

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

对话 Zeitgeist|巧借波卡生态优势,开启去中心化预测市场新篇章

在纷繁芜杂的信息世界里&#xff0c;真相和事实往往是稀缺品&#xff0c;利用预测市场的激励方式往往能够带领我们前瞻未来发展的趋势&#xff0c;走向获得真理和进步的 Web3 新世界。—— Zeitgeist 团队 试想下&#xff0c;如果有一天&#xff0c;你可以自由地在感兴趣的行业…