首页 > 编程知识 正文

软件工程导论第5版张海藩答案,软件工程导论第六版张海藩笔记

时间:2023-05-06 06:33:33 阅读:185924 作者:3813

文章目录第一题第二题第三题第四题第五题

第一题

1 .列举了各种类型的模块耦合的具体实例。

耦合式测量软件结构中不同模块之间的互联程度。 连接的强弱取决于接口的复杂性、访问或访问某个模块的点以及通过接口的数据。 常见的模块间可能的连接方法有7种,构成键的7种类型,它们之间的关系如下

以上的联轴器:为例进行说明

a .非直接耦合:两个模块没有直接关系,模块1和模块2 (独立性最强

b .数据耦合:即一个模块访问另一个模块时,彼此通过数据参数交换输入输出信息。 这个联接是数据联接。 这个结合比较松,模块间的独立性很强。

c .特征耦合:即一组模块通过参数传递记录信息。 用户的情况是数据结构,图中的模块都与此有关。 “计算水费”和“计算电费”原本没有关系,通过引用这个数据结构产生了依存关系。

d .控制耦合:即当一个模块通过传递开关、标志、名称等控制信息来明显控制选择另一个模块的功能时,是控制耦合

e .外联:模块群均访问同一全局数据结构,且不通过参数表传递该分局变量的信息时,称为外联。

f .公共耦合:当一组模块访问同一公共数据环境时,它们之间的耦合被称为公共耦合。

g .如果出现小于或等于:的子项,则两个模块会发生内容合并。

一个模块访问另一个模块的内部数据。

一个模块不通过普通入口移动到另一个模块内部。

两个模块中有部分程序代码重叠(只能发生在汇编程序中) )。

一个模块有多个入口(这意味着一个模块有几个功能) )。

subaa(…)。

……

……

Goto L

……

结束子

subbb(…)。

……

……

L:…

……

结束子

第2题2 .在每种类型的模块内收集具体实例。

答案:凝聚显示一个模块内各元件之间的耦合紧密度,它是信息隐藏和局部化概念的自然扩展。

低凝聚:

a .偶然凝聚:如果一个模块完成了一组任务,即使这些任务相互关联,但关系松散。 这叫做偶然凝聚。

偶然的例子:在模块t中有a、b、c三个句子,至少表面上这三个句子看起来没有什么关联。 不过,D、e、f、g这三个句子为了节省空间被总结为一个模板。

b .逻辑凝聚:当一个模块完成的任务在逻辑上属于相同或相似的类别时(例如,当一个模块输出各种类型的所有输出时),称为逻辑凝聚

逻辑凝聚的例子:某个模块是要打印还是要打印年、月、日、具体打印什么由传递的控制标志决定。

C .时间凝聚:包含在一个模块中的任务必须在同一时间内执行。 例如,模块完成各种初始化工作。 称为时间凝聚

时间凝聚的例子:将多个变量的初始化放入同一个模块中实现。

中凝聚

a .过程凝聚:当一个模块中的处理元件相关联且必须以特定顺序执行时,称为过程凝聚

进程内集合的例子:子程序,读取学生的学习号码,接下来是名字,最后是分数,是按照特定的顺序将这些操作组合起来的

b .通信凝聚:模块中所有元素使用相同输入数据或生成相同输出数据时,称为通信凝聚

通信凝聚的例子:有打印实验报告书,重新初始化完成后送来的实验数据的子程序。 这个程序具有通信凝聚性。 因为这两个操作是使用同一数据源连接的。

高凝聚:

a .顺序凝聚:如果模块中的处理元件密切相关于相同的功能并且必须顺序执行这些处理(通常,一个处理元件的输出数据变为下一个处理元件的输入数据),则将处理元件称为顺序凝聚。

顺序凝聚的例子:有子程序,根据给定的生日计算年龄。 根据年龄计算退休时间,该程序具有顺序凝聚性。

b .功能凝聚:模块中的所有元素都属于一个整体完成一个单一功能,即为功能凝聚。

