一、实验目的
1.掌握软件开发的基本流程
2.掌握常用的软件开发方式和工具。
二、实验内容
1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。
三、实验环境
1.操作系统:Windows11
2.开发工具:IntelliJ IDEA
四、软件设计
1.设计思路
首先我们要设计一个登录页面 而我采用了html语言简单实现了一个网页版的登录页面
登录页面的程序流程图为:

而登录页面展示为:

这是登录成功的页面
而登录失败则会提示你账号错误或者密码错误或者账号密码都错误:

zai
在实现登录页面以后我们来对计算器进行设计,通过学习,我了解到了使用html语言也可以制作一个计算器
此计算器在第一次作业要求的基础上可以实现加减乘除及开方的运算,并且页面的设计变得更加美观。
计算器计算展示
加法运算:

减法运算:

乘法运算:

除法运算:

开方运算:

引入JDBC:作用:是Java数据库连接技术的简称,提供连接各种数据可以的能力。
结构:DriverManager类:依据数据库的不同,管理JDBC驱动。
Connection接口:负责连接数据库并担任传送数据的任务
Statement接口:由Connection产生、负责执行SQL语句
ResultSet接口:从数据源读取数据

由于HTML本身是一种标记语言,主要用于构建网页结构和内容,不直接支持与数据库的连接。因此我在idea中使用Java语言编写了一个新的计算器并尝试连接数据库




