c语言强化训练笔记2010/5/16

 

函数指针的应用

首先实现一个基本的计算器,暂时可以支持加减乘除功能

int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int);

main()
{
  char a[30];
  char b[30];
  char c;

  gets(a);
  printf("%c/n",c=getch());
  gets(b);

  printf("---------/n");

  if(c=='+')
  {
     printf("%d/n/n",add(atoi(a),atoi(b)));
  }
  if(c=='-')
  {
     printf("%d/n/n",sub(atoi(a),atoi(b)));
  }
  if(c=='*')
  {
     printf("%d/n/n",mul(atoi(a),atoi(b)));
  }
  if(c=='/')
  {
     printf("%d/n/n",div(atoi(a),atoi(b)));
  }

}

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;
}  

但是这个程序存在一些问题。比如要在原来程序基础上加入新的功能,比如支持模除的计算

a) 需要在开始的声明出加入

int mod(int, int);

b) 在main函数中加入对符号的解析

if(c=='/')
{
   printf("%d/n/n",mod(atoi(a),atoi(b)));
}

c) 实现int mod(int, int)函数

int mod(int a,int b)
{
   return a%b;
} 
很显然,我们加入一个功能,还要修改调用的部分,模块化不够强
能不能设计一种框架,只要在模块内部修改就可以实现添加修改功能,就要用到函数指针
我们首先需要一个表来描述运算符号与函数名的对应关系,可以通过定义两个数组来实现
int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int); 

char * code ="+-*/";
int (*f[4])(int,int)={add,sub,mul,div};

当用户输入一个运算符号时,程序从code数组中查找这个符号所在的位置,通过返回的符号位置读取相应的处理函数在f数组中的函数指针,调用函数指针就实现了调用相应的运算符处理函数。

完整的程序如下

int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int);

char * code ="+-*/";
int (*f[4])(int,int)={add,sub,mul,div};

main()
{
  char a[30];
  char b[30];
  char c;
  int n;

  gets(a);
  printf("%c/n",c=getch());
  gets(b);

  printf("---------/n");

  for (n=0;code[n]!=c&&code[n]!=0;n++);

  if(code[n]!=0)
  {
        printf("%d/n",f[n](atoi(a),atoi(b)));
  }
  if(code[n]==0)
  {
        printf("?/n");
        return;
  }

}

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;
}

在这个程序中,如果想加入新的功能,只需要声明函数名以后在code数组中放入运算符,在f数组中放入函数指针,然后实现处理函数就可以。而客户代码无需修改就可以直接使用,增强了程序的灵活性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值