計算器的制作需要實現一下幾個功能:加減乘除,連續計算,重復計算。
加減乘除就是簡單的二元運算,連續計算就是不使用等號連續進行幾次二元運算,重復計算就是進行一次二元運算之后再次單擊等號可以將之前的運算再次進行一次。
由於是C++的窗體程序,所以先設計出窗體的界面。界面如下。
需要注意的是,上面的兩個顯示框用的是TextBox,其余的均是Button。
窗體的FormBorderStyle屬性應改成FixedSingle或其他,不能用None,這個樣子計算器窗體框的大小就是固定不可變的。
MaximizeBox屬性應該改成False,將最大化按鈕屏蔽。
TextBox的ReadOnly屬性應為True(應為我所做的這個計算器是不支持鍵盤輸入的,要是進行鍵盤輸入的擴展就不必做這一步)。
窗體界面設計好了,接下來就要寫代碼了。
我創建了一個新類叫做Calculate,用來存儲需要計算的數據,如計算的兩個數,某個鍵是否已經按過,當前的運算符號是什么,計算方法等。
創建方法如下:單擊項目->添加類->C++類,然后按照提示操作就行。
假如類以后在VS里面會自動在頭文件處生成一個Calculate.h文件,在源文件處生成Calculate.cpp文件,Calculate.cpp文件里面只有一個構造函數的定義,Calculate.h里面是類的具體定義,兩個代碼如下:
Calculate.cpp
1 #include "stdafx.h" 2 #include "Calculate.h" 3 4 5 Calculate::Calculate() 6 { 7 Num1 = 0; 8 Num2 = 0; 9 m_sig = '+'; 10 m_Own = '+'; 11 m_equal = false; 12 m_Calcu = false; 13 }
Calculate.h

1 #pragma once 2 ref class Calculate 3 { 4 private: 5 double Num1,Num2; 6 char m_sig,m_Own; 7 bool m_equal,m_Calcu;//確定等號,計算符號是否已經按下。 8 public: 9 Calculate(); 10 char getItself(){ return m_Own; } 11 bool getEqual() { return m_equal; } 12 bool getCalcu() { return m_Calcu; } 13 double getNum2() { return Num2; } 14 double getNum1() { return Num1; } 15 void setNum1(double i) { Num1 = i; } 16 void setNum2(double i) { Num2 = i; } 17 void setSig(char x) { m_sig = x; } 18 void setItself(char x) { m_Own = x; } 19 void setEqual(bool x) { m_equal = x; } 20 void setCalcu(bool x) { m_Calcu = x; } 21 void Calcu(){ 22 if (m_sig == '+'){ 23 Num1 = Num1 + Num2; 24 } 25 else if (m_sig == '-') Num1 = Num1 - Num2; 26 else if (m_sig == '*') Num1 = Num1 * Num2; 27 else{ 28 if (Num2 == 0) Num1 = 0; 29 else Num1 = Num1 / Num2; 30 } 31 } 32 bool compareNum(char x){ 33 if (x == '1', x == '2', x == '3', x == '4', x == '5', x == '6', x == '7', x == '8', x == '9', x == '0') 34 return true; 35 else return false; 36 } 37 void Calculation_Clear(){ 38 Num1 = Num2 = 0; 39 m_sig = '+'; 40 } 41 };
其中Num1是用來存上一個數字,Num2是用來存本數字,m_sig是用來存當前的運行符號。
由於整個過程是利用TextBox來實現數據的顯示的,所以所有的數據也就直接放到TextBox上,通過Convert::ToString和Convert::ToDouble來實現String和Double之間的轉換。
由於Calculate只是一個類,需要實例化,調用這個類是在Form1.h里面(也就是我們寫控件的代碼的時候)調用的,所以我們的實例化是與添加的控件一起實例化的,語句是這樣的:
private:Calculate ^c = gcnew Calculate();
位置在Form1的析構函數代碼后面開始初始化控件的代碼的最上面。
接下來的代碼里面的textBox1均指的是下面那個textBox,textBox2是上面那個
Button_Click的代碼,由於0~9,以及小數點符號.都是只提供數據,所以他們的代碼基本都是相同的,這里只貼一個:
第一個判斷條件是針對以下情況:
已經進行完了一次計算,也就是按下了等於號,再繼續按數字鍵,這樣會直接開始一次新的計算過程。所以會調用c->Calculation_Clear()函數將c中的東西全部清零
第二個是正常情況直接在Box1后面補上一個數字。
第三個是如果box1里面沒有任何數字就直接讓box1->text = "1"。

