全国计算机二级第四套

12在源程序的开始处加上

        #include   <stdio.h>

进行文件引用的原因,以下叙述正确的是()。

A)  stdio.h文件中包含标准输入输出函数的函数说明,通过引用此文件以便能正确使用printf、scanf等函数

B) 将stdio.h中标准输入输出函数链接到编译生成的可执行文件中,以便能正确运行

C) 将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接

D) 将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接

答案:A

【解析】stdio.h文件中包含标准输入输出函数的函数说明,预处理指令#include<stdio.h>是使程序可以去该文件中找到printf,scanf等函数以便使用,因此答案为A选项。

13有以下程序

#include <stdio.h>

main()

{

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

}

程序运行后的输出结果是()。

A) 0

B) 变量无定义,输出不确定

C) -1

D) 1

答案:A

【解析】NULL是在stdio.h头文件中定义的预定义符,NULL的代码值为0,如果以整型格式输出则输出0。A选项正确。

14有如下程序

#include <stdio.h>

#include <string.h>

main()

{

    printf("%d\n", strlen("0\n011\1"));

}

程序运行后的输出结果是

A) 6

B) 8

C) 9

D) 4

答案:A

【解析】由一对双引号括起来的一串字符为字符串。字符常量是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以“\开头的转义字符。“\后可以为某些单个字符也可以为八进制或十六进制数字。strlen函数统计字符串长度,遇到“\0统计结束。‘0’‘\n’‘0’‘1’‘1’‘\1共6个字符,A选项正确。

15以下非法的定义语句是()。

A) long b=0L;

B) unsigned int a= -100u;

C) short c2=0123;

D) int d=0x0;

答案:B

【解析】unsigned定义的是"无符号数",则B选项定义错误,答案为B选项。

16)不能正确表示数学式的表达式是

A) a/c*b

B) a*b/c

C) a/ b* c

D) a*(b/c)

答案:C

【解析】/号和*号的优先级处于平级,结合性都是自左至右。所以选择C,C式子表示的是

17有以下程序

    #include <stdio.h>

    main()

    {

        int a=2, c=5;     

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

    }

 

程序的输出结果是()。

A) a=2,b=5

B) a=%2,b=%5

C) a=%d,b=%d

D) a=%%d,b=%%d

答案:C

【解析】C语言中用"%%"打印输出字符"%",所以%%d,输出为%d两个普通字符,而不是格式控制符"%d"的含义,所以打印结果为C。

18)以下选项中错误的是()。

A) a&=b  与  a=a&b  等价

B) a^=b  与  a=a^b  等价 

C) a|=b  与  a=a|b  等价  

D) a!^=b  与  a=a!^b  等价 

答案:D

【解析】D选项中,a!=b表示a不等于b时,运算结果为1,或者为0;而a=a!b是一种语法错误,!是非运算,且是单目运算符,只要求有一个操作数,故两者不等价,答案为D选项。

19)有以下程序段:

  #include  <stdio.h>

  int   a,b,c;

  a=10; b=50;c=30;

  if (a>b) a=b,b=c; c=a;

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

程序的输出结果是(  )。

A) a=10 b=50 c=30

B) a=10 b=50 c=10

C) a=10 b=30 c=10

D) a=50 b=30 c=50

答案:B

【解析】本题中a>b的条件不满足,所以不执行逗号表达式a=b,b=c;的操作,而是执行c=a操作,即c的值为10。

(20) 有如下嵌套的if语句

    if(a<b)

        if(a<c) k=a;

        else  k=c;

    else

        if(b<c) k=b;

        else  k=c;

 

以下选项中与上述if语句等价的语句是

A) k=(a<b)?((b<c)?a:b):((b>c)?b:c);

B) k=(a<b)?((a<c)?a:c):((b<c)?b:c);

C) k=(a<b)?a:b;k=(b<c)?b:c;

D) k=(a<b)?a:b;k=(a<c)?a:c;

答案:B

