转移表实例----袖珍版计算器

简介: 转移表实例----袖珍版计算器

按照之前写过的扫雷和三子棋的框架,我们首先写一个框架

int main()
{
  int input = 0;
  int x = 0;
  int y = 0;
  int ret = 0;
  do
  {
    menu();//调用菜单函数
    printf("请输入要进行的操作:>\n");
    scanf("%d", &input);//输入选择功能
    switch (input)
    {
    case 1://加法
      printf("请输入两个操作数:>\n");
      scanf("%d%d", &x, &y);
      ret = add(x, y);
      printf("结果是%d\n", ret);
      break;
    case 2:减法
      printf("请输入两个操作数:>\n");
      scanf("%d%d", &x, &y);
      ret = sub(x, y);
      printf("结果是%d\n", ret);
      break;
    case 3:乘法
      printf("请输入两个操作数:>\n");
      scanf("%d%d", &x, &y);
      ret = mul(x, y);
      printf("结果是%d\n", ret);
      break;
    case 4://除法
      printf("请输入两个操作数:>\n");
      scanf("%d%d", &x, &y);
      ret = div(x, y);
      printf("结果是%d\n", ret);
      break;
    case 0://退出
      printf("退出计算器\n");
      break;
    default://输入错误
      printf("输入错误,请重新输入\n");
    }
  } while (input);
  return 0;
}


加减乘除的函数实现在此就不过多赘述。观察上面的代码我们可以看出用switch语句会造成代码冗余很多,而且后期如果要加入新的功能,就只能在case语句后面再加入,使代码量巨大,形成“屎山”,对后期维护极度不友好。所以我们可以对代码框架进行更改。


观察上面的函数可以发现,加减乘除函数的返回值、参数都是相同的,那么如果用函数指针表示,然后把函数指针存在一个数组中,通过输入的值(input)调用,会使整个代码框架优化很多。  

59d899fb235447d498c1dee961ff9c61.png

更改为转移表的框架以后,整个代码中没有冗余的部分了,而且后期如果想要增加功能,只需要增加该功能函数,然后在函数指针数组中增加元素就可以实现。大大增加了程序的可维护性。


最后,附上整个项目代码

#include<stdio.h>
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("请输入要进行的操作:>\n");
    scanf("%d", &input);//输入选择功能
    if (input > 0 && input <= 4)
    {
      printf("请输入两个操作数:>\n");
      scanf("%d%d", &x, &y);
      int (*pf[5])(int, int) = { 0,add,sub,mul,div };//定义函数指针数组
      ret = pf[input](x, y);//通过input的值调用函数
      printf("结果是%d\n", ret);
    }
    else if (input == 0)
    {
      printf("退出\n");
      break;
    }
    else
    {
      printf("输入错误,请重新输入\n");
    }
  } while (input);
  return 0;
}


相关文章
|
19天前
|
存储 C语言 索引
函数指针数组在实现转移表时的应用:以计算器为例
函数指针数组在实现转移表时的应用:以计算器为例
33 0
|
19天前
|
小程序
利用函数指针数组写计算器(转移表)
利用函数指针数组写计算器(转移表)
28 1
|
19天前
|
SQL Java 数据库
dts在数据迁移过程中,出现“无效的表或视图名”错误
dts在数据迁移过程中,如果出现“无效的表或视图名”错误
149 6
|
6月前
|
SQL 关系型数据库 Java
使用位运算,处理数据库中的"多选状态标识"
使用位运算,处理数据库中的"多选状态标识"
68 0
|
7月前
简单计算器的实现(含转移表实现)
简单计算器的实现(含转移表实现)
24 0
|
10月前
|
数据库
数据库----函数
数据库----函数
|
11月前
|
安全 数据库
学生信息管理系统------附加数据库出错,请单机消息列中的超链接
学生信息管理系统------附加数据库出错,请单机消息列中的超链接
101 0
|
11月前
|
存储 监控 NoSQL
PG明明业务进行的是SELECT,为什么监控磁盘,写负载那么大呢?
PG明明业务进行的是SELECT,为什么监控磁盘,写负载那么大呢?
69 1
|
数据库
LeetCode(数据库)- 找到遗失的ID
LeetCode(数据库)- 找到遗失的ID
85 0