全国计算计算机二级C语言2018年3月(第六套)

1.设栈的顺序存储空间为 S(1:m),初始状态为top=0。现经过一系列正常的入栈与退栈操作后,top=m+1,则栈中的元素个数为  

A)不可能

B)m+1

C)0

D)m

 

 

A【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即取出栈顶元素赋予指定变量。栈为空时,栈顶指针top=0,经过入栈和退栈运算,指针始终指向栈顶元素,栈满时,top=m。初始状态为top=m+1是不可能的。故本题答案为A选项。

 


 

2.下列排序法中,最坏情况下时间复杂度最小的是  

A)堆排序

B)快速排序

C)希尔排序

D)冒泡排序

 

A【解析】堆排序最坏情况时间下的时间复杂度O(nlog2n);希尔排序最坏情况时间下的时间复杂度O(n1.5);快速排序、冒泡排序最坏情况时间下的时间复杂度O(n2)。故本题答案为A选项。

 


 

3.某二叉树的前序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为  

A)ABCDEF

B)BCDEFA

C)FEDCBA

D)DEFABC

 

A【解析】二叉树遍历可以分为3种:前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。二叉树的中序遍历序列和前序遍历序列均为ABCDEF,可知该树只有右子树结点,没有左子树结点,A为根结点。中序遍历序列与前序遍历序列相同说明该树只有右子树没有左子树,因此该树有6层,从顶向下从左向右依次为ABCDEF。故本题答案为A选项。

 


 

4.下列叙述中正确的是  

A)对数据进行压缩存储会降低算法的空间复杂度

B)算法的优化主要通过程序的编制技巧来实现

C)算法的复杂度与问题的规模无关

D)数值型算法只需考虑计算结果的可靠性

 

A【解析】算法的空间复杂度指执行这个算法所需要的内存空间。在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术,以便尽量减少不必要的额外空间。由于在编程时要受到计算机系统运行环境的限制,因此,程序的编制通常不可能优于算法的设计。算法执行时所需要的计算机资源越多算法复杂度越高,因此算法的复杂度和问题规模成正比。算法设计时要考虑算法的复杂度,问题规模越大越是如此。故本题答案为A选项。


 

5.软件需求规格说明的内容应包括  

A)软件的主要功能

B)算法详细设计

C)E-R模型

D)软件总体结构

 

A【解析】软件需求规格说明应重点描述软件的目标,软件的功能需求、性能需求、外部接口、属性及约束条件等。功能需求是软件需求规格说明,给出软件要执行什么功能的详尽描述。性能需求是指定量的描述软件系统应满足的具体性能需求,即各种软件功能的速度、响应时间、恢复时间。外部接口指软件如何与人、系统的硬件及其他硬件和其他软件进行交互。属性是指与软件有关的质量属性,如正确性、可用性、可靠性、安全性、可维护性等。约束条件包括影响软件实现的各种设计约束,如使用的标准、编程语言、数据库完整性方针、资源限制、运行环境等方面的要求。故本题答案为A选项。

 


 

6.某系统结构图如下图所示(图中n≥5)

 

该系统结构图的宽度是  

A)n

B)3

C)2

D)1

A【解析】系统结构图的宽度指整体控制跨度(横向最大模块数)的表示。本题中,模块数最多的是第2层,即“功能1”到“功能n”的模块个数就是宽度,有n个。故本题答案为A选项。

 


 

7.软件是  

A)程序、数据和文档的集合

B)计算机系统

C)程序

D)程序和数据

A【解析】计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。故本题答案为A选项。

 


 

8.关系数据库规范化的目的是为了解决关系数据库中的  

A)插入、删除异常及数据冗余问题

B)查询速度低的问题

C)数据操作复杂的问题

D)数据安全性和完整性保障的问题

A【解析】关系数据库进行规范化的目地:使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。关系模式进行规范化的原则:遵从概念单一化“一事一地”原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。 关系模式进行规范化的方法:将关系模式投影分解成两个或两个以上的关系模式。故本题答案为A选项。

 


 

9.按照传统的数据模型分类,数据库系统可分为  

A)层次、网状和关系

B)大型、中型和小型

C)西文、中文和兼容

