工程文件下载:https://pan.baidu.com/s/118N1FUDjwqlsbZEwr5lJPQ
提取码:4399
一、下载c#
①登陆网址:https://visualstudio.microsoft.com/zh-hans/
下载community 2019,登录微软账户即可免费使用vstudio。
②打开安装程序,选择.NET桌面开发,VS就可以帮下载并配置好C#的运行环境。
二、从创建项目到了解C#
①打开VS启动窗口,点击创建新项目,找到windows窗体应用后,点击,然后为你的项目命名。
②从在设计视图中的工具箱一栏可以看到一系列窗体,这些是C#自带的控件。
这次做计算器主要用到了下面三个控件:
1.textbox:文本框控件
2.button:按钮控件
3.picture:图片控件(图片控件没有也可以,只是为了美观而加的)
③可以将控件拖到form中,用鼠标操作代替代码编写,但不建议以这种方式学习C#,最好的方法还是学习用代码处理布局,或者二者相结合。(曾经在书上看到的,其实我也没咋学 )
④属性栏让我们可以了解与更改窗口的属性。
⑤然后就可以开始编辑计算器了,这里对一些新的语句做些解释
textBox.Text
→获取文本框的内容,可以对其进行增添和修改,数据类型为string
Convert.ToDouble(String str)
→将String类型转为double类型
.toString()
→将数据类型转为String
三、成品展示
功能比较简单,按着手机计算器做的,这里就不赘述啦
主要在第四部分分析是如何实现的
四、代码部分及分析
//Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;F
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Calculator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = "0";//将文本框设置初始为0
}
double Leftnumber = 0;//运算符左边的数字
double Rightnumber=0;//运算符右边的数字
double Result;//运算结果
String Flag;//运算符
bool isDone = true; //用于判断所输入的运算符是否已经运算,true为已运算,当无运算符存储在Flag中时,也看作已运算
bool isEqual = false; //用于判断数字在buttonEqual_Click调用时,是输入给Leftnumber还是Rightnumber
private void iszero(object sender, EventArgs e)
{
if (textBox1.Text == "0"|| isEqual==true)
textBox1.Text = "";//把首位的零去掉
if (isEqual == true)
{
Leftnumber = 0;
Flag = null;//当经历过一次等于后将存储的运算符清除
isDone = true;
textBox2.Text = "";
}
isEqual = false;
}//用于数字按钮之前,主要功能是在输入数字和运算符之间实现过渡
private double Calculate(double a, string f, double b)
{
double c=0;
switch (f)
{
case ("+"):
c = a + b;
break;
case ("-"):
c = a - b;
break;
case ("*"):
c = a * b;
break;
case ("/"):
c = a / b;
break;
default:
break;
}
return c;
}//用于计算
//数字1到数字9的按钮:将数字输入文本框1
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text += '1';
}
private void button2_Click(object sender, EventArgs e)
{
textBox1.Text += '2';
}
private void button3_Click(object sender, EventArgs e)
{
textBox1.Text += '3';
}
private void button4_Click(object sender, EventArgs e)
{
textBox1.Text += "4";
}
private void button5_Click(object sender, EventArgs e)
{
textBox1.Text += "5";
}
private void button6_Click(object sender, EventArgs e)
{
textBox1.Text += "6";
}
private void button7_Click(object sender, EventArgs e)
{
textBox1.Text += "7";
}
private void button8_Click(object sender, EventArgs e)
{
textBox1.Text += "8";
}
private void button9_Click(object sender, EventArgs e)
{
textBox1.Text += "9";
}
private void Form1_Load(object sender, EventArgs e)
{}
private void button0_Click(object sender, EventArgs e)
{
textBox1.Text += "0";
}
private void buttonPoint_Click(object sender, EventArgs e)
{
textBox1.Text += ".";
}
private void buttonAdd_Click(object sender, EventArgs e)
{
isEqual = false;//置为false证明输入等号时,将文本框1的值给Rightnumber
if (isDone == false)//如果上一个输入的运算符未被使用
{
Rightnumber = Convert.ToDouble(textBox1.Text);//获取文本框信息
if (Rightnumber != 0)//因为textbox1在输入运算符后会置零,避免将初始的零纳入计算
Leftnumber = this.Calculate(Leftnumber, Flag, Rightnumber);
Flag = "+";
textBox2.Text = Leftnumber.ToString() + "+";
}
else
{
Leftnumber= Convert.ToDouble(textBox1.Text);
Flag = "+";
textBox2.Text = Leftnumber.ToString() + Flag;
}
textBox1.Text = "0";//将文本框1置0
isDone = false;
}
private void buttonMinus_Click(object sender, EventArgs e)
{
isEqual = false;
if (isDone == false)
{
Rightnumber = Convert.ToDouble(textBox1.Text);
if (Rightnumber != 0)
Leftnumber = this.Calculate(Leftnumber, Flag, Rightnumber);
Flag = "-";
textBox2.Text = Leftnumber.ToString() + "-";
}
else
{
Leftnumber = Convert.ToDouble(textBox1.Text);
Flag = "-";
textBox2.Text = Leftnumber.ToString() + Flag;
}
textBox1.Text = "0";
isDone = false;
}
private void buttonMultiply_Click(object sender, EventArgs e)
{
isEqual = false;
if (isDone == false)
{
Rightnumber = Convert.ToDouble(textBox1.Text);
if(Rightnumber!=0)
Leftnumber = this.Calculate(Leftnumber, Flag, Rightnumber);
Flag = "*";
textBox2.Text = Leftnumber.ToString() + "*";
}
else
{
Leftnumber = Convert.ToDouble(textBox1.Text);
Flag = "*";
textBox2.Text = Leftnumber.ToString() + Flag;
}
textBox1.Text = "0";
isDone = false;
}
private void buttonDivide_Click(object sender, EventArgs e)
{
isEqual = false;
if (isDone == false)
{
Rightnumber = Convert.ToDouble(textBox1.Text);
if (Flag == "/" && Rightnumber == 0)
{
textBox1.Text = "除数不能为0";
textBox2.Text = "";
return;
}
if (Rightnumber != 0)
Leftnumber = this.Calculate(Leftnumber, Flag, Rightnumber);
Flag = "/";
textBox2.Text = Leftnumber.ToString() + "/";
}
else
{
Leftnumber = Convert.ToDouble(textBox1.Text);
Flag = "/";
textBox2.Text = Leftnumber.ToString() + Flag;
}
textBox1.Text = "0";
isDone = false;
}
private void buttonEqual_Click(object sender, EventArgs e)
{
if (isEqual == false)
Rightnumber = Convert.ToDouble(textBox1.Text);
isEqual = true;
if (Flag != "/" || Rightnumber != 0)//当输入不违规时
{
if (Flag != null)
{
Result = this.Calculate(Leftnumber, Flag, Rightnumber);
textBox1.Text = Result.ToString();
textBox2.Text = Leftnumber.ToString() + Flag + Rightnumber.ToString() + "=";
}
else
{
Leftnumber = Convert.ToDouble(textBox1.Text);
textBox2.Text = Leftnumber.ToString() + "=";
}
}
else
{
textBox1.Text = "除数不能为0";
textBox2.Text = "";
}
isDone = true;//运算符标记为已使用
}
private void buttonC_Click(object sender, EventArgs e)
{
Leftnumber = 0;
Rightnumber = 0;
Flag = null;
isDone = true;
isEqual = false;
textBox1.Text = "0";
textBox2.Text = "";
}//功能C的实现
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void buttonCE_Click(object sender, EventArgs e)
{
if (Flag == null) Leftnumber = 0;
else
{
Rightnumber = 0;
if (isEqual == true)
{
Leftnumber = 0;
textBox2.Text = "";
}
}
textBox1.Text = "0";
}//功能CE的实现
private void buttonZF_Click(object sender, EventArgs e)
{
textBox1.Text =(-(Convert.ToDouble(textBox1.Text))).ToString();
}//功能相反数的实现
private void buttonPer_Click(object sender, EventArgs e)
{
textBox1.Text = ((Convert.ToDouble(textBox1.Text)*0.01)).ToString();
}//功能百分数的实现
private void pictureBox1_Click(object sender, EventArgs e)
{}
}
}
五、问题与思考
问题:
①:当在设计视图时调整控件时,在From.Designer.cs为按钮设置的活动会莫名其妙地消失
答:可能是由于太频繁地使用复制粘贴创建控件,导致Vs的自动填充出现异常,在改变控件时,将按钮恢复了默认设置,导致了活动的消失(吃代码 )。所以之后还是老老实实一个一个创建按钮,别想着偷懒复制,不然就要手动写布局了。
思考
①:我做的计算器并没有连续点等于,然后重复相加同一数字的功能。主要是为了保证可以在中途换运算符(例如把加换成减),这两个功能冲突了,所以就放弃做了这个功能,还没有想到如何在原有的基础上兼顾两者。在搜索过程中了解到可以使用SQL库计算结果,或许可以试试。
②:自己写的不光逻辑乱,格式也乱,后果就是沦为小型bug作坊,平时刷题还是刷的不够多,或者该多去看看网上大佬写的工程。