●试题二阅读下列程序和控制流图,将应填入(n)的字句写在答题纸的对应栏内。【程序】下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。int GetMax(int n,int datalist[]){int k=0;for(int j=1;j<n;j++)if(datalist[j]>datalist[k])k=j;return k;}【控制流图】【问题1】该程序的控制流图中A~E分别是什么?【问题2】计算控制流图的McCabe环路复杂性。【问题3】用基本路径覆盖法给出测试

题目

●试题二

阅读下列程序和控制流图,将应填入(n)的字句写在答题纸的对应栏内。

【程序】

下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。

int GetMax(int n,int datalist[]){

int k=0;

for(int j=1;j<n;j++)

if(datalist[j]>datalist[k])

k=j;

return k;

}

【控制流图】

【问题1】

该程序的控制流图中A~E分别是什么?

【问题2】

计算控制流图的McCabe环路复杂性。

【问题3】

用基本路径覆盖法给出测试路径。

【问题4】

为各测试路径设计测试用例。


相似考题
更多“ ●试题二阅读下列程序和控制流图,将应填入(n)的字句写在答题纸的对应栏内。【程序】下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。int GetMax(int n,int da”相关问题
  • 第1题:

    ●试题二

    阅读下列程序或函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【函数2.1说明】

    函数strcmp()是比较两个字符串s和t的大小。若s<t函数返回负数;若s=t函数返回0;若s>t,函数返回正数。

    【函数2.1】

    int strcmp(char *s,char *t)

    { while(*s && *t && (1) ){

    s++;t++;

    }

    return (2) ;

    }

    【程序2.2说明】

    在n行n列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小一个。

    【程序2.2】

    #includestdio.h

    #define N 100

    int a[N][N];

    void main()

    { int row ,col,max,min,n;

    /*输入合法n(<100),和输入n×n个整数到数组a的代码略*/

    for (row=0;row<n;row++){

    for(max=a[row][0],col=1;col<n;col++)

    if( (3) )max=a[row][col];

    if( (4) )min=max;

    else if( (5) )min=max;

    }

    printf ("The min of max numbers is %d\n",min);

    }


    正确答案:

    ●试题二

    【答案】(1)*s == *t(2) *s - *t

    【解析】*s *t相等才执行循环体。返回二者差值,恰好符合题目要求。

    【答案】(3) arow][col>max (4) row == 0(5) max<min

    【解析】当前值比max大,则把它赋给maxmax是本行最大值。初始化min为第一行的max。该行的maxmin小,则将max赋给min

     

  • 第2题:

    阅读下面程序: include void fun(int n) { int x(5); static int y(10); if(n>0) {

    阅读下面程序:

    include<iostream.h>

    void fun(int n)

    {

    int x(5);

    static int y(10);

    if(n>0)

    {

    ++x;

    ++y;

    cout<<x<<","<<y<<end1;

    }

    }

    void main()

    {

    int m(1);

    fun(m);

    }

    则该程序的输出结果是______。


    正确答案:611
    6,11

  • 第3题:

    阅读下面程序: include void f(int n) { int x(5); static int y(10); if(n>0) { ++

    阅读下面程序:

    include<iostream.h>

    void f(int n)

    {

    int x(5);

    static int y(10);

    if(n>0)

    {

    ++x;

    ++y;

    cout<<x<<","<<y<<endl;

    }

    }

    void main()

    {

    int m(1);

    f(m),

    }

    则该程序的输出结果是【 】


    正确答案:611
    6,11

  • 第4题:

    阅读下面程序: include using namespace std; long fib(int n) {if(n > 2) return(fib

    阅读下面程序:

    include<iostream>

    using namespace std;

    long fib(int n)

    {

    if ( n > 2 )

    return (fib(n-1)+fib(n-2));

    else

    return 2;

    }

    int main()

    {

    cout<<fib(3)<<end1;

    return 0;

    {

    则该程序的输出结果应该是【 】。


    正确答案:4
    4 解析:本题主要考察C++中递归函数的调用。递归函数即自调用函数,在函数体内部直接或间接的自己调用自己,即函数的嵌套调用是函数本身。递归调用分为直接递归调用和间接递归调用两种形式。
    本题程序为求解典型递归数列Fibonacci中任意项值的简化程序(主函数中的调用改成 fib(n),即变成求解任意项值)。主函数通过调用fib()函数,fib()函数内部再通过一个分支结构判断是否进行递归调用或退出递归调用,调用方式为直接递归调用。
    主函数通过实参将值3赋给fib()函数的形参n,由于n‘3满足汀分支语句条件,因此函数进行递归调用,即计算fib(2)和fib(1)的值;将2赋给fib()函数的形参后,
    由于n=2不满足if分支语句条件,因此程序退出递归,返回2:将1赋给fib()函数的形参后,函数同样返回2。因此函数递归调用的最终结果为返回2+2=4,即fib(3) =4,程序最后输出值为4。

  • 第5题:

    阅读下列程序: include void fun(int n) { int x(5); static int y(10); if(n>0) {

    阅读下列程序:

    include<iostream.h>

    void fun(int n)

    {

    int x(5);

    static int y(10);

    if(n>0)

    {

    ++x;

    ++y;

    cout<<x<<","<<y<<endl;

    }

    }

    void main()

    int m(1);

    fun(m);

    }

    则该程序的输出结果是______。


    正确答案:611
    6,11 解析:由主函数mian入手,首先定义变量m等于1,然后调用fun函数。fun函数中y为静态数值,等于10,作用域为到本文件结束。所以y加1后,主函数中y的值也为11。其中函数中x的加1运算调用的是函数中的x等于5的变量,作用域为由定义到文件结束,即主函数中输出的x值为6。所以答案为6,11。

  • 第6题:

    阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。

    [说明]

    下面程序输出一个矩形面积,以及矩形区域上的假想的作物产量。

    [C++程序]

    include <iostream.h>

    class crop_assessment

    {

    int actual_crop;

    int ideal_crop;

    public:

    void set(int in_actual,int in_ideal)

    {

    actual crop=in_actual;

    ideal_crop=in_ideal;

    }

    int get_actual_crop(void){ (1) ;}

    int get_ideal_crop(void){ (2) ;)

    };

    Class lot_size

    {

    int length;

    int width;

    (3) crop;

    public:

    void set(int 1,int w,int a,int i)

    {

    length=1;

    width=w;

    crop.set(a,i);

    }

    int get_area(void){return length*width;}

    int get_data(void){return (4) ;}

    int get_data2(void)freturn (5) ;}

    }

    int main()

    {

    Los_size small,medium;

    small.set(5,5,5,25);

    medium.set(10,10,10,50);

    cout<<"For a small lot of area"<<smallget_area()<<“\n”;

    cout<<"the actual crops are$"<<small.get_data2()<<"\n";

    cout<<"and ideal crops are$”<<small.get_data()<<"\n";

    cout<<"For a medium Lot of area"<<medium.get area()<<:\n”;

    cout<<"the actual crops are$"<<medium.get_data2()<<"\n";

    cout<<"and ideal crops are$"<<medium.get_data()<<"\n";

    return 0;

    }


    正确答案:(1) return actual_crop (2) return ideal_crop (3) Crop_assessment (4) crop.get_ideal_crop() (5) crop.get_actual_crop()
    (1) return actual_crop (2) return ideal_crop (3) Crop_assessment (4) crop.get_ideal_crop() (5) crop.get_actual_crop() 解析:本题以C++语言为载体,考查面向对象程序设计中的几个重要概念—类的嵌套及函数的使用。
    本题的功能是通过已定义的粮食收成类定义了一个计算特定矩形域上粮食收成的类,在主函数中定义了两个对象,并调用了相应的函数,来输出理想和实际的粮食产量。
    首先,由于Crop_assessment定义的成员数据缺省为私有的,所以想要获得实际和理想的粮食产量,要通过两个公有成员函数,所以(1)处应填入“return actual_crop”,(2)处应填入“return ideal_crop”。
    其次,在类Lot_size中,由于我们要反映矩形域上的粮食产量,所以我们在类中嵌套定义了一个类,(3)应填入“Crop_assessment”。
    最后,由于我们想通过Lot_size类中的getdata和get_data2函数得到粮食产量,但由于这两个成员数据是私有函数,所以我们必须通过定义的对象调用它,所以(4)应填入“crop.get ideal_crop()”,(5)应填入“crop.get actual_crop()”。

  • 第7题:

    阅读下面利用递归来求n!的程序 class FactorialTest { static long Factorial(int n){ //定义Factorial()方法 if(n==1)return 1; else return n * Factorial(______); } public static void main(String a[]) { //main()方法 int n=8; System.out.println(n+"!="+Factorial(n)); } } 为保证程序正确运行,在下画线处应该填入的参数是

    A.n-1

    B.n-2

    C.n

    D.n+1


    正确答案:A

  • 第8题:

    阅读下列函数说明和C代码,将应填入 处的字句写在答题纸的对应栏内。

    [函数1.1说明]

    函数int factors(int n)的功能是判断整数n(n>=2)是否为完全数。如果n是完全数,则函数返回0,否则返回-1。

    所谓“完全数”是指整数n的所有因子(不包括n)之和等于n自身。例如28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28是“完全数”。

    [函数1.1]

    int factors(int n)

    {

    int i,s;

    for(i=1,s=0;i<=n/2;i++)

    if(n%i==0) (1) ;

    if( (2) )return 0;

    return -1;

    }

    [函数1.2说明]

    函数int maxint(int a[], int k)的功能是用递归方法求指定数组中前k个元素的最大值,并作为函数值返回。

    [函数1.2]

    int maxint(int a[],int k)

    {

    int t;

    if( (3) ) return (4) ;

    t=maxint(a+1, (5) );

    return (a[0]>t)?a[0]:t;


    正确答案:
                      

  • 第9题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    【程序2.1说明】

    求所有满足如下条件的三位数:它除以11得的商等于它各位数字的平方和。例如 550,除以11商为50,50=52+52+02。

    【程序2.1】

    void main()

    {

    int i, j,n,s;

    for(i=100;i<=999;i++)

    {

    n=i;

    j=n/11;

    s=0;

    while((1))

    {

    (2)

    n/=10;

    }

    if((3))

    printf("%d\t",i);

    }

    }

    【程序2.2说明】

    本程序输入一字符串,将其中的大写字母改变成小写字母。

    【程序2.2】

    void main()

    {

    int i=0;

    char s[120];

    scanf("%s",s);

    while((4))

    {

    if((5))

    s[i]=s[i]- 'A'+'a';

    i++;

    }

    printf("%s\n",s);

    }


    正确答案:(1)n (2)s=s+(n%10)*(n%10); (3)j==s (4)s[i] (5)s[i]>='A'&&s[i]='Z'
    (1)n (2)s=s+(n%10)*(n%10); (3)j==s (4)s[i] (5)s[i]>='A'&&s[i]='Z' 解析:本题考查C语言中一些运算的实现。
    在程序2.1中要求求出满足如下条件的所有三位数:它除以11得的商等于它各位数字的平方和。要想求出所有结果,我们应该对每个三位数进行计算来判断它是否符合题目中的要求,只有在除以11的商等于各位数字的平方和时,才是我们要求的数。
    有了上述分析后,我们再来看程序2.1的代码,代码中首先声明了几个临时变量 i,j,n,s。接下来是一个循环,其目的是对从100到999的所有三位数来进行运算。再接下来的代码是将当前的这个三位数存放在变量n中,将除以11得到的商存放在i中。
    第(1)空所在的位置是循环的判断条件,根据我们上面的分析和整个程序代码来看,这个循环应该是用来计算三位数中各位数字的平方和用的,再看循环中语句n/=10,其作用是将n的值除以10,因为n是整型变量,保存数据时是直接去除小数点后面的数而只保留前面的整数部分,这个操作其本质是对数字降位,去除最低位(个位)。在对其进行此操作前应该对数字中的最低位进行求平方计算,这也应该是第(2)空的任务,要求个位数的方法是n%10,因此,第(2)空答案应该是“s=s+(n%10)*(n%10)”。第(1)空用来判断数n在变化后是否还有值,答案为n。
    第(3)空所在的位置是条件选择语句的条件,如果此条件成立,就输出变量i的值, i中存放的是当前参与计算的三位数,只有满足除以11得的商等于它各位数字的平方和的三位数才能被输出,那么条件选择语句中的条件应该是判断除以11得的商是否等于它各位数字的平方和。因此,第(3)空的答案为i==s。
    在程序2.2中要求将输入的一字符串中的大写字母改变成小写字母,那么我们首先要了解C语言中大小写字母的转换规则。在C语言中字母的运算其实是字母对应的 ASCII码码值的运算,其中小写字母a对应的ASCII码值为97,a后面的小写字母的ASCII码值依次增加1,而大写字母A的ASCII码值为65,A后面的大写ASCII码值也依次增加。这样,我们就知道了小写字母比对应的大写字母的ASCII码值大32,在将小写字母转化为大写字母时,我们只要相应地将小写字母的ASCII码值减去32或加上32的相反数即可。
    下面,我们来看程序2.2的代码,在代码中,声明了一个长度为120的字符型数组 S存放输入的字符串,下面有一个循环语句,第(4)空是循环语句的循环条件,结合整个程序,我们可以知道,循环语句要实现字符串中大写字母改变成小写字母的功能,所以循环的条件应该是判断在操作时是否取到了字符,而字符是存放在数组中的,因此,此空答案应该是“s[i]”。第(5)空是一个条件选择语句的条件,如果条件成立就执行将大写字母改变成小写字母操作,因此,是判断取到的字符是否为大写字母,所以此空答案为s[i]>='A'&&s[i]='Z'。

  • 第10题:

    阅读下列程序说明和C程序,将应填入(n)处的字句写在对应栏内。

    [说明]

    本程序将自然数1,2,……,N2(N=5)按蛇形方式逐个顺序存入N阶矩阵。令n=N-1,则矩阵中的每一元素可用aij标记,其中i,j(0≤i,j≤n)分别为其所在行的行号和所在列的列号。蛇形方式顺序存放的方法是从an0开始、到a0n为止,依次填入由1递增的自然数,交替地对每一斜列从左上角向右下角或从右下角向左上角排列。程序的输出为:

    [程序]

    include <stdio.h>

    include <math.h>

    define SIZE.10

    int a[SIZE] [SIZE],k;

    void write(int n) /*输出矩阵*/

    { int i,j;

    for(i=0;i<=n;i+ +){

    for(j=0; j<=nj j+ +)

    printf("%4d",a[i][j]);

    printf("\n");

    }

    }

    void makeline(int row_start, int col_start, int row_end) /*完成矩阵一条斜线的整数填写*/

    { int i,j, sign;

    sign=((1)> =0)? 1:-1;

    for(i = row_start,j = col_start; (row_end-i) * sign>=0; i+=sign,j+=sign)

    a[i][j]=(2);

    }

    void makeArray(int n) /*完成矩阵每条斜线的整数填写*/

    { int d;

    for(d=1;d<=(3);d+ +)

    if(d< =n+1)

    if(d%2)

    makeline((4));

    else

    makeline(n+1-d,0,n);

    else

    if(d%2)

    makeline((5));

    else

    makeline(0,d-n-1,2*n-d+1);

    }

    void main()

    { int n, N=5;

    k=1; n=N-1;

    makeArray(n);

    write(n);

    }


    正确答案:(1) row_end-row_start (2) k++ (3) 2* n+1 (4) nd-1n+1-d (5) 2*n-d+1n0
    (1) row_end-row_start (2) k++ (3) 2* n+1 (4) n,d-1,n+1-d (5) 2*n-d+1,n,0 解析:本程序中二维数组a[][]用于存放矩阵元素,k表示当前应存放的元素(从1开始递增的某个自然数)。数据的填充按斜对角线进行,n+1阶矩阵的斜对角线有2*n+1条(包括两个单点an0、a0n。函数makeArray对斜对角线进行编号,从矩阵左下角开始依次为d=1,…,2*n,对于每条斜对角线,根据数据在其上的填充方式(左上角到右下角还是右下角到左上角)确定起点行号row_start、列号col_start以及终点行号 row_end,再调用函数makeline为这条线上填数。makeline函数根据row_end-row_start的正负判断数值填充方式。

  • 第11题:

    ●试题二

    阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    该程序运行后,输出下面的数字金字塔

    【程序】

    include<stdio.h>

    main ()

    {char max,next;

    int i;

    for(max=′1′;max<=′9′;max++)

    {for(i=1;i<=20- (1) ;++i)

    printf(" ");

    for(next= (2) ;next<= (3) ;next++)

    printf("%c",next);

    for(next= (4) ;next>= (5) ;next--)

    printf("%c",next);

    printf("\n");

    }

    }


    正确答案:
    ●试题二【答案】(1)(max-′0′)(2)′1′(3)max(4)max-1(5)′1′【解析】该程序共有9行输出,即循环控制变量max的值是从1~9。每行输出分3部分,先用循环for语句输出左边空白,(1)空填"(max-′0′)";再用循环输出从1到max-′0′的显示数字,即(2)空和(3)空分别填1和max;最后输出从max-′1′~1的显示数字,即(4)空和(5)空分别填和max-1和′1′。

  • 第12题:

    ()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]下面程序是一个带参数的主函数,其功能是显示在命令行中输入的文本文件内容。[C语言函数]#include"stdio.h"main(argc,argv) int argc; char *argv[]; { (1) ; if((fp=fopen(argv[1],”r’’))== (2) ) { printf(”file not open!\n”);exit(0);} while( (3) ) putchar( (4) ); (5); }


    正确答案:()
    (1)FILE *fp; (2)NULL  (3)!feof(fp)  (4)fgetc(fp)   (5)fclose(fp)
    从程序功能来看,程序中需要用到文件型指针变量中,而主函数体没有定义,所以(1)应该填写的是“FILE *fp;”。接下来的语句是标准的打开只读文本文件的语句,显示的是文件没打开,说明文件名不存在,也就是为“NULL”。接着的while循环语句中有两处空白。前一个空白是控制循环的条件,从程序功能来看,要将文本文件中的所有字符显示出来,这儿当然只能填写“不是文件尾则继续循环”,具体说,需要填写的是“!feof(fp)”。(4)出现在循环体中的语句中,该循环体的功能是从fp指向的文本文件中读取单个字符并显示在屏幕上,此处使用的是putchar函数,该函数的功能是将形参对应的字符显示在屏幕上,所以该处的空白就是要显示的字符,这个字符必须是从文本文件中读取的单个字符,完成这项工作的可以利用fgetc()函数,所以(4)填写的是“fgetc(fp)”。最后一句应当是关闭文件,所以(5)应填fclose(fp)。

  • 第13题:

    ●试题三

    阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    函数move(int*a,int n)用于整理数组a[]的前n个元素,使其中小于0的元素移到数组的前端,大于0的元素移到数组的后端,等于0的元素留在数表中间。

    令a[0]~a[low-1]小于0(初始为空);a[low]~a[i-1]等于0(初始为空);a[i]~a[high]还未考察,当前考察元素为a[i]。a[high+1]~a[n-1]大于0(初始为空)。

    【函数】

    move(int*a,int n)

    {

    int i,low,high,t;

    low=i=0;high=n-1;

    while( (1) )

    if(a[i]<0)

    {

    t=a[i];a[i]=a[low];a[low]=t;

    (2) ;i++;

    }

    else if( (3) )

    {t=a[i];a[i]=a[high];a[high]=t;

    (4) ;

    }

    else (5) ;

    }


    正确答案:

    ●试题三

    【答案】(1)i<=high(2)low++(3)ai>0(4)high--(5)i++

    【解析】程序的说明已经对程序的功能和相关变量解释得很清楚了,这儿就不再重复了。由变量i、变量low和变量high的含义和初值可以判断,ihigh之间的元素还未处理,因此while循环条件是"i<=high"或其等价形式,这就是(1)空所填写的内容。

    (2)空所在语句块是处理当ai<0的情况,显然这时需要将ai]与alow]进行交换,交换后需要将ilow都要向后移动,因此(2)空处应填写"low++"或其等价形式。

    (3)空需要填写执行(4)空所在语句块的条件,由(4)空所在语句块的可以判断,它是处理当ai>0的情况,因此(3)空处应填写"ai>0"或其等价形式。当ai>0时,需要将ai]与ahigh]进行交换,交换后需要将high都要向前移动,因此(4)空处应填写"high--"或其等价形式。注意这时i不能向后移动,因为交换后的ai]还没有处理,需要循环的下一趟进行处理。

    ai=0情况,当ai=0时,不需要进行元素交换,只需将i向后移动就可以了,因此(5)空处应填写"i++"或其等价形式。

     

  • 第14题:

    阅读以下说明和Java代码,将解答写入对应栏内。

    【说明】

    下面的程序中定义了两个方法求自然数1~100的和。具体如下:int suml(int n);利用循环求1~n的和,int sum2(int n);利用递归方法求和1~n的和;在main()方法中调用这两个方法求1~100的和并显示。在程序的每条横线处填写一个适当的语句,使程序的功能完整。

    public class Sum {

    public static void main (1)

    {

    //1. 调用sum1(int n),求1~100的和

    //标准输出

    (2) ("1~100的和:" +sum1(100));

    //2. 调用sum2(int n),求1~100的和

    //标准输出

    (2) ("1~100的和:"+sum2(100));

    }

    static iht sum1( int n)

    {

    int result=0;

    for(int i=1;i<=n;i++)

    (3)

    retrun result;

    }

    static int sum2(int n)

    {

    if (4)

    return 1

    else

    (5)

    }

    }


    正确答案:(1)String args[] (2)System. out (3)result=result+n;或等价形式 (4)n==1; (5)return n+sum2 (n-1);
    (1)String args[] (2)System. out (3)result=result+n;或等价形式 (4)n==1; (5)return n+sum2 (n-1); 解析:此处为Java主函数的参数,是固定写法。Java程序的标准输出是调用System包的out对象的函数。循环累加。这是递归调用的结束条件。对n-1进行递归调用,并返回n和n-1个整数和的和。

  • 第15题:

    阅读下列程序说明和C代码,把应填入其中n处的字句写在答卷的对应栏内。

    【说明】

    程序利用选择排序算法对数组a中的N个整数按照从小到大的顺序排列,并将排序结果显示出来。

    【程序】

    define N 10

    main()

    {

    void (1);

    int i,a[N];

    for(i=0;i<10,i++) /*输入*/

    scanf(“%d”,&a[i]);

    (2);

    for(i=0;i<N,i++) /*输出*/

    printf(“%3d”,a[i]);

    }

    void selectSon(int x[],int n)

    {

    int i,j,k,t;

    for(int i=0; (3);i++)

    {

    k=i;

    for(j=i+1;j<n;j++)

    if (4) k=j;

    if (5)

    {t=x[i];x[i]=x[k];x[k] =t;}

    }

    }


    正确答案:(1)selectSort()
    (1)selectSort() 解析:main函数中对selectSort函数的调用在定义之前,所以要进行说明。

  • 第16题:

    阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。

    【函数】

    void QuickSort( int A[ ],int s,int t)

    { int i=s,j=t+1,temp;

    int x=A[s];

    do{

    do i ++ ;while (1);

    do j -- ;while(A[j]>x);

    if(i<j){temp=A[i];(2);(3);}

    }while(i<j);

    A[a] =A[j];A[j] =x;

    if(s<i-1) (4);

    if(j+1<t) (5);

    }


    正确答案:(1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(Asj-1) (5)QuickSort(Aj+1t);
    (1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(A,s,j-1) (5)QuickSort(A,j+1,t); 解析:快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。

  • 第17题:

    阅读下列程序和控制流图,将应填入(n)的字句。

    【程序】

    下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。

    int GetMax(int n,int datalist[]){

    int k=0;

    for(int j=1;j<n;j++)

    if(datalist[j]>datalist[k])

    k=j;

    return k;

    }

    该程序的控制流图中A~E分别是什么?


    正确答案:(1)jn(2)return k;(3)datalist[j]>datalist[k](4)k=j;(5)j++;
    (1)jn(2)return k;(3)datalist[j]>datalist[k](4)k=j;(5)j++;

  • 第18题:

    阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。

    [说明]

    下面程序实现十进制向其它进制的转换。

    [C++程序]

    include"ioStream.h"

    include"math.h"

    include

    typedef struct node {

    int data;

    node*next;

    }Node;

    Class Transform.

    {

    DUDlic:

    void Trans(int d,int i); //d为数字;i为进制

    void print();

    private:

    Node*top;

    };

    void Transform.:Trans(int d,int i)

    {

    int m,n=0;

    Node*P;

    while(d>0)

    {

    (1);

    d=d/i;

    p=new Node;

    if(!n){

    p->data=m;

    (2);

    (3);

    n++;

    }

    else{

    p->data=m;

    (4);

    (5);

    }

    }

    }

    void Transform.:print()

    {

    Node*P;

    while(top!=NULL)

    {

    p=top;

    if(p->data>9)

    cout<<data+55;

    else

    cout<<data;

    top=p->next;

    delete p;

    }

    }


    正确答案:(1) m=d%i (2) top=p (3) top->next=NULL (4) p->next=top (5) top=p
    (1) m=d%i (2) top=p (3) top->next=NULL (4) p->next=top (5) top=p 解析:本题考查C++编程,主要考查了链表的使用。
    所有的问题只出在函数Trans中,它的功能是完成将十进制数d转换为任意进制i的数,并存在数组中。函数中首先定义了一个指向链表结点的指针,然后开始进行转换,进制转换应该是一个很常见的问题,就是不断的求模运算,所以(1)处应填入“m=d%i”。然后,我们要把求模的结果保存到链表结点中,并使链表首指针指向该结点,结点中指向下一个结点”的指针设为空,所以(2)处应填入“top=p”,(3)处应填入“top->next=NULL”。由于求模运算是从低位到高位逐位求出的,所以在我们在进行完第二次求模运算后,应该将第二次运算的结果放到链表首位,所以(4)处应填入“P->next=top”,(5)处应填入“top=p”。

  • 第19题:

    阅读以下说明和Java程序,将应填入(n)处的字句写在对应栏内。

    [说明]

    下面程序实现十进制向其它进制的转换。

    [Java程序]

    ClasS Node{

    int data;

    Node next;

    }

    class Transform{

    private Node top;

    public void print(){

    Node p;

    while(top!=null){

    P=top;

    if(P.data>9)

    System.out.print((char)(P.data+55));

    else

    System.out.print(p.data);

    top=p.next;

    }

    }

    public void Trans(int d,int i){//d为数字;i为进制

    int m;

    (1) n=false;

    Node p;

    while(d>0){

    (2);

    d=d/i;

    p=new Node();

    if( (3) ){

    p.data=m;

    (4);

    top=P;

    n=true;

    }

    else{

    p.data=m;

    (5);

    top=P;

    }

    }

    }

    }


    正确答案:(1) boolean (2) m=d%i (3) !n (4) top->next=null (5) p->next=top
    (1) boolean (2) m=d%i (3) !n (4) top->next=null (5) p->next=top 解析:本题考查Java编程,主要考查了链表的使用。
    所有的问题只出在函数Trans中,它的功能是完成将十进制数d转换为任意进制i的数,并存在数组中。变量n被赋值为false,说明n是布尔型变量,Java中布尔型变量关键字为boolean。故(1)应填“boolean”。函数中首先定义了一个指向链表结点的指针(实为链栈),然后开始进行转换,进制转换应该是一个很常见的问题,就是不断地求模运算,所以(2)处应填入“m=d%i”。然后,我们要把求模的结果保存到链栈中。对于链栈,第一个结点比较特殊,需要特殊处理,从if块中的语句“n=true”可知,此处正是处理第一个结点的特殊情况,故(3)应填“!n”,(4)处应填入“top->next=null”。这里采用的链栈,所以(5)处应填入“p->next=top”。

  • 第20题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

    【函数2.1说明】

    递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。

    【函数2.1】

    int sum (int a[],int n)

    {

    if(n>0) return (1);

    else (2);

    }

    【函数2.2说明】

    有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。

    【函数2.2】

    int compare (int a, int b, int c )

    { int temp, max;

    (3) a:b;

    (4) temp:c;

    }

    【函数2.3说明】

    递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。

    【函数2.3】

    int dec( int a[], int n )

    {

    if(n<=1) return 1;

    if(a[0]<a[1]) return 0;

    return (5);

    }


    正确答案:(1)a[n-1]+sum(an-1)或者a[0]+sum(a+1n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1n-1);
    (1)a[n-1]+sum(a,n-1)或者a[0]+sum(a+1,n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1,n-1); 解析:本题考查C语言函数和一些基本运算。
    下面我们分别来分析这几个函数。在函数2.1中,题目要求用此递归函数求数组前 n个元素之和。递归函数的特点是在函数体中不停地调用函数本身,只是将其函数的参数范围改变。题目中要求我们求数组前n个元素之和,我们可以这样理解,即前n个元素之和等于第n个元素加上前n-1个元素之和,现在的问题转化成如何求前n-1个元素之和。同样的道理,可以将求前n-1个元素之和转化成求前n-2个元素之和,直到这个数小于0。从函数2.1的代码中可以知道,在计算以前,首先判断n与0的关系,如果n小于0,说明数组中无元素,因此,返回0值;如果n大于等于0,说明数组中有元素,应该返回的结果是第n个元素加上前n-1个元素之和,而前n-1个元素之和是调用函数本身来计算的。因此,第(1)空和第(2)空的答案分别是a[n-1)+sum(a,n-1),return()。
    在函数2.2中,题目要求我们在三个数中取最大数,在数学中,我们从三个数中取最大数时,一般是首先拿其中两个数比较,取较大的数再与第三个数比较,再取其较大的数,这个数就是三个数中的最大数。从函数2.2的代码中知道,三个数a、b、c,两个整型变量temp与max。根据求三个数中最大数的数学过程和函数中已给出的代码可知,第(3)空处语句应该为temp=(a>b)?a:b,求得a、b中较大数并存放在变量temp中。第(4)空处语句为max=(temp>c)?temp:c。
    在函数2.3中,题目要求判断数组a[]的前n个元素是否是不递增的。不递增返回1,否则返回0。要判断前n个元素是否是不递增的,需要判断前n-1个元素是否是不递增的,以及第n个元素与第n-1个元素的关系。此处与函数2.1一样,用的都是递归函数,只是出口不同,在函数2.1中,只要数组中没有元素了,递归结束,这里只要第n个元素大于第n-1个元素,则返回0,递归结束。又由if(a[0]a[1])语句可知,在每次调用函数时,都将其数组中的第一个元素与第二个元素比较来作为递归的出口,如果结果为假,就说明数组的前面两项的关系是不递增的,在下次调用中不用再考虑第一项。因此第(5)空应该是dec(a+1,n-1)。

  • 第21题:

    阅读下列程序说明和C++程序,把应填入其中(n)处的字句,写在对应栏内。

    【说明】

    阅读下面几段C++程序回答相应问题。

    比较下面两段程序的优缺点。

    ①for (i=0; i<N; i++ )

    {

    if (condition)

    //DoSomething

    else

    //DoOtherthing

    }

    ②if (condition) {

    for (i =0; i<N; i++ )

    //DoSomething

    }else {

    for (i=0; i <N; i++ )

    //DoOtherthing

    }


    正确答案:程序1优点:程序简洁;缺点:多执行了N-1次逻辑判断并且程序无法循环“流水”作业使得编译器无法对循环进行优化处理降低了效率。 程序2优点:循环的效率高;缺点:程序不简洁。
    程序1优点:程序简洁;缺点:多执行了N-1次逻辑判断,并且程序无法循环“流水”作业,使得编译器无法对循环进行优化处理,降低了效率。 程序2优点:循环的效率高;缺点:程序不简洁。

  • 第22题:

    阅读下列程序说明和C程序,将应填入(n)处的字句写在对应栏内。

    [函数2.1说明]

    下面程序的功能是计算x和y的最小公倍数。

    [函数2.1]

    main()

    { int m,n,d,r;

    seanf("%d %d",&m,&n);

    if(m<n) {r=m;m=n;n=r;}

    (1);

    while (d%n! =0) (2);

    printf("%d\n",d);

    }

    [函数2.2说明]

    下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。

    [函数2.2]

    include <stdio.h>

    main()

    { char c,preChar='\0';

    c = getchar();

    while(c! = '.'){

    if((3)) putchar(c);

    else if(preChar! =' ') putchar(c);

    (4);

    c=(5);

    }

    }


    正确答案:(1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar()
    (1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar() 解析:(1)下文使用了变量d,因此需在此初始化,由下面循环的条件“d%n!=0”知初值不能是n,因此必为m;
    (2)此处while循环生成最小公倍数d,其终止条件是n整除d,因此循环过程中需要保证m整除d并且d尽可能地小,于是d应以m为增量递增;
    (3)当输入的字符非空格时,原样输出;
    (4)程序中变量preChar用于记录上一次读入的字符,循环过程中应不断更新其值;
    (5)接收下一个输入。

  • 第23题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案: