《软件工程与计算》期末考试真题范例及答案

今天分享一套针对《软件工程与计算》这本书的真题案例,有关《软件工程与计算》23章内容的重点知识整理,已经总结在了博客专栏中,有需要的自行阅读:

《软件工程与计算》啃书总结icon-default.png?t=N7T8https://blog.csdn.net/jsl123x/category_12468792.html?spm=1001.2014.3001.5482

总的来说,干货满满。 


目录

一.名词解释

1.软件工程

2.软件演化生命周期模型

3.螺旋模型

二.代码评注及修改

1.对软件设计模式原则的甄别

2.有关耦合种类的辨析

3.有关需求类型的辨析

4.有关测试用例的设计

5.有关人机交互设计的内容

6.修改代码的设计


一.名词解释

1.软件工程
  • 应用系统的、规范的、可量化的方法来开发、运行和维护软件、即将工程应用到软件
  • 对应用系统的、规范的、可量化的各种方法的研究
2.软件演化生命周期模型
  • 初始阶段:第一个版本的软件产品开发
  • 演化:对演化增量进行处理以保持软件产品的持续增值
  • 服务:用户使用、开发者维护
  • 逐步淘汰:用户仍使用、开发者不维护
  • 停止:用户不使用、开发者不维护
3.螺旋模型

按照风险解决的方式来组织软件开发活动~

二.代码评注及修改

1.对软件设计模式原则的甄别

a.A同学开发了一个手机应用,准备投放到 Apple Appstroe Google Play 市场中去,下面是他应用的部分关于应用描述的代码,请分析其设计是否合理,是否违反某些设计原则,是否能够应用某种设计模式来重构。

class Application {prative String applicatioName;prative float avarageRate;prative ArrayList<NewFeature> newFeatureItems = new ArrayList<NewFeature>();String getDescriptionForiOS(){StringBuffer result = new StringBuffer();result.append("This is "+ applicatioName + " for iOS platform\n");for(int i =0; i< newFeatureItems.size(); i++){result.append(newFeatureItems.get(i).getDescription());}result.append("Avarage Rate from App Store\n");result.append(String.valueOf(avarageRate));return result.toString();}String getDescriptionForAndroid(){StringBuffer result = new StringBuffer();result.append("This is "+ applicatioName + " for Android platform\n");for(int i =0; i< newFeatureItems.size(); i++){result.append(newFeatureItems.get(i).getDescription());}result.append("Avarage Rate from Google Play\n");result.append(String.valueOf(avarageRate));return result.toString();}
}
1 ) 指出违反的原则,请解释该原则,并给出修改后的代码
首先,插播一下有关 迪米特法则开闭原则的知识:
软件设计模式原则(一)迪米特法则
软件设计模式原则(二)开闭原则
  • 违背开闭原则,当IOS亦或Android中任何一个发生变更时,都会导致另一方也被修改(因为在同一个类中,无论是否变更都算发生修改),所有应该将两个逻辑上并立的代码分开封装,并抽象一个统一的接口~
  • 违反迪米特法则,for循环中出现隐式方法,所以应该使用迭代器访问集合对象,减少与其他类的交互

改进后的代码如下:

2) 解释该设计模式,写出应用该设计模式后的代码
可以采用策略模式重构,改进后的代码如下:
b.B同学开发了一个影片出租店用的程序,其中需要计算客户的积分。如果电影是新发布的电影并且租用的时间超过 1 天,则可以得到 2 点积分,否则是 1 点积分。
1 ) 请画出下列代码设计的顺序图。
2 ) 指出其是否违反某些设计原则,解释这些原则
customer与rental和movie都进行了交互,所以违反了迪米特原则——迪米特原则要求,一个软件实体应该尽可能少地与其他实体发生相互作用~
3 ) 对其代码进行修改,写出修改之后的代码并画出修改之后的顺序图。

c.

数据结构栈有四个功能:压栈、弹栈、得到栈的大小、得到栈是否为空。 C 同学使用继
承如下设计了栈。

D 同学在设计雇员类的时候,如下设计:

