第四章习题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1习题1.C语言有哪些特点?答:C语言具有以下特点:1)语言简洁、紧凑,使用方便、灵活2)运算符丰富3)数据结构丰富,具有现代化语言的各种数据结构4)可进行结构化程序设计5)可以直接对计算机硬件进行操作6)生成的目标代码质量高,程序执行效率高7)可移植性好2.有哪些数据类型是MCS-51单片机直接支持的?答:MCS-51单片机直接支持的数据类型标准分为基本数据类型和组合数据类型,基本数据类型有字符型char、短整型short、整型int、长整型long、浮点型float、双精度型double、特殊功能寄存器型和位类型,其中char型与short型相同,float型与double型相同。组合数据类型有数组类型、结构体类型、共同体类型和枚举类型,另外还有指针类型和空类型。3.C51特有的数据类型有哪些?答:C51特有的数据类型有特殊功能寄存器型和位类型。4.C51中的存储器类型有几种,它们分别表示的存储器区域是什么?答:C51中的存储器类型有6种,分别如下:data:直接寻址的片内RAM低128B,访问速度快bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata:间接寻址访问的片内RAM,允许访问全部片内RAMpdata:用Ri间接访问的片外RAM低256Bxdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAMcode:程序存储器ROM64KB空间5.在C51中,bit位与sbit位有什么区别?答:bit位类型符用于定义一般的位变量。存储器类型只能是bdata、data、idata,只能是片内RAM的可位寻址区,严格来说只能是bdata。sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。6.在C51中,通过绝对地址来访问的存储器有几种?答:通过绝对地址来访问存储器有三种方法:1.使用C51运行库中预定义宏。2.通过指针访问。3.使用C51扩展关键字_at_27.在C51中,中断函数与一般函数有什么不同?答:中断函数在定义时后面带interruptm修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断0,1——定时/计数器T0,2——外部中断1,3——定时/计数器T1,4——串行口中断,5——定时/计数器T2,其他值预留。编写MCS-51中断函数需要注意如下几点。(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。(2)中断函数没有返回值。(3)在任何情况下都不能直接调用中断函数(4)如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同,否则会产生不正确的结果。(5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。(6)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其他程序调用。8.按给定的存储类型和数据类型,写出下列变量的说明形式。(1)在data区定义字符变量val1。chardataval1;(2)在idata区定义整型变量val2。intidataval2;(3)在xdata区定义无符号字符型数组val3[4]。unsignedcharxdataval3[4];(4)在xdata区定义一个指向char类型的指针px。charxdata*px;(5)定义可寻址位变量flag。bitflag;(6)定义特殊功能寄存器变量P3。sfrP3=0xa0;(7)定义特殊功能寄存器变量SCON。sfrSCON=0x98;(8)定义16位的特殊功能寄存器T0。sfr16T0=0x8a;9.写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。(1)a+bc&&b==c结果:假(2)a||b+c&&b-c结果:真(3)!(ab)&&!c||1结果:真(4)!(a+b)+c-1&&b+c/2结果:假10.写出下列C51程序的执行结果。3(1)#includestdio.hexternserial_initial();main(){intx,y,z;serial_initial();x=y=8;z=++x;printf(\n%d%d%d,y,z,x);x=y=8;z=x++;printf(\n%d%d%d,y,z,x);x=y=8;z=--x;printf(\n%d%d%d,y,z,x);x=y=8;z=x--;printf(\n%d%d%d,y,z,x);printf(\n);while(1);}结果:899889877887(2)#includestdio.hexternserial_initial();main(){intx,y,z;serial_initial();printf(inputdatax,y?\n);scanf(%d%d,&x,&y);printf(\nxyxyx=yxyx=yx!=yx==y);printf(\n);printf(\n%3d%3d,x,y);z=xy;printf(%5d,z);z=x=y;printf(%5d,z);z=xy;printf(%5d,z);z=x=y;printf(%5d,z);z=x!=y;printf(%5d,z);z=x==y;printf(%5d,z);while(1);}执行结果:inputdatax,y?12xyxyx=yxyx=yx!=yx==y121100104(3)#includestdio.hexternserial_initial();main(){intx,y,z;serial_initial();printf(inputdatax,y?\n);scanf(%d%d,&x,&y);printf(\nxy!xx||yx&&y);printf(\n%3d%3d,x,y);z=!y;printf(%5d,z);z=x||y;printf(%5d,z);z=x&&y;printf(%5d,z);printf(\n);printf(\n);printf(Thatisall\n);while(1);}执行结果:inputdatax,y?xy!xx||yx&&y12011Thatisall5(4)#includestdio.hexternserial_initial();main(){inta,b;unsignedintx,y;serial_initial();a=b=0xaa55;x=y=0xaa55;printf(\na=%4xb=%4xx=%4xy=%4x,a,b,x,y);a=a1;b=b1;x=x1;y=y1;printf(\na=%4xb=%4xx=%4xy=%4x,a,b,x,y);printf(\n);printf(\n);printf(Thatisall.\n);while(1);}执行结果:a=aa55b=aa55x=aa55y=aa55a=54aab=d52ax=54aay=552aThatisall.11.break和continue语句的区别是什么?答:break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。12.用分支结构编程实现:输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。参考程序:#includereg52.h#includestdio.hvoidmain(void){unsignedcharx;SCON=0x52;//串口初始化TMOD=0x20;TH1=0XF3;TR1=1;while(1){printf(inputx:\n);//输出提示信息scanf(%c,&x);6switch(x){case'1':printf(A\n);break;case'2':printf(B\n);break;case'3':printf(C\n);break;case'4':printf(D\n);break;case'5':printf(QUIT\n);break;default:printf(RETRY\n);;}if(x=='5')break;}while(1);}13.输入3个无符号的字符数据,要求按由大到小的顺序输出。参考程序:#includereg52.h#includestdio.hvoidmain(void){unsignedcharx,y,z,m;SCON=0x52;//串口初始化TMOD=0x20;TH1=0XF3;TR1=1;printf(inputx,y,z:);//输出提示信息scanf(%c,%c,%c,&x,&y,&z);printf(\n);if(xy){m=x;x=y;y=m;}if(yz){m=y;y=z;z=m;}if(xy){m=x;x=y;y=m;}printf(output%c,%c,%c\n,x,y,z);//输出while(1);}14.用3种循环结构编写程序实现输出1到10的平方之和。参考程序:(1)while循环#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库voidmain(void)//主函数{inti,s=0;//定义整型变量i=1;SCON=0x52;//串口初始化TMOD=0x20;TH1=0XF3;TR1=1;while(i=10)//累加1到10的平方之和在s中{s=s+i*i;i++;}7printf(1到10的平方之和=%d\n,s);while(1);}(2)dowhile循环#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库voidmain(void)//主函数{inti,s=0;//定义整型变量i=1;SCON=0x52;//串口初始化TMOD=0x20;TH1=0XF3;TR1=1;do//累加1到10的平方之和在s中{s=s+i*i;i++;}while(i=10);printf(1到10的平方之和=%d\n,s);while(1);}(3)for循环#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库voidmain(void)//主函数{inti,s=0;//定义整型变量SCON=0x52;//串口初始化TMOD=0x20;TH1=0XF3;TR1=1;for(i=1;i=10;i++)s=s+i*i;//累加1到10的平方之和在s中printf(1到10的平方之和=%d\n,s);while(1);}15.对一个由5个元素组成的无符号字符数组按由小到大的顺序进行排序。参考程序:#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库main(){unsignedcharf[5],m,i,j;SCON=0x52;//串口初始化TMOD=0x20;TH1=0XF3;8TR1=1;printf(输入任意5个字符:);scanf(%c,%c,%c,%c,%c,&f[0],&f[1],&f[2],&f[3],&f[4]);printf(\n);for(i=0;i5;i++)for

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功