C 语言 逆波兰计算机

coolite 2009-02-22 03:56:47
为什么不管我怎么输入都是提示错误啊 是程序错了么?

#include <stdio.h>
#include <stdlib.h> /* for atof() */

#define MAXOP 100 /* max size of operand or operator */
#define NUMBER '0' /* signal that a number was found */

int getop(char []);
void push(double);
double pop(void);

/* reverse Polish calculator */
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 '\n':
printf("\t%.8g\n", pop());
break;
default:
printf("error: unknown command %s\n", s);
break;
}
}
return 0;
}



#define MAXVAL 100 /* maximum depth of val stack */

int sp = 0; /* next free stack position */
double val[MAXVAL]; /* value stack */

/* 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;

while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.')
return c; /* not a number */
i = 0;
if (isdigit(c)) /* collect integer part */
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;
}



...全文
111 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolite 2009-02-24
  • 打赏
  • 举报
回复
我要说什么好呢? 我真的没话说了
我只能说句!!!!!!!我真的超级无敌宇宙感谢你
因为这个问题 我一问 别人都让我看树的遍历
我树的遍历看过了
程序我捣鼓了半天设置断点也不会找毛病
真的很感谢您!!!
你让我释放了,我苦了三天,没人甩我
没知识真的很让人瞧不起,我会多多在这论坛上好好像你们学习!谢谢了
ltc_mouse 2009-02-23
  • 打赏
  • 举报
回复
1. getch是不回显的,即你无法看到输入的内容,不利于调试,可换成getche
2. error:unkonwn commad的原因在于得到了不识别的字符了,如Ctrl+Z,我在VS2003下测试,发现回车也这样.因为'\r','\n'的问题
case '\n':
printf("\t%.8g\n", pop());
break;
可以修改成:
case '\r':
case '\n':
printf("\n%.8g\n", pop()); ///输出前先换行下,否则会将表达式覆盖了
break;

3. 输入的运算式采用逆波兰式
coolite 2009-02-23
  • 打赏
  • 举报
回复
高手赶紧帮帮我吧 没方向。了
coolite 2009-02-23
  • 打赏
  • 举报
回复
高手求救啊
我是这么理解的
比如说我运行这个程序
我想算(1-2)*(4-5)
我就输入 1 这个字符将被存入s[0] 然后我按CRTL+Z输入结束符 结果DOS里面就显示: error:unkonwn commad
这时候1被压入到栈中 val[0]=1.0
然后我再将2压入
再输入+可是不出结果啊
这样每次都是提示错误啊

我想知道如何输入,这样我能更容易理解点,能帮我解决下么?到底该如何使用这个程序。
coolite 2009-02-23
  • 打赏
  • 举报
回复
高手求救啊
我是这么理解的
比如说我运行这个程序
我想算(1-2)*(4-5)
我就输入 1 这个字符将被存入s[0] 然后我按CRTL+Z输入结束符 结果DOS里面就显示: error:unkonwn commad
这时候1被压入到栈中 val[0]=1.0
然后我再将2压入
再输入+可是不出结果啊
这样每次都是提示错误啊

我想知道如何输入,这样我能更容易理解点,能帮我解决下么?到底该如何使用这个程序。
waizqfor 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coolite 的回复:]
我在网上找了个C的逆波兰计算器源码
但是不会用
比如我想算(1-2)*(4-5)吧
该如何输入呢
不管是是输入1 2 - 45 -*回车
还是(1-2)*(4-5)回车都提示错误
这个程序到底怎么用呢?
我到底怎么输入才能使用这个程序啊
应该怎么个输入方法 ~~我想要使用方法。。。谢谢了 大家帮帮我吧
我3天了 想了半天 也没想明白
[/Quote]
http://www.linuxdiyf.com/blog/?111420/action_viewspace_itemid_3513.htmlLZ配合程序看看原理
coolite 2009-02-23
  • 打赏
  • 举报
回复
我在网上找了个C的逆波兰计算器源码
但是不会用
比如我想算(1-2)*(4-5)吧
该如何输入呢
不管是是输入1 2 - 45 -*回车
还是(1-2)*(4-5)回车都提示错误
这个程序到底怎么用呢?
我到底怎么输入才能使用这个程序啊
应该怎么个输入方法 ~~我想要使用方法。。。谢谢了 大家帮帮我吧
我3天了 想了半天 也没想明白
  • 打赏
  • 举报
回复
现在没编译器,先mark下。
waizqfor 2009-02-22
  • 打赏
  • 举报
回复
给LZ一个参考一下

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXOP 100
#define NUMBER '0'
int getop (char [] );
void push (double);
double pop(void);

int getch(void);
void ungetch(int);

int getop(char s[])
{
int i,c;
while ((s[0]=c=getch())==' '|| c=='\t');
s[1]='\0';
if(!isdigit(c)&&c!='.')
return c;
i=0;
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;
}