D)数据、图形和多媒体

A【解析】数据模型(逻辑数据模型)是面向数据库系统的模型,着重于在数据库系统一级的实现。较为成熟并先后被人们大量使用的数据模型有层次模型、网状模型、关系模型和面向对象模型。故本题答案为A选项。

 


 

10.现有表示患者和医疗的关系如下:P(P#,Pn,Pg,By),其中P#为患者编号,Pn为患者姓名,Pg为性别,By为出生日期, Tr(P#,D#,Date,Rt),其中D#为医生编号,Date为就诊日期,Rt为诊断结果。检索在1号医生处就诊的男性病人姓名的表达式是  

A) 

 

B) 

 

C) 

 

D) 

 

A【解析】π表示投影运算,针对属性;σ表示选择运算,针对元组;∞表示自然连接。首先在Tr表中选择D#1的记录σD#=1(Tr),并找出这些记录中患者的编号πP#(σD#=1 (Tr));,再在P表中找到性别为男性的记录σPg =’男’(P);将两次检索结果进行自然连接生成中间表πP#(σD#=1 (Tr))∞σPg =’男’(P),最后在中间表中检索患者的姓名πPn(πP#(σD#=1 (Tr))∞σPg =’男’(P) )。故本题答案为A选项。


 

11)下面不合法的常量数据是()。

A).023E-5

B)0x3f7b8a90

C)'\0x6d'

D)'\0123321'

答案:D

【解析】选项A是实型常量的指数表示形式,表示0.023*10-5,正确;选项B是十六进制表示的整型常量,正确;选项C是十六进制表示的转义字符常量,正确;选项D是字符串常量,应该使用双引号括起来,错误,本题答案为D。

 

 


 

12)以下叙述中错误的是()。

A)C语言逻辑运算的结果是0和任意非0值

B)C语言中任意合法的表达式都可以作为逻辑运算的对象

C)C语言关系运算的值只有0和1两种可能

D)C语言中用0表示逻辑“假”,非零表示逻辑“真”

答案:A

【解析】由关系运算符构成的表达式,称为关系表达式,关系运算的值为“逻辑值”,只有整数0或整数1,选项C正确;由逻辑运算符和运算对象组成的表达式称为逻辑表达式,逻辑运算的对象可以是C语言中任意合法的表达式,逻辑表达式的运算结果或者为1(“真”),或者为0(“假”),选项A错误,选项B正确;逻辑值只有两个,分别用“真”和“假”来表示,C语言中用非0表示“真”,用0表示“假”,选项D正确,本题答案为A。

 


 

(13)以下说法正确的是()。

A)C语言中的常量是指在程序运行过程中经常被改变数据类型的量

B)C语言中的常量是指在程序运行过程中经常被改变值的量

C)C语言中的常量是指在程序运行过程中经常被用到的变量

D)C语言中的常量是指在程序运行过程中其值不能被改变的量

 

答案:D

【解析】C语言中的常量是指在程序运行过程中其值不能被改变的量,所以本题答案是D。

 


 

14)C语言常量的类型从字面形式上可区分,以下判断中正确的是()。

A)2E3   ---  整型

B)2.0E3 ---  实型

C)'\025'---  字符串

D)"a"   ---  字符型

答案:B

【解析】2E3是实型常量的指数形式,选项A错误;2.0E3是实型常量的指数形式,选项B正确’\025’是八进制表示的转义字符,选项C错误;“a”是双引号括起来的字符串常量,选项D错误;本题答案为B。

 


 

(15)以下各选项中的代码段执行后,变量y的值不为1的是

A)int x=5,y=0; if(5) y=1;

B)int x=5,y=0; if(x) y=1; 

C)int x=10,y=0; if(x=y) y=1;

D)int x=5,y=10; if(x=y) y=1;

答案:C

【解析】选项A的if条件表达式5的值为真,执行y=1,y的值为1;选项B的if条件表达式x的值为5,也是真,执行y=1,y的值为1;选项C的if条件表达式x=y是赋值语句,将y的值0赋给x,表达式的值为0,if语句不执行,y值为0;选项D的if条件表达式x=y是赋值语句,将y的值10赋给x,表达式的值为10,执行y=1,y的值为1,本题答案为C。

 


 

