全国计算机二级第三套

13)下面选项中合法的字符常量是

A) "X"

B) 'X'

C)  'abc'

D) '\'

答案:B

【解析】字符常量是用单引号括起来的一个字符。A选项中,使用双引号,所以是错误的; C选项中,'abc'是字符串,字符常量只能是单个字符,不能是字符串;D选项中,以反斜线"\"开头的是转义字符。因此B选项正确。

14)有以下程序

#include <stdio.h>

main()

{

   int  a, b, c=241;

   a = c/100 % 9;

   b = ( -1 )&&( -1 );

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

}

程序运行后的输出结果是

A) 2,1

B) 6,1

C) 6,0

D) 2,0

答案:A

【解析】程序执行过程为:c=241,c/100=2,2%9=2,得a=2;=优先级低于“&&,非0值为真,0值为假,即(-1)为真,逻辑与表达式(-1)&&(-1)为真,得b=1。A选项正确。

15有以下程序

#include   <stdio.h>

int sub(double  a, double  b)

{

    return (int)(a - b - 1.3);

}

main( )

{

    printf("%d\n", sub(3.2, 4.1));

}

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

A)  -2  

B)  1.7

C) -3  

D) 2.0

答案:A

【解析】sub函数输出(int)(a - b - 1.3)将结果强制转化为整型,因此可以排除B、D选项,sub(3.2,4.1)=-2,故答案为A选项。

16若有定义:int  a=0,b=0,c=0,d=0;,以下关于C语言表达式:(++a || ++b) ? ++c : ++d 执行顺序的叙述正确的是()。

A) 先执行++a,表达式++a的值为1;再执行++b,表达式++b的值为1,由此可确定(++a || ++b)值为1,因此执行++c

B) 先执行++a,表达式++a的值为1,由此可确定(++a || ++b)值为1,因此执行++c

C) 先执行++b,表达式++b的值为1;再执行++a,表达式++a的值为1,由此可确定(++a || ++b)值为1,因此执行++c

D) 先执行++b,表达式++b的值为1,由此可确定(++a || ++b)值为1,因此执行++c

答案:B

【解析】表达式1?表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3,++a表示先将变量a+1,再执行其他操作,逻辑或运算符遵循"短路求值"策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(++a || ++b)中,左操作数++a的值为1,已经可以确定整个逻辑表达式的结果为1,因此右操作数++b不再求解,直接执行表达式2,即++c,答案为B选项。

17)若有定义语句:

    int  a=3,b=2,c=1;

以下选项中错误的赋值表达式是()。

A) a=(b=4)=3;

B) a=b=c+1;

C) a=(b=4) +c;

D) a=1+(b=c=4);

答案:A

【解析】不能将变量或常量赋给一个表达式,所以A选项中(b=4)=3是错误的

18有以下程序

     #include <stdio.h>

     main()

     {  int  i=0;

        i = ~ i;

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

     }

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

A) 8

B) 0

C) 1

D) -1

答案:D

【解析】本题考查位运算中按位取反,0按位取反就是-1,所以选项D正确。

19有以下程序

    #include <stdio.h>

    main()

    {

        char  c1,c2,c3,c4,c5,c6;

        scanf("%c%c%c%c", &c1,&c2,&c3,&c4);

        c5=getchar();    

        c6=getchar();

        putchar(c1);         

        putchar(c2);

        printf("%c%c\n",c5,c6);

    }

程序运行后,若从键盘输入(从第1列开始)

     123<回车>

     45678<回车>

则输出结果是()。

A) 1245

B) 1256

C) 1278

D) 1267

答案:A

【解析】Scanf按照格式字符进行输入,所以123与回车的值分别送入了c1、c2、c3、c4变量的存储空间。getchar()函数的功能是从键盘输入的字符串中读入一个字符,所以4送入了变量c5的存储空间,5送入了变量c6的存储空间。所以打印时结果为1245。

20设有定义:

int n = 1234;  

double x = 3.1415;

 

则语句 

printf("%3d,%1.3f\n", n, x);

的输出结果是

A) 1234,3.142

B) 123,3.142

C) 1234,3.141

D) 123,3.141

答案:A

【解析】函数printf()中,%md指输出带符号的十进制整数,给定最小宽度为m位,不足m位左端补空格,超过m位按实际位数输出,%.nf表示以小数形式输出实数,小数占n位,对应题目,答案为A选项。