1 ) 指出两个关于继承的设计是否合理?是否违反设计原则
第一个关于继承的设计不合理,因为违反了迪米特原则,事实上,这道题并没有重写父类中的方法,之所以违反是因为这种继承只是为了代码复用而不是为了组织类型差异的继承。第二个则设计合理,因为既满足组织类型差异又实现了代码复用,所以符合迪米特法则~
2 ) 对两段代码,如果合理,请解释其合理性。如果违反,请解释该原则,并修改

2.有关耦合种类的辨析

复习指路:

软件工程与计算总结(十三)详细设计中的模块化与信息隐藏icon-default.png?t=N7T8https://jslhyh32.blog.csdn.net/article/details/133841782

B同学写出如下代码:

1) validate_request 方法和 valid_month 方法之间是哪种类型的耦合,如何修改? 

属于印记耦合,因为共享了数据结构【date】,修改这种类型,只需要将重合部分的字段设置为公有即可~

void validate_request(input_form i){if(!valid_string(i.name)){error_message(“Invalid name”);}if(!valid_month(i.date.month)){error_message(“Invalid month”);}
}
int valid_month(int month){return d.month >=1 && d.month<=12;
}

2)C同学对代码做出了如下的修改,validate_request 方法和 valid 方法之间是哪种类型的耦合,如何修改?

很明显,valid方法的结果作为validrequest中分支结构用到的参数,这属于控制耦合的范畴~

 

修改后,只需要根据后两个方法的返回值即可,而不需要人为地根据方法内部的逻辑设置参数~

(注:这是一个难点!)

3.有关需求类型的辨析

复习指路:

软件工程与计算总结(五)软件需求基础icon-default.png?t=N7T8https://jslhyh32.blog.csdn.net/article/details/133579557

有关需求的分类,可以参考上文中的模式,这里简单给出一个样例:

  • 业务、用户、系统级需求是按照层次性来划分的需求~
  • 而功能需求和(2)小问中的需求都属于软件需求~

假设需要你想出常见 ATM 机的需求:

(1 )例说明 ATM 机的业务需求、用户需求以及系统级需求,描述 ATM 机的功能需求 [提 示:概括存款、取款、查询和转账功能 ]
2 )除了 功能需求之外,还有哪些需求需要定义?试一一列举。
答案统一给出如下:
4.有关测试用例的设计

复习指路:

软件工程与计算总结(十九)软件测试icon-default.png?t=N7T8https://jslhyh32.blog.csdn.net/article/details/133915874

D 同学希望测试A 同学设计的类:

1 ) 完成功能测试的测试用例的设计,说明思路
插播一个科普:Object类型

1.Object 类:位于 java.lang 包中的类(java.lang包中的内容自动导入);

2.Object 是每个类的父类,直接父类或者是间接的父类;

3.Object 类型的引用可以存储任意类型的对象;

4.Ovject 类中的方法是每个类都默认的功能方法。

上述代码的功能,可以大致理解为:方法一在下标为0的地方插入element元素,方法二弹出下标为0处的元素~
首先,这里是在进行功能测试,所以肯定要选择黑盒测试,至于是等价类划分还是边界值分析都无妨~
这里使用等价类划分编写测试用例:
不难看出,上面的方法只有输入,而下面的方法只有输出~因此可以采用一次输入一次输出的方式来设计
2 ) 给出相应的测试代码

5.有关人机交互设计的内容
E同学下载了 Eclipse 软件。请列举至少 3 条该软件在人机交互方面的有些优点,分析它们体现了哪些人机交互的原则?

详细内容参考:软件工程与计算总结(十一)人机交互设计 

 答案:

优点:界面简洁、良好的导航栏、及时的用户操作反馈

原则(最后两个好像不在总结(十一)里面,关注一下):

  • 简洁设计:不要使用太大的菜单,不要在一个窗口中表现过多的信息类别,不要在一个表单中使用太多的颜色和字体作为线索
  • 一致性设计:遵循了用户已有的精神模型
  • 低出错率设计:避免用户操作可能引起的错误,并提供简洁的指导帮助用户消除错误
  • 易记性设计:减少用户记忆负担
  • 导航:停用一个很好的完成任务的入口
  • 反馈:提示用户交互行为的结果,但不打断用户工作的意识流
  • 不暴露软件系统内部构造机制
  • 协作式设计:调整计算机因素以更好地适应并帮助用户的设计方式
