软件测试(第2版)_Paul学习03_01——Ch2举例_03

2.4 佣金问题

第三个例子是个典型的商务计算例子,包含了计算和决策。

2.4.1 问题陈述

步枪销售商销售制造商制造的步枪机(lock)、枪托(stock)和枪管(barrel)。枪机卖45美元,枪托卖30美元,枪管卖25美元。销售商每月至少要售出一只完整的步枪,且生产限额是大多数销售商在一个月内科销售70个枪机、80个枪托和90个枪管。每访问一个镇子之后,销售商都给制造商发出电报,说明在那个镇子中售出的枪机、枪托和枪管数量。到了月末,销售商要发出一封很短的电报,通知-1个枪机被售出。这样步枪制造商就知道当月的销售情况,并计算销售商的佣金如下:销售额不到(含)1000美元的部分为10%,1000(不含)~1800(含)美元的部分15%,超过1800美元的部分20%。佣金程序生成月份销售报告,汇总售出的枪机、枪托和枪管总数,销售商的总销售额以及佣金。

2.4.2 讨论

这个问题分为三个不同的部分:输入数据部分,用来处理输入数据有效性;销售额计算部分;以及佣金计算部分。在实现中省略数据输入有效性部分,使用while循环模拟电报规则。

2.4.3 实现

C语言实现代码如下:

 

#include <stdio.h>
int main(void)
{
	int locks, stocks, barrels;
	double lockPrice, stockPrice, barrelPrice;
	int totalLocks, totalStocks, totalBarrels;
	double lockSales, stockSales, barrelSales;
	double sales, commission;
	
	lockPrice = 45.0;
	stockPrice = 30.0;
	barrelPrice = 25.0;
	
	totalLocks = 0;
	totalStocks = 0;
	totalBarrels = 0;
	
	printf("Enter locks:\n");
	scanf("%d",&locks);
	while(locks != -1)
	{
		printf("Enter stocks and barrels:\n");
		scanf("%d,%d", &stocks, &barrels);
		totalLocks += locks;
		totalStocks += stocks;
		totalBarrels += barrels;
		printf("Enter locks:\n");
		scanf("%d",&locks);
	}
	
	printf("Locks sold: %d\n", totalLocks);
	printf("Stocks sold: %d\n", totalStocks);
	printf("Barrels sold: %d\n", totalBarrels);
	
	lockSales = lockPrice * totalLocks;
	stockSales = stockPrice * totalStocks;
	barrelSales = barrelPrice * totalBarrels;
	sales = lockSales + stockSales + barrelSales;
	printf("Total sales: %.2f\n", sales);
	
	if (sales > 1800.0)
	{
		commission  = 0.10 * 1000;
		commission += 0.15 * 800;
		commission += 0.20 * (sales - 1800);
	}
	else if (sales > 1000.0)
	{
		commission  = 0.10 * 1000;
		commission += 0.15 * (sales - 1000);	
	}
	else
	{
		commission  = 0.10 * sales;
	}
	
	printf("Commission is $%.2f\n", commission);
}

2.5 SATM系统

为了更好地讨论集成和系统测试问题,需要一个适用范围更大的例子。这里介绍一个简化的ATM的系统SATM作为讨论的例子,其包含了各种功能和交互,是典型的客户-服务器系统的客户端。书中本章和后续章节只给出了需求规格、界面和有关业务的有限状态机、流程图等。后续考虑适用Java语言实现一个简单的模拟系统,在所有的基础问题讨论后,再专门进行一个分析和研究。

2.5.1 问题陈述

SATM系统通过如图2所示的15个屏幕与银行客户通信。采用具有如图1所示的功能终端,SATM客户可以选择三种事务中的任意一种:存款、取款和余额查询。这些事务可以在两类账户上完成:支票账户和储蓄账户。

 

图1 SATM终端

当银行客户来到SATM机前时,显示屏幕1.银行客户通过带有个人账户编号(PAN)编码的塑料卡片访问SATM系统,这是打开包含客户姓名和账户信息等的内部客户账户文件的钥匙。如果客户的PAN与客户账户文件中的信息匹配,系统向客户显示屏幕2.如果没有找到客户的PAN,则显示屏幕4,并留下卡片。

