
项目提醒
●请仔细阅读规格文档,理解规格文档估计需要花费10~40分钟来理解,请务必看清楚要求再动手,试题包括规格描述和代码框架。
●C/C++编译环境统一为Visual C++ 6.0版本,Java编译环境统一为1.5.0_06版本。如果你喜欢并熟悉Source Insight或其它工具,也可以使用Source Insight或其它工具进行开发,但大家必须保证提交的代码要在指定编译环境下编译通过,否则无法阅卷。
●无论是C/C++语言,还是Java语言,都不系统函数、STL、Java类库或其他类库的使用,前提是提交的代码编译通过并正常运行。
●如果考题与日常工作/生活接近,请大家以规格为准,不要类比相似案例。
●出于自动化测试的需要,程序中不要使用原始的I/O输入输出(键盘输入、屏幕输出)作为正式输入输出,我们会提供基于Socket的输入输出API接口,大家必须使用Socket API进行正式输入输出操作。调试打印的方式不受此。
●测试的工程已经提供Socket通信功能,并提供输入/输出的API,大家不需要实现。
1总体说明
该贷款申请系统主要提供贷款的申请和查询功能.
系统启动之后,需要通过初始化命令完成初始化,系统运行过程中也可以随时执行初始化命令.贷款申请系统完成初始化后就可以申请贷款、查询贷款数据.
说明:本文档中用t标识”单位时间”,即该贷款申请系统运行的最小时间单位,第n个单位时间:nt,系统最长可运行24t,超出24t的情况不考虑.
1.1系统规则
1、对贷款申请业务,银行有3个部门负责处理:银行申请贷款部门、银行审查贷款部门、银行发放贷款部门.
2、银行申请贷款部门:
负责贷款申请数据的提交,如果申请数据填写正确,则贷款申请成功,并自动提交给银行审查贷款部门审查,否则贷款申请失败,并清除此申请数据.
每笔贷款申请占用1个t,1个t可申请多笔贷款.
3、银行审查贷款部门:
贷款申请成功后,该部门根据申请数据判断是否允许贷款,如果允许贷款就自动提交给银行发放贷款部门;否则就要求重新申请,即处于待重新申请状态.
每笔贷款审查占用1个t,1个t只可审查一笔贷款.如果当前t已被某份贷款审查占用,其他贷款审查要排队等待.
4、银行发放贷款部门:
审查贷款成功后,该部门判断当前银行是否可以发放贷款,如果可以就发放贷款,并按照相关的利率计息,否则就要求重新申请,即处于待重新申请状态.
每笔贷款发放占用1个t,1个t只可发放一笔贷款.如果当前t已被某份贷款发放占用,其他贷款发放要排队等待.
5、审查贷款在贷款申请成功后下一个空闲t处理,发放贷款在审查贷款成功后下一个空闲t处理.举例:
| 时间 | 贷款申请 | 审查贷款 | 发放贷款 |
| 1t | A贷款申请成功 | ||
| 2t | B贷款申请成功 | A审查贷款成功 | |
| 3t | C贷款申请成功 | B审查贷款成功 | A发放贷款成功 |
| 4t | D贷款申请失败 | C审查贷款失败,重新申请 | B发放贷款成功 |
| 5t | |||
| … | … | … | … |
7、某笔贷款发放成功后,其数据和状态不再发生变换.
8、如果有多笔贷款申请同时等待审查,则审查贷款处理顺序要按照执行贷款申请命令的顺序处理.例如:A、B两笔贷款申请都在1t申请,A先执行申请命令,则
A,在2t审查贷款结束,3t发放贷款结束。
B,在3t审查贷款结束,4t发放贷款结束。
| 时间 | 贷款申请 | 审查贷款 | 发放贷款 |
| 1t | A贷款申请成功 B贷款申请成功 | ||
| 2t | A审查贷款成功 | ||
| 3t | B审查贷款成功 | A发放贷款成功 | |
| 4t | B发放贷款成功 |
10、贷款人有2种级别:低收入贷款人、高收入贷款人,(月收入单位:元)
低收入贷款人:月收入范围[1000,5000]
高收入贷款人:月收入范围(5000,10000]
11、贷款年限,取值范围[1,20],(单位:年)
依照贷款人级别,约束不同的贷款年限,如果超出约束,则在贷款查询时提示”贷款年限超出范围,审查贷款失败” :
低收入贷款人:贷款年限[1,10]
高收入贷款人:贷款年限[1,20]
12、贷款本金,取值范围[10,100],格式是整数,(单位:万元)
依照贷款人级别,约束不同的贷款本金,如果超出约束,则在贷款查询时提示”贷款本金超出范围,审查贷款失败”:
低收入贷款人:贷款本金[10,50]
高收入贷款人:贷款本金[10,100]
13、审查贷款时,先审查贷款本金,再审查贷款年限.
14、银行可用贷款总金额为300万元,如果”已发放成功的贷款本金加上当前准备发放的贷款本金”超出约束,则在贷款查询时提示”银行无可用贷款,发放贷款失败”
15、银行最多只允许5份贷款发放成功,如超出约束,则在贷款查询时提示”发放贷款系统能力不足,发放贷款失败”;
16、发放贷款时,先核对贷款发放份数,再核对银行可用贷款.
17、该系统申请的贷款其还款类型是:等额本金还款法,基本概念和公式如下:
概念:等额本金还款,又称等本不等息还款法.贷款人将本金分摊到每个月内,同时付清每个月的利息.这种还款方式每月支付的本金数相同,但利息逐月减少,故还款负担逐月递减.
基本术语、公式:
贷款本金:申请贷款的本金总额
实际月利率=实际年利率/12
实际年利率=初始年利率*年利率折扣
还款期数=贷款年限×12
每月还款本金=贷款本金/还款期数
第x个月月还款利息=每月还款本金*(还款期数-x+1)*实际月利率
第x个月还款本息总金额=每月还款本金+第x个月月还款利息
还款总利息=贷款本金*实际月利率*(还款期数+1)/2
还款本息总金额=贷款本金+还款总利息
说明:第x个月是从发放贷款成功之日开始算起,本文档中利息的计算以月为最小计算单位.此时间是自然时间,与系统运行时间无关.
18、银行规定的贷款利率及折扣
贷款年限不同,(单位:年),初始年利率不同:
贷款年限[1,10],初始年利率:2.4%
贷款年限(10,20],初始年利率:4.8%
贷款本金不同,(单位:万元),年利率折扣不同:
贷款本金 [10,40],年利率折扣:100%
贷款本金(40,100],年利率折扣:50%
19、住房公积金,构成:50%是自己缴纳,50%是公司缴纳,还款时可用住房公积金还款.
个人还款本息总金额=还款本息总金额-住房公积金还款金额*50%
1.2 系统约束
1、所有命令格式的合法性在工程框架中提供,大家不需要考虑。
2、所有输入输出无需携带单位,使用默认的单位,大家不需要考虑单位的输出。
3、不考虑系统运行时间超出范围的情况。
2 操作说明
1、命令字请全部使用小写,系统中的命令区分大小写,如果异常输入,系统提示”E100:其他命令错误”;
命令的所有参数都是必选参数,且顺序固定,对参数缺少或冗余、参数顺序打乱、参数长度异常等输入,系统提示”E100:其他命令错误”;
命令字与第一个参数间使用一个空格分隔,多个参数间使用半角”-”分隔,参数间没有空格,如果异常输入,系统提示”E100:其他命令错误”;
2、测试系统会对输入命令格式进行处理,大家不需要关注输入命令格式、参数格式的合法性,只需要实现命令处理函数。测试框架会将字符串解释成对应的命令及命令参数结构,大家不需要自行解释命令字符串。
3、所有不需要大家考虑的命令错误都由测试框架统一输出“E100:其他命令错误”,这里定义仅仅是为了系统的完整性,与大家无关。
4、系统中的所有标点符号应为英文半角符号,大家需要考虑输出中的标点符号。
2.1系统初始化
命令格式:reboot
功能说明:系统在任意阶段均可执行reboot命令初始化系统。已发放贷款金额、份数、系统时间、贷款申请数、审查数、所有输入命令、输出轨迹等全部清空。相当于:关闭系统并重启系统。
执行该命令后,系统数据会清空到初始状态:
✓系统运行时间:1t
✓银行已发放贷款:0
✓贷款申请数:0
输出说明:输出操作成功提示
输出样例如下:
| 命令· | 输出 |
| reboot | E001:初始化成功 |
命令格式:request 贷款编号-贷款人月收入-贷款本金-贷款年限-申请时间
功能说明:输入申请贷款的基本信息,提交申请,通过合法性判断申请是否成功。
约束说明: 参数中的单位无需输入,非法的贷款申请数据报错后会立即清除,不保存。
输出说明:
(1)贷款编号:[1,10],格式:整数,用来唯一标识一笔贷款;
如果输入值超出范围,则输出“E002:贷款编号输入错误”;
(2)贷款人月收入:[1000,10000],(单位,元)
如果输入值超出范围,则输出“E003:贷款人月收入输入错误”;
(3)贷款本金:[10,100],格式为整数,(单位,万元)
如果输入值超出范围,则输出“E004:贷款本金输入错误”;
(4)贷款年限:[1,20],(单位,年)
如果输入值超出范围,则输出“E005:贷款年限输入错误”;
(5)申请时间:[1,10],(单位,t),用来标识贷款申请时系统时间。
如果输入值超出范围,则输出“E006:申请时间输入错误”;
(6)request命令可重复执行,后执行命令的申请时间不能小于先执行命令成功的申请时间,否则输出“E007:申请时间错误递减”;
(7)某一笔贷款申请,若已申请成功,则只有在待重新申请状态才允许其被重新提交申请(重新提交申请:即再次执行贷款编号相同的request命令):
若重新提交申请成功,则覆盖原有申请且需要重新排队审查,否则不影响原有贷款数据和状态;
若在非待重新申请状态:(包含发放成功)重新申请,则输出“E008:贷款处理正常,不允许修改初始信息”且不影响原有贷款数据和状态。
重新申请只能在待重新申请状态的当前t及以后t申请。
例如:
| 输入 | 输出 | |
| request 1-5000-40-10-2 | E009:贷款申请成功 | 符合条件,贷款1申请成功,系统时间为4. |
| request 1-1000-40-10-4 | E008:贷款处理正常,不允许修改初始信息 | 命令企图在4时修改贷款1的信息,4时贷款发放成功,不允许修改. |
| request 1-1000-40-10-3 | E008:贷款处理正常,不允许修改初始信息 | 命令企图在3时修改贷款1的信息,3时贷款处于审查成功状态,也不允许修改. |
| request 1-1000-40-10-1 | E007:申请时间错误递减 | 修改贷款信息的时间不能小于上一次贷款的申请时间2 |
(9)命令的合法性检查,按照(1)~(7)顺序判断;
(10)命令正确、参数范围合法,输出“E009:贷款申请成功”。
输出样例如下:
| 输入 | 输出 |
| request 1-2000-10-10-1 | E009:贷款申请成功 |
命令格式:list贷款编号-第x个月份-住房公积金还款金额-查询时间
功能说明:查询用户当前贷款申请状态,如果贷款已发放成功,附带返回用户计划还款
的第x个月份本息还款总金额,以及如果使用住房公积金还款情况下,个人还款的本息总金额。查询错误不影响贷款的数据和状态。
约束说明:参数中的单位无需输入。
输出说明:
(1)贷款编号:[1,10],格式:整数,用来标识一笔贷款;
如果输入值超出范围,则输出“E002:贷款编号输入错误”;
如果系统中没有该贷款编号对应的有效的贷款申请数据,则输出“E010:无有效的贷款申请”;
相同贷款编号可以多次查询;
(2)第x个月份:[1,240],格式:整数,x的取值不大于该笔贷款的还款期数,如果输入值超出范围,则输出“E011:还款月份无效”;
(3)住房公积金还款金额 [0,100],格式:整数,单位:万元,住房公积金还款金额不大于该笔贷款本金; 如果输入值超出范围,则输出“E012:住房公积金还款金额无效”;
(4)查询时间:[1,24],单位:t,用来标识查询贷款时系统时间:
如果输入值超出范围,则输出“E013:查询时间输入错误”;
如果查询时间小于申请时间,则输出“E014:查询时间错误递减”;
(5)list命令可以在任意的系统运行时间内重复执行,可以查询到该笔贷款的历史状态;
说明:如果在重新提交申请成功后查询,只能查询最新贷款的数据。同样的,如果在提交申请成功前查询,则查询的是原有数据。
举例:A贷款在1t申请,2t重新申请成功后查询,则查询2t时A贷款数据状态是贷款申请成功待审查,查询1t时A贷款数据是E014:查询时间错误递减。
(6)命令的合法性检查,按照(1)~(5)顺序判断;
(7)命令正确、参数范围合法,输出具体的计算结果,格式如下:
E015:贷款申请M详细信息
贷款申请状态:H
贷款本金(万元):I
还款期数:J
实际月利率(千分之):K
第x个月份的还款本息总金额:O
需还款本息总金额:P
需个人还款本息总金额:Q
说明:
✓M指贷款查询命令输入的贷款编号。
✓H指当前贷款申请状态,输出内容有以下几种:
L,待重新申请
贷款申请成功待审查
贷款审查成功待发放
贷款发放成功
✓L指重新申请的原因,包括“贷款年限超出范围,审查贷款失败”、“贷款本金超出范围,审查贷款失败”、“银行无可用贷款,发放贷款失败”、“发放贷款系统能力不足,发放贷款失败”
✓I指该贷款申请的贷款本金,格式:整数,(单位:万元)
✓J指该贷款申请的还款期数,格式:整数。
✓K指该贷款的实际月利率,格式:整数,(单位:千分之)
✓x即贷款查询命令输入的第x个月份。
✓O、P、Q指算出的具体金额数,(单位:元),格式:整数,计算的最后结果四舍五入。
✓M、H、x、I、J、K、L、O、P、Q前后没有空格字符。
(8)如果当前贷款不处于“贷款发放成功”状态,则“实际月利率(千分之)”、“第x个月份的还款本息总金额”、“ 需还款本息总金额”、“ 需个人还款本息总金额”为0。
输出样例如下:
| 输入 | 输出 |
| reboot request 1-1000-10-20-1 list 1-1-0-4 | E001:初始化成功 E009:贷款申请成功 E015:贷款1申请详细信息 贷款申请状态:贷款年限超出范围,审查贷款失败,待重新申请 贷款本金(万元):10 还款期数:240 实际月利率(千分之):0 第1个月份的还款本息总金额:0 需还款本息总金额:0 需个人还款本息总金额:0 |
3.1 命令汇总
| 命令 | 命令格式 | 示例 | 说明 |
| reboot | reboot | reboot | reboot,系统初始化 |
| request | request 贷款编号-贷款人月收入-贷款本金-贷款年限-申请时间 | request 1-1000-1-1-1 | request,输入用户申请贷款的基本信息数据 |
| list | list贷款编号-第x个月份-住房公积金还款金额-查询时间 | list 1-1-0-1 | list,查询用户当前的申请状态,用户想计算的第x个月份的本息还款总金额,以及个人还款的本息总金额。 |
3.2 返回码汇总
| 返回码描述 | 说明 |
| E001:初始化成功 | reboot命令执行成功返回 |
| E002:贷款编号输入错误 | 输入的贷款编码非法 |
| E003:贷款人月收入输入错误 | request命令输入的贷款人月收入非法 |
| E004:贷款本金输入错误 | request命令输入的贷款本金非法 |
| E005:贷款年限输入错误 | request命令输入的贷款年限非法 |
| E006:申请时间输入错误 | request命令输入的申请时间非法 |
| E007:申请时间错误递减 | 多条request命令执行,输入的申请时间出现递减错误 |
| E008:贷款处理正常,不允许修改初始信息 | 贷款处于发放成功状态后被重复申请 |
| E009:贷款申请成功 | request命令执行成功 |
| E010:无有效的贷款申请 | list命令输入的贷款编码不存在对应的申请数据 |
| E011:还款月份无效 | list命令输入的还款月份非法 |
| E012:住房公积金还款金额无效 | list命令输入的住房公积金还款金额非法 |
| E013:查询时间输入错误 | list命令输入的查询时间非法 |
| E014:查询时间错误递减 | list命令输入的查询时间小于申请时间 |
| E015:贷款申请M详细信息 贷款申请状态:H 贷款本金(万元):I 还款期数:J 实际月利率(千分之):K 第x个月份的还款本息总金额:O 需还款本息总金额:P 需个人还款本息总金额:Q | list命令执行成功 |
| E100:其他命令错误 | 命令字大小写、错误的命令字、命令格式、全角半角错误时系统输出,不需要测试。 |
| 编号 | 用例标题 | 测试步骤 | 预期输出 |
| 1 | 系统重启、初始化; 贷款申请、审查、放贷成功; 有计算贷款信息。 | reboot request 1-2000-20-5-1 list 1-1-10-4 | E001:初始化成功 E009:贷款申请成功 E015:贷款申请1详细信息 贷款申请状态:贷款发放成功 贷款本金(万元):20 还款期数:60 实际月利率(千分之):2 第1个月份的还款本息总金额:3733 需还款本息总金额:212200 需个人还款本息总金额:162200 |
| 2 | 系统重启、初始化; 贷款申请成功,审查失败; 无计算贷款信息。 | reboot request 1-2000-20-15-1 list 1-1-0-4 | E001:初始化成功 E009:贷款申请成功 E015:贷款申请1详细信息 贷款申请状态:贷款年限超出范围,审查贷款失败,待重新申请 贷款本金(万元):20 还款期数:180 实际月利率(千分之):0 第1个月份的还款本息总金额:0 需还款本息总金额:0 需个人还款本息总金额:0 |
| 3 | 系统重启、初始化; 贷款申请成功,审查成功,放款失败; 无计算贷款信息。 | reboot request 1-9000-80-15-1 request 2-8000-80-15-1 request 3-8600-80-15-1 request 4-8100-80-15-1 list 4-10-10-6 | E001:初始化成功 E009:贷款申请成功 E009:贷款申请成功 E009:贷款申请成功 E009:贷款申请成功 E015:贷款申请4详细信息 贷款申请状态:银行无可用贷款,发放贷款失败,待重新申请 贷款本金(万元):80 还款期数:180 实际月利率(千分之):0 第10个月份的还款本息总金额:0 需还款本息总金额:0 需个人还款本息总金额:0 |
| 4 | 系统重启、初始化; 贷款申请成功后,再次申请; 贷款申请失败后,再次申请; | reboot request 1-9000-80-15-1 request 2-8000-80-15-1 request 3-8600-80-15-2 request 4-8100-80-15-3 request 3-8630-80-15-4 request 4-8100-80-13-5 request 4-8100-80-13-8 | E001:初始化成功 E009:贷款申请成功 E009:贷款申请成功 E009:贷款申请成功 E009:贷款申请成功 E008:贷款处理正常,不允许修改初始信息 E008:贷款处理正常,不允许修改初始信息 E009:贷款申请成功 |
| 5 | 系统重启、初始化; 贷款申请成功后、再次申请; 查询不同时刻的贷款状态; | reboot request 1-2000-20-15-1 request 2-8000-20-13-2 request 3-8000-20-13-3 request 1-2000-20-15-3 list 1-1-0-4 list 1-1-0-6 | E001:初始化成功 E009:贷款申请成功 E009:贷款申请成功 E009:贷款申请成功 E009:贷款申请成功 E015:贷款申请1详细信息 贷款申请状态:贷款申请成功待审查 贷款本金(万元):20 还款期数:180 实际月利率(千分之):0 第1个月份的还款本息总金额:0 需还款本息总金额:0 需个人还款本息总金额:0 E015:贷款申请1详细信息 贷款申请状态:贷款年限超出范围,审查贷款失败,待重新申请 贷款本金(万元):20 还款期数:180 实际月利率(千分之):0 第1个月份的还款本息总金额:0 需还款本息总金额:0 需个人还款本息总金额:0 |
VC工程MatchSysC_VC6.rar中包括:
●\\Lib\\SocketApi.lib: 是一个LIB库文件,其中实现了对外通信接口;
●\\Lib\MatchSysApi.lib: 是一个LIB库文件,其中实现了对命令输入输出的封装;
●\\Src\MatchSysApi.h: 头文件,定义了大家可能用到的的枚举、宏、结构,以及需要大家自己实现的接口函数;
●\\Src\MatchSys.h: 头文件,大家可以向其中添加自己的定义。具体要求请看注释。
●\\Src\MatchSysC.cpp: 源码文件,提供了需要大家实现的接口函数框架,这些函数是空白的,需要由大家自己实现。
●其他文件是VC工程自行产生的,大家不必关注。
更详细的定义请参阅VC工程。
