计算器简单运行(函数指针数组c语言)

计算器的简单运行(函数指针)
【1.退出函数exit的用法exit(1)
2.五秒倒计时
3.指针数组里存字符串,都在字符常量区
4.函数指针数组的用法
(函数名,&函数名都代表函数的地址】

#include<stdio.h>
#include<windows.h>
#pragma warning (disable:4996)
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)
{
 if (!y)
 {
  printf("div zero!\n");
  return -1;
 }
 else{
  return x / y;
 }
}
int mod(int x, int y)
{
 if (!y)
 {
  printf("mod zero!\n");
  return -1;
 }
 else{
  return x % y;
 }
}
void Menu()
{
 printf("##########################\n");
 printf("##  1.Add         2.Sub ##\n");
 printf("##  3.Mul         4.Div ##\n");
 printf("##  5.Mod         0.exit##\n");
 printf("##########################\n");
 printf("Please Enter>>>");
}

int quit(int x, int y)
{
 printf("Exit done\n");
 int i = 5;//五秒倒计时
 while (i)
 {
  printf("quie second.....%d\r", i--);//\r回车
  Sleep(1000);
 }
 exit(1);
}



int main()
{
 int select;
 const char *op = " +-*/%";
 int(*p[6])(int, int) = { quit, add, sub, mul, _div, mod };//函数指针数组
 for (;;)
 {
  Menu();
  scanf("%d", &select);
  if (select >= 0 && select <= 5)
  {
   if (select == 0)
   {
    p[0](-1, -1);
   }
   int x, y;
   printf("Please Enter (x,y)>>>");
   scanf("%d %d", &x, &y);
   int z = p[select](x, y);
   printf("%d%c%d=%d\n", x, op[select], y, z);
  }
  else
  {
   printf("select error!\n");
  }
 }
 system("pause");
 return 0;
}
在C语言中,函数指针数组是一种非常有用的数据结构,它可以用于实现状态机、菜单驱动程序、回调机制等。函数指针数组中的每个元素都是一个指向函数的指针,这些函数具有相同的签名(即相同的返回类型和参数列表)。通过函数指针数组,可以方便地调用不同的函数,而无需使用大量的`if-else`或`switch-case`语句。 ### 函数指针数组的定义 函数指针数组的定义方式如下: ```c 返回类型 (*数组名[数组大小])(参数类型列表); ``` 例如,定义一个可以存储3个函数指针数组,每个函数接受两个`int`类型的参数并返回一个`int`类型的结果: ```c int (*funcPtrArray[3])(int, int); ``` ### 函数指针数组的初始化 函数指针数组可以在定义时进行初始化,也可以在后续代码中逐个赋值。初始化时,可以直接将函数名作为数组元素的值,因为函数名在大多数上下文中会被自动转换为指向该函数的指针。 ```c 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 main() { // 定义并初始化函数指针数组 int (*funcPtrArray[3])(int, int) = {add, subtract, multiply}; // 或者在后续代码中赋值 // funcPtrArray[0] = add; // funcPtrArray[1] = subtract; // funcPtrArray[2] = multiply; // 调用函数指针数组中的函数 int result1 = funcPtrArray[0](10, 5); // 调用 add 函数 int result2 = funcPtrArray[1](10, 5); // 调用 subtract 函数 int result3 = funcPtrArray[2](10, 5); // 调用 multiply 函数 printf("Result 1: %d\n", result1); printf("Result 2: %d\n", result2); printf("Result 3: %d\n", result3); return 0; } ``` ### 函数指针数组的应用场景 1. **状态机**:在状态机中,不同的状态可以对应不同的处理函数。通过函数指针数组,可以根据当前状态直接调用相应的处理函数。 2. **菜单驱动程序**:在菜单驱动的程序中,每个菜单项可以对应一个函数。通过函数指针数组,可以轻松实现菜单项与函数的绑定。 3. **回调机制**:在事件驱动的编程模型中,可以通过函数指针数组注册多个回调函数,当特定事件发生时,调用相应的回调函数。 4. **转移表**:在某些算法中,如解析器或解释器中,可以使用函数指针数组来实现转移表,根据输入的不同选择不同的处理逻辑。 ### 示例:使用函数指针数组实现简单计算器 以下是一个使用函数指针数组实现的简单计算器示例。该计算器支持加法、减法、乘法和除法操作。 ```c #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 divide(int x, int y) { if (y != 0) { return x / y; } else { printf("Error: Division by zero.\n"); return 0; } } int main() { // 定义并初始化函数指针数组 int (*operations[4])(int, int) = {add, subtract, multiply, divide}; // 用户选择操作 int choice; printf("Enter operation (0: Add, 1: Subtract, 2: Multiply, 3: Divide): "); scanf("%d", &choice); // 输入操作数 int a, b; printf("Enter two integers: "); scanf("%d %d", &a, &b); // 调用对应的函数 if (choice >= 0 && choice < 4) { int result = operations[choice](a, b); printf("Result: %d\n", result); } else { printf("Invalid operation.\n"); } return 0; } ``` 在这个示例中,用户可以通过输入数字选择要执行的操作,然后输入两个整数作为操作数。程序会根据用户的选择调用相应的函数,并输出结果。 ### 总结 函数指针数组是C语言中一种强大的工具,它允许开发者通过数组的形式管理多个函数指针。通过这种方式,可以简化代码结构,提高程序的灵活性和可维护性。无论是实现状态机、菜单驱动程序还是回调机制,函数指针数组都能提供简洁高效的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值