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

2.登陆界面代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title> <style> body { font-family: 'Arial', sans-serif; background-color: #f1f1f1; } .container { max-width: 400px; margin: 0 auto; padding: 20px; background-color: #fff; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); margin-top: 100px; } h2 { text-align: center; } .form-group { margin-bottom: 20px; } .form-group label { display: block; font-weight: bold; margin-bottom: 5px; } .form-group input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 3px; } .form-group input[type="submit"] { background-color: #4CAF50; color: #fff; cursor: pointer; } </style> </head> <body> <div class="container"> <h2>登录</h2> <form action="/login" method="post" id="loginForm"> <div class="form-group"> <label for="用户名">用户名</label> <input type="text" id="用户名" name="username" required> </div> <div class="form-group"> <label for="密码">密码</label> <input type="password" id="密码" name="password" required> </div> <div class="form-group"> <label for="验证码">验证码</label> <input type="text" id="验证码" name="captcha" required> <!-- 在此处添加验证码图像 --> <!-- 可以使用外部链接或内联图像 --> <!-- <img src="/captcha.png" alt="Captcha" id="captchaImage"> --> </div> <div class="form-group"> <input type="submit" value="登录"> </div> </form> </div> </body> </html>
3.登陆界面图片:

4.计算器简易流程图

5.计算器实现代码(第一次作业)
package calculation4; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class calculation4 extends JFrame { private static final long serialVersionUID = 1L; //实现序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性 Container c = getContentPane(); //用于固定宽度并支持响应式布局的容器 StringBuilder number1 = new StringBuilder(""); // 储存第1个数字字符串 StringBuilder number2 = new StringBuilder(""); // 储存第2个数字字符串 StringBuilder operator = new StringBuilder(""); // 储存运算符 StringBuilder result = new StringBuilder(""); // 储存运算结果 JTextField numbershow = new JTextField("0"); // 数字显示区域,初始显示为"0" public static void main(String[] args) { // 主方法 //除键(C):在计算中按下此键将清除除存储器内容外的所有数值和计算符号,即可以重新开始输入计算. //清除键(CE):在计算中按下此键将清除除存储器内容外的上一步内容,即可以重新输入按CE前输入的数字(含多位数)或计算符号. calculation4 c1 = new calculation4(); c1.setVisible(true);} public calculation4() { // 计算器构造方法 setTitle("计算器"); setBounds(100, 100, 260, 245); setResizable(false); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); createNumberShow(); // 创建数字显示区域 createClearButtons();// 创建Backspace,CE,C等三个按钮 createButtonArea(); // 创建数字按钮区域 } private void createNumberShow() { // 创建数字显示区域的方法 numbershow.setHorizontalAlignment(JTextField.RIGHT); numbershow.setBounds(5, 0, 245, 22); numbershow.setEnabled(false); numbershow.setDisabledTextColor(Color.BLACK); c.add(numbershow);} private void createClearButtons() { // 创建Backspace,CE,C等三个按钮的方法 JButton[] clearbutton = new JButton[3]; String[] clearbuttontext = { "Backspace", "CE", "C" }; for (int i = 0; i < 3; i++) { clearbutton[i] = new JButton(); clearbutton[i].setText(clearbuttontext[i]); clearbutton[i].setHorizontalAlignment(SwingConstants.CENTER); clearbutton[i].setMargin(new Insets(0, 0, 0, 0)); clearbutton[i].setFont(new java.awt.Font("Arial", 0, 9)); clearbutton[i].setForeground(Color.blue); clearbutton[i].setBounds(48 + i * 68, 30, 63, 22); clearbutton[i].setForeground(Color.red); c.add(clearbutton[i]);} clearbutton[0].addActionListener(new ActionListener() {// 为Backspace按钮添加监听器 public void actionPerformed(ActionEvent e) { if (number1.toString().equals("")) { // 如果未做任何输入 showNumber(numbershow, number1); // 显示number1 } else if (operator.toString().equals("")) { // 如果只输入了number1 number1.deleteCharAt(number1.toString().length() - 1);// 将number1的最后一个字符去掉 showNumber(numbershow, number1); // 显示number1 } else if (number2.toString().equals("")) { // 如果只输入了number1和operator showNumber(numbershow, number1); // 不作任何处理,显示number1 } else { // 如果输入了number1、operator、number2 number2.deleteCharAt(number2.toString().length() - 1);// 将number2的最后一个字符去掉 showNumber(numbershow, number2); // 显示number2 } }}); clearbutton[1].addActionListener(new ActionListener() {// 为CE按钮添加监听器 public void actionPerformed(ActionEvent e) { if (number1.toString().equals("")) { // 如果未做任何输入 showNumber(numbershow, number1); // 显示number1 } else if (operator.toString().equals("")) { // 如果只输入了number1 number1.setLength(0); // 清除number1 showNumber(numbershow, number1); // 显示number1 } else if (number2.toString().equals("")) { // 如果输入了number1和operator showNumber(numbershow, number2); // 不作任何处理,显示number2 } else { // 如果输入了number1、operator、number2 number2.setLength(0); // 清除number2 showNumber(numbershow, number2); // 显示number2 } } }); clearbutton[2].addActionListener(new ActionListener() {// 为C按钮添加监听器 public void actionPerformed(ActionEvent e) { // 将所有储存清零 number1.setLength(0); number2.setLength(0); operator.setLength(0); numbershow.setText("0."); result.setLength(0); } });} private void createButtonArea() { // 创建数字按钮区域的方法 JPanel ButtonArea = new JPanel(); ButtonArea.setBounds(5, 55, 245, 125); ButtonArea.setLayout(new GridLayout(4, 5, 5, 5)); c.add(ButtonArea); JButton[] numberbutton = new JButton[20]; String[] numberbuttontext = { "7", "8", "9", "/", "sqrt", "4", "5", "6","*", "%", "1", "2", "3", "-", "1/X", "0", "+/-", ".", "+", "=" }; for (int i = 0; i <= 19; i++) { // 使用循环为这20个按钮添加标识 numberbutton[i] = new JButton(numberbuttontext[i]); ButtonArea.add(numberbutton[i]); if (i % 5 == 3 || i == 19) {// 操作符按钮设置为红色 numberbutton[i].setHorizontalAlignment(SwingConstants.CENTER);//文本居中 numberbutton[i].setMargin(new Insets(0, 0, 0, 0));//构件在显示区的上,左,下,右的空白区0 numberbutton[i].setFont(new java.awt.Font("Arial", 0, 9)); //name表示的是字体的样式,常用的字体有Times New Roman、Symbol、宋体、楷体等。 //style表示的是字体的风格,默认是正常Font.PLAIN,有加粗Font.BLOD,有斜体Font.INTALIC //可以加粗+斜体Font.BLOD + Font.INTALIC numberbutton[i].setForeground(Color.red); } else { // 其它设置为蓝色 numberbutton[i].setHorizontalAlignment(SwingConstants.CENTER); numberbutton[i].setMargin(new Insets(0, 0, 0, 0)); numberbutton[i].setFont(new java.awt.Font("Arial", 0, 9)); numberbutton[i].setForeground(Color.blue); }} int[] numbers = { 15, 10, 11, 12, 5, 6, 7, 0, 1, 2 };// 该数组分别代表0-9等数字在numberbuttontext数组中序号 for (int i = 0; i <= 9; i++) { // 使用循环为这0-9这十个数字按钮添加监听器 final String str = String.valueOf(i); //封装,将括号里面这个 i 的值转换成一个‘String’类型的值 numberbutton[numbers[i]].addActionListener(new ActionListener() {// 为0-9按钮添加监听器 public void actionPerformed(ActionEvent e) { if (operator.toString().equals("")) { // 没有输入operator之前 add(number1, str); // 只设置number1的值 showNumber(numbershow, number1); // 只显示number1的值 } else { // 输入operator之后 add(number2, str); // 只设置number2的值 showNumber(numbershow, number2); // 只显示number2的值 } }}); } numberbutton[16].addActionListener(new ActionListener() { // 为"+/-"按钮添加监听器 public void actionPerformed(ActionEvent e) { if (operator.toString().equals("")) { // 没有输入operator之前 add(number1, "+/-"); // 只设置number1的值 showNumber(numbershow, number1); // 只显示number1的值 } else { // 输入operator之后 add(number2, "+/-"); // 只设置number2的值 showNumber(numbershow, number2); // 只显示number2的值 } }}); numberbutton[17].addActionListener(new ActionListener() { // 为"."按钮添加监听器 public void actionPerformed(ActionEvent e) { if (operator.toString().equals("")) { // 在输入operator之前,只显示number1的值 add(number1, "."); showNumber(numbershow, number1); } else { // 在输入operator之后,只显示number2的值 add(number2, "."); showNumber(numbershow, number2); } } }); numberbutton[18].addActionListener(new ActionListener() { // 为"+"按钮添加监听器 public void actionPerformed(ActionEvent e) { operator.setLength(0); operator.append("+"); }}); numberbutton[13].addActionListener(new ActionListener() { // 为"-"按钮添加监听器 public void actionPerformed(ActionEvent e) { operator.setLength(0); operator.append("-");} }); numberbutton[8].addActionListener(new ActionListener() { // 为"*"按钮添加监听器 public void actionPerformed(ActionEvent e) { operator.setLength(0); operator.append("*");}}); numberbutton[3].addActionListener(new ActionListener() { // 为"/"按钮添加监听器 public void actionPerformed(ActionEvent e) { operator.setLength(0); operator.append("/");}}); numberbutton[19].addActionListener(new ActionListener() { // 为"="按钮添加监听器 public void actionPerformed(ActionEvent e) { if (number1.toString().equals("")) {// 当number1为空时 showNumber(numbershow, number1); } else if (operator.toString().equals("")) { // 当number1不为空,而operator为空时 showNumber(numbershow, number1); } else if (number2.toString().equals("")) { // 当number1、operator均不为空,而number2为空时 switch (operator.toString()) { case ("+"): { number2.append(number1.toString());//1=2 double d = Double.parseDouble(number1.toString())+ Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break; case ("-"): { number2.append(number1.toString()); double d = Double.parseDouble(number1.toString())- Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break; case ("*"): { number2.append(number1.toString()); double d = Double.parseDouble(number1.toString())* Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break; case ("/"): { number2.append(number1.toString()); double d = Double.parseDouble(number1.toString())/ Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break;}} else { // 当number1、operator、number2均不为空时 switch (operator.toString()) { case ("+"): { double d = Double.parseDouble(number1.toString())+ Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break; case ("-"): { double d = Double.parseDouble(number1.toString())- Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break; case ("*"): { double d = Double.parseDouble(number1.toString())* Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break; case ("/"): { double d = Double.parseDouble(number1.toString())/ Double.parseDouble(number2.toString()); result.setLength(0); result.append(d); showNumber(numbershow, result); number1.setLength(0); number1.append(d);} break;}}}}); numberbutton[14].addActionListener(new ActionListener() { // 为"1/x"按钮添加监听器 public void actionPerformed(ActionEvent e) { if (number1.toString().equals("")) { // 没有输入number1时 numbershow.setText("输入非法0"); } else if (operator.toString().equals("")) { // 输入了number1,但没有输入operator if (Double.parseDouble(number1.toString()) == 0) { // 如果number1的值为零 numbershow.setText("除数不能为零"); } else { // 如果number1的值不为零 double d = 1 / (Double.parseDouble(number1.toString())); number1.setLength(0); number1.append(d); // 将number1的值开放并存储 showNumber(numbershow, number1);} } else if (number2.toString().equals("")) { // 输入了number1、operator,但没有输入number2 double d = 1 / (Double.parseDouble(number1.toString())); number2.append(d);// 将number1的值开放并存储 showNumber(numbershow, number2); } else { // 输入了number1、operator,number2 double d = 1 / (Double.parseDouble(number2.toString())); number2.setLength(0); number2.append(d);// 将number2的值开放并存储 showNumber(numbershow, number2);}}}); numberbutton[9].addActionListener(new ActionListener() { // 为"%"按钮添加监听器 public void actionPerformed(ActionEvent e) { if (number1.toString().equals("")) { // 没有输入number1时 numbershow.setText("输入非法0"); } else if (operator.toString().equals("")) { // 输入了number1,但没有输入operator if (Double.parseDouble(number1.toString()) == 0) { // 如果number1的值为零 numbershow.setText("0"); } else { // 如果number1的值不为零 double d = (Double.parseDouble(number1.toString())/100); number1.setLength(0); number1.append(d); // 将number1的值开放并存储 showNumber(numbershow, number1);} } else if (number2.toString().equals("")) { // 输入了number1、operator,但没有输入number2 double d = (Double.parseDouble(number1.toString())/100); number2.append(d);// 将number1的值开放并存储 showNumber(numbershow, number2); } else { // 输入了number1、operator,number2 double d = (Double.parseDouble(number2.toString())/100); number2.setLength(0); number2.append(d);// 将number2的值开放并存储 showNumber(numbershow, number2);}}}); numberbutton[4].addActionListener(new ActionListener() { // 为"sqrt"按钮添加监听器 public void actionPerformed(ActionEvent e) { if (number1.toString().equals("")) {// 没有输入number1时 showNumber(numbershow, number1); } else if (operator.toString().equals("")) {// 输入了number1,但没有输入operator if (Double.parseDouble(number1.toString()) < 0) {// number1小于0 numbershow.setText("函数输入无效"); } else {// number1大于0 double d = Math.sqrt(Double.parseDouble(number1.toString())); number1.setLength(0); number1.append(d);// 将number1的值开放并存储 showNumber(numbershow, number1);} } else if (number2.toString().equals("")) {// 输入了number1、operator,但没有输入number2 double d = Math.sqrt(Double.parseDouble(number1.toString())); number2.append(d);// 将number1的值开放并存储 showNumber(numbershow, number2); } else {// 输入了number1、operator、number2 double d = Math.sqrt(Double.parseDouble(number2.toString())); number2.setLength(0); number2.append(d);// 将number2的值开放并存储 showNumber(numbershow, number2);}}});} public void add(StringBuilder s1, String s2) { // 定义按钮输入后数字字符串变化的方法 if (s2.equals("+/-")) {// 定义输入"+/-"后数字字符串的变化 if (s1.toString().equals("") || s1.toString().equals("0")) {// 如果数字字符串为空或者0,那么不发生变化 s1.append(""); } else {// 如果数字字符串不为空也不为0,那么在数字字符串前增加或删除"-"字符 if (s1.toString().startsWith("-")) { s1.deleteCharAt(0); } else { s1.insert(0, "-");}}} if (s2.equals(".")) {// 定义输入"."后数字字符串的变化 if (s1.toString().indexOf(".") == -1) {// 查找数字字符串中是否含有"."字符,如果没有则执行以下代码 if (s1.toString().equals("")) {// 如果数字字符串为空,那么将数字字符串设置为"0." s1.setLength(0); s1.append("0"); } else { s1.append(".");}} else {// 如果有,则不发生变化 s1.append("");}} if (s2.equals("0")) {// 定义输入"0"后数字字符串的变化 if (s1.toString().equals("0")) {// 当数字的字符串为"0"时,不发生变化 s1.append(""); } else {// 当数字的字符串吧为"0"时,在其字符串后增加"0" s1.append("0");}} for (int i = 1; i < 10; i++) {// 通过循环,定义输入1-9后数字字符串的变化 String str = String.valueOf(i); if (s2.equals(str)) {// 定义输入1-9后数字字符串的变化 if (s1.toString().equals("0")) { s1.setLength(0); s1.append(str); } else s1.append(str);}}} public void showNumber(JTextField j, StringBuilder s) {// 定义数字显示区域如何显示数字字符串的方法 if (s.toString().equals("") == true || s.toString().equals("0") == true) { j.setText("0.");} else if (s.toString().indexOf(".") == -1) { j.setText(s.toString() + ".");} else { j.setText(s.toString());}}}
创建一个名为"HistoryRecord"的类来保存用户的历史计算记录。这个类可以包含用户输入和计算结果等属性
public class HistoryRecord { private String userInput; private double result; public HistoryRecord(String userInput, double result) { this.userInput = userInput; this.result = result; } public String getUserInput() { return userInput; } public double getResult() { return result; } }
之后在你的主类中定义一个List来保存用户的历史计算记录
import java.util.ArrayList; import java.util.List; public class Main { private static List<HistoryRecord> history = new ArrayList<>(); public static void main(String[] args) { String userInput = ""; while (!userInput.toLowerCase().equals("q")) { System.out.print("请输入一个数字(或输入'q'退出):"); userInput = getUserInput(); if (!userInput.toLowerCase().equals("q")) { double result = calculate(userInput); HistoryRecord record = new HistoryRecord(userInput, result); history.add(record); logHistory(record); } } } }
6.计算器实现效果:
输入-9开根号:

输入9开根号:

输入989-456=

输入94/8=

五、实验总结
通过这次计算器设计作业,我不仅学习了如何使用编程语言和算法来设计一个实用的计算器,还领悟到了问题解决和创新思维的重要性。不仅提高了自己的编程和算法能力,还培养了自己的创新思维和解决问题的能力。我深刻地感受到了计算机程序设计的魅力和挑战,并决定在未来的学习和工作中更加努力地学习和探索。

浙公网安备 33010602011771号