对与上一节,我们对指针函数已经有了深刻意识了;练一练吧
如果还没有学习到,也是没有关系的,可以看一看这一篇
C语言详解指针-CSDN博客https://blog.csdn.net/Asuku_/article/details/137690083希望能提高你对指针的理解
计算器的实现(switch)
对于一个计算器,需要有最基础的(加减乘除),来人,上代码:
这时候有人就会觉得这个代码有点冗长,说:小伞,小伞有没有办法,能将代码变得便洁吗?
那当然是有的呀!
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>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 a = 0;int x, y;int ret;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("请选择:");scanf("%d", &a);switch (a){case 1:printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = add(x, y);printf("ret = %d\n", ret);break;case 2:printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = sub(x, y);printf("ret = %d\n", ret);break;case 3:printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = mul(x, y);printf("ret = %d\n", ret);break;case 4:printf("输⼊操作数:");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 (a);return 0;
}
如果我们使用switch语句来实现这样一个简易的计算器我们会发现,每当我要添加一个功能的时候。都需要增加一个case语句,比如我要增加一个&运算,我得再加上一个case语句。因此我们可以使用函数指针数组(转移表)来实现,会简易很多。
什么是转移表?
其实很简单,它所指的就是运用函数指针数组以数组方式去调用里面的函数,从而在某些情况下替代冗长的switch函数,就叫转移表。
单纯的文字说明实在有些单调,这里通过模拟实现计算器来进一步解释说明转移表。
上代码:
#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input = 1;int ret = 0;//p[]={add,sub,mul,div}//这里我们想要将函数的地址存进来//int(*p[])(int,int)//返回类型 函数指针 指向函数的参数int(*p[5])(int , int )= { 0, add, sub, mul, div }; //转移表//函数指针的数组 下标 0 1 2 3 4do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);if ((input <= 4 && input >= 1)){printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = (*p[input])(x, y); //printf("ret = %d\n", ret);}else if (input == 0){printf("退出计算器\n");}else{printf("输⼊有误\n");}} while (input);return 0;
}
这样我们就实现了便洁的计算器代码了,点个赞走吧