c语言枚举代替双switch,C语言 使用数组代替switch分支语句降低圈复杂度

#include typedef int(*CALCULATE_FUN)(int, int); //定义函数指针

typedef struct tagStruct

{

CALCULATE_FUN fun_name; //结构体成员,存放函数

char calc_flag; //结构体成员,存放符号

}CALC_STRUCT;

/* 加减乘除函数声明 */

int fun_add(int x, int y);

int fun_sub(int x, int y);

int fun_mul(int x, int y);

int fun_div(int x, int y);

/* 初始化数组 */

CALC_STRUCT fun_array[4] = {{fun_add, '+'},

{fun_sub, '-'},

{fun_mul, '*'},

{fun_div, '/'}};

void method1(int data_a, int data_b, int flag)

{

int ret;

switch (flag)

{

case 1:

{

ret = fun_add(data_a, data_b); //传入函数进行计算

flag = '+'; //获取符号

break;

}

case 2:

{

ret = fun_sub(data_a, data_b);

flag = '-';

break;

}

case 3:

{

ret = fun_mul(data_a, data_b);

flag = '*';

break;

}

case 4:

{

ret = fun_div(data_a, data_b);

flag = '/';

break;

}

default:

{

/* 错误的情况 */

printf("Symbol input error.");

return;

}

}

/* 打印算式 */

printf("%d %c %d = %d\n",data_a, flag, data_b, ret);

return;

}

void method2(int data_a, int data_b, int flag)

{

int ret;

if ((flag < 1) || (flag > 4))

{

/* 错误的情况 */

printf("Symbol input error.");

return;

}

ret = (*fun_array[flag - 1].fun_name)(data_a, data_b); //计算获取结果

flag = fun_array[flag - 1].calc_flag; //获取符号

printf("%d %c %d = %d\n", data_a, flag, data_b, ret); //打印算式

}

void main(void)

{

int flag;

int a = 8;

int b = 4;

/* 总共有4中计算方法,输入1 2 3 4 选择 */

scanf("%d", &flag);

method1(a, b, flag); //实现方法一 高圈复杂度

method2(a, b, flag); //实现方法二 低圈复杂

}

/* 加函数 */

int fun_add(int x, int y)

{

return x + y;

}

/* 减函数 */

int fun_sub(int x, int y)

{

return x - y;

}

/* 乘函数 */

int fun_mul(int x, int y)

{

return x * y;

}

/* 除函数,不带小数 */

int fun_div(int x, int y)

{

return x / y;

}

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

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

相关文章

基础DP(初级版)

本文主要内容为基础DP&#xff0c;内容来源为《算法导论》&#xff0c;总结不易&#xff0c;转载请注明出处。 后续会更新出kuanbin关于基础DP的题目...... 动态规划&#xff1a; 动态规划用于子问题重叠的情况&#xff0c;即不同的子问题具有相同的公共子子问题&#xff0c;在…

《UNIXLinux程序设计教程》一2.1 UNIX 输入输出基本概念

2.1 UNIX 输入输出基本概念 在任何一种操作系统中&#xff0c;程序开始读写一个文件的内容之前&#xff0c;必须首先在程序与文件之间建立连接或通信通道&#xff0c;这一过程称为打开文件。打开一个文件的目的可能是要读其中的数据&#xff0c;也可能是要往其中写入数据&…

python时间计算_日期天数差计算(Python)

描述 从json文件中读取两个时间数据&#xff08;数据格式例如&#xff1a;2019.01.01&#xff0c;数据类型是字符串&#xff09;&#xff0c;并计算结果&#xff0c;打印出两个时间间隔了多少天。 输入/输出描述 输入描述 json文件名称datetime.json&#xff0c;格式如下&#…

c语言编常见算法,5个常见C语言算法

5个常见C语言算法十进制转换为二进制的递归程序字符串逆置的递归程序整数数位反序&#xff0c;例如12345->54321四舍五入程序(考虑正负数)二分法查找的递归函数#include#include#include//十进制转换为二进制的递归程序voidDecimalToBinary(int n){if(n<0){printf("…

利用Kinect将投影变得可直接用手操控

Finally 总算是到了这一天了&#xff01;假期里算法想不出来&#xff0c;或者被BUG折磨得死去活来的时候&#xff0c;总是YY着什么时候能心情愉快地坐在电脑前写一篇项目总结&#xff0c;今天总算是抽出时间来总结一下这神奇的几个月。 现在回过头来看&#xff0c;上学期退出AC…

my-medium.cnf_您的手机如何打开medium.com-我将让门卫和图书管理员解释。

my-medium.cnfby Andrea Zanin由Andrea Zanin 您的手机如何打开medium.com-我将让门卫和图书管理员解释。 (How your phone opens medium.com — I’ll let a doorman and a librarian explain.) Hey did you notice what just happened? You clicked a link, and now here y…

springboot自动配置的原理_SpringBoot自动配置原理