21设变量均已正确定义,若要通过

    scanf("%d%c%d%c",&a1,&c1,&a2,&c2);

语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)

A) 10□X<回车>

20□Y<回车>

B) 10□X20□Y<回车>

C) 10X<回车>

20Y<回车>

D) 10□X□20□Y<回车>

答案:C

【解析】输入数据的格式必须与scanf()的格式控制串完全匹配,如果A、B、D选项中在数字10后面均输入了空格,则会将空格赋给变量c1,而不是把X赋给c1,所以选择C选项。

22有以下程序

#include <stdio.h>

main()

{  char b[3][10];  int i;

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

      scanf("%s", b[i]);

   gets(b[2]);

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

}

执行时若从第一列输入:Fig flower is red. <回车>

则输出结果是

A) Figflower is red.

B) Figfloweris red.

C) Figflowerisred.

D) Fig flower is red.

答案:A

【解析】scanf()函数从输入设备按照指定的类型输入对应类型的若干个数据,遇到空格、制表符和回车时,读取结束。gets()函数从标准输入设备键盘上读取1个字符串(可以包含空格),并将其存储到字符数组中去。此函数的读取结束符是换行符,即当遇到一个换行符时,就停止读操作,并且换行符不能够作为字符串的内容来存储,系统会自动用“\0来代替。可知读到第一个空格时b[0]赋值结束,为Fig,读到第二个空格时b[1]赋值结束,为flower,退出for循环执行gets()函数,空格为有效字符,b[2]=is red.,之后打印三个字符串,A选项正确。

 

23若有以下程序

    #include <stdio.h>

    main()

    {  int  a=1,b=2,c=3,d=4;

       if ((a=2) || (b=1)) c=2;

       if ((c==3) && (d=-1)) a=5;

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

    }

 

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

A) 1,2,3,4

B) 2,1,2,-1

C) 5,1,2,-1

D) 2,2,2,4

答案:D

【解析】第一个if语句的判断条件中是逻辑或表达式,所以只要有一个运算对象为真结果就为真,且如果前面的已经为真,后面的表达式不再进行执行判断。执行第一个if判断条件时a的值为2,整个表达式的值为真,b的值不变,c的值为2。判断第二个if条件为逻辑与表达式,只有两个运算对象均非零,才为真,第一个表达式c==3,不成立,不再判断第二个运算对象,所以不执行d=-1操作和a=5操作。所以结果为选项D。

24有以下程序:

#include  <stdio.h>

main()

{ int   x=1, y=0, a=0, b=0;

   switch (x)

   { case   1:

    switch(y)

    { case   0:  a++;  break;

      case   1:  b++;  break;

      }

     case 2:  a++;  b++;  break;

     case 3:  a++;  b++;

  }

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

}

程序的运行结果是(  )。

A) a=2,b=2

B) a=2,b=1

C) a=1,b=1

D) a=1,b=0

答案:B

【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。所以执行内层switch(y)时只执行了a++,此时a的值为1。然后执行外层case 2语句的a++;b++;a为2,b为1。所以结果为B)。

(25) 有以下程序

#include   <stdio.h>

main( )

{  int  m,n;

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

   while(m!=n)

   {   while(m>n) { m=m-n; }

       while(n>m) { n=n-m; }

   }

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

}

该程序的功能是()。

A) 计算m和n的最小公倍数

B) 计算m和n的最大公约数

C) 计算m和n的差值

D) 找出m和n中的较大值

答案:B

【解析】题目使用更相减损术求最大公约数,其思想:1、任意给定两个正整数,判断它们是否都是偶数。若是,则用2约简,若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

因此。故答案为B选项

26)有以下程序

#include  <stdio.h>

main( )

{  int a=1, b=0;

   for(; a<5; a++)

   {  if (a%2 == 0) break;

      continue;

      b += a;

   }

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

}

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

A) 0

B) 1  

C) 10

D) 4

 

答案:A

【解析】题干中for循环有break和continue语句,且均放在b+=a语句前面,无论if条件是否满足,b+=a都不会被执行,因此b值始终为0,答案为A选项。

27)若有以下定义

    int  x[10],  *pt=x;

则对x数组元素的正确引用是()。

A) pt+3

B) *&x[10]

C) *(pt+10)

D) *(x+3)

答案:D

