C语言第二十一弹---指针(五)

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

转移表

 1、转移表

总结


 1、转移表

函数指针数组的用途:转移表

举例:计算器的⼀般实现:

假设我们需要做一个能够进行加减乘除两个数的计算器输入1为加法,2为减法,3为乘法,4为除法,0为退出程序,输入其他值则需要重新输入。

1、根据上述要求我们可知,只有输入0才退出程序,因此需要一个循环来控制输入,而且一定会执行一次程序,所以do while循环在此处比较合适,进入循环的条件就是输入的值,如果不为0则循环,为0则结束循环。

2、知道用do while循环之后,首先我们需要一个界面展示输入数字所对应的功能,因此可以写一个菜单的函数,但是也可以直接输出菜单界面,因为该计算器只会用到一次菜单。

3、输入值进入对应的计算页面。此处可以用switch语句,也可以使用if else语句,建议使用switch语句,因为是在几个情况中进行选择。

4、在switch的子句中设计格式,计算的是两个值,因此可以先输出一句提示,然后在输入两个要进行计算值,最后打印结果。

5、此处还少了进行计算的函数,因此在该代码之前构建相对应计算的函数。

#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;do{//菜单界面printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);//输入选择的值switch (input){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 (input);//循环条件return 0;
}

注:进行相除操作时,除数不能为0,即除号后面的数不能为0,为0则会出错,也可以在相除函数加一个判断。

根据上述代码可知,在switch的选择中,只有算法函数时不一样的,其他都是一样的,我们可不可以封装成一个通用的形式呢?

在上述的计算器程序中我们可以明显看到,switch语句中的操作基本一致,除了函数调用不同,那么我们可不可以将之封装成一个通用函数呢?

此时我们是不是可以用到函数指针数组,将函数指针存放在一个数组里面,根据输入的值来调用函数,但是数组的下标是从0开始的,而我们的输入值是从1开始的,那么可以将该数组第一个元素初始化为0,或者将下标-1。

使用函数指针数组的实现:

  • 函数指针: 一个指向函数的指针。一般用函数名表示。
  • 函数指针数组:元素为函数指针的数组。
 int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表printf( "输⼊操作数:" );scanf( "%d %d", &x, &y);ret = (*p[input])(x, y);  //下标为输入的值printf( "ret = %d\n", ret);int(*p[5])(int x, int y) = { add, sub, mul, div }; //转移表printf( "输⼊操作数:" );scanf( "%d %d", &x, &y);ret = (*p[input-1])(x, y); //下标为输入的值-1printf( "ret = %d\n", ret);

注:

函数指针数组使用要求
1、要求被调用的一系列函数的参数列表和返回值类型均完全一致;

2、要求将所要调用的函数指针放入函数指针数组中(如果函数必须含顺序执行,那么函数指针的存放顺序需要与调用的顺序保持一致);

3、调用时,从数组中取出要执行的函数指针,执行对应的函数即可。

#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;int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表//初始化函数指针数组 do{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;
}

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

TCP和UDP相关问题(重点)(4)——4.使用TCP的协议有哪些?使用UDP的协议有哪些?

4.使用TCP的协议有哪些&#xff1f;使用UDP的协议有哪些&#xff1f; 使用TCP的协议有&#xff1a;HTTP3.0之前的HTTP协议、HTTPS、FTP、SMTP、SSH... 使用UDP的协议有&#xff1a;HTTP3.0、DNS、DHCP...

mybatis-plus使用apply进行字符串拆分后进行包含查询

首先数据库是 PostgreSql&#xff0c;有一个字段要进行模糊查询&#xff0c;我们一般是通过 like 就好了&#xff0c;但是偏偏这个字段是逗号分割的字符串&#xff0c;这个时候如果使用 like 也可以&#xff0c;只有字符串唯一&#xff0c;比如是 uuid 这类&#xff0c;但是啊&…

Java序列化详解

目录 一、什么是序列化 二、什么是反序列化 三、序列化和反序列化的作用 四、序列化和反序列化应用案例 五、常见序列化协议对比 5.1 JDK 自带的序列化方式 5.2 JDK序列化的缺陷 1. 无法跨语言 2. 易被攻击 3. 序列化后的流太大 4. 序列化性能太差 5.3 Kryo 5.4 Pr…

P8772 [蓝桥杯 2022 省 A] 求和--2024蓝桥杯冲刺省一

点击跳转例题 思路&#xff1a;简单数乘法结合律&#xff0c;然后前缀和的模板题&#xff1a; 前缀和的知识&#xff1a; 本题的代码&#xff1a;前缀和知识--模板&#xff1b; #include <bits/stdc.h> #define int long long //(有超时风险) #define PII pair<in…

rust语言tokio库底层原理解析