16) 若要利用if-else语句判断year是否闰年,是闰年则返回1,不是闰年则返回0。以下选项中不能完成正确判断的程序段是()。

A)if(year%400==0) return 1;
else if(year%100!=0)
         if(year%4==0) return 1;
         else return 0;

B)if(year%400!=0)
        if(year%100==0) return 0;
        else if(year%4==0) return 1;
             else return 0;
else return 1;

C)if(year%100==0)
        if(year%400==0) return 1;
        else return 0;
else if(year%4==0) return 1;
     else return 0;

D)if(year%4!=0)  return 0;
else if(year%400==0) return 1;
     else if(year%100==0) return 0;
          else return 1;

 

答案:A

 


 

【解析】判断year是闰年,需要满足两个条件之一:1year可以被4整除且year不能被100整除,(2year可以被400整除;选项A没有考虑year能被100整除不是闰年的情况,错误;B、C、D都是正确的;本题答案为A。

17)有如下程序 

#include <stdio.h> 
#include <string.h> 
main() 
{ 
    char a[6] = "0123", *b = "++"; 
    printf("%d,%d", strlen(a), sizeof(b)); 
} 

 


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

A)4,2

B)4,4

C)6,2

D)5,4

答案:B

【解析】strlen()函数计算参数指向的字符串长度,题意中字符数组a有6个字节的存储空间,但是只存储了4个字符,所以strlen()结果为4,选项C、D错误sizeof()运算符是计算类型所占用的长度,题意中b是一个指针变量,指针在内存中占4个字节,所以sizeof结果为4,选项A错误;本题答案为B。

 

 


 

18)有以下程序 

    #include <stdio.h> 
    void main() 
    { 
        double x=3.14159; 
        printf("%f\n", (int)(x*1000+0.5)/(double)1000); 
    } 

 


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

A)3.142000

B)3.141000

C)3.143000

D)3.140000

答案:A

【解析】根据算术表达式和运算符的优先级与结合性,对于题意表达式:int(x*1000 + 0.5)/(double)1000,首先计算x*1000,由于x是double类型,1000是整型,所以x*1000的结果默认是double类型:3141.59;再执行int的强制转换,结果为3142;分母(double)1000强制转换为double类型,此时3142/(double)1000中,3142需要转换成double类型,然后除以1000,结果为3.142000,保留小数点后6位,本题答案为A。

 


 

(19)  有以下程序 

    #include <stdio.h> 
    void main() 
    {   char *s = "\ta\018bc"; 
        for (; *s != '\0'; s++) 
            printf("*"); 
        printf("\n"); 
    } 

 


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

A)******

B)*********

C)*****

D)*******

答案:A

【解析】main()函数定义一个字符指针s,指向字符串”\ta\018bc”for循环遍历s指向的字符串中的字符,然后输出“*”,所以题意可以理解为:s指向的字符串中有多少个字符,就输出多少个“*”;s指向的字符串中字符分别是:’\t’(转义字符)、’a’、’\01’(转义字符)、’8’、’b’、’c’,总共6个,其中由于8不属于八进制中的数字,所以’\018’不是一个转义字符,而’\01’是转义字符,本题答案为A。本题答案为B。

 


 

20)以下有关全局变量的叙述中错误的是()。

A)全局变量没被引用时,不占用内存空间

B)所有在函数体外定义的变量都是全局变量

C)全局变量可以和局部变量同名称

D)全局变量的生命周期一直持续到程序结束

答案:A

【解析】全局变量在程序运行时就分配了存储空间,直到程序结束,它的生命周期是整个程序的运行期,选项A错误、D正确;在函数体外定义的变量都属于全局变量,选项B正确;全局变量可以和局部变量同名,在局部作用域局部变量会屏蔽同名的全局变量,除非显示的引用全局变量,选项C正确;本题答案为A。

 


 

(21)有如下程序

#include  <stdio.h>
#include  <string.h>
main() 
{
    printf("%d\n", strlen("0\n011\0"));
}

 


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

A)5

B)6

C)8

D)9

答案:A

