目录
1.界面展示
2.PSP表格
3.解题思路分析
4.重要代码的展示以及核心思路
5.程序性能改进
6.单元测试展示
7.心路历程以及收获
8.项目代码链接
这个作业属于哪个课程 | <班级的链接> |
---|---|
这个作业要求在哪里 | 软件工程实践第一次作业-CSDN社区 |
这个作业的目标 | 完成一个具有可视化界面的计算器 |
其他参考文献 | 无 |
20230927_163842
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 600 | 800 |
• Analysis | • 需求分析 (包括学习新技术) | 40 | 60 |
• Design Spec | • 生成设计文档 | 60 | 70 |
• Design Review | • 设计复审 | 5 | 15 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
• Design | • 具体设计 | 30 | 60 |
• Coding | • 具体编码 | 240 | 200 |
• Code Review | • 代码复审 | 60 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 120 | 120 |
• Test Repor | • 测试报告 | 20 | 20 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 90 | 70 |
合计 | 1345 | 1520 |
本题目要求实现具有一个可视化界面的计算器
1.编程语言选择:我选用的是C/C++语言,写完之后感觉利用python或者Java语言的话实现起来会效果更好,但是因为是第一次做这种项目,时间成本可能会不够
2.界面设计:此次我采用的是Visual Studio里面自带的windows窗体应用进行设计,设计的页面非常的普通。
3.然后利用math库里面的各种函数来实现运算的操作,因为本人页面设计不是很好,加上比较菜,时间比较紧张,只实现了一些基本的功能(三角,反三角,ln,加,减,乘,除,归零,次方,幂,开方),并且为了能够更好的进行字符串的处理,我会把数字输入完之后接着在接下来按加减乘除等按键操作后将之前输入的数字在可视化页面进行“隐藏”。
1.首先,考虑到如果需要对所有的按键进行设计会略显麻烦,因此我想到可以把所有的操作集中在一个按键(我采用的是按键button13)里面的函数去编写代码,然后在Form1_Load这个类函数中为其余的按键去设置初始点击事件,回溯button13_Click,这样能省去不少的代码量
private void Form1_Load(object sender, EventArgs e)
{
this.button1.Click += new System.EventHandler(this.button13_Click);
this.button2.Click += new System.EventHandler(this.button13_Click);
this.button3.Click += new System.EventHandler(this.button13_Click);
this.button4.Click += new System.EventHandler(this.button13_Click);
this.button5.Click += new System.EventHandler(this.button13_Click);
this.button6.Click += new System.EventHandler(this.button13_Click);
this.button7.Click += new System.EventHandler(this.button13_Click);
this.button8.Click += new System.EventHandler(this.button13_Click);
this.button9.Click += new System.EventHandler(this.button13_Click);
this.button10.Click += new System.EventHandler(this.button13_Click);
this.button11.Click += new System.EventHandler(this.button13_Click);
this.button12.Click += new System.EventHandler(this.button13_Click);
this.button14.Click += new System.EventHandler(this.button13_Click);
this.button15.Click += new System.EventHandler(this.button13_Click);
this.button16.Click += new System.EventHandler(this.button13_Click);
this.button17.Click += new System.EventHandler(this.button13_Click);
this.button18.Click += new System.EventHandler(this.button13_Click);
this.button19.Click += new System.EventHandler(this.button13_Click);
this.button20.Click += new System.EventHandler(this.button13_Click);
this.button21.Click += new System.EventHandler(this.button13_Click);
this.button22.Click += new System.EventHandler(this.button13_Click);
this.button23.Click += new System.EventHandler(this.button13_Click);
this.button24.Click += new System.EventHandler(this.button13_Click);
this.button25.Click += new System.EventHandler(this.button13_Click);
this.button26.Click += new System.EventHandler(this.button13_Click);
this.button27.Click += new System.EventHandler(this.button13_Click);
this.button28.Click += new System.EventHandler(this.button13_Click);
this.button29.Click += new System.EventHandler(this.button13_Click);
this.button30.Click += new System.EventHandler(this.button13_Click);
}
2.紧接着我们只需要在button13_Click这个函数里面编写所需要实现的功能即可,首先我会先定义两个全局变量num1和op,用于记录第一个输入的数字以及符号
double num1 = 0;//记录第一个数字
string op;//记录符号
然后利用button函数获取输入的键的字符(b即是获取的字符),然后对字符进行判断,然后采取该有的操作
Button a = (Button)sender;
string b = a.Text;
3.接着我们对输入的按键进行判断,我主要分为五类,第一类是双操作符,例如+,-,×,÷,x^y(实现次方和幂),第二类是等于号,第三类是一些功能性按键,例如归零(CE),删除最后一个输入的数字(C)等,第四类是只需要一个数字即可完成的运算,例如sin,cos,ln,x^2等,第五类则是0,1,2,3,4,...这样的数字,然后将这些类分别用if和else if隔开进行操作
4.特别注意的是π和e虽然在数学看来是一个常数,但是不能够按照平常的数(0,1,2,...)进行处理,因此需要单独进行处理和判断
if(textBox1.Text== "π")
{
num1 = Math.PI;
}
else if(textBox1.Text=="e")
{
num1 = Math.E;
}
在进行三角函数的计算的时候,我会碰到当对180进行sin操作时会出现以下情况
因此我对其进行优化,运用math库里面的round函数,保留小数点后两位小数
else if(b=="sin")
{
double num6 = 0;
if (textBox1.Text == "π")
{
num6 = Math.PI;
}
if (textBox1.Text == "e")
{
num6 = Math.E;
}
if(textBox1.Text != "π"&& textBox1.Text != "e")
{
string c = textBox1.Text;
num6 = double.Parse(c);
}
double num7 = Math.Sin(num6 * Math.PI / 180.0);
double num8 = Math.Round(num7, 2);
textBox1.Text = num8.ToString();
}
最后的结果就变成了这样
其余的三角函数也是进行同样的操作
我总共测试了九个功能,单元测试的代码如下所示
namespace CalculatorUnitTest
{
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void TestAddition()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "5";
calculator.button13_Click(calculator.button10, null);
calculator.button13_Click(calculator.button20, null);
//calculator.textBox1.Text = "3";
calculator.button13_Click(calculator.button15, null);
calculator.button13_Click(calculator.button19, null);
Assert.AreEqual("8", calculator.textBox1.Text);
}
[TestMethod]
public void TestSubtraction()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "10";
calculator.button13_Click(calculator.button13, null);
calculator.button13_Click(calculator.button17, null);
calculator.button13_Click(calculator.button16, null);
//calculator.textBox1.Text = "4";
calculator.button13_Click(calculator.button9, null);
calculator.button13_Click(calculator.button19, null);
Assert.AreEqual("6", calculator.textBox1.Text);
}
[TestMethod]
public void TestMultiplication()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "6";
calculator.button13_Click(calculator.button11, null);
calculator.button13_Click(calculator.button12, null);
//calculator.textBox1.Text = "7";
calculator.button13_Click(calculator.button5, null);
calculator.button13_Click(calculator.button19, null);
Assert.AreEqual("42", calculator.textBox1.Text);
}
[TestMethod]
public void TestDivision()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "20";
calculator.button13_Click(calculator.button14, null);
calculator.button13_Click(calculator.button17, null);
//
// calculator.textBox1.Text = "5";
calculator.button13_Click(calculator.button8, null);
calculator.button13_Click(calculator.button10, null);
calculator.button13_Click(calculator.button19, null);
Assert.AreEqual("4", calculator.textBox1.Text);
}
[TestMethod]
public void TestSine()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "30";
calculator.button13_Click(calculator.button15, null);
calculator.button13_Click(calculator.button17, null);
calculator.button13_Click(calculator.button21, null);
Assert.AreEqual("0.5", calculator.textBox1.Text);
}
[TestMethod]
public void Testln()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "e";
calculator.button13_Click(calculator.button30, null);
calculator.button13_Click(calculator.button25, null);
Assert.AreEqual("1", calculator.textBox1.Text);
}
[TestMethod]
public void Testsqrt()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "9";
calculator.button13_Click(calculator.button7, null);
calculator.button13_Click(calculator.button29, null);
Assert.AreEqual("3", calculator.textBox1.Text);
}
[TestMethod]
public void Testcifang()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "3";
calculator.button13_Click(calculator.button15, null);
calculator.button13_Click(calculator.button24, null);
//calculator.textBox1.Text = "3";
calculator.button13_Click(calculator.button15, null);
calculator.button13_Click(calculator.button19, null);
Assert.AreEqual("27", calculator.textBox1.Text);
}
[TestMethod]
public void Testpifang()
{
Form1 calculator = new Form1();
//calculator.textBox1.Text = "3";
calculator.button13_Click(calculator.button15, null);
calculator.button13_Click(calculator.button3, null);
Assert.AreEqual("9", calculator.textBox1.Text);
}
}
}
最后的测试结果如下图所示
这次也是我第一次进行项目的制作——制作一台简单的计算器,我也因此了解了visual studio 下面的windows窗体设计的各种功能和应用,也对我的编程能力提出了一次挺大的挑战,感觉做下来还有很多不是很完美的地方,例如计算器没有实现加括号的功能,还有诸多计算器的功能没有实现,以及计算器的页面做的不是很美观等诸多问题,我会在接下来的学习中认真改进这些问题,努力提升自己的代码能力,争取一次做的比一次好。
https://github.com/wrcsilence/102101534-