求一个用C++编过计算器的,就是那种加减乘除三角函数可以写一排算的

要能够一个算式连续计算加减乘除,小数负数,三角函数反三角函数,能够验证式子书写上的错误以及分母不为零什么的,最好有两个class(学校奇怪的要求),不要求用到括号,三角函数要求用弧度且直接输入如sin(2PI)这样
跪求大神谢谢了!!

//*************************************
//数学表达式解析类
//*************************************
//Expression_Parser.cpp
#include <stdio.h>
#include <string.h>
#include <math.h>

const double PI=3.141592654;

//将角度转换成弧度
double degTorad( double deg )
{
    return (2*PI*deg)/360;
}

//将中缀表达式转换为后缀表达式(逆波兰式)
void trans( char a[], char b[] )
{
    char stock[128]={0};

    int top=0;
    int len=0;
    int i=0;
    int j=0;
    
    top = -1;
    j = -1;
    len = strlen(a);
    
    for ( i=0; i<len; i++ )
    {
        switch( a[i] )
        {
        case '(':
            stock[++top] = '(';
            break;
            
        case '+':
        case '-':
            while( top>=0 && stock[top]!='(' )
            {
                b[++j] = stock[top--];
            }
            stock[++top] = ' '; 
            stock[++top] = a[i];
            break;
            
        case '*':
        case '/':
            while( top>=0 && stock[top]!='(' && stock[top]!='+' && stock[top]!='-' )
            {
                b[++j] = stock[top--];
            }
            stock[++top] = ' ';
            stock[++top] = a[i];
            break;

        case 's':
        case 'c':
        case 't':
            while( top>=0 && stock[top]!='(' && stock[top]!='+' && stock[top]!='-' && stock[top]!='*' && stock[top]!='/' )
            {
                b[++j] = stock[top--];
            }
            stock[++top] = ' ';
            stock[++top] = a[i];
            break;
            
        case 'v':
        case '^':
            while( top>=0 && stock[top]!='(' && stock[top]!='+' && stock[top]!='-' && stock[top]!='*' && stock[top]!='/' && stock[top]!='s' && stock[top]!='c' && stock[top]!='t' )
            {
                b[++j] = stock[top--];
            }
            stock[++top] = ' ';
            stock[++top] = a[i];
            break;

        case 'L':
            while( top>=0 && stock[top]!='(' && stock[top]!='+' && stock[top]!='-' && stock[top]!='*' && stock[top]!='/' && stock[top]!='s' && stock[top]!='c' && stock[top]!='t' && stock[top]!='v' && stock[top]!='^' )
            {
                b[++j] = stock[top--];
            }
            stock[++top] = ' ';
            stock[++top] = a[i];
            break;
            
        case')':
            while( stock[top]!='(' )
            {
                b[++j] = stock[top--];
            }
            top--;
            break;
            
        default:
            b[++j] = a[i];
            if( i == len-1 || a[i+1]<'0' || a[i+1]>'9' )
            {
                if ( a[i+1] != '.' )
                {
                    b[++j] = ' ';
                }
            }
            break;
        }
    }
    
    while ( top>=0 )
    {
        b[++j] = stock[top--];
    }
    
    b[++j] = '\0';
}

//求解后缀表达式(逆波兰式)的值
double compvalue( char exp[] )
{
    int top=0;
    int len=0;
    int i=0;
    int c=0;

    double sum=0;
    double digit[128]={0};

    char str_num_temp[128]={0};
    
    top = -1;
    len = strlen(exp);
    
    for ( i=0; i<len; i++ )
    {
        switch( exp[i] )
        {
        case ' ':
            break;
            
        case '+': 
            sum = digit[top] + digit[top-1];
            digit[--top] = sum;
            break;
            
        case '-':
            sum = digit[top-1] - digit[top];
            digit[--top] = sum;
            break;
            
        case '*':
            sum = digit[top] * digit[top-1];
            digit[--top] = sum;
            break;
            
        case '/':
            sum = digit[top-1] / digit[top];
            digit[--top] = sum;
            break;

        case 's':
            sum = sin( degTorad(digit[top]) );
            digit[top] = sum;
            break;

        case 'c':
            sum = cos( degTorad(digit[top]) );
            digit[top] = sum;
            break;

        case 't':
            sum = tan( degTorad(digit[top]) );
            digit[top] = sum;
            break;

        case 'v':
            sum = sqrt( digit[top] );
            digit[top] = sum;
            break;
            
        case '^':
            sum = pow( digit[top-1], digit[top] );
            digit[--top] = sum;
            break;

        case 'L':
            sum = log10( digit[top] );
            digit[top] = sum;
            break;
            
        default:
            c = 0;
            memset( str_num_temp, 0, sizeof(str_num_temp) );
            while( exp[i]>='0' && exp[i]<='9' || exp[i] == '.' )
            {
                str_num_temp[c++] = exp[i];
                i++;
            }
            str_num_temp[c] = '\0';
            digit[++top] = atof(str_num_temp);
            break;
        }
    }
    
    return digit[0];
}

