一. 功能需求:
1. 能进行加、减、乘、除运算:
这时最基本的计算器功能。
2. 还能进行以下的数值计算:
函数名:ln
在数学中ln(x)是以e为底的x的对数。 e是一个常数
函数名: exp功能: 指数函数
exp就是以e为底的指数,exp(0)=1, exp(1)=e, exp(2)=e
n!代表一个数的阶乘,例如:5!就是5*4*3*2*1;
sta代表统计算法;
x^3代表x的3次方;
x^y代表x的y次方。
sin正弦,
cos余弦,
tan正切,
dms度分秒切换
Lsh左移
ln自然对数,
F-E科学计数法开关,Xor异或,
Int整数部分,
Exp允许输入用科学计数法表示的数字
1/x倒数,
log常用倒数
mod余数
Pi是圆周率,
Exp是科学计数法
exp代表以e为幂指数函数例如:exp10就是e的10次方;
ln是以e为底的对数函数例如:ln10就是以e为底10的对数;
M+是计算结果并加上已经储存的数;
M-是计算结果并用已储存的数字减去目前的结果;
MR是读取储存的数据;
MC是清除储存数据;
AC,CE归零是有一个是清除现有数据重新输入,另一个是清除全部数据结果和运算符.等。
转载请标明出处:http://blog.csdn.net/u012027907
二. 总体设计:
1. 用例图:
2. 类图:
这其中包含了主要的类,还有其它不太重要的类,如:
CMyButton类:实现按钮自绘的类;
PlayBtnMusic类:播放按键音类;
CHelp类:对各种按键进行说明的类:
dd
3. 设计
(1)对话框窗体及各种资源的设计:
(1).要进行计算,必须要添加相应的按钮。
这其中包括能进行计算的数字按钮和操作符按钮两种按键按钮;
还有能进行数制转换和角度、弧度转换的单选按钮;以及能求反函数的复选框与组框。
(2).要能显示计算机过及过程,必须有编辑框。
(3).要能有菜单就更好了,其可以实现复制、拷贝,进制转换及显示关于对话框。
(2). 对资源进行响应的各种函数设计:
(1).对数字按钮进行响应的函数。
(2).对操作符进行响应的函数。
(3).对进制转换进行响应的函数。
(4).对弧度、角度转换进行响应的函数。
(5).存储数值的函数及求阶乘等函数。
三. 详细设计:
A.表示层:
1. 对话框窗体及各种资源的设计:
(1).按钮设计:
A. 按键按钮:
数字按钮和操作符按钮两种;
B. 单选按钮:
数制转换和角度、弧度转换的单选按钮
C. 复选框:
求反函数的复选框。
D.组框:
将相应的具有同类型的按钮分组,并显示在一个框中。
(2).编辑框:
A.进行数字显示的主编辑框。
B.存储计算结果按MS按钮时,显示M的编辑框,及按括号时,显示括号的编辑框。
(3).菜单:
A.实现复制、拷贝的“编辑”菜单。
B.进制转换及角度弧度转换选择的“查看”菜单。
C.显示关于对话框的“帮助”菜单。
对话框设计截图如下:
2. 对资源进行响应的各种函数设计:
(1).对数字按钮进行响应的函数:
由于数字等按钮有10几个,若能将其实现在一个函数(OnNumberKey())中,并用ON_COMMAND_RANGE宏实现对多个具有相同属性按钮的集体映射。便可以避免对没有个按钮单个映射的麻烦。
代码如下:
//----------------------操作数按钮响应函数----------------
void CCalculatorDlg::OnNumberKey(UINT nID)
{
播放按键音
PressBtnMusic Play;
Play.PlayMusic();
/定义局部变量
TransForm trans;
CString n,pi;
CString strexpshow;
int inpi=0;
///若上次按键为 “=”,按数字时,重新初始化一些变量
if(OperationState == IDC_NUMBER_Equal)
{
number1=m_number;
OperationState = 0;
m_copym=m_number;
m_equalvalue=m_Cnumber;
number1 = m_number;
m_number=0;
m_Cnumber="";
}
//-----
switch(nID)
{
case IDC_NUMBER1:n="1";break;
case IDC_NUMBER2:n="2";break;
case IDC_NUMBER3:n="3";break;
case IDC_NUMBER4:n="4";break;
case IDC_NUMBER5:n="5";break;
case IDC_NUMBER6:n="6";break;
case IDC_NUMBER7:n="7";break;
case IDC_NUMBER8:n="8";break;
case IDC_NUMBER9:n="9";break;
case IDC_NUMBER0:n="0";break;
case IDC_NUMBER_A:n="A";break;
case IDC_NUMBER_B:n="B";break;
case IDC_NUMBER_C:n="C";break;
case IDC_NUMBER_D:n="D";break;
case IDC_NUMBER_E:n="E";break;
case IDC_NUMBER_F:n="F";break;
case IDC_NUMBERpoint:
if(!m_PointFlag) n="."; //如果输入一个点后,就不能再输入点
else n="";
if(m_Cnumber=="")
m_Cnumber="0"; //如果直接按小数点按钮,小数点前显示“0”
m_PointFlag=1;
break;
case IDC_NUMBER_PI:inpi=1;break;
default:break;
}
if(NumberState==1)
{
if(inpi==1)
{
number1=ExPi();
m_Cnumber.Format("%g",ExPi()); //输入pi时,对其单独响应并转换
UpdateData(FALSE);
}
else
{
if(m_flagexp==1) //当使用科学计数法时,对数字单独进行存储
{
m_Cnumber=m_Cnumber+n;
strexpshow=strexpshow+n;
number2=atof(strexpshow);
UpdateData(FALSE);
}
else
{
m_Cnumber=m_Cnumber+n;
if(m_NR==10) //若选择十进制,直接使用atof()函数转换
number1=atof(m_Cnumber);
else //否则,为其它进制时,都先转换为为十进制
{
number1=trans.Transform_to10(m_Cnumber,m_NR);
m_Cnumber=trans.Transform_to_2_8_16(number1,m_NR);} //再转换为相应的进制显示
UpdateData(FALSE);
}
}
}
else