【解析】strlen()函数是求字符串长度的库函数,它在遍历字符串过程中遇到字符串结束符‘\0’时,计算结束,计算结果不包括‘\0’,所以题意中字符串“0\n011\0”长度为5,各个字符分别是:‘0’、‘\n’、‘0’、‘1’、‘1’,本题答案为A。

 


 

(22)若有定义: char s1[100 ]="name", s2[ 50]="address", s3[80]="person";,要将它们连接成新串:"personnameaddress",正确的函数调用语句是()。

A)strcat(strcat(s1,s2),s3);    

B)strcat(s3,strcat(s1,s2));

C)strcat(s3,strcat(s2,s1));

D)strcat(strcat(s2,s1),s3);

答案:B

【解析】strcat()函数是字符串连接函数,调用形式为:strcat(s1, s2);表示s2指向的字符串的内容复制到s1指向的存储空间中,返回s1的地址;由题意可知新串首地址为s3,所以s3应该是第一参数,选项A、D错误;同理,新串中除了s3字符串,剩下的字符串为:”nameaddress”,即首地址s1,所以调用strcat()函数s1是第一参数,所以正确的函数调用语句为:strcat(s3, strcat(s1, s2));本题答案为B。

 


 

(23)  有以下程序  

   #include <stdio.h> 
    #define SWAT(t,a,b)  t=a; a=b; b=t; 
    main() 
    { int  x=6,y=4,z=3,s=0; 
      if(x<y)  SWAT(s,x,y); 
      if(x<z)  SWAT(s,x,z); 
      if(y<z)  SWAT(s,y,z); 
      printf("%d,%d,%d\n", x,y,z); 
    } 

 


执行后的输出结果是

A)6,4,3

B)3,4,6

C)0,3,4

D)3,0,0

答案:D

【解析】程序定义一个宏,#define SWAT(t,a,b) t=a;a=b;b=t;所以程序中,三个if语句经过宏替换后如下:

if (x < y) s=x; x = y; y = s;

if (x < z) s = x; x = z; z = s;

if (y < z) s = y; y = z; z = s;

x初值6,y初值4,z初值为3,s初值为0,所以:

1个if语句,x<y(6<4)为假,执行x=y;y=s;此时x的值为4,y的值为0;

2个if语句,x<z(4<3)为假,执行x=z;z=s;此时x的值为3,z的值为0;

3个if语句,y<z(0<0)为假,执行y=z;z=s;此时y的值为0,z的值为0;最终x、y、z的值为3、0、0;本题答案为D。

 


 

(24)若有定义:char ch; int a; double d;, 当输入为12345 678910.36时,以下选项中能给各个变量正确输入数据的是()。

A)scanf("%d%c%lf",&a,&ch,&d);

B)scanf("%5d%2c%7.2lf",&a,&ch,&d);

C)scanf("%d%c%lf",a,ch,d);

D)scanf("5d%2c%7.2lf%",&a,&ch,&d);

答案:A

【解析】scanf()函数是标准输入函数,其中双引号之间的内容是格式控制串,后面是输入参数列表。其中输入参数列表中各项都必须是变量地址,所以选项C错误;在scanf()函数的格式字符前,可以加入一个正整数指定输入数据所占的宽度,但不可以对实数指定小数位的宽度,所以选项B、D错误;选项A是正确的,按照A的输入格式,12345赋值a,空格赋值给ch,678910.36赋值给d;本题答案为A

 


 

25) 有如下程序

#include  <stdio.h>
main() 
{
    char a, b;
    int i;
    a = '3';
    b = 'A';
    for (i=0; i<6; i++)
    {
        if (i % 2) putchar(a + i);
        else putchar(b + i);
    }
}

 


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

A)AB56EF

B)A4C6E8

C)B4D6F8

D)A5C7E9

答案:B

【解析】程序首先赋值a为字符’3’,赋值b为字符’A’,循环变量i的初值为0,每次循环后自增1,最大值为5,if条件判断i的值,当i的值为偶数时,bi的和当做字符输出;当i的值为奇数时,将a与i的和当做字符输出;所以i0时,输出b+0A;i1时,输出a+1‘4’;i为2时,输出b+2C;i为3时输出a+3即‘6’……,综上,程序运行结果为:A4C6E8,本题答案为B

 


 