1 private: System::Void btn1_Click(System::Object^ sender, System::EventArgs^ e) { 2 if (c->getEqual() == true || c->getCalcu() == false) { 3 c->Calculation_Clear(); 4 textBox1->Text = ""; 5 c->setEqual(false); 6 } 7 if (textBox1->Text != "0") textBox1->Text += btn1->Text; 8 else textBox1->Text = btn1->Text; 9 }
然后是正負號的代碼。。。。
這是要在box1->text的最前面加上負號或者將負號給去掉
第一個判定條件是判定其是否為負數,是的話將最前面的負號去掉,用的是remove方法。
第二個是假如box1里面什么都沒有或者只有0就不做任何改變。
第三個是在最前面加上+號

1 private: System::Void btn_PAN_Click(System::Object^ sender, System::EventArgs^ e) { 2 if (textBox1->Text->StartsWith("-")){ 3 c->setItself('+'); 4 int found = textBox1->Text->IndexOf("-"); 5 textBox1->Text = textBox1->Text->Remove(0, 1); 6 }//如果是負數 7 else if (textBox1->Text == "0") return; 8 else { 9 c->setItself('-'); 10 textBox1->Text = "-" + textBox1->Text; 11 }//如果是正數 12 };
退格
通過remove box1的最后一個元素實現
1 private: System::Void btn_Back_Click(System::Object^ sender, System::EventArgs^ e) { 2 if (textBox1->Text == "") return; 3 textBox1->Text = textBox1->Text->Remove(textBox1->Text->Length- 1, 1); 4 }
等號
判定1:無數據,跳過
判定2:跳過
判定3:box1,box2均有數據,按照第一次計算運行Calculate方法
判定4:重復上一次的計算

1 private: System::Void btn_equal_Click(System::Object^ sender, System::EventArgs^ e) { 2 if (textBox1->Text == ""&&textBox2->Text == "") return; 3 else if (textBox1->Text == ""&& c->getEqual() == false) return; 4 else if (textBox1->Text != ""&&textBox2->Text != "") { 5 c->setNum2(Convert::ToDouble(textBox1->Text)); 6 c->Calcu(); 7 textBox1->Text = Convert::ToString(c->getNum1()); 8 textBox2->Text = ""; 9 c->setEqual(true); 10 } 11 else if (textBox1->Text != ""&&textBox2->Text == ""&&c->getEqual() == true){ 12 c->Calcu(); 13 textBox1->Text = Convert::ToString(c->getNum1()); 14 } 15 }
加減乘除四個按鈕,因為都是一個模子出來的,所以只貼一個
判定1:兩個textbox均無數據,跳過
判定2:第一次按下運算負號,box1中的數字放到box2中,並加上運算符號
判定3:以按下運算符號,但是沒有輸入下一個數字,再次按下,將原本的符號改成當前按下的運算符號
判定4:將原本的計算完成,結果作為這次計算的第一個數,計算符號為本次按下的計算符號

1 private: System::Void btn_plus_Click(System::Object^ sender, System::EventArgs^ e) { 2 if (textBox1->Text == ""&&textBox2->Text == "") return; 3 else if (textBox1->Text != ""&&textBox2->Text == ""){ 4 textBox2->Text = textBox1->Text + "+"; 5 c->setSig('+'); 6 c->setCalcu(true); 7 c->setNum1(Convert::ToDouble(textBox1->Text)); 8 textBox1->Text = ""; 9 } 10 else if (textBox1->Text == ""&&textBox2->Text != ""){ 11 textBox2->Text = textBox2->Text->Remove(textBox2->Text->Length - 1, 1); 12 textBox2->Text += "+"; 13 c->setSig('+'); 14 } 15 else{ 16 c->setNum2(Convert::ToDouble(textBox1->Text)); 17 c->Calcu(); 18 textBox2->Text = Convert::ToString(c->getNum1()) + "+"; 19 textBox1->Text = ""; 20 c->setSig('+'); 21 } 22 }
歸零
將所有數據歸零

1 private: System::Void btn_Clear_Click(System::Object^ sender, System::EventArgs^ e) { 2 textBox1->Text = ""; 3 textBox2->Text = ""; 4 textBox1->Text = ""; 5 c->setEqual(false); 6 c->setCalcu(false); 7 8 }
到此簡易計算器的所有代碼都已經寫完了,完成啦!