【解析】题目中嵌套语句的含义是当a<b且a<c成立,则将a的值赋给k,如果a<b成立而a<c不成立将c的值赋给k。如果a<b不成立而b<c成立,将b的值赋给k,如果如果a<b不成立且b<c也不成立,将c的值赋给k。判断条件表达式只有B选项可以表示这个含义。

(21) 有以下程序段:

#include  <stdio.h>

int  i, n;

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

{  n = rand() % 5;

  switch (n)

  { case 1:

case 3:  printf("%d \n", n);  break;

case 2:

case 4:  printf("%d \n", n);  continue;

case 0:  exit(0);

  }

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

}

以下关于程序段执行情况的叙述,正确的是(  )。

A) for循环语句固定执行8次

B) 当产生的随机数n为4时结束循环操作

C) 当产生的随机数n为1和2时不做任何操作

D) 当产生的随机数n为0时结束程序运行

答案:D

【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不再进行判断,直到碰到break或函数结束为止。简单的说break是结束整个循环体,而continue是结束单次循环。B)选项中当产生的随机数n为4时要执行打印操作。C)选项中当产生的随机数为1和2时分别执行case3与case4后面语句的内容。由于存在break语句所以for循环不是固定执行8次,执行次数与产生的随机数n有关系。

(22) 有如下程序

#include <stdio.h>

main()

{

    int i, *ptr;

    int array[3] = {8,2,4};

    for (ptr=array, i=0; i<2; i++)

        printf("%d,", *ptr++);

    printf("\n");

}

程序运行后的输出结果是()。

A) 8,2,

B) 8,8,

C) 2,4,

D) 4,8,

答案:A

【解析】程序执行过程为:定义指针ptr与数组array,执行for循环,使指针指向数组,i=0,输出指针指向的元素array[0]=8,然后指针加1,指向数组下一个元素;i=1,输出array[1]=2,指针指向数组下一个元素;i=2退出for循环。程序依次输出8,2,A选项正确。

23)有以下程序

    #include <stdio.h>

    main()

    {

        int  i, j, x=0;

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

        {  

            x++;

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

            {  

                if(j%2)  continue;

                x++;

            }

            x++;

        }

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

    }

程序执行后的输出结果是

A) x=4

B) x=8

C) x=6

D) x=12

答案:B

【解析】coutinue的作用是跳出循环体中剩余的语句而进行下一次循环。第一次执行外循环i的值为0,执行x++,x的值变为1,第一次执行内层循环j的值为0,不满足if条件,执行x++,x的值变为2,第二次内循环j的值为1,if条件成立,跳出本次循环,第三次执行内循环j的值为2,不满足if条件,x的值变为3,第四次执行内循环j的值为3满足条件跳出本次内循环,x的值加1,即为4,第一次外循环结束。第二次执行外循环时,同理,i的值被加了,4次,变为8,所以选择B选项。

24)设有如下程序段

int  a[1] = {0};

int  b[] = {9};

char  c[3] = {"A", "B"};

char  d = "12";

以下叙述正确的是()。

A)  a, b的定义合法,c, d的定义不合法

B)  a,b,c,d的定义都是合法的

C)  a,b,c的定义是合法的,d的定义不合法

D) 只有a的定义是合法的

答案:A

【解析】int a[1]={0}表示定义一个数组a[1]初值为0,int  b[] = {9},表示定义一个数组b,其中只有一个值9,系统自动识别数组有1个元素。char  c[3] = {"A", "B"},数组元素为字符串,需要用二维数组来表示,C选项错误; char  d = "12";,字符串常量不能赋值给字符变量,D选项错误;因此答案为A选项。

25)设有定义

    double  a[10] ,*s=a;

以下能够代表数组元素a[3]的是()。

A) (*s)[3]

B) *(s+3)

C) *s[3]

D) *s+3

答案:B

【解析】指针的赋值首先基类型必须一致,s二维数组名,是二维数组的首地址,其基类型是一个具有10个元素的字符数组。p是一个字符指针变量,其基类型是一个字符,k是一个行指针,其基类型是具有3个元素的字符型数组。所以A、C、D中两项的基类型不一致。而B选项,s[0]是二维数组s的第一个元素,其代表第一行元素构成的数组的首地址,其相当于一维数组的数组名,其基类型是一个字符类型,和p基类型一致。因此B选项正确。