【解析】没有A选项的引用形式。*与&放在一起作用抵消,所以B选项错误,最大只能引用到x[9]。*(pt+i)表示引用指针pt所指元素后的第i个元素,所以C选项错误,最大只能为*(pt+9)。因此D选项正确。

28)有以下程序

    #include <stdio.h>

    main()

    {

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

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

            for (k=i+1; k<4; k++)  

                if (a[i][i] < a[k][k])

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

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

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

    }

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

A) 1,1,2,6,

B) 6,2,1,1,

C) 6,4,3,2,

D) 2,3,4,6,

答案:C

【解析】首先对二维数组进行赋值操作,a[0][0]、a[0][1]、…、a[3][2]、a[3][3]的值为1、4、…、6、1。通过for嵌套循环语句和if条件语句,对二维数组对角线元素进行由大到小的排序操作,程序最后通过for语句输出二维数组第1行的4个元素。因此C选项正确。

29有以下程序

     #include <stdio.h>

     main()

     {  int  a[3][4]={ 1,3,5,7,9,11,13,15,17,19,21,23}, (*p)[4]=a,i,j,k=0;

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

          for( j=0; j<2; j++ )  k=k+*(*(p+i)+j);

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

     }

 

程序运行后的输出结果是

A) 108

B) 68

C) 99

D) 60

答案:D

【解析】该题首先给二维数组赋值a[3][4]={{1,3,5,7}{9,11,13,15}{17,19,21,23}};(*p)[4]=a指针p指向二维数组a的首地址,接下来执行for循环,首先 i=0,j=0时k=k+*(*(p+0)+0)=1(a[0][0]);然后 i=0,j=1时k=k+*(*(p+0)+1)=4(a[0][1]);然后j=2时,跳出j的循环,执行i的循环i=1,j=0 时k=k+*(*(p+1)+0)=13(a[1][0]);依次类推一直到i=3时跳出全部循环。循环语句在这里的功能是累加二维数组第1列和第2列的元素,累加结果为60。

30有以下程序

#include    <stdio.h>

#include    <string.h>

main( )

{  char  a[] = "TEXT", *b = "++", c[3] = "1";

   printf("%d,%d,", strlen(a), sizeof(a));

   printf("%d,%d,", strlen(b), sizeof(b));

   printf("%d,%d,\n", strlen(c), sizeof(c));

}

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

A) 4,5,2,4,1,3,

B) 4,4,2,2,1,1,

C) 5,5,3,3,2,2,

D) 4,4,2,2,1,3

答案:A

【解析】sizeof( )是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。strlen(*char)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL。sizeof(a)求数组a所占空间的大小,包括字符串最后的'\0',所以sizeof(a)=5,strlen()遇到'\0'就结束,strlen(a)=4。strlen(b)是指针指向的字符串长度,sizeof(b)是指针的大小。strlen(c)是字符串的长度,sizeof(c)是数组的长度。因此,输出4,5,2,4,1,3。故答案为A选项

31)有以下程序

#include   <stdio.h>

#include   <string.h>

main( )

{ char  a[20]="ab",b[20]="cdef";

  int  k=0;

  strcat(a,b);

  while(a[k]!='\0') { b[k]=a[k]; k++;}

  puts(b);

}

程序的运行结果是()。

A)abcdef

B)cbcdef   

C)cdef  

D)ab

答案:A

【解析】strcat(字符串1, 字符串2)函数是把字符串2连接到字符串1的后面,最终结果存放到字符组1中,因此本题把a,b字符串连接起来放在a数组中,while语句完成功能是再将a字符串赋给b字符串,因此答案为A选项。

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

A) 函数名允许用数字开头

B) 函数调用时,不必区分函数名称的大小写

C) 调用函数时,函数名必须与被调用的函数名完全一致

D) 在函数体中只能出现一次return语句

答案:C

【解析】B选项中,函数调用时,函数名称是需要区分大小写的;A选项中,函数名不允许以数字开头;D选项中,在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行。因此C选项正确。

33)有以下程序

    #include <stdio.h>

    int f(int x);

    main()

    { int n=1,m;

      m=f(f(f(n))); printf("%d\n",m);

    }

    int f(int x)

    { return x*2; }

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

A) 4

B) 2

C) 8

D) 1

答案:C