(26)有以下程序    

 #include <stdio.h> 
    void fun(double x, double *y, double *z) 
    {   *y = *y-1.0; *z = *z+x;  } 
    main() 
    {   double a=2.5, b=9.0, *pa, *pb; 
        pa=&a;  pb=&b; 
        fun(b-a,pa,pb); 
        printf("%f\n",a); 
    } 

 


程序运行后的输出结果是

A)8.000000

B)9.000000

C)1.500000

D)10.500000

答案:C

【解析】main()函数定义两个double类型的变量a、b,分别赋初值为:2.5、9.0,另外定义两个double类型的指针变量papb,其中pa指向a,pb指向b;然后b-a、papb传给函数fun,此时x的值为7.5,y指向a,z指向b;所以:

*y=*y-1.0,是将变量a的值减去1.0赋给a,a的值为1.5;

*z=*z+x,是将变量b的值加上7.5赋给b,b的值为16.5;

fun()函数执行完毕后,输出a的值为1.5;本题答案为C。

 


 

27)有下列程序  

 #include  <stdio.h> 
  void fun(int a[ ], int n, int flag) 
  {  int i=0,j, t; 
     for (i=0; i<n-1; i++) 
      for (j=i+1; j<n; j++) 
       if (flag ? (a[i] < a[j]) : (a[i] > a[j])) 
       { t = a[i]; a[i] = a[j]; a[j] = t;} 
  } 
  main( ) 
  {  int c[10]={7,9,10,8,3,5,1,6,2,4},i; 
     fun(c, 10, 1); 
     fun(c, 5, 0); 
     for (i=0;i<10; i++) 
        printf("%d,", c[i]); 
  } 

 

 


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

A)5,4,3,2,1,6,7,8,9,10,

B)6,7,8,9,10,5,4,3,2,1, 

C)6,7,8,9,10,1,2,3,4,5, 

D)10,9,8,7,6,1,2,3,4,5,

答案:B

【解析】题意中,fun()函数接收数组a,数组元素个数n以及整型变量flag,然后通过for循环遍历数组a的n个元素,若flag为1,则将数组元素降序排列,若flag为0,则将数组元素升序排列。main()函数定义整型数组c,它包含10个元素,首先将数组c、元素个数10和1传给fun()函数,将c中10个元素逆序排列,结果为:10,9,8,7,6,5,4,3,2,1;然后再次调用fun()函数,将数组c,元素个数5和0传给fun()函数,将c中前5个元素升序排列,结果为:6,7,8,9,10,5,4,3,2,1,本题答案为B。

 


 

(28)  有如下程序

#include  <stdio.h>
void get_put()
{
    char ch;
    ch = getchar();
    if (ch != '\n') get_put();
    putchar(ch);
}
main() 
{
    get_put();
}

 


程序运行时,输入AB12<回车>,则输出结果是()。

A)2100

B)21BA

C)DCBA

D)21AB

答案:B

【解析】main()函数调用get_put()函数,get_put()是递归函数,每次使用getchar()读入一个字符存放到ch中,若ch不是字符’\n’,递归调用自身,然后调用putchar()函数输出该字符。当输入AB12\n(<回车>)时,直到读入的字符是’\n’,输出回车符,然后回到上一层递归,逆序输出各个字符,输出结果为:<回车>21BA,所以本题答案为B。

 


 

(29) 有以下程序

    #include <stdio.h>

    void swap(int *a, int *b)

   {   int  t, *tp;

       t = *a; *a = *b; *b = t;

       tp = a;  a = b;  b = tp;

       printf("%d,%d,", *a,*b);

    }

    main( )

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

       swap(p, q);

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

    }

 

    程序执行后的输出结果是

A)3,7,3,7,3,7

B)7,3,7,3,7,3

C)3,7,3,7,7,3

D)3,7,7,3,7,3

 

答案:D

