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站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-09网页代码,网页代码快捷键
- 05-06单页网站的代码(完整的网页代码)[20240506更新]
- 05-06个人主页图片代码(个人主页图片代码怎么弄)[20240506更新]
- 05-06提取微信名片代码(微信名片信息提取)[20240506更新]
- 05-06php后台权限管理代码(php管理员权限)[20240506更新]
- 05-06付费观看代码php(付费观看代码)[20240506更新]
- 05-06在线html执行代码(html怎么运行)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06代码源软件库(程序代码库)[20240506更新]
- 05-06点击弹出密码代码(点击弹出密码代码错误)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接