有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
模拟程序如下:
用因果图法测试该程序,并撰写实验报告。
实验步骤:
①编写程序
package org.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class VendingMachine extends JFrame {
private JRadioButton oneYuan, fiftyFen;
private JRadioButton orangeJuice, beer;
private JButton confirm, reset;
private JTextField drinkField, changeField;
public VendingMachine() {
setTitle("自动售货机模拟程序");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(6, 2));
panel.add(new JLabel("请投币:"));
oneYuan = new JRadioButton("一元");
fiftyFen = new JRadioButton("五角");
ButtonGroup coinGroup = new ButtonGroup();
coinGroup.add(oneYuan);
coinGroup.add(fiftyFen);
JPanel coinPanel = new JPanel();
coinPanel.add(oneYuan);
coinPanel.add(fiftyFen);
panel.add(coinPanel);
panel.add(new JLabel("请选择商品:"));
orangeJuice = new JRadioButton("橙汁");
beer = new JRadioButton("啤酒");
ButtonGroup drinkGroup = new ButtonGroup();
drinkGroup.add(orangeJuice);
drinkGroup.add(beer);
JPanel drinkPanel = new JPanel();
drinkPanel.add(orangeJuice);
drinkPanel.add(beer);
panel.add(drinkPanel);
confirm = new JButton("确定");
reset = new JButton("复位");
panel.add(confirm);
panel.add(reset);
drinkField = new JTextField(20);
changeField = new JTextField(20);
panel.add(new JLabel("请取饮料:"));
panel.add(drinkField);
panel.add(new JLabel("找零:"));
panel.add(changeField);
add(panel);
confirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String result = vendingMachine();
drinkField.setText(result.split(",")[0]);
if (result.contains("退回")) {
changeField.setText(result.split(",")[1]);
} else {
changeField.setText("");
}
}
});
reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fiftyFen.setSelected(false);
oneYuan.setSelected(false);
orangeJuice.setSelected(false);
beer.setSelected(false);
drinkField.setText("");
changeField.setText("");
}
});
}
private String vendingMachine() {
if (!oneYuan.isSelected() && !fiftyFen.isSelected()) {
return "无效输入:请投币";
}
if (!orangeJuice.isSelected() && !beer.isSelected()) {
return "无效输入:请选择商品";
}
String coin = oneYuan.isSelected() ? "1 元" : "5 角";
String drink = orangeJuice.isSelected() ? "橙汁" : "啤酒";
if (coin.equals("1 元")) {
return drink + ",退回 5 角硬币";
} else {
return drink;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new VendingMachine().setVisible(true);
}
});
}
}
②分析原因与结果
原因:
C1:投入一元
C2:投入五角
C3:选择橙汁
C4:选择啤酒
结果:
B1:送出橙汁
B2:送出啤酒
B3:退回5角硬币(如果投入一元)
③画出因果图
④转化为决策表
序号 |
C1C1 |
C2C2 |
B1B1 |
B2B2 |
R1R1 |
R2R2 |
R3R3 |
1 |
是 |
否 |
是 |
否 |
是 |
否 |
否 |
2 |
是 |
否 |
否 |
是 |
否 |
是 |
否 |
3 |
否 |
是 |
是 |
否 |
是 |
否 |
是 |
4 |
否 |
是 |
否 |
是 |
否 |
是 |
是 |
5 |
否 |
否 |
是 |
否 |
无效输入 |
无效输入 |
无效输入 |
6 |
否 |
否 |
否 |
是 |
无效输入 |
无效输入 |
无效输入 |
7 |
是 |
是 |
是 |
否 |
无效输入 |
无效输入 |
无效输入 |
8 |
是 |
是 |
否 |
是 |
无效输入 |
无效输入 |
无效输入 |
⑤根据决策表设计测试用例,得到测试用例表
序号 |
输入数据 |
覆盖条件 |
预期输出 |
1 |
coin=0.5,button="橙汁"coin=0.5,button="橙汁" |
C1,B1C1,B1 |
送出 橙汁 |
2 |
coin=0.5,button="啤酒"coin=0.5,button="啤酒" |
C1,B2C1,B2 |
送出 啤酒 |
3 |
coin=1.0,button="橙汁"coin=1.0,button="橙汁" |
C2,B1C2,B1 |
送出 橙汁,退回 5 角硬币 |
4 |
coin=1.0,button="啤酒"coin=1.0,button="啤酒" |
C2,B2C2,B2 |
送出 啤酒,退回 5 角硬币 |
5 |
coin=0.0,button="橙汁"coin=0.0,button="橙汁" |
无效输入 |
无效输入:请投入 5 角或 1 元硬币 |
6 |
coin=0.0,button="啤酒"coin=0.0,button="啤酒" |
无效输入 |
无效输入:请投入 5 角或 1 元硬币 |
7 |
coin=0.5,button="可乐"coin=0.5,button="可乐" |
无效输入 |
无效输入:请选择“橙汁”或“啤酒” |
8 |
coin=1.0,button="可乐"coin=1.0,button="可乐" |
无效输入 |
无效输入:请选择“橙汁”或“啤酒” |