26)#include <stdio.h>

#define N 4

void fun(int a[][N])

{  

  int i;

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

     a[0][i] += a[N-1][N-1-i];

}

main( )

{  int x[N][N]={ {1, 2, 3, 4},

                 {5, 6, 7, 8},

                 {9,10,11,12},

                 {13,14,15,16}}, i;

   fun(x);

   for (i=0;i<N; i++) printf("%d,", x[i][i]);

   printf("\n");

}

 

程序运行后的输出结果是()。

A) 4,7,10,13,

B) 1,6,11,16,

C) 17,6,11,16,

D) 5,13,21,29,

答案:C

【解析】N=4,for(i=0,i<N,i++) printf(x[i][j]);此语句输出x[0][0], x[1][1],x[2][2],x[3][3],其中只有x[0][0]的值在fun函数中发生改变,在fun函数中,当i=0时,x[0][0]= x[0][0]+x[3][3]=17,程序运行后的输出结果是:17.6.11.16。因此答案为C选项。

27)有以下程序

#include <stdio.h>

main()

{  

    char  ch[ ] ="uvwxyz",*pc;

    pc=ch;

    printf("%c\n", *(pc+5));

}

程序运行后的输出结果是()。

A) z

B) 0

C) 元素ch[5]的地址

D) 字符y的地址

答案:A

【解析】语句pc=ch;使得指针变量指向字符数组ch的首地址,即指向字符'u'。则pc+5指向的是字符向后移动5位,指向字符'z'。所以输出的*pc+5的值即为'z'。因此A选项正确。

28)有以下程序

     #include <stdio.h>

     #include <string.h>

     void  fun (char  *w, int  m )

     {  char  s, *p1, *p2;

        p1=w;    p2=w+m-1;

        while ( p1<p2 )

           {

              s=*p1;  *p1=*p2;  *p2=s;

              p1++;  p2--;

           }

     }

     main()

     {  char  a[ ]="123456";

        fun ( a, strlen(a) );    puts(a);

     }

 

程序运行后的输出结果是()。

A) 123456

B) 116611

C) 161616

D) 654321

答案:D

【解析】主函数中调用fun(a,6)后,指针p1指向字符串中的"1"、p2指向字符串中的"6"。While循环中,只要p1<p2,则把p1、p2所指向的字符互换,同时p1前移,p2后移。最终字符串逆序存放。因此D选项正确。

29)若有以下程序

     #include <stdio.h>

     main()

     {  char  a[20], b[ ]="The sky is blue.";  int i;

        for (i=0; i<10; i++)  scanf("%c", &a[i]);

        a[i]='\0';

        gets(b);

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

     }

 

执行时若输入:

Fig flower is red. <回车>

则输出结果是()。

A) Fig flower is red.is blue.

B) Fig flower is red.

C) Fig floweris red.

D) Fig floweris

答案:B

【解析】本题考查字符数组的赋值以及字符串的处理函数,本题中输入字符串Fig flower is red时,首先是将前10个字符赋值给字符数组a,然后执行gets(b)后,将后续字符存放到b中,当输出时,首先输出字符数组a,然后输出字符串b,所以结果为B选项。

30)有以下程序

     #include <stdio.h>

     main()

     {  char  s[]="012xy\08s34f4w2";

        int  i, n=0;

        for ( i=0; s[i]!=0; i++ )

           if(s[i] >= '0' && s[i] <= '9')  n++;

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

     }

程序运行后的输出结果是()。

A) 7

B) 0

C) 3

D) 8

答案:C

【解析】题意统计字符s中阿拉伯数字的个数。char s[]='012xy\08s34f4w2';元素是字符型。'0'=48;而'\0'=0;因此可以计算出'\0'之前阿拉伯数字的个数,由字符串s可知,有3个阿拉伯数字。答案为C选项。

31)若有定义语句:

    char  *s1="OK", *s2="ok";

以下选项中,能够输出"OK"的语句是()。

A) if (strcmp(s1,s2)!=0)  puts(s2);