在C语言中,需要在main函数后面定义函数,需要提前声明,否则调用报错,无法找到该函数。m=f(f(f(n))),一共调用3次f()函数,f()函数是对n*2,因此,结果是n*2*2*2,得到结果为8。故答案为C选项。

34)有以下程序

#include <stdio.h>

int  d=1;

void  fun( int  p )

{  

    int  d=5;

    d += p++;

    printf("%d  ", d );

}

main()

{  

    int  a=3;

    fun( a );

    d += a++;

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

}

程序的输出结果是()。

A) 8  4

B) 9  6

C) 9  4

D) 8  5

答案:A

【解析】本题主要考查局部变量和全局变量的区别,题目中函数之外定义的d为全局变量,函数fun内定义的d为局部变量,所以执行fun函数后,打印出8,执行完d += a++;后d变为4,所以答案为A。

 

35)函数fun的功能是在a所指的具有n个元素的数组中查找最大值并返回给调用函数,函数不完整。

int  fun(int  *a,int  n)

{  int  *p,*s;

   for( p=a,s=a; p-a<n;p++ )

   if(__________)  s=p;

   return  *s;

}

在if语句下划线处应填入的选项是()。

A) p>s

B) *p>*s

C) a[p]>a[s]

D) p-a>p-s

答案:B

【解析】函数fun的功能是在a所指的具有n个元素的数组中查找最大值并返回。通过for比较,s始终指向最大值的那个元素。取指针的值,使用*p,因此比较使用*p和*s,又因为找最大值,当*s<*p时,修改指针s的指向,因此答案为B选项

36)设有以下函数:

    void fun(int n,char *s)

    {  ……  }

则下面对函数指针的定义和赋值均正确的是()。

A) void (*pf)(int,char);     pf=&fun;

B) void  *pf();      pf=fun;

C) void  *pf();     *pf=fun;

D) void  (*pf)(int, char*);    pf=fun;

答案:D

【解析】函数的参数可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。函数名代表函数的入口地址,指向函数的指针应该定义为void (*pf)()。如果定义为void *pf(),则表示函数pf返回值为一个基类型为void的指针。因此D选项正确。

37)有以下程序

     #include <stdio.h>

     #define  SUB( X, Y )   (X+1)*Y

     main()

     {  int  a=3, b=4;

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

     }

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

A) 25

B) 20

C) 12

D) 16

答案:D

【解析】本题考查宏定义,宏定义只是做个简单的替换,执行SUB(a++ ,b++)=(a++ +1)*b++=16,选项D正确。

38)若有定义

    typedef  int  *T;

    T  a[20];

则以下与上述定义中a类型完全相同的是()。

A) int  *a[20];

B) int  (*a)[20];

C) int  a[20];

D) int  **a[20];

答案:A

【解析】“typedef 类型名 新类型名”表示为一个已有定义的类型标识符重新定义一个类型名,题中选项A代表的意思是数组指针,即指向数组的指针,B选项是指针数组,即数组存放的元素是整型指针,首先为整型指针类型命名为T,再通过T定义了一个整形指针数组*a[20],等价于int *a[20],答案为A选项。

39为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域)则在()处填入的选项是(   )。

  struct link{ char data;()}node;

 

 

   data next

A) struct link *next;

B) link next;

C) link *next;

D) struct link next;

答案:A

【解析】存储结构用链式存储。链式结构每个节点有个指针域,指针域指向下一个链式结构的节点,因此指针域的结构应该是该结构形式,因此应定义为struct link* next,故答案为A选项。struct是结构体的说明符,不能省略

40)有以下程序段

      FILE *fp;

      if( (fp=fopen("test.txt","w")) == NULL)

        {   printf("不能打开文件!");

            exit(0);}

      else

           printf("成功打开文件!");

  若指定文件test.txt不存在,且无其他异常,则以下叙述错误的是

A) 输出"不能打开文件!"

B) 输出"成功打开文件!"

C) 系统将按指定文件名新建文件

D) 系统将为写操作建立文本文件

答案:A

【解析】fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。在指定文件有错误或者指定文件不存在却不能创建新文件的情况下,打开文件操作错误,返回空指针。本题程序中,文件test.txt不存在,但无其他异常,表示可以建立新文件,命名为test.txt,C选项叙述正确,并以只写方式打开它,D选项叙述正确,返回指向文件的指针,if条件不成立,输出“成功打开文件!”,B选项叙述正确,A选项叙述错误。所以选择A选项。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值