#define BUFSIZE 100
char buf[BUFSIZE];
int bufp=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;
}
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 '/n':
printf("\t%.8g\n",pop());
break;*/
case 0x0a:
printf("\t%.8g\n",pop());
break;

default:
printf("error:unknown command %s\n",s);
break;
}
}
return 0;
}


#define MAXVAL 100

int sp=0;
double val[MAXVAL];

void push(double f)
{
if(sp<MAXVAL)
val[sp++]=f;
else
printf("error:strack 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;
}
}
使用我们的软件进行无缝数据迁移或从任何Microsoft SQL Server或Windows Azure SQL数据库同步到IBM DB2服务器。它易于使用且有效。我们的解决方案只需几步即可将您的整个数据集从MS SQL Server转换并同步到IBM DB2目标。 要执行部分数据传输,请使用我们的集成数据过滤器,这些过滤器在您只需转换/同步离散表时非常有用。当您需要移动,删除或仅插入已修改的记录时,这对于部分数据复制也很有用。 我们的应用程序可以达到最大可能的转换速度,因此可以节省您在数据库转换方面的时间用户友好的界面和广泛的功能可以帮助您减少转换所需的手动工作,快速,专业地完成工作。 为什么要将数据从MS SQL Server转换为IBM DB2? 因此,如果您需要在异构环境中传输数据库或在不同平台之间同步数据,我们的解决方案将以最少的工作量自动完成工作。 内置调度程序可帮助您在适合您偏好的时间运行任何任务。 DBConvert for MSSQL下载 产品亮点 具有批量和量化功能的速度转换 视图从MS SQL到MySQL和Oracle的转换支持 MS SQL,MySQL,Oracle和PostgreSQL之间的双向同步 具有批量和量化功能的速度转换将 数据保存到MS SQL转储中以便导出MS SQL数据库 MS SQL Server(Express)2000/2005/2008/2008 R2 / 2012/2014,SQL Azure支持 能够选择TCP / IP,PIPE,IPX / SPX通信协议 Amazon RDS SQL Server数据库实例支持 DB2 v。 9.7及更高版本的 MS SQL方案支持 界面语言 英语德语法语西班牙语意大利语丹麦语中文俄语葡萄牙语波兰语希腊语 产品要求 在目标MS SQL服务器上写入数据库的必要权限(此要求是可选的,因为有一个选项可以克服使用转储文件的限制) Microsoft Visual C ++ 2008 x86可再发行组件包 写入目标DB2上的空数据库的必要权限server 如果连接到远程DB2服务器,则应在安装了我们的工具的计算机上安装IBM Data Server Client。
I made this file by collecting kinds of paper test information online in about half a year. I made it public to help the ones hunting for jobs like myself last year. If anything is wrong, Please contact me by CSDN or Peking Moment at gmail dot com. You can print or note this file by yourself without纸上谈兵 刖音……… 操作系统及 linux 14 1.进程与线程 1)同步机伟 14 2)进程通信… 15 3)同步与通信 4)进程调度 16 5)多进程与多线程的区别….17 6)死锁 17 7〕)进程与线程 18 2. fork ““““““““““““““ 18 3. Linux…………… 20 4, RAID 21 5.测试…. 1面 道面准 21 6.堆栈数据代码区 …22 7.文件读写 n1道面1面面主B1 23 1) fclose(……… 23 2)fopen 23 3fseek0 .24 4)fread 24 5) fwrite(… 24 8.硬链接与软链接 25 .C++与面向对象语言 26 1.C语言基础问题… 26 GoogLe+@http://dwz.cn/fada5 CsdN@http://dwz.cn/as2ik 1)关于 const的问题 26 2)浅复制与深复制.…. 3)逆波兰表达式 4)C语言变长参数0 a品 27 5)调用约定… 27 6)寄存器 28 7)关于内联数 inline 28 8 PACK.... 28 9)正则表达式 29 内存操作… 29 11)四种强制类型转换 31 12 sizeof …31 13)动态库与静态库 32 14)压栈·优先级·位序·宏· Union·指针 32 15)new& malloc… 35 16) enum 35 2.面冋对象编程 面面面 35 1)构造函数虚函数静态成员函数…… 35 2)copy& assignment… 36 3)列表初始化 37 4)多态… 37 5)静态绑定与动态绑定 38 6 Explicit mutable volatile internal 39 7)继承… 39 8〕)堆栈溢出 面主1面主面:aat 40 9)重载操作符 40 10) Final 1 C+ 41 3.设计模式. .41 1)UTF编码协议… 41 〕)创建型模式( creational pattern)…… 41 3)单例模式 1面a i1面 42 4)策略模式…… 主主主基主主主主 42 5)MVC……, 43 6) PIMPL….... “4 .43 7)RAIL 44 4 STL 44 1) Vector.… 44 2]upper_ bound&lower_bound 45 mAp 45 数据结构 46 1.树. 146 1)基本知识 …46 2)几个问题 46 3)完全二叉树( Complete binary tree)… 54 4)次优查找树 55 5)最优二叉树霍大曼树…… 55 6) BST: Search/insert/delete 56 7)平衡二叉树与AVL树 8)B树与B+树 57 9)红黑树 59 2.栈 59 GoogLe+@http://dwz.cn/fada5 Csdn@http://dwz.cn/as2ik 1)括号配对 59 3.链表… 61 1)单向链表交点问题 61 2)链表内环的存在间题 62 3)链表逆置反向存储… 63 4)将两个排序好的链表归并 4.图. 面道盖 主1 65 1)某本知识….,… 65 2)图的表示…, 1面自1主主主日1面主 65 )DFS&BFS…....… 6 4D&b&FW algorithm 68 5)应用 主自 着面 69 5.排序 70 1)基木知识 …70 2)快速排序 …71 3)插入排序 72 4)希尔排序… …72 5)选择排序 72 6)归并排序… 73 7)堆排序 74 8)拓扑排序… 75 9)计数排序… 76 6. Hash 76 1) Consistent Hashing…… 76 7.查找元素∴ 77 1)一般二分查找…… 77 2)循环升序数组 77 3)杨氏矩阵… 4)跨行查找字符串 81 5)Trie树 81 8.其他. 1)主定理与复杂度 81 2)静态存储与动态存储… 82 3)字符串匹配 主主面主主主 ….82 四 数据与计算机通信… 85 1 OSI 85 2.TCP协议 85 1.通路的建立 .86 2.数据传输 86 3.连接终止 87 4.拥塞控制 88 5. Soket通讯与TCP原语 88 3.UDP协议… 89 4.分组交换 90 5.HTTP协议… 90 1)TTP协议简介 2)HTTP协议方法 90 3)HT"TP响应,,…,,… 1 4)示例 91 6.IP协议… 92 1)IPv4 92 2)子网划分 92 GoogLe+@http://dwz.cn/fada5 Csdn@http://dwz.cn/as2ik 7. ICMP 93 8.ARP与RARP 93 数据库 94 1.主键/超键/候选键. 94 2 ACID 1面主 …94 3.数据库范式… n010000I 94 4.数据库中的基本语句 11面 95 5.游标 …………95 6.索引 主主主 主主基主主主主主主签主主主 95 7.语句 96 8.内连接与外连接 96 9.视图 96 六.算法及智力题目 97 1.小白鼠试毒问题及扩展… 主面⊥ 自11自主 97 2.大半寻找次品球问题及扩展. 主主主在主主 97 3.抽扑克牌问题. 98 4.三密码锁问题…… 面面面 99 5.猜数字问题 99 6.最大连续子序列问题 100 7.优惠券问题 101 8.闫隔翻眼镜问题.… …102 9.扔鸡蛋确定楼层问题..-. 02 10.左上右下最大流问题 106 11.三角形内产生随机数 111 12.赛与问题 …111 13.过河问题〔 intel)… 113 14.数星星问题.… 114 15.交流问题/ Gossip problem 114 16.交换问题. 15 17.换数… 18.消耗问题…… 117 19.四则算式 17 20.国王与魔鬼下棋问题 11面 121 七.数学与逻辑…… 122 1.停时定理 122 2.基本公式 123 3.实现'a+b 123 4.估算N!的位数.0 123 5.N的开方 124 6.三个数组求最大距离 126 7.6,9,140可以组合成大于N的所有数请问N最小为?…126 8.判断一个点位于一个多边形的内部? 126 9.求连续数组的最大乘积 127 10.台阶接水问题. 127 11.最小交集. 127 12.概率问题 127 1)生日悖论之二 127 2〕)升级概率问题 128 3)碰撞概率…,… 128 4)布丰投针问题,…,,… …128 )概率组合示例….129 13.排列组合问题 130 GoogLe+@http://dwz.cn/fada5 CsdN@http://dwz.cn/as2ik 1)组合 130 2)全排列 130 3)错排问题..0 133 4)输入,输出对应的所有长度为的二进制串 134 5)输入56,输出11-1621-26…51-56… 135 6)已知字符串里的字符是互不相同的,现在任意组合,比如ab,则输出a, ab,ba,bb,编程接照字典序输出所有的组合 .136 八.手写代码. 138 1. strcpy函数…,,,,, 面面1a面 …138 2.atoi.…, 自1面 主主道 138 3.itoa(Intel) 139 4.约慭夫环〔nte) 面111面D面主 139 5.二分查找函数 140 6.实现栈或者树的建立查找删除销毁操作… 141 7.斐波那契数列 141 8.求两个数组中的相同元素 141 9.查找一个中间大的数… 141 10.编写类 String的构造析构赋值函数…,…,…,,, 141 11.输入两个宇符串,输出第二个字符串在第一个字符串中的位序 143 12.方块寻径…… …144 13.实现积分图 145 语…… 146

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