The C Programming Language 练习题4-3
来源:互联网 发布:商户销售数据采集 编辑:程序博客网 时间:2024/06/14 05:17
题目
在有了基本框架后,对计算器程序进行扩充就比较简单了。在该程序中加入取模(%)运算符,并注意考虑负数的情况。
题目分析
取模运算比较简单,直接在case部分加入即可。
考虑负数需要看‘-’后面是否数字。
之前程序很有问题,重新修改了下。顺便把整体代码都放上来,现在这个能够正确的处理负数了。为了方便调试,程序不是很简洁。
发现还是有很多问题,参考了别人的方法,更新一下。
代码实现
#include <stdio.h>#include <stdlib.h> /* for atof() */#define MAXOP 100#define NUMBER '0'#define MAXVAL 100 /* maximum depth of val stack */int getop(char[]);void push(double);double pop(void);double val[MAXVAL]; /* value stack */int main(){ int type, i; double op2; char s[MAXOP]; 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': printf("\t%.8g\n", pop()); break; case 'e': printf("error: after '-' is not a number%s\n", s); break; default: printf("error: unknown command %s\n", s); break; } } return 0;}int sp = 0; /* next free stack position *//*push: push f onto value stack */void push(double f){ if (sp < MAXVAL) val[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 != '-') return c; /*not a number */ if ((c == '-' || c == '+') && !isdigit(d = getch())) { ungetch(d); return c; } i = 0; 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 练习题3-4
- The C Programming Language 练习题4-3
- The C Programming Language 练习题3-3
- The C Programming Language 练习题2-4
- The C Programming Language 练习题4-1
- The C Programming Language 练习题4-2
- The C Programming Language 练习题4-5
- The C Programming Language 练习题4-6
- The C Programming Language 练习题2-3
- The C Programming Language 练习题3-1
- The C Programming Language 练习题3-2
- The C Programming Language 练习题3-5
- The C Programming Language 练习题3-6
- 《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
- SAP UI5 Overview
- Node 项目一些有用的包
- java 类与对象-封装
- Linux后台执行的方法
- C# windows Service (利用asp.net 建立专案)
- The C Programming Language 练习题4-3
- PullToRefreshGridView中xml的配置
- [分布式监控CAT] Client端—定制化SDK\各开源监控产品对比
- mongodb Capped Collection
- 有关verilog中阻塞赋值和非阻塞赋值的问题
- Swift4.0字典的常用详解
- hdu 6106.Classes
- AzureAD 错误信息Access token validation failure
- 3665 顺序表应用8:最大子段和之动态规划法