指针实训,第3关:实现计算器

第3关:实现计算器

100

  • 任务要求
  • 参考答案
  • 评论36

任务描述

输入两个整数ab,及+-*/中的任意一字符。根据输入字符对整数ab做相应的算术运算,如输入+,程序就给出ab之和,输入-,就给出ab之差,输入*,就给出ab的乘积,输入/,就给出ab的商。若输入其他字符,则提示输入错误。

本关知识
指向函数的指针变量的定义

定义指向函数的指针变量的一般形式为 数据类型 (*指针变量名)(函数参数表列); 如 int (*p)(int,int); 说明: 1.定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。 2.如果要用指针调用函数,必须先使指针变量指向该函数。 如 p = max;//max为已定义的函数的函数名 3.在给函数指针变量赋值时,只须给出函数名而不必给出参数。 4.对指向函数的指针变量不能进行算术运算。 5.用函数指针变量调用函数时,只须将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括号中根据需要写上实参。如 c=(*p)(a,b);

用指向函数的指针作函数参数

指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数。 指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。 如:

 
  1. ……
  2. int main()
  3. { …… fun(f1,f2) …… }
  4. void fun(int (*x1)(int),int (*x2)(int,int))
  5. { int a,b,i=3,j=5;
  6. a=(*x1)(i); //相当于a=f1(i);
  7. b=(*x2)(i,j); //相当于b=f2(i,j);
  8. }
编程要求

本关的编程任务是补全Calculator.h文件中的Calcaddsubmultdivi函数,以实现计算器功能。 实际的测试样例参见下文。 本关涉及的代码文件Calculator.h的代码框架如下:

 
  1. //注意主函数,主函数已经写好
  2. int calc(int x,int y,int (*p)(int,int)){
  3. //在此写入函数体
  4. //在函数体内实现计算器
  5. /*****************Begin****************/
  6. /***************** End ****************/
  7. }
  8. int add(int x,int y){
  9. //在此写入函数体
  10. //在函数体内实现加法
  11. /*****************Begin****************/
  12. /***************** End ****************/
  13. }
  14. int sub(int x,int y){
  15. //在此写入函数体
  16. //在函数体内实现减法
  17. /*****************Begin****************/
  18. /***************** End ****************/
  19. }
  20. int mult(int x,int y){
  21. //在此写入函数体
  22. //在函数体内实现乘法
  23. /*****************Begin****************/
  24. /***************** End ****************/
  25. }
  26. int divi(int x,int y){
  27. //在此写入函数体
  28. //在函数体内实现除法
  29. /*****************Begin****************/
  30. /***************** End ****************/
  31. }

主函数代码如下:

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //包含 Calculator.h文件
  4. #include"Calculator.h"
  5. //定义main函数
  6. int main()
  7. {
  8. //本题主要是实现一个计算器的功能
  9. int a,b,result;
  10. char c;
  11. scanf("%d%c%d",&a,&c,&b);
  12. //利用函数指针实现加减乘除
  13. switch(c){
  14. case '+':result=calc(a,b,add);break; //加法
  15. case '-':result=calc(a,b,sub);break; //减法
  16. case '*':result=calc(a,b,mult);break; //乘法
  17. case '/':result=calc(a,b,divi);break; //除法
  18. default:printf("系统不能识别的运算符");exit(1); //退出
  19. }
  20. //输出结果
  21. printf("%d",result);
  22. return 0;
  23. }

其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。

测试说明

本关的测试过程如下:

  1. 平台编译CalculatorMain.c以及头文件Calculator.h,然后链接相关程序库并生成CalculatorMain.exe以及Calculator.h.gch
  2. 平台运行CalculatorMain.exe,并以标准方式提供测试输入;
  3. 平台获取CalculatorMain.exe的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对CalculatorMain.c的测试样例:

测试输入: 3+5 预期输出: 8

测试输入: 65-68 预期输出: -3

测试输入: 9*24 预期输出: 216

测试输入: 65/6 预期输出: 10

测试输入: 66=22 预期输出: 系统不能识别的运算符

//注意主函数,主函数已经写好

int calc(int x,int y,int (*p)(int,int)){

   

    //在此写入函数体

    //在函数体内实现计算器

    /*****************Begin****************/

    return p(x,y);

    /***************** End ****************/

}

int add(int x,int y){

    //在此写入函数体

    //在函数体内实现加法

    /*****************Begin****************/

    return x + y;

    /***************** End ****************/

}

int sub(int x,int y){

    //在此写入函数体

    //在函数体内实现减法

    /*****************Begin****************/

    return x - y;

    /***************** End ****************/

}

int mult(int x,int y){

    //在此写入函数体

    //在函数体内实现乘法

    /*****************Begin****************/

    return x * y;

    /***************** End ****************/

}

int divi(int x,int y){

    //在此写入函数体

    //在函数体内实现除法

    /*****************Begin****************/

    if(y != 0){

        return x / y;

    }

    /***************** End ****************/

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值