//解析数学表达式(供外界调用的接口)
double Expression_Parser( char *Expression )
{
    char temp[128]={0};

    trans( Expression, temp );
    return compvalue( temp );
}


//**************************************************************************
//调用方法
//*************************************************************************

//main.cpp

#include <iostream>
using namespace std;

double Expression_Parser( char *Expression );

int main()
{
    double result=0;

    char exp[]="t45-c60+s30+(-6)*3^4+L100+v4-8/2";
    //cin>>exp>>endl;  //取消改行注释,等待用户输入数学表达式
    result = Expression_Parser( exp );
    cout<<"表达式 "<<exp<<" 的计算结果为:"<<result<<endl;

    cin.get();
    return 0;
}


//***************************************
//使用说明
//***************************************
优越性:
1、支持的数学运算符: + - * / sin cos tan sqrt pow log10

2、支持小数运算,运算数据类型为double(双精度)型

3、支持小括号()


实例:
a^b 表示求a的b次方

va或av 表示求a平方根
v(va)与avv等价 表示对a求两次平方根,可以此类推,求a的偶次方根。

s30 表示求30°的正弦值
注:其中π值取3.141592654

L100 表示求100以10为底的对数
注:L要大写


局限性:
1、不支持负数。
解决办法:如果要求表达式 -5*9 ,则可以写成 (0-5)*9 。总之是可以用括号解决的。

2、未进行表达式的正确性验证。


符号优先级:
L
v、^
s、c、t
*、/
+、-

注:s、c、t 分别代表sin、cos、tan,v代表开方,^代表求平方,L代表以10为底求对数。


举例一个正确的表达式:t45-c60+s30+(-6)*3^4+L100+v4-8/2

(赠言:你可在百度搜索“c++ 数学表达式解析”,还会有很多算法可以参考)

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-12
这个涉及到编译原理。建议看下《编译原理》这本书。目测源代码大概要700行以上……
第2个回答  2013-07-13
我用的就是卡西欧科学计算器,60圆,去网上买或者文具店也有(是否是新版不清楚)
第3个回答  2013-07-12
百度正则表达式或者自己用栈实现!

求一个用C++编过计算器的,就是那种加减乘除三角函数可以写一排算的
break; case '+': case '-': while( top>=0 && stock[top]!='

用C++编写一下计算器程序
\/\/calculator<int> cal1("1+2+3+4"); \/\/calculator<long> cal2("4*3*2*1"); \/\/calculator<float> cal3("((1*3\/2)+(4\/(1+1)))*3"); \/\/calculator<double> cal4("((1+3)*(20+4\/6+(3-9)))^-2"); \/\/cout << cal1.GetFormula() << " = " << cal1.Result() << '\\n...

用C++写一个计算器,要求:+,-,*,\/机算;进制转换,三角函数计算
main(){float a,b,d;char c;scanf("%f,%f,%c",&a,&b,&c)if(c=='+')d=a+b;else if(c=='-')d=a-b;else if(c=='*')d=a*b;else if(c=='\/')d=a\/b;printf("%f",d);} 进制暂时想不起来!不好意思!!!

用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负...
double n2, char op) { \/\/数字处理函数 switch (op) { case '+': return n2 + n1; case '-': return n2 - n1; case '*': return n2*n1; case

用C++编写简单的计算器? 要求开头用 #include<stdio.h> #include <std...
include <stdio.h> include <stdlib.h> include <math.h> int add(int a,int b){ return a+b;} int sub(int a,int b){ return a-b;} int mlt(int a,int b){ return a*b;} int divc(int a,int b){ return a\/b;} void d2n(int a,int n){ if(a<n){ putchar(a%n...

用C++编写一道加减乘除计算器的程序 ?
用C++编写一道加减乘除计算器的程序 ?以下是一个C#计算器的源码,我写有注释,你可以看下思想,把它换成VC++的using System;using System.Drawing;using System.Collections;using System.ComponentModel;using Syst

如何用c++编写一个连续加减乘除的计算器,函while语句
while (s[i] != '\\0') { if (s[i] == '(') { str = s[i++] + '\\0'; v.push_back(make_pair<int, string> (1, str)); } else if (s[i] == ')') { str = s[i++] + '\\0'; v.push_back(make_pair < int, string>(2, ...

用C++编写计算器
, IDC_ADD(加) , IDC_DOT(点) , IDC_DY(等于)全局变量: CString str1, str;int flag = 0; \/\/0为无,1为加,2为减,3为乘,4为除bool bflag = false; \/\/输入是否为第二个操作数代码如下:void CcalcDlg::OnBnClickedAc() \/\/AC{flag = 0;bflag = false;str1 = _T("")...

如何用c++做一个计算器,能连续加减乘除的,不需要界面,最好能是用while...
while (s[i] != '\\0') { if (s[i] == '(') { str = s[i++] + '\\0'; v.push_back(make_pair<int, string> (1, str)); } else if (s[i] == ')') { str = s[i++] + '\\0'; v.push_back(make_pair < int, string>(2, ...

用C++设计一简单的计算器模拟程序
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。输入格式:输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。输出格式:在一行中输出算式的运算结果,或者如果除法分母为0或有...

相似回答