●试题二阅读下列函数说明和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

题目

●试题二

阅读下列函数说明和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");

}

}


相似考题
更多“ ●试题二阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】该程序运行后,输出下面的数字金字塔【程序】includestdio.hmain (){char max,next;int i;”相关问题
  • 第1题:

    ●试题一

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

    【函数1.1说明】

    函数strcpy(char*to,char*from)将字符串from复制到字符串to。

    【函数1.1】

    void strcpy(char*to,char*from)

    {while( ( 1 ) );}

    【函数1.2说明】

    函数merge(int a[ ],int n,int b[ ],int m,int *c)是将两个从小到大有序数组a和b复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数。

    【函数1.2】

    void merge(int a[ ],int n,int b[ ],int m,int *c)

    { int i,j;

    for(i=j=0;i<n && j<m;)

    *c++=a[i]<b[j]? a[i++]:b[j++];

    while( (2) )*c++=a[i++];

    while( (3) )*c++=b[j++];

    }

    【函数1.3说明】

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

    【函数1.3】

    int sum(int a[ ],int n)

    { if(n>0)return (4) ;

    else (5) ;

    }


    正确答案:

    ●试题一

    【答案】(1)*to++=*from++ 或 (*to++=*from++)!=′\0

    (2)i<n i!=n(3)j<m 或 j!=m

    (4)an-1+sum(an-1);或 a0+sum(a+1n-1)(5)return 0

    【解析】(1)完成字符的复制,并使指针指向下一元素。(2)当出现某一数组所有元素均已合并完成,则将另一数组其他元素直接进行复制。b串已复制完。(3)判断a串是否已复制完。(4)递归函数sun()完成数组n个元素的累加,当n>0时,使用规模为n-1的函数进行递归。(5)n<=0时,返回0即可。

     

  • 第2题:

    ●试题三

    阅读下列函数说明和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++"或其等价形式。

     

  • 第3题:

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

    [说明]

    函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。

    [函数2.1]

    void PrintPrime(int UpBound)

    printf("2," );

    for(i=3; i<UpBound; i+ =2) {

    int k = sqrt(i);

    for(j=3; j<= k;(1)) /*检查i是否有3到k以入的奇因数*/

    if((2)) break;

    fi((3)) printf("%d", i);

    [函数2.2说明]

    递归函数invert(int a[],int k),int k)的功能是将数组a中的前k个元素逆置。

    [函数2.2]

    void invert(int a[ ], int k)

    { int t;

    if ((4)) {

    invert((5));

    t=a[0];

    a[0] =a[k-1];

    a[k-l]=t;

    }

    }


    正确答案:(1)j+=2 (2)i%j==0 (3)j>k (4)k>1 (5)a+1k-2
    (1)j+=2 (2)i%j==0 (3)j>k (4)k>1 (5)a+1,k-2 解析:(1)~(3)由于(1)处循环只检查i是否能被3到k以内的奇数所整除,因此循环增量应该是2。并且一旦i被某个3到k以内的奇数整除,那么内层for应当立即终止,此时j<=k。相反的,若内层for循环结束后j>k,则表明i没有3到k以内的奇因数,即i是一素数,应该输出;
    (4)由于函数递归的终止条件是k不大于1,于是仅在 k>1时需要继续进行递归;
    (5)为了将数组a的前k个元素a[0]、……、a[k-1]置逆,只需先将a[1]、……、a[k-2]这k-2个元素置逆,即调用invert(a+1,k-2),再交换a[0]和a[k-1]的值即可。

  • 第4题:

    阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。【C++程序】include < stdio. h >include

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

    【C++程序】

    include < stdio. h >

    include < string. h >

    define Max 1000

    class Bank

    {

    int index;

    char date [Max] [10]; // 记录交易日

    iht amount[Max]; // 记录每次交易金额,以符号区分存钱和取钱

    int rest[ Max]; // 记录每次交易后余额

    static iht sum; // 账户累计余额

    public:

    Bank( ) {index =0;}

    void deposit( char d[ ] , int m) //存入交易

    {

    strcpy ( date [ index ], d);

    amount[ index] = m;

    (1);

    rest[ index] = sum;

    index++;

    }

    void withdraw (char d[ ], int m) //取出交易

    {

    strcpy( date[ index] ,d);

    (2);

    (3);

    rest[ index] = sum;

    index++;

    }

    void display( );

    };

    int Bank:: sum = 0;

    void Bank:: display ( ) //输出流水

    {

    int i;

    printf("日期 存入 取出 余额\n");

    for (4)

    {

    printf(" %8s" ,date[i] );

    if (5)

    printf(" %6d" , -amount[i] );

    else

    printf( "%6d ",amount[i] );

    printf( "% 6d\n" ,rest[i] );

    } }

    void main( )

    {

    Bank object;

    object. deposit ( "2006.2.5", 1 00 );

    object. deposit( "2006.3.2" , 200);

    object. withdraw( "2006.4.1", 50);

    object. withdraw( "2006.4.5", 80);

    object. display ( );

    }

    本程序的执行结果如下:

    日期 存入 取出 余额 2006.2.5 100 100

    2006.3.2 200 300

    2006.4.1 50 250

    2006.4.5 80 170


    正确答案:(1)sum=sum+ m
    (1)sum=sum+ m 解析:存钱时,账户余额属加。

  • 第5题:

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

    【说明】

    设计一个类模板SamPle用于对一个有序数组采用二分法查找元素下标。

    【C++程序】

    include < iostream. h >

    define Max 100 //最多元素个数

    template < class T >

    class Sample

    {

    T A[Max]: //存放有序数序

    int n: //实际元素个数

    public

    Sample( ) { } //默认构造函数

    Sample(T a[] ,int i); //初始化构造函数

    int seek(T c);

    void disp( )

    {

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

    cout<<A[i] <<" ";

    cout<<endl:

    } } template < class T >

    Sample <T>: :Sample(T a[ ],int i)

    {

    n=i:

    for( intj =0;j < i;j ++ )

    (1);

    }

    template < class T >

    int Sample < T >:: seek( T c)

    {

    int low =0,high = n-1 ,mid;

    while((2))

    {

    mid = (low + high)/2;

    if((3))

    return mid;

    else if( (4) )

    low=mid+|;

    else

    (5);

    }

    return-1;

    }

    void main( )

    {

    char a[ ] ="acegkmpwxz";

    Sample < char > s(a, 1);

    cout<<"元素序列:" ;s. disp( );

    cout<<"元素'g'的下标:"<<s. seek('g') <<endl;

    }


    正确答案:(1)A[j]=a[j] (2)low=high (3)A[mid]==c (4)A[mid]c (5)high=mid-1
    (1)A[j]=a[j] (2)low=high (3)A[mid]==c (4)A[mid]c (5)high=mid-1 解析:在主函数中,首先由类模板实例化成Samplechar>模板类。(1)空所在处为构造函数的声明,将参数中的值赋值到类的成员变量中,所以(1)空应填入“A[j]=a[j]”。
    成员函数seek()采用二分法查找元素下标,变量low和high分别表示查找区间的下标,如果查询到目标,则返回相应的下标,若没有查询到,则其结束的条件即(2)空的内容为“low=high”。根据二分法的原理,当中间的元素恰好等于目标元素时,则返回其下标,所以(3)空应填入“A[mid] ==c”;若中间的元素小于目标元素时,则mid+1作为新的查找区间的起始下标,所以(4)空应填入“A[mid]c”;否则mid-1作为新的查找区间的结束下标,所以(5)空应填入“high=mid-1”。

  • 第6题:

    阅读以下说明,以及用C++在开发过程中所编写的程序代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    在下面函数横线处填上适当的字句,使其输出结果为:

    构造函数.

    构造函数.

    1,2

    5,6

    析构函数

    析构函数.

    【C++代码】

    include "iostream.h"

    class AA

    { public;

    AA(int i,int j)

    {A=i; B=j;

    cout<<"构造函数.\n";

    }

    ~AA(){(1);}

    void print();

    private:

    int A, B;

    };

    void AA∷print()

    {cout<<A<<","<<B<<endl;}

    void main()

    {

    AA *a1, *a2;

    (2)=new AA(1, 2);

    a2=new AA(5, 6);

    (3);

    a2->print();

    (4) a1;

    (5) a2;

    }


    正确答案:(1)cout"析构函数.\n" (2)a1 (3)a1—>print() (4)delete (5)delete
    (1)cout"析构函数.\n" (2)a1 (3)a1—>print() (4)delete (5)delete 解析:本题考查用C++语言对输出的实现。
    题目中没有什么条件,只给出了输出结构,要求程序能实现这个输出。下面来具体分析代码。
    第(1)空很明显是类AA的析构函数的函数体,类的析构函数一般在撤销一个对象时调用,根据题目的要求,要输出析构函数这样的结果,而在程序中没有与此相关的操作,那么此空应该是用来实现这个功能的,借鉴构造函数中的内容,我们很容易就得出此空答案为cout"析构函数.\n"。
    第(2)空在主函数中,很明显此空所在的语句是创建一个AA类的对象,并让一个AA型的指针变量指向这个对象。在函数开始的时候声明了两个AA型的指针变量a1和a2,而a2在下面已经有了值,那么这里只有用变量a1,因此此空答案为a1。
    第(3)空是在创建了两个对象后执行的语句,根据程序不难推断出,这里应该要实现对象a1的数据输出,那么就要调用函数print(),因此此空答案为a1->print()。
    第(4)空所在的语句是在实现了构造函数与数据输出后执行的语句,从题目要求来分析,这里应该要调用对象的析构函数来输出“析构函数”这样一个结果,上面我们已经分析到了对象的析构函数一般在撤销对象时调用。从对象的执行过程来分析,在对象的所有处理完成后也应该撤销对象来释放所占的资源,那么此空的任务应该是用来撤销a1对象,在C++中一般用关键字delete,因此此空答案为delete。
    第(5)空和第(4)空的情况一样,因此此空答案为delete。

  • 第7题:

    阅读以下函数说明和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)。

  • 第8题:

    阅读下列程序说明和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优点:循环的效率高;缺点:程序不简洁。

  • 第9题:

    阅读下列程序说明和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)接收下一个输入。

  • 第10题:

    试题三(共 15 分)

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


    正确答案:

  • 第11题:

    ()阅读下列说明和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)。

  • 第12题:

    阅读下列说明和?C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    阅读下列说明和?Java代码,将应填入?(n)?处的字句写在答题纸的对应栏内。
    【说明】
    某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种
    类可能不同,但其制作过程相同。前台服务员?(Waiter)?调度厨师制作套餐。现采用生成器?(Builder)?模式实现制作过程,得到如图?6-1?所示的类图。






    答案:
    解析:

  • 第13题:

    ●试题二

    阅读下列程序或函数说明和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

     

  • 第14题:

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

    [说明]

    编写一个字符界面的Java Application 程序,接受用户输入的10个整数,并输出这10个整数的最大值和最小值。

    [Java 代码]

    import java. io.* ;

    public class abc

    {

    public static void main ((1))

    {int i, n=10, max=0, min=0, temp=0;

    try {

    BufferedReader br = new BufferedReader (

    new InputStreamReader ( System.in ) );

    max = min =Integer. parselnt ( br. readLine ( ) );

    }. (2) ( IOExccption e ) {} ;

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

    try {

    BufferedReader br = new (3) (

    new InputStreamReader ( System. in ) );

    temp =(4) ( br. readLine ( ));

    if (temp>max ) max=temp;

    if (temp<min) (5)

    } catch (IOException e ) {};

    }

    System.out.println ( "max="+max+"\nmin="+min );

    }

    }


    正确答案:(1)String args [] (2) Catch (3) BufferedReadsr (4) Integer. parseInt (5) min=temp;
    (1)String args [] (2) Catch (3) BufferedReadsr (4) Integer. parseInt (5) min=temp;

  • 第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)处的字句写在对应栏内。

    [说明]

    下面的程序利用递归算法计算x和y的最大公约数。

    [函数2.1]

    main ( )

    { int x,y,k,t;

    scanf(" % d% d" , &x, &y);

    if(x>y) { t=x;x=y; y=t;}

    (1);

    while(k! =0){

    y=x;

    (2);

    k=y%x;

    }

    prinff( "% d" ,x); }

    [函数2.2说明]

    函数fun(char *str,char *substr的功能是计算子串sugbstr在串str中出现的次数。

    [函数2.2]

    fun(ehar * str, char * substr)

    { int x,y,z;

    (3);

    for(x=0;str[ x] ! = '\O';x + + )

    for(y=x,z=0;sabstr[z] = =str[y];(4),y+ +)

    if((5)= ='\0') {

    num + +;

    break;

    }

    return(num);

    }


    正确答案:(1)k=y%x (2)x=k (3)int num=0 (4)z++ (5)substr[z+1]
    (1)k=y%x (2)x=k (3)int num=0 (4)z++ (5)substr[z+1] 解析:(1)~(2)使用递归算法计算x和y的最大公约数时,不妨令yx,如果y除x余数得。则x即为所求;否则令y←x,x←余数,继续上述判断。
    (3)此处应声明变量num并初始化;
    (4)次循环的功能是从str的第y个位置起与substr做比较,循环过程中y和z应同时增1;
    (5)若上面的循环重复执行,直到到达substr结束,则表示substr在str中出现一次。

  • 第17题:

    阅读下列函数说明和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); 解析:快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。

  • 第18题:

    阅读以下说明和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”。

  • 第19题:

    阅读以下函数说明和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'。

  • 第20题:

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

    [函数2.1说明]

    函数void find(int *a, int n, int * max, int * min)的功能是在长度为n的整型数组a中,查找最大元素和最小元素的下标。main()中给出了调用find函数的一个实例。

    [函数2.1]

    include<stdio.h>

    void find(int *a, int n,int *max,int * min)

    { int i;

    *max =* min=0;

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

    if(a[i]>a[* max]) (1);

    else if(a[i]<a[*min]) (2);

    return;

    main()

    { int a[]={4,6,8,9,0,6},max,min;

    find(a,6,(3));

    printf("%5d%5d\n", max,min);

    }

    [函数2.2说明]

    以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串前端的公共部分。例如:输入的两个字符串分别是abcdefg和abceef,则输出为abc。

    [函数2.2]

    include <stdio.h>

    main()

    { char str1[100],str2[100],str[100],c;

    int i=0,s;

    printf("\nInput string 1:");gets(str1);

    printf("\nInput string 2:");gets(str2);

    while(((4))&&(str1[i]!='\0')&&(str2[i]!='\0')){

    (5);

    i++;

    }

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

    }


    正确答案:(1) * max=i (2) * min=i (3) &max&min (4) str1[i]= =sir2[i] (5) str[i]=str1[i]或str[i]=str2[i]
    (1) * max=i (2) * min=i (3) &max,&min (4) str1[i]= =sir2[i] (5) str[i]=str1[i]或str[i]=str2[i] 解析:(1)若下标i的数大于当前的最大值,则更新最大元的下标;
    (2)若下标i的数小于当前的最小值,则更新最小元的下标;
    (3)根据find函数对形参的要求,此处应传递max和 min的地址;
    (4)此循环用于获取str1和str2从前端起的公共部分,一旦两字符串在某位置上不等即刻退出循环;
    (5)所求的公共子串应保存于str,因此在循环过程中应不断取出公共部分的每一个字符。

  • 第21题:

    试题二 ( 共15 分)

    阅读以下问题说明、C 程序和函数,将解答填入答题纸的对应栏内。

    【 问题1 】

    分析下面的C 程序,指出错误代码(或运行异常代码)所在的行号。

    【C程序】

    【 问题2】

    函数inputArr(int a[], int n)的功能是输入一组整数(输入0或输入的整数个数达到n时结束)存入数组 a,并返回实际输入的整数个数。函数 inputArr 可以成功编译。但测试函数调用inputArr后,发现运行结果不正确。

    请指出错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行,使之符合上述设计意图。

    【C 函数】


    正确答案:
    试题二(15分)问题15,或arrChar=“test”3分7,或*p=’0’;3分以上解答不分次序问题2

  • 第22题:

    ()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]有一个一维数组cj,内放20个学生成绩,求平均成绩。函数ave用来求20个学生的平均成绩。[C语言函数]float ave(float a[20]){ int i;float aver,sum= (1) ;for(i=1;i<20;i++) sum= (2) ;aver= (3) ;return( (4) );}main(){ float cj[20],aver;int i;printf(“input 20 cj:\n”);for(i=0;i<20;i++) scanf(“%f”,&cj[i]);printf(“\n”);aver= (5) ;printf(“average cj is %6.2f”,aver);}


    正确答案:()
    (1)a[0]   (2)sum+a[i]  (3)sum/20   (4)aver  (5)ave(cj)
    sum是用来存放学生的总成绩的,所以又由于在下面的for循环里i是从1开始的,所以(1)应填a[0],(2)应填sum+a[i],aver是用来求平均成绩的,所以(3)应填sum/20,(4)应填返回的结果,因此应将平均值aver返回。所以(4)应填aver,(5)应该是调用函数ave求平均值,所以应填ave(cj)。
     

  • 第23题:

    阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。
    阅读以下说明和C函数,将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内。
    【说明1】
    函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。
    【C函数】

    char *t = (char *)malloc( (1) ); /*申请串空间*/ int i, k = 0; if (!t) return; for(i = 0; i < strlen(s); i++)if ( !(*(s+i)>=’0’ && *(s+i)<=’9’) ) { t[k++] = (2) ;} (3) = ’\0’; /*设置串结束标志*/ strcpy(s,t);free(t);}

    【说明2】
    函数reverse(char *s, int len)的功能是用递归方式逆置长度为len的字符串s。例如,若串s的内容为"abcd",则逆置后其内容变为"dcba"。
    【C函数】

    void reverse(char *s, int len){ char ch; if ( (4) ) { ch = *s; *s = *(s+len-1); *(s+len-1) = ch; reverse( (5) ); }}


    答案:
    解析:
    (1)strlen(s)+1
    (2)*(s+i),或s[i]或其等价表示
    (3)*(t+k)或t[k] 或其等价表示
    (4)len>1 或len>=1 或其等价表示
    (5)s+1 len-2
    【解析】

    根据说明1,在函数deldigit(char*s)中需先申请一个与s等长的临时字符串空间并令t指向它,因此空(1)处应填入"strlen(s)+1",其中,加1的原因是函数strlen计算s所指向字符串的长度时,没有包含串结束标志字符"\0"。当然,申请比"strlen(s)+1"更大的存储区也可以,只是没有必要。
    由于需要将非数字字符按原来的顺序存入t所指向的存储区,所以空(2)处填入"s[i]",或其等价表示形式。
    最后在设置t所指向字符串的结束标志,即令t[k]='\0'.在这里,空(3)处的t[k]写为t[k++]也可以,而写为t[k+1]或t[++k]则不符合整个代码的处理逻辑。
    函数reverse(char*s,int len)的功能是用递归方式逆置长度为len的字符串s,其中以下代码实现了将s所指字符与串中最后一个字符交换的处理。
    Ch=*s; *s=*(s+len-1); *(s+len-1)=ch;