【解析】main()函数中,首先定义两个整型变量i和j,初值为3和7,并i的地址赋给p,j的地址赋给q,传给swap()函数,swap()函数接收两个整型指针变量a,b,然后使用整型变量t交换a、b所指向的值并输出,通过指针变量,这次交换改变了实参ij的值,使得i=7,j=3;指针变量tp交换a和b的值,由于a、b的值是p,q值的拷贝,所以这次交换只改变了形参a,b的值,对实参p,q的值没有改变,所以此时a指向j,b指向i,函数最后输出*a和*b,所以输出3,7;由于swap()函数改变了pq指向的值,但未改变pq的值,所以main()函数输出i的值为7,j的值为3,*p的值为i,*q的值为j,所以程序输出3,7,7,3,7,3,本题答案为D。

 


 

30) 有如下程序

#include  <stdio.h>
#include  <string.h>
main() 
{
    char a[] = "THIS\0", *b = "OK\0\0";
    printf("%d,%d,%d,%d", strlen(a), sizeof(a), strlen(b), sizeof(b));
}

 


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

A)4,6,2,4

B)4,4,4,1

C)6,5,2,1

D)6,4,2,4

答案:A

【解析】strlen()函数求得参数中字符串的长度(不包括字符串结束符’\0’);sizeof()运算符,求得参数这种类型所占存储空间的长度;题意中a是数组名,由于定义时省略维数大小,所以数组大小是初始化的字符个数,所以a的数组大小为6,综上:strlen(a)只计算字符’T’、’H’、’I’、’S’,结果为4;sizeof(a)是求得数组a的大小,结果为6;另外指针b指向一个字符串’OK\0\0’,所以strlen(b)只计算字符’O’、’K’,结果为2,sizeof(b)求得指针占用存储空间的大小,结果为4,本题答案为A。

 


 

31)以下选项中,能够正确利用随机函数rand(),产生一个英文字母的表达式是()。

A)rand()%2==0 ? rand()%'A' : rand()%'a'

B)rand()%26+'A'|| rand()%26+'a'

C)rand()%26+'A' && rand()%26+'a'

D)rand()%2==0 ? rand()%26+'A': rand()%26+'a'

答案:D

【解析】rand()函数是产生随机数的函数,它可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX是stdlib.h中定义的一个整数。通常如果我们需要随机0~N-1之间的一个随机数,需要使用rand()的结果对N求模即可。选项A中rand()%2只有两个值0或1,所以当rand()%2的结果为0时,整个表达式的值是rand()%'A',这里'A'要转换成ASCII码值65,所以结果为0~64之间的一个随机数,当rand()%2的结果为1时,整个表达式的值是rand()%'a','a'ASCII码值为97,所以结果是0~96之间的一个随机数,可见选项A错误;逻辑或运算符||或逻辑与运算符&&的结果都只能是0或非0,所以选项B、C也是错误的;选项D中,如果rand()%2的结果为0,那么整个表达式的值为rand()%26+'A',0~25之间任一个数与'A'的和都是一个大写字母;如果rand()%2的值为1,整个表达式的值为rand()%26+'a'0~25之间任一个数与'a'的和都是一个小写字母,所以选项D正确;本题答案为D。

 

 


 

32)有下列程序  

 #include <stdio.h> 
  #include <string.h> 
  main( ) 
  {  char v[4][10]={"efg","abcd","mnopq","hijkl"},*p[4],*t;   
     int i,j; 
     for (i=0; i<4; i++) 
       p[i] = v[i]; 
     for (i=0; i<3; i++) 
       for (j=i+1; j<4; j++) 
         if (strcmp(p[i], p[j]) > 0) 
         {  t = p[i]; p[i] = p[j]; p[j] = t;  } 
     for (i=0; i<4; i++) 
        printf("%s " , p[i]);  
  } 

 

 


程序执行后的输出结果是

A)efg abcd hijkl mnopq

B)abcd efg hijkl mnopq

C)mnopq hijkl efg abcd

D)efg abcd mnopq hijkl 

答案:B

【解析】main()函数中定义一个二维数组v,另外还定义一个指针数组p,通过for循环,将v的各个行(字符串的首地址)赋给p的对应下标的元素,然后通过嵌套的for循环,为该二维数组中存放的各个字符串进行排序,stcmp函数返回值大于0时(p[i]>p[j])交换两个字符串,所以每一轮内嵌for循环,都将下标i的字符串放在最终的排序位置上,即排序规则是按字符串升序排列,字符串排序时,是将两个字符串自左向右逐个字符比较(按字符的ASCII码大小),直到出现不同的字符或遇到’\0’为止,排序后,再将v中各个排序后的字符串输出;所以程序运行结果为:abcd efg hijkl mnopq,本题答案为B

 


 

