《软件工程与计算》期末考试真题范例及答案
今天分享一套针对《软件工程与计算》这本书的真题案例,有关《软件工程与计算》23章内容的重点知识整理,已经总结在了博客专栏中,有需要的自行阅读:
《软件工程与计算》啃书总结https://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.有关耦合种类的辨析
复习指路:
软件工程与计算总结(十三)详细设计中的模块化与信息隐藏https://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.有关需求类型的辨析
复习指路:
软件工程与计算总结(五)软件需求基础https://jslhyh32.blog.csdn.net/article/details/133579557
有关需求的分类,可以参考上文中的模式,这里简单给出一个样例:
- 业务、用户、系统级需求是按照层次性来划分的需求~
- 而功能需求和(2)小问中的需求都属于软件需求~
假设需要你想出常见 ATM 机的需求:
答案统一给出如下:![]()
4.有关测试用例的设计
复习指路:
软件工程与计算总结(十九)软件测试https://jslhyh32.blog.csdn.net/article/details/133915874
插播一个科普:Object类型1.Object 类:位于 java.lang 包中的类(java.lang包中的内容自动导入);
2.Object 是每个类的父类,直接父类或者是间接的父类;
3.Object 类型的引用可以存储任意类型的对象;
4.Ovject 类中的方法是每个类都默认的功能方法。
首先,这里是在进行功能测试,所以肯定要选择黑盒测试,至于是等价类划分还是边界值分析都无妨~这里使用等价类划分编写测试用例:不难看出,上面的方法只有输入,而下面的方法只有输出~因此可以采用一次输入一次输出的方式来设计![]()
5.有关人机交互设计的内容

详细内容参考:软件工程与计算总结(十一)人机交互设计
答案:
优点:界面简洁、良好的导航栏、及时的用户操作反馈
原则(最后两个好像不在总结(十一)里面,关注一下):
- 简洁设计:不要使用太大的菜单,不要在一个窗口中表现过多的信息类别,不要在一个表单中使用太多的颜色和字体作为线索
- 一致性设计:遵循了用户已有的精神模型
- 低出错率设计:避免用户操作可能引起的错误,并提供简洁的指导帮助用户消除错误
- 易记性设计:减少用户记忆负担
- 导航:停用一个很好的完成任务的入口
- 反馈:提示用户交互行为的结果,但不打断用户工作的意识流
- 不暴露软件系统内部构造机制
- 协作式设计:调整计算机因素以更好地适应并帮助用户的设计方式
6.修改代码的设计
- 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;
这道题解法很多,有关代码设计的要点,大家可以看如下这篇博文:
软件工程与计算总结(十八)代码设计https://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;
}
相关文章:

《软件工程与计算》期末考试真题范例及答案
今天分享一套针对《软件工程与计算》这本书的真题案例,有关《软件工程与计算》23章内容的重点知识整理,已经总结在了博客专栏中,有需要的自行阅读: 《软件工程与计算》啃书总结https://blog.csdn.net/jsl123x/category_12468792.…...

springboot高校全流程考勤系统-计算机毕设 附源码 27637
Springboot高校全流程考勤系统 摘 要 本文针对高校考勤等问题,对其进行研究分析,然后开发设计出高校全流程考勤系统以解决问题。高校全流程考勤系统系统主要功能模块包括:考勤签到、课程信息、考勤情况、申请记录列表等,系统功能设…...

大二第四周总结——用原生js封装一个分页器
用原生js封装一个分页器 起因:这次项目还是用原生的js来写的,我负责的是后台,分页是后台最常见的一个功能了,于是干脆封装一下,废话少说,直接上代码 这里是基本的样式 .pagination {display: flex;width: 600px;hei…...

智能AI系统ChatGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型
一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

ARM Linux 基础学习 / 系统相关,文件系统,文件属性
编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程…...

nginx https 如何将部分路径转移到 http
nginx https 如何将部分路径转移到 http 我有一个自己的网站,默认是走的 https,其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径,并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…...

算法通关村第八关-白银挑战二叉树的深度和高度问题
大家好我是苏麟 , 今天说说几道二叉树深度和高度相关的题目 . LeetCode给我们造了一堆的题目,研究一下104、110和111三个题,这三个颗看起来挺像的,都是关于深度、高度的。 最大深度问题 描述 : 二叉树的 最大深度 是指从根节点到最远叶子…...
使用LogBack替换Log4j
目录 1.删除log4j有关的依赖,添加logBack依赖 2.删除log4j配置文件,增加logback.xml配置文件 3.更改application.yml配置文件,log文件指向logback.xml 4.重启 1.删除log4j有关的依赖,添加logBack依赖 <dependency><gr…...

财务报告是什么
财务报告是什么 财务报告是企业对外提供的反映企业某一特定日期的财务状况和某一会计期间的经营成果、现金流量等会计信息的文件。 根据财务报告的定义,财务报告具有以下几层含义:一是财务报告应当是对外报告,其服务对象主要是投资者、债权人…...

SOME/IP 协议介绍(四)RPC协议规范
RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息,可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释,而第[SIP_RPC_450页,第36页]节讨论了选择哪种传输协议。…...
PostgreSQL基础入门
为什么选择PostgreSQL 功能更全面:PGSQL的功能更加全面,支持开窗函数、物化视图、分区表、json等类型,MySQL8以上支持开窗函数、分区表、json等,但物化视图仍不支持。高可用:PG更适合分布式环境,如流复制、…...
Django 密码管理:安全实践与技术深入
在 Web 应用的开发中,密码管理是保障用户安全的关键环节。Django 作为一个强大的 Python Web 框架,提供了一套全面的系统来处理密码的存储、验证和安全。本文将详细探讨 Django 中的密码管理机制,包括密码存储、密码验证、密码安全策略以及自…...

说说你对React Router的理解?常用的Router组件有哪些?
一、是什么 react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新 因此,可以通过前端路由可以实现单…...

“可一学院”新课程《区块链企业应用》正式上线
2023年8月,上海可一澈科技有限公司启动了一站式区块链学习平台“可一学院BitClass”。9月6日,可一学院正式推出一门新课程《区块链企业应用》,这门课程将帮助学习者了解企业需要什么样的区块链,以及应该如何运用这项技术来推动自身…...

Springboot---整合对象储存服务MinIO
OSS 「OSS」的英文全称是Object Storage Service,翻译成中文就是「对象存储服务」,官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。 白话文解释就是将系统所要用的文件上传到云硬盘上,该云硬盘提供了…...

HDRP图形入门:HDRP渲染管线depth翻转
新项目开坑HDRP渲染管线,花了些时间把项目开发框架和图形工作流更新到最新版本,其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线,距离摄像机越近depth->0,越远depth->1,这也很好理…...

uniapp——项目02
分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色,又在尾部加了个红条一样的东西。 export d…...

Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信
目录标题 一、Json序列化与反序列化1. 序列化2. 反序列化 二、Goto语法三、Tcp Socket1. 单客户端发送信息到服务端2. 服务端客户端通信 一、Json序列化与反序列化 1. 序列化 package mainimport ("encoding/json""fmt")type Person struct {Name string…...

gitlab-ce-12.3.5 挖矿病毒及解决方案
前言 最近发现在使用gitlab提交代码的时候总是失败,一访问gitlab还时常报503,于是使用 top 命令查看了内存占用情况,发现了一个git进程内存使用了2.3g,cpu还一直占用300-400%, 以前不知道gitlab还有病毒,只…...
每日一题(LeetCode)----数组--移除元素(四)
每日一题(LeetCode)----数组–移除元素(四) 1.题目([844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/)) 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等&…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...