| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 976 人关注过本帖
标题:求助 一个简单计算器的代码
只看楼主 加入收藏
sandy154525105
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-4-2
收藏
 问题点数:0 回复次数:1 
求助 一个简单计算器的代码
高手们问个题:有c或c++编程实现一个简单的计算器,
要求:1要有运算的优先级,只要求有+.-.*./就可以了;
2要求只输入表达式就可以输出结果,(如输入2+4*6-7=,则输出19)且表达式可以无限长。
搜索更多相关主题的帖子: 计算器 代码 输出 
2008-04-02 19:27
xjywc
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-1-11
收藏
得分:0 
初学c++时写的,还很不完善,没有用到很多c++的许多独有的特性,仅供参考一下,有括号sqrt()表示开根号
#include <iostream>
#include <string>
#include <map>
#include <math.h>

using namespace std;
map<string,double>table;
double expr(bool);
double term(bool);
double prim(bool);
double error(const string&);


enum Token_value{NAME,       NUMBER,    END,     SQR,   EXIT,
                 PLUS='+',   MINUS='-', MUL='*', DIV='/',
                 ASSIGN='=', PRINT=';', LP='(',  RP=')'};

Token_value curr_tok=PRINT;        //定义一个全局变量;
Token_value get_token();


double expr(bool get)              //加减运算
{
    double left=term(get);
    for(;;)
    {switch (curr_tok)
    {
    case PLUS:
        left+=term(true);
        break;
    case MINUS:
        left-=term(true);
        break;
    default:
        return left;    
    }
    }
}

double term(bool get)             //处理乘除运算
{
    double left=prim(get);
    for(;;)
    {switch (curr_tok)
    {
    case MUL:
        left*=prim(true);
        break;
    case DIV:
        if (double b=prim(true))
        {
         left/=b;
         break;
        }
        return error("divide by 0!");
    default:
        return left;
    }
    }
}


double number_value;
string string_value;

double prim(bool get)                 //处理关键字和括号
{if(get) get_token();
 switch (curr_tok)
 {
 case NUMBER:
     {double v=number_value;
      get_token();
      return v;
     }
 case NAME:
     { double& v=table[string_value];
       if(get_token()==ASSIGN) v=expr(true);
       return v;
     }
 case SQR:
      {double v=sqrt(prim(true));
       return v;
      }
 case MINUS:
     {
      return -prim(true);
     }
 case LP:
     {double e=expr(true);
      if(curr_tok!=RP) return error(") is expected!");
      get_token();
      return e;
     }
 default:
     return error("primary expected!");
 }
}

Token_value get_token()
{   char ch;
    do
    {if(!cin.get(ch)) return curr_tok=END;
    }
    while (ch!='\n'&&isspace(ch));
    switch (ch)
    {
    case ';':
    case '\n':
        return curr_tok=PRINT;
    case '+':
    case '-':
    case '*':
    case '/':
    case '=':
    case '(':
    case ')':
        return curr_tok=Token_value(ch);
    case '0':case '1':case '2':case '3':case '4':
    case '5':case '6':case '7':case '8':case '9':case '.':
        cin.putback(ch);
        cin>>number_value;
        return curr_tok=NUMBER;
    default:
        if(isalpha(ch))
        {
        string_value=ch;
        while (cin.get(ch)&&isalnum(ch))
        string_value.push_back(ch);
         cin.putback(ch);   
         if (string_value=="sqrt")
          {return curr_tok=SQR; }
          else if(string_value=="exit")
          {return curr_tok=EXIT;
          }                      //添加
         return curr_tok=NAME;
        
        }
      error ("bad token!");
      return curr_tok=PRINT;
    }
}
int no_error;
double error(const string& s)
{   no_error++;
    cerr<<"error:"<<s<<endl;
    return no_error;
}

int main()
{
    table["pi"]=3.14159;
    table["eq"]=2.718281;

    while (cin)
    {get_token();
    if(curr_tok==END) break;
    if(curr_tok==PRINT) continue;
    if(curr_tok==EXIT) break;
    cout<<expr(false)<<"\n";
    }
    system("pause");
    return no_error;
}

dev-c++下编译通过
2008-04-04 13:59
快速回复:求助 一个简单计算器的代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023724 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved