C语言习题集100题+.docx

上传人:b****5 文档编号:6991063 上传时间:2023-01-15 格式:DOCX 页数:24 大小:26.76KB
下载 相关 举报
C语言习题集100题+.docx_第1页
第1页 / 共24页
C语言习题集100题+.docx_第2页
第2页 / 共24页
C语言习题集100题+.docx_第3页
第3页 / 共24页
C语言习题集100题+.docx_第4页
第4页 / 共24页
C语言习题集100题+.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

C语言习题集100题+.docx

《C语言习题集100题+.docx》由会员分享,可在线阅读,更多相关《C语言习题集100题+.docx(24页珍藏版)》请在冰豆网上搜索。

C语言习题集100题+.docx

C语言习题集100题+

1.i=2;printf("%d",i++);打印出来的数字为?

答案:

2

解:

i++和++i均为自增表达式,执行完后,i都会加1,均会有i+=1,也就是i=2+1=3的效果。

不过,两个表达式的值不同。

i++表达式的值为自增1之前i的值。

这里也就是2。

++i为只增1之后的i的值,也就是3。

因此,i=2;printf("%d",i++);打印出来的数字为2;

i=2;printf("%d",++i);打印出来的数字为3。

2.unsignedchari=0;i--;i为?

答案:

255

unsignedchar的为1个字节,数据范围从0~255。

i=0已经位于数据范围的下边界,如果再-1,会发生负溢出,溢出至255。

如果i=255,再加1,则会发生正溢出,溢出至0。

类似的情况参考下表

表1

类型说明符

数的范围

字节数

字符型

signedchar

-128~127

即-27~(27-1)

1

无符号

字符型

unsignedchar

0~255

即0~(28-1)

1

短整量

short[int]

-32768~32767

即-215~(215-1)

2

无符号

短整型

unsignedshort

0~65535

即0~(216-1)

2

长整型

整型

long或

int

-2147483648~2147483647

即-231~(231-1)

4

无符号长整型

无符号整型

unsignedlong

unsignedint

0~4294967295

即0~(232-1)

4

 

3.signedchari=0;i--;此时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;for(i=0;i<100;i++);循环结束后,i=?

100

解:

参考表1

int的范围为-21亿~+21亿

因此,i在0~100的范围内的自增1操作,不会发生溢出。

循环次数计算考虑i的值的变化,i从0变到99,都满足i<100循环执行条件。

当i=99+1的时候,条件被打破,循环推出。

因此,循环推出后i=100

如果没有溢出,则通过以下公式计算