目录 1 rust版本及tokio版本说明1 tokio简介2 tokio::main2.1 tokio::main使用多线程模式2.2 tokio::main使用单线程模式 3 builder.build()函数3.1 build_threaded_runtime()函数新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图…

输入:123 输出321

给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。若翻转后超出取值范围&#xff0c;则输出0即可输入&#xff1a;123 输出321输入&#xff1a;-123 输出-321 #include <stdio.h> int main(int argc, char const *argv[]) { printf("…

StringBuilder与线程安全之StringBuffer

StringBuilder是Java中的一个类&#xff0c;位于java.lang包下&#xff0c;主要用于在程序中动态构建字符串。与String类相比&#xff0c;StringBuilder提供了一个可变的字符串序列&#xff0c;这意味着你可以在不生成新对象的情况下修改字符串的内容&#xff0c;从而提高了字符…

国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪

最近声学所东海站邹博士发来了他们最新的浅地层剖面仪—MPAS-100相控参量阵浅地层剖面仪的资料&#xff0c;市场型号GeoInsight&#xff0c;委托Ocean Physics Technology公司销售&#xff0c;地大李师兄的公司负责技术支持。 MPAS-100相控参量阵浅地层剖面仪就是俗称的三维浅…

git安装配置

1、下载安装 下载地址 2、配置git用户 git config --global user.name "yw" git config --global user.email "88888qq.com" 3、git init 初始化 4、生成ssh密钥 mkdir .ssh //创建文件夹cd .ssh //进入新建文件夹 ssh-keygen -t rsa // 输入密钥文…

(已解决)什么是vue导航守卫

vue导航守卫是是一种Vue Router内置的功能&#xff0c;它可以让我们在路由切换的过程中执行自定义的代码逻辑。 举一个简单的例子&#xff1a; import Vue from vue; import Router from vue-router;Vue.use(Router);const router new Router({// 路由配置... });// 全局前置…

SQL 注入 - http头注入之UA头注入探测

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、http头注入介绍 HTTP头注入是一种网络安全攻击手段,它利用了Web应用程序对HTTP头的处理不当或缺乏充分的验证和过滤。在这种攻击中,攻击者通过修改HTTP请求头中的某些字段,…

2、卷积和ReLU激活函数

python了解集合网络如何创建具有卷积层的特性。 文章目录 简介特征提取(Feature Extraction)卷积过滤(Filter with Convolution)Weights(权重)激活(Activations)用ReLU检测示例 - 应用卷积和ReLU结论In [1]: import numpy as np from itertools import productdef show_kerne…

Uniapp真机调试:手机端访问电脑端的后端接口解决

Uniapp真机调试&#xff1a;手机端访问电脑端的后端接口解决 1、前置操作 HBuilderX -> 运行 -> 运行到手机或模拟器 -> 运行到Android App基座 少了什么根据提示点击下载即可 使用数据线连接手机和电脑 手机端&#xff1a;打开开发者模式 -> USB调试打开手机端&…

使用 WMI 查询安全软件信息

在这篇文章中&#xff0c;我们将详细介绍如何使用 Windows Management Instrumentation (WMI) API 来查询当前计算机上安装的安全软件的基本信息。我们将分析代码的各个部分&#xff0c;并解释每个步骤所涉及的技术和原理。 一、什么是 WMI&#xff1f; WMI 是 Windows Manag…

Vue安装与配置

写入借鉴网址&#xff1a;好细的Vue安装与配置_vue配置-CSDN博客 下载Vue安装地址&#xff1a; Node.js — Download 查看是否安装成功&#xff1a; node -v npm -v 配置全局模式及缓存 结果通过&#xff1a; C:\Windows\system32>npm install vue -g added 20 packages …

大学生活的“三角平衡”与“合法”偷懒艺术

在那个被称为大学的神奇乐园里&#xff0c;我终于找到了自我&#xff0c;或者说&#xff0c;我找到了一种平衡。这种平衡被我称为“三角平衡”&#xff0c;它是由懒觉、兴趣爱好和学习这三者构成的。在这个平衡中&#xff0c;我像一名杂技演员一样&#xff0c;稳稳地站在三个顶…

C++重新入门-C++ 常量

目录 1.简介 2.整数常量 3.浮点常量 4.布尔常量 5.字符常量 6.字符串常量 7.如何定义常量 7.1 #define 预处理器 7.2const 关键字 1.简介 C 常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据…

jsp商场会员卡管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 商场会员卡管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

python中sort()函数的详细使用方法

目录 使用reverse指定排序顺序 使用key指定排序规则 使用匿名函数制定规则 定义比较函数制定规则 制定多规则 多复杂规则排序 sort()是python非常好用的排序函数&#xff0c;可以对一个列表进行排序&#xff0c;这个排序只是会修改原列表&#xff0c;不会创建新的列表 使…