标准计算器C#实现 课程作业一
程序设计实践课程作业一
好久没用的blog了, 以后还是要把自己的东西整理一下,看到周围的人变得越来越强,我越来越想当只咸鱼,划划水的了
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 计算器 { public partial class Form1 : Form { Stack st = new Stack(); double num1,num2,temp; string Operator; //列表初始化 public Form1() { InitializeComponent(); textBox1.Text = ""; } //添加字符. private void Button_dian_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) textBox1.Text = "0."; else if (!textBox1.Text.Contains(".")) textBox1.Text += "."; } //添加字符0 private void Button7_Click(object sender, EventArgs e) { textBox1.Text += "0"; } //添加字符1 private void Button1_Click(object sender, EventArgs e) { textBox1.Text += "1"; } //添加字符2 private void Button2_Click(object sender, EventArgs e) { textBox1.Text += "2"; } //添加字符3 private void Button3_Click(object sender, EventArgs e) { textBox1.Text += "3"; } //添加字符4 private void Button4_Click(object sender, EventArgs e) { textBox1.Text += "4"; } //添加字符5 private void Button5_Click(object sender, EventArgs e) { textBox1.Text += "5"; } //添加字符6 private void Button6_Click(object sender, EventArgs e) { textBox1.Text += "6"; } //添加字符7 private void Button9_Click(object sender, EventArgs e) { textBox1.Text += "7"; } //添加字符8 private void Button10_Click(object sender, EventArgs e) { textBox1.Text += "8"; } //添加字符9 private void Button11_Click(object sender, EventArgs e) { textBox1.Text += "9"; } //加法运算 private void button_add_Click(object sender, EventArgs e) { try { st.Push(textBox1.Text); if(st.Count >= 3) { num1 = Convert.ToDouble(st.Pop()); Operator = Convert.ToString(st.Pop()); num2 = Convert.ToDouble(st.Pop()); //temp = num1 + num2; //st.Push(temp); if(Operator == "+") { temp = num1 + num2; st.Push(temp); } else if(Operator == "-") { temp = num2 - num1; st.Push(temp); } else if(Operator == "*") { temp = num2 * num1; st.Push(temp); } else if(Operator == "/") { temp = num2 / num1; st.Push(temp); } else if(Operator == "%") { temp = num2 % num1; st.Push(temp); } textBox1.Text = temp.ToString(); } st.Push("+"); textBox1.Text = ""; } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } } //减法运算 private void button_jian_Click(object sender, EventArgs e) { try { st.Push(textBox1.Text); if (st.Count >= 3) { num1 = Convert.ToDouble(st.Pop()); Operator = Convert.ToString(st.Pop()); num2 = Convert.ToDouble(st.Pop()); if (Operator == "+") { temp = num1 + num2; st.Push(temp); } else if (Operator == "-") { temp = num2 - num1; st.Push(temp); } else if (Operator == "*") { temp = num2 * num1; st.Push(temp); } else if (Operator == "/") { temp = num2 / num1; st.Push(temp); } else if (Operator == "%") { temp = num2 % num1; st.Push(temp); } textBox1.Text = temp.ToString(); } st.Push("-"); textBox1.Text = ""; } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } } //乘法运算 private void Button_cheng_Click(object sender, EventArgs e) { try { st.Push(textBox1.Text); if (st.Count >= 3) { num1 = Convert.ToDouble(st.Pop()); Operator = Convert.ToString(st.Pop()); num2 = Convert.ToDouble(st.Pop()); if (Operator == "+") { temp = num1 + num2; st.Push(temp); } else if (Operator == "-") { temp = num2 - num1; st.Push(temp); } else if (Operator == "*") { temp = num2 * num1; st.Push(temp); } else if (Operator == "/") { temp = num2 / num1; st.Push(temp); } else if (Operator == "%") { temp = num2 % num1; st.Push(temp); } textBox1.Text = temp.ToString(); } st.Push("*"); textBox1.Text = ""; } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } } //除法运算 private void Button_chu_Click(object sender, EventArgs e) { try { st.Push(textBox1.Text); if (st.Count >= 3) { num1 = Convert.ToDouble(st.Pop()); Operator = Convert.ToString(st.Pop()); num2 = Convert.ToDouble(st.Pop()); if (Operator == "+") { temp = num1 + num2; st.Push(temp); } else if (Operator == "-") { temp = num2 - num1; st.Push(temp); } else if (Operator == "*") { temp = num2 * num1; st.Push(temp); } else if (Operator == "/") { temp = num2 / num1; st.Push(temp); } else if (Operator == "%") { temp = num2 % num1; st.Push(temp); } textBox1.Text = temp.ToString(); } st.Push("/"); textBox1.Text = ""; } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } } //取余运算 private void button7_Click_1(object sender, EventArgs e) { try { st.Push(textBox1.Text); if (st.Count >= 3) { num1 = Convert.ToDouble(st.Pop()); Operator = Convert.ToString(st.Pop()); num2 = Convert.ToDouble(st.Pop()); if (Operator == "+") { temp = num1 + num2; st.Push(temp); } else if (Operator == "-") { temp = num2 - num1; st.Push(temp); } else if (Operator == "*") { temp = num2 * num1; st.Push(temp); } else if (Operator == "/") { temp = num2 / num1; st.Push(temp); } else if (Operator == "%") { temp = num2 % num1; st.Push(temp); } textBox1.Text = temp.ToString(); } st.Push("%"); textBox1.Text = ""; } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } } //等于 计算总表达式 private void Button16_Click(object sender, EventArgs e) { try { st.Push(textBox1.Text); if (st.Count >= 3) { num1 = Convert.ToDouble(st.Pop()); Operator = Convert.ToString(st.Pop()); num2 = Convert.ToDouble(st.Pop()); temp = num1 / num2; st.Push(temp); if (Operator == "+") { temp = num1 + num2; st.Push(temp); } else if (Operator == "-") { temp = num2 - num1; st.Push(temp); } else if (Operator == "*") { temp = num2 * num1; st.Push(temp); } else if (Operator == "/") { temp = num2 / num1; st.Push(temp); } else if (Operator == "%") { temp = num2 % num1; st.Push(temp); } textBox1.Text = temp.ToString(); } textBox1.Text = temp.ToString(); st.Clear(); } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } } //退格 private void button13_Click(object sender, EventArgs e) { try { textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1); } catch { MessageBox.Show("已经为空,无法再退格了", "错误", MessageBoxButtons.OK); } } //清空C private void button_c_Click(object sender, EventArgs e) { textBox1.Text = ""; st.Clear(); } //清除CE private void button_ce_Click(object sender, EventArgs e) { textBox1.Text = ""; } //求倒数 private void button12_Click(object sender, EventArgs e) { double t=0; try { t = Convert.ToDouble(textBox1.Text); } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } if(t != 0) { t = 1 / t; textBox1.Text = t.ToString(); } } //平方运算 private void button_pingfang_Click(object sender, EventArgs e) { double t = 0; try { t = Convert.ToDouble(textBox1.Text); } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } t = t * t; textBox1.Text = t.ToString(); } //开根运算 private void button8_Click(object sender, EventArgs e) { double t = 0; try { t = Convert.ToDouble(textBox1.Text); } catch (Exception) { MessageBox.Show("先输入数字才能进行此运算!", "错误", MessageBoxButtons.OK); } t = Math.Sqrt(t); textBox1.Text = t.ToString(); } private void Form1_Load(object sender, EventArgs e) { } } }
另外附上一个 中缀式 转 后缀式 的用栈解决的 代码(数据结构实验写的
#include <iostream> #include <stack> #include <string.h> #include <string> #include <cstdio> using namespace std; int sum = 0; char p[10000]; int isp(char c) { if(c == '#') return 0; if(c == '(') return 1; if(c == ')') return 6; if(c == '*'||c == '/'|| c == '%') return 5; if(c == '+' || c == '-') return 3; }//栈内 int icp(char c) { if(c == '#') return 0; if(c == '(') return 6; if(c == ')') return 1; if(c == '*'||c == '/'|| c == '%') return 4; if(c == '+' || c == '-') return 2; }//栈外 void zhuan(char *c ) { stack<char> s; char ch ='#',ch1,op; int i =0; s.push('#'); //ch = c[i]; while (!s.empty() && c[i] != '#') { if('0'<=c[i] && c[i] <='9') { //cout << c[i]<<endl; p[sum++]=c[i]; i++; while('0'<=c[i] && c[i] <='9'){ p[sum++]=c[i]; i++; } p[sum++]=' '; } else{ op=s.top(); if(isp(op) < icp(c[i])) { s.push(c[i]);i++; } else if(isp(op) > icp(c[i])){ s.pop();//cout << op; p[sum++]=op; p[sum++]=' '; } else{ s.pop(); if(op=='(') i++; } } } while (s.top() != '#') { if(s.top()=='('||s.top()==')') s.pop(); p[sum++]=s.top(); p[sum++]=' '; s.pop(); } p[sum++] = '\0'; } int deng(char *s) { stack<int>S; int a,b; int i =0; while (s[i]) { if(s[i]=='+') { a = S.top();S.pop(); b = S.top();S.pop(); S.push(a+b);i++; //cout<< a+b<<endl; } else if(s[i]=='-') { a = S.top();S.pop(); b = S.top();S.pop(); S.push(b-a);i++; //cout<< b-a<<endl; } else if(s[i]=='*') { a = S.top();S.pop(); b = S.top();S.pop(); S.push(b*a);i++; //cout<< b*a<<endl; } else if(s[i]=='/') { a = S.top();S.pop(); b = S.top();S.pop(); S.push(b/a);i++; //cout<< b/a<<endl; } else if(s[i]=='%') { a = S.top();S.pop(); b = S.top();S.pop(); S.push(b%a); i++;//cout<< b%a<<endl; } else { if(s[i]==' ') i++; else { int a = s[i]-'0'; i++; while('0'<=s[i] && s[i] <='9') { a=a*10+s[i]-'0'; i++; } //cout <<"a ==" <<a<<endl; S.push(a); } } //cout <<"i=="<< i<<endl; } cout << S.top()<<endl; } int main () { char c[1000]; while (cin >> c){ sum = 0; zhuan(c); //cout << p <<endl; deng(p); //cout << t<<endl; } return 0; }