找零钱最佳组合

news/2025/3/26 2:51:13/文章来源:https://www.cnblogs.com/yuanxinglan/p/18788683

假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50(N50)10(N10) 5(N5)1(N1) 四种。

   请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。

实验步骤:

① 设计程序

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

public class ChangeCalculator {

    public static void main(String[] args) {

        // 创建主窗口

        JFrame frame = new JFrame("找零计算器");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(400, 200);

        

        // 创建面板

        JPanel panel = new JPanel();

        frame.add(panel);

        placeComponents(panel);

        

        // 设置窗口可见

        frame.setVisible(true);

    }

 

    private static void placeComponents(JPanel panel) {

        panel.setLayout(null);

 

        // 创建标签和文本框

        JLabel priceLabel = new JLabel("请输入商品价格(1-100元):");

        priceLabel.setBounds(10, 20, 300, 25);

        panel.add(priceLabel);

 

        JTextField priceInput = new JTextField(20);

        priceInput.setBounds(10, 50, 165, 25);

        panel.add(priceInput);

 

        JLabel paymentLabel = new JLabel("请输入付款金额(1-100元):");

        paymentLabel.setBounds(10, 80, 300, 25);

        panel.add(paymentLabel);

 

        JTextField paymentInput = new JTextField(20);

        paymentInput.setBounds(10, 110, 165, 25);

        panel.add(paymentInput);

 

        // 创建按钮

        JButton btnCalculate = new JButton("计算找零");

        btnCalculate.setBounds(190, 50, 100, 25);

        panel.add(btnCalculate);

 

        JButton btnReset = new JButton("重置");

        btnReset.setBounds(190, 110, 100, 25);

        panel.add(btnReset);

 

        // 创建标签用于显示结果

        JLabel resultLabel = new JLabel();

        resultLabel.setBounds(10, 140, 370, 25);

        panel.add(resultLabel);

 

        // 添加按钮点击事件

        btnCalculate.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                try {

                    int R = Integer.parseInt(priceInput.getText());

                    int P = Integer.parseInt(paymentInput.getText());

                    String result = calculateChange(R, P);

                    resultLabel.setText(result);

                } catch (NumberFormatException ex) {

                    resultLabel.setText("无效输入:请输入整数");

                }

            }

        });

 

        btnReset.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                priceInput.setText("");

                paymentInput.setText("");

                resultLabel.setText("");

            }

        });

    }

 

    private static String calculateChange(int R, int P) {

        // 检查输入是否有效

        if (R <= 0 || P <= 0 || R > 100 || P > 100 || P < R) {

            return "无效输入:价格和付款必须为整数且在1-100元之间,付款金额不能小于价格";

        }

 

        // 计算找零金额

        int C = P - R;

        if (C == 0) {

            return "无需找零";

        }

 

        // 计算最佳找零组合

        int N50 = C / 50;

        C %= 50;

        int N10 = C / 10;

        C %= 10;

        int N5 = C / 5;

        C %= 5;

        int N1 = C;

 

        return String.format("找零组合:%d 张 50 元,%d 张 10 元,%d 张 5 元,%d 张 1 元", N50, N10, N5, N1);

    }

}

 

① 划分等价类,得到等价类表。等价类表格式如下:

输入条件

有效等价类

唯一标识

无效等价类

唯一标识

价格 RR

0<R≤1000<R≤100 且为整数

E1

R≤0R≤0 或 R>100R>100

I1

 

 

 

RR 不是整数

I2

付款 PP

0<P≤1000<P≤100 且为整数

E2

P≤0P≤0 或 P>100P>100

I3

 

 

 

PP 不是整数

I4

付款与价格关系

P≥RPR

E3

P<RP<R

I5

 

② 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:

 

序号

输入数据

覆盖等价类

输出

1

R=50,P=100R=50,P=100

E1, E2, E3

找零组合:1 张 50 元,0 张 10 元,0 张 5 元,0 张 1 元

2

R=23,P=50R=23,P=50

E1, E2, E3

找零组合:0 张 50 元,2 张 10 元,1 张 5 元,2 张 1 元

3

R=99,P=100R=99,P=100

E1, E2, E3

找零组合:0 张 50 元,0 张 10 元,0 张 5 元,1 张 1 元

4

R=1,P=100R=1,P=100

E1, E2, E3

找零组合:1 张 50 元,4 张 10 元,1 张 5 元,4 张 1 元

5

R=0,P=50R=0,P=50

I1

无效输入:价格和付款必须大于 0

6

