基于MFC的科学计算器

Pubertyly

发布日期: 2021-01-15 19:04:09 浏览量: 288
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 题目要求

基于MFC对话框编写一个在功能上功能尽量模拟windows操作系统中的科学计算器应用程序,系统界面不做强制要求。

2 功能需求

  • 实现加法、减法、乘法、除法、取余、三角函数、对数、指数、退格、清零等操作

  • 实现进制转换

  • 实现小数的计算

3.1 系统模块

3.2 系统业务处理流程

4 详细设计

根据功能模块,详细论述设计过程,给出主要实现代码。

开发工具选择Visual Studio 2015。

在VS2015做的MFC程序在VC++6.0环境下可能无法直接运行,不过懒得再做了。。就先这样吧

先照实验指导书上的做一个简易版的计算器,然后添加了功能。

先摆放控件,最开始的版本时候没有截图 这里贴一个最终版的。

相对于实验指导书的版本增加了以下功能

  • 小数点 这个很简单,用CString 来实现,因为输入进去的是字符串类型,后面强转一下转换成double就OK

  • Sin,cos,tan等函数 这个也没啥难度,都是math函数库给出的,直接用就行

  • 进制转换 这里用了itoa函数

  • () 这个要用栈 做一个中缀表达式求值 做了挺长时间没做出来,等以后再添加吧

摆放好控件后,添加消息响应函数

数字键以及小数点 并没有一一添加消息响应函数,而是用了一个宏

+-*/等功能也是用了宏,后面加的cos,sin等等就直接添加消息响应函数了,因为两种方法代码量差不多。

具体的步骤:

给显示框关联一个变量CString类型

这个是显示计算过程结果的:

在对话框类定义中加 math头文件

在对话类中声明以下函数,定义以下变量

第一个是标准构造函数;第二,三个分别是数字键,操作符键的消息响应函数;第四个是计算函数;

下面是要用到的变量,在这里把他们初始化一下

然后在对话框类实现文件添加如下代码。。

代码挺多不截图了复制过来吧

  1. void CCalculatorDlg:: OnNumberKey(UINT nID)
  2. {
  3. CString n;
  4. switch(nID)
  5. {
  6. case IDC_NUMBER1:n="1"; break;
  7. case IDC_NUMBER2:n="2"; break;
  8. case IDC_NUMBER3:n="3"; break;
  9. case IDC_NUMBER4:n="4"; break;
  10. case IDC_NUMBER5:n="5"; break;
  11. case IDC_NUMBER6:n="6"; break;
  12. case IDC_NUMBER7:n="7"; break;
  13. case IDC_NUMBER8:n="8"; break;
  14. case IDC_NUMBER9:n="9"; break;
  15. case IDC_NUMBER0:n="0"; break;
  16. case IDC_NUMBER_PlusMinus:n = "."; break;
  17. }
  18. if(NumberState==1)
  19. {
  20. m_Cnumber=m_Cnumber+n;
  21. number1=atof(m_Cnumber);
  22. UpdateData(FALSE);
  23. }
  24. else
  25. {
  26. m_Cnumber=m_Cnumber+n;
  27. number2=atof(m_Cnumber);
  28. UpdateData(FALSE);
  29. }
  30. }
  31. void CCalculatorDlg::OnOperationKey(UINT nID)
  32. {
  33. m_number = atof(m_Cnumber);
  34. switch (nID)
  35. {
  36. case IDC_NUMBER_BackSpace:
  37. m_number = (int)m_number / 10;
  38. if (NumberState == 1)
  39. number1 = m_number;
  40. else
  41. number2 = m_number;
  42. m_Cnumber.Format("%g", m_number);
  43. UpdateData(FALSE);
  44. if (m_number == 0)
  45. {
  46. m_Cnumber == "";
  47. }
  48. break;
  49. case IDC_NUMBER_Divide:cal();
  50. OperationState = 1;
  51. m_number = 0;
  52. m_Cnumber = "";
  53. NumberState = 2;
  54. break;
  55. case IDC_NUMBER_Multiply:cal();
  56. OperationState = 2;
  57. m_number = 0;
  58. m_Cnumber = "";
  59. NumberState = 2;
  60. break;
  61. case IDC_NUMBER_Add:cal();
  62. OperationState = 3;
  63. m_number = 0;
  64. m_Cnumber = "";
  65. NumberState = 2;
  66. break;
  67. case IDC_NUMBER_Substract:cal();
  68. OperationState = 4;
  69. m_number = 0;
  70. m_Cnumber = "";
  71. NumberState = 2;
  72. break;
  73. case IDC_NUMBER_Clear:
  74. number1 = number2 = m_number = 0;
  75. m_Cnumber.Format("%g", m_number);
  76. UpdateData(FALSE);
  77. m_Cnumber = "";
  78. NumberState = 1;
  79. break;
  80. case IDC_NUMBER_Sqrt:
  81. number1 = m_number = sqrt(number1);
  82. m_Cnumber.Format("%g", m_number);
  83. UpdateData(FALSE);
  84. break;
  85. case IDC_NUMBER_Derivative:
  86. number1 = m_number = (double)1 / number1;
  87. m_Cnumber.Format("%g", m_number);
  88. UpdateData(FALSE);
  89. break;
  90. case IDC_NUMBER_Equal:
  91. cal();
  92. break;
  93. }
  94. }
  95. void CCalculatorDlg::cal()
  96. {
  97. m_number = atof(m_Cnumber);
  98. switch (OperationState)
  99. {
  100. case 1:
  101. m_number = (double)number1 / number2;
  102. NumberState = 1;
  103. m_Cnumber.Format("%g", m_number);
  104. UpdateData(FALSE);
  105. break;
  106. case 2:
  107. m_number = (double)number1 * number2;
  108. NumberState = 1;
  109. m_Cnumber.Format("%g", m_number);
  110. UpdateData(FALSE);
  111. break;
  112. case 3:
  113. m_number = (double)number1 + number2;
  114. NumberState = 1;
  115. m_Cnumber.Format("%g", m_number);
  116. UpdateData(FALSE);
  117. break;
  118. case 4:
  119. m_number = (double)number1 - number2;
  120. NumberState = 1;
  121. m_Cnumber.Format("%g", m_number);
  122. UpdateData(FALSE);
  123. break;
  124. }
  125. number1 = m_number;
  126. OperationState = 0;
  127. }

