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

初学者的程序,运行不对,大家帮帮忙!编译过,但是一运行就出错(计算器)

2012-02-20 
菜鸟的程序,运行不对,大家帮帮忙!!编译过,但是一运行就出错(计算器)#include iostream#include vector

菜鸟的程序,运行不对,大家帮帮忙!!编译过,但是一运行就出错(计算器)
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class sum
{
  public:
  sum():s1("0123456789"),s2("+-*/"){}
  float result();
  private:
  string s1,s2;
};
float sum::result()
{
  char c;
  vector<char> vec1,vec2;
  vector<int>vec3;
  cout<<"请输入表达式:"<<endl; 
  while(c=getchar()!='\n')
{
  if(s1.find(c)!=string::npos)vec1.push_back(c);//如果是数字则存入到vec1中 
  if(s2.find(c)!=string::npos)//如果是运算符要么入栈,要么与栈里的比较 
  { 
  if(c=='*'||c=='/')vec2.push_back(c);
  else
  {
  while(!vec2.empty()&&vec2.back()!='*'&&vec2.back()!='/')//直到遇到比它级别高 
  {
  vec1.push_back(vec2.back());
  vec2.pop_back();
  }
  vec2.push_back(c);
  }  
  }
  if(c=='(')
  vec2.push_back(c);
  if(c==')')//一直退到左括号 
  {
  while(vec2.back()!='(')
  { 
  vec1.push_back(vec2.back());
  vec2.pop_back();
  }
  vec2.pop_back();//左括号退栈 
  }
}  
while(!vec2.empty())//最后把vec2中的复制到vec1中形成后缀式 
  {
  vec1.push_back(vec2.back());
  vec2.pop_back();
  }
vector<char>::iterator iter=vec1.begin();
while(iter!=vec1.end())
{
 if(s1.find(*iter)!=string::npos)//为数字 
  {
  *iter=*iter-'0';//转换为整型 
  vec3.push_back(*iter);  
  }
 else if(*iter=='+')
  {
  int a=vec3.back();
  vec3.pop_back();
  int b=vec3.back();
  vec3.pop_back();
  int c=b+a;
  vec3.push_back(c);  
  }
  else if(*iter=='-')
  {
  int a=vec3.back();
  vec3.pop_back();
  int b=vec3.back();
  vec3.pop_back();
  int c=b-a;
  vec3.push_back(c);  
  }
  else if(*iter=='*')
  {
  int a=vec3.back();
  vec3.pop_back();
  int b=vec3.back();
  vec3.pop_back();
  int c=b*a;
  vec3.push_back(c);  
  }
  else if(*iter=='/')
  {
  int a=vec3.back();
  vec3.pop_back();
  int b=vec3.back();
  vec3.pop_back();
  int c=b/a;
  vec3.push_back(c);  
  } 
}
return vec3.back();
}
int main()
{
  sum a;
  cout<<a.result()<<endl;
  system("pause");
  return 0; 
}


[解决办法]
有两个问题:

一、第一个while循环:
while((c=getchar())!='\n') 
不是
while(c=getchar()!='\n') 

二、
最后一个while循环第一个if语句:
if(s1.find(*iter)!=string::npos)//为数字

*iter=*iter-'0';//转换为整型
vec3.push_back(*iter);

应该改为:
if(s1.find(*iter)!=string::npos)// 

int i=*iter-'0';
vec3.push_back(i);


热点排行