五.相关代码
登录页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="login.css">
</head>
<body>
<form action="2.计算器登录.html" method="post">
<div id="login">
<span >
<h1 id="lo">计算器登录</h1>
</span>
<div id="use">账号
<input text="text" id="user" required placeholder="请输入用户名" >
</div>
<br>
<div id="psw">密码
<input text="password" id="password" required placeholder="请输入密码" >
</div>
<br>
<br>
<button type="submit" onclick="myFunction()" id="butt">登录</button>
</div>
</form>
<meta http-equiv="refresh" content="5;url=http://localhost:63342/helloworld/jisuanqi.html?_ijt=7c17t3tmqo48q00bqeiuvob5l4">`
</body>
<script>
<!-- 登陆验证-->
function myFunction() {
if (document.getElementById("user").value == "admin") {
if (document.getElementById("password").value == "123456") {
alert("登录成功");
}
else {
alert("密码错误");
}
}
else {
alert("账号密码都错");
}
}
</script>
</body>
</html>
用html写的计算器代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>计算器</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
text-align: center;
background-image: url("https://img.tt98.com/d/2020/2020062917009557/5ef9ab0e0f1fd.jpg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
p {
position: absolute;
right: 450px;
}
.shuchukuang {
width: 290px;
height: 80px;
margin: 60px auto 5px auto;
font-size: 0px;
}
.shuchukuang input {
margin: 0;
border-radius: 30px;
cursor: not-allowed;
}
.shuchukuang .outbefore {
width: 290px;
height: 30px;
border: none;
border-radius: 0;
font-size: 20px;
color: #d0d0d1;
}
.shuchukuang .outafter {
width: 290px;
height: 50px;
border-radius: 0;
font-size: 45px;
border: none;
}
.gongneng {
font-size: 0;
}
input {
width: 70px;
height: 45px;
margin: 2px;
box-shadow: 2px 2px 2px gray;
background-color: #b490b8;
border: none;
border-radius: 25px;
outline: none;
cursor: pointer;
}
input:hover {
background-color: aqua;
}
</style>
</head>
<body>
<h1>欢迎使用邓文鑫的计算器</h1>
<p>---键盘使用也可,shift清零</p>
<div class="shuchukuang">
<input type="text" class="outbefore" id="shuchukuangbefore" readonly="readonly">
<input type="text" class="outafter" id="shuchukuangafter" readonly="readonly">
</div>
<div class="gongneng">
<input type="button" value="平方" id="平方">
<input type="button" value="+/-" id="+/-">
<input type="button" value="CE" id="CE">
<input type="button" value="退格" id="退格">
</div>
<script>
var i, m;
// 此处更改symbol值的顺序是为了实现键盘事件,因为键码值的顺序连续
var symbol = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "*", "+", "=", "-", ".", "/"];
// 外面的for循环动态设置了四个div盒子,分别装有四个不同的按钮
for (i = 0; i < symbol.length / 4; i++) {
var div = document.createElement("div");
// 里面的for循环动态设置了四个不同的按钮
for (m = 0; m < symbol.length / 4; m++) {
var input = document.createElement("input");
input.type = "button";
input.value = symbol[i * 4 + m];
input.id = i * 4 + m;
// 将四个按钮添加给div
div.appendChild(input);
input.onclick = function () {
// this指的是调用函数的对象,此处指的是input
shuchukuangbefore.value += this.value;
}
// 补全因两个input(shuchukuangbefore和shuchukuangafter)导致的加减乘除键盘的修正
if (input.id == 10 || input.id == 11 || input.id == 13 || input.id == 15) {
input.onclick = function () {
// this指的是调用函数的对象,此处指的是input
if (shuchukuangafter.value != 0) {
shuchukuangbefore.value = shuchukuangafter.value;
}
shuchukuangbefore.value += this.value;
}
}
}
document.body.appendChild(div);
}
// 定义最后输出内容按钮
var results = document.getElementById("12");
results.onclick = function () {
var result;
// 判断程序是否出错,当出错时会出现err错误值
try {
// 这里的if语句和isInteger是为了判断输出框内容是否为小数
function isInteger(obj) {
return (obj | 0) === obj
}
if (isInteger((eval(shuchukuangbefore.value))) == true) {
result = eval(shuchukuangbefore.value);
}
else {
result = eval(shuchukuangbefore.value).toFixed(2);
}
}
catch (err) {
result = err;
}
shuchukuangbefore.value += "=";
shuchukuangafter.value = result;
}
// 定义清零CE按钮
var clear = document.getElementById("CE");
clear.onclick = function () {
shuchukuangbefore.value = "";
shuchukuangafter.value = "";
}
// 定义退格backspace按钮
var Backspace = document.getElementById("退格");
Backspace.onclick = function () {
var back = shuchukuangbefore.value;
var Backed = back.substring(0, back.length - 1);
shuchukuangbefore.value = Backed;
}
// 定义平方按钮
var pingfang = document.getElementById("平方");
pingfang.onclick = function () {
shuchukuangafter.value = Math.pow(shuchukuangbefore.value, 2);
}
//定义+/-按钮
//让符号变反数,当有shuchukuangafter时对输出结果进行正反输出,当shuchukuangafter没有时对shuchukuagnbefore进行正反输出
var zhengfan = document.getElementById("+/-");
zhengfan.onclick = function () {
if (shuchukuangafter.value != 0)
shuchukuangafter.value = -shuchukuangafter.value;
else {
shuchukuangbefore.value = -shuchukuangbefore.value;
}
}
// 定义键盘事件
document.body.onkeydown = function (e) {
// 键盘事件:使用键盘时会触发其他按钮点击事件,导致字符多输入情况
e.preventDefault();
// 补全因两个input(shuchukuangbefore和shuchukuangafter)导致的加减乘除键盘的修正
if (e.keyCode == 106 || e.keyCode == 107 || e.keyCode == 109 || e.keyCode == 111) {
if (shuchukuangafter.value != 0) {
shuchukuangbefore.value = shuchukuangafter.value;
// var yuzeliang = e.keyCode;
// shuchukuangbefore.value += document.getElementById(yuzeliang - 96).value;
}
}
// 定义十个数字和加减乘除和.的键盘事件,此处i是它们的键码值
for (var i = 96; i <= 111; i++) {
if (e.keyCode === i) {
shuchukuangbefore.value += document.getElementById(i - 96).value;
}
}
// 定义enter事件,计算出多少数值
if (e.keyCode === 13) {
try {
function isInteger(obj) {
return (obj | 0) === obj
}
if (isInteger((eval(shuchukuangbefore.value))) == true) {
result = eval(shuchukuangbefore.value);
}
else {
result = eval(shuchukuangbefore.value).toFixed(2);
}
}
catch (err) {
result = err;
}
shuchukuangbefore.value += "=";
shuchukuangafter.value = result;
}
// 定义退格backspace事件
if (e.keyCode === 8) {
var back = shuchukuangbefore.value;
var Backed = back.substring(0, back.length - 1);
shuchukuangbefore.value = Backed;
}
//定义清零按钮shift
if (e.keyCode === 16) {
shuchukuangbefore.value = "";
shuchukuangafter.value = "";
}
}
</script>
</body>
</html>
用Java写的计算器代码:
package gui;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator extends JFrame {
public static void main(String[] args) {
new Calculator();
}
// 构造方法
public Calculator() {
Container container = getContentPane();// 定义一个顶级容器
setLayout(new GridLayout(2, 1));
final JTextField jTextField = new JTextField();
jTextField.setHorizontalAlignment(jTextField.RIGHT);
JButton jButton0 = new JButton("0");
JButton jButton1 = new JButton("1");
JButton jButton2 = new JButton("2");
JButton jButton3 = new JButton("3");
JButton jButton4 = new JButton("4");
JButton jButton5 = new JButton("5");
JButton jButton6 = new JButton("6");
JButton jButton7 = new JButton("7");
JButton jButton8 = new JButton("8");
JButton jButton9 = new JButton("9");
JButton point = new JButton(".");
JButton equ = new JButton("=");
JButton plus = new JButton("+");
JButton minus = new JButton("-");
JButton mtp = new JButton("*");
JButton dvd = new JButton("/");
JButton sqr = new JButton("sqrt");
JButton root = new JButton("x^2");
JButton tg = new JButton("退格");
JButton ql = new JButton("清零");
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(4, 5, 3, 3));// 3,3为水平垂直间距
jPanel.add(jButton7);
jPanel.add(jButton8);
jPanel.add(jButton9);
jPanel.add(plus);
jPanel.add(sqr);
jPanel.add(jButton4);
jPanel.add(jButton5);
jPanel.add(jButton6);
jPanel.add(minus);
jPanel.add(root);
jPanel.add(jButton1);
jPanel.add(jButton2);
jPanel.add(jButton3);
jPanel.add(mtp);
jPanel.add(ql);
jPanel.add(jButton0);
jPanel.add(point);
jPanel.add(equ);
jPanel.add(dvd);
jPanel.add(tg);
container.add(jTextField);
container.add(jPanel);
setSize(400, 300);
setVisible(true);
setTitle("计算器");
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 计算器功能实现
jButton0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {// 与0作比较
jTextField.requestFocus();// 把输入焦点放在调用这个方法的控件上
} else {
String string = jTextField.getText();
jTextField.setText(string + "0");
}
}
});
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("1");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "1");
}
}
});
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("2");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "2");
}
}
});
jButton3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("3");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "3");
}
}
});
jButton4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("4");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "4");
}
}
});
jButton5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("5");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "5");
}
}
});
jButton6.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("6");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "6");
}
}
});
jButton7.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("7");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "7");
}
}
});
jButton8.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("8");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "8");
}
}
});
jButton9.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("9");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "9");
}
}
});
point.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText(".");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + ".");
}
}
});
plus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("+");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "+");
}
}
});
minus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("-");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "-");
}
}
});
mtp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("*");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "*");
}
}
});
dvd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().equals("0")) {
jTextField.setText("");
jTextField.setText("/");
jTextField.requestFocus();
} else {
String string = jTextField.getText();
jTextField.setText(string + "/");
}
}
});
tg.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String string = jTextField.getText();
int length = string.length();
if (length > 0)
string = string.substring(0, length - 1);
if (string.length() == 0)
jTextField.setText("0");
else
jTextField.setText(string);
}
});
ql.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
jTextField.setText("0");
}
});
root.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String string = jTextField.getText();
Double double1 = Double.parseDouble(string);// 将字符串转换为double
Double double2 = double1 * double1;
String string2 = string.valueOf(double2);// 将double转换为string
jTextField.setText(string2);
}
});
sqr.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String string = jTextField.getText();
Double double1 = Double.parseDouble(string);// 将字符串转换为double
Double double2 = (Double) Math.sqrt(double1);
String string2 = string.valueOf(double2);// 将double转换为string
jTextField.setText(string2);
}
});
equ.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jTextField.getText().indexOf("+") != -1) {
String[] string = jTextField.getText().split("[+]");// ******转义字符*****
Double double1 = Double.parseDouble(string[0]);
Double double2 = Double.parseDouble(string[1]);
Double double3 = double1 + double2;
String string2 = String.valueOf(double3);
jTextField.setText(string2);
} else if (jTextField.getText().indexOf("-") != -1) {
String[] string = jTextField.getText().split("-");
Double double1 = Double.parseDouble(string[0]);
Double double2 = Double.parseDouble(string[1]);
Double double3 = double1 - double2;
String string2 = String.valueOf(double3);
jTextField.setText(string2);
} else if (jTextField.getText().indexOf("*") != -1) {
String[] string = jTextField.getText().split("[*]");// ***转义字符***
Double double1 = Double.parseDouble(string[0]);
Double double2 = Double.parseDouble(string[1]);
Double double3 = double1 * double2;
String string2 = String.valueOf(double3);
jTextField.setText(string2);
} else if (jTextField.getText().indexOf("/") != -1) {
String[] string = jTextField.getText().split("/");
Double double1 = Double.parseDouble(string[0]);
Double double2 = Double.parseDouble(string[1]);
Double double3 = double1 / double2;
String string2 = String.valueOf(double3);
jTextField.setText(string2);
} else {
jTextField.setText("还没有你所输入的用算");
}
}
});
}
}
连接数据库相关代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/calculate";
String username = "root"; // 替换为您的数据库用户名
String password = "123456"; // 替换为您的数据库密码
try {
// 加载并注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url, username, password);
// 创建Statement对象
Statement statement = connection.createStatement();
// 执行SQL查询
ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable"); // 替换为您的表名称
// 处理结果集
while (resultSet.next()) {
System.out.println("Column1: " + resultSet.getString("column1")); // 替换为您的列名称
System.out.println("Column2: " + resultSet.getString("column2")); // 替换为您的列名称
}
// 关闭连接和Statement对象
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

数据库查询操作
六.实验总结与感受
通过本次实验,深刻了解到自己在代码方面以及对于项目整体框架认识的不足,希望在今后的学习中能更加认真地投入到学习中,了解到更多相关知识。