毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

C++设计一个简单的计算器 第3页

更新时间:2011-5-14:  来源:毕业论文

         {//对于右括号,使括号内的仍停留在栈中的运算符依次出栈并写入到s2中
          while (R.GetTop()!='{')
          {
           s2[j++]=R.Pop();
          }
          R.Pop();//删除栈顶的左括号
          ch=s1[++i];
         }
         else
          if(ch=='+'||ch=='-'||ch=='*'||ch =='/')
          {//对于四则运算符,使暂存在栈中的不低于ch优先级的运算符依次出栈并写入到s2中
           char w=R.GetTop();
                                   while(Youxianji(w)>=Youxianji(ch))
           {//Youxianji()函数返回运算符形参的优先级
            s2[j++]=w;
            R.Pop();
            w=R.GetTop();
           }
           R.Push(ch);
           ch=s1[++i];
          }
          else
          {//此处为数字或小数点字符的处理
           while(isdigit(ch)||ch=='.')
           { 
            s2[j++]=ch;
            ch=s1[++i];
           }
           s2[j++]=' ';//被转换后的每个数值后放一个空格
          }
 }
 ch=R.Pop();
 while(ch!='=')
 {
  if(ch=='('||ch=='{'||ch=='[')
  {
   cout<<"表达式错误!"<<endl;
   exit(1);
  }
  else
  {
   s2[j++]=ch;
   ch=R.Pop();
  }
 }
 s2[j++]='=';//加入字符串结束符
    s2[j++]='\0';
}
//计算后缀表达式值
float Compute(char *s2)
{
 Stack<float> S(SM);//用S栈存储操作数和中间计算结果
    istrstream ins(s2);//把s2定义为输入字符串流对象ins
    char ch;//用于输入字符
    float x;//用于输入浮点数
    ins>>ch;
 while(ch!='=')
 {
  switch(ch)
  {
  case'+': x=S.Pop()+S.Pop(); break;
  case '-': x=S.Pop();x=S.Pop()-x; break;
  case '*': x=S.Pop()*S.Pop(); break;
  case '/': x=S.Pop();
        if(x!=0.0)//判断除数是否为零
  {
   x=S.Pop() / x;
  }
  else
  {
   cout<<"除数不能为零!"<<endl;
   exit(1);
  }
  break;
  default: ins.putback(ch); ins>>x;
  }
  S.Push(x);
  ins>>ch;
 }
 if(!S.IsEmpty())
 {
  x=S.Pop();
  if(S.IsEmpty())        //如果栈中只有一个值那一定是结果
  {
   return x;
  }
  else
  {
   cout<<"表达式错误!"<<endl;
   exit(1);
  }
 }
 else
 {
  cout<<"表达式错误!"<<endl;
  exit(1);
 }
}
//判断是否为运算符
int IsYf(char ch)
{
 switch(ch)
 {
 case '+':
 case '-':
 case '*':
 case '/': return 1; break;
    default: return 0; break;
 }
}
//提示信息显示
void Tishi(int n)
{
 switch(n)
 {
 case 0: cout<<"..."<<endl; break;
    case 1: cout<<"\n表达式首字符不能是运算符...请重新输入"<<endl; break;
    case 2: cout<<"\n表达式中的运算符输入有误...请重新输入"<<endl; break;
    case 3: cout<<"\n表达式中有非法字符...请重新输入"<<endl; break;
    case 4: cout<<"\n没有以'='字符结束...请重新输入"<<endl; break;
    case 5: cout<<"\n表达式括号不配对...请重新输入"<<endl; break;
    default: break;
 }
}
//检查表达式是否有错
int Test(char *s1)
{
 char ch;
    int i=0;
    int left1=0;//统计左括号
    int right1=0;//统计右括号
    int left2=0;//统计左括号
    int right2=0;//统计右括号
    int left3=0;//统计左括号
    int right3=0;//统计右括号
    ch=s1[i++];
    if(ch=='\0')//没有输入了表达式
 {
  Tishi(0);
        return 0;
 }
    if(IsYf(ch))//第一个是运算符
 {
  Tishi(1);
        return 0;
 }
    while(ch!='\0')
 {
  if(IsYf(ch)&&IsYf(s1[i]))//运算符错误
  {
   Tishi(2);
            return 0;
  }
        if((ch<'0')||(ch>'9'))//有否非法字符
  {
   switch (ch)
   {
   case '(': left1++; break;          //合法字符
   case ')': right1++; break;
   case '[': left2++; break;      //合法字符
   case ']': right2++; break;
   case '{': left3++; break;              //合法字符
   case '}': right3++; break;
   case ' ':
   case '+':
   case '-':
   case '*':
   case '/':
   case '=':
   case '.': break;
            default: Tishi(3); return 0; break;        //非法字符
   }
  }
       ch=s1[i++];
 }
    if(s1[i-2]!='=')//结束符错误
原文请找腾讯752018766辣,文-论'文.网http://www.751com.cn/ 括号问题
 {
  Tishi(5);
        return 0;
 }
    return 1;//表达式正确
}

//-----------------------------END--------------------------
//-----------------------------主函数------------------
void main()//主程序
{
 char str1[50],str2[50]; //暂时存储表达式
    int i;
    cout<<" =================欢迎使用!=================="<<endl;
      cout<<endl;
    while(i!=0)
 {
  cout<<" 请输入一个以'='字符结束的中缀算术表达式:"<<endl;
        cin.getline(str1,sizeof(str1));
        while(!Test(str1)) //检查表达式是否正确
  {
   cin.getline(str1,sizeof(str1));
  }
        Change(str1,str2); //处理结果
        cout<<"\n求值结果为: "<<str1<<Compute(str2)<<endl;
              cout<<endl;
        cout<<"如果继续请输入 :1"<<endl;
              cin>>i;

上一页  [1] [2] [3] 

C++设计一个简单的计算器 第3页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。