转移表回调函数实现

回调函数实现

计算器的模拟(函数指针数组的使用)(回调函数)

简化

冗余

老的代码的问题就是

冗余

写死

不能完成不同的任务

函数调用的时候只需要知道地址就可以

calc计算器

这里也称之为转移表

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x, int y)
{return x + y;
}
int subtract(int x, int y)
{return x - y;
}
int multiply(int x, int y)
{return x * y;
}
int except(int x, int y)
{return x / y;
}
void meun()
{printf("**************************\n");printf("*****    0  退出    ******\n");printf("*****    1  加法    ******\n");printf("*****    2  减法    ******\n");printf("*****    3  乘法    ******\n");printf("*****    4  除法    ******\n");printf("**************************\n");
}
void cala(int* compute(int, int))
{int x = 0; int y = 0;int pf = 0;scanf("%d %d", &x, &y);pf = compute(x, y);printf("%d ", pf);
}
int main()
{meun();int input = 0;scanf("%d", &input);	switch (input){case 0:break;case 1:cala(add);break;case 2:cala(subtract);break;case 3:cala(subtract);break;case 4:cala(except);break;default:break;}
}这里 用ai 逐行解释一下 我不过多作图解释了:
1. `#define _CRT_SECURE_NO_WARNINGS 1`:这是一个预处理器指令,用于告诉编译器忽略与安全相关的警告
2. `#include<stdio.h>`:这是一个预处理器指令,用于包含标准输入输出头文件`stdio.h`,这是C语言中用于输入输出函数的基础头文件。
3. `int add(int x, int y)`:这是一个函数定义,`add`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的和。
4. `int subtract(int x, int y)`:这是另一个函数定义,`subtract`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的差。
5. `int multiply(int x, int y)`:这是另一个函数定义,`multiply`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的积。
6. `int except(int x, int y)`:这是另一个函数定义,`except`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的商。注意,这个函数没有进行除数是否为0的检查,这在实际使用中是不安全的。
7. `void meun()`:这是一个函数定义,`meun`是一个函数名,它没有返回值。这个函数的作用是打印出菜单供用户选择运算类型。
8. `void cala(int* compute(int, int))`:这是另一个函数定义,`cala`是一个函数名,它接受一个指向函数的指针作为参数。这个函数的作用是调用用户提供的运算函数,并打印出结果。
9. `int main()`:这是主函数的定义,`main`是一个特殊的关键字,表示程序的入口点。
10. `meun();`:这行代码调用`meun`函数,打印出菜单。
11. `int input = 0;`:这行代码定义了一个整数变量`input`并初始化为0,用于存储用户的选择。
12. `scanf("%d", &input);`:这行代码使用`scanf`函数从用户那里读取一个整数,并存储在变量`input`中。
13. `switch (input)`:这是一个`switch`语句,它根据变量`input`的值来执行不同的代码块。
14. `case 0:`:这是一个`case`标签,当`input`等于0时,执行后面的代码块。
15. `break;`:这个关键字用于退出`switch`语句。
16. `case 1:`:这是一个`case`标签,当`input`等于1时,执行后面的代码块。
17. `cala(add);`:这行代码调用`cala`函数,并传递`add`函数的地址作为参数。
18. `break;`:这个关键字用于退出`switch`语句。
19. `case 2:`:这是一个`case`标签,当`input`等于2时,执行后面的代码块。
20. `cala(subtract);`:这行代码调用`cala`函数,并传递`subtract`函数的地址作为参数。
21. `break;`:这个关键字用于退出`switch`语句。
22. `case 3:`:这是一个`case`标签,当`input`等于3时,执行后面的代码块。
23. `cala(subtract);`:这行代码调用`cala`函数,并传递`subtract`函数的地址作为参数。这里似乎是一个错误,因为`subtract`函数并不适合乘法操作。
24. `break;`:这个关键字用于退出`switch`语句。
25. `case 4:`:这是一个`case`标签,当`input`等于4时,执行后面的代码块。
26. `cala(except);`:这行代码调用`cala`函数,并传递`except`函数的地址作为参数。
27. `break;`:

 ———————————————————————————————————————————————————————————————————————————————————— 

函数指针数组实现

计算机代码的简化