当出现屏幕2时,系统会提示客户输入个人标识编号(PIN)。如果所输入的PIN正确则系统显示屏幕5,否则显示屏幕3.客户有3次机会更正PIN,三次失败之后,会显示屏幕4,并留下卡片。

当出现屏幕5时,系统会向客户的账户文件中增加两条信息:当前日期和ATM会话递进编号。客户从屏幕5中显示的选项中选取所需的事务,然后系统立即显示屏幕6,从中用户选择被选事务要处理的账户。

如果请求查询余额,则系统会检查本地ATM文件,寻找未完成的事务,并使这些事务五从客户账户文件得到的该日开始余额一直。然后显示屏幕14.

如果请求存款,则存款信封槽的状态要通过终端控制文件中的一个字段确定。如果没有问题,则系统会显示屏幕7,获得事务金额。如果存款信封槽有问题,则显示屏幕12。一旦输入存款账户之后,系统显示屏幕13,接受存款信封,并处理存款。如果所输入的存款金额是本地ATM文件中的未完成金额,则每个月的存货计数加1。这些都由主ATM(中心)系统每天处理一次。然后显示屏幕14。

如果请求取款,则系统检查终端控制文件中的取款通道状态(是阻塞还是可用)。如果阻塞,则显示屏幕10,否则显示屏幕7,使客户能够输入取款金额。一旦输入取款金额,系统要检查终端文件状态,查看是否有足够存款可提取,如果存款不足,则显示屏幕9,否则处理取款。系统检查客户余额,如果资金不足,则显示屏幕8。如果账户余额足够,则显示屏幕11并付现金。提取金额被写入未完成的本地ATM文件中,每月取款技术加1。余额打印在事务收据上,与余额请求事务的处理过程相同,客户取走现金之后,显示屏幕14.

如果客户按下屏幕10、12、14中的按钮否,则系统会显示屏幕15,并退回客户的ATM卡。一旦卡从卡槽中取走,系统会显示屏幕1。如果客户按下屏幕10、12、14中的按钮是,则系统会显示屏幕5,使客户可以选择额外的事务。

 

图2 SATM屏幕

2.5.2 讨论

SATM系统是一个简化的ATM系统,有很多细节方面还不是那么完善,与真实的ATM有很多不同,与我们的ATM适用习惯也可能不同,只是为了讨论问题方便做了必要的简化,对于其的理解,尽可能从前面的问题陈述中去理解,不要仅仅凭经验去理解。

2.6 货币转换器

问题描述:这个应用程序将美元转换为任意四种货币:巴西瑞尔、加拿大元、欧元和日元。货币选择由单选按钮控制,这些按钮相互排斥。当选择了一个国家时,系统会通过使标签句子变得完整来回应。例如,如果点击了"加拿大"按钮,则标签"等于……"会变成"等于加拿大元"。此外,程序会在等量货币金额的输出位置旁边显示一面加拿大国旗。选择货币之前或之后,用户输入美元金额。一旦两个任务都完成,用户可以点击"计算"按钮、"清除"按钮或"退出"按钮。点击"计算"按钮会将美元金额转换为所选货币的等量金额。点击"清除"按钮可以重新设置货币选择、美元金额和等量货币金额及相关标签。点击"退出"按钮,则结束应用程序。

图3 货币转换器GUI

2.7 土星牌挡风玻璃雨刷

问题描述:土星牌挡风玻璃雨刷是由带刻度盘的控制杆控制的。这种控制杆有四个位置:停止、间歇、低速和高速,刻度盘有三个位置,分别是数字1、2和3。刻度盘位置指示三种间歇速度,刻度盘的位置只有当控制杆在间歇位置上才有意义。以下决策表给出了挡风玻璃雨刷对应控制杆和刻度盘的工作速度(每分钟摇摆次数)。

C1.控制杆

停止

间歇

间歇

间歇

低速

高速

C2.刻度盘

——

1

2

3

——

——

A1.雨刷

0

4

6

12

30

60

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值