3 回答

TA贡献1770条经验 获得超3个赞
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
const char NUM[]={'0','1','2','3','4','5','6','7','8','9','.'};
const char OPERATION[]={'+','-','*','/'};
const double PI=3.14159265358979;
const double EE=2.71828182818281;
class Fun //处理系统数学函数的类
{
public:
Fun(string o,int t,double l=0.0,double r=0.0):op(o),type(t),lvalue(l),rvalue(r){}
static string FUN[];
double calc();
private:
int type; //666 0 1 sin90 2 3! 3 3C2
string op; //函数类型
double lvalue; //函数左边的值
double rvalue; //函数右边的值
static int FunNum;
};
int Fun::FunNum=8;
string Fun::FUN[]={"!","sin","cos","tan","log","ln","C","A","^"};
/*
函数说明:
1:log是以10为底的工程对数
2:ln 是以e为底的自然对数
3:C 计算组合数 输入规则 如计算 3取2的组合 输入表达式 3C2
4:A 计算排列数 输入规则 如计算 3取2的排列 输入表达式 3A2
5:! 计算阶乘
6:^ x的y次方 输入 x^y
*/
int factorial(int n) //阶乘函数
{
int i,s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
int C(int a,int b)
{
return factorial(a)/(factorial(b)*factorial(a-b));
}
int A(int a,int b)
{
return factorial(a)/factorial(b);
}
double Fun::calc() //计算系统函数的值
{
if(type==0)
return lvalue;
else
{
if(op=="!")
return factorial(lvalue);
if(op=="sin")
return sin(rvalue/180*PI);
if(op=="cos")
return cos(rvalue/180*PI);
if(op=="tan")
return tan(rvalue/180*PI);
if(op=="log")
return log10(rvalue);
if(op=="ln")
return log10(rvalue)/log10(EE);
if(op=="C")
return C(lvalue,rvalue);
if(op=="A")
return A(lvalue,rvalue);
if(op=="^")
return pow(lvalue,rvalue);
else
{
string err="暂时没有函数"+op;
MessageBox(NULL,err.c_str(),"错误",MB_OK);
return 0;
}
}
}
struct Unit //双向链表保存运算单元
{
Unit(int p,char o,string c,double v,int t,Unit * pr=NULL,Unit * n=NULL)
:PRI(p),Operation(o),Code(c),value(v),Type(t),Pre(pr),Next(n){}
int PRI; //优先级
char Operation; //操作符
string Code; //原始代码
double value; //数据

TA贡献1789条经验 获得超10个赞
#include "TypeDef.h"
#pragma once
class Error
{ //错误类
error_msg err;
public:
Error(error_msg e) { err = e; }
error_msg GetError() { return err; }
};
class Calculator;
class Token
{
friend class Calculator;
public:
int mark;//mark=1操作符,mark=2浮点数
union {Token_Item ttitem;double dvalue;};
const Token& operator = (const Token&);
};
class Calculator
{
private:
char expression[MAX_LENGTH+1];
int exp_length;
Token tempexpression[MAX_LENGTH+1];
int telength;
Token postexpression[MAX_LENGTH+1];
int pelength;
Token temp;
double dresult;
int IsZero(double d);//判断是否为0
int GetIcp(Token_Item& ti) const;//栈内优先级
int GetIsp(Token_Item& ti) const;//栈外优先级
int GetOpeNum(Token_Item& ti) const;//返回操作数的个数
int IsDigital(char t);//是不是数字
void PreScan();//预扫描,检查括号匹配情况
void GetPostFix();//后缀表达式
void Eval();//表达式计算
public:
Calculator():exp_length(0) {};
void CalValue(const char*);//根据输入的表达式计算其值
void ErrorReport(Error e);//错误报告
double GetResult(){return dresult;};//返回计算结果
};

TA贡献1828条经验 获得超6个赞
1、
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
float a, b;
char op;
cout << "依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数"<< endl;
cin >> a >> op >> b;
if (b == 0)
{
cout << "第二个数不能是0" <<endl;
exit(-1);
}
switch(op)
{
case '+' :
cout << a + b << endl;
break;
case '-' :
cout << a - b << endl;
break;
case '*' :
cout << a * b << endl;
break;
case '/' :
cout << a / b << endl;
break;
}
return 0;
}
添加回答
举报