问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用C++编译一个简单的计算器

发布网友 发布时间:2022-04-30 08:51

我来回答

2个回答

热心网友 时间:2022-06-20 04:01

我借鉴了别人的某计算器,因为你没有说多简易...我就找了个差不多的...
/*
程序名称:表达式计算器
编译环境:Microsoft Visual C++ 6.0
作者:吉林大学 计算机科学与技术学院 2006 罗泗勇
时间:200801
*/

/*
说明:
采用树形结构处理表达式,按优先级运算结果,一个加,减,乘,除或数值为一个节点
优先级如下:
函数:4
括号:3
乘除:2
加减:1
*/

#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; //数据

int Type; //类型 操作符0 数据1 函数2
Unit * Pre; //构成双向链表
Unit * Next;
};

class Node //表达式树状结构的节点
{
public:
Node(char o,int p,int e=1,double v=0,Node * ph=NULL,Node * pl=NULL,Node * pr=NULL)
:Operation(o),PRI(p),Expression(e),value(v),Head(ph),Left(pl),Right(pr){}
Node * Head; //节点的根,左树枝,右树枝
Node * Left;
Node * Right;
double GetValue();
char GetOperation() const {return Operation;}
int GetPri() const {return PRI;}
int IsExp() const {return Expression;}
private:
char Operation; //操作符
int PRI; //优先级
int Expression; //记录该节点是否是表达式0 1
double value; //该节点的值
};

double Node::GetValue() //运算该节点的值
{
if(IsExp()) //该节点的值还未算出来
{
double lvalue,rvalue;
lvalue=Left->GetValue();
rvalue=Right->GetValue();
Expression=0;
char op=GetOperation();
switch(op)
{
case '+':
return lvalue+rvalue;
case '-':
return lvalue-rvalue;
case '*':
return lvalue*rvalue;
case '/':
return lvalue/rvalue;
default:
return 0;
}
}
else
return value;
}

bool Isnum(char c)
{
for(int i=0;i<sizeof(NUM);i++)
{
if(c==NUM[i])
return true;
}
return false;
}

bool Isoperation(char c)
{
for(int i=0;i<sizeof(OPERATION);i++)
{
if(c==OPERATION[i])
return true;
}
return false;
}

Unit * Analyse(string exp) //分析表达式并生成链表
{
int pri=0; //当前优先级
int stat=-1; //当前的读入状态 括号 0 数据 1 运算符 2
Unit * head=NULL,* p=NULL;
int i=0,explen;
explen=exp.size();
for(i=0;i<explen;i++)
{
char c=exp.at(i);
if(c=='(')
{
pri+=3;
stat=0;
}
else if(c==')')
{
pri-=3;
stat=0;
}
else if(Isoperation(c)) //操作符不会出现在表达式开头
{
Unit * temp=p;
int add_pri; //自身增加的优先级
if(c=='+' || c=='-')
add_pri=1;
else
add_pri=2;
p->Next=new Unit(pri+add_pri,c," ",0,0);
p=p->Next;
p->Pre=temp;
}
else //其他的当做函数处理
{
string function="";
while(i<explen && (c=exp.at(i),! Isoperation(c)) && c!=')')
{
function+=c;
i++;
}
i--;

if(head==NULL)
{
p=new Unit(pri,' ',function,0,2);
head=p;
}
else
{
Unit * temp=p;
p->Next=new Unit(pri,' ',function,0,2);
p=p->Next;
p->Pre=temp;
}
}
}
return head;
}

Unit * Calc(Unit * head) //计算双向链表基本单元的值
{
Unit * p=head;
while(p!=NULL)
{
if(p->Type!=0) //非操作符
{
string temp=p->Code;
string op;
double lvalue=0,rvalue=0;
int l_point=0,r_point=0;
int i=0,type=0;
char ch;
while(i<temp.size() && (ch=temp.at(i),Isnum(ch)))
{
if(ch=='.')
{
l_point++;
i++;
continue;
}
if(! l_point)
lvalue*=10;
lvalue+=(ch-'0')*pow(10,-l_point);
i++;
if(l_point)
l_point++;
}
while(i<temp.size() && (ch=temp.at(i),! Isnum(ch)))
{
op+=ch;
type=1;
i++;
}
while(i<temp.size() && (ch=temp.at(i),Isnum(ch)))
{
if(ch=='.')
{
r_point++;
i++;
continue;
}
if(! r_point)
rvalue*=10;
rvalue+=(ch-'0')*pow(10,-r_point);
i++;
if(r_point)
r_point++;
}
Fun * f=new Fun(op,type,lvalue,rvalue);
p->value=f->calc();
}
p=p->Next;
}
return head;
}

