第二次作业

[实验目的] 1.掌握软件开发的基本流程 2.掌握常用的软件开发方式和工具。

[实验内容] 1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。 [实验要求] 1.完成软件的UI设计、使用Visio设计软件中所涉及的所有流程图。 2.选择合适的集成开发环境和工具完成计算器软件的开发 3.将开发好软件进行测试并截图 4.将本次实验过程写成实验报告提交在本次作业的链接中 5.关键代码部分以代码块格式粘贴在实验报告正文中 6.软件架构以及开发技术不限 7.本次作业为个人作业,发现雷同作业一律按0分处理。

一、用户注册需要输入注册信息,信息有效且用户名不存在则注册成功; 用户登录需要输入登录信息,信息有效则登录成功。

                                          

                                                 图1 用户注册流程图

 

                                            

                                               图2 用户登录流程图

二、代码部分

1,简易计算器

复制代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.math.BigDecimal;
import java.util.Vector;

public class Calculator {

    //操作数1
    String str1 = "0";
    //操作数2
    String str2 = "0";
    //运算符
    String signal = "+";
    //运算结果
    String result = "";

    //创建一个JFrame对象并初始化
    JFrame frame = new JFrame("Calculator");
    //后续可以设置窗口的位置和大小

    //创建一个文本框
    JTextField result_TextField = new JTextField(result, 20);

    //清除按钮
    JButton clear_Button = new JButton("Clear");

    //数字键
    JButton button0 = new JButton("0");
    JButton button1 = new JButton("1");
    JButton button2 = new JButton("2");
    JButton button3 = new JButton("3");
    JButton button4 = new JButton("4");
    JButton button5 = new JButton("5");
    JButton button6 = new JButton("6");
    JButton button7 = new JButton("7");
    JButton button8 = new JButton("8");
    JButton button9 = new JButton("9");

    //操作键
    JButton button_dian = new JButton(".");
    JButton button_jia = new JButton("+");
    JButton button_jian = new JButton("-");
    JButton button_cheng = new JButton("*");
    JButton button_chu = new JButton("/");

    //“等于”按钮
    JButton button_dy = new JButton("=");

    // 以下k1至k5为状态开关,用于事件响应

    // 开关1用于选择输入方向,将要写入str1或str2
    // 为 1 时写入 str1,为 2 时写入 str2
    int k1 = 1;

    // 开关 2 用于记录符号键的次数
    // 如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算
    int k2 = 1;

    // 开关3用于标识 str1 是否可以被清 0
    // 等于 1 时可以,不等于1时不能被清0
    int k3 = 1;

    // 开关4用于标识 str2 是否可以被清 0
    // 等于 1 时可以,不等于1时不能被清0
    int k4 = 1;

    // 开关5用于控制小数点可否被录入
    // 等于1时可以,不为1时,输入的小数点被丢掉
    int k5 = 1;

    //记录是否连续按下符号键
    JButton store;
    //存储之前输入的运算符
    @SuppressWarnings("rawtypes")
    Vector vt = new Vector(20, 10);

