using System;this
using System.Collections.Generic;spa
using System.ComponentModel;orm
using System.Data;事件
using System.Drawing;input
using System.Linq;string
using System.Text;it
using System.Windows.Forms;io
namespace Caculatorast
{form
public partial class Form1 : Form
{
private Boolean clean = false,num1flag=false,simpleflag=true,num2flag=false;
private simplecal scalculator = new simplecal();
private char calchar;
private double num1 = 0, num2 = 0, ans = 0;
private Stack<char> soptr=new Stack<char>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (simpleflag == false)
{
if (textBox1.Text == "0" || textBox1.Text == "-0" || clean == true)
{
textBox1.Text = null;
clean = false;
}
textBox1.Text += sender.ToString().Substring(sender.ToString().LastIndexOf(" ") + 1, 1);
}
else
{
if (textBox1.Text == "0" || textBox1.Text == "-0" || clean == true)
{
textBox1.Text = null;
clean = false;
}
textBox1.Text += sender.ToString().Substring(sender.ToString().LastIndexOf(" ") + 1, 1);
}
}
private void button2_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button3_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button4_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button5_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button6_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button7_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button8_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button9_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button10_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button11_Click(object sender, EventArgs e)
{
if (textBox1.Text.Substring(0, 1).Equals("-"))
{
textBox1.Text = textBox1.Text.Substring(1, textBox1.Text.Length - 1);
}
else {
textBox1.Text = "-" + textBox1.Text;
}
}// +/-
private void button12_Click(object sender, EventArgs e) //小數點
{
if (textBox1.Text.Contains("."))
{ }
else
{
textBox1.Text+=".";
}
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
//this.textBox1.Text = e.KeyChar.ToString();
switch ((Keys)e.KeyChar)
{
case Keys.D1: button1.PerformClick(); break;
case Keys.D2: button2.PerformClick(); break;
case Keys.D3: button3.PerformClick(); break;
case Keys.D4: button4.PerformClick(); break;
case Keys.D5: button5.PerformClick(); break;
case Keys.D6: button6.PerformClick(); break;
case Keys.D7: button7.PerformClick(); break;
case Keys.D8: button8.PerformClick(); break;
case Keys.D9: button9.PerformClick(); break;
case Keys.D0: button10.PerformClick(); break;
case (Keys)'.': button12.PerformClick(); break;
case (Keys)'+': button13.PerformClick(); break;
case (Keys)'-': button14.PerformClick(); break;
case (Keys)'*': button15.PerformClick(); break;
case (Keys)'/': button16.PerformClick(); break;
case Keys.Escape: button22.PerformClick(); break;
case Keys.Back: button21.PerformClick(); break;
case Keys.Enter:button20.PerformClick(); break;
default:break;
}
} //鍵盤事件
private void button13_Click(object sender, EventArgs e)//+
{
if (simpleflag == false)
{
button1_Click(sender, e);
}
else
{
input();
if (num1flag == true && num2flag == true)
{
cal();
}
Setzero();
button1_Click(sender, e); //顯示+號
calchar = this.textBox1.Text[0];//記錄運算符號
clean = true;//清屏標誌爲true
}
}
private void button21_Click(object sender, EventArgs e)
{
if (this.textBox1.Text.Length==1)
{
this.textBox1.Text = "0";
}
else
{
try
{
this.textBox1.Text = this.textBox1.Text.Substring(0, this.textBox1.Text.Length - 1);
}
catch(Exception)
{
}
}
} // ←
private void button22_Click(object sender, EventArgs e)// cancel
{
reset();
Setzero();
}
private void button14_Click(object sender, EventArgs e)
{
button13_Click(sender, e);
}
private void button15_Click(object sender, EventArgs e)
{
button13_Click(sender, e);
}
private void button16_Click(object sender, EventArgs e)
{
button13_Click(sender, e);
}
private void button17_Click(object sender, EventArgs e)
{
input();
Setzero();
button1_Click(sender, e); //顯示運算符號
calchar = this.textBox1.Text[0];//記錄運算符號
cal2();
this.textBox1.Text = num1.ToString();
reset();
clean = true;//清屏標誌爲true
}
private void button18_Click(object sender, EventArgs e)
{
button17_Click(sender, e);
}
private void button19_Click(object sender, EventArgs e)
{
button13_Click(sender, e);
}
private void button20_Click(object sender, EventArgs e)// =
{
if (simpleflag == false)
{
this.textBox1.Text += '#';
num1 = cal3();
}
else
{
input();
if (num1flag == true && num2flag == true)
{
cal();
}//計算並將結果給予num1
}
this.textBox1.Text = num1.ToString();
clean = true;
reset();
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
simpleflag = true;
button23.Visible = false;
button24.Visible = false;
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
simpleflag = false;
button23.Visible = true;
button24.Visible = true;
}
private void reset()
{
num1 = 0;
num2 = 0;
num1flag = false;
num2flag = false;
}// num1 num2 重置
private void Setzero()
{
this.textBox1.Text = "0";
}//顯示0
private void input()
{
if (num1flag == false)
{
try
{
num1 = Convert.ToDouble(this.textBox1.Text);
num1flag = true;
}
catch (Exception) { }
}
else
{
try
{
num2 = Convert.ToDouble(this.textBox1.Text);
num2flag=true;
}
catch (Exception) { }
}
} //輸入num1或num2;
private void cal()
{
num1 = scalculator.ans(num1, num2, calchar);
num2flag=false;
}
private void cal2()
{
num1 = scalculator.ans(num1,calchar);
num2flag = false;
}
private double cal3()//科學運算
{
Stack<char> OPTR=new Stack<char>();//運算符
Stack<double> OPND = new Stack<double>();//操做數
OPTR.Push('#');
char calchar,c=this.textBox1.Text[0];
double a = 0, b = 0;
int i = 0, j = 0;
while(c!='#'||OPTR.Peek()!='#')
{
c = this.textBox1.Text[i];
if (!In(c))//是數字
{
if(i==0||In(this.textBox1.Text[i-1]))//上一個符號是運算符或i=0;
{
j = i;
}
if (In(this.textBox1.Text[i + 1]))//下一個符號是運算符
{
OPND.Push(Convert.ToDouble(this.textBox1.Text.Substring(j, i-j+1)));
}
i++;
}
else
{
if(Precede(OPTR.Peek(),c)=='?'){this.textBox1.Text="表達式錯誤";break;}
switch (Precede(OPTR.Peek(), this.textBox1.Text[i]))
{
case'<':
OPTR.Push(c);
i++;
break;
case'=':
OPTR.Pop();
i++;
break;
case'>':
calchar = OPTR.Pop();
b = OPND.Pop();
a=OPND.Pop();
OPND.Push(scalculator.ans(a, b, calchar));
break;
}
}
}
return OPND.Peek();
}
private char Precede(char a, char b)
{
switch (a)
{
case '+':
case '-':
if (b == '+' || b == '-' || b == ')' || b == '#') return '>';
if (b == '*' || b == '/' || b == '(') return '<';
break;
case '*':
case '/':
if (b == '+' || b == '-' || b == '*' || b == '/' || b == ')' || b == '#') return '>';
if (b == '(') return '<';
break;
case '(':
if (b == '+' || b == '-' || b == '*' || b == '/' || b == '(') return '<';
if (b == ')') return '=';
break;
case ')':
if (b == '+' || b == '-' || b == '*' || b == '/' || b == ')'||b=='#') return '<';
break;
case '#':
if(b == '+' || b == '-' || b == '*' || b == '/' || b == '(') return'<';
if(b=='#')return '=';
break;
default: return '?'; break;
}
return '?';
}
private Boolean In(char a)//是運算符返回true
{
if (a.Equals('+') || a.Equals('-') || a.Equals('*') || a.Equals('/') || a.Equals('(') || a.Equals(')') || a.Equals('#')) { return true; }
return false;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
button20.Focus(); //text改變,焦點鎖定爲「=」
}
private void button23_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void button24_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}