当前位置: 首页 > news >正文

C //练习 4-9 以上介绍的getch与ungetch函数不能正确地处理压回的EOF。考虑压回EOF时应该如何处理?请实现你的设计方案。

C程序设计语言 (第二版) 练习 4-9

练习 4-9 以上介绍的getch与ungetch函数不能正确地处理压回的EOF。考虑压回EOF时应该如何处理?请实现你的设计方案。

注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010

 

代码块:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100
#define VAR '1'int sp = 0;
double val[MAXVAL];int buf[BUFSIZE];                    //此处原先为char型,改为int型
int bufp = 0;double variable[26];void push(double f){if(sp < MAXVAL){val[sp++] = f;}else{printf("Error! Stack Full, can't push %g\n", f);}
}double pop(void){if(sp > 0){return val[--sp];}else{printf("Error! Stack Empty!\n");return 0.0;}
}void printTop(void){if(sp > 0){printf("Top: %g\n", val[sp-1]);}else{printf("Error! Stack Empty!\n");}
}void topCopy(void){if(sp > 0 || sp < MAXVAL){val[sp++] = val[sp-1];}else if(sp <= 0){printf("Error! Stack Empty!\n");}else{printf("Error! Stack Full!\n");}
}void swapTop(void){double temp;if(sp >= 2){temp = val[sp-1];val[sp-1] = val[sp-2];val[sp-2] = temp;}else{printf("Can't Swap Top Number!\n");}
}void emptyStack(void){for(int i = sp - 1; i >= 0; i--){val[i] = 0;}sp = 0;
}int getch(void){return (bufp > 0) ? buf[--bufp] : getchar();
}void ungetch(int c){if(bufp >= BUFSIZE){printf("Ungetch! Too many characters!\n");}else{buf[bufp++] = c;}
}int getop(char s[]){int i, c;while((s[0] = c = getch()) == ' ' || c == '\t');s[1] = '\0';if(c == 's'){int next1 = getch();int next2 = getch();if(next1 == 'i' && next2 == 'n'){return c;}}if(c == 'e'){int next1 = getch();int next2 = getch();if(next1 == 'x' && next2 == 'p'){return c;}}if(c == 'p'){int next1 = getch();int next2 = getch();if(next1 == 'o' && next2 == 'w'){return c;}}if(c >= 'a' && c <= 'z'){int next = getch();if(next == ' '){ungetch(next);return VAR;}}if(c == '-'){int next = getch();if(!isdigit(next) && next != '.'){ungetch(next);return c;}s[1] = c = next;i = 1;}else{i = 0;if(!isdigit(c) && c != '.'){return c;}}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;
}int main(){int type;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 '%':op2 = pop();push((int)pop() % (int)op2);break;case 's':op2 = pop();push(sin(op2));break;case 'e':op2 = pop();push(exp(op2));break;case 'p':op2 = pop();push(pow(pop(), op2));break;case VAR:variable[s[0] - 'a'] = pop();push(variable[s[0] - 'a']);printf("%c = %lf\n", s[0], variable[s[0] - 'a']);break;case '\n':printf("\t%.8g\n", pop());break;default:printf("Error! Unknown Command %s\n", s);break;}}system("pause");return 0;
}

相关文章:

  • 国内有哪些比较好用的低代码开发平台?JNPF算一个
  • 深入Pandas(二):高级数据处理技巧
  • Java 常见缓存详解以及解决方案
  • 硬盘检测软件 SMART Utility mac功能特色
  • web第一次作业
  • 如何在OpenWRT部署uhttpd搭建服务器实现远程访问本地web站点
  • 超维空间M1无人机使用说明书——41、ROS无人机使用yolo进行物体识别
  • 【JAVA基础】JVM之类加载--双亲委派机制
  • C语言——结构体类型(二)【结构体内存对齐,结构体数组】
  • 美客多本土店与跨境店有何区别?本土店如何入驻运营?
  • IPv6邻居发现协议(NDP)---路由发现
  • Web缓存代理
  • 【算法】七夕祭
  • What does `$?` do?
  • C# 语法进阶 委托
  • 【面试系列】之二:关于js原型
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 08.Android之View事件问题
  • 2019.2.20 c++ 知识梳理
  • CentOS7 安装JDK
  • Fabric架构演变之路
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js数组之filter
  • Kibana配置logstash,报表一体化
  • PaddlePaddle-GitHub的正确打开姿势
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React组件设计模式(一)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 对象管理器(defineProperty)学习笔记
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于 Babel 的 npm 包最小化设置
  • 算法-插入排序
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 详解NodeJs流之一
  • 如何在招聘中考核.NET架构师
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​香农与信息论三大定律
  • #{}和${}的区别是什么 -- java面试
  • #13 yum、编译安装与sed命令的使用
  • #Linux(make工具和makefile文件以及makefile语法)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (初研) Sentence-embedding fine-tune notebook
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (十三)Maven插件解析运行机制
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET是什么
  • /var/lib/dpkg/lock 锁定问题
  • []我的函数库