功能凝聚的例子:一个程序中的所有操作都是为了计算一个人的年龄

第三题3 .用面向数据流的方法设计以下系统的软件结构。

(1)储蓄系统(见习题2第2题) )。

)2)机票预订系统(见习题2第3题)。

)3)患者监护系统(见习题2第4题)。

储蓄系统

机票预定系统

患者管理系统

第四题4 .美国一所大学有200名教师,校方刚刚与教师工会达成协议。 根据协议,年工资超过$$26000 (含26000 )的所有教师的工资保持不变,年工资低于$26000的教师增加工资。 增加的工资金额每年补助每个教师供养的人(包括教师本人) $100,并且教师一年的工龄每年)超过50,但计算方法如下

教师工资档案保存在行政办公室的磁带上,档案中包含当前的年薪、赡养人数、雇佣日期等信息。 需要编写计算并打印每位教师的原资料和调整后的新工资的程序。

要求: (1)绘制该系统的数据流图;

)2)写需求说明

)3)设计上述工资调整程序(要求用HIPO图描绘设计结果)设计时分别采用

用两种算法,并比较两种算法的优缺点:
(a)搜索工资档案数据,找出年工资少于$26000 的人,计算新工资,校核是否超过$26000,存储新工资,印出新旧工资对照表;
(b)把工资档案数据按工资从最低到最高的次序排序,当工资数额超过$26000 时即停止排序,计算新工资,校核是否超过限额,存储新工资,印出结果。
(4)你所画出的数据流图适应用那种算法?
答:
(1)数据流图:

分解后:

(2)需求说明:
1.功能需求:可以输入调资的标准,输入教师档案,经调资给出新的教师档案,需要存储档案
2.性能需求:软件的响应时间小于0.5s,更新处理要快
3.灵活需求:当需求发生某些变化时,该软件应该能够适应这些变化
4.故障处理要求:出现错误时,应给予警告或提示
(3)
A.

B.

(a)比较耗时,因为它要检索所有的档案
(b)从速度上看比较块,但是(b)需要排序算法
比较复杂,(a)对于设计来讲比较简单
(4)画出的数据流图比较适合(A)的算法

第5题

5.下面将给出两个人玩的扑克牌游戏的一种玩法,试设计一个模拟程序,它的基本功能是:
(1)发两手牌(利用随机数产生器)。
(2)确定赢者和赢牌的类型。
(3)模拟N次游戏,计算每种类型牌赢或平局的概率。要求用HIPO图描绘设计结果并且画出高层控制流程图。
扑克牌游戏规则如下:
(1)有两个人玩分别为A和B。
(2)一副扑克牌有52张牌,4种花色(黑桃、红桃、梅花、方块),每种花色的牌的点数按升序排列有2,3,4,…,10,J,Q,K,A等13种。
(3)给每个人发三张牌,牌面向上,赢者立即可以确定。
(4)最高等级的一手牌成为同花,即3张牌均为同一种花色,最大的同花是同一种花色的Q,K,A。
(5)第二等级的牌称为俊逸的柠檬,即点数连续的3张牌,最大的俊逸的柠檬是花色不同的Q,K,A。
(6)第三等级的牌是同点,即点数相同的三张牌,最大的同点是AAA。
(7)第四等级的牌是对子,即3张牌中有两张点数相同,最大的对子是A,A,K。
(8)第五等级的牌是杂牌,即除去上列4等之外的任何一手牌,最大的杂牌是不同花色的A.K,J。
(9)若两个人的牌类型不同,则等级高者胜;若等级相同,则点数高者胜;若点数也相同,则为平局。
答:
程序:

