基于案例的软件构造教程第二章课后题答案
Posted 不知名小白猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于案例的软件构造教程第二章课后题答案相关的知识,希望对你有一定的参考价值。
这篇文章只提供题号为 奇数 的答案,因为是我们的NT老师要求的
1.名词解释:分解,模块化,逐步求精,软件测试,测试需求,测试设计,测试覆盖,软件调试,缺陷,软件质量,编程风格。
分解:把一个大的、错综复杂的问题划分成一个一个相对简单、独立的问题,运用合适的方法分别解决。
模块化:通过把一个程序分解成简单独立、互相作用的模块,对不同的模块设定不同的功能,来实现大型、复杂的程序。
逐步求精:将现实问题经过几次抽象(细化)处理,最后到求解域中只是一些简单的算法描述和算法实现问题。
软件测试:在规定的条件下对程序进行操作,以发现错误,对软件质量进行评估。
测试需求:组件/系统中能被测试用例验证的条目或事件。
测试设计:包含设计测试用例,实施哪些层次的测试、采用哪些测试工具或框架、如何组织人员测试等。
测试覆盖:指测试所包含的软件的特征、元素、成分等方面的程度或范围。
软件调试:指根据程序的出错情况,分析、猜测可能出现错误的程序区域,让程序运行,观察程序的变化来发现错误的根源。
缺陷:程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。
软件质量:软件与明确地和隐含地定义的需求相一致的程度。
编程风格:编写代码的样式规则。
3. 针对算法的数据结构的4种关系,除了本书给出的例子,你还能分别为4种情形举出若干个例子吗?
不能,因为没搜到。
5. 模块化的基本原则是什么?如何评价程序的模块化?
单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特原则,开闭原则
(1)有利于程序复用。
把功能模块化之后有利于程序后续开发的复用,这样可把公共的功能进行深入的抽象、优化。
(2)利于系统开发集成
模块化的功能,明确了本模块的职责,已定的模块只负责该模块的特定功能,这样以系统以后做集成、重构神马的时候将会有很大的便利之处。
(3)利于调试、后续功能拓展
程序模块化后,单个模块既是系统的组成部分,也是个单独的个体,对于系统开发而言,针对单个模块进行调试往往会比整个系统的调试要方便得多。并且在系统要进行后续开发的时候,把要拓展的功能拆分到具体的模块当中这样把大大减轻了开发难度及成本等。
(4)代码结构清晰易读
在编写代码的时候把程序模块化,这样将使得代码的可读性更强。把方法的职责明确且单一化(即一个方法只做一件固定的事情),在以后维护的时候大大减少维护人员在阅读理解代码上时间。
7. 解释模块耦合性的含义,对不同的耦合举例说明
耦合性,也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。
数据耦合
int sum(int a, int b) {
int c;
c = a + b;
return c;
}
main() {
int x, y;
printf("x+y=%d", sum(x, y));
}
主函数与sum函数之间即为数据耦合关系
控制耦合
void output(int flag) {
if(flag) printf("OK!");
else printf("NO!");
}
main() {
int flag;
output(flag);
}
主函数与output函数之间即为控制耦合关系.
内容耦合
public class Product {
public float unitPrice;
......
}
public class Order {
private Product p = new Product();
public void setItem() {
p.unitPrice = 100;
}
}
Product 类与 Order 类构成内容耦合
非直接耦合
void PrintDog() {
System.out.println("汪汪汪");
}
void PrintCat() {
System.out.println("喵喵喵");
}
public static void main(String[] args) {
printDog();
printCat();
}
标记耦合
typedef equation {
int a;
}Equation;
Equation generateExercise(){
Equation e;
return e;
}
void printExercise(Equation e) {
...
}
main() {
Equation e = generateExercise();
printExercise(e)
}
两个函数为传递了数据结构Equation的函数,视为标记耦合
外部耦合
import com.la.pojo.Dog;
public static void main(String[] args) {
private Dog dog;
}
使用import引入另一个软件包就产生了外部耦合
公共耦合
int temp;
void student() {
temp = 1;
......
}
void teacher() {
......
temp = 3;
......
}
一组函数都访问同一个公共数据环境就构成公共耦合
同学给发了答案,就补充上了,没有验证这个答案对不对
9. 按照任务1的设计和输出,完成程序编写,并输出加法练习和减法练习各两套
int main() {
int num1[100], num2[100], op[100], user[100], result[100];
for(int i=0; i<100; i++) {
num1[i] = getNumber();
num2[i] = getNumber();
op[i] = getOp();
}
getSum(num1, num2, op, user, result);
getResult(num1, num2, op, user, result)
}
11. 针对2.2.2节的设计1,编写完整的程序,并给出一套题的输出
public class ExerciseGenerator {
public static void generateExerciseOfAdditionEquation(){
int n, m;
for(int i=0; i<50; i++) {
n = generateOperand();
m = generateOperand();
System.out.println((i+1) + ":" + n +"+" + m + "=");
}
}
...
}
输出:1:11+22 ... 2:55+16
13. 如果要求习题中不允许有相同的算式,(1)请修改代码2.2、2.2.2节设计1的代码,以及2.2.2节设计2的代码,并分别输出;(2)思考:如何确定写出程序满足这个要求呢?
public static void generateExerciseOfAdditionEquation() {
int n, m, v;
for(int i=0; i<50; i++) {
n = generateOperand();
do {
m = generateOperand();
v = m + n;
}while(v >= 100);
System.out.println((i+1) + ":" + n + "+" + m + "=" + v);
}
}
public static int generateOperand(){
Random random = new random();
return (short)random.nextInt(101);
}
public static void main(String[] args) {
printHeader()
generateExerciseOfAdditionEquation();
}
不允许有相同的算式,对每次生成的算式进行比较
15. 用C/JAVA/Python等语言采用结构化编程,(1)完成任务2的程序,分别为加法,减法,加减法输出两套习题…
generateExerciseOfAdditionEquation() {
...
for(int i=0; i<50; i++) {
do {
n = generateOperand();
m = generateOperand();
v = m + n;
}while(v >= 100);
}
}
generateExerciseOfSubtraction() {
...
for(int j=0; j<50; j++) {
do {
n = generateOperand();
m = generateOperand();
v = n - m;
}while(v <= 100);
}
}
generateEquation() {
...
if(nextInt(2) == 1) {
return generateExerciseOfAdditionEquation();
} else {
return generateExerciseOfSubtraction();
}
}
constructEquation(short left, short right, char op) {
geberateExerciseOfEquation() {
...
for(int i=0; i<EQUATION_NUMBER; i++) {
equation = generateEquation();
...
}
}
}
17. 如何改变案例程序,使其可以产生最多3个数值的 [0…100] 的二元算式?…
public static void main(String[] args) {
int arr[][] = new int[3][3];
for(int []is: arr) {
for(int i=0; i<50; i++){
......
}
}
...
}
public static void main(String[] args){
int a = 1;
for(int i=0: i<50; i++){
System.out.println(i);
if(a%5 == 0){
...
}
...
}
}
19. 如何改变案例程序,使其输出任意列数 。…
public static void main(String[] args){
Scanner Equation = new Scanner(System.in);
System.out.println("请输入几列");
int n = Equation.nextInt();
for(int j=5; j<n; j++) {
for(int i=1; i<n; i++) {
...
System.out.println(generateExercise());
}
}
}
21. 修改案例程序,要求尽可能整齐打印输出每行5列算式…
void equationGeneratorTest() {
bool equal;
Equation testData[10];
String expected[10];
int succeed, failed, execute = 0;
testData[1] = contructAdditionEquation(9, 90, "+");
expected[1] = "9+90="
...
for(int i=0; i<10; i++) {
equal = asString(testData[i] == expected(i));
if(equal) {
succeed++;
} else {
failed++;
}
execute++;
...
}
}
23. 修改案例程序,要求尽可能整齐打印输出每行6列算式…
void isEquationTest() {
bool equal;
Equation testData[10];
Equation anEquation;
int succeed, failed, execute = 0;
testData[1] = contructAdditionEquation(3, 35, "+");
...
anEquation = contructAdditionEquation(45, 26, "+");
for(int i=0; i<10; i++) {
equal = isEqual(anEquation, testData[i]);
if(equal) {
...
}
}
}
新加的答案不一定正确,谨慎 Copy
以上是关于基于案例的软件构造教程第二章课后题答案的主要内容,如果未能解决你的问题,请参考以下文章