Node * Tree(Unit * head) //生成表达式树
{
Node * root=NULL,* proot=NULL,* pbranch=NULL;
Unit * p=head;
int now_pri; //当前优先级
bool hadop=false;
while(p!=NULL)
{
if(p->Type==0) //如果是一个操作符
{
hadop=true;
if(root==NULL)
{
proot=new Node(p->Operation,p->PRI,1);
root=proot;
pbranch=root;
now_pri=p->PRI;
proot->Left=new Node(' ',0,0,p->Pre->value);
proot->Right=new Node(' ',0,0,p->Next->value);
}
else
{
if(p->PRI<=now_pri) //优先级低于当前优先级,树根方向 //最初写的 if(p->PRI<now_pri),9/3/3=9,错的
{
proot=new Node(p->Operation,p->PRI,1); //新的树根
proot->Left=root; //根的变换
proot->Right=new Node(' ',0,0,p->Next->value);
root=proot;

pbranch=proot; //右树枝的变换
//pbranch->Right=new Node(' ',0,0,p->Pre->value); //树枝右边取值
}
else
{
Node * temp;
temp=new Node(p->Operation,p->PRI,1);

pbranch->Right=temp;
temp->Head=pbranch;

pbranch=pbranch->Right;
pbranch->Left=new Node(' ',0,0,p->Pre->value);
pbranch->Right=new Node(' ',0,0,p->Next->value);
}
now_pri=p->PRI;
}
}
p=p->Next;
}
if(! hadop)
root=new Node(' ',0,0,head->value);
return root;
}

int main()
{
string exp;

//ifstream infile("test.txt",ios::in);
while(! getline(cin,exp).eof())
{
if(exp=="")
continue;
Unit * h=Analyse(exp);
h=Calc(h);
Node * root=Tree(h);
cout<<exp<<"="<<root->GetValue()<<endl;
}
return 0;
}

热心网友 时间:2022-06-20 04:02

#include<stdio.h>
#include<math.h>
main()
{
float a,b;
char c;
printf("shurushuzihefuhao:");
scanf("%f%c%f",&a,&c,&b);
if (c="+")
printf("%f",a+b);
else if (c="-")
printf("%f",a-b);
else if (c="*")
printf("%f",a*b);
else if (c="/")
printf("%f",a/b);
getch();
}
请采纳答案,支持我一下。追问你这也太简单了 不行的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
土耳其旅游,货币在哪兑换最好,跟人民币汇率怎样? 土耳其货币兑换攻略/土耳其货币怎么兑换最划算 土耳其兑换什么 里拉什么银行能换 一个湖泊约多少升水? 2.1亿立方米水怎么 墨影侠踪手游安卓游戏如何下载 梦见一条小蛇咬我一口,然后变成一个小男孩拉屎,还沾我身上了 女人梦见手被蛇咬出血(梦见被蛇咬出血了预兆) 天津森林公园有哪些 哪个适合避暑 启迪设计为什么会降价?启迪设计披露2021年中报?300500 启迪设计估值? 启迪设计股三个月走势?启迪设计最新趋势分析?300500启迪设计近日股价? 启迪设计今后走势如何?启迪设计股票分析预测?启迪设计300500股价? 启迪设计今日走势如何?启迪设计(300500)个股分析?启迪设计300500现股价? 启迪设计股价目标价?300500启迪设计财报表?启迪设计到2021分红? 启迪设计股价目标位?300500启迪设计股年报?启迪设计分红2021? 启迪设计的股票行情?启迪设计股票价位?启迪设计为何跌停? 崩坏学园2一直无法登入,在家里用wifi可以登,到了学校,4G网下不能玩儿了,总提示连接树状图设计 启迪设计为什么一直下跌?启迪设计 2021年业绩?启迪设计代码300500? 300500 启迪设计公告?分析启迪设计股票,有大神说下吗?诊股平台启迪设计? iOS中CALayer的subLayer是什么样的数据结构,重绘顺序是怎么样的_百度知... 命运石之门线形拘束的树状图已经登录iOS 乃们知道吗 启迪设计的今后走势?启迪设计股票宏观形势分析?300500启迪设计最近消息? ios 界面树形结构怎么动态添加 启迪设计现在能买进吗?300500启迪设计资金流向如何?启迪设计股票估价上不去? 线形拘束的树状图ios免越狱版有消息吗 启迪设计股是什么板块?启迪设计上市股价是多少?启迪设计300500股票走势? iOS 有没有什么画树状结构图的开源类库 单反相机镜头变焦如何计算 关于单反相机变焦的常识问题~~~ 300500启迪设计还能买吗?启迪设计涨停代表着什么?启迪设计股票价最贵多少? 启迪设计股票未来目标价300500?2021年启迪设计三季报盈利?启迪设计2021年市值? 启迪设计为什么散户特别多?300500启迪设计业绩公布?300500启迪设计如何? 300500启迪设计后势怎样?启迪设计的股票代码是多少?启迪设计的分红什么时候到? 启迪设计每股估值?启迪设计今天的收盘价是多少?启迪设计吧(300500)股吧东方? 启迪设计今后走势?启迪设计股票分析与东方财富网?启迪设计300500的股价? 为什么手机里面的视频文件从QQ发给电脑后显示少了0.1GB? 扣扣名片赞破解积分的软件 为什么我手机上九个多g的视频传到电脑上变成这个样子?求解! QQ名片赞软件病毒会泄露重要信息吗 手机拍的视频,放在电脑上面看,屏幕不小心被我弄得很小了,怎么弄回去? 手机下载得完整400M容量视频放电脑上变成10个40M的短视频了,怎么回事? 为什手机拍的视频在电脑上看变小了 手机录制视频传到电脑后通过软件修改,发现视频画面过小是怎么回事?如何修改高度呢 手机里视频备份到电脑里大小会变吗 用手机拍的视频弄到电脑上太小了怎么弄大 福大金融专硕就业前景 金融mba和金融硕士有什么区别?哪一种更有就业前景? 西交大金融专硕如何,在西安就业前景如何? oppo手机语音聊天时 会自动中断