070101《C语言》课程综合练习题.docx
《070101《C语言》课程综合练习题.docx》由会员分享,可在线阅读,更多相关《070101《C语言》课程综合练习题.docx(22页珍藏版)》请在冰豆网上搜索。
![070101《C语言》课程综合练习题.docx](https://file1.bdocx.com/fileroot1/2023-1/5/bd283c3f-e9b6-4ae5-9603-dd7aa04414ec/bd283c3f-e9b6-4ae5-9603-dd7aa04414ec1.gif)
070101《C语言》课程综合练习题
《C语言程序设计》综合练习题
一、单选题
1.C语言中基本数据类型有。
C
A)整型、实型、逻辑型B)整型、字符型、逻辑型
C)整型、实型、字符型D)整型、实型、字符型、逻辑型
2.在C语言中,数字O29是一个。
A
A)八进制数B)十进制数C)十六进制数D)非法数
3.在以下关于C语言的不严格的叙述中,错误的说法是。
A
A)在标识符中,大写字母和小些字母的意义相同
B)有些不同类型的变量可以在一个表达式中运算
C)在赋值表达式中等号 “=”左边的变量和右边的值可以是不同类型
D)同一个运算符号在不同的场合可以有不同的含义
4.下列关于C语言用户标识符的叙述中正确的是。
B
A)用户标识符中可以出现下划线和中划线(减号)
B)用户标识符中不可以出现中划线,但可以出现下划线
C)用户标识符中可以出现下划线,但不可以放在用户标识符的开头
D)用户标识符中可以出现下划线和数字,它们都可以放在用户标识符的开头
【解析】考查C语言中的用户标识符规则,在C语言程序设计中,用户标识符是由字母、数字和下划线组成的,并且第一个字符必须是字母或下划线。
5.结构化程序设计方法中有三种基本控制结构,以下不正确的是。
D
A)顺序结构B)选择结构C)循环结构D)数组结构
6.C语言提供的合法关键字是。
D
A)swicthB)chaC)CaseD)default
7.以下非法的赋值语句是C
A)n=(i=2,++i);B)j++;C)++(i+1);D)x=j>0;
【解析】对表达式不能进行自加自减运算。
8.在以下一组运算符中,优先级最高的运算符是。
A)<=B)=C)%D)&&
【解析】C语言常用的积累运算符的优先级关系是:
逻辑非“!
”>算术运算符>关系运算符>逻辑与“&&”>逻辑或“||”>赋值运算符>逗号运算符。
由于C选项为求余运算符,所以本题正确答案为C选项。
9.以下四个选项中不能看作一条语句的是。
D
A){;}B)a=0,b=0,c=0;C)if(a>0)D)if(b==0)m=1;n=2;
【解析】C语言的基本语句包含控制语句、表达式语句、空语句、复合语句、函数调用语句。
控制语句:
完成一定的控制功能,C语言有9种控制语句,分别是if-else、while、continue、
switch、return、for、do-while、break、goto;
表达式语句:
由各类表达式构成,后面加上一个分号,就可以单独作为一条语句出现在一行,多数情况下含赋值运算符。
复合语句:
由一对大括号将一组语句序列括起来形成一个程序段,经常出现在选择或循环语句中。
空语句:
只有一个分号,表示什么也不做。
函数调用语句:
由函数名、圆括号内加实参表和分号组成。
本题中D选项为三条语句,一条控制语句,链条表达式语句。
正确答案为D选项。
10.能将高级语言编写的源程序转换为目标程序的软件是。
D
A)汇编程序B)编辑程序C)解释程序D)编译程序
11.以下选项中合法的实型常数是。
C
A)5E2.0B)E-3C).2E0D)1.3E
【解析】以指数形式表示实数时,字母e或E之前必须有数字,且e后面指数必须为整数。
12.依据C语言的语法规则,下列合法标识符是A
A)ElseB)elseC)user$2D)5_examp
【解析】标识符的定义有明确的规则:
(1)标识符只能由字母、数字、下划线三者构成;
(2)标识符的首字符必须是字母或者下划线;(3)标识符命名对字母大小写敏感;(4)标识符定义不能和C语言关键字(KeyWords)相同。
C语言中标识符对大小写敏感,sum和SUM是不同的标识符。
13.以下选项中合法的用户标识是。
B
A)longB)_2TestC)3DmaxD)A.dat
【解析】选项中A为保留字;选项C没有以字母或者“_”开头;选项D中不能有“.”
14.在C语言中,字符型数据在内存中的存储形式是。
D
A)原码B)补码C)反码D)ASCII码
【解析】数据在内存中是以二进制形式存放的。
数值是以补码表示的。
c的char数据属于基本类型,在内存中字符的存储实际上是把字符相对应的ASCII代码放到存储单元中的。
而这些ASCII代码值在计算机中也是以二进制形式存放的。
这个与整型的存储很相似。
因此这两类之间的转换也比较方便!
整型:
一个正数的补码和其原码的形式相同。
而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”;实型:
在内存中占4个字节,是按照指数形式存储的,实型数据分为小数部分和指数部分,分别存放!
计算机用二进制表示小数部分,用2的幂次来表示指数部分!
15.以下非法的赋值语句是。
C
A)n=(i=2,++i);B)j++;C)++(i+1);D)x=j>0;
【解析】对表达式不能进行自加自减运算。
16.已定义c为字符型变量,则下列正确的赋值语句是。
D
A)c='66';B)c="66";C)c="B";D)c=66;
17.已知小写字母的ASCII码为97,对于inta=99,b='b';printf(“%c,%d”,a,b);的结果是。
B
A)99,bB)c,98C)99,98D)c,b
【解析】字符类型变量用char来定义,特别要注意字符数据在内存中的存储方式:
字符数据在内存中是用字符对应的ASCII码存储,其存储形式实质是采用整数形式,由于ASCII码集合中有256个字符,因此用0~255这个范围内的256个整数分别与每个字符对应。
因此字符型数据和整型数据在一定范围(0~255)内,形式上可以相互引用。
表现在这两种类型的变量能够以对方形式常量来赋值,以对方的形式来输出,还可以同时出现在算数表达式中参与运算
int n='a'; /*相当于n=97*/
char c=65; /*相当于c='A',A的ASCII码是65*/
printf("n=%d,n=%c",n,n);/*输出:
c=97,n=a*/
printf("c=%d,c=%c",c,c);/*输出:
n=65,n=A*/
虽然字符型数据和整型数据在一定范围内可以通用,但其外在表现形式并不影响各自的数据类型,上例中n本质上还是整型变量,c本质上还是字符型变量。
18.若变量a和i已正确定义,且i已正确赋值,合法的语句是。
B
A)a=1B)++i;C)a=a++=5D)a=int(i)
【解析】C语言的语句必须以分号结束,选项A是错误的。
赋值表达式等号的左边只能是变量,而不能是表达式,选项C中含有a++=5,是错误的。
选项D中的强制转换类型必须用圆括号将int括起来,也是不正确的。
19.假定x和y为double型,则表达式x=2,y=x+3/2的值是。
D
A)3.500000B)3C)2.000000D)3.000000
【解析】算出来结果为3,排除A和C选项;又因为是double型,所以D选项为正确答案。
20.以下程序的输出结果是。
C
main()
{
inta=5,b=4,c=6,d;
printf(“%d\n”,d=a>b?
(a>c?
a:
c):
(b));
}
A)5B)4C)6D)不确定
【解析】本题考察条件表达式。
简单的条件表达式(条件表达式?
表达式1:
表达式2)可以用来代替if语句进行赋值。
详见教材102页。
21.设a=3,b=4,c=-5,则逻辑表达式:
a||b+c&&b==c的值是。
B
A)1B)0C)非0D)语法错
【解析】运算符优先级由高到底为算术运算符---关系运算符---&&和||---赋值运算符。
其中&&和||的结合方向为从左到右
22.表示关系x<=y<=z的c语言表达式为。
A
A)(x<=y)&&(y<=z)B)(x<=y)AND(y<=z)
C)x<=y<=zD)(x<=y)&(y<=z)
【解析】C语言中没有关键字AND,逻辑与运算符是&&,不是AND,因此选项B是错误的;而&是C语言的位与运算符,因此选项D是错误的;选项C是数学表达式,也是错误的。
23.设有变量intx=0,y=1,z=1,则运行表达式:
x=y++>z--后,x,y,z的值分别是。
D
A)1,1,1B)1,2,0C)0,1,1D)0,2,0
【解析】注:
前缀是先增值后引用,后缀是先引用再增值
24.已知inta=4,b=5;,执行表达式a=a>b后,变量a的值为。
A
A)0B)1C)4D)5
【解析】C语言常用的积累运算符的优先级关系是:
逻辑非“!
”>算术运算符>关系运算符>逻辑与“&&”>逻辑或“||”>赋值运算符>逗号运算符。
由于关系运算符优先级别高于赋值运算符,所以先执行a>b,得到结果为假,即0,所以变量a的值为0。
25.能正确表示逻辑关系“a≥10或a≤0”的C语言表达式是。
B
A)a>=10ora<=0B)a>=10||a<=0
C)a>=10&&a<=0D)a>=10|a<=0
26.设有定义inta=3,b=4,c=5;,则以下表达式中,值为0的表达式是。
D
A)a&&bB)a<=bC)a||b+c&&b-cD)!
((a
c||1)
27.以下合法的赋值语句是。
B
A)x=(1,y=2);B)++x;C)x=y=15;D)y=int(x);
28.以下选项中,与k=n++完全等价的表达式是。
A
A)k=n,n=n+1B)n=n+1,k=nC)k=++nD)k+=n+1
【解析】在本题中,k=n++为后辍运算,根据其运算规则,应先把n的值赋给k,然后n的值再加上1,选项A的表达式与本题中的表达式等价。
29.若有定义:
“inta=8,b=5,c;”,执行语句“c=a/b+0.4”后,c的值为。
A)1.4B)1C)2.0D)2
【解析】由于a,b,c都是整型变量,所以每一步计算都要取整,所以选B。
不同类型数据间是可以进行转换和运算的。
整型、字符型、实型数据可以混合运算,如果表达式内的运算量的类型不同,不同类型的数据要先转换成同一类型,在进行运算。
转换方向由低到高为:
char/short、int、unsigned、long、float、double。
当然也可以使用强制类型转换符来转变类型,但变量本身的类型并未发生变化。
例如:
(double)n,(int)(a+b)。
30.设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值是。
C
A)7B)8C)9D)10
31.已定义c为字符型变量,则下列语句中正确的是。
D
A)c='97';B)c="97";C)c="a";D)c=97;
32.已知charch='A';且表达式ch=(ch>='A'&&ch<='Z')?
(ch+32):
ch的值是。
B
A)AB)aC)ZD)出错
【解析】考察条件表达式。
见教材102页。
首先执行(ch>='A'&&ch<='Z'),为1。
接着执行(ch+32)。
因此结果是小写字母a。
33.设有如下程序段:
intx=2,y=3;
printf("%d\n",(x,y));
则以下叙述中正确的是。
B
A)输出语句中格式说明符的个数少于输出项的个数,不能正确输出
B)运行时产生出错信息
C)输出值为2
D)输出值为3
34.对于循环for(k=16;k>0;k-=3)putchar(‘*’);输出是。
B
A)*****B)******C)*******D)无限循环
【解析】在k分别为16,13,10,7,4,1的时候,分别输出一个*。
putchar()函数(字符输出函数)的作用是向终端输出一个字符。
用putchar()函数可以输出能在屏幕上显示的字符,也可以输出控制字符,如putchar(’\n’)的作用是输出一个换行符,使输出的当前位置移到下一行的开头。
35.已知inti=1;执行语句while(i++<4)后,变量i的值为。
C
A)3B)4C)5D)6
【解析】i++是先进行其他运算,运算终了后再将i加1。
所以循环中过程如下:
i=0
判断i<4:
成立
i=i+1,于是i=1
继续循环:
判断i<4:
成立
i=i+1,于是i=2
继续循环:
判断i<4:
成立
i=i+1,于是i=3
继续循环:
判断i<4:
成立
i=i+1,于是i=4
继续循环:
判断i<4:
不成立
i=i+1,于是i=5
跳出循环,程序结束
36.已知:
inta[][3]={1,2,3,4,5,6,7,8,9,0};则数组a的第一维的大小是。
C
A)2B)3C)4D)无法确定;
【解析】此数组共3列。
应该是
在C语言中如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
系统会根据总个数和第二维的长度算出第一维的长度。
本题中一共有10个元素,每行3列,显然可以确定行数为4.见教材138.
37.判断字符串的长度,应该使用的函数是。
A)strcatB)strcmpC)strcpyD)strlen
【解析】
strlen(string)
---字符串长度
strcpy(字符数组1,字符串2)
---STRingCoPY(字符串复制)的简写。
它是“字符串复制函数”,作用是将字符串2复制到字符数组1中去。
见教材147页。
strcat(字符数组1,字符数组2)
---(字符串连接)其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值---字符数组1的地址。
strcmp(string,string)
---比较2个字符串,0为相同,>0前1个大,<0后1个大
38.初始化多维数组的语句中,可以默认的是。
B
A)最后一个下标界B)第1个下标界
C)第2个下标界D)以上都不对
39.若有:
inta[10],*p=&a[0];,关于数组名a的不正确的说法是。
A
A)a是个数组指针B)数组名a表示数组的首地址
C)数组名a与a[0]等价D)a和p都指向同一个存储单元
【解析】一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。
指针变量即然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。
所谓数组元素的指针就是数组元素的地址。
在本题中,定义a为包含10个整型数据的数组,定义p为指向整型变量的指针变量。
并且把a[0]元素的地址赋给指针变量p,也就是使p指向a数组的第0号元素。
C语言规定数组名代表数组中首元素的地址。
因此下面两个语句等价:
P=&a[0];p=a;注意数组名a不代表整个数组,上述“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”而不是“把数组a各元素的值赋给p”。
40.设有定义inta[]={1,5,7,9,11,13},*p=a+3;则*(p-2),*(a+4)的值是。
A
A)511B)19C)59D)有错误
【解析】因为*p=a+3它的作用是将a数组第4个元素a[3]的地址赋给指针变量p(而不是赋给*p),a代表数组首元素的地址,a+3代表数组中的第4个元素a[3]。
在数组中的对应关系如下图。
按C语言的规定:
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,而不是将p的值(地址)简单的加1。
另外,如果p的初值为&a[0],则p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素,这里需要特别注意的是a代表数组首元素的地址。
*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
在本题中*(a+4)=a[4]=11详见教材230页。
41.C语言中,函数返回值的类型是由。
B
A)return语句中的表达式类型决定
B)调用函数的主调函数类型决定
C)调用函数时的临时类型决定
D)定义函数时所指定的函数类型决定
42.执行下面程序:
main()
{
intx=1,y=1,z=1;
x=x+++y+++z++;
printf("%d,%d,%d",x,++y,z++);
}
输出的结果为。
A
A)4,3,2B)3,3,2C)3,3,3D)3,2,2
【解析】语句x=x+++y+++z++;中++运算符均为后缀,所以是先引用后增值,此语句又可写为x=x+y+z;x++;y++;z++;这样我们便很容易看出结果为x=4;y=2;z=2。
43.以下程序段的输出结果是。
A
intm=10;
while(m>7)
{
m--;
printf(“%d\n”,m);
}
C)9
8
7
6
B)10
9
8
7
A)9
8
7
D)10
9
8
【解析】复习一下while循环的执行过程:
(1)计算while一对圆括号中表达式的值。
当值为非零时,执行步骤
(2);当值为零时,执行步骤(4)。
(2)执行循环体中语句。
(3)转去执行步骤
(1)。
(4)退出while循环。
由以上while循环的一般过程来看,只有当while后面的括号中表达式的值为零时才停止循环。
本题中,当m=7是循环停止,也就是说最后一个输出的应是7.开始m被赋予10,进入循环体,由于m--;所以m自减1为9,所以第一个输出的应是9.
44.若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0)
s=a;for(b=1;b<=c;b++)s=s+1;则与上述程序段功能等价的赋值语句是。
B
A)s=a+b;B)s=a+c;C)s=s+c;D)s=b+c;
【解析】掌握两点:
一、a赋给了s;二、s执行c次自加;所以最终相当于将a+c赋给了s。
45.以下程序中,while循环的循环次数是。
D
main()
{
inti=0;
while(i<10)
{
if(i<1)continue;
if(i==5)break;
i++;
}
……
}
A)1B)10C)6D)死循环,不能确定次数
【解析】在循环中,如果执行continue,将直接开始下一次循环,不继续执行continue下面的语句。
进入循环时,i=0,当执行到if(i<1)continue;一句时,将执行continue命令,直接开始下一次循环,i的值始终没有变,循环条件(i<10)将一直满足下去。
所以,程序将一直无法退出循环,即死循环。
46.当对两个字符串进行比较时,应该使用的函数是。
B
A)strcatB)strcmpC)strcpyD)strlen
47.若有定义“intk,*q;”,则下列各选项中赋值表达式正确的是。
B
A)q=(&k+1)B)q=&kC)q=kD)*q=&k
【解析】
(1)本题的定义语句中,在q前面有一个*号说明符,表示q是一个指针变量,而C语言规定,在指针变量中只能存放存储单元(即变量)的地址。
(2)因为在定义中,q的基类型为int,所以q中只能存放int类型变量的地址。
(3)在C程序中&号是求地址符,表达式&k的值是变量k在内存中的地址,而*号的作用是求地址指向单元的值。
(4)现在来看看选项C和D。
C中,是把整型变量直接赋给指针变量q,由于赋值不兼容性,这是错误的。
D中,企图把k的地址赋给一个整型变量(*p在此可代表一整型变量),这也是不允许的,地址值不可能转换为一个整数。
(5)关于A,还得声明一点,地址符&只能应用于变量和以后将要介绍的数组元素,不可以用于表达式,常量或者被说明为register的常量。
因此A也不正确。
(6)那答案只能是B,因为此处q中只能存放int类型的地址,而k是int型,&k又是k的地址,B当然是正确的。
48.若有以下定义:
chars[20]=“programming”,*ps=s;则不能代表字符g的表达式是。
A
A)ps+3B)s[3]C)ps[3]D)ps+=3,*ps
【解析】
1、C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量。
2、指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
详见教材231页。
49.以下能正确定义数组并正确赋初值的语句是。
C
A)intN=5,b[N][N];B)inta[1][2]={{1},{3}};
C)intc[2][]={{1,2},{3,4}};D)intd[3][2]={{1,2},{34}};
【解析】如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省!
系统会根据总个数和第二维的长度算出第一维的长度。
详见教材p138
50.假设已定义charc[8]="test";inti;则下面的输出函数调用中错误的是。
D
A)printf("%s",c);B)for(i=0;i<8;i++)printf("%c",c[i]);
C)puts(c)D)for(i=0;i<8;i++)puts(c[i]);
【解析】首先A、B两个选项是没有问题的,puts函数一般形式为puts(字符数组),其作用是输出字符串,所以D选项是错误的。
51.下程序段:
chars[20]="xyz",*sp=s;strcat(sp,"12345");puts(sp);的输出结果是。
A
A)xyz12345B)12345xyzC)12345D)xyz
【解析】strcat(字符数组1,字符数组2)---(字符串连接)其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值---字符数组1的地址。
52.在执行inta[][3]={{1,2},{3,4}};语句后a[1][2]的值是。
C
A.3B.4C.0D.2
【解析】考查知识点:
二维数组的初始化inta[][3]={{1,2},{3,4}};
初始化的数组元素如下:
53.已知:
inta[][3]={1,2,3,4,5,6,7,8,9,0};则数组a的第一维的大小是。
C
A.2B.3C.4D.无法确定;
【解析】此数组共3列。
应该是
在C语言中如果对全部元素都