C语言3.docx
《C语言3.docx》由会员分享,可在线阅读,更多相关《C语言3.docx(15页珍藏版)》请在冰豆网上搜索。
![C语言3.docx](https://file1.bdocx.com/fileroot1/2023-7/6/63767b12-5158-4ba6-9797-0cd3380d3bc1/63767b12-5158-4ba6-9797-0cd3380d3bc11.gif)
C语言3
******A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。
链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误
*****数据流图中带有箭头的线段表示的是
【解析】数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。
******【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。
******在面向对象方法中,不属于"对象"基本特点的是( )。
A)一致性
B)分类性
C)多态性
D)标识唯一性
【解析】对象有如下一些基本特点:
标识唯一性、分类性、多态性、封装性、模块独立性好。
所以选择A)。
*****【解析】数据管理发展至今已经历了三个阶段:
人工管理阶段、文件系统阶段和数据库系统阶段。
其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位
*****有三个关系R、S和T如下:
由关系R和S通过运算得到关系T,则所使用的运算为( )。
A)笛卡尔积
B)交
C)并
D)自然连接
【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。
*****设变量已正确定义并赋值,以下正确的表达式是( )。
A)x=y+z+5,++y
B)int(15.8%5)
C)x=y*5=x+z
D)x=25%5.0
【解析】B)与D)选项中取模运算符%的左右两个操作数均应为整数,所以B)、D)错误。
C)选项中不能将x+y的值赋给表达式y*5,所以C)错误。
*****若有定义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);
{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)错误。
######有以下程序:
#include
main()
{ inty=9;
for(;y>0;y--)
if(y%3==0)printf("%d",--y);
}
程序的运行结果是( )。
A)852
B)963
C)741
D)875421
【解析】第一次for循环,y的值为9,y%3的值为0,满足条件打印--y,即先减一后打印,所以打印8;第二次for循环,y的值为7,y%3的值为1,不执行打印语句;第三次for循环,y的值为6,y%3的值为0,满足条件打印--y,即先减一后打印,所以打印5;第四次for循环,y的值为4,不满足if条件,不执行打印语句;第五次for循环,y的值为3,满足if条件,打印输出2;第六次for循环,y的值为1,不满足条件,不执行打印语句。
@@@@@@有以下程序:
#include
intadd(inta,intb){return(a+b);}
main()
{intk,(*f)(),a=5,b=10;
f=add;
…
}
则以下函数调用语句错误的是( )。
A)k=f(a,b);
B)k=add(a,b);
C)k=(*f)(a,b);
D)k=*f(a,b);
【解析】D)选项中*f(a,b)表示调用后返回一个指向整型数据的地址指针,即该函数的返回值为指针类型,所以不能将其赋值给整形变量k。
%%%%%%有以下程序:
#include
main()
{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)。
%%%%%%%下列定义数组的语句中,正确的是( )。
A)#defineN10
intx[N];
B)intN=10;
intx[N];
C)intx[0..10];
D)intx[];
【解析】数组说明的一般形式为:
类型说明符 数组名[常量表达式]。
B)中N是变量,不能用变量定义数组长度。
C)选项中数组长度是非法的一串数字。
定义数组时必须为其指明长度,D)选项中数组长度为空,所以非法。
######以下语句中存在语法错误的是( )。
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)中,将字符串在内存中的首地址赋给指针数组的一个元素,这是可以的。
#######以下语句中存在语法错误的是( )。
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'复制过去。
*******有以下程序:
#include
voidswap(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,cba
B)abc,123
C)123,abc
D)1bc,a23
【解析】字符串是一个特殊的数组,所以按照数组的规则,s1应该指向的是数组的首地址,即"abc"的第一个字符的地址。
s2指向的是"123"的第一个字符的地址。
调用swap函数之后交换的是两个字符串的第一个字符'a'和'1'的内容,所以打印输出为D)。
在一个C源程序文件中所定义的全局变量,其作用域为( )。
A)由具体定义位置和extern说明来决定范围
B)所在程序的全部范围
C)所在函数的全部范围
D)所在文件的全部范围
#####在一个C源程序文件中所定义的全局变量,其作用域为( )。
A)由具体定义位置和extern说明来决定范围
B)所在程序的全部范围
C)所在函数的全部范围
D)所在文件的全部范围
【解析】全局变量的作用域是从声明处到文件的结束。
所以选择A)
#####以下叙述中错误的是( )。
A)可以通过typedef增加新的类型
B)可以用typedef将已存在的类型用一个新的名字来代表
C)用typedef定义新的类型名后,原有类型名仍有效
D)用typedef可以为各种类型起别名,但不能为变量起别名
【解析】关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型,所以A)错误。
####有以下程序:
#include
structS
{ inta,b;}data[2]={10,100,20,200};
main()
{ structSp=data[1];
printf("%d\n",++(p.a));
}
程序运行后的输出结果是( )。
A)10
B)11
C)20
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。
#####有以下程序:
#include
#definePT3.5;
#defineS(x)PT*x*x;
main()
{ 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;);所以程序会出现语法错误。
#####有以下程序:
#include
main()
{unsignedchara=2,b=4,c=5,d;
d=a|b;d&=c;printf("%d\n",d);}
程序运行后的输出结果是( )。
A)3
B)4
C)5
D)6
【解析】&按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
|按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。
2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4
######有以下程序:
#include
#include
main()
{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的功能是:
计算如下公式前n项的和并作为函数值返回。
######例如,当形参n的值为10时,函数返回值为9.612558。
请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
doublefun(intn)
{inti;doubles,t;
/**********found**********/
s=__1__;
/**********found**********/
for(i=1;i<=__2__;i++)
{t=2.0*i;
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/__3__;
}
returns;
}
main()
{intn=-1;
while(n<0)
{printf("Pleaseinput(n>0):
");scanf("%d",&n);}
printf("\nTheresultis:
%f\n",fun(n));
}
下列给定程序中函数fun的功能是:
统计substr所指的子符串在str所指的字符串中出现的次数。
例如,若字符串为aaas1kaaas,子字符串为as,则应输出2。
请改正程序中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!
#include
intfun(char*str,char*substr)
{inti,j,k,num=0;
/************found************/
for(i=0,str[i],i++)
for(j=i,k=0;substr[k]==str[j];k++,j++)
/************found************/
If(substr[k+1]=='\0')
{num++;
break;
}
returnnum;
}
main()
{
charstr[80],substr[80];
printf("Inputastring:
");
gets(str);
printf("Inputasubstring:
");
gets(substr);
printf("%d\n",fun(str,substr));
}
#######编写函数fun,其功能是:
根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代)。
程序运行后,若输入精度0.0005,则程序应输出为3.14…。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
doublefun(doubleeps)
{
}
main()
{doublex;voidNONO();
printf("Inputeps:
");
scanf("%lf",&x);printf("\neps=%lf,PI=%lf\n",x,fun(x));
NONO();
}
voidNONO()
{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。
*/
FILE*fp,*wf;
inti;
doublex;
fp=fopen("in.dat","r");
wf=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(fp,"%lf",&x);
fprintf(wf,"%lf\n",fun(x));
}
fclose(fp);
fclose(wf);
}