新人求救啊
一个用于计算加减乘除的计算器程序(按书上写的),编译器未显示错误,但一运行就出对话框
This application has requested the Runtim to terminate it in an unusual way.
程序是这样的:
#include "std_lib_facilities.h"
void err(string sen){
throw runtime_error(sen);
}
class token{
public:
char type;
double val;
token(char ch):type(ch),val(0){}
token(char ch,double v)
:type(ch),val(v){}
};
class tok_stream{
public:
token get();
void putback(token t);
tok_stream();
private:
token tt;
bool box;
};
tok_stream::tok_stream()
:box(false),tt(0)
{
}
void tok_stream::putback(token t){
tt=t;
box=1;
}
token tok_stream::get(){
if(box=1)
{
box=0;
return tt;
}
char o;
cin>>o;
switch(o)
{
case':':case'q':case'(':case')':
case'+':case'-':case'*':case'/':
return token(o);
case'1':case'2':case'3':case'4':case'5':
case'6':case'7':case'8':case'9':case'0':
case'.':
{
cin.putback(o);
double v;
cin>>v;
return token('8',v);
}
default:
err("bad token!");
}
}
tok_stream ts;
double expression();
double primary(){
token t=ts.get();
switch(t.type){
case'(':{
double d=expression();
t=ts.get();
if(t.type!=')')
err("')'wanted!");
return d;
}
case'8':
return t.val;
default:
err("primary expectedd");
}
}
double term()
{
double left=primary();
token t=ts.get();
while(1)
{
switch(t.type)
{
case('*'):
{
left*=primary();
t=ts.get();
break;
}
case('/'):
{
double d=primary();
if(d=0) err("divide by zero");
left/=d;
t=ts.get();
break;
}
default:
{
ts.putback(t);
return left;
}
}
}
}
double expression()
{
double left=term();
token t=ts.get();
while(1)
{
switch(t.type)
{
case('+'):
{
left+=term();
t=ts.get();
break;
}
case('/'):
{
left-=term();
t=ts.get();
break;
}
default:
{
ts.putback(t);
return left;
}
}
}
}
int main()
{
while(cin)
cout<<expression()<<"\n";
keep_window_open();
}
哪里出了问题啊?
[解决办法]
lz问题解决啦~ 恭喜
[解决办法]
你都整明白了。。哎。。那我就好意思的接分了
[解决办法]
...接分?
[解决办法]
if(box=1)
建议倒过来写,这样编译器会帮你检查一下低级错误
if(1 = box)编译器就会报错