R=101,P=100R=101,P=100

I1

无效输入:价格和付款不能超过 100 元

7

R=50,P=49R=50,P=49

I5

无效输入:付款金额不能小于价格

8

R=50.5,P=100R=50.5,P=100

I2

无效输入:价格和付款必须为整数

9

R=50,P=100.5R=50,P=100.5

I4

无效输入:价格和付款必须为整数

 

③ 运用边界值法设计测试用例。

序号

输入数据

覆盖边界值

输出

1

R=1,P=1R=1,P=1

RR 和 PP 的最小值

无需找零

2

R=100,P=100R=100,P=100

RR 和 PP 的最大值

无需找零

3

R=1,P=100R=1,P=100

RR 最小值,PP 最大值

找零组合:1 张 50 元,4 张 10 元,1 张 5 元,4 张 1 元

4

R=99,P=100R=99,P=100

RR 接近最大值,PP 最大值

找零组合:0 张 50 元,0 张 10 元,0 张 5 元,1 张 1 元

5

R=50,P=50R=50,P=50

R=PR=P 的情况

无需找零

6

R=0,P=0R=0,P=0

无效边界值

无效输入:价格和付款必须大于 0

7

R=101,P=101R=101,P=101

无效边界值

无效输入:价格和付款不能超过 100 元

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904642.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我开发的【巨大娘的玩耍♥】游戏正在众筹中,参与即可获得限量优惠回报

大家好,我开发的【巨大娘的玩耍♥】游戏正在众筹中,参与即可获得限量优惠回报 游戏目前正在爱发电上众筹,众筹总额达成5千元即可开发和发布正式版。众筹截止日期:2025年7月23日 支持者可获得 8折激活码、获得所有玩家可见的特殊成就、上感谢名单 等 限量 回报~ 点我查看具体…

用于遥控车的先进PCB

该定制板集成了大功率电机控制,无线通信和高效电源管理在RC汽车的世界里,精确控制和效率是至关重要的。为了推动性能的极限,我专门为RC汽车设计了一个先进的PCB。这种定制板集成了大功率电机控制,无线通信和高效的电源管理,使其成为爱好者和机器人爱好者的理想选择。 为了…

读DAMA数据管理知识体系指南29文件和内容管理活动

读DAMA数据管理知识体系指南29文件和内容管理活动1. 规划生命周期的管理 1.1. 从文件的创建或接收文件后的分发、存储、检索、归档和潜在的销毁 1.2. 规划包括开发分类/索引系统和分类法,以实现文件的存储和检索 1.3. 重要的是,生命周期规划中需要为档案建立具体的制度 1.4. …

c语言实验2

1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 number = r…

使用 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化全攻略

使用 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化全攻略 环境准备 1. 安装 Python 环境版本要求:Python 3.11 或更高版本 验证安装:命令行执行 python --version 注意:安装时需勾选 "Add to PATH" 选项(Windows用户)2. 核心工具安装 # 安装 browser-use 框…

20234214 2024-2025-2 《Python程序设计》实验一报告

20234214 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2342 姓名: 唐果儿 学号:20234214 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 (一)实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; …

WinForm 使用 Win32 API 实现的无边框窗口

WinForm 使用 Win32 API 实现的无边框窗口前言 时光荏苒,转眼已近是2025年了。不知不觉两年多没有研究代码了,在这期间 .NET 10 都快 RC 了,前几天刷手机看到张队公众号里有关于 .NET 9.0 AOT 发布的内容,所以写了这些代码来测试一下 AOT 编译的效果,并评估未来是否开发支…

C语言打卡学习第4天(2025.3.23)

今天只写了几道基础题,又看了下数组和冒泡排序,概念搞懂了但是写代码还是比较困难,准备明天把排序这类题好好看看。

一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型

多线程允许程序同时执行多个任务,提升效率和响应性。线程分为新建、就绪、运行、阻塞和死亡五种状态。Python的GIL锁限制多线程并行执行,适合I/O密集型任务。生产者-消费者模型通过共享缓冲区和条件变量实现线程协作,解决数据共享问题。一文速通 Python 并行计算:01 Python…

Spring的三级缓存详解

目录 1、什么是三级缓存 2、三级缓存详解Bean实例化前属性赋值/注入前初始化后总结3、怎么解决的循环依赖 4、不用三级缓存不行吗 5、总结 一、什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形态的三个Map集合,如下:

20244207 实验一 《python程序设计》实验报告

# 20244207 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 赵文萱 学号:20244207 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,…