The C Programming Language 练习题4-6
来源:互联网 发布:wow.js下载 编辑:程序博客网 时间:2024/06/06 23:29
题目
给计算器程序增加处理变量的命令(提供26 个具有单个英文字母变量名的变量很容易)。增加一个变量存放最近打印的值。
题目分析
由于判断条件太多,导致程序非常复杂,实现二次赋值有些麻烦,终于还是想明白了。中间加了很多打印便于分析,就不去除了,下一题还要用:)
代码实现
#include <stdio.h>#include <stdlib.h> /* for atof() */#include <math.h>#include <string.h>#include <ctype.h>#define MAXOP 100#define NUMBER '0'#define MAXVAL 100 /* maximum depth of val stack */#define NAME 'a'int getop(char[]);void push(double);double pop(void);void mathfnc(char s[]);double varname[26];double varval[26];double val[MAXVAL]; /* value stack */int sp = 0; /* next free stack position */int main(){ int type, lastinput, i, m, n; double op2, vtemp; char s[MAXOP]; vtemp = 0.0; for (i = 0; i < 26; i++) { varval[i] = 0.0; varname[i] = 'a'; } while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); 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 '%': push((int)pop() % (int)pop()); break; case '\n': if(lastinput == '=') { printf("\t%.8g\n", val[0]); vtemp = val[0]; } else { vtemp = pop(); printf("\t%.8g\n", vtemp); } break; case NAME: mathfnc(s); break; case '=': if(isupper(lastinput)) { if (sp > 1) pop(); m = pop(); n = lastinput - 'A'; varval[n] = m; printf("varval[%d]=%f\tm=%d\tval[%d]=%f\n", n, varval[n], m, sp, val[sp]); } else printf("error: no var\n"); break; default: if(isupper(type) && (varname[type - 'A'] == 'a'))/* 如果变量没有被赋值 */ varname[type - 'A'] = type; else if(isupper(type) && (varname[type - 'A'] != 'a'))/* 如果变量已经被赋值 */ push(varval[type - 'A']); else if (type == 'v') push(vtemp); else printf("error: unknown command %s\n", s); break; } lastinput = type; } return 0;}void mathfnc(char s[]){ double op4; if(!strcmp(s, "sin")) { op4 = sin(pop()); push(op4); } else if (!strcmp(s, "exp")) { op4 = exp(pop()); push(op4); } else if(!strcmp(s, "pow")) { op4 = pop(); op4 = pow(pop(), op4); push(op4); } else printf("error: command unknown.");}/*push: push f onto value stack */void push(double f){ if (sp < MAXVAL) { val[sp++] = f; printf("val[%d]=%f\t\n", sp, f); } else printf("error: stack full, can't push %g\n", f);}/* pop: pop and return top value from stack */double pop(void){ if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; }}#include <ctype.h>int getch(void);void ungetch(int);/* getop: get next character or numeric operand */int getop(char s[]){ int i, c, d; while ((s[0] = c = getch()) == ' ' || c == '\t') ; s[1] = '\0'; if (!isdigit(c) && c != '.' && c != '-' && !islower(c)) return c; /*not a number */ if ((c == '-' || c == '+') && !isdigit(d = getch())) { ungetch(d); return c; } i = 0; if(islower(c)) { if (c == 'v') return c; { while(islower(s[++i] = c = getch())) ; s[i] = '\0'; if(c != EOF) ungetch(c); return NAME; } } if (isdigit(c))/* a number without '+' and '-' */ { while(isdigit(s[++i] = c = getch())) ; } else /* a number with '+' and '-' */ { s[++i] = d; while (isdigit(s[++i] = c = getch())) ; } if (c == '.') /*collect fraction part */ while (isdigit(s[++i] = c = getch())) ; s[i] = '\0'; if (c != EOF) ungetch(c); return NUMBER;}#define BUFSIZE 1000char buf[BUFSIZE]; /*buffer for ungetch */int bufp = 0; /*next free position in buf */int getch(void) /*get a (possibly pushed-back character) */{ return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch(int c) /*push character back on input */{ if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c;}
阅读全文
0 0
- The C Programming Language 练习题4-6
- The C Programming Language 练习题2-6
- The C Programming Language 练习题3-6
- The C Programming Language 练习题2-4
- The C Programming Language 练习题3-4
- The C Programming Language 练习题4-1
- The C Programming Language 练习题4-2
- The C Programming Language 练习题4-3
- The C Programming Language 练习题4-5
- 《The C Programming Language II》练习题代码
- The C Programming Language 练习题1-21
- The C Programming Language 练习题1-22
- The C Programming Language 练习题1-23
- The C Programming Language 练习题1-24
- The C Programming Language 练习题2-1
- The C Programming Language 练习题2-2
- The C Programming Language 练习题2-3
- The C Programming Language 练习题2-5
- 快速检索(一)之自定义快速检索QiuckIndexBar控件
- 微博登录 error:redirect_uri_mismatch的解决方法
- 数组与指针
- winform控制text只能输入数字
- 最大子序列和
- The C Programming Language 练习题4-6
- 从零开始开发Android版2048 (八)
- 关于Http一些基础知识的学习
- ssh notes
- 鸡兔同笼
- Spring 配置 注解[一]
- linux中配置zookeeper开机自启动---简单有效
- 《mysql 必知必会》整理1
- Android应用程序内存分析工具