C语言运用函数指针数组实现计算器功能
作者:久留不见i 发布时间:2023-10-01 18:45:25
本文实例为大家分享了C语言运用函数指针数组制作计算器的具体代码,供大家参考,具体内容如下
先来回顾一下概念:
指针数组 —— 存放指针的数组
函数指针 —— 存放函数地址的指针
函数指针数组 —— 存放函数指针的数组
接下来说说这次要制作的计算器的功能:
1.add —— 加法
2.sub —— 减法
3.mul —— 乘法
4.div —— 除法
0.exit —— 退出
具体来通过代码讲解:
(1)首先写一个菜单程序,在运行程序时首先打印一次菜单。
void menu()
{
printf("*************************\n");
printf("******* 1.add *******\n");
printf("******* 2.sub *******\n");
printf("******* 3.mul *******\n");
printf("******* 4.div *******\n");
printf("******* 0.exit *******\n");
printf("*************************\n");
}
(2)写好四个关于加、减、乘、除操作的函数。
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;
}
(3)写主函数,定义input是你要输入的数,用来选择功能;定义x和y是你要输入两个的操作数;接着在主程序中调用菜单函数menu()。
int main()
{
int x = 0;
int y = 0;
int input = 0;
menu();
}
(4)使用do while循环,以及if else语句,建立规则,如果输入的input是0的话就退出循环,while(input)代表input非零的时候会继续循环;如果input在1~4之间则对应计算器菜单上的功能,这时你需要输入两个数字;如果超出这个范围则重新循环。
int main()
{
int x = 0;
int y = 0;
int input = 0;
menu();
do{
printf("请选择你要进行的操作:\n");
scanf("%d", &input);
if (input == 0) {
printf("退出计算器!\n");
}
else if (input >= 1 && input <= 4)
{
printf("请输入两个数字:\n");
scanf("%d %d", &x, &y);
}
else {
printf("选择错误!\n");
}
} while (input);
return 0;
}
(5)接下来在主函数中定义一个函数指针数组,int (*pfarr[5])(int,int) = { 0,Add,Sub,Mul,Div }; 代表名为pfarr的函数指针数组有存放了5个指向函数的指针,分别是0,Add,Sub,Mul,Div;之所以增加0为数组的首元素,是为了数组元素下标与菜单相对应。
int main()
{
int x = 0;
int y = 0;
int input = 0;
menu();
int (*pfarr[5])(int,int) = { 0,Add,Sub,Mul,Div };
do{
printf("请选择你要进行的操作:\n");
scanf("%d", &input);
if (input == 0) {
printf("退出计算器!\n");
}
else if (input >= 1 && input <= 4)
{
printf("请输入两个数字:\n");
scanf("%d %d", &x, &y);
}
else {
printf("选择错误!\n");
}
} while (input);
return 0;
}
(6)最后我们定义ret用来接收函数的返回值也就是运算结果,并打印;调用的时候直接调用函数指针数组中的input位,就是在调用相应的函数地址,并使用该函数;调用完成后打印ret。
int main()
{
int x = 0;
int y = 0;
int ret = 0;
int input = 0;
menu();
int (*pfarr[5])(int,int) = { 0,Add,Sub,Mul,Div };
do{
printf("请选择你要进行的操作:\n");
scanf("%d", &input);
if (input == 0) {
printf("退出计算器!\n");
}
else if (input >= 1 && input <= 4)
{
printf("请输入两个数字:\n");
scanf("%d %d", &x, &y);
ret = pfarr[input](x,y);
printf("ret = %d\n", ret);
}
else {
printf("选择错误!\n");
}
} while (input);
return 0;
}
到这里就全部讲解完成,喜欢的话点个赞再走吧~
全部代码在这里:
#include <stdio.h>
void menu()
{
printf("*************************\n");
printf("******* 1.add *******\n");
printf("******* 2.sub *******\n");
printf("******* 3.mul *******\n");
printf("******* 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 x = 0;
int y = 0;
int ret = 0;
int input = 0;
menu();
int (*pfarr[5])(int,int) = { 0,Add,Sub,Mul,Div };
do{
printf("请选择你要进行的操作:\n");
scanf("%d", &input);
if (input == 0) {
printf("退出计算器!\n");
}
else if (input >= 1 && input <= 4)
{
printf("请输入两个数字:\n");
scanf("%d %d", &x, &y);
ret = pfarr[input](x,y);
printf("ret = %d\n", ret);
}
else {
printf("选择错误!\n");
}
} while (input);
return 0;
}
来源:https://blog.csdn.net/m0_59063052/article/details/120206229


猜你喜欢
- 本文实例为大家分享了java实现登录验证码功能的具体代码,供大家参考,具体内容如下登录验证码登录验证是大多数登录系统都会用到的一个功能,它的
- 这篇文章主要介绍了Spring 自动装配的二义性实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 本文实例为大家分享了C++实现简单酒店管理系统的具体代码,供大家参考,具体内容如下酒店管理系统设计报告一、 需求分析题目要求如下:某酒店有客
- 上篇博客我们了解了请求参数的获取,那么获取到请求参数之后,需要对参数进行出来,然后进行数据响应。那么这篇博客我们就来了解 Controlle
- 从Java 5开始,Java语言对方法参数支持一种新写法,叫 可变长度参数列表,其语法就是类型后跟...,表示此处接受的参数为0到多个Obj
- SpringBoot-JPA删除不成功,只执行了查询语句今天使用JPA自定义了一个删除方法deleteByUserIdAndCommentI
- Java关于Map的四种取值方式map的主要作用是什么?可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数
- 在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。l
- 这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平台Bmob,那Bmob是什么呢?Bmob可以开发一个云存储的移动应
- 前言使用SpringBoot来开发项目相对于传统模式,要快速优雅许多,相信目前国内绝大部分web项目的开发还没有使用SpringBoot来做
- 实现Callable的对象中,用@Autowired注入别的对象失败场景是这样:我需要在一个实现类A中写一个拿到返回值的多线程,于是用的Ca
- 废话不多说,先给大家贴代码,具体代码如下所示:import net.sf.json.JSONArray; import net.sf.jso
- 本文实例讲述了C#实现将应用程序设置为开机启动的方法。分享给大家供大家参考。具体如下:private void WriteRegistry(
- 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节
- 多播委托简介每一个委托都是继承自MulticastDelegate,也就是每个都是多播委托。带返回值的多播委托只返回最后一个方法的值多播委托
- 下面是一些我找到Android的ADB有用的命令。可以手动或使用自动构建和测试过程。查看设备adb devices如果多个设备连接则使用 u
- Springboot的项目搭建在此省略,pom文件依赖什么的就不说了创建一个实体类@Data@EqualsAndHashCode(callS
- 一.递归方法1.递归就是自己调用本身的方法,前提是有方法。2.递归使用找出递归的规律递归要有出口条件,也就是结束条件3.注意事项递归次数不能
- 这里简单介绍了一些常用的属性,以及一些术语的解释和举例说明,不太全面,希望读者多多补充。1.重载:函数名相同,参数的个数或参数类型不同; p
- 需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启、程序升