B) if (strcmp(s1,s2)!=0)  puts(s1);

C) if (strcmp(s1,s2)==1)  puts(s1);

D) if ( strcmp(s1,s2)==0)  puts(s1);

答案:B

【解析】strcmp(s1,s2)是字符串比较函数,比较规则是两个字符串自左向右逐个字符相比(按照ASCII码值大小),以第一个不相同的字符的大小作为比较结果。因为'OK'<'ok',所以strcmp(s1,s2)为负值,只有B选项正确。

 

32)以下关于return语句的叙述中正确的是()。

A) 一个自定义函数中必须有一条return语句

B) 一个自定义函数中可以根据不同情况设置多条return语句

C) 定义成void类型的函数中可以有带返回值的return语句

D) 没有return语句的自定义函数在执行结束时不能返回到调用处

答案:B

【解析】在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值,A选项描述错误。定义成void类型的函数,不允许从该函数取得返回值,也不允许使用return语句,C选项描述错误。没有return语句的函数在执行到函数的最后一条语句后会自动返回到调用处,D选项描述错误。因此B选项正确。

33)若有以下程序

     #include <stdio.h>

     int  *f(int  *s, int  *t)

     {  int  k;

        if (*s < *t)  { k = *s;  *s=*t;  *t=k; }

        return s;

     }

     main()

     {  int  i=3, j=5, *p=&i, *q=&j, *r;  

        r=f(p,q);

        printf("%d,%d,%d,%d,%d\n", i, j, *p, *q, *r);

     }

 

则程序的输出结果是()。

A) 5,3,3,5,5

B) 3,5,5,3,5

C) 3,5,3,5,5

D) 5,3,5,3,5

答案:D

【解析】在主函数中分别给整型变量i、j和指针型变量p、q赋初值,并声明指针变量r;调用f函数,并将实参变量p和q的值传递给形参变量s和t,并且f函数是指针型函数,即函数的返回值将是一个地址。在f函数中,如果条件成立,则将指针变量s和t的值互换,并且将指针s的地址返回主函数。最后输出i, j, *p, *q, *r的值,即5,3,5,3,5。因此D选项正确。

34)有以下程序

#include  <stdio.h>

int  m=12;

int  fun( int  x,int  y )

{  static int  m=3;

   m= x * y - m ;

   return (m);

}

main()

{   int   a=7, b=5;

    m=fun( a, b )/m;

    printf("%d\n", fun( a, b )/m );

}

程序运行后的输出结果是()。

A) 2

B) 1

C) 3

D) 0

答案:B

局部变量覆盖全局变量,但是全局变量的声明周期还存在。f()函数调用完成后,由于m全局变量,被修改为32,即函数的返回值32,此时m=32/12,第二次调用f(a,b),函数的返回值为3,此时m=2,故输出为1。所以答案为B选项

35)若有以下程序

     #include <stdio.h>

     int  f(int  a[], int  n)

     {  if (n > 1)

        {  int  t;

           t=f(a, n-1);

           return  t > a[n-1]  ?  t : a[n-1];

        }

        else

           return a[0];

     }

     main()

     {  int  a[] = {8,2,9,1,3,6,4,7,5};

        printf("%d\n", f(a, 9));

     }

 

则程序的输出结果是()。

A) 9

B) 1

C) 8

D) 5

答案:A

【解析】本题主要考查了函数的递归调用,解题思路只需要将参数带入函数中,首先是执行f(a, 9),递归执行(a, 8)直到(a, 2),得到a[0]=8,然后判断a[0]是否大于a[1],本题实际上就是求出数组a元素的最大值。答案为9,选项A正确。

36)以下叙述正确的是()。

A) 表达式 sizeof(FILE*) == sizeof(int*) 的值为真

B) 文件指针的值是一个整数,它的值一定小于文件字节数

C) 文件指针的值是所指文件的当前读取位置

D) 使用fscanf函数可以向任意类型的文件中写入任意数量的字符

答案:A

