**
数据库第二次实验课—C#简易计算器
**
前言
最近对于可视化制作确实有兴趣,但是因为转专业的原因,没有学习Java,看着情况估计要等到大三再补了,C也是在学习的路上,越来越觉得学无止境,hhhh,这节课正好满足我对可视化制作的体验感,还是很爽的,用比较少的语句就可以实现一个可以用的小软件。下面我将从前期准备和写作过程来进行阐述。
一、开发工具的安装。
- 首先说一下使用软件:Visual studio 2019版本。
- 因为Vs的功能强大以至于完整安装需要内存比较大,所以我只是安装了C++的那一小部分工具,以至于没有找到合适的建立选项。在这一步系统会提示你是否需要继续安装其他工具。
**-如上图所示,我们只需要选择前两列的就可以了。- 在安装后我们选择新建立一个项目,选择C#中的Windows里面的控制台,然后选择第一个,结果如下所示。**
建立项目出现的一些问题
:
- 在建立完项目后我出现了如图所示的界面
-
我们可以看到,没有可以操作的空间,此时需要我们手动打开工具箱。
-
我们首先点击项目,找到工具箱然后点击就可以在左侧生成一个悬浮窗,如下图所示。
- 本次实验我只用到两个小工具,分别是
Button和Textbox,其实Button是一个可以点击的小安就,Textbox就是一个小的显示条(注意显示的是字符串)。
**
二、写作过程简单的介绍
**
首先来看一下我们生成的界面
- 功能介绍
**
- 首先我们看到有两个显示框,最上面的我们显示的是一切输入的数字,以便后续检查,第二个显示框表示的是计算的结果,在这里我们要说明的是,这个计算器是仿照电脑自带计算器写的,也就是如果出现1+1+1的情况,在第二个加号出现之前就是会把前两个数字已经计算好的。
- AC:作用相当于清零,使用后会恢复为初始状态。****
- C的作用:为删除一个数字,比如你输入-1111,你发现多输入了一个1,那么只要C一下就可以变成-111.
- -/+:是变负数,比如你输入了11,作用完就可以变为-11。
**
- 写作代码及其思路
**
using System;
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 CalculatorAPP
{
public partial class 计算器 : Form
{
public 计算器()
{
InitializeComponent();
}
String flag,endflag="0";
Double leftnum, rightnum, result,Start=0, againinput=0;
private void button1_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//1部分
textBox1.Text += "1";
textBox6.Text += "1";
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button10_Click(object sender, EventArgs e)
{
textBox1.Text += ".";//.部分
textBox6.Text += ".";
}
private void button11_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//0部分
if (againinput==1) againinput = 0;
textBox1.Text += "0";
textBox6.Text += "0";
}
private void button12_Click(object sender, EventArgs e)
{
textBox1.Text = "";//ac部分
textBox6.Text = "";
flag = "";
endflag = "0";
leftnum = rightnum = result = last = 0;
Start = againinput = 0;
}
private void button2_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//2部分
if (againinput == 1) againinput = 0;
textBox1.Text += "2";
textBox6.Text += "2";
}
private void button3_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//3部分
if (againinput == 1) againinput = 0;
textBox1.Text += "3";
textBox6.Text += "3";
}
private void button4_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//4部分
if (againinput == 1) againinput = 0;
textBox1.Text += "4";
textBox6.Text += "4";
}
private void button5_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//5部分
if (againinput == 1) againinput = 0;
textBox1.Text += "5";
textBox6.Text += "5";
}
private void button6_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//6部分
if (againinput == 1) againinput = 0;
textBox1.Text += "6";
textBox6.Text += "6";
}
private void button7_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//7部分
if (againinput == 1) againinput = 0;
textBox1.Text += "7";
textBox6.Text += "7";
}
private void button8_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//8部分
if (againinput == 1) againinput = 0;
textBox1.Text += "8";
textBox6.Text += "8";
}
private void button14_Click(object sender, EventArgs e)
{
textBox1.Text += "-";//-部分
if (endflag=="1")
{
rightnum = Convert.ToDouble(textBox6.Text);
if (flag == "+")
{
result = leftnum + rightnum;
}
if (flag == "-")
{
result = leftnum - rightnum;
}
if (flag == "*")
{
result = leftnum * rightnum;
}
if (flag == "/")
{
result = leftnum / rightnum;
}
leftnum = result;
textBox6.Text = Convert.ToString(result);
Start = 1;
}
else
{
leftnum = Convert.ToDouble(textBox6.Text);
textBox6.Text = "";
endflag = "1";
}
flag = "-";
}
private void button19_Click(object sender, EventArgs e)
{
string a = "-";//-+/部分
int temp = textBox1.Text.Length;
textBox1.Text = textBox1.Text.Substring(0,temp- textBox6.Text.Length);
a += textBox6.Text;
textBox6.Text = a;
textBox1.Text += a;
}
private void button18_Click(object sender, EventArgs e)
{
int temp = textBox1.Text.Length;//c部分
int temp1 = textBox6.Text.Length;
textBox1.Text = textBox1.Text.Substring(0, temp-1);
textBox6.Text = textBox6.Text.Substring(0, temp1-1);
}
private void button17_Click(object sender, EventArgs e)
{
rightnum = Convert.ToDouble(textBox6.Text);//=部分
if (flag == "+")
{
result = leftnum + rightnum;
}
if (flag == "-")
{
result = leftnum - rightnum;
}
if (flag == "*")
{
result = leftnum * rightnum;
}
if (flag == "/")
{
result = leftnum / rightnum;
}
leftnum = result;
textBox6.Text = Convert.ToString(result);
endflag = "0";
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button15_Click(object sender, EventArgs e)
{
textBox1.Text += "*";//*部分
if (endflag == "1")
{
rightnum = Convert.ToDouble(textBox6.Text);
if (flag == "+")
{
result = leftnum + rightnum;
}
if (flag == "-")
{
result = leftnum - rightnum;
}
if (flag == "*")
{
result = leftnum * rightnum;
}
if (flag == "/")
{
result = leftnum / rightnum;
}
leftnum = result;
textBox6.Text = Convert.ToString(result);
Start = 1;
}
else
{
leftnum = Convert.ToDouble(textBox6.Text);
textBox6.Text = "";
endflag = "1";
}
flag = "*";
}
private void button16_Click(object sender, EventArgs e)
{
textBox1.Text += "/";///部分
if (endflag == "1")
{
rightnum = Convert.ToDouble(textBox6.Text);
if (flag == "+")
{
result = leftnum + rightnum;
}
if (flag == "-")
{
result = leftnum - rightnum;
}
if (flag == "*")
{
result = leftnum * rightnum;
}
if (flag == "/")
{
result = leftnum / rightnum;
}
leftnum = result;
textBox6.Text = Convert.ToString(result);
Start = 1;
}
else
{
leftnum = Convert.ToDouble(textBox6.Text);
textBox6.Text = "";
endflag = "1";
}
flag = "/";
}
private void button9_Click(object sender, EventArgs e)
{
if (Start == 1) { textBox6.Text = ""; Start = 0; }//9部分
if (againinput == 1) againinput = 0;
textBox1.Text += "9";
textBox6.Text += "9";
}
private void button13_Click(object sender, EventArgs e)
{
//+部分
textBox1.Text += "+";
if (endflag == "1")
{
rightnum = Convert.ToDouble(textBox6.Text);
if (flag == "+")
{
result = leftnum + rightnum;
}
if (flag == "-")
{
result = leftnum - rightnum;
}
if (flag == "*")
{
result = leftnum * rightnum;
}
if (flag == "/")
{
result = leftnum / rightnum;
}
leftnum = result;
textBox6.Text = Convert.ToString(result);
Start = 1;
}
else
{
leftnum = Convert.ToDouble(textBox6.Text);
textBox6.Text = "";
endflag = "1";
}
flag = "+";
}
}
}
-
由于代码重复程度是比较高,我就不再切开展示了,因为对于四则运算来说,他们在本计算器的实现原理相同,所以我们就挑+的运算来展示。
-
+的运算:对于+法来说,如果我们要实现可以边输入边计算的话,首先我们可以考虑一个明显的分界线—第一次输入。这时候我定义了一个全局变量endflag,如果我们是第一次输入的话,那么就将目前已经输入好的数字保存到leftnum中,此时我们要介绍一个函数Convert.Todouble(string)—这个函数可以实现在C#中的强制转换。在保存完后,因为我们第二行的显示框是需要实时更新的,此时我们就需要把第二个操作框的显示改为“”—空。如果我们已经是第二次输入了,那么此时的endflag就是1,我们就可以先判断前面的运算符号是什么—保存在flag全局变量中。
-
数字的设置:**在这里因为显示框是string类型,所以我们的输入只需要string+=你要输入的数字,就可以实现输入操作。
-
“AC”的设置”:没什么好说的,直接恢复出厂设置。
-
“C”的设置:在这里我采取的是截取字符串的方式,用substring函数来对两个显示框的值进行截取,只截取从0-倒数第一位,这里我们再说一下函数用法吧substring(a,b)—从a开始截取,截取b个单位。
-
“-+/的设置”:这个我采用的方法其实和"C设置"是类似的操作,不再赘述。
-
“=的设置”:在这里要说一下,当我们点击=除了出现计算结果和第二个显示框清零外,我们还需要考虑到其实这就相当于恢复到半个出厂状态,因为此时我们如果输入“+”,前面的运算符已经都运算完毕,所以我们此时就相当于第一次时输入的操作,所以此时我们需要把endflag给设置一下。
**
三、总结
**
- 总的来说其实这个就是采用了比较简单的循环来实现的,虽然代码行数比较长,但是有很多重复部分(四舍五入权当个思路简洁代码吧!)。
- 因为能力有限和时间问题,这个计算器的健壮性并不是很好,可能(应该是肯定)会有输入错误情况出现,因为并没有加入太多的判断来限制输入(好好输入肯定是没有问题的)。
- 经过本次课也真正体会到做东西的乐趣,希望以后能接触到更多新鲜好玩的事情。
- 最后感叹一句为什么David老师什么都会- -。**