第二次作业
[实验目的] 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); } }
三、
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南