计算器的制作需要实现一下几个功能:加减乘除,连续计算,重复计算。
加减乘除就是简单的二元运算,连续计算就是不使用等号连续进行几次二元运算,重复计算就是进行一次二元运算之后再次单击等号可以将之前的运算再次进行一次。
由于是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 };
Calculate.h
其中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 }
Btn1_Click
然后是正负号的代码。。。。
这是要在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 };
PAN
退格
通过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 }
Clear
到此简易计算器的所有代码都已经写完了,完成啦!
C++.NET的简易计算器的制作