(33)  有以下程序

    #include  <stdio.h>

    int *f(int *s)

    {  s+=2;

       s[1] +=6;

       *s=7;

       return s;

    }

    main( )

    {  int  a[5]={1,2,3,4,5}, *p=a;  

       p= f(p);  

       printf("%d,%d,%d,%d", a[0], a[1], *p,p[1]); 

    }

 

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

A)1,2,7,10

B)7,8,7,8

C)1,2,1,2

D)7,10,7,10

答案:A

【解析】f()函数接收一个数组a的首地址s,然后s指针向后移动两个单位,此时s指向数组a的第3个元素,即3,然后将s的后一个元素累加6,s指向的元素赋值为7,并返回s指针赋给实参p,所以f()函数调用后,a数组中的元素分别为:1,2,7,10,5。执行p=f(p)后,p指向第3个元素,所以输出a[0]1,a[1]2,*p为7,p[1]为10,本题答案为A。

 

 


 

34) 如图所示:带有头结点的单向链表head,其三个数据结点A、B、C 的连接关系见图。  

     结点类型的定义为:
     struct link
     {
         double dt;
         struct link *next;
     };
    若指针p指向A结点,在不改变p指向的前提下,以下选项中不能访问C结点数据成员dt的表达式是

A)*(*p).next->next->dt

B)p->next-> next->dt

C)(*(*(*p).next).next).dt

D)(*(p->next-> next)).dt

答案:A

【解析】link结构体中的next是链表中下一个结点的地址,由于p当前指向A,所以p->nextB的地址,p->next->nextC的地址,访问C的结点数据成员dt可以使用C的地址访问,即:p->next->next->dt,选项B正确p是A的地址,所以*p是结点A,(*p).next是B的地址,由于成员运算符.的优先级高于解引用运算符*,所以*(*p).next是结点B,(*(*p).next).next是C的地址,*(*(*p).next).next是结点C,引用C的dt成员:(*(*(*p).next).next).dt ,选项C正确;同理,也可以既使用指针运算符,也使用解引用运算符来访问C的结点数据成员dt,即(*(p->next-> next)).dt,选项D正确;选项A中,*p表示A结点,(*p).next表示结点B的地址,由于->运算符的优先级高于*运算符,所以先执行->,即表达式(*p).next->next->dt引用C结点的数据成员dt,然后再执行解引用运算*,这是错误的,本题答案为A。

 


 

35)设有函数说明语句:


  int fun(int,int);
以及函数指针定义语句:
  int (*f)(int,int);
若要使函数指针指向函数fun的入口地址,以下选项中正确的是()。

A)f=fun( );

B)*f=fun;  

C)f=fun; 

D)*f=fun( );

答案:C

【解析】C语言中,函数名也是一个指针,是函数的入口地址,所以要是函数指针f指向函数fun的入口地址,直接将函数名fun赋给f即可,本题答案为C。

 


 

(36) 有下列程序  

   #include <stdio.h>
     main( )
     {  char v[4][10];  int i;
        for (i=0; i<4; i++)
          scanf("%s", v[i]);
        printf("%c,%s,%s,%c", **v, *(v+1), v[3]+3, *(v[2]+1)); 
     }

 


程序执行时若输入: welcome you to beijing<回车>,则输出结果是()。

A)w,you,jing,o 

B)welcome,you,jing,to

C)w,you,eeijing,u

D)w,xelcome,eeijing,u

答案:A

【解析】题意中,定义一个二维字符数组v,然后通过for循环,输入4个字符串welcome、you、to、beijing,分别存放在v的四个元素中;所以v表示存放四个字符串的二维数组;**v表示第一个字符串的第一个字符w;*(v+1)指向第二个字符串you;v[3]+3指向第四个字符串第三个字符开始后的整个字符串jing;*(v[2]+1)表示第三个字符串的第二个字符o,本题答案为A。

 


 

