VC版计算器(豪华界面)

一.  功能需求: 

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类:对各种按键进行说明的类:

dddd

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
  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值