回调函数实现
计算器的模拟(函数指针数组的使用)(回调函数)
简化
冗余
老的代码的问题就是
冗余
写死
不能完成不同的任务
函数调用的时候只需要知道地址就可以
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();
}