用C# WinForm写的一个简单的计算器程序(可以输入复杂的表达式),欢迎大家指出Bug
来源:互联网 发布:淘宝默认好评是五星吗 编辑:程序博客网 时间:2024/05/21 00:46
本人是初学者,刚看到WinForm编程这一章,便自己动手写了一个计算器的程序当做练习。网上查过的大多数资料都说到了用逆波兰式计算,但是我试了下不太会,就用了自己的方法写了下试试,发现居然能用。
下面是界面截图:
(Expression:可以鼠标点击输入计算式,也可以直接粘贴进去)
(clear可以清除表达式,Backspace能删除表达式的最后一位)
以下是计算部分源码,代码比较冗余,没来得及修改
// -----------------------------------------------------------------------// <copyright file="Calculate.cs" company="">// TODO: Update copyright text.// </copyright>// -----------------------------------------------------------------------using System.Collections;namespace WinFormSamples{ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; /// <summary> /// TODO: Update summary. /// </summary> public class Calculate { public string GetResult(string str) { str = str + "+"; char[] expArry = str.ToCharArray(); string operations="()+-*/"; Hashtable signs =new Hashtable(); string[] numArry = str.Split('(',')','+','-','*','/'); //分割字符串,提取表达式中的数字 //定义操作符的优先级并存入哈希表 signs.Add("(",0); signs.Add(")",0); signs.Add("+",1); signs.Add("-",1); signs.Add("*",2); signs.Add("/",2); string[] resultArry = new string[99]; int resultIndex = 0; int numIndex = 0; for (int i = 0; i < str.Length - 1; i++) { if (operations.Contains(expArry[i])) { //遇到符号直接存入resultArry resultArry[resultIndex] = expArry[i].ToString(); resultIndex++; } else if (operations.Contains(expArry[i + 1])) { //连续非符号字符,从numArry取出一个元素放入resultArry while (numArry[numIndex] == "") //去除numArry中的空元素 { numIndex++; } resultArry[resultIndex] = numArry[numIndex]; numIndex++; resultIndex++; } } Stack<char> sign_stack = new Stack<char>();//定义符号栈 Stack<string> num_stack = new Stack<string>();//定义操作数栈 char calc_sign; try { for (int i = 0; i < resultIndex + 1; i++) { if (i == resultIndex) { if (sign_stack.Count != 0) { calc_sign = sign_stack.Pop(); Calc(ref sign_stack, ref num_stack,ref resultArry[i],ref calc_sign); while (num_stack.Count() > 1) //计算到栈中只剩一个操作数为止 { calc_sign = sign_stack.Pop(); Calc(ref sign_stack, ref num_stack, ref resultArry[i], ref calc_sign); } } } else if (operations.Contains(resultArry[i])) { if (resultArry[i] != "(") { if (sign_stack.Count() == 0 || Convert.ToInt32(signs[resultArry[i]]) > Convert.ToInt32(signs[sign_stack.Peek().ToString()])) //第一个操作符或者当前操作符优先级大于符号栈栈顶元素时,当前操作符入栈 { sign_stack.Push(resultArry[i].ToCharArray()[0]); } else { //否则,符号栈出栈操作符,数字栈出栈两个操作数进行运算 calc_sign = sign_stack.Pop(); Calc(ref sign_stack, ref num_stack,ref resultArry[i],ref calc_sign); } } else { sign_stack.Push(resultArry[i].ToCharArray()[0]); } } else { num_stack.Push(resultArry[i]); } } //结果出栈 return num_stack.Pop(); } catch (Exception e) { MessageBox.Show("表达式格式不正确,请检查! "+e.Message); return null; } } public string CalculateResult(string num1, string num2, char sign) { double result = 0; double oper_num1=Convert.ToDouble(num1); double oper_num2=Convert.ToDouble(num2); if (sign.ToString()=="+") { result = oper_num1 + oper_num2; } if (sign.ToString() == "-") { result = oper_num1 - oper_num2; } if (sign.ToString() == "*") { result = oper_num1 * oper_num2; } if (sign.ToString() == "/") { if(oper_num2!=0) result = oper_num1 / oper_num2; else MessageBox.Show("表达式中有除0操作,请检查!"); } return result.ToString(); } public void Calc(ref Stack<char> sign, ref Stack<string> num, ref string str, ref char calc_sign) { string num1 = ""; string num2 = ""; if (str == ")") { while (calc_sign != '(') { num2 = num.Pop(); num1 = num.Pop(); num.Push(CalculateResult(num1, num2, calc_sign)); calc_sign = sign.Pop(); } } else { num2 = num.Pop(); num1 = num.Pop(); num.Push(CalculateResult(num1, num2, calc_sign)); if (str!=null&&"()+-*/".Contains(str)) { sign.Push(str.ToCharArray()[0]); } } } }}
下面是窗体程序:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WinFormSamples{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { textBox1.Text += "1"; } private void button2_Click(object sender, EventArgs e) { textBox1.Text += "2"; } private void button3_Click(object sender, EventArgs e) { textBox1.Text += "3"; } private void button4_Click(object sender, EventArgs e) { textBox1.Text += "4"; } private void button5_Click(object sender, EventArgs e) { textBox1.Text += "5"; } private void button6_Click(object sender, EventArgs e) { textBox1.Text += "6"; } private void button7_Click(object sender, EventArgs e) { textBox1.Text += "7"; } private void button8_Click(object sender, EventArgs e) { textBox1.Text += "8"; } private void button9_Click(object sender, EventArgs e) { textBox1.Text += "9"; } private void button10_Click(object sender, EventArgs e) { textBox1.Text += "0"; } private void button11_Click(object sender, EventArgs e) { textBox1.Text += "*"; } private void button12_Click(object sender, EventArgs e) { textBox1.Text += "."; } private void button13_Click(object sender, EventArgs e) { textBox1.Text += "+"; } private void button14_Click(object sender, EventArgs e) { textBox1.Text += "-"; } private void button15_Click(object sender, EventArgs e) { textBox1.Text += "/"; } private void button16_Click(object sender, EventArgs e) { Calculate calculate = new Calculate(); textBox2.Text = calculate.GetResult(textBox1.Text); } private void button17_Click(object sender, EventArgs e) { textBox1.Text = ""; textBox2.Text = ""; } private void button18_Click(object sender, EventArgs e) { textBox1.Text += "("; } private void button19_Click(object sender, EventArgs e) { textBox1.Text += ")"; } private void button20_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length-1,1); } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { System.Diagnostics.Process.Start("chrome.exe", "http://msdn.microsoft.com/zh-cn/default.aspx"); } }}
1 0
- 用C# WinForm写的一个简单的计算器程序(可以输入复杂的表达式),欢迎大家指出Bug
- 自己用纯C写的一个简单的表达式科学计算器,欢迎大家观阅,以及疯狂的喷他喷他!!!!!!
- javascript写一个简单的计算器程序
- 一个计算器的代码,欢迎大家点评。
- 一个计算器的代码,欢迎大家点评
- 一个计算器的代码,欢迎大家点评
- 《数据结构》-写的一个后缀表达式计算器程序
- 用Flex写的一个简单计算器
- 用Flex写的一个简单计算器
- 用js写一个简单的计算器
- C#代码写的一个计算器的小程序
- 用android studio写一个简单并且bug奇多的计算器
- 一个可以计算表达式的计算器
- 一个简单的计算器程序
- 用32位汇编语言写的一个简单的表达式计算器
- 我的计算器. 用java实现的. 可以支持复杂表达式
- c写的一个简单的计算器
- JSP写的一个简单计算器
- BZOJ 3333 排队计划 树状数组+线段树
- Linux系统配置静态IP的方式
- 用C语言模拟面向对象
- ATL 控件 网页上的 安全提示
- svn的merge使用例子
- 用C# WinForm写的一个简单的计算器程序(可以输入复杂的表达式),欢迎大家指出Bug
- 如何设计两个系统之间的通信协议
- UIView设置圆角、边框和阴影
- 解读mysql主从配置及其原理分析(Master-Slave)
- hdu1098 -数论
- SVM中的数学和算法
- 一个逗比 程序员 web前端的理想!
- How to build a nice Hamburger Button transition in Swift(做动画可以参考下)
- 怎样完整的转换PDF格式文件