第二次作业

发布时间 2023-12-03 22:10:09作者: 陈菲

计算器实验报告

一、实验目的

1.掌握软件开发的基本流程。

2.掌握常用的软件开发方式和工具。

二、实验内容

       设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。

三、实验要求

1.完成软件的UI设计、使用Visio设计软件中所涉及的所有流程图。

2.选择合适的集成开发环境和工具完成计算器软件的开发。

3.将开发好软件进行测试并截图。

4.将本次实验过程写成实验报告提交在本次作业的链接中。

5.关键代码部分以代码块格式粘贴在实验报告正文中。

6.软件架构以及开发技术不限。

四、实验环境

1.操作系统:Windows11

2.开发工具:Visual Studio 2022

3.流程图绘制工具:visio

五、基本功能描述

       在用户登录界面登录已注册的用户信息,登录成功后可以使用该计算器,该计算器包括基本的四则运算(加、减、乘、除)及开方运算,使用该计算器可将用户的历史计算记录保存到数据库中。方便用户调取并查看历史记录。

六、功能结构图

七、软件设计

(一)登录界面设计

  1. 流程图

        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表数据