#include "stdio.h"int rabl(int a,int b,int *r){int l,k,m,i,p;k=b-a+1;l=2;while(i<=1){k=k+k+k+k+k;k=k%m;l=k/4+a;if(l<=b) {p=l;i=i+1;}}*r=k;return(p);}int max(int T[10] [10]){int t=0;if(T[0] [0]>T[1] [0])t=T[0] [0];else t=T[1][0];if(t<T[2] [0]t=T[2][0];return t;}int E1(int T[10][10]){if(T[0][1]==T[1][1]&&T[1][1]==T[2][1])return 1;else return 0;}int E2(int T[10][10]){int q=0;if(((max(T[10][10])-1)==T[0][0]||(max(T[10][10])-1)==T[1][0]||(max(T[10][10])-1)==T[2][0])&&((max(T[10][10])-2)==T[0][0]||(max(T[10][10])-2)==T[1][0] ||(max(T[10][10])-2)==T[2][0])) // if(q=max(T[][10]))return 1;elsereturn 0;}int E3(int T[10][10]){if(T[0][0]==T[1][0]==T[2][0])return 1;else return 0;}int E4(int T[10][10]){if(T[0][0]==T[1][0]&&T[0][0]!=T[2][0])

return 1;
else if(T[0][0]T[2][0]&&T[0][0]!=T[1][0])
return 1;
else if(T[1][0]T[2][0]&&T[1][0]!=T[0][0])
return 1;
else return 0;
}
void main()
{
int times=0,e1=0,e2=0,e3=0,e4=0,e5=0;
int A[10][10],B[10][10];
int r1=2,r2=3;
printf(“请输入游戏的次数n”);
scanf("%d",&times);
for(int j=0;j<times;j++)
{
for(int i=0;i<3;i++)
{
A[i][0]=rabl(1,13,&r1);
A[i][1]=rabl(14,17,&r2);
B[i][0]=rabl(1,13,&r1);
B[i][1]=rabl(14,17,&r2);
}
if(E1(A[][10])>E1(B[][10])){
e1++;
printf(“A赢,同花顺n”);
}

else if(E1(A[][10])<E1(B[ ][10])
{
e1++;
printf(“B赢,同花顺n”);
}
else if(E1(A[ ][10])E1(B[][10])&&E1(B[][10])1) {
e1++;
if(max(A[][10])>max(B[][10]))
printf(“A赢,同花顺n”);
else
printf(“B赢,同花顺n”);
}
else if(E2(A[ ][10])>E2(B[ ][10]))
{
e2++;
printf(“A赢,俊逸的柠檬n”);
}
else if(E2(A[][10])<E2(B[ ][10])
{
e2++;
printf(“B赢,俊逸的柠檬n”);
}
else if(E2(A[][10])E2(B[][10])&&E2(B[][10])1) {
e2++;
if(max(A[][10])>max(B[][10]))
printf(“A赢,俊逸的柠檬n”);
else
printf(“B赢,俊逸的柠檬n”);
}
else if(E3(A[][10])>E3(B[][10]))
{
e3++;
printf(“A赢,同点n”);
}
else if(E3(A[][10])<E3(B[ ][10])
{
e3++;
printf(“B赢,同点n”);
}
else if(E3(A[][10])E3(B[][10])&&E3(B[][10])1) {
e3++;
if(max(A[][10])>max(B[][10]))
printf(“A赢,同点n”);
else
printf(“B赢,同点n”);
}
else if(E4(A[][10])>E4(B[][10])) {
e4++;
printf(“A赢,对子n”);
}

else if(E4(A[][10])>E4(B[][10]))
{
e4++;
printf(“B赢,对子n”);
}
else if(E4(A[][10])E4(B[][10])&&E4(B[][10])1) ;
{
e4++;
if(max(A[][10])>max(B[][10]))
printf(“A赢,对子n”);
else
printf(“B赢,对子n”);
}
else
{
if(max(A[][10])>max(B[][10]))
printf(“A赢,杂牌n”);
else
printf(“B赢,杂牌n”);
}
}
printf(“同花顺赢牌概率为%d,俊逸的柠檬赢牌概率为%d,同点赢牌概率为%d,对子赢牌概率为%d,杂牌赢牌概率为%d”,e1/times,e2/times,e3/times,e4/times,e5/times);
}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154

控制流程图:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。