作业基本信息
|
这个作业属于哪个课程 | https://bbs.csdn.net/forums/ssynkqtd-05 |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/topics/617294583 |
这个作业的目标 | 完成一个具有可视化界面的计算器。 |
– | – |
其他参考文献 | … |
Gitcode项目地址
https://gitcode.net/2301_80008761/1
项目展示
Form1 2023-09-29 22-37-59
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 25 |
• Estimate | • 估计这个任务需要多少时间 | 15 | 15 |
Development | 开发 | 100 | 150 |
• Analysis | • 需求分析 (包括学习新技术) | 500 | 550 |
• Design Spec | • 生成设计文档 | 40 | 40 |
• Design Review | • 设计复审 | 25 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 45 | 50 |
• Design | • 具体设计 | 80 | 95 |
• Coding | • 具体编码 | 200 | 220 |
• Code Review | • 代码复审 | 60 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 75 | 75 |
• Test Repor | • 测试报告 | 30 | 30 |
• Size Measurement | • 计算工作量 | 20 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1300 | 1450 |
解题思路描述
问题1
如何实现可视化:通过网上学习了解,发现VisualStdio 的Windows窗体应用可以有外部按钮来实现输入和输出的功能。进一步学习后,学会使用相关按键工具。
问题2
如何使用C#的相关函数来实现计算器的功能:通过查询资料,学会使用相关函数,并处理其内部的联系和逻辑关系
接口设计和实现过程
Windows窗体应用的工具箱可以快捷实现按钮,这次设计主要使用了里面的Button、Testbox,直接拖到设计里的Form1。双击按钮可以跳到各个按钮的函数。 可以在属性里设置按键的名称,文本,实现0~9,加减乘除等功能的显示。
关键代码展示
1、0~9,加减乘除所有按键的显示:
通过父类和子类的转换,实现统一显示
public void Btn1_Click(object sender, EventArgs e)
{
//Console.WriteLine(Btn1.Text);//
Button btn = (Button)sender;//父类转子类
Console.WriteLine(btn.Text);
string txt = btn.Text;
public void Form1_Load(object sender, EventArgs e)
{
this.Btn2.Click += new System.EventHandler(this.Btn1_Click);
this.Btn3.Click += new System.EventHandler(this.Btn1_Click);
this.Btn4.Click += new System.EventHandler(this.Btn1_Click);
this.Btn5.Click += new System.EventHandler(this.Btn1_Click);
this.Btn6.Click += new System.EventHandler(this.Btn1_Click);
this.Btn7.Click += new System.EventHandler(this.Btn1_Click);
this.Btn8.Click += new System.EventHandler(this.Btn1_Click);
this.Btn9.Click += new System.EventHandler(this.Btn1_Click);
this.Btn0.Click += new System.EventHandler(this.Btn1_Click);
this.BtnDot.Click += new System.EventHandler(this.Btn1_Click);
this.BtnEqual.Click += new System.EventHandler(this.Btn1_Click);
this.BtnAdd.Click += new System.EventHandler(this.Btn1_Click);
this.BtnSub.Click += new System.EventHandler(this.Btn1_Click);
this.BtnMul.Click += new System.EventHandler(this.Btn1_Click);
this.BtnDiv.Click += new System.EventHandler(this.Btn1_Click);
this.BtnCe.Click += new System.EventHandler(this.Btn1_Click);
this.BtnDelete.Click += new System.EventHandler(this.Btn1_Click);
this.BtnPi.Click += new System.EventHandler(this.Btn1_Click);
this.BtnSqrt.Click += new System.EventHandler(this.Btn1_Click);
this.Btnsin.Click += new System.EventHandler(this.Btn1_Click);
this.Btncos.Click += new System.EventHandler(this.Btn1_Click);
this.Btntan.Click += new System.EventHandler(this.Btn1_Click);
this.BtnLog.Click += new System.EventHandler(this.Btn1_Click);
this.BtnPow.Click += new System.EventHandler(this.Btn1_Click);
}
2、各个功能的实现(下面为几个例子):
首先判断运算符号,然后判断输入是否正确(try语句),才能进行运算,用运算符号以前的文本作为操作数1,运算符号以后的文本作为操作数2,等于之后,结果存在操作数1。除了加减乘除以外的具体运算的实现用到一些函数。
public void Btn1_Click(object sender, EventArgs e)
{
//Console.WriteLine(Btn1.Text);//
Button btn = (Button)sender;
Console.WriteLine(btn.Text);
string txt = btn.Text;
if (txt == "+" || txt == "-" || txt == "*" || txt == "/" || txt == "log" || txt == "^" || txt == "sin" || txt == "cos" || txt == "tan" || txt == "√" || txt == "π" )
{
if(txt == "+" || txt == "-" || txt == "*" || txt == "/" || txt == "log" || txt == "^")
{
try
{
num1 = double.Parse(textBox1.Text);
}
catch (Exception)
{
//不是数字
MessageBox.Show("无法计算", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
textBox2.Text += textBox1.Text;
textBox1.Text = "";
Op = txt;
textBox2.Text += txt;
}
else if (txt == "=")
{
textBox2.Text += textBox1.Text;
textBox2.Text += "=";
if(Op == "+" || Op == "-" || Op == "*" || Op == "/"|| Op == "log"||Op == "^")
{
num2 = double.Parse(textBox1.Text);
if (Op == "+")
{
textBox1.Text = (num1 + num2).ToString();
}
else if (Op == "-")
{
textBox1.Text = (num1 - num2).ToString();
}
else if (Op == "*")
{
textBox1.Text = (num1 * num2).ToString();
}
else if (Op == "/")
{
if (num2 != 0)
{
textBox1.Text = (num1 / num2).ToString();
}
else
{
textBox1.Text = "除数不能为零!";
return;
}
}
else if (Op == "log")
{
textBox1.Text = (Math.Log(num2, num1).ToString());
}
性能改进
1、添加相关判断操作数是否为空,防止一些报错:
if (textBox1.Text != "")
{
string tempStr = textBox1.Text;
tempStr = tempStr.Substring(0, tempStr.Length - 1);
textBox1.Text = tempStr;
}
2、添加try和catch用于处理异常
try
{
num1 = double.Parse(textBox1.Text);
}
catch (Exception)
{
//不是数字
MessageBox.Show("无法计算", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
单元测试
单元测试代码:
public class Form1Tests
{
[TestMethod()]
public void TestMethod2()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btn6, null);
form.Btn1_Click(form.BtnSub, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("6-4=2", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod1()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btn6, null);
form.Btn1_Click(form.BtnAdd, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("6+4=10", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod3()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btn6, null);
form.Btn1_Click(form.BtnMul, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("6*4=24", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod4()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btn6, null);
form.Btn1_Click(form.BtnDiv, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("6/4=1.5", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod5()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btn6, null);
form.Btn1_Click(form.BtnPow, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("6^4=1296", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod6()
{
Form1 form = new Form1();
form.Btn1_Click(form.BtnSqrt, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("√4=2", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod7()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btn2, null);
form.Btn1_Click(form.BtnLog, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("2log4=2", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod8()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btntan, null);
form.Btn1_Click(form.Btn4, null);
form.Btn1_Click(form.Btn5, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("tan45=1", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod9()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btncos, null);
form.Btn1_Click(form.Btn0, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("cos0=1", form.textBox2.Text);
}
[TestMethod()]
public void TestMethod10()
{
Form1 form = new Form1();
form.Btn1_Click(form.Btnsin, null);
form.Btn1_Click(form.Btn9, null);
form.Btn1_Click(form.Btn0, null);
form.Btn1_Click(form.BtnEqual, null);
Assert.AreEqual("sin90=1", form.textBox2.Text);
}
测试结果:
异常处理
我用C# 中的异常处理关键字try和catch来捕获和处理这些异常。如果输入不正确就会报错:
1、类似于+前面没有数字,就会报错;
2、除数为零也会报错。
心得体会
1、通过这次软件工程作业,我初步学会了C#的一些简单应用,对可视化应用的编写理解有了雏形。我在计算器的编写过程中对输入输出的思考和对功能实现函数的思考都让我对软件有了新的挑战热情。
2、括号的混合运算对我来说还是很困难,由于时间原因,没有添加这一功能。这让我感到很大的遗憾,同时也提醒了我应该如何进一步的完善开发的时间安排和软件功能方面的安排。
3、C#的异常语句提醒了我对异常情况的警醒。在没有加入trty 语句之前,我的漏洞较多,需要我不断的去形成好的习惯。
总之,这次作业给我带来了很大的挑战和启发,让我对软件开发有了更深的理解。