然后后面加的那些功能我都是分别添加消息响应函数实现的

Sin,cos什么的不写了 直接调用就行

  1. void CCalculatorDlg::OnBnClickedCos()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. m_number = atof(m_Cnumber);
  5. m_number = cos(m_number*3.1415926 / 180);
  6. m_Cnumber.Format("%g", m_number);
  7. UpdateData(FALSE);
  8. }

进制转换 ,用了itoa这个函数:

  1. char*itoa(int value,char*string,int radix);

int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等

有这个函数就简单多了。。

  1. void CCalculatorDlg::OnBnClickedBinary()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. UpdateData(TRUE);
  5. int i, j, m;
  6. int sum;
  7. sum = 0;
  8. m = m_Cnumber.GetLength();
  9. for (i = m - 1; i >= 0; i--)
  10. sum += ((m_Cnumber[i] - '0') << (m - i - 1));//<<是位操作符,
  11. // 表示二进制数向左移位
  12. if (sum == 0)
  13. {
  14. m_Cnumber = "0";
  15. }
  16. int a[10];
  17. i = 0;
  18. while (sum)
  19. {
  20. a[i] = sum % 8;//这部分是十进制转八进制的。
  21. sum /= 8;
  22. i++;
  23. }
  24. char str[10];
  25. m_Cnumber = "";
  26. for (j = i - 1; j >= 0; j--)
  27. m_Cnumber += itoa(a[j], str, 10);//itoa(a[j],str,10),将这个八进制转换成十进制存在str 中
  28. UpdateData(FALSE);
  29. }

然后增加一个作者菜单,右键插入

在对话框头文件中声明CMenu 变量,然后在OnInitDialog()中添加代码:

  1. m_Menu.LoadMenu(IDR_MENU1);
  2. SetMenu(&m_Menu);

然后插入模态对话框

添加类

然后给菜单添加消息响应函数

  1. CDlg2 dlg;
  2. dlg.DoModal();

并且添加头文件

这里出了点bug(我知道怎么弄了)

我先是给主菜单(我也不知道叫什么东西)添加了消息响应函数,但是添加好之后点击还是没反应,然后我只好给它下一级又做了个菜单。

还有个问题,不知道什么时候把关闭键弄没了,最后又加了一个,然后就做完了。

5 测试与实现

()括号是拿来装门面的。

6 总结

没什么技术含量的开发过程。。虽然说是科学计算器,其实也就是添加了阶乘,三角函数之类的。。都是在math库里有的,非常简单。

复杂一点的进制转化 用了扩展函数itoa也很简单。

我是非常想做一个支持括号优先级的计算器的。。不过遇到了很多问题,用栈实现中缀表达式求值这个我会写,可是我不知道怎样调用数据阿,是创建一个新的普通类,还是把这些写在哪,如果放在一个类里,不同类之间的数据是怎样调用的阿?

还有就是我是在机房做了一部分,然后在笔记本上完成的,做软件的时候我的电脑不兼容VC6,所以是在VS2015上完成的,但是在VS2015上做的MFC程序在VC6上好像是不能直接运行的。后来有时间弄了一下可以运行VC6了,但是也不想再在VC6上做一遍了。最好做出来有点不伦不类的。

个人觉得做一些完整的软件从中能学习到很多的东西,了解自己的不足,同时也让我们更加的熟悉MFC框架的使用。

//重做

//重做的时候才发现第一次发的竟然是没带菜单的。。不知道为什么应该是发错了吧,但是找不到带菜单的了。。。然后又加了一下,会跟跟实验报告写的代码有一点出入。。

第一次做的时候想加括号功能,但是不会,后来在CSDN和github上找到了好多学长的代码。。有功能特别全的。。有界面酷炫的。。而且都是他们大二时候做的。。感觉真是厉害阿。。!真佩服啊。。。

我也想做一个像下面这样酷炫的。。但是真不会阿。。

上传的附件 cloud_download 基于MFC的科学计算器.7z ( 446.69kb, 4次下载 )
error_outline 下载需要6点积分

发送私信

走在一起是缘分,一起在走是幸福

21
文章数
20
评论数
最近文章
eject