6.修改代码的设计
F同学 开发一个个人所得税系统,代码如下。其中缴税的规则是
  • l For the first $10,000 of income, the tax is 10%
  • l For the next $10,000 of income above $10,000, the tax is 12 percent
  • l For the next $10,000 of income above $20,000, the tax is 15 percent
  • l For the next $10,000 of income above $30,000, the tax is 18 percent
  • l For any income above $40,000, the tax is 20 percent

原代码:

tax = 0.
if (taxable_income == 0) goto EXIT;
if (taxable_income > 10000) tax = tax + 1000;
else{ tax = tax + .10*taxable_income;
goto EXIT;
}
if (taxable_income > 20000) tax = tax + 1200;
else{ tax = tax + .12*(taxable_income-10000):
goto EXIT;
}
if (taxable_income > 30000) tax = tax + 1500;
else{ tax = tax + .15*(taxable_income-20000);
goto EXIT;
}
if (taxable_income < 40000){
tax = tax + .18*(taxable_income-30000);
goto EXIT;
}
else
tax = tax + 1800. + .20*(taxable_income-40000);
EXIT;

这道题解法很多,有关代码设计的要点,大家可以看如下这篇博文:

软件工程与计算总结(十八)代码设计icon-default.png?t=N7T8https://jslhyh32.blog.csdn.net/article/details/133895023

博主给出的解法如下,答案不唯一,本质上是利用一个循环的辗转相减法,这样可以避免分支语句过多:

int count(int income)
{int tax=0;float ratio[5]={0.1,0.12,0.15,0.18,0.2};for(int i=4;i>=0;i--)   //从税率最高的部分开始计算,依次递减 {int temp=0;temp=income-10000*i;if(temp>=10000)temp=10000; // 忽略已经计算过的部分 cout<<temp<<endl;tax+=temp*ratio[i];		//累计税值 }return tax;
}

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

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

相关文章

进程状态和优先级

文章目录 进程状态Linux中具体的进程状态僵尸进程孤儿进程 进程优先级 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 进程状态 进程在操…

每天一点python——day66

#每天一点Python——66 #字符串的分隔 #如图&#xff1a; #方法①split()从左开始分隔&#xff0c;默认空格为分割字符&#xff0c;返回值是一个列表 shello world jisuanji#首先创建一个字符串 list1s.split() print(list1)#输出结果是&#xff1a;[hello, world, jisuanji]注…

Git的原理与使用(一)

目录 Git初始 Git安装 Git基本操作 创建git本地仓库 配置git 工作区,暂存区,版本库 添加文件,提交文件 查看.git文件 修改文件 版本回退 小结 Git初始 git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理. 下面这个实例看理解下为什么需…

Java 简单实现一个 UDP 回显服务器