37)以下针对相应语句的注释中,说法错误的是()。

A)int *pt[2];    /*  pt是一个指针数组名   */  

B)int (*pt)[2];  /*  pt是一维数组名    */

C)int (*pt)( );  /*  pt是指向函数的指针   */

D)int *pt( );    /*  pt是一个函数名   */

答案:B

【解析】选项A定义一个数组pt,它包含两个整型指针的元素,所以pt是一个指针数组名,正确;选项B定义了一个数组指针ptpt指向一个数组,该数组包含两个整型元素,错误;选项C定义了一个函数,pt是函数指针,指向这个函数,其中该函数没有参数,返回类型为整型,正确;选项D定义一个函数,函数名pt,函数返回整型指针类型,正确;本题答案为B。

 


 

(38)若有定义   

typedef  int  *(*T[10])[10];  
   T  b;
则以下选项中所定义的a与上述定义中的b,其类型完全相同的是()。

A)int *(*a[10][10]);

B)int **a[10][10];     

C)int *(a[10])[10];

D)int *(*a[10])[10];

答案:D

【解析】typedef int *(*T[10])[10]使用typedef定义一种新类型名T,T的类型是二维数组指针,指向10个元素的数组,其中数组元素类型为int *[10],即数组的每个元素又是包含10个元素的数组,数组的元素是整型指针类型,本题答案为D。

 


 

(39)  有以下程序

    #include   <stdio.h>

    main( )

    {  int  x=3,y=5, z1,z2;

       z1=x^y; z2=x+y;

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

    }

 

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

A)9,8

B)8,8

C)35,8

D)6,8

答案:D

【解析】“^”是异或运算符,两个运算数的二进制位逐位进行异或运算,当相应位的数值相同时,结果为0,当相应位的数值不同时,结果为1;题意中,x=3,二进制位00000011,y=5,二进制为00000101,异或运算后二进制数:00000110,所以z1的结果为6;z2=x+y,结果为8;本题答案为D。

 


 

(40)  有以下程序 

 

    #include<stdio.h> 
     typedef struct book
     {
       char name[50];
       double price;
     } BOOK;
     void fun(BOOK*pd,int num,int size);
     void main()
     {
       BOOK data[10]={"photoshop",26.8,"计算机原理",15.00,"数据结构",35.6};
       int n=3,m=10;
       fun(data,n,m);
       printf("%s , %s\n",data[8].name,data[9].name);
     }
     void fun(BOOK*pd,int num,int size)
     {
       int i,j,t;
       double mx,mn;
       mx=mn=pd[0].price;
       j=t=0;
       for(i=1;i<num;i++)
       {
         if(pd[i].price>mx)
         {  mx=pd[i].price;j=i;  }
         if(pd[i].price<mn)
         {  mn=pd[i].price;t=i;  }
       }
       pd[size-2]=pd[j];
       pd[size-1]=pd[t];
     }  

 


程序的运行结果是()。

A)数据结构 , 计算机原理

B)计算机原理 , 数据结构

C)Photoshop , 计算机原理

D)数据结构 , Photoshop

答案:A

【解析】程序首先使用typedef定义一种新的类型名BOOK,它包含两个数据成员:字符数组namedouble类型变量price;main()函数使用BOOK定义结构体数组data,它包含10个BOOK类型的结构体元素,并完成初始化,其中前3个元素使用确定的值初始化,后7个元素系统默认值初始化;函数fun()通过for循环遍历结构体数组pd的前num个元素,从而找出前num个元素中price成员最大的元素下标存放到j,找出前num个元素中price成员最小的元素下标存放到t,然后将下标为j的元素赋给下标为size-2的位置,将下标为t的元素赋给下标为size-1的位置;由于main()函数中调用fun(data, n, m),n值为3,m值为10,所以fun()函数将data中下标为8的元素赋值为前3个元素中price值最大的元素,将data中下标为9的元素赋值为前3个元素中price值最小的元素,调用结束后,输出下标为8和9的元素的成员name,根据初值可知price最大的元素的name成员为“数据结构”,price最小的元素的name成员为“计算机原理”,所以程序输出:数据结构,计算机原理,本题答案为A。

 


 

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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值