首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新人

2012-04-26 
新人求救啊一个用于计算加减乘除的计算器程序(按书上写的),编译器未显示错误,但一运行就出对话框This appl

新人求救啊
一个用于计算加减乘除的计算器程序(按书上写的),编译器未显示错误,但一运行就出对话框
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)编译器就会报错

热点排行