for(i=start;i

循环次数为(end-1)-start+1=end-start(使用等比数列公式:

项数=(an-a0)/delta+1

循环结束后i=end

如果没有溢出,则通过以下公式计算

for(i=start;i<=end;i++)

循环次数为end-start+1

循环结束后i=end+1

6.unsignedshorti;for(i=0;i<40000;i++);循环次数为?

A.40000B.无穷大

答案:

选A

参考表1

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;for(i=0;i<40000;i++);循环次数为?

A.40000B.无穷大

答案为B

参见表1

signedshort数据范围从-32768~32767

循环会溢出

当i=32767的时候,i++使得i溢出到-32768,因此,i永远不可能达到40000。

该循环为死循环。

8.floati;for(i=0.0F;i<400000.0F;i+=1.0F);循环次数为A.400000B.无穷大,答案A

9.floati;for(i=0.0F;i<400000000.0F;i+=1.0F);循环次数为A.400000B.无穷大,答案B

表2

类型说明符

比特数

(字节数)

有效数字

数的范围

单精度

float

32(4)

7

10-38~1038

双精度

double

64(8)

16

10-308~10308

float有效位数为7,当i=399999的时候,执行i++

399999

+1

----------------------------

1加在第6位有效数字上,在7位以内,则不会出现精度不够的情况。

如果是i=399999999.0F,同样执行i+=1.0F

1是加到第9位有效数字上的,会出现精度不够的情况。

具体表现为x+deltax==x

也就是i+=1.0F将不再使i能够继续增大

此时,i永远不会达到400000000.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[]="123";sizeof(s)的值为?

sizeof是关键字,用于显示变量或数据类型的字节数。

inta;sizeof(a)为4

sizeof(int)为4

chars[]="123";sizeof(s)的值为数组元素个数*每个元素的字节数=4*1=4

这里数组元素个数应包含末尾的’\0’

17.提前退出循环的关键字是?

break;

inti;

for(i=0;i<10;i++)

{

if(i==5)

break;

printf(“%d,”,i);

}

屏幕输出为0,1,2,3,4,

18.提前结束本次循环的关键字是?

continue;

inti;

for(i=0;i<10;i++)

{

if(i==5)

continue;

printf(“%d,”,i);

}

屏幕输出为0,1,2,3,4,6,7,8,9,

19.有一个关键字可以构造出while循环,该关键字是?

答案可以是goto,也可以是for

以下三个循环的作用是一样的,

都是在屏幕上输出0,1,2,3,4,5,6,7,8,9,

inti;

i=0;

while(i<10)

{

printf(“%d,”,i);

i++;

}

inti;

i=0;

LOOP:

if(i<10)

{

printf(“%d,”,i);

i++;

gotoLOOP;

}

inti;

for(i=0;i<10;i++)

{

printf(“%d,”,i);

}

20.请用宏定义给unsignedint一个别名UINT

#defineUINTunsignedint

21.请用typedef给unsignedint一个别名uint

typedefunsignedintUINT;

注意typedef后面有;

而且两者在别名和原名的顺序上是相反的。

22.如果要用到printf,需要include哪个头文件?

23.如果需要用到sqrt,需要include哪个头文件?

printf,scanf,getchar,putchar使用之前都得#include

sqrt,sin,cos使用之前都得#include

strlen使用之前都得#include

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转化为二进制为00010110

 

0x22转化为二进制为_____(前面的0不要省略,总共写出8位数字)

0x22转化为二进制为00100010

对于十六进制到二进制的转化

可以现先在草稿纸上写出如下表格,然后查表

表3

十进制

0

1

2

3

4

5

6

7

十六进制

0

1

2

3

4

5

6

7

二进制

0000

0001

0010

0011

0100

0101

0110

0111

十进制

8

9

10

11

12

13

14

15

十六进制

8

9

A

B

C

D

E

F

二进制

1000

1001

1010

1011

1100

1101

1110

1111

27.0x22转化为二进制为____(前面的0不要省略,总共写出8位数字)

直接查表

0x22=00100010

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[1000000]该数组的定义是否正确?

(填T或F)T

sizeof(a)=1000000*sizeof(a[0])=1000000<1024*1024=1MBytes

因此在运行的时候,不会发生栈溢出错误。

34.inta[1000000]该数组的定义是否正确?

(填T或F)F

sizeof(a)=1000000*sizeof(a[0])=1000000*4>1024*1024=1MBytes

编译的时候不会报错,运行的时候,会报栈溢出错误。

提示,定义函数中的数组有字节限制,最大不能超过1MBytes

35.inta[3];请问sizeof(a)=?

sizeof(a)=sizeof(a[0])*3=4*3=12

36.inta[3][4];请问sizeof(a)=?

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中使用

printf(“i=%d”,i);

//正确,全局变量可以被定义在它下面的所有函数引用,这里包括print和main//都可以使用i

printf(“j=%d”,j);

//正确,局部变量只能在定义它的函数内使用

}

41.charc='\123';printf("%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?

0:

1);printf("%d\n",a);

为三目运算符

表达式1?

表达式2:

表达式3

因为=的优先级,小于三目运算符,所以先看?

前面的常量表达式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&11011111=11111111&11011111=11011111=0xDF

&为按位与操作,有0为0,全1才为1

45.unsignedchari=0x11;i|=(unsignedchar)(1<<5);求i(答案以0x开头)

(unsignedchar)(1<<5)=001000002

|为按位或操作,有1为1,全0才为0

i=0x11=000100012

i|=(unsignedchar)(1<<5)也就是i|=001000002

等价于i=i|001000002=000100012|001000002=0011000122=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++;请问j=?

&&为逻辑与操作,有假为假,全真才为真

对于表达式1&&表达式2,如果表达式1为假,则无论表达式2的取值如何,整个表达式都为假。

因此,这种情况下,计算机会跳过表达式2。

i==1成立,因此系统将计算表达式2也就是j++的值,j++将被执行,j=3

50.inti=0,j=2;if(i==1&&j++)i++;请问j=?

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?

a>b?

a:

b:

c;

很可能会出现优先级问题。

52.intn=5;inta[n];该数组定义是否正确?

(T或F)F

数组定义时候,[]中应为整形常量表达式。

53.数组名右边的方括号中必须为常量表达式?

(T或F)F

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=16000000.0F;i<400000000.0F;i+=1.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;break;

case2:

y=7;break;

case3:

y=12;break;

}

