1、用C#做的一个计算器用C#做的一个计算器1. usingSystem; 2. usingSystem.Collections.Generic; 3. usingSystem.Linq; 4. usingSystem.Text; 5. usingSystem.Windows; 6. usingSystem.Windows.Controls; 7. usingSystem.Windows.Data; 8. usingSystem.Windows.Documents; 9. usingSystem.Windows.Input; 10. usingSystem.Windows.Media; 11. u
2、singSystem.Windows.Media.Imaging; 12. usingSystem.Windows.Navigation; 13. usingSystem.Windows.Shapes; 14. 15. /*/ 16. /*本程序供学习交流*/ 17. /*作者:张骏南*/ 18. /*最后修改时间*/ 19. /*2011年3月10日21:03:17*/ 20. /*/ 21. 22. namespace计算器 23. 24. / 25. /Window1.xaml的交互逻辑 26. / 27. publicpartialclassWindow1:Window 28. 29.
3、 privatedecimalm_dInput=0; 30. privateintm_iPlaces=0;/数的小数位 31. privateboolm_bIsFloat=false;/标记是否为小数 32. privateboolm_bNewInt=false;/标记是否需要新的整数数 33. privateboolm_bNewFloat=false;/标记是否需要新的浮点数 34. privateCounterm_ctrCounter=newCounter(); 35. privateAboutBox1m_abtAboutBox; 36. 37. publicWindow1() 38. 3
4、9. InitializeComponent(); 40. updateInput(); 41. 42. 43. /输入更新结果显示框 44. privatevoidupdateInput() 45. 46. /去除末尾多于的0 47. if(m_bIsFloat) 48. while(m_dInput.ToString().LastIndexOf(0)=m_dInput.ToString().Length-1&m_dInput!=0) 49. m_dInput=Convert.ToDecimal(m_dInput.ToString().Substring(0,m_dInput.ToStrin
5、g().Length-1); 50. 51. /在结果加上适当的小数点 52. if(m_dInput.ToString().Contains(.) 53. result.Text=m_dInput.ToString(); 54. else 55. result.Text=m_dInput.ToString()+.; 56. 57. 58. #region数字单击事件 59. 60. privatevoidnumber_Click(objectsender,RoutedEventArgse) 61. 62. newNumber(); 63. /确定是哪个数字被点击 64. intinputNu
6、mber=Convert.ToInt32(sender.ToString().Substring(32,1); 65. try 66. 67. if(m_dInput=0) 68. 69. if(m_bIsFloat) 70. m_dInput+=(decimal)Math.Pow(10,-+m_iPlaces)*inputNumber;/求inputNumber乘10的-N次方 71. else 72. m_dInput=m_dInput*10+inputNumber; 73. 74. else 75. 76. if(m_bIsFloat) 77. m_dInput-=(decimal)Ma
7、th.Pow(10,-+m_iPlaces)*inputNumber;/求inputNumber乘10的-N次方 78. else 79. m_dInput=m_dInput*10-inputNumber; 80. 81. 82. catch(OverflowException) 83. 84. MessageBox.Show(输入的数超过范围,请重新输入,错误); 85. buttonCE_Click(sender,e); 86. 87. updateInput(); 88. 89. 90. /数字0的处理与其他不同 91. privatevoidnumber0_Click(objectse
8、nder,RoutedEventArgse) 92. 93. if(m_bNewInt) 94. 95. m_dInput=0; 96. m_iPlaces=0; 97. if(m_bNewFloat) 98. 99. m_bIsFloat=true; 100. m_bNewFloat=false; 101. result.Text=0.; 102. 103. else 104. m_bIsFloat=false; 105. m_bNewInt=false; 106. 107. try 108. 109. if(m_bIsFloat) 110. 111. +m_iPlaces; 112. re
9、sult.Text+=0; 113. 114. else 115. 116. m_dInput*=10; 117. updateInput(); 118. 119. 120. catch(OverflowException) 121. 122. MessageBox.Show(输入的数超过范围,请重新输入,错误); 123. buttonCE_Click(sender,e); 124. 125. 126. 127. #endregion 128. 129. /即将输入新的数 130. privatevoidnewNumber() 131. 132. if(m_bNewInt) 133. 134
10、. m_dInput=0; 135. m_iPlaces=0; 136. if(m_bNewFloat) 137. m_bNewFloat=false; 138. else 139. m_bIsFloat=false; 140. m_bNewInt=false; 141. 142. 143. 144. #region操作按钮的单击事件 145. 146. /清空按钮被单击,清空当前输入数据 147. privatevoidbuttonCE_Click(objectsender,RoutedEventArgse) 148. 149. m_bIsFloat=false; 150. m_bNewFl
11、oat=false; 151. m_bNewInt=false; 152. m_dInput=0; 153. m_iPlaces=0; 154. updateInput(); 155. 156. 157. /退位操作 158. privatevoidbuttonBackspace_Click(objectsender,RoutedEventArgse) 159. 160. /不需要新的数 161. m_bNewInt=false; 162. 163. /判断是否为小数并退一位 164. if(m_bIsFloat) 165. -m_iPlaces; 166. 167. if(m_dInput.
12、ToString().Length=1) 168. 169. if(m_bIsFloat) 170. 171. if(m_iPlaces=-1) 172. 173. m_bIsFloat=false; 174. m_iPlaces=0; 175. 176. else 177. 178. result.Text=result.Text.Substring(0,result.Text.Length-1); 179. m_dInput=Convert.ToDecimal(result.Text); 180. return;/结束方法 181. 182. 183. else 184. m_dInput
13、=0; 185. 186. else 187. 188. if(m_bIsFloat) 189. 190. if(m_iPlaces=-1) 191. 192. m_bIsFloat=false; 193. m_iPlaces=0; 194. 195. else 196. 197. result.Text=result.Text.Substring(0,result.Text.Length-1); 198. m_dInput=Convert.ToDecimal(result.Text); 199. return; 200. 201. 202. else 203. m_dInput=Conver
14、t.ToDecimal(m_dInput.ToString().Substring(0,m_dInput.ToString().Length-1); 204. 205. updateInput(); 206. 207. 208. /负号按钮被单击事件 209. privatevoidminus_Click(objectsender,RoutedEventArgse) 210. 211. m_dInput=-m_dInput; 212. updateInput(); 213. 214. 215. /小数点按钮被单击事件 216. privatevoiddot_Click(objectsender
15、,RoutedEventArgse) 217. 218. if(m_bNewInt) 219. m_bNewFloat=true; 220. m_bIsFloat=true; 221. 222. 223. /重启按钮被单击事件,计算器重启 224. privatevoidbuttonC_Click(objectsender,RoutedEventArgse) 225. 226. m_ctrCounter.Clear(); 227. buttonCE_Click(sender,e); 228. 229. 230. /开方按钮被单击事件 231. privatevoidoperatorSqrt_C
16、lick(objectsender,RoutedEventArgse) 232. 233. m_dInput=(decimal)Math.Sqrt(double)m_dInput); 234. updateInput(); 235. m_bNewInt=true; 236. 237. 238. /除法按钮被单击事件 239. privatevoidoperatorDivide_Click(objectsender,RoutedEventArgse) 240. 241. m_dInput=m_ctrCounter.Calculate(m_dInput,Counter.Operators.Divi
17、de); 242. updateInput(); 243. m_bNewInt=true; 244. 245. 246. /乘法按钮被单击事件 247. privatevoidoperatorMultiply_Click(objectsender,RoutedEventArgse) 248. 249. m_dInput=m_ctrCounter.Calculate(m_dInput,Counter.Operators.Multiply); 250. updateInput(); 251. m_bNewInt=true; 252. 253. 254. /减法按钮被单击事件 255. privat
18、evoidoperatorSubtract_Click(objectsender,RoutedEventArgse) 256. 257. m_dInput=m_ctrCounter.Calculate(m_dInput,Counter.Operators.Subtract); 258. updateInput(); 259. m_bNewInt=true; 260. 261. 262. /加法按钮被单击事件 263. privatevoidoperatorAdd_Click(objectsender,RoutedEventArgse) 264. 265. m_dInput=m_ctrCount
19、er.Calculate(m_dInput,Counter.Operators.Add); 266. updateInput(); 267. m_bNewInt=true; 268. 269. 270. /倒数按钮被单击事件 271. privatevoidoperatorReciprocal_Click(objectsender,RoutedEventArgse) 272. 273. if(m_dInput=0) 274. 275. MessageBox.Show(操作有误,错误); 276. buttonC_Click(sender,e); 277. return; 278. 279. /
20、是否为小数 280. if(m_dInput.ToString().Contains(.) 281. 282. m_dInput=1/m_dInput; 283. Counter.ChangeToInteger(refm_dInput); 284. 285. else 286. m_dInput=1/m_dInput; 287. updateInput(); 288. m_bNewInt=true; 289. 290. 291. /等号按钮被单击事件 292. privatevoidoperatorAssign_Click(objectsender,RoutedEventArgse) 293.
21、 294. m_dInput=m_ctrCounter.Calculate(m_dInput,Counter.Operators.Assign); 295. updateInput(); 296. m_bNewInt=true;/需要新的数 297. 298. 299. #endregion 300. 301. /打开关于对话框 302. privatevoidopenAboutBox(objectsender,RoutedEventArgse) 303. 304. m_abtAboutBox=newAboutBox1(); 305. m_abtAboutBox.ShowDialog(); 3
22、06. 307. 308. 计算器类Code:1. usingSystem; 2. usingSystem.Collections.Generic; 3. usingSystem.Linq; 4. usingSystem.Text; 5. usingSystem.Windows; 6. 7. /*/ 8. /*本程序供学习交流*/ 9. /*作者:张骏南*/ 10. /*最后修改时间*/ 11. /*2011年3月10日21:03:17*/ 12. /*/ 13. 14. namespace计算器 15. 16. publicclassCounter 17. 18. privatedecima
23、lm_dCacheOfAdd=0;/缓存,存储被加数 19. privatedecimalm_dCacheOfMultiply=0;/缓存,存储被乘数 20. privatedecimalm_dResult=0;/显示结果 21. privateintm_iAddNumber=0;/加法次数 22. privateintm_iSubtractNumber=0;/减法次数 23. privateintm_iMultiplyNumber=0;/乘法次数 24. privateintm_iDivideNumber=0;/除法次数 25. 26. /操作符,分别是:加、减、乘、除、赋值 27. pub
24、licenumOperators:byteAdd,Subtract,Multiply,Divide,Assign; 28. 29. /将精度很高的小数修改为其对应相等的整数 30. publicstaticvoidChangeToInteger(refdecimalvalue) 31. 32. decimalfloor=decimal.Floor(value); 33. decimalceiling=decimal.Ceiling(value); 34. /差值小于10e-6则视为相等 35. if(value-floor=(decimal)10e-6) 36. value=floor; 37. if(ceiling-value0) 69. 70. result+=operatorMultiply(input); 71. input=0;/input被使用后,不能再被使用,这里很重要! 72. -m_iMultiplyNumber; 73. 74. /判断之前是否有除号 75. if(m_iDivideNumber0)