这个作业属于哪个课程 | https://bbs.csdn.net/forums/ssynkqtd-05 |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/topics/617294583 |
这个作业的目标 | 完成一个具有可视化界面的计算器 |
其他参考文献 | https://blog.csdn.net/bibiobi/article/details/114823809,https://learn.microsoft.com/zh-cn/visualstudio/get-started/csharp/?view=vs-2022 |
1、Github项目地址以及项目展示
https://github.com/TongSir02/102101228cst
2、PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 50 |
• Estimate | • 估计这个任务需要多少时间 | 15 | 15 |
Development | 开发 | 500 | 500 |
• Analysis | • 需求分析 (包括学习新技术) | 100 | 100 |
• Design Spec | • 生成设计文档 | 15 | 15 |
• Design Review | • 设计复审 | 30 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
• Design | • 具体设计 | 15 | 15 |
• Coding | • 具体编码 | 200 | 200 |
• Code Review | • 代码复审 | 45 | 45 |
• Test | • 测试(自我测试,修改代码,提交修改) | 65 | 65 |
Reporting | 报告 | 90 | 90 |
•Test Repor t | • 测试报告 | 30 | 30 |
• Size Measurement | • 计算工作量 | 15 | 15 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 45 | 45 |
合计 | 650 | 640 |
3、解题思路描述
看到题目的想法是利用WPF(Windows Presentation Foundation)去做出一个页面,然后再对其进行数据绑定,后面发现visual studio的Windows平台可以与c#语言创建Windows窗体应用项目(类似于低代码搭载平台,可以根据自己的需求,拖动相应组件到相应位置,并对其属性进行更改),比起wpf的适用性更高。
以下为具体操作:
1、创建对应项目,并完成相应组件的位置分配跟属性更改;
2、对每一个组件进行数据的绑定,并对点击各个事件所要求的功能进行实现;
3、进行代码的改进。
4、接口设计和实现过程
1、创建Windows窗体应用程序,在Form1.cs【设计】的工具箱内拖动多个button组件与textbox组件,到窗体内进行布局;
2、对每个button编辑标识名称以及相关文本,textbox用于放置数据就不用设置相关文本,但是要设置可滚动,并且拉长textbox组件,不然显示的数据会非常小;
3、双击button跳转到Form1.cs,并对其进行事件绑定以及编写函数实现点击按钮所需要的功能;
4、对button文本的样式进行更改,美化一下界面;
5、调试一下计算器
5、关键代码展示
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text += "n";
} //用于实现数字的输入,n代表1-9的任意自然数;
private void button12_Click(object sender, EventArgs e)
{
if (textBox1.Text.Contains(".")) return;
else
{ if (textBox1.Text != "") textBox1.Text += ".";
}
} //小数点实现
private void button10_Click(object sender, EventArgs e)
{
textBox1.Text = "";
textBox2.Text = "";
division.Enabled = true;
multiplication.Enabled = true;
addition.Enabled = true;
subtraction.Enabled = true;
} //数据清空的实现
private void button13_Click(object sender, EventArgs e)
{
if
(textBox1.Text != ""&& textBox1.Text != "-") textBox1.Text = Convert.ToString(double.Parse(textBox1.Text) * -1);
else if
(textBox1.Text != "-") textBox1.Text += "-";
} //数据取相反数的实现
private void button14_Click(object sender, EventArgs e)
{
if(textBox1.Text!=""&& textBox1.Text != "-") textBox1.Text = Convert.ToString(double.Parse(textBox1.Text) * 0.01);
} //百分号的实现
private void division_Click(object sender, EventArgs e)
{
division.Enabled = false;
multiplication.Enabled = true;
addition.Enabled = true;
subtraction.Enabled = true;
if(textBox1.Text!="")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
} //除法的实现
private void multiplication_Click(object sender, EventArgs e)
{
division.Enabled = true;
multiplication.Enabled = false;
addition.Enabled = true;
subtraction.Enabled = true;
if (textBox1.Text != "")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
} //乘法的实现
private void subtraction_Click(object sender, EventArgs e)
{
division.Enabled = true;
multiplication.Enabled = true;
addition.Enabled = true;
subtraction.Enabled = false;
if (textBox1.Text != "")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
} //减法的实现
private void addition_Click(object sender, EventArgs e)
{
division.Enabled = true;
multiplication.Enabled = true;
addition.Enabled = false;
subtraction.Enabled = true;
if (textBox1.Text != "")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
} //加法的实现
private void button19_Click(object sender, EventArgs e)
{
double right;
double left = double.Parse(textBox2.Text);
if (textBox1.Text == "") right = 0;
else right = double.Parse(textBox1.Text);
if(division.Enabled==false)
{
if (right != 0)
{
textBox1.Text = Convert.ToString(left / right);
division.Enabled = true;
}
else
{
MessageBox.Show("ERROR!");
textBox1.Text = "";
return;
}
}
if (multiplication.Enabled == false)
{
textBox1.Text = Convert.ToString(left * right);
multiplication.Enabled = true;
}
if (addition.Enabled == false)
{
textBox1.Text = Convert.ToString(left + right);
addition.Enabled = true;
}
if (subtraction.Enabled == false)
{
textBox1.Text = Convert.ToString(left - right);
subtraction.Enabled = true;
}
} //等号的实现
private void button17_Click(object sender, EventArgs e)
{
if (textBox1.Text != "") textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1);
else return;
} //数据回退的实现
private void button18_Click(object sender, EventArgs e)
{
double x = double.Parse(textBox1.Text);
textBox1.Text = Convert.ToString(x*x);
} //平方的实现
private void button15_Click(object sender, EventArgs e)
{
double r = double.Parse(textBox1.Text);
textBox1.Text = Convert.ToString(Math.Pow(r, 0.5));
} //根号的实现
private void button20_Click(object sender, EventArgs e)
{
double s = double.Parse(textBox1.Text);
int x = (int)s;
if (x != s)
{
MessageBox.Show("ERROR");
textBox1.Text = "";
return;
}
else
{
if(x==0)
{
textBox1.Text = "1";
return;
}
int cnt = 1;
for(int i = 1; i <= x; i++)
{
cnt *= i;
}
textBox1.Text = Convert.ToString(cnt);
}
} //阶乘的实现
6、性能改进
对各个符号文本的组件添加if语句,解决了计算机使用的一些bug,如按“=”textbox内没有文本的话,赋值一个数为0,使界面可以显示出数字0,不至于为空.
if (textBox1.Text == "") right = 0;
并且对加减乘除这些基本运算添加了标识,保证计算的时候不会出错
division.Enabled = true;
multiplication.Enabled = true;
addition.Enabled = true;
subtraction.Enabled = false;
7、单元测试
单元测试代码:
private void division_Click(object sender, EventArgs e)
{
division.Enabled = false;
multiplication.Enabled = true;
addition.Enabled = true;
subtraction.Enabled = true;
if(textBox1.Text!="")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
}
private void multiplication_Click(object sender, EventArgs e)
{
division.Enabled = true;
multiplication.Enabled = false;
addition.Enabled = true;
subtraction.Enabled = true;
if (textBox1.Text != "")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
}
private void subtraction_Click(object sender, EventArgs e)
{
division.Enabled = true;
multiplication.Enabled = true;
addition.Enabled = true;
subtraction.Enabled = false;
if (textBox1.Text != "")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
}
private void addition_Click(object sender, EventArgs e)
{
division.Enabled = true;
multiplication.Enabled = true;
addition.Enabled = false;
subtraction.Enabled = true;
if (textBox1.Text != "")
{
textBox2.Text = textBox1.Text;
textBox1.Text = "";
}
else textBox2.Text = "0";
}
8、异常处理
在输入不正确的运算规则时会出现以下异常,后面通过添加if语句解决问题
“System.FormatException”类型的未经处理的异常在 mscorlib.dll 中发生 输入字符串的格式不正确。
9、心得体会
心路历程:在一开始设计了只有加减乘除操作的简易计算器,后面想着可以先设计界面的排版,然后再添加功能如阶乘、根号、平方。但是感觉还是差点意思,没有像HTML+CSS+JS前端三件套设计出来的样式美观,会显得有点古板。
学习收获:在本次软工作业–制作一个可视化的计算器,我学习了c#的相关语法windows窗体应用的使用以及如何让自己的UI变得用户友好,同时也学习了如何对代码做好单元测试。同时,在修改bug的过程中的一次次调试也增强了发现与解决问题的能力。