案例分析题

【说明】
下面程序运行时,对输入的表达式进行计算并输出计算结果。设表达式由两个整数和一个运算符(+或-)构成,整数和运算符之间以空格分隔,运算符可以出现在两个整 数之前、之间或之后,整数不超过4位,输入的两个整数和运算符都用字符串表示。
例如,输入分别为“25+7”、“+25 7”、“25 7+”时,输出均为“25 + 7 = 32”。

【C代码】
#include
int str2int(char *s); //将数字字符串转换为整数
int isOperator(char *str); //判断字符串的开头字符是否为运算符
void cal(char op, char a[ ], charb[ ]); //将数字串转化为对应整数后进行op所要求的计算
void solve(char a[ ],char b[ ],char c[ ]);

int main ()
{
char a[10],b[10], c[10];
scanf(’’%s%s%s’’,a,b,c);
//输入数据的有效性检测略,下面假设输入数据有效、正确
Solve(a,b,c);
Return 0;
}
int str2int(char *s)
{
int val = 0;
while (*s) {
val = (1) + (*s - '0'); //将数字字符串转换为十进制整数
(2) ; //令字符指针指向下一个数字字符
}
return val;
}

int isOperator(char *str)
{
return (*str ==‘+’|| *str ==‘-’);
}
void cal( char op, char a[ ], char b[])
{
switch(op) {
case ‘+’:
printf(” %s + %s = %d”,a,b,str2int(a)+str2int(b));
break;
case ‘-’:
printf("%s - %s = %d ” ,a,b,str2int(a)-str2int(b));
break;
}
}

void solve(char a[ ],char b[ ],char c[ ])
{//解析输入的3个字符串,输出表达式及计算结果
if (isOperator(a)) { //运算符在两个整数之前
cal( (3) );
}
else if(isOperator(b)) { //运算符在两个整数之间
cal( (4) );
}
else { //运算符在两个整数之后
cal( (5) );
}
}

阅读上述说明和C代码,填写程序中的空(1)~ (5),将解答写入答题纸的对应栏内。

【正确答案】

(1)val*10
(2)s++
(3) *a,b,c
(4) *b ,a,c
(5) *c,a,b

【答案解析】

1、2空将数字字符串进行全部转化为数字,例如“1234”转化为数字1234,分别用指针s依次取字符,val将数字保留,之前是’1’,val=1;然后s=’2’,val=12,然后s=’3’,val=123,然后s=’4’,val=1234,因此val=val*10+*s-‘0’。每次循环后s向后移动一个。
3、4、5考查的都是函数调用的问题,首先判断运算符的位置,用isOperator来进行判定,如果字符串a就是运算符,那么操作数就是b和c,调用cal函数进行计算。实参传递的时候,第一个参数要传递字符,后面两个参数传递字符数组或者字符指针,(3)填写的是*a,b,c,依次类推,(4) 答案是*b ,a,c,(5)的答案是 *c,a,b。