c语言错题集锦讲解.docx
《c语言错题集锦讲解.docx》由会员分享,可在线阅读,更多相关《c语言错题集锦讲解.docx(30页珍藏版)》请在冰豆网上搜索。
c语言错题集锦讲解
下列链表中,其逻辑结构属于非线性结构的是
A)二叉链表
B)循环链表
C)双向链表
D)带链的栈
【解析】在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。
带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,是线性表。
在单链表中的结点中增加一个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针),也是线性链表。
循环链表具有单链表的特征,但又不需要增加额外的存贮空间,仅对表的链接方式稍做改变,使得对表的处理更加方便灵活,属于线性链表。
二叉链表是二叉树的物理实现,是一种存储结构,不属于线性结构。
答案为A选项。
设循环队列的存储空间为Q(1:
35),初始状态为front=rear=35。
现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为
A)15
B)16
C)20
D)0或35
、
【解析】在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。
只不过当头尾指针指向向量上界时,其加1操作的结果是指向向量的下界0。
由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时,头尾指针均相等。
答案为D选项。
voidfun(intm,intk,intxx[])
{
inti,j,n;
for(i=m+1,n=0;n{for(j=2;jif(i%j==0)break;if(j>=i)/*如果是素数,放入数组xx中*/xx[n++]=i;}}一·下列叙述中正确的是( )。A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况C)在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D)循环队列中元素的个数是由队头指针和队尾指针共同决定【解析】循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以A)错误;在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以B)与C)错误。二·下列叙述中正确的是( )。A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C)顺序存储结构能存储有序表,链式存储结构不能存储有序表D)链式存储结构比顺序存储结构节省存储空间【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。三·数据流图中带有箭头的线段表示的是( )。A)控制流B)事件驱动C)模块调用D)数据流【解析】数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。四·在软件开发中,需求分析阶段可以使用的工具是( )。A)N-S图B)DFD图C)PAD图D)程序流程图【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。五、在面向对象方法中,不属于"对象"基本特点的是( )。A)一致性B)分类性C)多态性D)标识唯一性【解析】对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。所以选择A)。 六、一间宿舍可住多个学生,则实体宿舍和学生之间的联系是( )。A)一对一B)一对多C)多对一D)多对多【解析】因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。七、在数据管理技术发展的三个阶段中,数据共享最好的是( )。A)人工管理阶段B)文件系统阶段C)数据库系统阶段D)三个阶段相同【解析】数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择C)。八、有三个关系R、S和T如下:由关系R和S通过运算得到关系T,则所使用的运算为( )。A)笛卡尔积B)交C)并D)自然连接【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C)错误。根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D)。九、以下选项中,能用作数据常量的是( )。A)115LB)0118C)1.5e1.5D)o115【解析】A)选项中115L表示115是长整型数据,合法。B)选项是八进制常量的表示方法,但是在八进制中不能含有数字8,所以B)错误。C)选项中e后面应该是整数不能是小数1.5,所以C)错误。D)选项中八进制常量应该是数字"0"开始,而不是字母"o"开始。 十、若有定义intx,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x++):(y++)中的条件表达式(x-y)等价的是( )。A)(x-y<0||x-y>0)B)(x-y<0)C)(x-y>0)D)(x-y==0)【解析】条件表达式:x=表达式1?表达式2:表达式3的含义是:先求解表达式1,若为非0(真),则求解表达式2,将表达式2的值赋给x。若表达式1的值为0(假),则求解表达式3,将表达式3的值赋给x。在本题中与表达式1:(x-y)等价的是(x-y<0||x-y>0)。 十一、有以下程序:#includemain(){ intx=1,y=0; if(!x)y++; elseif(x==0) if(x)y+=2; elsey+=3; printf("%d\n",y);}程序运行后的输出结果是( )。A)3B)2C)1D)0【解析】在ifelse语句中else总是与离它最近的if配对。本题目中x为1所以!x为0,所以执行elseif语句中的内容,判断(x==0)是否成立,因为x为1所以条件不成立,所以elseif内部的if…else语句不再执行,所以y的值还是初始值0。 十二、若有定义:floatx=1.5;inta=1,b=3,c=2;则正确的switch语句是( )。A)switch(a+b){case1:printf("*\n"); case2+1:printf("**\n");}B)switch((int)x);{case1:printf("*\n"); case2:printf("**\n");}C)switch(x){case1.0:printf("*\n"); case2.0:printf("**\n");}D)switch(a+b){case1:printf("*\n"); casec:printf("**\n");}【解析】B)选项中switch((int)x);语句中不应该有最后的分号。switch(expr1),中的expr1不能用浮点类型或long类型,也不能为一个字符串,所以C)错误。case后面常量表达式的类型必须与switch后面表达式的类型一致,所以D)错误。 十三、有以下程序:#includemain(){intn,*p=NULL; *p=&n; printf("Inputn:");scanf("%d",&p);printf("outputn:");printf("%d\n",p);}该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是( )A)intn,*p=NULL;B)*p=&n;C)scanf("%d",&p)D)printf("%d\n",p);【解析】选项B)的正确写法应为p=&n;选项C)的正确写法应为scanf("%d",p);选项D)的正确写法应为printf("%d\n",*p)。 十四、有以下程序:#includemain(){ inta[]={2,3,5,4},i; for(i=0;i<4;i++) switch(i%2) {case0:switch(a[i]%2) { case0:a[i]++;break; case1:a[i]--; }break; case1:a[i]=0; } for(i=0;i<4;i++)printf("%d",a[i]);printf("\n");}程序运行后的输出结果是( )。A)0304B)2050C)3344D)3040【解析】第一次循环i为0,i%2为0,执行switch(a[0]%2)中的case0语句后内容即a[0]++,a[0]的值变成3;第二次循环i的值为1,i%2为1,执行case1:a[i]=0;所以a[1]的值变成0;第三次循环i的值为2,i%2为0,执行switch(a[2]%2)中的case1语句后的内容a[2]--,a[2]的值变成4;第四次循环i的值为3,i%2为1,执行case1:a[i]=0;所以a[3]的值变成0。十五、以下语句中存在语法错误的是( )。A)charss[6][20];ss[1]="right?";B)charss()[20]={"right?"};C)char*ss[6];ss[1]="right?";D)char*ss()={"right?"};【解析】数组定义后,不可以对数组整体赋值,s是二维数组,因ss[1]是一维字符数组,即字符串,字符串赋值可以使用strcpy(ss[1],"right");这样的形式,而选项A)中对二维数组中的第"1"维(相当于一个一维数组)赋值,是不可以的。选项B)和D)是定义时对数组初始化,这是可以的。选项C)中,将字符串在内存中的首地址赋给指针数组的一个元素,这是可以的。 十六、以下不能将s所指字符串正确复制到t所指存储空间的是( )A)do{*t++=*s++;}while(*s);B)for(i=0;t[i]=s[i];i++);C)while(*t=*s){t++;s++}D)for(i=0,j=0;t[i++]=s[j++];);【解析】do{*t++=*s++;}while(*s);不能因为当*s='\0'时,while(*s)跳出循环,这样字符串结束标志'\0'没有复制给*t,造成*t不完整。注意,*t++=*s++是先执行t=*s,然后才进行t=t+1,s=s+1。B),C),D)都能将'\0'复制过去。 十七、有以下程序:#includevoidswap(char*x,char*y){chart;t=*x;*x=*y;*y=t;}main(){char*s1="abc",*s2="123";swap(s1,s2);printf("%s,%s\n",s1,s2);}程序执行后的输出结果是( )。A)321,cbaB)abc,123C)123,abcD)1bc,a23【解析】字符串是一个特殊的数组,所以按照数组的规则,s1应该指向的是数组的首地址,即"abc"的第一个字符的地址。s2指向的是"123"的第一个字符的地址。调用swap函数之后交换的是两个字符串的第一个字符'a'和'1'的内容,所以打印输出为D)。 十八、在一个C源程序文件中所定义的全局变量,其作用域为( )。A)由具体定义位置和extern说明来决定范围B)所在程序的全部范围C)所在函数的全部范围D)所在文件的全部范围【解析】全局变量的作用域是从声明处到文件的结束。所以选择A)main(){ structSp=data[1]; printf("%d\n",++(p.a));} 十九、程序运行后的输出结果是( )。A)10B)11C)20D)21【解析】声明data是结构S数组。初始化data[0].a=10;data[0].b=100;data[1].a=20;data[1].b=200。主函数中p=data[1];即p.a=data[1].a;p.b=data[1].b;执行语句printf("%d\n",++(p.a));打印输出时p.a先增1再打印。p.a=data[1].a=20,先增1等于21。 二十、有以下程序:#include#definePT3.5;#defineS(x)PT*x*x;main(){ inta=1,b=2;printf("%4.1f\n",S(a+b));}程序运行后的输出结果是( )。A)7.5B)31.5C)程序有错无输出结果D)14.0【解析】宏定义不是C语句,末尾不需要有分号。所以语句printf("%4.1f\n",S(a+b));展开后为printf("%4.1f\n",3.5;*a+b*a+b;);所以程序会出现语法错误。 二十一、有以下程序:#includemain(){unsignedchara=2,b=4,c=5,d;d=a|b;d&=c;printf("%d\n",d);}程序运行后的输出结果是( )。A)3B)4C)5D)6【解析】&按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。|按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4 二十二、有以下程序:#include#includemain(){int*a,*b,*c;a=b=c=(int*)malloc(sizeof(int));*a=1;*b=2,*c=3;a=b;printf("%d,%d,%d\n",*a,*b,*c);}程序运行后的输出结果是( )。A)1,1,3B)2,2,3C)1,2,3D)3,3,3【解析】malloc函数动态分配一个整型的内存空间,然后把函数返回的地址用(int*)强制类型转换为整型指针,再把它赋给a,b,c,即让指针变量a,b,c都指向刚申请的内存空间。所以只有最后一个赋值语句*c=3的值保留在了该空间内,因为a,b,c三个指针变量均指向该空间,所以打印该空间内的数值为3。 二十三、以下叙述中正确的是( )。A)当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据D)C语言中的文件是流式文件,因此只能顺序存取数据【解析】B)选项中打开一个已存在的文件并进行了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。C)选项中在一个程序中当对文件进行了写操作后,不用先关闭该文件然后再打开,才能读到第1个数据,可以用fseek()函数进行重新定位即可。D)选项中,C语言中的文件可以进行随机读写。 操作题:编写函数fun,其功能是:根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代)。程序运行后,若输入精度0.0005,则程序应输出为3.14…。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 Doublefun(doubleeps){Doubles=1.0,s1=1.0;Intn=1;While(s1>=eps)//当某项大于精度要求时,继续求下一项//{s1=s1*n/(2*n+1);//求多项式的每一项//S=s+s1;N++;}Return2*s;} 一、有以下程序:#includemain(){ chara,b,c,d; scanf("%c%c",&a,&b); c=getchar();d=getchar(); printf("%c%c%c%c\n",a,b,c,d);}当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意:回车也是一个字符)1234则输出结果是( )。A)1234B)12C)1234D)123【解析】按照从键盘输入的数据可以判断字符1给了变量a,字符2给了变量b,字符即回车给了变量c,字符3给了变量d。所以打印输出的结果为D)选项。二、有以下程序:#includemain(){ intx=1,y=0,a=0,b=0; switch(x) { case1: switch(y) { case0:a++;break; case1:b++;break; } case2:a++;b++;break; case3:a++;b++; } printf("a=%d,b=%d\n",a,b);}程序的运行结果是( )。A)a=2,b=2B)a=2,b=1C)a=1,b=1D)a=1,b=0【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。所以执行内层switch(y)时只执行了a++,此时a的值为1。然后执行外层case2语句的a++;b++;a为2,b为1。所以结果为B)。、三、以下数组定义中错误的是( )。A)intx[2][3]={1,2,3,4,5,6};B)intx[][3]={0};C)intx[][3]={{1,2,3},{4,5,6}};D)intx[2][3]={{1,2},{3,4},{5,6}};【解析】D)选项中x[2][3]定义的是一个两行三列的二维数组,而在给数组元素赋值时却赋成了三行,所以错误。 四、有以下程序:#includevoidfun(inta[],intn){ inti,t; for(i=0;i}main(){ intk[10]={1,2,3,4,5,6,7,8,9,10},i; fun(k,5); for(i=2;i<8;i++)printf("%d",k[i]); printf("\n");}程序的运行结果是( )。A)321678B)876543C)1098765D)345678【解析】本题中的函数fun()的功能是将数组k中前5个元素倒序,所以返回后数组k中的元素排列是5,4,3,2,1,6,7,8,9,10。所以打印输出k[2]到k[7]元素的值,即321678,所以选择A。六、设有定义:charp[]={'1','2','3'},*q=p;,以下不能计算出一个char型数据所占字节数的表达式是( )。A)sizeof(p)B)sizeof(char)C)sizeof(*q)D)sizeof(p[0])【解析】根据题目中的定义可以知道sizeof(p),计算的是数组p中所有元素所占用的字节数,而不是char型数据所占字节数。 七、有以下程序:#include#includemain(){ charstr[][20]={"One*World","One*Dream!"},*p=str[1]; printf("%d,",strlen(p));printf("%s\n",p);}程序运行后的输出结果是(A )。A)10,One*Dream!B)9,One*Dream!C)9,One*WorldD)10,One*World【解析】p是指向二维字符数组第二行One*Dream!的数组指针,所以长度是10,打印输出的也是该字符串。八、有以下程序:#includemain(){ chars[]="012xy\08s34f4w2"; inti,n=0; for(i=0;s[i]!=0;i++) if(s[i]>='0'&&s[i]<='9')n++; printf("%d\n",n);}程序运行后的输出结果是( )。 A)0B)3C)7D)8【解析】本题中遇到"\"字符循环结束,所以只统计"\"之前的数字字符,所以为3。 九、有以下程序:#includefun(intx,inty){staticintm=0,i=2; i+=m+1;m=i+x+y;returnm;}main(){int
{for(j=2;j
if(i%j==0)break;
if(j>=i)/*如果是素数,放入数组xx中*/
xx[n++]=i;
}}
一·下列叙述中正确的是( )。
A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构
B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况
C)在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况
D)循环队列中元素的个数是由队头指针和队尾指针共同决定
【解析】循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以A)错误;在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以B)与C)错误。
二·下列叙述中正确的是( )。
A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C)顺序存储结构能存储有序表,链式存储结构不能存储有序表
D)链式存储结构比顺序存储结构节省存储空间
【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。
链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。
三·数据流图中带有箭头的线段表示的是( )。
A)控制流
B)事件驱动
C)模块调用
D)数据流
【解析】数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。
四·在软件开发中,需求分析阶段可以使用的工具是( )。
A)N-S图
B)DFD图
C)PAD图
D)程序流程图
【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。
五、在面向对象方法中,不属于"对象"基本特点的是( )。
A)一致性
B)分类性
C)多态性
D)标识唯一性
【解析】对象有如下一些基本特点:
标识唯一性、分类性、多态性、封装性、模块独立性好。
所以选择A)。
六、一间宿舍可住多个学生,则实体宿舍和学生之间的联系是( )。
A)一对一
B)一对多
C)多对一
D)多对多
【解析】因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。
七、在数据管理技术发展的三个阶段中,数据共享最好的是( )。
A)人工管理阶段
B)文件系统阶段
C)数据库系统阶段
D)三个阶段相同
【解析】数据管理发展至今已经历了三个阶段:
人工管理阶段、文件系统阶段和数据库系统阶段。
其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择C)。
八、有三个关系R、S和T如下:
由关系R和S通过运算得到关系T,则所使用的运算为( )。
A)笛卡尔积
B)交
C)并
D)自然连接
【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。
【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。
笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C)错误。
根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D)。
九、以下选项中,能用作数据常量的是( )。
A)115L
B)0118
C)1.5e1.5
D)o115
【解析】A)选项中115L表示115是长整型数据,合法。
B)选项是八进制常量的表示方法,但是在八进制中不能含有数字8,所以B)错误。
C)选项中e后面应该是整数不能是小数1.5,所以C)错误。
D)选项中八进制常量应该是数字"0"开始,而不是字母"o"开始。
十、若有定义intx,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?
(x++):
(y++)中的条件表达式(x-y)等价的是( )。
A)(x-y<0||x-y>0)
B)(x-y<0)
C)(x-y>0)
D)(x-y==0)
【解析】条件表达式:
x=表达式1?
表达式2:
表达式3的含义是:
先求解表达式1,若为非0(真),则求解表达式2,将表达式2的值赋给x。
若表达式1的值为0(假),则求解表达式3,将表达式3的值赋给x。
在本题中与表达式1:
(x-y)等价的是(x-y<0||x-y>0)。
十一、有以下程序:
#include
main()
{ intx=1,y=0;
if(!
x)y++;
elseif(x==0)
if(x)y+=2;
elsey+=3;
printf("%d\n",y);
}
程序运行后的输出结果是( )。
A)3
B)2
C)1
D)0
【解析】在ifelse语句中else总是与离它最近的if配对。
本题目中x为1所以!
x为0,所以执行elseif语句中的内容,判断(x==0)是否成立,因为x为1所以条件不成立,所以elseif内部的if…else语句不再执行,所以y的值还是初始值0。
十二、若有定义:
floatx=1.5;inta=1,b=3,c=2;则正确的switch语句是( )。
A)switch(a+b)
{case1:
printf("*\n");
case2+1:
printf("**\n");}
B)switch((int)x);
case2:
C)switch(x)
{case1.0:
case2.0:
D)switch(a+b)
casec:
【解析】B)选项中switch((int)x);语句中不应该有最后的分号。
switch(expr1),中的expr1不能用浮点类型或long类型,也不能为一个字符串,所以C)错误。
case后面常量表达式的类型必须与switch后面表达式的类型一致,所以D)错误。
十三、有以下程序:
{intn,*p=NULL;
*p=&n;
printf("Inputn:
");scanf("%d",&p);printf("outputn:
");printf("%d\n",p);
该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是( )
A)intn,*p=NULL;
B)*p=&n;
C)scanf("%d",&p)
D)printf("%d\n",p);
【解析】选项B)的正确写法应为p=&n;选项C)的正确写法应为scanf("%d",p);选项D)的正确写法应为printf("%d\n",*p)。
十四、有以下程序:
{ inta[]={2,3,5,4},i;
for(i=0;i<4;i++)
switch(i%2)
{case0:
switch(a[i]%2)
{ case0:
a[i]++;break;
case1:
a[i]--;
}break;
a[i]=0;
for(i=0;i<4;i++)printf("%d",a[i]);printf("\n");
A)0304
B)2050
C)3344
D)3040
【解析】第一次循环i为0,i%2为0,执行switch(a[0]%2)中的case0语句后内容即a[0]++,a[0]的值变成3;第二次循环i的值为1,i%2为1,执行case1:
a[i]=0;所以a[1]的值变成0;第三次循环i的值为2,i%2为0,执行switch(a[2]%2)中的case1语句后的内容a[2]--,a[2]的值变成4;第四次循环i的值为3,i%2为1,执行case1:
a[i]=0;所以a[3]的值变成0。
十五、以下语句中存在语法错误的是( )。
A)charss[6][20];ss[1]="right?
";
B)charss()[20]={"right?
"};
C)char*ss[6];ss[1]="right?
D)char*ss()={"right?
【解析】数组定义后,不可以对数组整体赋值,s是二维数组,因ss[1]是一维字符数组,即字符串,字符串赋值可以使用strcpy(ss[1],"right");这样的形式,而选项A)中对二维数组中的第"1"维(相当于一个一维数组)赋值,是不可以的。
选项B)和D)是定义时对数组初始化,这是可以的。
选项C)中,将字符串在内存中的首地址赋给指针数组的一个元素,这是可以的。
十六、以下不能将s所指字符串正确复制到t所指存储空间的是( )
A)do{*t++=*s++;}while(*s);
B)for(i=0;t[i]=s[i];i++);
C)while(*t=*s){t++;s++}
D)for(i=0,j=0;t[i++]=s[j++];);
【解析】do{*t++=*s++;}while(*s);不能因为当*s='\0'时,while(*s)跳出循环,这样字符串结束标志'\0'没有复制给*t,造成*t不完整。
注意,*t++=*s++是先执行t=*s,然后才进行t=t+1,s=s+1。
B),C),D)都能将'\0'复制过去。
十七、有以下程序:
voidswap(char*x,char*y)
{chart;
t=*x;*x=*y;*y=t;
{char*s1="abc",*s2="123";
swap(s1,s2);printf("%s,%s\n",s1,s2);
程序执行后的输出结果是( )。
A)321,cba
B)abc,123
C)123,abc
D)1bc,a23
【解析】字符串是一个特殊的数组,所以按照数组的规则,s1应该指向的是数组的首地址,即"abc"的第一个字符的地址。
s2指向的是"123"的第一个字符的地址。
调用swap函数之后交换的是两个字符串的第一个字符'a'和'1'的内容,所以打印输出为D)。
十八、在一个C源程序文件中所定义的全局变量,其作用域为( )。
A)由具体定义位置和extern说明来决定范围
B)所在程序的全部范围
C)所在函数的全部范围
D)所在文件的全部范围
【解析】全局变量的作用域是从声明处到文件的结束。
所以选择A)
{ structSp=data[1];
printf("%d\n",++(p.a));
十九、程序运行后的输出结果是( )。
A)10
B)11
D)21
【解析】声明data是结构S数组。
初始化data[0].a=10;data[0].b=100;data[1].a=20;data[1].b=200。
主函数中p=data[1];即p.a=data[1].a;p.b=data[1].b;执行语句printf("%d\n",++(p.a));打印输出时p.a先增1再打印。
p.a=data[1].a=20,先增1等于21。
二十、有以下程序:
#definePT3.5;
#defineS(x)PT*x*x;
{ inta=1,b=2;printf("%4.1f\n",S(a+b));}
A)7.5
B)31.5
C)程序有错无输出结果
D)14.0
【解析】宏定义不是C语句,末尾不需要有分号。
所以语句printf("%4.1f\n",S(a+b));展开后为printf("%4.1f\n",3.5;*a+b*a+b;);所以程序会出现语法错误。
二十一、有以下程序:
{unsignedchara=2,b=4,c=5,d;
d=a|b;d&=c;printf("%d\n",d);}
B)4
C)5
D)6
【解析】&按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
|按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。
2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4
二十二、有以下程序:
{int*a,*b,*c;
a=b=c=(int*)malloc(sizeof(int));
*a=1;*b=2,*c=3;
a=b;
printf("%d,%d,%d\n",*a,*b,*c);
A)1,1,3
B)2,2,3
C)1,2,3
D)3,3,3
【解析】malloc函数动态分配一个整型的内存空间,然后把函数返回的地址用(int*)强制类型转换为整型指针,再把它赋给a,b,c,即让指针变量a,b,c都指向刚申请的内存空间。
所以只有最后一个赋值语句*c=3的值保留在了该空间内,因为a,b,c三个指针变量均指向该空间,所以打印该空间内的数值为3。
二十三、以下叙述中正确的是( )。
A)当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失
B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖
C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据
D)C语言中的文件是流式文件,因此只能顺序存取数据
【解析】B)选项中打开一个已存在的文件并进行了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。
C)选项中在一个程序中当对文件进行了写操作后,不用先关闭该文件然后再打开,才能读到第1个数据,可以用fseek()函数进行重新定位即可。
D)选项中,C语言中的文件可以进行随机读写。
操作题:
编写函数fun,其功能是:
根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代)。
程序运行后,若输入精度0.0005,则程序应输出为3.14…。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
Doublefun(doubleeps)
Doubles=1.0,s1=1.0;
Intn=1;
While(s1>=eps)
//当某项大于精度要求时,继续求下一项//
{s1=s1*n/(2*n+1);//求多项式的每一项//
S=s+s1;
N++;
Return2*s;
一、有以下程序:
{ chara,b,c,d;
scanf("%c%c",&a,&b);
c=getchar();d=getchar();
printf("%c%c%c%c\n",a,b,c,d);
当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意:
回车也是一个字符)
12
34
则输出结果是( )。
A)12
B)12
C)1234
D)12
3
【解析】按照从键盘输入的数据可以判断字符1给了变量a,字符2给了变量b,字符即回车给了变量c,字符3给了变量d。
所以打印输出的结果为D)选项。
二、有以下程序:
{ intx=1,y=0,a=0,b=0;
switch(x)
{ case1:
switch(y)
a++;break;
b++;break;
a++;b++;break;
case3:
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
【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。
在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。
所以执行内层switch(y)时只执行了a++,此时a的值为1。
然后执行外层case2语句的a++;b++;a为2,b为1。
所以结果为B)。
三、以下数组定义中错误的是( )。
A)intx[2][3]={1,2,3,4,5,6};
B)intx[][3]={0};
C)intx[][3]={{1,2,3},{4,5,6}};
D)intx[2][3]={{1,2},{3,4},{5,6}};
【解析】D)选项中x[2][3]定义的是一个两行三列的二维数组,而在给数组元素赋值时却赋成了三行,所以错误。
四、有以下程序:
voidfun(inta[],intn)
{ inti,t;
for(i=0;i}main(){ intk[10]={1,2,3,4,5,6,7,8,9,10},i; fun(k,5); for(i=2;i<8;i++)printf("%d",k[i]); printf("\n");}程序的运行结果是( )。A)321678B)876543C)1098765D)345678【解析】本题中的函数fun()的功能是将数组k中前5个元素倒序,所以返回后数组k中的元素排列是5,4,3,2,1,6,7,8,9,10。所以打印输出k[2]到k[7]元素的值,即321678,所以选择A。六、设有定义:charp[]={'1','2','3'},*q=p;,以下不能计算出一个char型数据所占字节数的表达式是( )。A)sizeof(p)B)sizeof(char)C)sizeof(*q)D)sizeof(p[0])【解析】根据题目中的定义可以知道sizeof(p),计算的是数组p中所有元素所占用的字节数,而不是char型数据所占字节数。 七、有以下程序:#include#includemain(){ charstr[][20]={"One*World","One*Dream!"},*p=str[1]; printf("%d,",strlen(p));printf("%s\n",p);}程序运行后的输出结果是(A )。A)10,One*Dream!B)9,One*Dream!C)9,One*WorldD)10,One*World【解析】p是指向二维字符数组第二行One*Dream!的数组指针,所以长度是10,打印输出的也是该字符串。八、有以下程序:#includemain(){ chars[]="012xy\08s34f4w2"; inti,n=0; for(i=0;s[i]!=0;i++) if(s[i]>='0'&&s[i]<='9')n++; printf("%d\n",n);}程序运行后的输出结果是( )。 A)0B)3C)7D)8【解析】本题中遇到"\"字符循环结束,所以只统计"\"之前的数字字符,所以为3。 九、有以下程序:#includefun(intx,inty){staticintm=0,i=2; i+=m+1;m=i+x+y;returnm;}main(){int
{ intk[10]={1,2,3,4,5,6,7,8,9,10},i;
fun(k,5);
for(i=2;i<8;i++)printf("%d",k[i]);
printf("\n");
A)321678
B)876543
C)1098765
D)345678
【解析】本题中的函数fun()的功能是将数组k中前5个元素倒序,所以返回后数组k中的元素排列是5,4,3,2,1,6,7,8,9,10。
所以打印输出k[2]到k[7]元素的值,即321678,所以选择A。
六、设有定义:
charp[]={'1','2','3'},*q=p;,以下不能计算出一个char型数据所占字节数的表达式是( )。
A)sizeof(p)
B)sizeof(char)
C)sizeof(*q)
D)sizeof(p[0])
【解析】根据题目中的定义可以知道sizeof(p),计算的是数组p中所有元素所占用的字节数,而不是char型数据所占字节数。
七、有以下程序:
{ charstr[][20]={"One*World","One*Dream!
"},*p=str[1];
printf("%d,",strlen(p));printf("%s\n",p);
程序运行后的输出结果是(A )。
A)10,One*Dream!
B)9,One*Dream!
C)9,One*World
D)10,One*World
【解析】p是指向二维字符数组第二行One*Dream!
的数组指针,所以长度是10,打印输出的也是该字符串。
八、有以下程序:
{ chars[]="012xy\08s34f4w2";
inti,n=0;
for(i=0;s[i]!
=0;i++)
if(s[i]>='0'&&s[i]<='9')n++;
printf("%d\n",n);
A)0
B)3
C)7
D)8
【解析】本题中遇到"\"字符循环结束,所以只统计"\"之前的数字字符,所以为3。
九、有以下程序:
fun(intx,inty)
{staticintm=0,i=2;
i+=m+1;m=i+x+y;returnm;
{int
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1