三、数组、链表、栈、队列、字符串
- 表元素
- 字符
- 数据元素
- 数据项
- 信息项
- 线性表的逻辑顺序与物理顺序总是一致的。
- 线性表的顺序存储表示优于链式存储表示。
- 线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
- 二维数组是其数组元素为线性表的线性表。
- 每种数据结构都应具备三种基本运算:插入、删除和搜索。
既希望较快的查找又便于线性表动态变化的查找方法是()
- 顺序查找
- 折半查找
- 索引顺序查找 块查找
- 哈希法查找
下列叙述哪些是对的?
- 线性表的逻辑顺序与物理顺序总是一致的。
- 线性表的顺序存储表示优于链式存储表示。
- 线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
- 二维数组是其数组元素为线性表的线性表。
- 每种数据结构都应具备三种基本运算:插入、删除和搜索。
- 随机存取的存储结构
- 顺序存储的存储结构
- 索引存取的存储结构
- Hash存取的存储结构
对n个记录的线性表进行快速排序为减少算法的递归深度,以下叙述正确的是()
- 每次分区后,先处理较短的部分
- 每次分区后,先处理较长的部分
- 与算法每次分区后的处理顺序无关
- 以上三者都不对
(3.1)数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#define NUMA 10000000
#define NUMB 1000
int
a[NUMA], b[NUMB];
void
pa()
{
int
i, j;
for
(i = 0; i < NUMB; ++i)
for
(j = 0; j < NUMA; ++j)
++a[j];
}
void
pb()
{
int
i, j;
for
(i = 0; i < NUMA; ++i)
for
(j = 0; j < NUMB; ++j)
++b[j];
}
|
- pa 和 pb 运行的一样快
- pa 比 pb 快
- pb 比 pa 快
- 无法判断
答案是B
参考高质量C++编程在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的
循环放在最外层,以减少 CPU
- 对
- 错
- 对
- 错
- 对
- 错
- 没区别
- 行优先快
- 列优先快
- 2种读取方式速度为随机值,无法判断
- A按行存,B按行存。
- A按行存,B按列存。
- A按列存,B按行存。
- A按列存,B按列存。
- 原地逆序
- 头部插入
- 返回中间节点
- 返回头部节点
- 选择随机节点
- 60
- 66
- 18000
- 33
- i(i+1)/2+j
- j(j+1)/2+i
- i(j+i)/2+1
- j(i+1)/2+1
(3.2)链表
若频繁删除某线性表的第1个元素,则不宜采用以下哪种存储方式- 单链表
- 顺序表
- 单向循环链表
- 双链表
- 对
- 错
- 链头
- 链尾
- 链中
- 单链表
- 双向链表
- 单循环链表
- 顺序表
- 使单链表至少有一个结点
- 标识表结点中首结点的位置
- 方便运算的实现
- 说明单链表是线性表的链式存储
- 查找一个节点或者访问特定编号的节点则需要O(n)的时间
- 每个节点有两个连接:一个指向前一个节点,而另一个指向后一个节点
- 首节点和末节点被连接在一起
- 判断链表结束的条件是pTail == NULL
- P->NEXT:=H
- P->NEXT:=H->NEXT
- P:=H
- P:=H->NEXT
- 表必须有序,表可以顺序方式存储,也可以链表方式存储
- 表必须有序且表中数据必须是整型,实型或字符型
- 表必须有序,而且只能从小到大排列
- 表必须有序,且表只能以顺序方式存储
(3.3)栈 链尾操作
- 对
- 错 O(1)
- 循环队列
- 链表
- 哈希表
- 栈
- 前序线索树
- 中序线索树
- 后序线索树
后序遍历要稍微复杂一点点,在前序和中序遍历的程序中,当我们准备进入根结点的右子树时,根结点就被扔出栈外了。但在后序遍历时,我们仍需保留它,直到右子树处理完毕。
- 7
- 8
- 15
- 16
(3.4)队列 队头在链头
- 对 循环队列解决的是“假溢出”问题,但是仍然会出现真正的溢出问题
- 错
- 对
- 错
- rear=rear+1
- rear=(rear+1)mod(m-1)
- rear=(rear+1)mod m
- rear=(rear+1)mod(m+1)
- 最后插入队列中的元素总是最后被删除
- 当同时进行插入、删除操作时,总是插入操作优先
- 每当有删除操作时,总要先做一次插入操作
- 每次从队中删除的总是最早插入的元素
- 1和5
- 2和4
- 4和2
- 5和1
(3.5)字符串
- 含有一个或多个空格字符的串称为空串
- 对n(n>0)个顶点的网,求出权最小的n-1条边便可构成其最小生成树
- 选择排序算法是不稳定的
- 平衡二叉树的左右子树的结点数之差的绝对值不超过1
下面关于串的叙述中,哪一个是不正确的?()
- 串是字符的有限序列
- 空串是由空格构成的串
- 模式匹配是串的一种重要运算
- 串既可以采用顺序存储,也可以采用链式存储
1
2
|
char
s[]=
"\\123456\123456\t"
;
printf(
"%d\n"
,strlen(s));
|
- 12
- 13
- 16
- 以上都不对
这里考查转义字符,注意 \\ 表示字符 \
\123表示字符 {
\t 表示制表符
这些都是一个字符。
- (0,1,0,1,0,4,1,0,1)
- (0,1,0,1,0,2,1,0,1)
- (0,1,0,1,0,0,0,1,1)
- (0,1,0,1,0,1,0,1,1)
- 对
- 错
-
四、树和堆
(4.1)树
- 对
- 错 如果该二叉树非完全二叉树则有可能不满足题目条件
- 对
- 对 我觉得应该是对的
- 错
- 对
- 错 删除一个非叶节点, 需要调整其子节点的位置。所以并不能简单地直接进行删除。
- 一种AVL树
- 索引表的一种组织形式
- 一种高度不小于1的树
- 一种与二进制Binary有关的树
- 前序
- 中序
- 后序
- 按层次
- 逻辑
- 逻辑和存储
- 物理
- 线性
- 前序线索二叉树中求前序后继
- 中序线索二叉树中求中序后继
- 中序线索二叉树中求中序前驱
- 后序线索二叉树中求后序后继
- ①②③
- ②③④
- ②④
- ①④
- ①②③
- ②③
- ②③④
- ③
- (1) Tree with Hash(100 bucket) at leaves(2) Tree with linked list at leaves.
- (1) Tree with linked list at leaves(2) Array.
- (1) Tree with linked list at leaves(2) Hash(10,000 buckets)
- (1) Sort linked list(2) Array.
(4.2)堆
- 对
- 错 没有规定必须是平衡的
- A、C、D、G、H、M、P、Q、R、X
- A、C、M、D、H、P、X 、G、0、R
- A、D、P、R、C、Q、X 、M、H、G
- A、D、C、M、P、G、H、X 、R、Q
五、图
- O(n)
- O(n+e)
- O(n2)
- O(n3)
- 对
- 错
- 关键活动不按期完成就会影响整个工程的完成时间
- 任何一个关键活动提前完成,那么整个工程将会提前完成
- 所有的关键活动提前完成,那么整个工程将会提前完成
- 某些关键活动若提前完成,那么整个工程将会提前完成
关键活动组成了关键路径,关键路径是图中的最长路径,关键路径长度代表整个工期的最短完成时间,关键活动延期完成,必将导致关键路径长度增加,即整个工期的最短完成时间增加,因此A正确。关键路径并不唯一,当有多条关键路径存在时,其中一条关键路径上的关键活动时间缩短,只能导致本条关键路径变成非关键路径,而无法缩短整个工期,因为其他关键路径没有变化,因此B项不正确。对于A,B两项要搞懂的是,任何一条关键路径上的关键活动变长了,都会使这条关键路径变成更长的关键路径,并且导致其他关键路径变成非关键路径(如果关键路径不唯一),因此整个工期延长。而某些关键活动缩短则不一定缩短整个工期。
- 对
- 错
- O(n)
- O(n+e)
- O(n*n)
- O(n*n*n)
- 由顶点和相邻顶点序偶构成的边所形成的序列
- 由不同顶点所形成的序列
- 由不同边所形成的序列
- 上述定义都不是
- 对
- 错
-
- 求关键路径是以拓扑排序为基础的
- 一个事件的最早开始时间同以该事件为尾的弧的活动最早开始时间相同
- 一个事件的最迟开始时间为以该事件为尾的弧的活动最迟开始时间与该活动的持续时间的差
- 关键活动一定位于关键路径上
- 对
- 错
- 对
- 错
- (1)(2)(3)
- (1)
- (1)(3)
- (2)(3)
- G的邻接多重表需要n(n-1)个边结点和n个顶点结点
- G的连通分量个数最少
- G为连通图
- G所有顶点的度的总和为n(n-1)
- n2
- n(n-1)
- n(n+1)
- n(n-1)/2
- 对
- 错
- 存在 都向后,而且最后没有向前
- 不存在
- n-1
- n
- n+1
- 2n
- 有向图
- 带权有向图
- 有向图或无向图
- 无向图

- A点
- B点
- C点
- D点
无向图: 图连通,所有点都是偶数度,或者只有两个点是奇数度。当所有点是偶数度时欧拉路起点可以是任意
点;当有两个奇数度点时起点必须是奇数度点。
有向图: 图连通,所有点出度=入度,或者有一个点入度-出度=1,有一个点出度-入度=1。同样,当所有点
出度=入度时任意点可作为起点;而后者必须以出度-入度=1的点做起点,入度-出度=1的点做终点。
- 深度优先遍历
- 拓扑排序
- 求最短路径
- 求关键路径
六、哈希
现有一完全的P2P共享协议,每次两个节点通讯后都能获取对方已经获取的全部信息,现在使得系统中每个节点都知道所有节点的文件信息,共17个节点,假设只能通过多次两个对等节点之间通讯的方式,则最少需要()次通讯- 32
- 31
- 30
- 29

如果将所有节点分成两组,如图2所示,两组中的节点分别按连线1-8顺序通讯之后,节点4和5就掌握了1-5所有节点的信息,节点9和0就掌握了6-0所有节点的信息,再按连线9、10通讯之后,节点4、5、9、0就掌握了1-0所有节点的信息,剩下的节点只需跟4、5、9、0任一节点通讯一次就可保证每个节点知道所有节点信息,和图1相比,多了9和10两次通讯,总的通讯次数是(2n1-3)+(2n2-3)+2=2n-4次(n1和n2分别表示分组中元素个数)。
分3组的情况是(2n1-3)+(2n2-3)+(2n3-3)+6=2n-3次
分4组的情况是(2n1-3)+(2n2-3)+(2n3-3)+(2n4-3)+8=2n-4次
- 它把任意长度的信息转换成固定的长度输出
- 它把固定的信息转换成任意长度信息输出
- 根据特定的哈希值,它可以找到对应的原信息值
- 不同的信息很难产生一样的哈希值
- 哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);
- 线性表实现相对比较简单
- 平衡二叉树的各项操作的时间复杂度为O(logn)
- 平衡二叉树的插入节点比较快
- hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
- hash索引无法被用来进行数据的排序操作
- 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用
- Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
1、hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
因为hash索引比较的是经常hash运算之后的hash值,因此只能进行等值的过滤,不能基于范围的查找,因为经过hash算法处理后的hash值的大小关系,并不能保证与处理前的hash大小关系对应。
2、hash索引无法被用来进行数据的排序操作
由于hash索引中存放的都是经过hash计算之后的值,而hash值的大小关系不一定与hash计算之前的值一样,所以数据库无法利用hash索引中的值进行排序操作。
3、对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
4、Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
(6.1)构造、散列函数
- 对
- 错
- h(k)=k/n
- h(k)=1
- h(k)=k mod N
- h(k)=(k + Random(N )) mod N;Random(N)返回一个0到N-1的整数
- 理论上可以在常数时间内找到特定记录
- 所有记录必须存在内存中
- 拉链式哈希曼最坏查找时间复杂度是O(n)
- 哈希函数的选择跟A无关
A,记录共有100万条,一般的哈希表长度不可能做这么长,因此要解决散列冲突问题,因此一般不能再常数时间内找到记录
B,哈希查找可以在外存中查找,可以用哈希表映射到文件,分级查找
C,最坏情况是所有记录的散列值都冲突,这样就退化为线性查找,时间复杂度为O(n)
D,哈希函数的选择跟A关系密切,跟A的字段类型有关,哈希函数设计的好坏也影响着查找的速度
(6.2)冲突解决
- 开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。
- 拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中
- 拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
- 当结点规模较大时,开放定址法较为节省空间
(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
(3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
(4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。
- n2
- n*(n+1)
- n*(n+1)/2
- n*(n-1)/2
六、并发
(6.1)程序类
- 1
- 2
- 3
- 4
大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的
- 第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。
- 第二种可能情况:再假设现在第一个n++ 已经执行完了 但是结果还没有写回内存 这个时候 n+=2 已经全部执行完 2 写进了内存 结束 然后回到n++的写回操作 这个时候内存就从2被改回1了,后面再来一次n++ 结果就为2。
- 第三种可能情况: 第n+=2 先读取n的值到寄存器 即0入寄存器 这个时候被中断 第一个n++开始执行 并直到结束 内存被改成了1 ,然后 n+=2 继续执行 结束后内存变为2 第二个n++再执行 结果就是3了

- 方式A效率更高
- 方式B效率更高
- 当排队的任务中有长耗时任务且比例较低时,方式B更具优势
- 都不正确
- Critical Section
- Event
- Mutex
- Semaphore
- 事件
- 临界区
- 互斥量
- 共享内存
以下说法正确的是:
- 在并行程度中,当两个并行的线程,在没有任何约束的情况下,访问一个共享变量或者共享对象的一个域,而且至少要有一个操作是写操作,就可能发生数据竞争错误。
- 原语Compare-and-swap(CAS)是实现无锁数据结构的通用原语。
- 获得内部锁的唯一途径是:进入这个内部锁保护的同步块或方法。
- volatile变量具有synchronized的可见性特性,但是不具备原子特性。
- 减小竞争发生可能性的有效方式是尽可能缩短把持锁的时间
下列哪种操作可能带来死锁?
- lock(m1) lock(m2) unlock(m1) unlock(m2)
- lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
- lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
- lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)
lock(m1) lock(m2) unlock(m1) 后如果m1被另一个进程申请到lock(m1),现在第一个进程申请m1,第二个申请m2,就会进入死锁
(6.1)操作系统、数据库并发类
- 进程释放资源
- 一个进程进入死循环
- 多个进程竞争,资源出现循环等待
- 多个进程竞争共享型设备
- 资源分配不当
- 进程运行推进的顺序不合适
- 系统资源不足
- 进程过多
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
产生死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁:
死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。
死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。
避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。
预防死锁:具体的做法是破坏产生死锁的四个必要条件之一。
- 互斥条件
- 系统资源有限
- 进程调度不合理
- 环路等待条件
实时操作系统的基本特性有?
- 提供高可靠性
- 提供及时响应性
- 提供多路性:即众多联机用户可以同时使用同一台计算机
- 提供独占性:各终端用户感觉到自己独占了计算机
- 抢占式调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
- 轮询调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
- 轮询调度实现相对较复杂
- 抢占式调度实现相对较复杂
抢占式任务调度允许调度程序根据某种原则去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。抢占方式的优点是,可以防止一个长进程长时间占用处理机,能为大多数进程提供更公平的服务,特别是能满足对响应时间有着较严格要求的实时任务的需求。
因为抢占式调度可能会暂停一些进程,需要记录进程的运行状态,较为复杂。轮询式只需要轮流分配资源,调度简单。
- 临界区
- 互斥区
- 事件
- 信号量
(1) 进程间通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件槽、剪切板、动态数据交换、对象连接与嵌入、动态连接库、远程过程调用等
(2) 事件、临界区、互斥量、信号量可以实现线程同步
七、android
- 能
- 不能
- IntentService是Service的子类
- IntentService在运行时会启动新的线程来执行任务
- 启动方式不同
- 没有区别
- 都可以减少重复属性设置
- style可以作用在Activity上 作用于xml,可以继承theme,style
- theme可以继承 系统自带,不可继承,作用于acticvity
- 一个TextView的style中定义了textColor属性,TextView本身也设置textColor属性,那么TextView本身定义的优先级较高
- Tween
- Alpha
- Frame
- Animation
- 蓝牙支持 android模拟器还不支持蓝牙设置
- 屏幕分辨率
- 缓存区大小
- SD卡支持
- 6
- 7
- 8
- 9

- getCount()
- getItemId()
- getItemViewType()
- getViewTypeCount()
- 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
- 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
- 让渲染器在独立的线程里运作,和UI线程分离。
- 可以直接从内存或者DMA等硬件接口取得图像数据
- 可以
- 不可以
- TextView
- ProgressBar
- CompoundButton
- ImageView
- 继承Checkable接口
- TextView
- ImageView
public interface Checkable 可以检验选中状态
间接子类
CheckBox, CheckedTextView, CompoundButton, RadioButton, ToggleButton- 在Activity中,Main线程消息队列中的消息在5秒内没有得到响应
- 在Service中,onStartCommand()方法执行超过5秒
- 在BroadcastReceiver中,onReceive()方法执行时间超过10秒
- 在启动的新线程中,run()方法执行时间超过5秒
- 应用运行时,Main线程进行了耗时操作
- 应用运行时抛出了OutOfMemoryError
- 应用运行时抛出了RuntimeException
- 应用运行时,用户操作过于频繁
使用Toast提示时,关于提示时长,下面说法正确的是( ).
- 显示时长只有2种设置
- 可以自定义显示时长
- 传入30时,提示会显示30秒钟
- 当自定义显示时长时,比如传入30,程序会抛出异常
- show()方法只显示对话框
- AlertDialog.Builder的create() 和show()方法都返回AlertDialog对象
- AlertDialog不能直接用new关键字构建对象,而必须使用其内部类Builder
- create()方法创建并显示对话框
例如: AlertDialog.Builder db= new Builder(this);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public
classMainActivity
extends
Activity
implements
OnClickListener
{
private
Button mBtnLogin = (Button) findViewById(R.id.btn_login);
private
TextView mTextViewUser;
@Override
protected
void
onCreate(BundlesavedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewUser = (TextView) findViewById(R.id.textview_user);
mBtnLogin.setOnClickListener(
this
);
new
Thread()
{
@Override
public
void
run()
{
mTextViewUser.setText(
10
);
}
}.start();
}
@Override
public
void
onClick(View v)
{
mTextViewUser.setText(
20
);
}
}
|
- Resources$NotFoundException
- ViewRootImpl$CalledFromWrongThreadException
- NullPointerException
- 运行正常,mTextViewUser组件上显示内容为10
- 进程正在运行一个与用户交互的Activity ,它的onResume()方法被调用
- 进程有一正在运行的BroadcastReceiver,它的onReceive()方法正在执行
- 进程有一个Service,并且在Service的某个回调函数(onCreate()、onStart()、或onDestroy())内有正在执行的代码
- 所有选项均正确
- 进程有一个Service,该Service对应的Activity正在与用户交互
- dip
- px
- sp sp=1/72pt
- pt
- Message
- Thread
- AsyncTask
- Looper
- 设置Activity的android:screenOrientation="portrait"属性时,切换屏幕横纵方向时不会重新调用各个生命周期,只会执行onConfigurationChanged方法
- 未设置Activity的android:configChanges属性,切换屏幕横纵方向时会重新调用onCreate()方法
- 当再次启动某个launchMode设置为singletask的Activity,它的onNewIntent()方法会被触发
- 用户正在操作某个Activity,这时如果其他应用程序需要内存,系统会将用户当前操作的Activity强制关闭
八、软件工程和测试
(8.1)软件工程
过程建模
数据建模
对象建模
业务建模
代码评审是检查源代码是否达到模块设计的要求。请判断这句话的正确与否。
T
F 代码评审不只是检查模块设计
- GB
- DIN
- ISO
- IEEE
- 关联是表示两个类的一般性联系
- 组合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系
- 聚合是关联关系的一种特例,他体现的是一种contains-a的关系
- 以上都不正确
关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:
从实现的角度讲,聚合可以表示为:
class A {...} class B { A* a; .....}
而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:
实现的形式是:
class A{...} class B{ A a; ...}
- 用例将系统的功能范围分解成许多小的系统功能陈述
- 一个用例代表了系统的一个单一的目标
- 用例是一个行为上相关的步骤序列
- 用例描述了系统与用户的交互
- 需求阶段
- 设计阶段
- 测试阶段
- 软件开发的各个阶段
- 系统结构图
- 数据字典(DD)
- 数据流程图(DFD图)
- 判定表
- 软件总体设计
- 算法设计
- 制定软件确认测试计划
- 数据库设计
- 值对象模式用来把一组数据封装成一个对象的模式
- 解决的问题是在远程方法的调用次数增加的时候,相关的应用程序性能将会有很大的下降
- 使用值对象的时候,可以通过仅仅一次方法调用来取得整个对象,而不是使用多次方法调用以得到对象中每个域的数值
- 它的本质是分层
- 状态模式
- 装饰模式
- 代理模式
- 观察者模式
- 外部设计评审报告在概要设计阶段产生
- 集成测评计划在程序设计阶段产生
- 系统计划和需求说明在详细设计阶段产生
- 在进行编码的同时,独立的设计单元测试计划
- 需求工件已经被基线化
- 详细设计工件已经被基线化
- 构架工件已经被基线化
- 项目阶段成果已经被基线化
- 需求分析
- 概要设计
- 详细设计
- 编码
- 对象模型
- 物理模型
- 逻辑模型
- 实体联系模型
- 系统的使用范围变化很大
- 系统的设计方案难以确定
- 用户的需求模糊不清
- 用户数据资源缺乏组织和管理
(8.2)软件测试
- 项目经理
- SQA 负责人
- 配置负责人
- 测试组
- T
- F 应该是由程序员担任的
-
-
- 制定测试计划
- 设计测试用例
- 设计测试过程、脚本
- 评估测试活动
- 存储压力
- 响应能力压力
- 网络流量压力
- 并发压力
- 软件测试是使用人工操作或者软件自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。
- 软件测试的测试目标是发现一些可以通过测试避免的开发风险。
- 软件测试的原则之一是测试应该尽早进行,最好在需求阶段就开始介入。
- 软件测试主要工作内容是验证(verification)和确认(validation)
- 正式验收测试
- 白盒测试
- alpha测试
- beta测试
软件验收测试分为三类:
正式验收测试;
非正式验收测试其中包括α测试(由用户、测试人员、开发人员共同参与的内部测试。)
和β测试(内测后的公测,即完全交给最终用户测试。)
- 逻辑覆盖法
- 边界值法
- 基本路径法
- 正交试验设计法
- 个人复查
- 抽查和会审
- 黑盒测试
- 白盒测试
- 正确
- 错误
- alpha 测试需要用户代表参加
- alpha 测试不需要用户代表参加
- alpha 测试是系统测试的一种
- alpha 测试是验收测试的一种
- 软件测试计划
- 可行性研究报告
- 软件需求规范
- 迭代计划
- 条件覆盖
- 条件组合覆盖
- 语句覆盖
- 判定/条件覆盖
十五、智力类
- 120
- 150
- 100
- 80
- 32
- 31
- 30
- 29

如果将所有节点分成两组,如图2所示,两组中的节点分别按连线1-8顺序通讯之后,节点4和5就掌握了1-5所有节点的信息,节点9和0就掌握了6-0所有节点的信息,再按连线9、10通讯之后,节点4、5、9、0就掌握了1-0所有节点的信息,剩下的节点只需跟4、5、9、0任一节点通讯一次就可保证每个节点知道所有节点信息,和图1相比,多了9和10两次通讯,总的通讯次数是(2n1-3)+(2n2-3)+2=2n-4次(n1和n2分别表示分组中元素个数)。
分3组的情况是(2n1-3)+(2n2-3)+(2n3-3)+6=2n-3次
分4组的情况是(2n1-3)+(2n2-3)+(2n3-3)+(2n4-3)+8=2n-4次
- 7
- 8
- 15
- 16
- 2040
- 2042
- 2045
- 2050
故,结果为68*30=2040+5=2045
在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行()次比较:
- 8
- 9
- 10
- 11