【解析】sizeof(FILE*)=4,因为file* 为指针,指针的大小4 ,sizeof(int*)=4,理由同前面。文件指针的值是地址,是一个16进制的数,它的值不一定小于文件字节数,因此选项B错误。文件指针是所指文件的当前读取位置,而不是文件指针的值因此选项C错误。intfscanf(FILE*stream,constchar*format,[argument...]);

fscanf函数可以向任意类型的文件,写入任意数量不能超过系统的缓冲区,写文件先写入缓冲区,最后一起写入文件,因此选项D错误。答案为A选项

37)以下叙述中正确的是()。

A) int* p1; int ** p2; int *p3;都是合法的定义指针变量的语句

B) 指针变量只能通过求地址运算符(&) 来获得地址值

C) 语句p=NULL;与p=\0;是等价的语句

D) 语句p=NULL;执行后,指针p指向地址为0的存储单元

答案:A

【解析】B选项描述不正确,指针变量可以通过求地址运算符(&) 来获得地址值,可以通过指针变量获得地址值,还可以通过标准函数获得地址值;C选项中,p=NULL;和p=0;或p='\0';等价;D选项中,语句p=NULL;执行后,指针p并不是指向地址为0的存储单元,而是具有一个确定的值-"空"。因此A选项正确。

38)有以下程序

    #include <stdio.h>

    #include <stdlib.h>

    void fun(int *p1, int *s)

    {  int *t;

       t=(int *)malloc(2 * sizeof(int));

       *t=*p1 + *p1++;

       *(t+1)=*p1+ *p1;

       s=t;

    }

    main()

    {

       int a[2]={1,2},b[2]={0};

       fun(a,b);

       printf("%d,%d\n",b[0],b[1]);

    }

程序运行后的输出结果是

A) 2,6

B) 0,0

C) 2,4

D) 1,2

答案:B

【解析】malloc函数的原型为:malloc(size);,函数的作用是在内存的动态存储区分配一个长度为size的连续空间。程序执行过程为:定义数组a={1,2},b={0,0},b,调用函数fun,将数组地址传入函数,指针p1指向a,s指向b,定义指针t并使其指向开辟的两个整型内存,为第一个内存赋值为数组a第一个元素的2倍,即2,然后指针p1指向a数组第二个元素,为第二个内存赋值为数组a第二个元素的2倍,即4,最后使指针s指向动态开辟的两个内存的首地址。整个过程中数组b没有发生变化,依次输出b中元素为0,0,B选项正确。

39)有以下程序

    #include <stdio.h>

    #define FNA(x)  x*x

    #define FNB(x)  x+x

    main()

    {   int a=2,b=4;

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

    }

程序运行后的输出结果是()。

A) 8,16

B) 16,32

C) 8,32

D) 16,16

答案:C

【解析】带参数的宏定义不是进行简单的字符串替换,而是要进行参数替换。替换过程是:用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变。FNA(FNB(a))的替换过程为:FNA(2+2)替换为2+2*2+2,计算结果为8。FNB(FNA(b))的替换过程为:FNB(4*4)替换为4*4+4*4=32。程序运行后的输出结果是8,32,C选项正确。

40)若有以下程序

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct stu {  

    char  *name, gender;

    int  score;

} STU;

void f(char  *p)

{  

    p=(char *)malloc(10);   

    strcpy(p, "Qian");  

}

main()

{  

    STU  a={NULL, 'm', 290}, b;

    a.name=(char *)malloc(10);

    strcpy( a.name, "Zhao" );

    b = a;

    f(b.name);

    b.gender = 'f';   b.score = 350;

    printf("%s,%c,%d,", a.name, a.gender, a.score);

    printf("%s,%c,%d\n", b.name, b.gender, b.score);

}

 

则程序的输出结果是()。

A) Zhao,m,290,Qian,f,350

B) Zhao,m,290,Zhao,f,350

C) Qian,f,350,Qian,f,350

D) Qian,m,290,Qian,f,350

答案:B

【解析】本题考查结构体变量中的引用,其中a的name为Zhao,b执行函数f(b.name)后b的name并没有改变,还是Zhao,所以答案为B选项。

转载于:https://www.cnblogs.com/chengtou/p/8615770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值