    //计算类的构造器
    public Calculator() {
        //后续设置显示属性
        //为按钮设置等效键,即可以通过对应的键盘按键来代替点击它
        button0.setMnemonic(KeyEvent.VK_0);
        // 设置文本框为右对齐,使输入和结果都靠右显示
        result_TextField.setHorizontalAlignment(JTextField.RIGHT);

        //初始化一个面板对象pan
        JPanel pan = new JPanel();

        //设置该容器为4行4列,网格宽度和高度均为5
        pan.setLayout(new GridLayout(4, 4, 5, 5));

        //进行add操作
        pan.add(button7);
        pan.add(button8);
        pan.add(button9);
        pan.add(button_chu);
        pan.add(button4);
        pan.add(button5);
        pan.add(button6);
        pan.add(button_cheng);
        pan.add(button1);
        pan.add(button2);
        pan.add(button3);
        pan.add(button_jian);
        pan.add(button0);
        pan.add(button_dian);
        pan.add(button_dy);
        pan.add(button_jia);

        //设置按钮边距为5
        pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        //初始化第二个pan
        JPanel pan2 = new JPanel();

        //设置布局为边界布局
        pan2.setLayout(new BorderLayout());
        pan2.add(result_TextField, BorderLayout.WEST);
        pan2.add(clear_Button, BorderLayout.EAST);

        //设置主窗口出现在屏幕上的位置(必须在函数中)
        frame.setLocation(300, 200);
        //设置窗体不能调大小
        frame.setResizable(false);

        //窗体添加两个面板
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(pan2, BorderLayout.NORTH);
        frame.getContentPane().add(pan, BorderLayout.CENTER);

        //窗体显示
        frame.pack();
        frame.setVisible(true);//这个务必要设置

        //事件处理

        //数字键的响应
        class Listener implements ActionListener {
            @SuppressWarnings("unchecked")
            public void actionPerformed(ActionEvent e) {
                // 获取事件源,并从事件源中获取输入的数据
                String ss = ((JButton) e.getSource()).getText();

                store = (JButton) e.getSource();
                vt.add(store);

                if (k1 == 1) {
                    if (k3 == 1) {
                        str1 = "";

                        // 还原开关k5状态
                        k5 = 1;
                    }
                    str1 = str1 + ss;

                    k3 = k3 + 1;

                    // 显示结果
                    result_TextField.setText(str1);

                } else if (k1 == 2) {
                    if (k4 == 1) {
                        str2 = "";

                        // 还原开关k5状态
                        k5 = 1;
                    }
                    str2 = str2 + ss;
                    k4 = k4 + 1;
                    result_TextField.setText(str2);
                }

            }
        }

        //小数点的响应
        class Listener_xiaos implements ActionListener {
             @SuppressWarnings(\"unchecked\")
public void actionPerformed(ActionEvent e) {
store = (JButton) e.getSource();
vt.add(store);
if (k5 == 1) {
String ss2 = ((JButton) e.getSource()).getText();
if (k1 == 1) {
if (k3 == 1) {
str1 = \"\";
// 还原开关k5状态
k5 = 1;
}
str1 = str1 + ss2;
k3 = k3 + 1;
// 显示结果
result_TextField.setText(str1);
} else if (k1 == 2) {
if (k4 == 1) {
str2 = \"\";
// 还原开关k5的状态
k5 = 1;
}
str2 = str2 + ss2;
k4 = k4 + 1;
result_TextField.setText(str2);
}
}
k5 = k5 + 1;
}
}
//运算符号的处理
class Listener_signal implements ActionListener {
@SuppressWarnings(\"unchecked\")
public void actionPerformed(ActionEvent e) {
String ss2 = ((JButton) e.getSource()).getText();
store = (JButton) e.getSource();
vt.add(store);

                if (k2 == 1) {
                    // 开关 k1 为 1 时向数 1 写输入值,为 2 时向数2写输入值。
                    k1 = 2;
                    k5 = 1;
                    signal = ss2;
                    k2 = k2 + 1;// 按符号键的次数
                } else {
                    int a = vt.size();
                    JButton c = (JButton) vt.get(a - 2);

                    if (!(c.getText().equals(\"+\"))
                            && !(c.getText().equals(\"-\"))
                            && !(c.getText().equals(\"*\"))
                            && !(c.getText().equals(\"/\")))
                    {
                        cal();
                        str1 = result;
                        // 开关 k1 为 1 时,向数 1 写值,为2时向数2写
                        k1 = 2;
                        k5 = 1;
                        k4 = 1;
                        signal = ss2;
                    }
                   k2 = k2 + 1;
                }
            }
       }
        //等于号的响应
        class Listener_dy implements ActionListener {
            @SuppressWarnings(\"unchecked\")
            public void actionPerformed(ActionEvent e) {

                store = (JButton) e.getSource();
                vt.add(store);
                cal(); //计算方法,后续安排
                // 还原开关k1状态
                k1 = 1;
                // 还原开关k2状态
                k2 = 1;
                // 还原开关k3状态
                k3 = 1;
                // 还原开关k4状态
                k4 = 1;
               // 为 7+5=12 +5=17 这种计算做准备
                str1 = result;
            }
        }
        //清除键的响应
        class Listener_clear implements ActionListener {
            @SuppressWarnings(\"unchecked\")

            public void actionPerformed(ActionEvent e) {
                store = (JButton) e.getSource();
                vt.add(store);
                k5 = 1;
                k2 = 1;
                k1 = 1;
                k3 = 1;
                k4 = 1;
                str1 = \"0\";
                str2 = \"0\";
                signal = \"\";
                result = \"\";
                result_TextField.setText(result);
                vt.clear();
           }
        }
        //注册监听器
        //监听等于键
        Listener_dy jt_dy = new Listener_dy();
        button_dy.addActionListener(jt_dy);
        //监听数字键
        Listener jt = new Listener();
        button0.addActionListener(jt);
        button1.addActionListener(jt);
        button2.addActionListener(jt);
        button3.addActionListener(jt);
        button4.addActionListener(jt);
        button5.addActionListener(jt);
        button6.addActionListener(jt);
        button7.addActionListener(jt);
        button8.addActionListener(jt);
        button9.addActionListener(jt);
        //监听符号键
        Listener_signal jt_signal = new Listener_signal();
        button_jia.addActionListener(jt_signal

        button_jian.addActionListener(jt_signal);
        button_cheng.addActionListener(jt_signal);
        button_chu.addActionListener(jt_signal);
        //监听清除键
        Listener_clear jt_c = new Listener_clear();
        clear_Button.addActionListener(jt_c);
        //监听小数点键
        Listener_xiaos jt_xs = new Listener_xiaos();
        button_dian.addActionListener(jt_xs);
        //窗体关闭事件的响应程序
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    //实现计算方法cal()
    public void cal() {
        // 操作数1
        double a2;
        // 操作数2
        double b2;
        // 运算符
        String c = signal;
        // 运算结果
        double result2 = 0;
        if (c.equals(\"\")) {
            result_TextField.setText(\"Please input operator\");
        } else {
            // 手动处理小数点的问题
            if (str1.equals(\".\"))
                str1 = \"0.0\";
            if (str2.equals(\".\"))
                str2 = \"0.0\";
            a2 = Double.valueOf(str1).doubleValue();
            b2 = Double.valueOf(str2).doubleValue();
            if (c.equals(\"+\")) {
                result2 = a2 + b2;
            }
            if (c.equals(\"-\")) {
                result2 = a2 - b2;
            }
            if (c.equals(\"*\")) {
                BigDecimal m1 = new BigDecimal(Double.toString(a2));
                BigDecimal m2 = new BigDecimal(Double.toString(b2));
                result2 = m1.multiply(m2).doubleValue();
            }
            if (c.equals(\"/\")) {
                if (b2 == 0) {
                    result2 = 0;
                } else {
                    result2 = a2 / b2;
                }
            }
            result = ((new Double(result2)).toString());
            result_TextField.setText(result);
        }
    }
    //主方法
    @SuppressWarnings(\"unused\")
    public static void main(String[] args) {
        //通过 UIManager 来设置窗体的 UI 风格
        try {
            UIManager.setLookAndFeel(\"javax.swing.plaf.metal.MetalLookAndFeel\");
        } catch (Exception e) {
            e.printStackTrace();
        }
        Calculator cal = new Calculator();
    }
}
复制代码

 

2,注册登录代码

复制代码
package com.qf.domian;

import java.sql.ResultSet;

public class method {
    //z注册
    public int insertUser(String name, String pass, int root) {
        //判断当前用户是否已注册
        int re = 0;
        try {
            connectionMysql con = new connectionMysql();
            con.openMysql();
            String selectSql = "SELECT upass FROM userinfo WHERE uname='" + name + "'";
            ResultSet res = con.select(selectSql);
            String userPass = "";
            while (res.next()) {
                userPass = res.getString("upass");
            }
            //------------------------------------------------
            if (userPass.equals("") || userPass.equals(null)) {
                //用户不存在,注册
                String insertSql = "INSERT INTO userinfo(uname,upass,uroot)VALUES('" + name + "','" + pass + "'," + root + ")";
                re = con.update(insertSql);


            } else {
                //用户已存在
                re = 2;
            }


        } catch (Exception e) {
            e.printStackTrace();
        }


        return re;
    }
    //登录方法
    public int checkLogin(String name, String pass) {
        //判断当前用户是否已注册
        int re = 0;
        try {
            connectionMysql con = new connectionMysql();
            con.openMysql();
            String selectSql = "SELECT upass FROM userinfo WHERE uname='" + name + "'";
            ResultSet res = con.select(selectSql);
            String userPass = "";
            while (res.next()) {
                userPass = res.getString("upass");
            }
            //------------------------------------------------
            if (userPass.equals("") || userPass.equals(null)) {
                //用户不存在
               re = 1;

            } else if (userPass.equals(pass)){
                //登录成功
               re = 2;
            }else{
                //用户名或密码错误
                re = 3;
            }


        } catch (Exception e) {
            e.printStackTrace();
        }


        return re;
    }

}
复制代码

 

3,打开数据库连接

复制代码
package com.qf.domian;

import java.sql.*;

public class connectionMysql {
    //打开数据库连接
   
    Connection con = null;
    ResultSet res = null;

    public Connection openMysql() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/student?characterEncoding=UTF-8";
            String uname = "root";
            String upass = "246802";
            con = DriverManager.getConnection(url, uname, upass);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return con;
    }

    //增删改
    public int update(String sql) {
        //保存返回值
        int re = 0;
        try {
            //创建执行对象
            Statement sta = con.createStatement();
            re = sta.executeUpdate(sql);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return re;
    }


    //查询
    public ResultSet select(String sql) {
        try {
            //创建执行对象
            Statement sta = con.createStatement();
            res = sta.executeQuery(sql);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return res;
    }

    //破解表结构
    public  void passTable(String tableName){

        try {
            String selectSql="select * from "+tableName;

            Statement sta = con.createStatement();
            ResultSet res = sta.executeQuery(selectSql);
            //从结果集中获取表结构源数据
            ResultSetMetaData meta = res.getMetaData();
            int sum = meta.getColumnCount();
            for (int i=1;i<=sum;i++){
                //获取对应的字段名
                String name = meta.getColumnName(i);
                //获取对应的字段类型
                String columnTypeName = meta.getColumnTypeName(i);
                System.out.println(name+":"+columnTypeName);

            }

        }catch (Exception e){
            e.printStackTrace();
        }



    }


}
复制代码

 

4,连接数据库

复制代码
package com.qf.domian;

import java.sql.*;

public class TestConnectionMysql {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //jdbc连接mysql数据库
        //加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        
        //连接数据库
        String url="jdbc:mysql://127.0.0.1:3306/student?characterEncoding=UTF-8";
        String uname="root";
        String upass="246802";
        Connection con = DriverManager.getConnection(url, uname, upass);
        //创建执行对象
        Statement sta = con.createStatement();
        //增删改executeUpdate
//        String sql="INSERT INTO stu VALUES(1,'翠花','男',18)";
//        int re = sta.executeUpdate(sql);
//        System.out.println(re);
        //查询executeQuery
        String selectSql="select * from stu";
        ResultSet res = sta.executeQuery(selectSql);
        //从结果集中获取表结构元数据
       ResultSetMetaData meta = res.getMetaData();
       int sum = meta.getColumnCount();
       for (int i=1;i<=sum;i++){
           //获取对应的字段名
           String name = meta.getColumnName(i);
           //获取对应的字段类型
           String ColumnTypeName = meta.getColumnTypeName(i);
           System.out.println(name+":"+ColumnTypeName);
       }

        //遍历结果集
//        while (res.next()){
//            //取对应的表数据
//            int stuid = res.getInt("stuid");
//            String sname = res.getString(2);
//            String ssex = res.getString("ssex");
//            int sage = res.getInt("sage");
//            System.out.println(stuid+":"+sname+":"+ssex+":"+sage);


        }




    }
复制代码

 三、

 

posted @   (๑´∀`๑)  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示