C语言习题集100题+Word下载.docx
《C语言习题集100题+Word下载.docx》由会员分享,可在线阅读,更多相关《C语言习题集100题+Word下载.docx(29页珍藏版)》请在冰点文库上搜索。
unsignedint
0~
即0~(232-1)
3.signedchari=0;
此时i为?
答案:
-1
参考表1
signedchar数据范围从-128~127。
当i=0,i自减1,不会发生溢出。
因此,i=0-1=-1
4.inti;
for(i=0;
i<
100;
i--);
循环次数为?
100
5.inti;
i++);
循环结束后,i=?
int的范围为-21亿~+21亿
因此,i在0~100的范围内的自增1操作,不会发生溢出。
循环次数计算考虑i的值的变化,i从0变到99,都满足i<
100循环执行条件。
当i=99+1的时候,条件被打破,循环推出。
因此,循环推出后i=100
如果没有溢出,则通过以下公式计算
for(i=start;
end;
i++)
循环次数为(end-1)-start+1=end-start(使用等比数列公式:
项数=(an-a0)/delta+1
循环结束后i=end
=end;
循环次数为end-start+1
循环结束后i=end+1
6.unsignedshorti;
40000;
A.40000B.无穷大
选A
unsignedshort范围为0~65535,
该循环不会溢出。
等差数列公式
an=a0+(n-1)*delta
n为项数,也就是循环次数
an=39999,a0=0
delta=1
循环次数=(an-a0)/detla+1=(39999-0)/1+1=40000
7.signedshorti;
A.40000B.无穷大
答案为B
参见表1
signedshort数据范围从-32768~32767
循环会溢出
当i=32767的时候,i++使得i溢出到-32768,因此,i永远不可能达到40000。
该循环为死循环。
8.floati;
for(i=0.0F;
.0F;
i+=1.0F);
循环次数为A.B.无穷大,答案A
9.floati;
循环次数为A.B.无穷大,答案B
表2
比特数
(字节数)
有效数字
单精度
float
32(4)
7
10-38~1038
双精度
double
64(8)
16
10-308~10308
float有效位数为7,当i=的时候,执行i++
+1
----------------------------
1加在第6位有效数字上,在7位以内,则不会出现精度不够的情况。
如果是i=.0F,同样执行i+=1.0F
1是加到第9位有效数字上的,会出现精度不够的情况。
具体表现为x+deltax==x
也就是i+=1.0F将不再使i能够继续增大
此时,i永远不会达到.0F,循环成为死循环。
10.printf函数中,%lf对应哪种数据类型?
%lfdouble
%ffloat
%dint
%ldlong
%cchar
%schars[]
%x整数以十六进制显示(小写的abcdef)
%X整数以十六进制显示(大写的ABCDEF)
%uunsignedint
%o整数以八进制显示
11.a的ASCII码是?
97
12.A的ASCII码是?
65
13.0的ASCII码是?
48
14.\n的ASCII码是?
10
15.chars[]="
123"
;
strlen(s)的值为?
3
strlen是string.h中声明的库函数,用于显示字符串中除’\0’以外的字符个数。
16.chars[]="
sizeof(s)的值为?
sizeof是关键字,用于显示变量或数据类型的字节数。
inta;
sizeof(a)为4
sizeof(int)为4
chars[]="
sizeof(s)的值为数组元素个数*每个元素的字节数=4*1=4
这里数组元素个数应包含末尾的’\0’
17.提前退出循环的关键字是?
break;
inti;
10;
{
if(i==5)
break;
printf(“%d,”,i);
}
屏幕输出为0,1,2,3,4,
18.提前结束本次循环的关键字是?
continue;
continue;
屏幕输出为0,1,2,3,4,6,7,8,9,
19.有一个关键字可以构造出while循环,该关键字是?
答案可以是goto,也可以是for
以下三个循环的作用是一样的,
都是在屏幕上输出0,1,2,3,4,5,6,7,8,9,
i=0;
while(i<
10)
i++;
LOOP:
if(i<
{
gotoLOOP;
20.请用宏定义给unsignedint一个别名UINT
#defineUINTunsignedint
21.请用typedef给unsignedint一个别名uint
typedefunsignedintUINT;
注意typedef后面有;
而且两者在别名和原名的顺序上是相反的。
22.如果要用到printf,需要include哪个头文件?
23.如果需要用到sqrt,需要include哪个头文件?
printf,scanf,getchar,putchar使用之前都得#include<
stdio.h>
sqrt,sin,cos使用之前都得#include<
math.h>
strlen使用之前都得#include<
string.h>
24.0x22转化为十进制为___34
0x22=2*161+2*160=34
25.22转化为十六进制
22/16=122%16=6
1/16=01%16=1
22转化为16进制为0x16
222转化为16进制
222/16=13222%16=14
13/16=013%16=13
14转化为十六进制为E
13转化为十六进制为D
222转化为16进制为0xDE
26.22转化为二进制数为______(前面的0不要省略,总共写出8位数字)
思路:
先转化为16进制,再由16进制转化为2进制。
22转化为16进制为0x16,0x16转化为二进制为
0x22转化为二进制为_____(前面的0不要省略,总共写出8位数字)
0x22转化为二进制为
对于十六进制到二进制的转化
可以现先在草稿纸上写出如下表格,然后查表
表3
十进制
5
6
十六进制
二进制
0000
0001
0010
0011
0100
0101
0110
0111
8
9
10
11
12
13
14
15
A
B
C
D
E
F
1000
1001
1010
1011
1100
1101
1110
1111
27.0x22转化为二进制为____(前面的0不要省略,总共写出8位数字)
直接查表
0x22=
28.int的上限为多少亿?
(写出数字即可,不要带单位)
int范围-21亿~21亿,见表1
29.编译程序程序总共有四部,第一步是?
A.预处理B.链接
编译程序程序总共有四部:
预处理-》编译-》汇编-》链接
30.预处理指令前通常有什么符号?
#
#define
#include
#ifdef
#endif
31.void是否为合法的变量名?
(填T或F)F
32._123是否是合法的变量名?
(填T或F)T
合法变量名以下划线_和字母开头,中间可以有数字。
不能用关键字。
void为关键字,不能作为合法变量名。
但是Void可以,因为C语言区分大小写
33.chara[]该数组的定义是否正确?
sizeof(a)=*sizeof(a[0])=<
1024*1024=1MBytes
因此在运行的时候,不会发生栈溢出错误。
34.inta[]该数组的定义是否正确?
sizeof(a)=*sizeof(a[0])=*4>
编译的时候不会报错,运行的时候,会报栈溢出错误。
提示,定义函数中的数组有字节限制,最大不能超过1MBytes
35.inta[3];
请问sizeof(a)=?
sizeof(a)=sizeof(a[0])*3=4*3=12
36.inta[3][4];
sizeof(a)=sizeof(a[0][0])*(3*4)=4*12=48
37.inta[3];
请问最后一个元素为?
(填写a[x])
inta[N];
a数组中最后一个元素为a[N-1]
第一个元素为a[0]
38.inta[3][4];
(填写a[x][y])
inta[M][N];
a的最后一个元素为a[M-1][N-1]
a的第一个元素为a[0][0]
39.定义在函数体外的变量称之为全局变量。
(填写T或F)T
40.局部变量只能在定义该变量的函数内使用。
(填写是或否)T
#include<
inti=10;
//i为全局变量
voidprint()
printf(“i=%d”,i);
//正确,全局变量可以被定义在它下面的所有函数引用,这里包括print和main//都可以使用i
printf(“j=%d”,j);
//正确,局部变量只能在定义它的函数内使用,这里j只能在main中使用
intmain()
intj=5;
//j为定义在main中的局部变量,只能在main中使用
//正确,局部变量只能在定义它的函数内使用
41.charc='
\123'
%c\n"
c);
打印输出为_____
‘\123’这是八进制,先转化成10进制
1238=1*82+2*81+3*80=64+16+3=83
因65为A的ASCII码,可以推出83为S
42.intb=3;
inta=(b<
2?
0:
1);
printf("
%d\n"
a);
?
:
为三目运算符
表达式1?
表达式2:
表达式3
如果表达式1为真,这返回表达式2的值,否者返回表达式3的值。
b<
2的值为假,所以需要返回表达式3也就是1
因此a=1
43.intb=3;
inta=(b=2?
因为=的优先级,小于三目运算符,所以先看?
前面的常量表达式2,
表达式的值就是2
2不等于0,?
前面的表达式为真。
因此a=表达式2的值=0
44.unsignedchari=0xFF;
i&
=~(unsignedchar)(1<
<
5);
求i(答案以0x开头)
整数常量在C语言中,默认是int型的,因此1在内存中总共占用4字节,32位
00000000000000000000000000000001
1<
5表示1左移5位,后面补0
00000000000000000000000000100000
(unsignedchar)(1<
5)将32位转化为8位
00100000
~((unsignedchar)(1<
5))是按位取反操作
11011111
i+=1i=i+1
i&
=~((unsignedchar)(1<
5))也就是i&
=11011111,
等价于i=i&
=11111111&
11011111=11011111=0xDF
&
为按位与操作,有0为0,全1才为1
45.unsignedchari=0x11;
i|=(unsignedchar)(1<
5)=001000002
|为按位或操作,有1为1,全0才为0
i=0x11=
5)也就是i|=001000002
等价于i=i|001000002=|001000002=0011=0x31
四位二进制数可以转化为一位十六进制数,从低位(右边)向左数位数,四位一组,不足四位的可以补0.
46.写出与printf相对应的输入函数的名称为scanf
printf用于格式输出,scanf用于格式输入
47.写出读取一个字符的输入函数的名称
putchar用于向屏幕输出一个字符
与putchar相对应的输入函数为getchar,getchar用于从键盘输入读取一个字符
48.inti=1,j=2;
if(i==1||j++)i++;
请问j=?
if后的i++时候执行取决于表达式i==1||j++是否为真
因为||为逻辑或操作,有真为真,全假才为假
因此,对于表达式1||表达式2,如果表达式1为真,则无论表达式2的取值,整个表达式都为真。
因此,计算机在这种情况下,会跳过表达式2的计算。
i==1成立,因此i==1||j++必定为真,因此计算机跳过j++的计算,直接计算if后的语句i++。
因此,j++不会被执行。
j=2
49.inti=1,j=2;
if(i==1&
j++)i++;
为逻辑与操作,有假为假,全真才为真
对于表达式1&
表达式2,如果表达式1为假,则无论表达式2的取值如何,整个表达式都为假。
因此,这种情况下,计算机会跳过表达式2。
i==1成立,因此系统将计算表达式2也就是j++的值,j++将被执行,j=3
50.inti=0,j=2;
i==1不成立,因此系统跳过计算表达式2,j++将不被执行,j=2
51.#defineMAX(a,b)((a)>
(b)?
(a):
(b)),给a,b加括号是为了避免_____问题(三个字)优先级
如果不使用小括号,#defineMAX(a,b)a>
b?
a:
b
inta=1,b=2,c=3;
intd;
d=MAX(MAX(a,b),c);
//求a,b,c三个数的最大值
等价于d=MAX(a,b)>
c?
MAX(a,b):
c=a>
b>
a>
b:
c;
很可能会出现优先级问题。
52.intn=5;
inta[n];
该数组定义是否正确?
(T或F)F
数组定义时候,[]中应为整形常量表达式。
53.数组名右边的方括号中必须为常量表达式?
inta[5]={1,2,3,4,5};
printf(“%d\n”,a[4]);
//这里的4是常量表达式
反例:
引用数组——整形
inti=4;
printf(“%d\n”,a[i]);
//这里i是变量
54.floati;
for(i=.0F;
是一个死循环,如要改错,可修改i为____型(英文)double
因为double精度为15,所以,可避免精度不够的情况。
(见题8和9,表2)
55.#defineDIM(a)sizeof(a)/sizeof(a[0]),该宏定义用于求数组的___A.元素个数B.数组字节数
sizeof(a)为整个数组所有元素的字节数之和,sizeof(a[0])为第一个元素的字节数,由于对于一个数组,其中每一元素的类型和字节数都相等,因此,sizeof(a[0])又表示数组a中每个元素的字节数。
DIM(a)=sizeof(a)/sizeof(a[0])=所有元素的总字节数/单个元素字节数=元素个数
56.switch-case语句中,每个case通常都搭配关键字_______
break
57.所有的ifelse语句都可以用switch-case语句表示?
(T或F)
以下switchcase语句将1,2,3,分别映射成5,7,12
intx=1;
inty;
switch(x)
case1:
y=5;
case2:
y=7;
case3:
y=12;
对应的ifelse语句是
if(x==1)
y=5;
elseif(x==2)
y=7;
elseif(x==3)
y=12;
如果需要将(1.54,2.32),(2.4567,3.5498)映射成1,2,则只能用ifelse实现
doublex,y;
if(x>
1.54&
x<
2.32)
y=1;
elseif(x>
2.4567&
3.5498)
y=2;
switchcase适用于点对点映射,ifelse既可以实线点对点映射,也可以将某区间映射到点。
58.最大的float型数的数量级是____38
查表2
59.冒泡法用于____(答案为两个字)
排序
60.编译器在编译过程中可以检查源代码的哪一类错误?
A.功能错误B.语法错误
编译器只能检查出语法错误,比如没有加分号,使用了没有定义的变量名等等。
61.如果源码中有一个死循环,那么能否通过顺利编译?
死循环不属于语法错误,所以编译器是检测不到的,可以顺利通过编译。
62.升序指的是由小到大?
升序是由小到大,降序是由大到小
63.C程序的每行中只能写一条语句?
每行可以写多条语句。
比如以下情况是允许的
inti=0;
i++;
printf(“%d\n”,i);
64.简单变量做实参时,数据传递方式是由实参传给形参,再由形参传回给实参?
简单变量是指的除去数组和指针的情况。
intadd(inta,intb)//a,b为形式参数
这里隐含了a=1,b=2
相当于实参被隐含传递给了形参
returna+b;
intc;
c=add(1,2);
//1,2为实际参数
65.stdlib.h中有个库函数可以用于排序,函数名为____
qsort——快速排序函数
66.如果头文件是位于工程目录下,#include后面用哪种方式A.<
>
B."
"
C.A和B均可——B
67.如果头文件位于编译器安装目录下,#include后面用哪种方式A.<
C.A和B均可——C
告诉编译器,*.h文件位于编译器目录下。
“”告诉编译器,*.h文件位于工程目录或编译器目录下。
采用这种方式的时候,编译器会先搜索工程目录有没有*.h文件,如果没有才回去编译器目录下找。
因此,对于编译器自带的*.h文件,比如stdio.h,位于编译器目录下,
两种方式都是可以的。
不过,采用<
会加快编译速度,因为编译器不会去工程目录搜索*.h
而对于自己定义.h文件通常都位于工程目录下,所以只能采用””方式
68.已知main函数中有如下语句inta;
a=5;
intb=6;
试问在C编译器能否编译通过?
不能通过。
因为声明变量语句中间,不能插入其它语句。
可以改为
inta=5;
或
69.如果函数定义在main函数的后面,一般会在main前面添加函数的A.函数体B.函数声明
函数体就是指的函数定义中的花括号部分。
intadd(inta,intb);
//因为函数定于main函数之后,所以必须在main前面先声明,否则编译器会报错。
}
intadd(inta,intb)//这里为函数定义,申明和定义的区别在于是否有函数体,也就是花括号部分
70.头文件中,通常是存放A.函数声明B.函数体
大家可以自己打开编译器目录下的stdio.h文件
71.逗号表达式的值等于最后那个逗号后的表达式的值?
(1,2,3)的值为3
72.inta=7,b=4;
a&
b=?
为逻辑与,有假为假,全真才为真
a=7,不为0,就是真(作为输入的时候,非0为真,作为结果的时候,1为真)
b=4,也是真
因此真&
真=真
C语言中1表示真,0表示假
所以,结果为1
73.inta=7,b=4;
a&
为按位与,有0为0,全1才为1
将7和4化为二进制,分别是0111和0