第4章《结构化设计》习题解答 习题 8
美国某大学共有200名教师,校方与教师工会刚签订了一项协议。按照协议,所有年工资超过
$26,000(含$26,000)的教师工资将保持不变,年工资少于$26,000的教师将增加工资,所增加的工资按下述方法计算: 给每个由此教师赡养的人(包括教师本人)每年补助$100,此外,教师有一年工龄每年再多补助$50,但是,增加后的年工资总额不得多于$26,000。
教师的工资档案存储在行政办公室的磁带上,档案中有目前的年工资、赡养的人数、雇佣日期等信息。需要写一个计算程序计算并印出每名教师的原有工资和调整后的新工资。要求:
⑴画出此系统的数据流图; ⑵写出需求说明;
⑶设计上述的工资调整程序(要求用判断树描述),设计时请分别采用下述两种算法,并比较这两种算法的优缺点;
a. 搜索工资档案数据,找出年工资少于$26,000的人,计算新工资,校核是否超过$26,000,储存新工资,印出新旧工资对照表;
b. 把工资档案数据按工资从最低到最高次序排序,当工资数额超过$26,000时即停止排序,计算新
工资,校核是否超过限额,储存新工资,印出结果。 ⑷你所画出的数据流图适应于哪种算法? 解:
⑴ 系统的数据流图 1 工资低于$26,000教师的 调整指令 工资 原有工资与新工资对照表 操作员 操作员 调整
系统 D 教师工资档案 ⑵ 需求说明: ⑶ 程序框图:
“调整第i个教师的工资”子程序: 取教师档案,找出年工资少于$26,000的人 的信息存入数据表A,包括如下数据项: w=A(i,2) m=A(i,3) n--工资少于$26,000的人数 用A(i,4)计算此教师的工龄存入变量k 表A字段1:姓名
表A字段2:原工资 表A字段3:赡养人数 表A字段4:被雇佣日期 表A字段5:新工资 i=1 WHILE i≤n 调整第i个教师的工资 k≥1 w≥26000 A(i,5)=w w=w+100*m+50*k w=w+100*m w=26000 i=i+1 打印表A的第1、2、5字段 用表A修改教师档案数据库相应记录 讨论:这两框的位置能否调换? 算法说明:1 此算法是先找出工资少于$26,000的人, 再进行工资调整,属算法a
2 算法a适于数据库的记录不太多的情况,在数据库中查找较费时。 但是,调整系统的主要部分少一个判断,结构清晰一些。
3 算法b适于数据库的记录较多的情况,利用数据库的排序功能可很快地将教师的档案数据按工资大小排好序,调整程序只对前若干个记录进行操作。这个算法对于修改数据库回更便捷些。
4 总的说来,算法b比算法a的效率要高。
判定表:(每个教师的年工资调整方案)
年工资W<$26000 计算值≥$26000 工资不变 W+100M+50N $26000 1 T T × 2 T F × 3 F × 表说明:
W---年工资 M---赡养人数
N---工龄,按工龄数截断取整,若工龄不满一年,则N=0
习题 10
假设只有顺序和DO-WHILE两种控制结构,怎样利用它们IF-THEN-ELSE操作? 解:IF-THEN-ELSE操作框图如下: 等价的 DO-WHILE操作框图如下: x=1 DO-WHILE A && x==1 不成立 成立 条件A 操作1
x=0 操作1 操作2 END DO
DO-WHILE x==1
操作2
x=0 操作3
END DO
操作3
习题 11:程序流程图、N-S盒图的绘制
画出下列伪码程序的程序流程图和盒图: START IF p THEN WHILE q DO F END DO ELSE BLOCK g n END BLOCK ENDIF STOP
解:程序流程图: 盒图:
开始
p F
成立 不成立 p
g 不成立 g n q n 成立
f
停止
习题 12
研究下列伪码程序:
LOOP: Set I to (START+FINISH)/2 If TABLE(I) = ITEM goto FOUND If TABLE(I) < ITEM Set START to (I+1) If TABLE(I) > ITEM Set FINISH to (I-1) If (FINISH - START) > 1 goto LOOP If TABLE(START) = ITEM goto FOUND If TABLE(FINISH) = ITEM goto FOUND Set FLAG to 0 Goto DONE FOUND: Set FLAG to 1 DONE: Exit 要求:
⑴ 画出程序流程图;
⑵ 程序是结构化的吗?说明理由;
⑶ 若程序是非结构化的,请设计一个等价的结构化程序并且画出程序流程图; ⑷ 此程序的功能是什么?它完成预定功能有什么隐含的前提条件吗?
T
WHILE q DO
f
解:⑴ 此程序的流程图如下: I=(START+FINISH)/2 ≠ TABLE(I) = ITEM
< TABLE(I) < ITEM
START=I+1 ≥ > TABLE(I) > ITEM
≤ FINISH=I-1 ≤ > (FINISH-START) > 1
TABLE(START) = ITEM
≠
TABLE(FINISH) = ITEM
≠
FLAG=0
= = = FLAG= 1 结束 ⑵ 程序不是结构化的,明显标志是程序中有多个“goto”语句。 ⑶ 修改该程序为一个结构化程序: do while (FINISH-START) > 1
set I to (START+FINISH)/2 if TABLE(I) < ITEM then
set START to (I+1)
else if TABLE(I) > ITEM then
set FINISH to (I-1)
endif enddo
if TABLE(I) = ITEM or TABLE(START) = ITEM or TABLE(FINISH) = ITEM then set FLAG to 1 else
set FLAG to 0 endif Exit
其流程图如下:
while (FINISH-START) > 1 do
I=(START+FINISH)/2
≥ TABLE(I) < ITEM
< ≤ > TABLE(I) > ITEM START=I+1
FINISH=I-1
TABLE(I) = ITEM YES NO or TABLE(START) = ITEM
or TABLE(FINISH) = ITEM FLAG=0 FLAG= 1
结束
⑷ 此程序的功能是:用“逐步搜索”法在一个一维表(TABLE)中搜索指定的值(ITEM)。
前提条件是:TABLE中的值是按从小到大存放;程序中,
变量START的初始值应该是TABLE表中表头的值,最小; 变量FINISH的初始值应该是TABLE表中表尾的值,最大。
原程序是从两头逐步向中间移动,用两头的中间处的值与ITEM进行比较,若中间处的值比ITEM大,则表的尾部向表头移一步;若中间处的值比ITEM小,则表的头部向表尾移一步。直到找到了与ITEM相同的值为止。若找到了,则置FLAG=1;未找到,则置FLAG=0。
习题 13:某交易所规定给经纪人的手续费计算方法如下:
总手续费等于基本手续费加上与交易中的每股价格和股数有关的附加手续费。 如果交易总额少于1000元,则基本手续费为交易金额的8.4%;
如果交易金额在1000元到10000元之间,则基本手续费为交易金额的5%,再加34元; 如果交易金额超过10000元,则基本手续费为交易金额的4%加上84元。
当每股售价低于14元时,附加手续费为基本手续费的5%,除非买进、卖出的股数不是100的倍数,在这种情况下附加手续费为基本手续费的9%。
当每股售价在14元到25元之间时,附加手续费为基本手续费的2%,除非交易的股数不是100的倍数,在这种情况下附加手续费为基本手续费的6%。
当每股售价超过25元时,如果交易的股数不是100的倍数,则附加手续费为基本手续费的4%,否则附加手续费为基本手续费的1.5%。
要求:⑴ 用判定表表示手续费的计算方法; ⑵ 用判定树表示手续费的计算方法。 解:判定表:
说明:1,每一笔交易有3种属性:“交易总额”、“每股售价”、“股数”。
2,“交易总额”有3种值;“每股售价”有3种值;“股数”有2种值。所以每笔交易有18种状态。(表有19列,第1列是说明列)
3,每种状态有一个决策公式。判定表中的决策方案有18行。 4,每个计算公式中只有一个变量“交易额“,设为 a。 交易 金额 (a) 每股 售价 (b) a<1000 a>10000 b<14 14≤b≤25 b>25 y y y y y y n n n n n n n n n n n n n n n n n n n n n n n n y y y y y y y y n n n n y y n n n n y y n n n n n n y y n n n n y y n n n n y y n n n n n n y y n n n n y y n n n n y y x 1000<a≤10000 n n n n n n y y y y y y n n n n n n 交易股数是否为100的倍数? y n y n y n y n y n y n y n y n y n a×8.4%×(1+5%) a×8.4%×(1+9%) a×8.4%×(1+2%) a×8.4%×(1+6%) a×8.4%×(1+1.5%) a×8.4%×(1+4%)
x x x x x x