文章目录 UDP 服务端UDP 客户端实现效果UDP 服务端(实现字典功能)总结 UDP 服务端 package network;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class UdpEchoServer {private Da…

【开源】基于Vue.js的大学兼职教师管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0…

Java13新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 今天我们来一起看一下Java13这个版本的一些重要信息 版本介绍 Java 13 是在 2019 年 9 月 17 日…

Technology Strategy Patterns 学习笔记9 - bringing it all together

1 Patterns Map 2 Creating the Strategy 2.1 Ansoff Growth Matrix 和owth-share Matrix 区别参见https://fourweekmba.com/bcg-matrix-vs-ansoff-matrix/ 3 Communicating

Docker进阶——再次认识docker的概念 Docker的结构 Docker镜像结构 镜像的构建方式

前言 在微服务大量应用的互联网时代&#xff0c;经常能看到docker的身影。作为docker的爱好者&#xff08;在服务器安装MySQL&#xff0c;Redis。。。我用的都是docker&#xff09;&#xff0c;我也会持续深入学习和认识docker。 本篇博客再次介绍docker的基本概念&#xff0…

FPGA UDP RGMII 千兆以太网(3)ODDR

1 xilinx原语 在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、ODDR、IDELAYE2、ODELAYE2(A7 中没有)、IDELAYCTRL。其中,IDDR和ODDR分别是输入和输出的双边沿寄存器,位于IOB中。IDELAYE2和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时,IDELAYE2 …

R系组播调优方案

修改/etc/sysctl.conf添加如下内容&#xff1a; Vim /etc/sysctl.con net.ipv4.ip_forward1 net.ipv4.ip_nonlocal_bind1 net.ipv4.conf.all.rp_filter0 net.ipv4.conf.default.rp_filter0 net.bridge.bridge-nf-call-arptables 0 net.bridge.bridge-nf-call-ip6tables 0 …

深度学习之基于Pytorch框架的MNIST手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 MNIST是一个手写数字识别的数据集&#xff0c;是深度学习中最常用的数据集之一。基于Pytorch框架的MNIST手写数字识…

腾讯云3年期轻量应用服务器优惠(薅羊毛教程)

腾讯云轻量应用服务器特价是有新用户限制的&#xff0c;所以阿腾云建议大家选择3年期轻量应用服务器&#xff0c;一劳永逸&#xff0c;免去续费困扰。腾讯云轻量应用服务器3年优惠可以选择2核2G4M和2核4G5M带宽&#xff0c;3年轻量2核2G4M服务器540元&#xff0c;2核4G5M轻量应…

Python实用技巧:将 Excel转为PDF

将Excel文件转换为PDF可以方便储存表格数据&#xff0c;此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致。今天给大家分享一个使用第三方Python库Spire.XLS for Python 实现Excel转PDF的简单方法。 实现步骤 首先&#xff0c;通过pip命令来安装依…

AWS云服务器EC2实例进行操作系统迁移

AWS云服务器EC2实例进行操作系统迁移 文章目录 AWS云服务器EC2实例进行操作系统迁移1. 亚马逊EC2云服务器简介1.2 亚马逊EC2云务器与弹性云服务器区别 2. 亚马逊EC2云服务器配置流程2.1 亚马逊EC2云服务器实例配置2.1.1 EC2实例购买教程2.1.1 EC2实例初始化配置2.1.2 远程登录E…

Python基础入门例程51-NP51 列表的最大与最小(循环语句)

最近的博文&#xff1a; Python基础入门例程50-NP50 程序员节&#xff08;循环语句&#xff09;-CSDN博客 Python基础入门例程49-NP49 字符列表的长度-CSDN博客 Python基础入门例程48-NP48 验证登录名与密码&#xff08;条件语句&#xff09;-CSDN博客 目录 最近的博文&…

Postman —— post请求数据类型

1、Postman中post的数据类型 post中有以下数据类型 1、form-data 2、x-www-form-urlencoded 3、raw 4、binary 2、Postman请求不同的post数据类型 from-data multipart/form-data&#xff0c;它将表单的数据组织成Key-Value形式&#xff0c;也可以上传文件&#xff0c;当…

Python基础入门例程52-NP52 累加数与平均值(循环语句)

最近的博文&#xff1a; Python基础入门例程51-NP51 列表的最大与最小(循环语句)-CSDN博客 Python基础入门例程50-NP50 程序员节&#xff08;循环语句&#xff09;-CSDN博客 Python基础入门例程49-NP49 字符列表的长度-CSDN博客 目录 最近的博文&#xff1a; 描述 输入描…

【计算机网络基础实验】实验二 有线IP互通网络实践

任务一 IP路由协议实现企业路由器通信 目录如下&#xff1a; 任务一 IP路由协议实现企业路由器通信2.1.1 任务描述2.1.2 任务目的2.1.3 任务实施实验需求实验步骤步骤1&#xff1a;更改每台设备的名称步骤2&#xff1a; 给R1接口配置相应IP地址步骤3&#xff1a; 给R2接口配置相…

华为ensp:rip宣告

ip全部配置好 R1 进入r1视图模式 rip network 192.168.1.0 network 1.0.0.0 R2 进入r2视图模式 rip network 192.168.2.0 network 1.0.0.0 这样就完成了宣告 display ip routing-table 查看路由表

Postman使用json提取器和正则表达式实现接口的关联

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;使用json提取器实现接口关联 实际项目场景&#xff0c;在财务信息页面&#xff0c;需要上传一个营业执照&…