对应的ifelse语句是

intx=1;

inty;

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&&x<3.5498)

y=2;

switchcase适用于点对点映射,ifelse既可以实线点对点映射,也可以将某区间映射到点。

58.最大的float型数的数量级是____38

查表2

59.冒泡法用于____(答案为两个字)

排序

60.编译器在编译过程中可以检查源代码的哪一类错误?

A.功能错误B.语法错误

编译器只能检查出语法错误,比如没有加分号,使用了没有定义的变量名等等。

61.如果源码中有一个死循环,那么能否通过顺利编译?

(T或F)

死循环不属于语法错误,所以编译器是检测不到的,可以顺利通过编译。

62.升序指的是由小到大?

(T或F)

升序是由小到大,降序是由大到小

63.C程序的每行中只能写一条语句?

(T或F)

每行可以写多条语句。

比如以下情况是允许的

inti=0;i++;printf(“%d\n”,i);

64.简单变量做实参时,数据传递方式是由实参传给形参,再由形参传回给实参?

(T或F)

简单变量是指的除去数组和指针的情况。

intadd(inta,intb)//a,b为形式参数

{

这里隐含了a=1,b=2

相当于实参被隐含传递给了形参

returna+b;

}

intmain()

{

intc;

c=add(1,2);//1,2为实际参数

}

65.stdlib.h中有个库函数可以用于排序,函数名为____

qsort——快速排序函数

66.如果头文件是位于工程目录下,#include后面用哪种方式A.<>B.""C.A和B均可——B

67.如果头文件位于编译器安装目录下,#include后面用哪种方式A.<>B.""C.A和B均可——C

<>告诉编译器,*.h文件位于编译器目录下。

“”告诉编译器,*.h文件位于工程目录或编译器目录下。

采用这种方式的时候,编译器会先搜索工程目录有没有*.h文件,如果没有才回去编译器目录下找。

因此,对于编译器自带的*.h文件,比如stdio.h,位于编译器目录下,

两种方式都是可以的。

不过,采用<>会加快编译速度,因为编译器不会去工程目录搜索*.h

而对于自己定义.h文件通常都位于工程目录下,所以只能采用””方式

68.已知main函数中有如下语句inta;a=5;intb=6;试问在C编译器能否编译通过?

(T或F)

不能通过。

因为声明变量语句中间,不能插入其它语句。

可以改为

inta=5;

intb=6;

inta;

intb=6;

a=5;

69.如果函数定义在main函数的后面,一般会在main前面添加函数的A.函数体B.函数声明

B

函数体就是指的函数定义中的花括号部分。

intadd(inta,intb);//因为函数定于main函数之后,所以必须在main前面先声明,否则编译器会报错。

intmain()

{

intc;

c=add(1,2);

}

 

intadd(inta,intb)//这里为函数定义,申明和定义的区别在于是否有函数体,也就是花括号部分

{

returna+b;

}

70.头文件中,通常是存放A.函数声明B.函数体

A

大家可以自己打开编译器目录下的stdio.h文件

71.逗号表达式的值等于最后那个逗号后的表达式的值?

(T或F)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1