型。(A)
2. 系统设计的主要任务是细化分析模型,最终形成系统的设计模型。(B)
3. 关系数据库可以完全支持面向对象的概念,面向对象设计中的类可以直接对应到关系数
据库中的表。(B) 4.用户界面设计对于一个系统的成功是至关重要的,一个设计得很差的用户界面可能导致
用户拒绝使用该系统。(A) 5. 内聚表示一个模块( )的程度,耦合表示一个模块( )的程度。 (B,D)
A. 可以被更加细化 B.仅关注在一件事情上 C. 能够适时地完成其功能 D. 联接其他模块和外部世界
6. 良好设计的特征是( )。(E)
A. 模块之间呈现高耦合 B. 实现分析模型中的所有需求
C. 包括所有组件的测试用例 D. 提供软件的完整描述 E. 选项B和D F. 选项B、C和D
7. ( A)是选择合适的解决方案策略,并将系统划分成若干子系统,从而建立整个系统的
体系结构; (B) 细化原有的分析对象,确定一些新的对象、对每一个子系统接口和类进行准确详
细的说明。
A. 系统设计 B. 对象设计 C. 数据库设计 D. 用户界面设计 8. 下面的( )界面设计原则不允许用户保持对计算机交互的控制。(D)
A. 允许交互中断 B. 允许交互操作取消
C. 对临时用户隐藏技术内部信息 D. 只提供一种规定的方法完成任务 1. 面向对象设计与面向对象分析的区别是什么?设计包括哪些活动?
面向对象分析是重点考虑系统“做什么”的问题,即运用面向对象方法对问题域进行分析和理解,建立系统的分析模型;面向对象设计重点考虑系统“怎样做”的问题,即在分析模型的基础上形成实现环境下的设计模型。
面向对象设计主要涉及系统设计、对象设计(或详细设计)、数据库设计和用户界面设计等活动。
2.在类设计中,为什么建议使用set方法和get方法进行属性设置和读取?
目的在于降低类之间的耦合度。
5. 请举例说明用户界面设计的基本原则。
(1) 用户控制:用户应当感觉系统的运行在自己的控制之下。在图形界面或基于Web的
界面中,用户指导程序的每一步执行;即使在程序进行某些处理或用户等待输出结果时,用户同样保持对控制的敏感度。
举例:当程序进行某些需要占用较长时间的处理时,需要为用户提供及时的反馈信息,诸如一个沙漏、一个等待的指示器或其他类似的东西。
(2) 界面一致性:一致性要求用户界面遵循标准和常规的方式,让用户处在一个熟悉的
和可预见的环境之中,这主要体现在命名、编码、缩写、布局以及菜单、按钮和键盘功能在内的控制使用等。
举例:一个运行在Windows平台上的三维几何造型系统应当采用Windows图形窗口的“外观和感觉”,与Office类型软件保持一致的界面风格和操作方式。
(3) 界面容错性:一个好的界面应该以一种宽容的态度允许用户进行实验和出错,使用
户在出现错误时能够方便地从错误中恢复。
举例:Microsoft Word系统允许撤消用户对文档的许多最近操作,从而处理用户的误操作问题。
(4) 界面美观性:界面美观性是视觉上的吸引力,主要体现在具有平衡和对称性、合适
的色彩、各元素具有合理的对齐方式和间隔、相关元素适当分组、使用户可以方便地找到要操作的元素等。
举例:清华大学软件学院综合信息服务系统的Web界面在平衡和对称、色彩、元素分组、用户方便地查找信息等方面进行了良好的设计。
(5) 界面可适应性:界面可适应性是指用户界面应该根据用户的个性要求及其对界面的
熟知程度而改变,即满足定制化和个性化的要求。所谓定制化是在程序中声明用户的熟知程度,用户界面可以根据熟知程度改变外观和行为;所谓个性化是使用户按照自己的习惯和爱好设置用户界面元素。
举例:系统允许用户选择语言类型(中文、英文、意大利文等),并系统根据用户定制的语言类型显示不同语种的用户界面。
第9章 软件实现
1.在程序设计中使用括号以改善表达式的清晰性。(A)
2. 在程序设计中应尽可能对程序代码进行优化。(B) 3. 不要修补不好的程序,要重新
写。(A) 4.程序中的注释是可有可无的。(B) 5.对递归定义的数据结构不要使用递归
过程。(B) 6. 为了使程序能在不同的计算机上运行,程序应当具有较好的( )。(A)
A. 可移植性 B. 可重用性 C. 可维护性 D. 可适用性 7. 对于开发面向数据库应用的软件,应当选择的程序设计语言是(C)
A. C B. PASCAL C. SQL D. JAVA
8. 下面对提高程序编码效率没有影响的是( )。(D)
A. 选择良好的设计方法 B. 选择良好的算法 C. 选择良好的数据结构 D. 变量名的使用
9. 为了保证软件的质量,使其具有较好的可维护性,关键在于( )。(B)
A. 选择合适的程序设计语言 B. 选择好的程序设计风格 C. 具有好的数据结构 D. 选择好的运行环境
10. 下面的( )不是良好编码的原则。(C)
A. 在开始编码之前建立单元测试 B. 建立一种有助于理解的直观布局 C. 保持变量名简短以便代码紧凑 D. 确保注释与代码完全一致 1. 列出三种常见的专用程序设计语言,并说明它们的应用领域。
(1) JAVA语言:适用于跨平台的企业应用软件 (2) LISP语言:适用于人工智能
软件
(3) SQL语言:适用于数据库应用软件 4. 你认为是否应该强制采用软件编码规范?请举出2-4个赞成的理由和1-3个反对的理
由。
赞成理由:(1)增强代码的可读性 (2)增强代码的可移植性 (3)减少不必要的程
序错误
反对理由: (1) 缺少个性 (2) 降低程void GetMemory(char *p, int num) 序效率 { p = (char *)malloc(sizeof(char), 5. 请分析比较下面两个for循环的优缺点。
num); 第一个for循环: 第二个forfor (i = 0; i < N; return; 循环: i++) } if (condition) { int main() {
{ if (condition) for (i = 0; i < N; i++) DoSomething(); char *str = NULL; DoSomething(); else GetMemory(str,100); } DoOtherthing()strcpy(str, “Hello World.”); else ; printf(str); { } return 0; for (i = 0; i < N; i++)
} DoOtherthing();
} 第一个for循环的代码简练且结构清晰,但效率较低; 第二个for循环的执行效率较高,但结构不够紧凑。
6. 下面三个程序运行时分别会产生什么结果?为什么?
程序1: 程序2: void GetMemory(char *p, int num) {
p = (char *)malloc(sizeof(char), num); return; }
int main() {
char *str = NULL; GetMemory(&str, 100); strcpy(str, “Hello World.”); printf(str);
return 0;
}
程序3: int main() {
char *str = (char *)malloc(100); strcpy(str, “Hello ”); free(str);
if (str != NULL)
{
strcpy(str, “World.”); printf(str); }
return 0;
}
程序1:系统运行崩溃。
原因: GetMemory(str,100)并没有将申请到的内存传回到调用程序,str一直是NULL,从而导致非法内存访问,使程序崩溃。
程序2:显示“Hello World.”,但将产生内存泄漏。
原因: GetMemory(&str,100)申请到的内存没有被释放。 程序3:显示“Hello World.”但有时系统运行异常。
原因: 在free(str)释放内存空间后,str仍然指向原来空间地址,成为“野指针”。如果这时系统将所释放的空间分配给其他程序使用,将会造成系统运行异常。
第10章 软件测试
1. 在软件开发的过程中,若能推迟暴露其中的错误,则为修复和改正错误所花费的代价就
会降(B)
2. 好的测试是用少量测试用例运行程序,发现被测程序尽可能多的错误。(A) 3. 好的测试用例应能证明软件是正确的。(B)
4 白盒测试仅与程序的内部结构有关,完全可以不考虑程序的功能要求。(A)
5. 等价类划分方法将所有可能的输入数据划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例。(A)
6. 使用独立测试团队的最好理由是( )。(C)
A. 软件开发人员不需要做任何测试 B. 测试人员在测试开始之前不参与项目
C. 测试团队将更彻底地测试软件 D. 开发人员与测试人员之间的争论会减少
7. 类的行为应该基于( )进行测试。(D)
A. 数据流图 B. 用例图 C. 对象图 D. 状态图
8. 下面的( )说法是正确的。(C,D,E)
A. 恢复测试是以各种方式迫使软件失效从而检测软件是否能够继续执行的一种系统测试。
B. 安全测试是检测系统中的保护机制是否可以保护系统免受非正常的攻击。 C. 压力测试是检测在极限环境中使用系统时施加在用户上的压力。
D. 功能测试是根据软件需求规格说明和测试需求列表,验证产品的功能实现是否符合需求规格。
E. 安装测试是保证应用程序能够被成功地安装。 1. 请说明验证和确认的区别。
验证(Verification)与确认(Validation)是贯穿软件生命周期的规范化评估方法,其中验证是检查当前阶段的产品(或制品)是否保持上一阶段的产品(或制品)需求,确认是检查最终产品是否满足客户需求。
2. 软件测试包括哪些类型的测试?这些测试之间的区别是什么?
软件测试包括单元测试、集成测试、系统测试和验收测试等。 ??单元测试集中于每一个独立的模块; ??集成测试集中于模块的组装;
??系统测试确保整个系统与系统的功能需求和非功能需求保持一致; ??验收测试是用户根据验收标准(通常来自项目协议),在开发环境或模拟真实环境中执行的可用性、功能和性能测试。
3. 单个组件经过代码审查和测试,其有效性已经得到了全面验证,请解释为什么仍然需要进行集成测试。
单个组件正常工作并不意味着所有组件集成在一起可以正常工作,因为组件相互连接时接口会引起许多新问题,集成测试正是将通过单元测试的各个组件组装在一起进行综合测试,以便发现与接口有关的各种错误。
4. 请给出一个小例子说明穷举测试一个程序实际上是不可能的。
假设一个程序P有输入量X和Y及输出量Z,在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试,可采用的测试数据组的个数为2×2= 2。如果测试一组数据需要1毫秒,一年工作365× 24小时,完成所有测试需5亿年。 因此,即使是一个简单的程序,穷举测试也是不可能的。
5. 请结合等价类方法给出getNumDaysInMonth(int month, int year)方法的测试用例,其中getNumDaysInMonth方法根据给定的月份和年份返回该月份的总天数。
月的等价类:① 31天的月份;② 30天的月份;③ 2月 年的等价类:① 闰年;② 非闰年
32
32
64
6. 现在要对一个自动饮料售货机软件进行黑盒测试,该软件的规格说明如下:
一个自动售货机软件可以销售单价1元5角的盒装饮料。该售货机只接收1元和5角两种硬币,若投入1元5角硬币,按下“可乐”、“雪碧”或“红茶”按钮,则送出相应的饮料;若投入的硬币少于1元5角,则显示错误信息并退出硬币;若投入的硬币多于1元5角,则送出饮料的同时退还多余的硬币。
请设计测试该软件的全部测试用例。