SpringBoot的启动入口就是一个非常简单的run方法&#xff0c;这个run方法会加载一个应用所需要的所有资源和配置&#xff0c;最后启动应用。通过查看run方法的源码&#xff0c;我们发现&#xff0c;run方法首先启动了一个监听器&#xff0c;然后创建了一个应用上下文Configurab…

Django first lesson 环境搭建

pycharm ide集成开发环境 &#xff08;提高开发效率&#xff09; 解释器/编译器编辑器调试环境虚拟机连接 设置VirtualBox端口 操作1 操作2 点击号添加&#xff0c;名称为SSH&#xff0c;其中主机端口为物理机的端口&#xff0c;这里设置为1234&#xff0c;子系统端口为虚拟机的…

《Drupal实战》——3.3 使用Views创建列表

3.3 使用Views创建列表 我们接着讲解Views的设置&#xff0c;首先做一个简单的实例。 3.3.1 添加内容类型“站内公告” 添加一个内容类型“站内公告”&#xff0c;属性配置如表3-1所示。 为该内容类型设置Pathauto的模式news/[node:nid]&#xff0c;并且我们在这里将节点类型…

c语言函数编正切余切运算,浅谈正切函数与余切函数的应用

九年义务教育三年制初级中学“数学”课本中&#xff0c;对正切函数和余切函数的定义是这样下的&#xff1a;在&#xff32;&#xff54;&#xff21;&#xff22;&#xff23;中&#xff0c;∠&#xff23;&#xff1d;&#xff19;&#xff10;&#xff0c;&#xff41;&#…

wget命令下载文件

wget -r -N -l -k http://192.168.99.81:8000/solrhome/ 命令格式&#xff1a; wget [参数列表] [目标软件、网页的网址] -V,–version 显示软件版本号然后退出&#xff1b; -h,–help显示软件帮助信息&#xff1b; -e,–executeCOMMAND 执行一个 “.wgetrc”命令 -o,–output…

idea mybatis generator插件_SpringBoot+MyBatis+Druid整合demo

最近自己写了一个SpringBootMybatis(generator)druid的demo1. mybatisgenerator逆向工程生成代码1. pom文件pom文件添加如下内容&#xff0c;引入generator插件org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 mysql …

vr格式视频价格_如何以100美元的价格打造自己的VR耳机

vr格式视频价格by Maxime Coutte马克西姆库特(Maxime Coutte) 如何以100美元的价格打造自己的VR耳机 (How you can build your own VR headset for $100) My name is Maxime Peroumal. I’m 16 and I built my own VR headset with my best friends, Jonas Ceccon and Gabriel…

python_装饰器

# 装饰器形成的过程 : 最简单的装饰器 有返回值得 有一个参数 万能参数# 装饰器的作用# 原则 &#xff1a;开放封闭原则# 语法糖&#xff1a;装饰函数名# 装饰器的固定模式 import time # time.time() # 获取当前时间 # time.sleep() # 等待 # 装饰带参数的装饰器 def timer…

欧洲的数据中心与美国的数据中心如何区分?

人会想到这意味着&#xff0c;在欧洲和北美的数据中心的设计基本上不会有大的差异。不过&#xff0c;一些小的差异是确实存在的。您可能想知道为什么你需要了解欧洲和北美的数据中心之间的差异&#xff0c;这对你的公司有帮助吗?一个设计团队往往能从另一个设计团队那里学到东…

老农过河

java老农过河问题解决 http://www.52pojie.cn/thread-550328-1-1.html http://bbs.itheima.com/thread-141470-1-1.html http://touch-2011.iteye.com/blog/1104628 转载于:https://www.cnblogs.com/wangjunwei/p/6032602.html

python isalnum函数_探究Python中isalnum()方法的使用

探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符。 语法 以下是isalnum()方法的语法&#xff1a; str.isa1num() 参数 NA 返回值 如果字符串中的所有字符字母数字和至少有一个字符此方法返回 true&#xff0c;否则返回false。 例子 下面的例…

docker快速入门_Docker标签快速入门

docker快速入门by Shubheksha通过Shubheksha Docker标签快速入门 (A quick introduction to Docker tags) If you’ve worked with Docker even for a little while, I bet you’ve come across tags. They often look like “my_image_name:1” where the part after the col…

动态规划算法——最长上升子序列

今天我们要讲的是最长上升子序列&#xff08;LIS&#xff09;。【题目描述】给定N个数&#xff0c;求这N个数的最长上升子序列的长度。【样例输入】      【样例输出】7        42 5 3 4 1 7 6那么什么是最长上升子序列呢&#xff1f; 就是给你一个序列…

如何快速掌握一门新技术/语言/框架

IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话&#xff0c;那么 你的核心竞争力就是IT相关的知识与技能的储备情况。而众所周知&#xff0c;IT行业是一个大量产生新知识的地方&#x…