基于MFC的科学计算器编程
}
}
else
{
} } 若原字符串为“2+sqrt4x3”,经过运算后变为“2+2x3”; (4)处理获得的字符串,将数值(都是非负数)存储在数组 Num[],运算符存储在数组 cha[]。 代码如下:
int m = 0;
float Num[100];
//数值数目的上限
float rate=10.0f,itemp=0.0f;
Num[m] = itemp;
itemp = 0;
m = m + 1;
Cha[m] = '/';
m = m + 1;
rate = 10.0f;
mark = 0;
}
else
{
Cha[m] = '/';
m = m + 1;
}
}
else if(m_stringcal.GetAt(i)=='^')
{
if(mark == 1)
char Cha[100];
//运算符数目的上限
int mark;
//标记符
for(int t = 0;t<100;t++) //初始化字符数组和数值数组
{
Num[t] = 0.0f;
Cha[t] = ' ';
}
for(i=0;i<m_stringcal.GetLength();i++) //捕捉
{
正数或负数;
2.两个数值中间是两个相连的运算符,若后一个运算符为‘+’或者‘-’,则处理方法
同 1;
以处理‘+’为例,代码如下:
if(Cha[0] == '+')
//处理第一个‘+’
{
if(Cha[1] == ' ')
{
Num[1] = (+1)*Num[1];
for(int p = 0;p<m;p++)
}
else if((i+4) == m_stringcal.GetLength())
{
AfxMessageBox("ERROR!");
CString str;
str = "wrong";
return str;
}
else if(m_stringcal[i+4]!='0'
&&
m_stringcal[i+4]!='1'
&&
m_stringcal[i+4]!='2'
&&
m_stringcal[i+4]!='3'
&&
m_stringcal[i+4]!='4'
&&
m_stringcal[i+4]!='5'
&&
m_stringcal[i+4]!='6'
&&
m_stringcal[i+4]!='7'
&&
m_stringcal[i+4]!='8'
if(m_stringcal[i] == 's') //计算根号 {
if(m_stringcal[i+1] == 'q')
{
if(m_stringcal[i+2] == 'r')
{
if(m_stringcal[i+3] == 't')
{
if( i!=0
&&
m_stringcal[i-1]!='+'
rate = rate/10;
mark = 1;
}
}
else if(m_stringcal.GetAt(i)=='.')
{
rate=0.1f;
mark = 1;
}
else if(m_stringcal.GetAt(i)=='+')
{
if(mark == 1)
{
Num[m] = itemp;
itemp = 0;
图 1 科学计算器界面效果图 (2)功能按钮介绍 DEL:删除光标左侧第一个字符,若光标左侧为 sqrt,则点击一次 DEL 按钮即可删除 sqrt 四个 字符,便于用户操作,同理,对于 log、ln、sin、cos、tan 和 Pi,也可以实现上述功能;若 光标位于字符串最左端,则不进行任何操作。 AC:清空编辑框内的字符串。 PRE:点击一次 PRE 按钮,显示上一次运算的计算结果,点击两次,则显示再上一次的运算 结果,依次类推,直到显示第一次的运算结果,之后再点击 PRE 按钮,不进行任何操作。 Sci:用科学计数法表示当前显示的运算结果。 Pi:表示圆周率 π。
1.若算式里包含“Pi”,则以数值“3.142592653”取代“Pi”; 2.若算式包含“sqrt+数值”,则进行二次根号运算,以获得的数值结果取代原先的“sqrt+
数值”; 3.若算式包含“sin+数值”,同“sqrt+数值”类似,计算出正弦值后,替换掉算式(字
符串)的“sin+数值”部分,需要注意的是,“sin+数值”里面的数值可以使负数, 此处需要对负数做出进一步判断; 4.同理处理“cos+数值”,“tan+数值”; 5.同理处理“lg+数字”、“ln+数值”的情况(数值不能为负,否则报错); 经过以上步骤的处理,原先的无括号算式只包含数值与运算符“+”、“-”、“x”、“/”、 “^”。 以计算“sqrt+数值”为例,代码如下(包含报错功能): for(i=0;i<m_stringcal.GetLength();i++) {
{
if(Cha[i+2] == ' ' &&
Cha[i-1] == ' ')
{
for(int t = i+1;t<m;t++)
{
Num[t] = Num[t+1];
Cha[t] = Cha[t+1];
}
m = t - 1;
}
else
{
AfxMessageBox("ERROR!");
return "wrong";
{
if(isdigit(m_stringcal.GetAt(n)))
{
if(rate==10.0)
itemp = itemp*rate+(m_stringcal.GetAt(n)-'0');
else
{
itemp = itemp+rate*(m_stringcal.GetAt(n)-'0');
rate = rate/10;
基于 MFC 的科学计算器编程
南京航空航天大学 赵祥成 一,总体功能设计要求
(1)实现带括号的四则混合运算以及幂、三角函数、根号、对数的运算; (2)显示上一次的计算结果; (3)采用科学计数法表示当前计算结果; (4)若输入的算式不符合运算规则,计算器能够自动报错。
二,界面设计
(1)界面效果图 采用基于对话框的 MFC 编程编辑科学计算器的界面,界面效果如图 1。
m = m + 1;
Cha[m] = '+';
m = m + 1;
rate = 10.0f;
mark = 0;
}
else
{
Cha[m] = '+'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='-') { if(mark == 1) { Num[m] = itemp; itemp = 0; m = m + 1; Cha[m] = '-'; m = m + 1; rate = 10.0f; mark = 0; } else { Cha[m] = '-'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='x') { if(mark == 1) { Num[m] = itemp; itemp = 0; m = m + 1; Cha[m] = 'x'; m = m + 1; rate = 10.0f; mark = 0; } else { Cha[m] = 'x'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='/') { if(mark == 1) {
&&
m_stringcal[i-1]!='-'
&&
m_stringcal[i-1]!='x'
&&
m_stringcal[i-1]!='/'
&&
m_stringcal[i-1]!='^' )
{
AfxMessageBox("ERROR!");
CString str;