创建函数指针的数组

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x, int y)
{return x + y;
}
int subtract(int x, int y)
{return x - y;
}
int multiply(int x, int y)
{return x * y;
}
int except(int x, int y)
{return x / y;
}
void meun()
{printf("**************************\n");printf("*****    0  退出    ******\n");printf("*****    1  加法    ******\n");printf("*****    2  减法    ******\n");printf("*****    3  乘法    ******\n");printf("*****    4  除法    ******\n");printf("**************************\n");
}
int main()
{int (*compute[5])(int, int) = { 0, add,subtract,multiply,except };int input = 0; do{meun();printf("请选择:\n");scanf("%d", &input);printf("请输入:");if (input>=1&& input<=4){int x = 0; int y = 0; int zd = 0;scanf("%d %d", &x, &y);zd = (*compute[input])(x, y);printf("%d\n", zd);}else if (input == 0){printf("退出程序。");break;}else {printf("输入错误。");}} while (input);
}这里 用ai 逐行解释一下 我不过多作图解释了:
这段代码是C语言编写的一个简单计算器程序,下面是逐行解释:
1. `#define _CRT_SECURE_NO_WARNINGS 1`:这是一个预处理器指令,用于告诉编译器忽略与安全相关的警告,特别是在使用像`fgets`、`fopen`等函数时。这行代码应该只包含一次,重复定义可能会导致编译错误。
2. `#include<stdio.h>`:这是一个预处理器指令,用于包含标准输入输出头文件`stdio.h`,这是C语言中用于输入输出函数的基础头文件。
3. `int add(int x, int y)`:这是一个函数定义,`add`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的和。
4. `int subtract(int x, int y)`:这是另一个函数定义,`subtract`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的差。
5. `int multiply(int x, int y)`:这是另一个函数定义,`multiply`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的积。
6. `int except(int x, int y)`:这是另一个函数定义,`except`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的商。注意,这个函数没有进行除数是否为0的检查,这在实际使用中是不安全的。
7. `void meun()`:这是一个函数定义,`meun`是一个函数名,它没有返回值。这个函数的作用是打印出菜单供用户选择运算类型。
8. `int main()`:这是主函数的定义,`main`是一个特殊的关键字,表示程序的入口点。
9. `int (*compute[5])(int, int) = { 0, add,subtract,multiply,except }`:这行代码定义了一个函数指针数组`compute`,长度为5。每个元素指向一个算术运算函数。数组的第一个元素被初始化为`0`,这通常用于指针数组的终止标志。
10. `int input = 0;`:这行代码定义了一个整数变量`input`并初始化为0,用于存储用户的选择。
11. `do`:这是一个循环开始关键字,表示开始一个`do-while`循环。
12. `meun();`:这行代码调用`meun`函数,打印出菜单。
13. `printf("请选择:\n");`:这行代码打印出提示信息“请选择:”。
14. `scanf("%d", &input);`:这行代码使用`scanf`函数从用户那里读取一个整数,并存储在变量`input`中。
15. `printf("请输入:");`:这行代码打印出提示信息“请输入:”。
16. `if (input>=1&& input<=4)`:这是一个条件判断,检查用户输入是否在1到4之间,包括1和4。
17. `{ int x = 0; int y = 0; int zd = 0;`:这个大括号开始了一个代码块,用于执行当用户输入在1到4之间时的操作。
18. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
19. `zd = (*compute[input])(x, y);`:这行代码调用相应的运算函数,并将结果存储在变量`zd`中。
20. `printf("%d\n", zd);`:这行代码打印出计算结果。
21. `}`:这个大括号结束了上面的代码块。
22. `else if (input == 0)`:这是另一个条件判断,检查用户输入是否为0。
23. `{ printf("退出程序。");`:这个代码块用于执行当用户输入为0时的操作,打印出提示信息。
24. `break;`:这个关键字用于退出循环。
25. `}`:这个大括号结束了上面的条件判断。
26. `else`:这是另一个条件判断,用于处理用户输入不在1到4之间

 ———————————————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————————————————

正常实现

运算函数 

主函数 

计算器形成

但是之前的代码是有问题的,冗余性太强

