第3关:实现计算器
100
- 任务要求
- 参考答案
- 评论36
任务描述
输入两个整数a
和b
,及+
,-
,*
,/
中的任意一字符。根据输入字符对整数a
和b
做相应的算术运算,如输入+
,程序就给出a
与b
之和,输入-
,就给出a
和b
之差,输入*
,就给出a
和b
的乘积,输入/
,就给出a
与b
的商。若输入其他字符,则提示输入错误。
本关知识
指向函数的指针变量的定义
定义指向函数的指针变量的一般形式为 数据类型 (*
指针变量名)(函数参数表列); 如 int (*p)(int,int);
说明: 1.定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。 2.如果要用指针调用函数,必须先使指针变量指向该函数。 如 p = max;//max
为已定义的函数的函数名 3.在给函数指针变量赋值时,只须给出函数名而不必给出参数。 4.对指向函数的指针变量不能进行算术运算。 5.用函数指针变量调用函数时,只须将(*p)
代替函数名即可(p为指针变量名),在(*p)
之后的括号中根据需要写上实参。如 c=(*p)(a,b);
用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数。 指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。 如:
……
int main()
{ …… fun(f1,f2) …… }
void fun(int (*x1)(int),int (*x2)(int,int))
{ int a,b,i=3,j=5;
a=(*x1)(i); //相当于a=f1(i);
b=(*x2)(i,j); //相当于b=f2(i,j);
}
编程要求
本关的编程任务是补全Calculator.h
文件中的Calc
、add
、sub
、mult
、divi
函数,以实现计算器功能。 实际的测试样例参见下文。 本关涉及的代码文件Calculator.h
的代码框架如下:
//注意主函数,主函数已经写好
int calc(int x,int y,int (*p)(int,int)){
//在此写入函数体
//在函数体内实现计算器
/*****************Begin****************/
/***************** End ****************/
}
int add(int x,int y){
//在此写入函数体
//在函数体内实现加法
/*****************Begin****************/
/***************** End ****************/
}
int sub(int x,int y){
//在此写入函数体
//在函数体内实现减法
/*****************Begin****************/
/***************** End ****************/
}
int mult(int x,int y){
//在此写入函数体
//在函数体内实现乘法
/*****************Begin****************/
/***************** End ****************/
}
int divi(int x,int y){
//在此写入函数体
//在函数体内实现除法
/*****************Begin****************/
/***************** End ****************/
}
主函数代码如下:
#include <stdio.h>
#include <stdlib.h>
//包含 Calculator.h文件
#include"Calculator.h"
//定义main函数
int main()
{
//本题主要是实现一个计算器的功能
int a,b,result;
char c;
scanf("%d%c%d",&a,&c,&b);
//利用函数指针实现加减乘除
switch(c){
case '+':result=calc(a,b,add);break; //加法
case '-':result=calc(a,b,sub);break; //减法
case '*':result=calc(a,b,mult);break; //乘法
case '/':result=calc(a,b,divi);break; //除法
default:printf("系统不能识别的运算符");exit(1); //退出
}
//输出结果
printf("%d",result);
return 0;
}
其中: #include <stdio.h>
的意思是包含stdio
函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()
是定义main
函数,每个C
程序都必须有且只有一个main
函数。该函数是整个程序的入口,程序执行会从main
函数的第一条语句开始。 int
表示main
函数的返回值类型。函数结束时需要返回一个整数。 return 0;
是函数返回,这里是从main
函数返回,0
是返回的整数值。return
语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
- 平台编译
CalculatorMain.c
以及头文件Calculator.h
,然后链接相关程序库并生成CalculatorMain.exe
以及Calculator.h.gch
; - 平台运行
CalculatorMain.exe
,并以标准方式提供测试输入; - 平台获取
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 ****************/
}