C程序设计语言4-6课后题参考答案不正确
2018-01-07 18:12
621 查看
4-6如果采用官方“配套”(其实是另外的人写的)参考书的话,答案代码是不正确的,无法顺利达到目的。不过稍加修改即可:
首先,全局定义var参数(名字自己定),main代码和推荐的一致:
int var;//定义var在这里
main(){
int type,i;
double op1,op2,v;
char s[MAXOP];
void clean(void);
double vars[26];
for(i=0;i<26;i++)
vars[i]=0.0;
while((type=getop(s)) !=EOF){
switch(type){
case NUMBER:
push(atof(s));
break;
case '+':
push(pop()+pop());
break;
case FUNC:
mathFunc(s);
break;
case '*':
push(pop()*pop());
break;
case '-':
op2=pop();
push(pop()-op2);
break;
case '/':
op2=pop();
if(op2!=0.0)
push(pop()/op2);
else
printf("error:zero divisor\n");
break;
case '%'://模除运算
op2=pop();
if(op2!=0.0)
push(fmod(pop(),op2));
else
printf("除数不可为0\n");
break;
case'\n':
printf("\t%.8g\n",pop());
break;
case '?':
//打印栈顶元素
op2=pop();
printf("\t%.8g\n",op2);
push(op2);
break;
case 'c':
//清空栈
clean();
break;
case 's':
op1=pop();
op2=pop();
push(op1);
push(op2);
break;
case '=':
pop();
if(var>='A' &&var<='Z'){
vars[var-'A']=pop();
}
else
printf("记录变量失败");
break;
default:
if (type>='A' &&type<='Z')
push(vars[type-'A']);
else if (type=='v')
push(v);
else
printf("error:unknown command %s\n",s);
break;
}
}
return 0;
}
接下来,修改getop,增加大写字母检测:
int getop(char s[]){
int i,c;
while((s[0]=c=getch())==' '||c=='\t')
;
s[1]='\0';
i=0;
if(isupper(c)){//增加大写字母检测
var=c;
return c;
}
if(islower(c)){
int p=c;
//在这里C被改变了,所以需要用新变量暂存,否则达不到预期结果
while(islower(s[++i]=c=getch()))
;
s[i]='\0';
if(c!=EOF){
ungetch(c);
}
if(strlen(s)>1){
return FUNC;
}
else{
return p;
}
}
if (!isdigit(c) && c!='.'&& c!='-')
return c;
//在这里检验负数
if(c == '-'){
if(isdigit(s[++i]=c=getch())){
while (isdigit(s[++i]=c=getch()))
;
}
else if((s[++i]=c=getch())=='.'){
while (isdigit(s[++i]=c=getch()))
;
}
else{
if(c!=EOF)
ungetch(c);
return '-';
}
}
if(isdigit(c))
while (isdigit(s[++i]=c=getch()))
;
if(c == '.')
while (isdigit(s[++i]=c=getch()))
;
s[i]='\0';
if(c!=EOF)
ungetch(c);
return NUMBER;
}
OK了,其实方法不止这一个。
首先,全局定义var参数(名字自己定),main代码和推荐的一致:
int var;//定义var在这里
main(){
int type,i;
double op1,op2,v;
char s[MAXOP];
void clean(void);
double vars[26];
for(i=0;i<26;i++)
vars[i]=0.0;
while((type=getop(s)) !=EOF){
switch(type){
case NUMBER:
push(atof(s));
break;
case '+':
push(pop()+pop());
break;
case FUNC:
mathFunc(s);
break;
case '*':
push(pop()*pop());
break;
case '-':
op2=pop();
push(pop()-op2);
break;
case '/':
op2=pop();
if(op2!=0.0)
push(pop()/op2);
else
printf("error:zero divisor\n");
break;
case '%'://模除运算
op2=pop();
if(op2!=0.0)
push(fmod(pop(),op2));
else
printf("除数不可为0\n");
break;
case'\n':
printf("\t%.8g\n",pop());
break;
case '?':
//打印栈顶元素
op2=pop();
printf("\t%.8g\n",op2);
push(op2);
break;
case 'c':
//清空栈
clean();
break;
case 's':
op1=pop();
op2=pop();
push(op1);
push(op2);
break;
case '=':
pop();
if(var>='A' &&var<='Z'){
vars[var-'A']=pop();
}
else
printf("记录变量失败");
break;
default:
if (type>='A' &&type<='Z')
push(vars[type-'A']);
else if (type=='v')
push(v);
else
printf("error:unknown command %s\n",s);
break;
}
}
return 0;
}
接下来,修改getop,增加大写字母检测:
int getop(char s[]){
int i,c;
while((s[0]=c=getch())==' '||c=='\t')
;
s[1]='\0';
i=0;
if(isupper(c)){//增加大写字母检测
var=c;
return c;
}
if(islower(c)){
int p=c;
//在这里C被改变了,所以需要用新变量暂存,否则达不到预期结果
while(islower(s[++i]=c=getch()))
;
s[i]='\0';
if(c!=EOF){
ungetch(c);
}
if(strlen(s)>1){
return FUNC;
}
else{
return p;
}
}
if (!isdigit(c) && c!='.'&& c!='-')
return c;
//在这里检验负数
if(c == '-'){
if(isdigit(s[++i]=c=getch())){
while (isdigit(s[++i]=c=getch()))
;
}
else if((s[++i]=c=getch())=='.'){
while (isdigit(s[++i]=c=getch()))
;
}
else{
if(c!=EOF)
ungetch(c);
return '-';
}
}
if(isdigit(c))
while (isdigit(s[++i]=c=getch()))
;
if(c == '.')
while (isdigit(s[++i]=c=getch()))
;
s[i]='\0';
if(c!=EOF)
ungetch(c);
return NUMBER;
}
OK了,其实方法不止这一个。
相关文章推荐
- C语言程序设计 练习题参考答案 第二章
- 谭浩强C语言程序设计(第三版)部分课后题答案,自己整理的
- C语言程序设计 练习题参考答案 第五章 (1) 函数定义调用
- ITAT 第一届 C语言程序设计 参考答案(个人答案 仅供参考)
- C语言程序设计 练习题参考答案 第一章
- 新版汇编语言程序设计【课后习题答案】
- C语言程序设计 练习题参考答案 第五章 (2) 递归函数
- C语言程序设计 练习题参考答案 第八章 文件(1)
- C语言程序设计 练习题参考答案 第三章 (2) 选择结构
- C语言程序设计 练习题参考答案 第七章 (2) 指针与数组 main函数形参
- C语言程序设计 练习题参考答案 第四章 (2) 二维数组
- C语言程序设计 练习题参考答案 第三章 (3) 循环结构
- ITAT 第九届 模拟题 C语言程序设计 参考答案(个人答案 仅供参考)
- C语言程序设计 练习题参考答案 第七章 (1) 指针与变量 指针与数组
- C语言程序设计 练习题参考答案 第四章 (3) 字符数组
- ITAT 第九届 模拟题(江西赛区决赛) C语言程序设计 参考答案
- C语言程序设计 练习题参考答案 第三章 (1) 顺序结构 输入输出
- java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter6-29
- java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter7-21
- java 语言程序设计-李尊朝 第6章 类和对象 练习答案