当前位置:首页 > 代码 > 正文

vc计算器程序代码(c++计算器程序代码)

admin 发布:2022-12-19 20:31 118


本篇文章给大家谈谈vc计算器程序代码,以及c++计算器程序代码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

vc++6.0计算器代码

思路:

用一个变量来标记操作符(+ - * /),int flag=0;   //1为加,2为减,3为乘,4为除,0为未按操作符。

用两个CString变量来存储第一个和第二个操作数,注意如果为除时要检测第二个操作数是否为0。

随时检测输入框edit中输入的内容,最多只能有一个小数点,首先按小数点时显示为“0.”

另注意一些细节:连续操作,结果数如果有小数点,末尾为0的要全部消除0等等

实现:

edit控件:增加控件变量:m_edit

新建上述button 分别更改为:IDC_0........IDC_9, IDC_AC, IDC_C , IDC_CHU(除) , IDC_C(乘) , IDC_J(减) , 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("");

str = _T("");

m_edit.SetWindowTextW(_T(""));

}

void CcalcDlg::OnBnClickedC() //C

{

OnBnClickedAc();

}

void CcalcDlg::OnBnClicked1() //1

{

if (bflag==true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("1");

}

else

{

str = str + _T("1");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked2() //2

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("2");

}

else

{

str = str + _T("2");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked3() //3

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("3");

}

else

{

str = str + _T("3");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked4() //4

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("4");

}

else

{

str = str + _T("4");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked5() //5

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("5");

}

else

{

str = str + _T("5");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked6() //6

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("6");

}

else

{

str = str + _T("6");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked7() //7

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("7");

}

else

{

str = str + _T("7");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked8() //8

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("8");

}

else

{

str = str + _T("8");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked9() //9

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str == _T("0"))

{

str = _T("9");

}

else

{

str = str + _T("9");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClicked0() //0

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str != _T("0"))

{

str = str + _T("0");

m_edit.SetWindowTextW(str);

}

}

void CcalcDlg::OnBnClickedDot() //点

{

if (bflag == true)

{

str1 = str;

str = _T("");

bflag = false;

m_edit.SetWindowTextW(_T(""));

}

if (str.Find('.') != -1)

return;

if (str == _T("0") || str == _T(""))

{

str = _T("0.");

}

else

{

str = str + _T(".");

}

m_edit.SetWindowTextW(str);

}

void CcalcDlg::OnBnClickedChu() //除

{

if (str != _T(""))

{

flag = 4;

bflag = true;

}

}

void CcalcDlg::OnBnClickedCheng() //乘

{

if (str != _T(""))

{

flag = 3;

bflag = true;

}

}

void CcalcDlg::OnBnClickedJ() //减

{

if (str != _T(""))

{

bflag = true;

flag = 2;

}

}

void CcalcDlg::OnBnClickedAdd() //加

{

if (str != _T(""))

{

flag = 1;

bflag = true;

}

}

void CcalcDlg::OnBnClickedDy() //等于

{

double a, b;

b = _ttof(str);

a = _ttof(str1);

CString s;

switch (flag)

{

case 1: //加

s.Format(_T("%f"), a + b);

break;

case 2: //减

s.Format(_T("%f"), a - b);

break;

case 3: //乘

s.Format(_T("%f"), a * b);

break;

case 4: //除

if (str != _T("0"))

{

s.Format(_T("%f"), a / b);

}

else

{

MessageBox(_T("除数为0"));

OnBnClickedAc();

}

break;

default:

s = _T("");

}

int f = s.Find('.');

if (f != -1)

{

int i = s.GetLength();

while ('0' == s.GetAt(i - 1))

{

s.Delete(i - 1, 1);

i--;

}

i = s.GetLength();

if ('.' == s.GetAt(i - 1))

{

s.Delete(i - 1, 1);

}

}

m_edit.SetWindowTextW(s);

str = _T("");

str1 = _T("");

flag = 0;

bflag = false;

}

vc计算器代码

/*

说明:

采用树形结构处理表达式,按优先级运算结果,一个加,减,乘,除或数值为一个节点

优先级如下:

函数: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=10;

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);

if(op=="-")

return -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;isizeof(NUM);i++)

{

if(c==NUM[i])

return true;

}

return false;

}

bool Isoperation(char c)

{

for(int i=0;isizeof(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;iexplen;i++)

{

char c=exp.at(i);

if(c=='(')

{

pri+=3;

stat=0;

}

else if(c==')')

{

pri-=3;

stat=0;

}

else if(Isoperation(c) stat!=1) //操作符后的当正负号处理

{

stat=1;

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 //其他的当做函数处理

{

stat=2;

string function="";

while(iexplen (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(itemp.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(itemp.size() (ch=temp.at(i),! Isnum(ch)))

{

op+=ch;

type=1;

i++;

}

while(itemp.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-PRInow_pri) //优先级低于当前优先级,树根方向

{

proot=new Node(p-Operation,p-PRI,1); //新的树根

proot-Left=root; //根的变换

proot-Left-Head=proot;

proot-Right=new Node(' ',0,0,p-Next-value);

proot-Right-Head=proot;

root=proot;

pbranch=proot; //右树枝的变换

//pbranch-Right=new Node(' ',0,0,p-Pre-value); //树枝右边取值

}

else if(p-PRI==now_pri) //优先级相同,先算左边的

{

Node * temp;

temp=new Node(p-Operation,p-PRI,1);

temp-Left=pbranch;

if(pbranch-Head==NULL)

{

proot=temp;

root=proot;

pbranch-Head=proot;

}

else

{

Node * temp0;

temp0=pbranch-Head;

temp0-Right=temp;

temp-Head=temp0;

pbranch-Head=temp;

}

pbranch=temp;

pbranch-Right=new Node(' ',0,0,p-Next-value);

pbranch-Right-Head=pbranch;

}

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-Left-Head=pbranch;

pbranch-Right=new Node(' ',0,0,p-Next-value);

pbranch-Right-Head=pbranch;

}

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(infile,exp).eof())

{

if(exp=="")

continue;

Unit * h=Analyse(exp);

h=Calc(h);

Node * root=Tree(h);

coutexp"="root-GetValue()endl;

}

return 0;

}

用c语言 (c++) 编写计算器程序

我们平时进行数学运算都是用计算器完成的,那么如何用C语言编写一个计算器呢?下面我给大家分享一下。

工具/材料

Dev C++

01

首先我们需要在Dev C++软件中创建一个C语言项目,项目类型选择控制台程序,如下图所示

02

接下来我们在项目下面新建C语言文件,如下图所示

03

然后我们在C文件中写入计算器逻辑代码,主要是让用户输入计算方式,然后程序自动计算,如下图所示

04

接下来我们点击运行菜单,选择下拉菜单中的运行选项,如下图所示

05

最后在弹出的界面中我们输入要计算的公式,程序就会自动计算,如下图所示

vc计算器程序代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c++计算器程序代码、vc计算器程序代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/22986.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载