计算器实验报告
一、实验目的
1.掌握软件开发的基本流程。
2.掌握常用的软件开发方式和工具。
二、实验内容
设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。
三、实验要求
1.完成软件的UI设计、使用Visio设计软件中所涉及的所有流程图。
2.选择合适的集成开发环境和工具完成计算器软件的开发。
3.将开发好软件进行测试并截图。
4.将本次实验过程写成实验报告提交在本次作业的链接中。
5.关键代码部分以代码块格式粘贴在实验报告正文中。
6.软件架构以及开发技术不限。
四、实验环境
1.操作系统:Windows11
2.开发工具:Visual Studio 2022
3.流程图绘制工具:visio
五、基本功能描述
在用户登录界面登录已注册的用户信息,登录成功后可以使用该计算器,该计算器包括基本的四则运算(加、减、乘、除)及开方运算,使用该计算器可将用户的历史计算记录保存到数据库中。方便用户调取并查看历史记录。
六、功能结构图

七、软件设计
(一)登录界面设计
- 流程图

2.登录注册界面设计效果展示

3.登录注册界面设计代码
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; using System.Data.SqlClient; using System.Diagnostics.Eventing.Reader; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace WinFormsApp1 { public partial class login : Form { public login() { InitializeComponent(); }private void label1_Click(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { } private void UPassTb_TextChanged(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { } private void label4_Click(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } } }
(二)简易计算器设计
1.流程图

2.计算器界面设计效果展示

3.计算器代码
using System.Text; using System.Data; using System.Drawing; using System.Linq; using System.Threading.Tasks; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.InteropServices; using System.Security.Cryptography.X509Certificates; using System; using System.Data.SqlClient; namespace WinFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private double LeftNum, RightNum, Result; String Flag; 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 button5_Click(object sender, EventArgs e) { textBox1.Text += "4"; } private void button6_Click(object sender, EventArgs e) { textBox1.Text += "5"; } private void button7_Click(object sender, EventArgs e) { textBox1.Text += "6"; } private void button9_Click(object sender, EventArgs e) { textBox1.Text += "7"; } private void button10_Click(object sender, EventArgs e) { textBox1.Text += "8"; } private void button11_Click(object sender, EventArgs e) { textBox1.Text += "9"; } private void button14_Click(object sender, EventArgs e) { textBox1.Text += "0"; } private void button4_Click(object sender, EventArgs e) { LeftNum = Convert.ToDouble(textBox1.Text); Flag = "+"; textBox1.Text = ""; } private void button8_Click(object sender, EventArgs e) { LeftNum = Convert.ToDouble(textBox1.Text); Flag = "-"; textBox1.Text = ""; } private void button12_Click(object sender, EventArgs e) { LeftNum = Convert.ToDouble(textBox1.Text); Flag = "X"; textBox1.Text = ""; } private void button16_Click(object sender, EventArgs e) { LeftNum = Convert.ToDouble(textBox1.Text); Flag = "-"; textBox1.Text = ""; } private void button13_Click(object sender, EventArgs e) { LeftNum = Convert.ToDouble(textBox1.Text); Flag = "/"; textBox1.Text = ""; } private void From1_load(object sender, EventArgs e) { } private void button17_Click_1(object sender, EventArgs e) { LeftNum = Convert.ToDouble(textBox1.Text); Flag = "sqrt"; textBox1.Text = ""; double a = LeftNum / 2; double b = (a + LeftNum / a) / 2; while (a - b > 0.0000001 || a - b < (-0.0000001))//取绝对值 { a = b; b = (a + (LeftNum / a)) / 2; } Result = b; textBox1.Text = Result.ToString(); // Save history string calculation = $"{LeftNum} {Flag} {Result}"; SaveHistory(calculation, Result.ToString()); } private void button15_Click(object sender, EventArgs e) { RightNum = Convert.ToDouble(textBox1.Text); if (Flag == "+") Result = LeftNum + RightNum; else if (Flag == "-") Result = LeftNum - RightNum; else if (Flag == "X") Result = LeftNum * RightNum; else if (Flag == "/") Result = LeftNum / RightNum; textBox1.Text = Result.ToString(); // Save history string calculation = $"{LeftNum} {Flag} {RightNum} = {Result}"; SaveHistory(calculation, Result.ToString()); }private void button18_Click(object sender, EventArgs e) { this.Close(); } private void textBox1_TextChanged(object sender, EventArgs e) { } } }
(三)数据库
1.链接数据库
2.创建表
(1)User表

(2)CalculatorHistory表

3.链接数据库代码
(1)登录界面链接数据库代码
string sqlSelect = string.Format("select Password,IsOnline from [User] where Name='{0}'", name); //SQL语句,选择passWord和isOnline using (SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\计算器\WinFormsApp1\UserDataBase.mdf;Integrated Security=True")) //创建数据库连接类 { using (SqlCommand cmdSelect = new SqlCommand(sqlSelect, conn)) //创建数据库命令类 { conn.Open(); //打开数据库连接 SqlDataReader sqlRead = cmdSelect.ExecuteReader(); //遍历数据库 if (!sqlRead.Read()) { conn.Close(); //关闭数据库连接 MessageBox.Show("账号不存在!请重新输入"); } else if (sqlRead["IsOnline"].ToString().Trim() == "1") { conn.Close(); //关闭数据库连接 MessageBox.Show("账号已登录!请重新输入"); } else if (sqlRead["Password"].ToString().Trim() == password) { conn.Close(); //关闭数据库连接 MessageBox.Show("登录成功!"); string sqlUpdate = string.Format("update [User] set IsOnline='{0}' where Name='{1}'", 1, name); //SQL语句,更新isOnline为上线状态 using (SqlCommand cmdUpdate = new SqlCommand(sqlUpdate, conn)) //创建数据库命令类 { conn.Open(); //打开数据库连接 cmdUpdate.ExecuteNonQuery(); //执行SQL语句 conn.Close(); //关闭数据库连接 this.Hide(); //隐藏当前窗体 Form1 f = new Form1(); f.ShowDialog(); this.Show(); this.Close(); } } else { conn.Close(); //关闭数据库连接 MessageBox.Show("密码错误!请重新输入"); } } }
(2)注册界面链接数据库代码
string sqlSelect = string.Format("select count(*) from [User] where Name='{0}'", name); //SQL语句,选择表User中Name为name的行 /// 创建对象时使用using可以在使用完该对象后,自动释放资源 using (SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\计算器\WinFormsApp1\UserDataBase.mdf;Integrated Security=True")) //创建数据库连接类 { using (SqlCommand cmdSelect = new SqlCommand(sqlSelect, conn)) //创建数据库命令类 { conn.Open(); //打开数据库连接 if ((int)cmdSelect.ExecuteScalar() > 0 || name == "admin") { conn.Close(); //关闭数据库连接 MessageBox.Show("用户已存在!"); } else { string sqlInsert = string.Format("insert into [User] (Name,Password,IsOnline)values('{0}','{1}','{2}')", name, password, 0); //SQL语句, //SQL语句,将参数Name、Password、IsOnline插入到表User中 SqlCommand cmdInsert = new SqlCommand(sqlInsert, conn); cmdInsert.ExecuteNonQuery(); //执行SQL语句 conn.Close(); //关闭数据库连接 MessageBox.Show("注册成功"); } } }
(3)计算器存储历史记录链接数据库代码
using (SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\计算器\WinFormsApp1\UserDataBase.mdf;Integrated Security=True")) { connection.Open(); string query = "INSERT INTO CalculatorHistory (CalculationDate, Calculation, Result) VALUES (@CalculationDate, @Calculation, @Result)"; //在已连接的数据库中插入历史记录 SqlCommand command = new SqlCommand(query, connection); command.Parameters.AddWithValue("@CalculationDate", DateTime.Now); command.Parameters.AddWithValue("@Calculation", calculation); command.Parameters.AddWithValue("@Result", result); command.ExecuteNonQuery(); }
八、测试
(一)登录注册功能测试
1、登录失败

2、登录成功

3、注册成功

(二)计算器功能测试
1.加法(25+9)

2.减法(71-56)

3.乘法(7x9)

4.除法(64÷8)

5.开方(16开方)

(三)数据库存储功能测试
1.User表数据

2.CalculatorHistory表数据
