C语言测试试题及答案.docx
《C语言测试试题及答案.docx》由会员分享,可在线阅读,更多相关《C语言测试试题及答案.docx(127页珍藏版)》请在冰豆网上搜索。
![C语言测试试题及答案.docx](https://file1.bdocx.com/fileroot1/2023-2/13/eec08019-6dc0-4d23-85a6-8562ce6720a4/eec08019-6dc0-4d23-85a6-8562ce6720a41.gif)
C语言测试试题及答案
C语言程序
第一章C语言程序设计初步
一、主要知识点
(一)程序设计语言的发展
1、机器语言2、汇编语言3、面向过程的语言4、面向对象的程序设计语言
(二)C程序设计语言的执行过程
1、编辑2、编译3、连接4、执行
(三)用库函数组装C程序
例1:
计算2.1715的正弦值。
#include“math.h”
main()
{
floata;/*定义a为实型变量*/
a=sin(2.1715);/*调用sin函数*/
printf(“%f\n”,a);/*调用printf函数,输出a的值*/
}
程序详解:
1、在本例中用到的sin函数称为数学函数,它是为了用户使用方便,由一批厂家开发编写的函数,并不是C语言的一部分。
在使用数学函数时,往往要用到函数执行时所需的一些信息(例如宏定义),这些信息包含在“math.h”中。
因此在程序开头用#include“math.h”将有关的标头文件包括到程序中。
2、一个C语言源程序文件由一个或多个函数组成,C语言的基本组成单位是函数。
一个完整的C语言程序有且只有一个称为主函数的main函数,程序总是从main函数开始执行,调用其它函数后再回到main函数,在main函数中结束整个程序的运行。
3、main是函数名称,没有参数可以不写,但圆括号不能省略,main()后面有一对花括号,花括号内的部分称为函数体,main函数可以在程序的任意位置。
4、C规定每个语句以分号(;)结束,分号是语句不可缺少的组成部分,每行中可以写多条语句。
5、/*与*/之间为注释信息,对程序运行结果不发生影响,也不被编译,注释说明可以放在语句的任意位置。
6、floata;此语句是把a定义为一个实型变量。
7、C语言本身没有输入、输出语句,本例使用prinft函数输出数据。
prinft函数的括号内包括两部分内容:
双引号内的部分、双引号外的部分。
双引号内的部分是“格式字符串”,用于指定输出双引号外的变量的打印格式。
此例中双引号中有一个”%f”,它是输出一个保留小数点后6位数字的格式字符,小数点前的位数不指定。
二、经典例题详解
例2:
一个C程序的执行是从____。
(A)本程序的main函数开始,到main函数结束
(B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束
(C)本程序的main函数开始,到本程序文件的最后一个函数结束
(D)本程序文件的第一个函数开始,到本程序main函数结束
答案:
C
详解:
一个C语言源程序文件由一个或多个函数组成。
一个完整的C语言程序有且只有一个称为主函数的main函数,程序总是从main函数开始执行,调用其它函数后再回到main函数,在main函数中结束整个程序的运行。
例3、以下叙述不正确的是____。
(A)一个C源程序可由一个或多个函数组成
(B)一个C源程序必须包含一个main函数
(C)C程序的基本组成单位是函数
(D)在C程序中,注释说明只能位于一条语句后面
答案:
D
详解:
/*与*/之间为注释信息,对程序运行结果不发生影响,也不被编译,注释说明可以放在语句的任意位置。
三、习题
(一)选择题
1、以下叙述正确的是____。
(A)在C程序中,main函数必须位于程序的最前面
(B)C程序的每行中只能写一条语句
(C)C语言本身没有输入输出语句
(D)在对一个C程序进行编译的过程中,可发现注释中的拼写错误
2、C语言规定:
在一个源程序中,main函数的位置____。
(A)必须在最开始
(B)必须在系统调用库函数的后面
(C)可以任意
(D)必须在最后
3、一个C语言程序是由____。
(A)一个主程序和若干子程序组成
(B)函数组成
(C)若干过程组成
(D)若干子程序组成
(二)填空题:
1、一个C源程序中至少包括一个________。
2、在一个C源程序中,注释部分两侧的分界符分别为________和________。
第二章数据描述与基本操作
一、主要知识点
(一)C的基本数据类型
整型
基本类型字符型
实型(浮点型)单精度型
枚举类型双精度型
数据类型构造类型
指针类型
空类型
(二)常量和符号常量
1、常量定义:
在程序运行过程中,其值不能被改变的量称为常量。
常量常区分不同的类型,如12、0、-3为整型常量,’a’、’D’为字符常量。
2、符号常量:
用一个标识符代表一个常量的,称为符号常量,即标识符形式的常量。
常量不同于变量,它的值在作用域内不能改变,也不能再被赋值。
例1:
已知商品的单价及数量求商品的总价值。
#definePRICE30
main()
{
intnum,total;
num=10;
total=num*PRICE;
printf(“total=%d”,total);
}
输出结果:
total=300
程序详解:
1、程序中用#define命令行定义PRICE代表常量30,此后凡在此文件中出现的PRICE都代表30,可以和常量一样进行运算。
2、符号常量不同于变量,它的值在其作用域内不能改变,也不能再被赋值。
如再用以下赋值语句给PRICE赋值:
PRICE=40;是错误的。
(三)变量
1、变量定义:
其值可以改变的量称为变量。
2、标识符的命名规范
和其它高级语言一样,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符,C语言中的标识符命名规范为:
①变量名只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划表。
②C语言中标识符的长度(字符个数)无统一规定,随系统而不同。
许多系统(如IBMPC的MSC)取8个字符,假如程序中出现的变量名长度大于8个字符,则只有前面8个字符有效,后面的不被识别。
③C语言有32个关键字(例如if、else、while)它们已有专门含义,不应用采用与它们同名的变量名。
④C语言将大写字母和小写字母认为是两个不同字。
例2:
在下列符号中,可以选用哪些作变量名?
哪些不可以?
a3B3aB∏+a-b*x$_b5_ifnext_daye_2OK?
IntegerMAXNUMBERi*j
答案:
_b5_a3Bnext_daye_2MAXNUMBER可作变量名,其它的作变量名不可以。
详解:
①MAXNUMBER可作变量名。
习惯上符号常量名用大写,变量名用小写以示区别,但大写字母作变量名并无错误。
②if、integer属于保留字,保留字不可作变量名。
③∏+a-b*x$OK?
i*j不可作变量名,因为变量名只能由字母、数字和下划线三种字符组成。
④3aB不可作变量名,因为变量名的第一个字母必须为字母或下划线。
(四)整型数据
1、整型常量
整型常量即整常数。
C语言整常数可用以下三种表示形式。
①十进制表示。
如231、-56.478
②八进制表示。
以0开头的数是八进制数。
如0123即(123)8=1*82+2*81+3*80=64+16+3=83。
③十六进制表示。
以0x开头的数是16进制。
如0x123即(123)16=1*162+2*161+3*160=256+32+3=291。
2、整型变量
整型变量分为:
基本型、短整型、长整型、和无符号型四种。
①基本型,以int表示
②短整型,以shortint表示或以short表示
③长整型,以longint表示,或以long表示
④无符号型,存储单元中全部二进制位(bit)用作存放数本身,而不包括符号。
无符号型中又分为无符号整型、开符号短整型和无符号长整型,分别以unsignedint、unsignedshort和unsignedlong表示。
3、整型数据的取值范围
C标准没有具体规定各类型所占内存字节数,各种机器处理上有所不同,以IBMPC为例,数的范围如表2.1所示。
表2.1
所占位数
数的范围
Int
16
-32768~32767即-215~(215-1)
short[int]
16
-32768~32767即-215~(215-1)
Long[int]
32
-2147483648~2147483647即-231~(231-1)
Unsigned[int]
16
0~65535即0~(216-1)
Unsignedshort
16
0~65535即0~(216-1)
unsignedlong
32
0~4294967295即0~(232-1)
4、整型常量的分类
①一个整常量,如果其值在-32768~32767范围内,认为它是int型,它可以赋值给int型和longint型变量。
②一个整常量,如果其值超过了上述范围,而在-2147483648~2147483647范围内,则认为它是longint型,可以将它赋值给一个longint型变量。
③如果某一计算机系统的C版本确定的shortint与int型在内存中占据的长度相同,则一个int型的常量出同时一个shortint型常量。
④常量中无unsigned型。
但一个非负值的整常量可以赋值给unsigned型整变量,只要它的范围不超过变量的取值范围即可。
例如:
将50000赋给一个unsignedint型变量是可以的,而将70000赋给它是不行的(溢出)。
⑤在一个整常量后面加一个字母l或L,则认为是longint型常量。
(五)实型数据
1、实型常量
实数在C语言中又称为浮点数。
实数有两种表示形式:
①十进制形式。
它由数字和小数点组成(注意必须有小数点)。
例如:
0.123、.123、123.0、0.0都是十进制数形式。
②指数形式。
如123.56e4或123.56E4都代表123.56*104。
但字母e(或E)之前必须有数字,e后面指数必须为整数。
例如:
e3、2.1e3.5、.e3、e等都不是合法的指数形式。
例3:
下面四个选项中,均是不合法的浮点数的选项是_____。
(A)160.0.12e3(B)1232e4.2.e5
(C)-.18123e40.0(D)-.e3.2341e3
答案:
B
详解:
①160.0.12-.18123e40.0.2341e3是实数的十进制形式或指数形式。
②e32e4.2.e5-.e3不是正确的指数形式。
因为正确的字母e(或E)之前必须有数字,e后面指数必须为整数。
对于数据表示形式.e5以及-.e3,e前的.与-.不是有效的数字表示形式。
③123是整数形式。
2、实型变量
C实型变量分为单精度(float型)和双精度(double型)两类。
在一般系统中,一个单精度型数据在内存中占4个字节(32位),一个double型数据占8个字节。
单精度实数提供7位有效数字,数值的范围随机器系统而异。
在IBMPC中,单精度实数的范围约为10-38~1038,双精度实数的范围约为10-308~10308。
例4:
main()
{floata;
a=111111.666666;
printf(“%f”,a);
}
输出结果:
111111.640621
程序详解:
①一个实型常量不分float型和double型。
一个实型常量可以赋给一个float型或double型变量。
根据变量的类型截取实型常量中相应的有效位数字。
②由于float型变量只能接收7位有效数字,因此在把111111.666666赋给a时,a只接收了111111.6,由于输出函数printf中的%f格式表示输出小数点后的6位小数,所以111111.6后的40621属于无意义数字。
③如果a改为double型,则能全部接收上述12位数字。
(六)字符型数据
1、字符常量:
①普通形式的字符常量:
用引号(即撇号)括起来的一个字符,如’a’、’D’、’$’、’?
’等都是字符常量。
②转义符:
以“\”开头的字符序列。
常用的以“\”开头的特殊字符见表2.2
表2.2
字符形式
功能
\n
换行
\t
横向跳格
\v
竖向跳格
\b
退格
\r
回车
\f
走纸换页
\\
反斜杠字符
\’
单引号字符
\ddd
1到3位8进进制所代表的字符
\xhh
1到2位16进制数所代表的字符
例5:
若有说明语句:
charc=’\729’;则变量c_____。
(A)包含1个字符(B)包含2个字符
(C)包含3个字符(D)说明不合法
答案:
D
详解:
”\”后可以有1到3位8进制所代表的字符,本题中”\”后的”72”属于8进制所代表的字符,而”9”则不属于8进制位所代表的字符,则’\729’中包含了两个字符常量’\72’和’9’。
而字符常量是用引号(即撇号)括起来的一个字符,所以答案为D。
2、字符变量
字符变量是用来存放字符常量。
注意只能存放一个字符。
3、字符数据在内存中的存储形式
将一个字符常量存放到一个字符变量中,实际上并不是把该字符本身存放到内存单元中去,而是将该字符的相应的ASCII码值存放到存储单元中去。
例6:
将小写字母转换成大写字母
main()
{charc1;
c1=’a’;
c1=c1-32;
printf(“%c”,c1);
}
输出结果:
A
程序详解:
①’a’的ASCII码为97,所以c1=’a’;语句的功能是把97赋值给了c1。
②c1=c1-32;语句的功能是把97-32的值65赋值给c1。
③printf函数中的%c格式表示以字符方式输出。
ASCII码值为65的字符为A,所以运行结果为:
A
(七)字符串常量
字符常量是用一对双引号括起来的零个或多个字符序列。
C规定以字符’\0’作为字符串结束标志。
所以字符串”a”实际上包含2个字符:
’a’、’\0’,因此,把它赋值给一个字符变量c:
c=”a”
是错误的。
例7:
下面不正确的字符串常量是______。
(A)’abc’(B)”12’12”(C)”0”(D)””
答案:
A
详解:
’abc’是用单引号引来的,所以’abc’不是正确的字符串常量。
(八)算术运算符和算术表达式
1、基本算术运算符
①C语言中有5个基本算术运算符,
+(加法运算符。
如3+5、+3)
-(减法运算符。
如5-2、-3)
*(乘法运算符,如3*5)
/(除法运算符,如5/3,5.0/3)
%(求余运算符,要求%两侧均为整型数据)
例8:
在C语言中,要求运算数必须是整型的运算符是____。
(A)/(B)++(C)!
=(D)%
答案:
D
详解:
对于%运算符来说,要求两侧均为整型数据,所以表达式3.5%2与3%2.0是错误的。
例9:
写出下列程序的输出结果
main()
{printf(“%d,%d\n”,5/3,5%3);
printf(“%d,%d\n”,-5/-3,-5%-3);
printf(“%d,%d\n”,-5/3,-5%3);
printf(“%d,%d\n”,5/-3,5%-3);
}
输出结果:
1,2
1,-2
-1,-2
-1,2
程序详解:
两个同号整数相除时结果为正整数,如5/3、-5/-3的结果值为1。
两个异号整数相除时结果为负整数,多数机器采取“向零取整”法,即-5/-3=-1,5/-3=-1,但如果参加运算的两个数中有一个数为实数时结果为实数。
对于求余(%)运算,运算结果与第一个数的符号相同。
②优先级别:
先*、/、%后+、-
③运算量:
双元运算量,%前后必须为整数。
④左右结合性:
自左至右参预运算。
2、自加自减运算符
①C语言中有4种形式的自加自减运算符:
++i(先使i加1后使用)
i++(先使用后使i加1)
--i(先使i减1后使用)
i--(先使用后使i减1)
②优先级别:
高于算术运算。
例10:
若x和n均是int型变量,且x和n的初值均为5,则计算表达式后x的值为______,n的值为______。
x+=n++
答案:
106
详解:
根据优先级别选运算表达式n++,因为n++是后缀表示形式,所以n先参预运算,再运算表达式x+=n,则x为10,最后n自加为6。
例11:
main()
{intx,y,m,n;
x=2;y=2
m=x++*5;
n=++y*5;
printf(“%d,%d,%d,%d”,x,y,m,n);
}
输出结果:
3,3,10,15
程序详解:
对于后缀来说是先使用后运算,所以m的值为x在自加以前的2*5得10赋值给m后,x自加变为3。
对于前缀来说是先运算后使用,所以m的值为x在自加以后的3*5得15赋值给n。
③运算量:
单元运算量,此运算量必须为变量,所以表达式5++、(x+y)++是错误的。
④左右结合性:
自右至左参预运算。
(九)关系运算
1、C语言提供的关系运算符有:
>(大于)>=(大于或等于)<小于)
<=(小于或等于)==(等于)是!
=(不等于)
2、优先级别:
关系运算符的优先级别低于纯算术类,高于值类。
后两个的优先级小于前四个。
如表达式a+b3、运算量:
关系运算符是双元运算符,整型、实型、字符都可以参预运算。
4、左右结合性:
从左向右的结合方向
5、关于关系运算符的进一步说明:
①关系表达式的值是整型数0或1,故也可以将其看成一种整型表达式。
例如:
inti=1,j=7,a;
a=i+(j%4!
=0);
a的值为2。
②要说明x在区间[a,b]中,普通数学中使用表达式a≤x≥b。
但C语言中应写成a<=x&&x<=b。
③表达式5>2>7>8在数学上是不允许的,而在C中是允许的。
按自左至右求解。
④字符数据的比较按其ASCII码值进行。
⑤在判定两个浮点数是否相等时,由于存储上的误差,会得出错误的结果。
例如:
1.0/3.0*3.0==1.0
(十)逻辑运算
1、C语言提供的逻辑运算符:
&&(逻辑与)||(逻辑或)!
(逻辑非)
2、优先级别:
&&与||的优先级别低于关系运算符,高于条件运算符,&&的优先级别高于||,!
的优先级别与自加运算符(++)、自减运算符(--)同级。
3、运算量:
&&和||是双元运算符,!
是单元运算符。
例12:
已知x=43,ch=’A’,y=0;则表达(x>=y&&ch<’B’&&!
y)的值是______。
(A)0(B)语法错(C)1(D)“真”
答案:
C
说明:
C语言不提供逻辑性数据“真”和“假”,在进行逻辑运算时则把“非零”作为“真”,把0作为“假”,所以表达式!
y的运算结果是1。
4、左右结合性:
&&和||运算符的结合方向为自左至右,!
的结合方向为自右至左。
5、关于逻辑运算符的进一步说明:
①在一个&&表达式中,若&&的一端为0,则不必再计算另一端,该表达式的值肯定为0。
②在一个||表达式中,若||的一端为0,则不必再计算另一端,该表达式的值肯定为1。
例13:
写出下面程序的输出结果。
main()
{intx,y,z;
x=y=z=0;
++x&&++y||++z;
printf(“%d,%d,%d”,x,y,z);
x=y=z=0;
++x||++y&&++z;
printf(“%d,%d,%d”,x,y,z);
}
输出结果:
1,1,0
1,0,0
程序说明:
①因为&&的优先级别高于||,所以表达式++x&&++y||++z是一个或表达式,根据||的一端为0,则不必再计算另一端的原则,先计算表达式++x&&++y的值为1,因为1或任何值都为1,所以表达式++z没有运算,输出结果为:
1,1,0。
②表达式++x||++y&&++z也是一个或表达式,同样根据||的一端为0,则不必再计算另一端的原则,先计算表达式++z的值为1,因为1或任何值都为1,所以表达式++y&&++z没有运算,输出结果为:
1,0,0。
(十一)赋值运算
1、基本的赋值运算符:
=(将赋值运算符右侧的表达式赋给左侧的变量)
2、自反算术赋值运算符
C语言中有5个基本自反算术赋值运算符,
+=(a+=3等价于a=a+3)
-=(a-=3等价于a=a-3)
*=(a*=3等价于a=a*3)
/=(a*=3等价于a=a*3)
%=(a%=3等价于a=a%3)
3、优先级别:
赋值运算符与自反算术赋值运算符属于同等级别,低于条件运算符,高于逗号运算符。
如对于表达式x%=y+3完全等价于x%=(y+3)。
例14:
若有以下定义,则能使值为3的表达式是______。
Intk=7,x=12;
(A)x%=(k%5)(B)x%=(k-k%5)
(C)x%=k-k%5(D)(x%=k)-(k%=5)
答案:
D
详解:
表达式(x%=k)-(k%=5)完全等价于(x=x%k)-(k=k%5)等价于5-2,此表达式的结果为3。
4、运算量:
双元运算量,赋值运算符与自反算术赋值运算的第一个量必须为变量,且%=前后必须为整型数据。
如对于表达式a*3+=2是错误的。
因为此表达式完全等价于(a*3)=(a*3)+2。
5、左右结合性:
自右至左参预运算。
例15:
若a是int型变量,且a的初值为6,则计算表达式后a的值为______。
a+=a-=a*a
答案:
-60
详解:
表达式从左向右运算,先计算表达式a=a-36后a为-30,再计算表达式a=a+a后a的值变为-60。
(十二)条件运算:
1、条件运算符的基本形式及功能:
条件运算是一种在两个表达式的值中选择一个的操作。
它的一般形式为:
e1?
e2:
e3
它的操作过程为,若e1为真,则表达式的值为e2,若为假表达式的值为e3。
2、优先级别:
低于逻辑运算,高于赋值运算。
3、运算量:
三元运算量,e1一般为算术表达式,e2、e3可以是任意类型的表达式,条件表达式的值的类型为e2与e3二者中类型较高的。
例16:
若有条件表达式(exp)?
a++:
b--,则以下表达式中能完全等价于表达式(exp)的是______。
答案:
exp!
=0
说明:
对于表达式e1?
e2:
e3,e1一般为算术表达式、逻辑表达式、关系表达式,结果为1(真)或0(假)。
也可以为数值exp,结果为结果为非0(真)或0(假)在本例中与exp完全等价的表达式是exp!
=0。
4、左右结合性:
自右至左运算。
例17:
以下程序的运行结果是______。
main()
{intk=4,a=3,b=2,c=1;
printf(“%d”,kk:
c
c:
a);
}
答案:
1
程序解析:
条件表达式是从右向左运算,所以在本例中先计算表达式c
c:
a的值,把各数值代入此表达式的值为1。
再计算表达式kk:
1的值,因为k(十三)逗号运算
1、逗号运算符的基本形式及功能:
逗号表达式的一般形式为:
表达式1,表达式2。
逗号表达式的求解过程是:
先求解表达式1,再求解表达式2。
整个表达式的值是表达式2的值。
2、优先级别:
逗号运算符是所有运算符中级别最低的。
例18:
以下符合C语言语法的赋值表达式是______。
(A)d=9+e+f=d+9(B)d=(9+e,f=d+9)
(C)d=9+e,e++,d+9(D)d=