#include<stdio.h>// 函数原型声明
int add(int x, int y);
int subtract(int x, int y);
int multiply(int x, int y);
int divide(int x, int y);int main() {int input;printf("请输入运算类型(1-加法,2-减法,3-乘法,4-除法,0-退出):");scanf("%d", &input);while (input != 0) {switch (input) {case 1:printf("请输入两个加数:");int x, y;scanf("%d %d", &x, &y);printf("%d\n", add(x, y));break;case 2:printf("请输入两个减数:");scanf("%d %d", &x, &y);printf("%d\n", subtract(x, y));break;case 3:printf("请输入两个乘数:");scanf("%d %d", &x, &y);printf("%d\n", multiply(x, y));break;case 4:printf("请输入两个数,其中第二个数为除数:");scanf("%d %d", &x, &y);if (y != 0) {printf("%d\n", divide(x, y));} else {printf("除数不能为0。\n");}break;default:printf("输入错误,请输入正确的运算类型。\n");break;}printf("是否继续?(0-否,其他值-是):");scanf("%d", &input);}printf("退出计算器。\n");return 0;
}// 函数定义
int add(int x, int y) {return x + y;
}int subtract(int x, int y) {return x - y;
}int multiply(int x, int y) {return x * y;
}int divide(int x, int y) {return x / y;
}这里ai解释一下 不过多赘述 
这次计算机的目的是为了进行回调函数和函数指针数组的学习这段C语言代码实现了一个简单的计算器,能够进行加法、减法、乘法和除法运算。下面是逐行解释:
1. `#include<stdio.h>`:这行代码包含了标准输入输出头文件`stdio.h`,它是C语言中用于输入输出函数的基础头文件。
2. 函数原型声明:这些是函数原型声明,指明了将要定义的四个函数`add`、`subtract`、`multiply`和`divide`的返回类型和参数类型。
3. `int main()`:这是主函数的定义,`main`是C程序的入口点。
4. `int input;`:这行代码定义了一个整数变量`input`,用于存储用户的选择。
5. `printf("请输入运算类型(1-加法,2-减法,3-乘法,4-除法,0-退出):");`:这行代码打印出提示信息,要求用户输入运算类型。
6. `scanf("%d", &input);`:这行代码使用`scanf`函数从用户那里读取一个整数,并存储在变量`input`中。
7. `while (input != 0) {`:这是一个`while`循环,它会在用户输入0之前一直执行。
8. `switch (input)`:这是一个`switch`语句,它根据变量`input`的值来执行不同的代码块。
9. `case 1:`:这是一个`case`标签,当`input`等于1时,执行后面的代码块。
10. `printf("请输入两个加数:");`:这行代码打印出提示信息,要求用户输入两个加数。
11. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
12. `printf("%d\n", add(x, y));`:这行代码调用`add`函数,并打印出返回的结果。
13. `break;`:这个关键字用于退出`switch`语句。
14. `case 2:`:这是一个`case`标签,当`input`等于2时,执行后面的代码块。
15. `printf("请输入两个减数:");`:这行代码打印出提示信息,要求用户输入两个减数。
16. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
17. `printf("%d\n", subtract(x, y));`:这行代码调用`subtract`函数,并打印出返回的结果。
18. `break;`:这个关键字用于退出`switch`语句。
19. `case 3:`:这是一个`case`标签,当`input`等于3时,执行后面的代码块。
20. `printf("请输入两个乘数:");`:这行代码打印出提示信息,要求用户输入两个乘数。
21. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
22. `printf("%d\n", multiply(x, y));`:这行代码调用`multiply`函数,并打印出返回的结果。
23. `break;`:这个关键字用于退出`switch`语句。
24. `case 4:`:这是一个`case`标签,当`input`等于4时,执行后面的代码块。
25. `printf("请输入两个数,其中第二个数为除数:");`:这行代码打印出提示信息,要求用户输入两个数,其中第二个数为除数。
26. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
27. `if (y != 0) {`:这是一个`if`语句,它检查除数`y`是否不为0。
28. `printf("%d\n", divide(x, y));`:这行代码调用`

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

 三种转移表实现代码的总结

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//菜单
void meun()
{printf("**************************\n");printf("*****    0  退出    ******\n");printf("*****    1  加法    ******\n");printf("*****    2  减法    ******\n");printf("*****    3  乘法    ******\n");printf("*****    4  除法    ******\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 dive(int x, int y) 
{return x / y;
}//函数指针数组的使用
void Function_pointers()
{int(*compute[5])(int, int) = { 0,add,sub,mul,dive };int input = 0; int x = 0; int y = 0;do{if (input > 0 && input <= 4){meun();printf("请输入>\n");scanf("%d", &input);printf("请输入计算数值>\n");scanf("%d %d", &x, &y);int outcome = (*compute[input])(x, y);printf("结果是:%d\n", outcome);}else if (input == 0){printf("退出");break;}else{printf("输入错误。");}} while (input);
}//回调函数的使用
void invoke(int*ps(int, int))
{int x = 0; int y = 0;printf("请输入计算数值>\n");scanf("%d %d", &x, &y);int outcome = (*ps)(x, y);printf("结果是:%d\n", outcome);}
void Callback()
{int input = 0;do{meun();printf("请输入>\n");scanf("%d", &input);switch (input){case 0:break;case 1:invoke(add);break;case 2:invoke(sub);break;case 3:invoke(mul);break;case 4:invoke(dive);break;default:printf("输入错误。");break;}} while (input);
}
//正常计算函数
void count()
{int input = 0;do{int x = 0; int y = 0;meun();printf("请输入>\n");scanf("%d", &input);int outcomt = 0;switch (input){case 0:printf("退出");break;case 1:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = add(x, y);printf("结果是:%d\n", outcomt);break;case 2:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = sub(x, y);printf("结果是:%d\n", outcomt);break;case 3:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = mul(x, y);printf("结果是:%d\n", outcomt);break;case 4:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = dive(x, y);printf("结果是:%d\n", outcomt);break;default:printf("输入错误。");break;}} while (input);
}//主函数
int main()
{//printf("函数指针数组的使用>\n");//Function_pointers();//printf("回调函数的使用>\n");//Callback();printf("正常函数的使用>\n");count();
}

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

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

相关文章

基于鹦鹉优化算法(Parrot optimizer,PO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

Cisco Packet Tracer 模拟器实现一些交换机的基本配置

1. 内容 应用Cisco Packet Tracer 5.3搭建网络 应用Cisco Packet Tracer 5.3配置网络 通过不同的命令实现交换机的基本配置&#xff0c;包括交换机的各种配置模式、交换机的基本配置、交换机的端口配置。 2. 过程 2.1 打开软件 安装模拟器后打开如下&#xff1a; 图1 安装并…

Intel® Extension for PyTorch*详细安装教程

最近在研究Intel的pytorch的加速拓展Intel Extension for PyTorch*,但是发现官网的文档全是英文的&#xff0c;不太好找安装教程。所以特此分享Intel Extension for PyTorch*的详细安装教程。 文章目录 一、安装所需系统要求1.1 硬件需求1.2 软件需求 二、准备2.1 安装驱动程序…

基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

基于pytorch的视觉变换器-Vision Transformer(ViT)的介绍与应用

近年来&#xff0c;计算机视觉领域因变换器模型的出现而发生了革命性变化。最初为自然语言处理任务设计的变换器&#xff0c;在捕捉视觉数据的空间依赖性方面也显示出了惊人的能力。视觉变换器&#xff08;Vision Transformer&#xff0c;简称ViT&#xff09;就是这种变革的一个…

后量子时代,未来密码该何去何从?

古有飞鸽&#xff0c;现有网络&#xff0c;在知识经济为基础的信息化社会中&#xff0c;保障网络信息安全无疑成为成为国与国之间无形的较量。小到个人通讯&#xff0c;大到机要信息传输&#xff0c;信息安全对于国家安全和经济活动正常运转至关重要。密码学作为保障网络与信息…

iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护

iOS17.4这两天已经正式发布&#xff0c; 在iOS 17.4版本中新增了一个名为"失窃设备保护"的功能&#xff0c;并提供了一个"需要安全延迟"的选项。 iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护 当用户选择启用…

WPF(1)的MVVM的数据驱动学习示例

MVVM Model:数据模型、View 界面、ViewModel 业务逻辑处理 项目结构 界面数据绑定 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/x…

[Spark SQL]Spark SQL读取Kudu,写入Hive

SparkUnit Function&#xff1a;用于获取Spark Session package com.example.unitlimport org.apache.spark.sql.SparkSessionobject SparkUnit {def getLocal(appName: String): SparkSession {SparkSession.builder().appName(appName).master("local[*]").getO…

springcloud-alibaba Sentinel入门

Releases alibaba/Sentinel GitHubSentinel下载官方 在cmd 里面运行 启动命令 java -jar sentinel-dashboard-1.8.6.jar 启动成功前提 java环境 &#xff0c;已经注册到服务注册中心&#xff0c;8080端口没有被占用 启动后访问地址为 qhttp://localhost:8080http://lo…

AI入门笔记(四)

深度学习是人工智能的一种实现方法。本文我将学习到的关于深度学习的代表卷积神经网络的数学结构分享给大家。 深度学习是重叠了很多层的隐藏层&#xff08;中间层&#xff09;的神经网络。我们以一个例题为例。 建立一个卷积神经网络&#xff0c;用来识别通过 66 像素的图像读…

系统并发性能指标与测试工具介绍

目录 一、性能指标介绍 1.1 并发用户数 1.2 TPS(每秒事务数) 1.3 QPS&#xff08;每秒查询率&#xff09; 1.4 TPS与QPS的区别与关系 1.4.1 区别 1.4.2 关系 1.5 响应时间&#xff08;RT&#xff09; 二、指标评估 2.1 背景 2.2 获取性能指标 2.3 性能指标计算/统计…

Python 创建PPT

本篇为如何使用Python来创建ppt文件。 创建PPT 安装必要的库 命令如下&#xff1a; pip install python-pptx 安装过程&#xff1a; 创建ppt文件 在当前目录下创建一个test的ppt文件。其中包含两页&#xff0c;分别使用了不同的布局。 第一页设置了标题和内容。第二页只设…

C++变参模板

从c11开始&#xff0c;模板可以接受一组数量可变的参数&#xff0c;这种技术称为变参模板。 变参模板 下面一个例子&#xff0c;通过变参模板打印一组数量和类型都不确定的参数。 #include <iostream> #include <string>void print(void) {std::cout<<&quo…

计算机网络 —— 运输层

运输层 5.1 运输层概述 运输层的主要任务是&#xff0c;如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。 根据应用需求的不同&#xff0c;因特网的运输层为应用层提供了两种不同的运输协议&#xff0c;即面向连接的TCP和无连接的UDP 5.2…

Chrome中如何导出和导入书签

导出书签 如下图所示&#xff1a; 右上角三点->书签和清单->书签管理器->右上角三点->导出书签 然后你选择保存地址即可。打开后如下&#xff1a; 导入书签 如下图所示&#xff1a; 右上角三点->书签和清单->导入书签和设置->选择以前导出的书签&…

0103n阶行列式-行列式-线性代数

文章目录 一 n阶行列式二 三阶行列式三 特殊行列式结语 一 n阶行列式 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots…

【大厂AI课学习笔记NO.68】开源和开源发展情况

开源即源代码公开&#xff0c;任何人能获取源代码&#xff0c;查看、修改、分发他们认为合适的代码。 依托同行评审和社区生成&#xff0c;旨在以分散、协作的方式开发。 我们曾经很详细的讨论过开源协议的问题&#xff0c;详细可以参考我的文章&#xff1a; https://giszz.…

政安晨:【深度学习处理实践】(五)—— 初识RNN-循环神经网络

RNN&#xff08;循环神经网络&#xff09;是一种在深度学习中常用的神经网络结构&#xff0c;用于处理序列数据。与传统的前馈神经网络不同&#xff0c;RNN通过引入循环连接在网络中保留了历史信息。 RNN中的每个神经元都有一个隐藏状态&#xff0c;它会根据当前输入和前一个时…

Linux(Ubuntu)中安装vscode

①首先去vscode的官网下载.deb文件 网址&#xff1a;https://code.visualstudio.com/docs/?dvlinuxarm64_deb 注&#xff1a;如果linux端无法打开网页下载文件&#xff0c;可以在Windows端下载好用WinSCP传输到Linux。下载前注意下你的系统架构是arm还是amd&#xff0c;系统…