给定程序MODI1.C中函数fun的功能是:计算函数
F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)
的值,其中x和y的值不等,z和y的值不等。
例如,当x的值为9,y的值为11,z的值为15时,函数值为-3.50。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
文件MODI1.C内容如下:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
/**********found**********/
#define FU(m,n) (m/n)
double fun(double a,double b,double c)
double value;
value=FU(a+b,a-b)+FU(c+b,c-b);
/**********found**********/
Return(Value);
void main( )
double x,y,z,sum;
printf("Input x y z: ");
seanf("%1f%1f%1f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if(x==y||y=z)
printf("Data error!\n");
exit(0);
sum=fun(x,y,z);
printf("The result is:%5.2f\n",sum);
参考答案:第1处:将“#define FU(m,n) (m/n)”改为“#define FU(m,n) ((m)/(n))”。
第2处:将“Return(Value);”改为“return(value);”。
解析: 程序的第1处错误是带参数宏定义的错误。宏调用和函数调用的方法不一样,函数调用实参与形参之间发生的是值的传递,而宏调用应该将参数完整地代入宏定义中,完成宏替换。程序中宏调用语句为“value=FU(a+b,a-b)+FU(c+b,c-b);”,如果按照原有的宏定义,展开后语句变为“value=a+b/a_h+c+b/c-b;”,可以看到与题目中要求的计算公式完全不符。所以应该在参数m和n上加上括号,调用展开后语句变为“value=(a+b)/(a_b)+(c+b)/(c-b);”。第2处错误是一个语法错误,“return”是关键字,所以应该小写,同时程序中定义的变量名“value”是小写,则return语句中返回的变量也应该用小写字母。
[归纳总结] 虽然等级考试考题中关于宏定义的程序很少,但是遇到此类题目却不太容易找出错误。尤其是带参数的宏定义,参数应该用圆括号括起来,否则宏替换后会发生意想不到的结果,与题目原意不符。考生在做此类题目时,可以将宏调用原样展开,看看和题目中的要求是否一致,若不一致,则需要仔细分析应该怎样处理。