niusouti.com

试题五(共15分)阅读下列说明和程序,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中:【程序1】是李工编写的一个数据交换子程序。【程序2】是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的itemid表示后面联合体un的有效性,itemid为0时,联合体un里面的data项有效,否则联合体un中的lin

题目

试题五(共15分)

阅读下列说明和程序,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中:

【程序1】是李工编写的一个数据交换子程序。

【程序2】是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的itemid表示后面联合体un的有效性,itemid为0时,联合体un里面的data项有效,否则联合体un中的link项有效。

【程序1】

#include <stdio.h>

swap(int x,int y){

int t:

t= x;

x=y;

y=t;

}

main() {

int a,b;

a=3;

b=4;

swap(a,b);

printf(”%d, %d\n",a,b);

}

【程序2】

typedef struct Item {

int itemid;

union {

char data;

struct Item *link;

}un;

struct Item *nextItem;

} ItemNode;

int EqualItem( ItemNode*x,ItemNode*y){

int res;

if(x==y) retun1;

if(1){

if (2){

If(x->itemid==0){

res= (3) ;

}

else{

res= (4) ;

}

if (res){

retun (5) ;

}

}

}

Return0;

}

【问题1】(6分)

执行【程序1】后,打印出来的a=3,b=4;并没有完成数据交换,请指出李工的问题?并改正程序错误。将答案填写在答题纸中对应的栏目。

【问题2】(5分)

仔细阅读并分析【程序2】中的C语言代码,完成其中(1)~(5)空白填空,将

答案填入答题纸的对应栏内。

【问题3】(4分)

李工编写某嵌入式软件时,遇到了一些问题,请帮助李工解答下面2个问题,并将答案填写在答题纸中对应的栏目。

(1)李工在编译时,程序没有通过编译,经检查程序后将文件头的#include<filename.h>改为#include“filename.h”后编译通过,请问#include <filename.h>和#include“filename.h”的区别是什么?

(2)李工在编写一段C++程序时,需要调用一段已编译的C语言函数,为什么要加exten“C”?


相似考题

1.●试题四阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明4.1】假设两个队列共享一个循环向量空间(如图1-2所示),其类型Queue2定义如下:typedef struct{DateType data [MaxSize];int front[2],rear[2];}Queue2;对于i=0或1,front[i]和rear[i]分别为第i个队列的头指针和尾指针。函数EnQueue(Queue2*Q,int i,DateType x)的功能是实现第i个队列的入队操作。【函数4.1】int EnQueue(Queue2*Q,int i,DateType x){∥若第i个队列不满,则元素x入队列,并返回1;否则,返回0if(i<0‖i>1)return 0;if(Q->rear[i]==Q->front[ (1) ]return 0;Q->data[ (2) ]=x;Q->rear[i]=[ (3) ];return 1;}【说明4.2】函数BTreeEqual(BinTreeNode*T1,BinTreeNode*T2)的功能是递归法判断两棵二叉树是否相等,若相等则返回1,否则返回0。函数中参数T1和T2分别为指向这两棵二叉树根结点的指针。当两棵树的结构完全相同,并且对应结点的值也相同时才被认为相等。已知二叉树中的结点类型BinTreeNode定义为:struct BinTreeNode{char data;BinTreeNode*left,*right;};其中data为结点值域,left和right分别为指向左、右子女结点的指针域,【函数4.2】int BTreeEqual(BinTreeNode*T1,BinTreeNode*T2){if(T1==NULL && T2==NULL)return 1;∥若两棵树均为空,则相等else if( (4) )return 0;∥若一棵为空一棵不为空,则不等else if( (5) )return 1;∥若根结点值相等并且左、右子树∥也相等,则两棵树相等,否则不等else return 0;}

2.试题五(共 15分)阅读以下关于 C语言及 C代码的叙述,回答问题 1至问题 3,将答案填入答题纸的对应栏内。【说明】在开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下三部分程序,其中:【C代码 1】是李工为了在嵌入式平台上开发一段可变参数函数,在X86 平台上实现的一个参数个数可变函数实例。【C代码 2】是王工在编写软件时,自己编写的内存拷贝函数。【C代码 3】是赵工编写的一段数据处理的程序,其中 fun()的含义为从已创建的一个单向链表中查找倒数第index 个节点。他的设计思路为:首先创建两个指针 ptrl,ptr2,并且都指向链表头,然后 ptrl向前走index 步,这样ptrl和 ptr2 之间就间隔 index 个节点,然后 ptrl和ptr2 同时向前步进,当 ptrl到达最后一个节点时,ptr2 就是倒数第 index 个节点了。ReverseList()为赵工编写的对已有单向链表进行逆序重排的函数。【C代码 1】long sum(int i,...){int *p,j;long s = 0;p=&i+1;for(j=0;j<i;j++)s+=p[j]return s;}long Sum = sum(3,l,2,3);【C代码 2】static int pent;……void *MyMemcpy(void * dest, const void* src, int n ){char *pDest = (char *)dest;char *pSrc = (char *)src;for (int i=0;i<n; i++) {*(pDest +i) = *(pSrc+i);} return dest;}【C代码 3】node *fun(node * head, int index){node *ptr1,*ptr2;int 1 = 0;ptr1 = head;ptr2 = head;if( head == NULL || head->next == NULL)return ptrl;while(i<index){(1)if(ptrl == NULL)return head;i++;}while(ptrl->next != NULL){ptrl = ptrl->next;(2) ;}return (3) ;}node* ReverseList(node *head){node *templ = NULL;node *temp2 = NULL;node *temp3 = NULL;if((head->next == NULL) || (head == NULL)){return head;} templ=head;temp3= templ->next;templ->next= NULL;while(temp3->next!=NULL){temp2 = temp3;temp3= temp3->next;(4) ;templ=temp2;}temp3->next= templ;retum (5)}【问题1】(3分)执行【C代码 1】后,Sum的值应为多少?请用十进制表示。【问题2】(7分)请问【C代码2】中 static的作用是什么?const的作用是什么?王工自己编写的内存拷贝函数安全吗?如存在缺陷,请指出缺陷在哪里。【问题3】(5 分)仔细阅读并分析【C代码 3】,填补其中的空(1)~(5)。

4.阅读下列函举说明和C代码,将应填入(n)处的字句写在对应栏内。【说明4.1】假设两个队列共享一个循环向量空间(如图1-2所示),其类型Queue2定义如下:typedef struct {DateType data [MaxSize];int front[2],rear[2];}Queue2;对于i=0或1,front[i]和rear[i]分别为第i个队列的头指针和尾指针。函数.EnQueue (Queue2*Q,int i,DaleType x)的功能是实现第i个队列的入队操作。【函数4.1】int EnQueue(Queue2 * Q, int i, DateType x){ /*若第i个队列不满,则元素x入队列,并返回1;否则,返回0*/if(i<0‖i>1) return 0;if(Q->rear[i]==Q->front[(1)]return 0;Q->data[(2)]=x;Q->rear[i]=[(3)];return 1;}【说明4.2】函数BTreeEqual(BinTreeNode*T1,BinTtneNode*T2)的功能是递归法判断两棵二叉树是否相等,若相等则返回1,否则返回0。函数中参数T1和T2分别为指向这两棵二叉树根结点的指针。当两棵树的结构完全相同,并且对应结点的值也相同时,才被认为相等。已知二叉树中的结点类型BinTreeNode定义为:struct BinTreeNode {char data;BinTreeNode * left, * right;};其中dau为结点值域,leR和risht分别为指向左、右子女结点的指针域,【函数4.2】int BTreeEqual(BinTreeNode * T1, BinTreeNode * T2){if(Ti == NULL && T2 == NULL)return 1 /*若两棵树均为空,则相等*/else if((4))return 0; /*若一棵为空一棵不为空,则不等*/else if((5)) return 1; /*若根结点值相等并且左、右子树*//*也相等,则两棵树相等,否则不等*/else return 0;}

更多“试题五(共15分)阅读下列说明和程序,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中:【程序1】是李工编写的一个数据交换子程序。【程序2】是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的ite”相关问题
  • 第1题:

    阅读下列说明和程序,回答问题l至问题3.将答案填入答题纸的对应栏内。

    【说明】

    在开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下程序,其中:

    【程序1】;实现两个变量的值的互换;

    【程序2】:完成某功能的C语言程序;

    【程序3】和【程序4】:是P、V操作的形式化定义,设S为信号量。在多道程序系

    统中,进程是并发执行的。这些进程间存在着不同的相互制约关系,主要表现为同步和

    互斥两个方面。信号量是解决进程间同步与互斥的有效方法。

    【程序1】

    【程序3】

    P操作的形式化定义

    P (S)

    {

    (1):

    If(2) {

    阻塞该进程;

    将该进程插入信号量S的等待队列

    }

    }

    【程序4】

    V操作的形式化定义:

    V(S)

    {

    (3)

    if(4) {

    从信号量s的等待队列中取出队首进程

    将其插入就绪队列:

    }

    }

    【问题1】(6分)

    执行【程序1】后,没有能够实现两个变量值的交换,为什么?请修改上述函数

    实现两个变量值的交换,要求函数无返回值,形式为:void swap(...)。请将答案填写在

    答题纸中对应的栏目。

    【问题2】(3分)

    请问【程序2】运行结果是什么?

    【问题3】(6分)

    请简述什么是临界资源?什么是临界区?

    请完成【程序3】和【程序4】的形式化定义,将应填入(n)处的内容写在答题纸

    的对应栏中。


    正确答案:
    分析本题考查嵌入式C/C++语言编程基础知识。【问题1】函数swap采用值传递,虽然将形参nl和n2交换了,但是并不影响到实参,所以执行【程序1】后,实参变量并没有完成数据交换。将值传递改成指针传递就可以了。对应的swap函数应修改如下:【问题3】在多道程序系统中,进程是并发执行的,这些进程之间存在着不同的相互制约关系。进程之间的这种制约关系来源于并发进程的合作以及对资源的共享。进程在运行过程中,一般会与其它进程共享资源,而有些资源的使用具有排他性。系统中的多个进程可以共享系统的各种资源,然而其中许多资源一次只能为一个进程所使用,通常把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机、绘图机等。除物理设备外,还有许多变量、数据等都可由若干进程所共享,它们也属于临界资源。进程中访问临界资源的那段代码称为临界区,也称为临界段。访问临界资源应遵循如下原则:①空闲让进(或有空即进):当没有进程处于临界区时,可以允许一个请求进入临界区的进程立即进入自己的临界区:②忙则等待(或无空则等):当已有进程进入其临界区时,其它试图进入临界区的进程必须等待;③有限等待:对要求访问临界资源的进程,应保证能在有限时间内进入自己的临界区;④让权等待:当进程不能进入自己的临界区时,应释放处理机。信号量是荷兰著名的计算机科学家Dijkstra于1965年提出的一个同步机制,其基本思想是在多个相互合作的进程之间使用简单的信号来同步。在操作系统中,信号量是表示资源的实体,除信号量的初值外,信号量的值仅能由P操作(又称Wait操作)和V操作(又称Signal操作)改变。设S为一个信号量.P(S)执行时主要完成:先执行S=S-I:若S0则进程继续运行;若s<o则阻塞改进程,并将它插入该信号量的等待队列中。v(s)执行时主要完成:先执行S=S+I:若s>o则进程继续执行;若S≤0则从该信号量等待队列中移出第一个进程.使其变为就绪状态并插入就绪队列,然后再返回原进程继续执行。P、V操作的形式化描述如下:P(S){S—IF(S<O){阻塞该进程,将该进程插入信号量s的等待队列;}}V(S){s++;IF(S<=0){从信号量S的等待队列中取出队首进程,将其插入就绪队列;}}试题五参考答案【问题1】两个变量不能交换值的原因:因为函数是传值的,函数形参值的交换,并不影响到实参的值的变化。正确的函数编写如下(下面只是范倒,变量名称不作要求):voidswap(int*pnl.int*pn2){inttmp=*pnl;*pnl=*pn2;*pn2=tmp;}【问题2】第一次输出:fun(5)=5第二次输出:fun(7)=13第三次输出:fun(9)=34【问题3]临界资源:一次只能使一个进程访问的资源称为临界资源临界区:进程中访问临界资源的那段代码称为临界区。(l)S-(2)S<0(3)S++(4)S<=0

  • 第2题:

    阅读下列Java程序,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】逻辑覆盖法是设计白盒测试用例的主要方法之一,它是通过对程序逻辑结构的遍历实现程序的覆盖。针对以下由Java语言编写的程序,按要求回答问题。



    问题1:(2分) 请简述基本路径测试法的概念。
    问题2:(8分)请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。
    问题3:(3分)请给出【问题2】中控制流图的线性无关路径。


    答案:
    解析:
    问题1:答案:基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。
    问题2:答案:(1)控制流图如下图所示:



    (2)V(G)=4+1=5
    问题3:答案:(1) 1-2-3-8-10(2) 1-2-4-5-6-8-10(3) 1-2-3-4-5-6-8-10(4) 1-2-4-5-7-8-10(5) 1-2-3-8-9-10
    【解析】
    问题1:本小题考查基本路径法的概念。
    问题2:本题考查白盒测试方法中的基本路径法。涉及到的知识点包括:根据代码绘制控制流图、计算环路复杂度。控制流图是描述程序控制流的一种图示方法。其基本符号有圆圈和箭线:圆圈为控制流图中的一个结点,表示一个或多个无分支的语句;带箭头的线段称为边或连接,表示控制流。基本结构如下所示:



    其中要特别注意的是,如果判断中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符连接的逻辑表达式,则需要改变复合条件的判断为一系列之单个条件的嵌套的判断。环路复杂度用来衡量一个程序模块所包含的判定结构的复杂程度。环路复杂度等于右图中的判定的节点个数加1。图中判定节点个数为4,所以V(G)=4+1=5。控制流程图的环路复杂性 V(G)一共有以下三种方法,但是最后一种最好用,不易出错。(1)控制流程图中的区域个数。(2)边数-结点数+2。(3)判定数+1。
    问题3:本小题考查白盒测试用例设计方法之基本路径法。涉及到根据控制流图和环路复杂度给出线性无关路径。线性无关路径:指包含一组以前没有处理的语句或条件的路径。从控制流图上来看,一条线性无关路径是至少包含一条在其他线性无关路径中从未有过的边的路径。程序的环路复杂度等于线性无关路径的条数,所以本题中有5条线性无关路径。这5条路径组成了问题2中控制流图的一个基本路径集。只要设计出的测试用例能确保这些基本路径的执行,就可以使程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。需要注意的是,基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。

  • 第3题:

    阅读下列程序,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】逻辑覆盖法是设计白盒测试用例的主要方法之一,它是通过对程序逻辑结构的遍历实现程序的覆盖。针对以下由C 语言编写的程序,按要求回答问题。
    main( ){int i,n; //1for(i=1;i<5;i++){ //2n=0;  if(i!=1) //3 n=n+1; //4 if(i==3) //5 n=n+1; //6  if(n==3) //7  printf("Hello!"); //8 }} //9 问题1:(4分)请给出满足100%DC(判定覆盖)所需的逻辑条件。问题2:(6分)请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。问题3:(5分)请给出【问题2】中控制流图的线性无关路径。


    答案:
    解析:
    问题1:
    1、i < 52、i >= 53、i != 14、i == 15、i == 36、i != 37、n == 38、n != 3
    问题2(1) 控制流图如下图所示:



    (2)V(G)=4+1=5问题3:
    (1) 1-2-9 (2) 1-2-3-5-7-2... (3) 1-2-3-5-7-8-2...(4) 1-2-3-4-5-7-2… (5) 1-2-3-5-6-7-2…
    【解析】
    问题1:判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得-次 “真”值和“假”值,从而使程序的每一个分支至少都通过一次。本题中程序一共有4个判定,所以满足判定覆盖一共就需要8个逻辑条件,这些条件详见上述答案。问题2:
    本题考查白盒测试方法中的基本路径法。涉及到的知识点包括:根据代码绘制控制流图、计算环路复杂度。控制流图是描述程序控制流的一种图示方法。其基本符号有圆圈和箭线:圆圈为控制流图中的一个结点,表示一个或多个无分支的语句;带箭头的线段称为边或连接,表示控制流。基本结构如下所示:



    其中要特别注意的是,如果判断中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符连接的逻辑表达式,则需要改变复合条件的判断为一系列之单个条件的嵌套的判断。环路复杂度用来衡量一个程序模块所包含的判定结构的复杂程度。环路复杂度等于右图中的判定的节点个数加1。图中判定节点个数为4,所以V(G)=4+1=5。控制流程图的环路复杂性 V(G)一共有以下三种方法,但是最后一种最好用,不易出错。(1)控制流程图中的区域个数。(2)边数-结点数+2。(3)判定数+1。问题3:本小题考查白盒测试用例设计方法之基本路径法。涉及到根据控制流图和环路复杂度给出线性无关路径。线性无关路径:指包含一组以前没有处理的语句或条件的路径。从控制流图上来看,一条线性无关路径是至少包含一条在其他线性无关路径中从未有过的边的路径。程序的环路复杂度等于线性无关路径的条数,所以本题中有5条线性无关路径。这5条路径组成了问题2中控制流图的一个基本路径集。只要设计出的测试用例能确保这些基本路径的执行,就可以使程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。需要注意的是,基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。

  • 第4题:

    阅读下列C程序,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】逻辑覆盖法是设计白盒测试用例的主要方法之一,它是通过对程序逻辑结构的遍历实现程序的覆盖。针对以下由C 语言编写的程序,按要求回答问题。



    问题1:(6分) 请针对上述C程序,给出满足100%DC(判定覆盖)所需的逻辑条件。
    问题2:(7分)请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。
    问题3:(3分)请给出【问题2】中控制流图的线性无关路径。


    答案:
    解析:
    问题1答案:

    问题2:答案:(1)控制流图如下图所示:



    (2)V(G)=10+1=11
    问题3:答案:(1)1-2-19 (2) 1-2-3-19 (3) 1-2-3-4-12-13-17-19(4) 1-2-3-4-12-13-14-17-19 (5) 1-2-3-4-12-13-14-15-17-19(6) 1-2-3-4-12-13-14-15-16-17-19 (7) 1-2-3-4-12-13-14-15-16-18-19(8) 1-2-3-4-5-11-19 (9)1-2-3-4-5-6-10-19(10) 1-2-3-4-5-6-7-9-19 (11) 1-2-3-4-5-6-7-8-19
    【解析】
    问题1本小题考查白盒测试中的判定覆盖法。判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得-次 “真”值和“假”值,从而使程序的每一个分支至少都通过一次。本题中程序一共有6个判定,所以满足判定覆盖一共就需要12个逻辑条件,这些条件详见上述答案。问题2:本题考查白盒测试方法中的基本路径法。涉及到的知识点包括:根据代码绘制控制流图、计算环路复杂度。控制流图是描述程序控制流的一种图示方法。其基本符号有圆圈和箭线:圆圈为控制流图中的一个结点,表示一个或多个无分支的语句;带箭头的线段称为边或连接,表示控制流。基本结构如下所示:



    其中要特别注意的是,如果判断中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符连接的逻辑表达式,则需要改变复合条件的判断为一系列之单个条件的嵌套的判断。环路复杂度用来衡量一个程序模块所包含的判定结构的复杂程度。环路复杂度等于右图中的判定的节点个数加1。图中判定节点个数为10,所以V(G)=10+1=11。控制流程图的环路复杂性 V(G)一共有以下三种方法,但是最后一种最好用,不易出错。(1)控制流程图中的区域个数。(2)边数-结点数+2。(3)判定数+1。
    问题3:本小题考查白盒测试用例设计方法之基本路径法。涉及到根据控制流图和环路复杂度给出线性无关路径。线性无关路径:指包含一组以前没有处理的语句或条件的路径。从控制流图上来看,一条线性无关路径是至少包含一条在其他线性无关路径中从未有过的边的路径。程序的环路复杂度等于线性无关路径的条数,所以本题中有11条线性无关路径。这11条路径组成了问题2中控制流图的一个基本路径集。只要设计出的测试用例能确保这些基本路径的执行,就可以使程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。需要注意的是,基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。

  • 第5题:

    阅读下列程序,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】逻辑覆盖法是设计白盒测试用例的主要方法之一,它是通过对程序逻辑结构的遍历实现程序的覆盖。针对以下由C 语言编写的程序,按要求回答问题。




    问题1:(5分)请给出满足100%DC(判定覆盖)所需的逻辑条件。
    问题2:(7分)请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。
    问题3:(3分)请给出【问题2】中控制流图的线性无关路径。


    答案:
    解析:
    问题1:答案:



    问题2:答案:1.控制流图如下图所示:



    (2)、V(G)=6+1=7
    问题3:答案:1.1-2-3-4-2...2.1-2-3-5-6-2...3.1-2-3-5-7-134.1-2-8-9-10-11-135.1-2-8-9-10-12-136.1-2-8-9-12-137.1-2-8-12-13
    【解析】
    问题1:本小题考查白盒测试中的判定覆盖法。判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得-次 “真”值和“假”值,从而使程序的每一个分支至少都通过一次。本题中程序一共有5个判定,所以满足判定覆盖一共就需要10个逻辑条件,这些条件详见上述答案。问题2:本题考查白盒测试方法中的基本路径法。涉及到的知识点包括:根据代码绘制控制流图、计算环路复杂度。控制流图是描述程序控制流的一种图示方法。其基本符号有圆圈和箭线:圆圈为控制流图中的一个结点,表示一个或多个无分支的语句;带箭头的线段称为边或连接,表示控制流。基本结构如下所示:



    其中要特别注意的是,如果判断中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符连接的逻辑表达式,则需要改变复合条件的判断为一系列之单个条件的嵌套的判断。环路复杂度用来衡量一个程序模块所包含的判定结构的复杂程度。环路复杂度等于右图中的判定的节点个数加1。图中判定节点个数为6,所以V(G)=6+1=7。控制流程图的环路复杂性 V(G)一共有以下三种方法,但是最后一种最好用,不易出错。(1)控制流程图中的区域个数。(2)边数-结点数+2。(3)判定数+1。
    问题3:本小题考查白盒测试用例设计方法之基本路径法。涉及到根据控制流图和环路复杂度给出线性无关路径。线性无关路径:指包含一组以前没有处理的语句或条件的路径。从控制流图上来看,一条线性无关路径是至少包含一条在其他线性无关路径中从未有过的边的路径。程序的环路复杂度等于线性无关路径的条数,所以本题中有7条线性无关路径。这7条路径组成了问题2中控制流图的一个基本路径集。只要设计出的测试用例能确保这些基本路径的执行,就可以使程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。需要注意的是,基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。