第二次作业
//实验说明,老师,我的电脑idea和MySQL环境您也见了,是真的装不上啊,我们上次在办公室尝试了一早上以及课后我跟教程尝试了很多次,都失败告终,迫于无奈以及时间原因,我就只好写了一个简易计算器和简易登录界面,请您原谅。相应知识也会在后期补齐。本次作业后面数据库部分我只好在网站上以及CSDN上学习尝试着写了一个,那个就凭空写了一下,主要是没有数据库支撑,MySQL下不下来,我会在继续学习努力把这个环境等问题解决掉。
[实验目的]
1.掌握软件开发的基本流程
2.掌握常用的软件开发方式和工具。
[实验内容]
- 设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能
- 使用Microsoft Visio作绘图工具
- 使用Java语言与IntelliJ IDEA Community Edition作开发工具
- 使用MySQL数据库储存数据
- 使用Navicat管理操作数据库
一、程序流程图设计
1、注册流程图
2、用户登录
二、功能展示
1、登录界面
2、登陆成功
3、登录失败(不存在该用户)
4、注册失败
5、注册成功
6、罗少铭计算器界面
三、主要代码展示
①罗少铭计算器部分主要代码:包括计算器功能实现,计算器界面设计
package jisuanqi11;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.math.BigDecimal;
import java.util.Vector;
import java.lang.Math.*;
public class calculator{
String str1 = "0";
String str2 = "0";
String signal = "+";
String result = "";
JFrame frame = new JFrame("罗少铭计算器");
JTextField result_TextField = new JTextField(result, 60);
JButton clear_Button = new JButton("清除");
//罗少铭数字键设计
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_dy = new JButton("=");
int k1 = 1;
int k2 = 1;
int k3 = 1;
int k4 = 1;
int k5 = 1;
JButton store;
@SuppressWarnings("rawtypes")
Vector vt = new Vector(30, 30);
//进行罗少铭计算类设计
public calculator() {
button0.setMnemonic(KeyEvent.VK_0);
result_TextField.setHorizontalAlignment(JTextField.RIGHT);
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(6, 6, 8, 8));
//罗少铭计算器操作键
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_kai= new JButton("√");
JButton button_dui=new JButton("log10");
JButton button_sin=new JButton("sin");
JButton button_cos=new JButton("cos");
JButton button_tan=new JButton("tan");
JButton button_abs=new JButton("abs");
JButton button_pow=new JButton("pow")
//进行罗少铭计算器按钮
添加操作
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);
pan.add(button_kai);
pan.add(button_dui);
pan.add(button_sin);
pan.add(button_cos);
pan.add(button_tan);
pan.add(button_abs);
pan.add(button_pow);
pan.setBorder(BorderFactory.createEmptyBorder(10, 12, 7, 7));
JPanel pan2 = new JPanel();
pan2.setLayout(new BorderLayout());
pan2.add(result_TextField, BorderLayout.WEST);
pan2.add(clear_Button, BorderLayout.EAST);
frame.setLocation(500, 500);
//罗少铭计算器窗体添加两个面板
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 = 1;
}
str1 = str1 + ss;
k3 = k3 + 1;
result_TextField.setText(str1);
} else if (k1 == 2) {
if (k4 == 1) {
str2 = "";
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 = 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 = 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 = 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 = 1;
k2 = 1;
k3 = 1;
k4 = 1;
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);
button_kai.addActionListener(jt_signal);
button_dui.addActionListener((jt_signal));
button_sin.addActionListener(jt_signal);
button_cos.addActionListener(jt_signal);
button_tan.addActionListener(jt_signal);
button_abs.addActionListener(jt_signal);
button_pow.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;
int c3=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;
}
}
//开根号
if(c.equals("√")){
result2=Math.sqrt(a2);
}
//log10运算
if(c.equals("log10")){
result2=Math.log10(a2);
}
//sin运算
if(c.equals("sin")){
result2=Math.sin(a2);
}
//cos运算
if(c.equals("cos")){
result2=Math.cos(a2);
}
//tan
if(c.equals("tan")){
result2=Math.tan(a2);
}
//取余
if(c.equals("abs")){
result2=Math.abs(a2);
}
result = ((new Double(result2)).toString());
result_TextField.setText(result);
}
}
public static void main(String[] args) {
calculator a = new calculator();
}
}
②登录界面设计:主要可以实现用户的登录注册,以及判断用户输入的信息是否正确,并存储相应的信息
package jisuanqi11; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.WindowConstants; public class test { public char[] D= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; public char[] d = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; public char[] s = {'0','1','2','3','4','5','6','7','8','9'}; public JTextField jtext0,jtext1; public String get_jtext0,get_jtext1; public JFrame jf; //目标文件 final String TARGET_FILE = "2000300420.txt"; File targetFile = new File(TARGET_FILE); public test() throws IOException { jf = new JFrame("罗少铭计算器注册登录页面"); jf.setSize(400, 400); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel jp0 = new JPanel(); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); jp0.add(new JLabel("用户名:")); jtext0 = new JTextField(20); jp0.add(jtext0); jp1.add(new JLabel("密 码:")); jtext1 = new JTextField(20); jp1.add(jtext1); JButton jb0 = new JButton("注册"); JButton jb1 = new JButton("登录"); jp2.add(jb0); jp2.add(jb1); if(targetFile.createNewFile()) { System.out.println("用户不存在,创建成功"); }else { System.out.println("用户存在"); } // 用户 注册操作 jb0.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String get_jtext0 = jtext0.getText(); String get_jtext1 = jtext1.getText(); int found0 =0,found1 =0,found2 =0; char[] a=get_jtext1.toCharArray(); for(int yy=0;yy<a.length;yy++) { for(int y=0;y<26;y++) { if(a[yy]==DD[y]) { found0=1; break; } } } for(int yy=0;yy<a.length;yy++) { for(int y=0;y<26;y++) { if(a[yy]==dd[y]) { found1=1; break; } } } for(int yy=0;yy<a.length;yy++) { for(int y=0;y<10;y++) { if(a[yy]==ss[y]) { found2=1; break; } } } System.out.println(found0+found1+found2); if(found0==0||found1==0||found2==0) { System.out.println("密码格式错误!"); //登录 消息对话框无返回, 仅做通知作用 JOptionPane.showMessageDialog( jf, "密码必须包含大写、小写字母和数字!", "注册失败", JOptionPane.INFORMATION_MESSAGE ); }else { try { //打开文件字符输出流 FileWriter writer = new FileWriter(targetFile,true); //写入文件 writer.write("\n"); writer.write(get_jtext0); System.out.println(get_jtext0); writer.write("\n"); writer.write(get_jtext1); writer.flush(); //关闭输出流 writer.close(); // 消息对话框无返回, 仅做通知作用 JOptionPane.showMessageDialog( jf, "注册成功!", "注册", JOptionPane.INFORMATION_MESSAGE ); // 消息对话框无返回, 仅做通知作用 JOptionPane.showMessageDialog( jf, "登录成功!", "登录", JOptionPane.INFORMATION_MESSAGE ); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }); jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String get_jtext0 = jtext0.getText(); String get_jtext1 = jtext1.getText(); // 读 FileReader in = null; try { in = new FileReader("2000300420.txt"); } catch (FileNotFoundException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } BufferedReader bufIn = new BufferedReader(in); String line = null; String[] datas = new String[100]; // 读入结果 int i=0; int j=0; try { while ( (line = bufIn.readLine()) != null) { datas[i]=line; i++; } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while(true) { if(datas[j].equals(get_jtext0)&&datas[j+1].equals(get_jtext1)) { // 消息对话框无返回, 仅做通知作用 calculator Calculator; JOptionPane.showMessageDialog(jf, "登录成功!", "登录", JOptionPane.INFORMATION_MESSAGE); new calculator(); break; } j++; if(datas[j]==null) { System.out.println("不存在该用户!"); // 清除框内输入字符 jtext0.setText(""); jtext1.setText(""); // 消息对话框无返回, 仅做通知作用 JOptionPane.showMessageDialog( jf, "不存在该用户!", "登录失败", JOptionPane.INFORMATION_MESSAGE ); break; } } // 关闭 输入流 try { bufIn.close(); in.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); // 创建一个垂直盒子容器, 把上面 3 个 JPanel 串起来作为内容面板添加到窗口 Box vBox = Box.createVerticalBox(); vBox.add(jp0); vBox.add(jp1); vBox.add(jp2); jf.setContentPane(vBox); // jf.pack(); jf.setLocationRelativeTo(null); jf.setVisible(true); } public static void main(String[] args) throws IOException { new test(); } }
③主函数
import jisuanqi11.calculator; import jisuanqi11.test; import java.io.IOException; public class Main { public static void main(String[] args) { calculator cal = new calculator(); try { new test(); } catch (IOException e) { throw new RuntimeException(e); } } }
④连接数据库,实现存储用户注册登录信息,以及计算器计算信息
//老师,我的数据库真的下载不下来,所以就没有连接数据库,就只能在网站上学习了一下怎么写所以请您见谅,我的环境是真的装不上啊~
package jisuanqi11; import javax.swing.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Record { String ID; private String driver = "com.mysql.cj.jdbc.Driver"; private String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8"; private String user = "root"; private String sqlpassword = "123456"; void setID(String ID) { this.ID = ID; } boolean dong() throws SQLException, ClassNotFoundException { JOptionPane.showMessageDialog(null, "记录成功"); record(); return true; } void record() throws ClassNotFoundException, SQLException { String sql = "insert into calculator (id, record, result) values (?,?,?)"; Class.forName(driver); try { Connection conn = DriverManager.getConnection(url, user, sqlpassword); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, this.ID); /* ps.setString(2, this.record); ps.setString(3, this.result);*/ ps.executeUpdate(); ps.close(); conn.close(); } catch (SQLException ex) { System.out.println("添加信息失败!"); } } }
package jisuanqi11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class sql {
static Connection conn=null;
public Connection getConnection() throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.print("mySQL的驱动");
String url="jdbc:mysql:///liveshop?useUnicode=true&characterEncoding=UTF-8";
String password="123456";
String username="sleep";//数据库用户名的名字
conn=DriverManager.getConnection(url, username, password);
System.out.println("与数据库连接");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static <CreateMysql> void main(String[] arg) {
sql mySQL=new sql ();
PreparedStatement preparedStatement = null;
ResultSet resultSet= null;
try {
mySQL.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String sql="select * from address where name = ?";
try {
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1,"myt");
resultSet = preparedStatement.executeQuery();
while(resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(preparedStatement!=null) {
try {
preparedStatement.close();
计算器运算界面
⑧计算过程
序号 |
输入结果 |
输出结果 |
1 |
569-456 |
113 |
2 |
136+89 |
225 |
3 |
45*79 |
3555 |
4 |
965/56 |
17.232142857142 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下