第一篇:语言程序设计(第四版)第2章【课后答案】
汇编语言程序设计
第四版
【课后习题答案】
--囮裑為檤
第2章 8086的指令系统
〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。
(1)mov ax,1200h(2)mov ax,bx(3)mov ax,[1200h](4)mov ax,[bx](5)mov ax,[bx+1100h](6)mov ax,[bx+si](7)mov ax,[bx][si+1100h] 〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH;偏移地址=bx=0100h(4)AX=3412H;偏移地址=bx=0100h(5)AX=4C2AH;偏移地址=bx+1100h=1200h(6)AX=7856H;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h
〔习题2.2〕指出下列指令的错误
(1)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds(5)mov al,300(6)mov [sp],ax(7)mov ax,bx+di
(8)mov 20h,ah 〔解答〕
(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[ SI ](7)源操作数应为 [BX+DI](8)立即数不能作目的操作数
〔习题2.3〕已知数字0 ~ 9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
lea bx,table mov al,8 xlat 〔解答〕
lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H P35
〔习题2.4〕什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?
〔解答〕
堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。
〔习题2.5〕已知SS = 2200H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?
mov ax,8057h push ax mov ax,0f79h
push ax
pop bx pop [bx] 〔解答〕
mov ax,8057h push ax mov ax,0f79h push ax pop bx;bx=0f79h pop [bx];DS:[0f79h]=8057h
〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:
mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al
〔解答〕
mov al,89h;AL=89h CF ZF SF OF PF add al,al;AL=12h 1 0 0 1 1;1000 1001 +1000 1001 10001 0010
add al,9dh;0001 0010 + 1001 1101 1010 1111
cmp al,0bch;1010 1111-1011 1100 * 0100 0011
sub al,al
dec al;0000 0000456
xor ax,ax ;AX=0000H 0 1 0 0 1 not ax ;AX=FFFFH 0 1 0 0 1 test ax,0f0f0h ;AX=FFFFH 0 0 1 0 1 注意:MOV和NOT指令不影响标志位;其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
〔习题2.12〕假设例题2.34的程序段中,AX = 08H,BX = 10H,请说明每条指令执行后的结果和各个标志位的状态。
〔解答〕
指令;执行结果
CF OF SF ZF PF mov si,ax;SI=AX=0008H-
;考虑进位
xor ah,ah mov bx,ax mov cl,3 shl ax,cl add ax,bx;shl bx,1 add ax,bx(2)数字0~9的ASCII码是:30h~39h 非压缩BCD码的0~9是:00h~09h 方法一:
and al,0fh;实现ASCII到非压缩BCD码的转换
or al,30h;实现非压缩BCD码到ASCII的转换 方法二:
xor al,30h ;求反D5D4位,其他不变
;即高4位为3,则变为0;高4位为0,则变为3(3)mov cl,4 again: shr dx,1;实现逻辑右移
;采用“sar dx,1”,则实现算术右移 rcr ax,1 dec cl
jnz again
〔习题2.14〕已知AL = F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?
〔解答〕(1)用sar编写
mov al,0f7h;-9送AL 1111 1001 sar al,1;结果:AL=1111 1100B=0FBH 即-5(2)用idiv编写
mov al,0f7h;-9送al cbw;字节符号扩展位字
mov bl,2;注意除数不可为立即数
idiv bl;结果:商为al=fch(-4);余数:ah=ffh(-1)结论:符号数的除法用idiv 准确。
〔习题2.15〕指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?
〔解答〕
指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。
〔习题2.16〕控制转移类指令中有哪三种寻址方式?
〔解答〕
控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。
〔习题2.17〕什么是短转移short jump、近转移near jump和远转移far jump?什么是段内转移和段间转移?8086有哪些指令可以实现段间转移?
〔解答〕
短转移:指段内-128~127之间的转移,位移量用一个字节表示近转移:指段内±32K之间的转移,位移量用一个字表示 远转移:指段间1MB范围的转移
段内转移:指在同一个代码段内的转移,可以是短转移或者近转移 段间转移:指转移到另外一个代码段,就是远转移
8086/8088CPU的JMP、CALL和INT n指令可以实现段间转移
〔习题2.18〕8086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?
〔解答〕
8086的条件转移的转移范围:在当前指令地址的 +127~-128之内。
如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。
〔习题2.19〕假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?
(1)JMP BX
(2)JMP TABLE[BX](3)JMP [BX][SI] 〔解答〕
(1)转移的有效地址EA= BX=1256H(2)转移的有效地址EA= [DS:20A1H+1256H]=[232F7]=3280H(3)转移的有效地址EA= [DS:1256H+528FH]=264E5H=2450H
〔习题2.20〕判断下列程序段跳转的条件
(1)xor ax,1e1eh
je equal(2)test al,10000001b
jnz there(3)cmp cx,64h jb there 〔解答〕
(1)AX=1e1eh(异或后为0)(2)AL的D0或D7至少有一位为1(3)CX(无符号数)< 64h
〔习题2.21〕设置CX = 0,则LOOP指令将循环多少次?例如:
mov cx,0 delay: loop delay 〔解答〕 216次。
〔习题2.22〕假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:
(1)若DX > DI,转到above执行;(2)若AX > SI,转到greater执行;(3)若CX = 0,转到zero执行;
(4)若AX-SI产生溢出,转到overflow执行;(5)若SI≤AX,转到less_eq执行;
(6)若DI≤DX,转到below_eq执行。〔解答〕
(1)若DX > DI,转到above执行
cmp dx,di ja above ;=jnbe above(2)若AX > SI,转到greater执行
cmp ax,si jg greater ;=jnle greater(3)若CX = 0,转到zero执行
cmp cx,0 jz zero;= jcxz zero
(4)若AX-SI产生溢出,转到overflow执行;
cmp ax,si jo overflow(5)若SI≤AX,转到less_eq执行;
cmp si,ax;cmp ax,si jle less_eq;jge less_eq(6)若DI≤DX,转到below_eq执行。
cmp di,dx;cmp dx,di jbe below_eq;jae below_eq
〔习题2.23〕有一个首地址为array的20个字的数组,说明下列程序段的功能。
mov cx,20 mov ax,0 mov si,ax sum_loop: add ax,array[si] add si,2 loop sum_loop mov total,ax 〔解答〕
将首地址为array得20个字的数组求和,并将结果存入 total 单元中。
2131415
xor ax,ax and ax,0 mov ax,0(3)解答:
and ax,0 xor ax,ax sub ax,ax
〔习题2.26〕参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。
〔解答〕
主程序转子suba时段内调用:断点1为2000h:0400h+3,转子是只将IP压栈。
suba转子subb时段间调用:断点2为2000h:0840h+5, 转子时须将cs段地址和IP压栈 suba转子subc时段内调用:断点3为2000h:0c021h+3,转子是只将IP压栈。注:压栈时先修改sp再压入断点,弹栈时先弹出断点再修改sp。
〔习题2.27〕已知AX、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。
add al,bl daa xchg al,ah adc al,bh daa xchg al,ah ret 〔解答〕
压缩BCD码加法:AX←AX+BX 出口参数:AX=BCD码和
〔习题2.28〕AAD指令是用于除法指令之前,进行非压缩BCD码调整的。实际上,处理器的调整过程是:AL←AH×10+AL,AH←0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。
〔解答〕
shl ah,1;ah=2*a(设原ah=a)mov dl,ah;dl=2*a mov cl,2;设定移位次数
shl ah,cl;ah=8*a add ah,dl;ah=10*a add al,ah;al=10*a+al xor ah,ah;清零ah int 3;返回DOS 注意: 入口:AX中存放有“和”(两非压缩BCD码)出口:AL中 已为调整后的二进制数
〔习题2.29〕解释如下有关中断的概念:
(1)内部中断和外部中断(2)单步中断和断点中断(3)除法错中断和溢出中断(4)中断向量号和中断向量表 〔解答〕
(1)内部中断是由于8086CPU内部执行程序引起的程序中断;外部中断是来自8086CPU之外的原因引起的程序中断;
(2)单步中断是若单步标志TF为1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号为3通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;
(3)除法错中断是在执行除法指令时,若除数为0或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令INTO时,若溢出标志OF为1时产生的中断;
(4)中断向量号是 中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。
〔习题2.30〕试比较INT n和段间CALL指令、IRET和段间RET指令的功能。
〔解答〕
INT n 响应中断时,除象CALL保护断点外,还应保护FR;段间CALL指令用在主程序中实现子程序的调用。IRET 返回时,除象RET恢复断点外,还应恢复FR;子程序执行完成后,应返回主程序中继续执行,这一功能由RET指令完成。
第二篇:C语言程序设计教程课后习题答案
C语言程序设计教程课后习题答案
第一章 C语言程序设计概述 -习题答案 算法的描述有哪些基本方法?
答
1、自然语言
2、专用工具C语言程序的基本结构是怎样的?举一个例子说明。
答
1、C语言程序由函数构成;
2、“/*”与“*/”之间的内容构成C语言程序的注释部分;
3、用预处理命令#include、#define可以包含有关文件或预定义信息;
4、大小写字母在C语言中是有区别的;
5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。C语言有什么特点?
答
1、具有结构语言的特点,程序之间很容易实现段的共享;
2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;
3、运算符丰富,包含的范围很广;
4、数据类型丰富;
5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;
6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;
7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。★指出合法与不合法的标识符命名。
答
AB12--√ leed_3--a*b2--× 8stu--× D.K.Jon--× EF3_3--√ PAS--√ if--× XYZ43K2--√ AVE#XY--× _762--√ #_DT5--× C.D--×说明下列Turbo C热键的功能。
答
F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。说明下列Turbo C方式下输入并运行下列程序,记录下运行结果。
①main()
{printf(“********************n”);printf(“ welcome you n”);printf(“ very good n);printf(”********************n“);} ②main()
{ int a,b,c,t;printf(”please input three numbers;“);scanf(”%d,%d,%d“,&a,&b,&c);/*教材S是错误的*/ t=max(max(a,b),c);printf(”max number is:%dn“,t);} int max(int x, int y){ int z;if(x>y)z=x;else z=y;return(z);} 答
运行结果:
******************** welcome you very good ******************** 运行结果:
please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/ max number is:4 7 一个C程序是由若干个函数构成的,其中有且只能有一个___函数。
答
main()8 在Turbo C环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果。
答
1、User screen
2、Alt+F5 9 ★C语言对标识符与关键字有些什么规定?
答
1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头。
2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。C源程序输入后是如何进行保存的?
答
是以C为扩展名保存的纯文本文件。
第二章 C语言程序的基本数据类型与表达式 -习题答案 ★指出下列常数中哪些是符合C语法规定的。
答
''--× '101'--× ”“--× e3--× 019--√ 0x1e--√ ”abn“--√ 1.e5--×(2+3)e(4-2)--× 5.2e2.5--×请找出下列程序中的错误,改正后写出程序运行结果。
①void main(){int x,y=z=5,aver;x=7 AVER=(x+y+z)/3 printf(”AVER=%dn“,aver);} ②void main()
{ char c1='a';c2='b';c3='c';int a=3.5,b='A' printf(”a=%db='“endn”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);} 答
main(){int x,y=5,z=5,aver;x=7;aver=(x+y+z)/3;printf(“AVER=%dn”,aver);}
运行结果:AVER=5 ②main()
{ char c1='a', c2='b', c3='c';int a=3,b='A';printf(“a=%d,b='%c'”end“n”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);}
运行结果:a=3,b='A'“end”
aabcc abc 3 写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。int 99
-1 char 'h'
unsigned int
float
55.78
long int
答 int 99 104 66 55 68-1 char 'c' 'h' 'B' '7' 'D'
unsigned int 99 104 66 55 68 65535
float 99.00 104.00 66.00 55.78 68.00-1.00
long int 99 104 66 55 68-1
★写出程序运行结果。
①void main(){int i,j;i=8,j=10;printf(“%d,%d,%d,%dn”,i,j,++i,j++);} ②main()
{ int a=1,b=2,c=30;;printf(“%d,%d,%d,%dn”,a=b=c,a=b==c,a==(b=c),a==(b==c));} 注意:a=b=c,a=b==c之间应为逗号,教材有误 答
运行结果: 9,11,9,10 运行结果: 30,1,0,0
③void main()
{int a=10,b=20,c=30,d;d=++a<=10||b-->=20||c++;printf(“%d,%d,%d,%dn”,a,b,c,d);}
答
运行结果: 11,19,30,1
★写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。⑴a%=(b%=3)
⑵n++,a+=a-=a*=a ⑶(float)(a+c)/2+(int)x%(int)y ⑷a*=b+c ⑸++a-c+b++ ⑹++a-c+++b ⑺a
⑼a+b,18+(b=4)*3,(a/b,a%b)
⑽x+a%3*(int)(x+y)%2/4+sizeof(int)⑾a
答
⑴0 ⑵0 ⑶9.500000 ⑷90 ⑸10 ⑹10 ⑺'A' ⑻2 ⑼4.5 ⑽1 ⑾0 ⑿20 ⒀0 下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)?
①m=(a=4,4*5)与m=a=4,4*5 ②(float)(a/b)与(float)a/b ③(int)a+b与(int)(a+b)④m%=2+a*3与m=m%2+a*3 ⑤m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b 答
①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;
②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。
③因为a、b均为整数,其前后两个表达式的计算结果是一致的。
④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。⑤前后表达式的计算结果应该是一致的:a=2, b=3, m=6 7 条件表达式x>0?x:-x的功能是什么?
答
如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。用一个条件表达式描述从a、b、c中找出最大都赋给max.答
max=a>(b>c?b:c)?a:(b>c?b:c);9 ★若x为int型变量,则执行以下语句后x的值为()。x=6;x+=x-=x*x;A.36 B.-60 C.60 D.-24 答 B.10 ★若有以下类型说明语句: char w;int x;float y;double z;则表达式w*x+z-y的结果为()类型。A.float B.char C.int D.double 答 D.第三章 顺序结构程序设计 -习题答案 变量k为float类型,调用函数scanf(“%d”,&k),不能使变量k得到正确数值的原因是___。
答
格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。★a=1234,b=12,c=34,则执行“printf(“|%3d%3d%-3d|n”,a,b,c);”后的输出是___。
答
|1234 1234 |
分析如下:
①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。
②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。★设有“int a=255,b=8;”,则“printf(“%x,%on”,a,b);”输出是___。答 ff,10 ①如果“printf(“%X,%on”,a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。
②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改“printf(“%#x,%on”,a,b);”为或“printf(“%#X,%on”,a,b);”。本条解释不必须掌握。★以下程序输出的结果是___。main(){ int a1=1,a2=0,a3=2;printf(“%d,%d,%dn”,a1,a1+a2+a3,a3-a1);} 答 1,3,1 5 printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出。
答
①实际 ②左端补空格 6 ★已定义变量如下: int a1,a2;char c1,c2;若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是___。
答
scanf(“%d,%d,%c,%c”,&a1,&a2,&c1,&c2);7 输入两个整型变量a、b的值,输出下列算式以及运算结果___。a+b、a-b、a*b、a/b、(float)a/b、a%b 每个算式占一行。如a=10,b=5,a+b输出为:10+5=15 答
设int a=10,b=5;以下为输出语句及结果: ①printf(“%d+%d=%dn”,a,b,a+b);10+5=15 ②printf(“%d-%d=%dn”,a,b,a-b);10-5=5 ③printf(“%d*%d=%dn”,a,b,a*b);10*5=50 ④printf(“%d/%d=%dn”,a,b,a/b);10/5=2 ⑤printf(“%(float)d/%d=%fn”,a,b,(float)a/b);(float)10/5=2.000000 ⑥printf(“%d%%%d=%dn”,a,b,a%b);10%5=0 8 ★输入一个非负数,计算以这个数为半径的圆周长和面积。答
#define PI 3.1415926 main(){ float r,l,area;printf(“Input a positive:”);scanf(“%f”,&r);l=2*PI*r;area=PI*r*r;printf(“l=%ftarea=%fn”,l,area);} 9 输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。
答
main(){ int x,y;printf(“Input a number(100-999):”);scanf(“%d”,&x);y=100*(x%10)+10*(x/10%10)+x/100;/*注意分析此处算法*/
第三篇:《C语言程序设计教程》课后题答案
《C语言程序设计教程》课后题答案
第一章
一选择题
1.A 2.B 3.C 4.D 5.B 6.C 二.填空题 1.程序 2.算法
3.main或主 4.编译 5.编译 6..obj 7.库函数
8.文本或ASCII码
三、编程题
1.参考代码如下: #include
printf(“金n木n水n火n土n”);} 2.参考代码如下: #include
scanf(“%d%d”,&a,&b);
printf(“%d+%d=%dn”,a,b,a+b);
printf(“%d-%d=%dn”,a,b,a-b);
printf(“%d*%d=%dn”,a,b,a*b);
printf(“%d/%d=%dn”,a,b,a/b);} 3.参考代码如下: #include
float a,b,h,s;
scanf(“%f%f%f”,&a,&b,&h);
s=(a+b)*h/2;
printf(“s=%fn”,s);}
第二章
一选择题 答案及分析: 1.B,略
2.A,-8在内存中是以补码(设两个字节)形式存储的 3.A,C语言有32个关键字(参见课本第18页),且C语言标识符是区分大小写字母的 4.A,略
5.D,八进制数据中不能出现数码8 6.B,字符常量应该用单引号括起来,答案D超出了ASCII取值范围(ASCII的取值范围为[0,255])
7.C,该字符串中转义字符有三个:、22和 n,普通字符有三个:a、,和0,所以字符串长度为6 8.C,略
9.D,C语言没有read函数和%D格式符号,且scanf函数第二个形参为地址列表
10.B,根据题意,scanf函数输入数据时分隔符号不应该是逗号,应该是空格或回车符,且输入数据时分一行或几行均可
11.A,scanf函数中不允许出现%8.4,%6.2和%8这样的格式符号
12.C,既要保证5位小数位,还得保证整数位不变,这样数据12345.67800用10列不能完全显示出来,按C语言规定,12345.67800原样输出
13.B,printf函数中格式符号%d,%o,%x表示对应的整型数据分别按十进制,八进制和十六进制输出
14.C,按C语言规定,scanf函数形参双引号中,如果包含非格式符号,在输入数据时要求原样输入 二.填空题 答案及分析:
1.int
float
double(略)
2.65,89,printf函数中如果格式符号是%d,则输出相应字符的ASCII十进制数值
3.a=98,b=765.000000,c=4321.000000,scanf函数中的格式符号%2d%3f%4f,表示将键盘输入的数据9876543210按2,3,4位分割,然后再分别赋给变量a,b,c 4.scanf(“%lf%lf%lf”,&a,&b,&c);double类型的变量对应的格式符号是%lf
三、编程题
1.参考代码如下: #include
int a=97;
printf(“%cn”,a);
printf(“%dn”,a);
printf(“%on”,a);
printf(“%xn”,a);} 程序分析:通过printf函数中不同的格式符号,即%c(字符),%d(十进制),%o(八进制),%x(十六进制)输出相应的值。2.参考代码如下: #include
int h,m,minute;
scanf(“%d:%d”,&h,&m);
minute=h*60+m;
printf(“minute=%dn”,minute);} 程序分析:输入形式为10:27,故scanf函数双引号中两个格式符号%d之间必须加入“:”。3.参考代码如下: #include
float r=6371000,s,v;
s=4*3.1415926*r*r;
v=3.1415926*4/3*r*r*r;
printf(“s=%fnv=%f”,s,v);} 程序分析:C语言中的π不代表3.1415926,可以用各种常量的形式体现出来。4.参考代码如下: #include
int m100,m50,m20,m10,m5,m1,m;
scanf(“%d”,&m);
m100=m/100;
m50=(m-m100*100)/50;
m20=(m-m100*100-m50*50)/20;
m10=(m-m100*100-m50*50-m20*20)/10;
m5=(m-m100*100-m50*50-m20*20-m10*10)/5;
m1=m-m100*100-m50*50-m20*20-m10*10-m5*5;
printf(“%d元发工资,人名币各票面的张数为:n”,m);
printf(“100元的张数:%dn”,m100);
printf(“50元的张数:%dn”,m50);
printf(“20元的张数:%dn”,m20);
printf(“10元的张数:%dn”,m10);
printf(“5元的张数:%dn”,m5);
printf(“1元的张数:%dn”,m1);} 程序分析:人民币的面值分别为100元,50元,20元,10元,5元和1元,工资4367元除以100后得到的商就为100元张数,余数再除以50,得到的商为50元的张数,余数再除20,„„,以此类推就会得出人民币各面值相应的张数。5.参考代码如下: #include
float r1,r2,r3,r;
scanf(“%f%f%f”,&r1,&r2,&r3);
r=r1*r2*r3/(r1*r2+r2*r3+r1*r3);
printf(“三个电阻并联后的总电阻为%fn”,r);} 程序分析:首先将计算并联电阻值的公式变换一下;再就是考虑要保留小数位,故变量类型设置为实型,注意格式符号为%f。6.参考代码如下: #include
int x,a,b,c,d,y;
scanf(“%d”,&x);
a=x%10;
b=x/10%10;
c=x/100%10;
d=x/1000;
y=a*1000+b*100+c*10+d;
printf(“%d逆置各位数后的值为%dn”,x,y);} 程序分析:1234除以10的余数就是4,商再除以10的余数就是3,1234除以100再除以10取余就是2,1234除以1000就是1。也可以用其他的表达式求出各位数值,例如输入数据1234中的4,可以用公式a=x-d*1000-c*100-b*10来计算。7.参考代码如下: #include
float F,C;
printf(“请输入华氏温度:”);
scanf(“%f”,&F);
C=5.0/9*(F-32);
printf(“华氏温度%f对应的摄氏温度为%fn”,F,C);} 程序分析:5/9的值为0,所以要写成5.0/9,5/9.0或5.0/9.0,还要注意变量类型为实型,且对应的格式符号为%f。8.参考代码如下: #include
char ch1,ch2,ch3;
printf(“请输入三个数字字符:”);
scanf(“%c%c%c”,&ch1,&ch2,&ch3);
printf(“将数字字符转换为数字%d,%d,%dn”,ch1-'0',ch2-48,ch3-'0');} 程序分析:通过键盘输入三个数字字符时要连续输入,不要加任何分隔符号,例如121等,另外,数字字符输出时遇到格式符号%d将输出相应数字字符的ASCII值,但任何一个数字字符的ASCII值减去字符0的ASCII值,再对应%d格式符号输出时,就是数字字符对应的数字,例如'2'-'0'=2。
9.不能得到指定的输出结果,参考代码如下: void main(){
int a, b, c,x, y;
scanf(“%d%d%d”,&a,&b,&c);
x=a*b;
y=x*c;
printf(“a=%d,b=%d,c=%dn”,a,b,c);
printf(“x=%d,y=%dn”,x,y);}
程序分析:scanf(“%d,%d,%d”,a,b,c);scanf函数第二类形参是地址列表,所以语句改为scanf(“%d,%d,%d”,&a,&b,&c);而这个语句对应的键盘输入形式为2,3,4。为了满足题目要求,scanf语句改为scanf(“%d%d%d”,&a,&b,&c)。另外,printf函数双引号只能出现一对,且双引号中需要在相应的位置上添加a=等这样的字符串才能原样输出;还有整型变量对应格式符号是%d等。
第三章
一选择题
1.A 2.C 3.C 4.D 5.C 6.B 7.C 8.B 9.A 10.A 11.A 12.B 13.D 14.A 15.B 16.C 17.C 18.C 19.C 20.C 21.C 22.B 23.C 24.C 25.A 26.B 27.A 28.A 29.C 30.A 31.C 32.C 二.填空题 1.非零
零 2.passwarm 3.525252 4.fabs(x)>5 5.x%y==0 6.if((1<=x&&x<=10||200<=x&&x<=210)&&x%2==1)printf(“%d”,x);7.k=1 8.Right!1
Right!1 9.$$$ a=0 10.a=2,b=1 11.0 “%f%f” a=b;13.“%c”,&ch 'A'<=ch&&ch<='Z' ch 14.死循环 15.345 16.7 3-1 17.x>=0 x j%3!=0 24.b=i+1 25.8 5 2 26.d=1.0 k++ k<=n 三、编程题 1.参考代码如下: #include y=x;else if(x==0) y=x-1;else if(x>0&&x<10) y=x+1;printf(“y=%f”,y);} 2.参考代码如下: #include float a,b,c; printf(“请输入三角形三边的长度:n”); scanf(“%f%f%f”,&a,&b,&c); if(a+b>c&&b+c>a&&a+c>b) if(a==b&&a==c) printf(“该三角形是等边三角形n”); else if(a==b&&a!=c) printf(“该三角形是等腰三角形n”); else printf(“该三角形是一般三角形n”); else printf(“不能构成三角形n”);} 3.参考代码如下: #include float M,N,menoy; printf(“请输入购买金额:”); scanf(“%f”,&M); if(M<100) N=0; else if(M>=100&&M<200) N=1.5; else if(M>=200&&M<300) N=2.5; else if(M>=300&&M<400) N=3.5; else if(M>=400&&M<500) N=4.5; else if(M>=500&&M<600) N=5.5; else N=6; menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 4.参考代码如下: #include float M,N,menoy; int in; printf(“请输入购买金额:”); scanf(“%f”,&M); in=M/100; switch(in) { case 0:N=0;break; case 1:N=1.5;break; case 2:N=2.5;break; case 3:N=3.5;break; case 4:N=4.5;break; case 5:N=5.5;break; default :N=6;break; } menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 5.参考代码如下: #include float x,max; printf(“Enter a number:”); scanf(“%f”,&x); max=x; while(x>0) { printf(“Enter a number:”); scanf(“%f”,&x); if(x>max) max=x; } if(max>0) printf(“The largest number entered was %fn”,max);} 6.参考代码如下: #include float M,N,menoy; printf(“请输入购买金额:”); scanf(“%f”,&M); while(M>0) { if(M<100) N=0; else if(M>=100&&M<200) N=1.5; else if(M>=200&&M<300) N=2.5; else if(M>=300&&M<400) N=3.5; else if(M>=400&&M<500) N=4.5; else if(M>=500&&M<600) N=5.5; else N=6; menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy); printf(“请输入购买金额:”); scanf(“%f”,&M); } } 7.参考代码如下: #include float number,positivesum=0,negativesum=0,total=0; int i; for(i=1;i<=10;i++) { scanf(“%f”,&number); if(number>=0)positivesum+=number; else negativesum+=number; total+=number; } printf(“positive sum %f,negative sum %f,total %fn”,positivesum,negativesum,total);} 8.参考代码如下: #include int i,sum=0,k=1; for(i=1;i<=101;i+=2) { sum=sum+k*i; k=-k; } printf(“1-3+5-7+...-99+101=%dn”,sum);} 9.参考代码如下: #include float i,sum=0,k=1; for(i=1;k>=1e-4;i++) { sum=sum+k; k=k/i; } printf(“e=%fn”,sum);} 10.参考代码如下: #include float i,sum=0,n=2,d=1,temp; for(i=1;i<=20;i++) { sum=sum+n/d; temp=n; n=n+d; d=temp; } printf(“sum=%fn”,sum);} 11.参考代码如下: #include float apple,watermelon,pear; for(apple=1;apple<100;apple++) for(watermelon=1;watermelon<10;watermelon++) { pear=100-apple-watermelon; if(fabs(apple*0.4+watermelon*4+pear*0.2-40.0)<1e-6) printf(“apple:%.0f,watermelon:%.0f,pear:%.0fn”,apple,watermelon,pear); } } 12.参考代码如下: #include int i,j,k; for(i=1;i<10;i++) for(j=0;j<10;j++) for(k=0;k<10;k++) if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) printf(“%dn”,i*100+j*10+k);} 或: #include int a,b,c,i; for(i=100;i<1000;i++) { a=i/100; b=i/10%10; c=i%10; if(i==(a*a*a+b*b*b+c*c*c)) printf(“%dn”,i); } } 13.参考代码如下: #include int a,b,c,d; for(a=1;a<10;a++) for(b=0;b<10;b++) for(c=0;c<10;c++) for(d=0;d<10;d++) if(a*1000+b*100+c*10+d==(a*10+b+c*10+d)*(a*10+b+c*10+d)) printf(“%dn”,a*1000+b*100+c*10+d);} 或: #include int a,b,c,d,i; for(i=1000;i<10000;i++) { a=i/1000; b=i/100%10; c=i/10%10; d=i%10; if(i==(a*10+b+c*10+d)*(a*10+b+c*10+d)) printf(“%dn”,i); } } 14.参考代码如下: #include int i,j; for(i=1;i<=4;i++)//先控制打印前4行 { for(j=1;j<=4-i;j++) printf(“ ”); for(j=1;j<=2*i-1;j++) printf(“*”); printf(“n”); } for(i=1;i<=3;i++)//再控制打印后3行 { for(j=1;j<=i;j++) printf(“ ”); for(j=1;j<=2*(4-i)-1;j++) printf(“*”); printf(“n”); } } 第四章 一选择题 1.A,如果没有给s[1]赋值,按C语言规定,s[1]下标变量中的数据是一个随机数 2.C,“China”字符串末尾还有一个 ,故占6个字节 3.D,scanf函数中格式符号若是%c,则把输入的第一个字符'1'赋给变量c,然后遇到格式符号%d,则把后续的23(遇到空格结束)赋值给变量i,遇到格式符号%s,则把后续的字符串“456”(遇到空格结束)赋值给变量s 4.D,C语言规定,数组在定义时就已经分配好了所占内存空间,所以int x[5]在内容中占的字节数为4*5=20 5.B,内层循环变量j每次都从0开始,使得在外层循环变量i每取一个值时,n[0]和n[1]的值都得重新计算 6.B,这是求十进制数18对应二进制数的程序,将每次18除以2得到的余数依次放到数组a[0]到a[4]中,最后按a[4]到a[0]这样的顺序输出 7.B,第一个for循环给a[0]到a[9]赋值为0到9,第二个for循环给p[0]到p[2]赋值为0,2,6,第三个for循环使k=k+p[0]*2+p[1]*2+p[2]*2=5+4+12=21 8.D,C语言规定,定义二维数组时不能省略第二维下标值,但可以省略第一维下标值 9.B,略 10.A,每行的第4列元素的值都为0 11.C,略 12.D,C语言规定,字符数组不能用s=“abcd”这样的赋值语句赋值 13.C,float类型的变量对应格式符号通常为%f,不是%d 14.A,每行的第3列元素的值均为0 15.D,略 16.C,A这种赋值形式无法放置字符串末尾的 ,B和D不符合C语言规定,即字符数组不能用s=“good”这样赋值语句赋值 17.A,这是字符数组str初始化的形式,str[0]到str[5]分别为字符s,t,r,i,n,g,str[6]到str[11]的值均为 ,函数strlen是统计字符串包含字符的个数,遇到 (不包括 )结束,所以str长度为6 18.C,x数组比y数组多了一个字符 19.A,数组名就是数组第一个元素的地址,所以scanf(“%s”,&s);中得删除数组名前面的& 20.D,puts和putchar函数只有一个参数,printf函数中格式符号%s应该对应的是数组名 21.D,程序功能是输出第2和第3个字符串 22.A,双层循环完成的功能是求s的值,s=(((a[0][0]*10+a[0][2])*10+a[1][0])*10+a[1][2]=(((6*10+3)*10+8)*10+5=6385 二.填空题 1.a=1234 b=5 答案分析:C语言规定,使用scanf函数通过键盘输入数据时,除了格式符号和转义字符,其他符号要原样输入。 2.Hello 答案分析:b[5]=0等于b[5]= ' ',是因为字符 的ASCII值就是0,而printf(“%sn”,b);的功能是输出字符串,但遇到空格或 等字符时结束输出,所以答案为Hello。 3.j<3;b[j][i]=a[i][j];i<3 答案分析:通过两个数组下标变量位置的变换来完成程序功能。 4.a[age]++ i=18;i<=25 答案分析:用数组a来存储每个年龄段的人数,并通过a[age]++来实现。5.c[i]=n%base;b[d] 答案分析:十进制整数转换为n进制采用的是除以n取余法,使用变量base存放某个进制的值,c数组存放每次计算的余数。最后一个for循环输出不同进制所对应的数码符号。6.break;i>=8 答案分析:如果找到某个数,则通过break语句终止循环。7.-850,2,0 答案分析:程序功能是查找并输出二维数组中最小值及其下标值。8.a[i]>b[j] i<3 j<5 答案分析:数组a和b的长度可以相等或不等,通过i<3或j<5来看哪个数组的值还没有放进c数组中。 9.a[i][j] j=0;j<4;j++ j==3 printf(“n”); 答案分析:用数组a最后一列,即第4列来保存每行的和,通过printf(“n”);语句来控制按3行来输出。10.fi 答案分析:略 11.GDABC 答案分析:略 12.s[i++] 答案分析:while(s[i])表示当s[i]中的字符不为 时进入循环体,否则退出while循环。 13.ahAMa 答案分析:通过scanf(“%s”,a);给字符数组赋值时遇到空格或回车符号将终止输入。程序功能是将字符串中的字符a,大写变成小写,小写变成大写,其他字符保持不变。14.LBLMNP 答案分析:执行strcat(a,b);语句后,a数组的值为“ABLMNP”,b数组的值为“LMNP”;在执行while(a[j++]!=0)b[j]=a[j];时,b[j]中的j值是前面a[j++]中j++执行后的值,即while循环首先执行b[1]=a[1]= 'B',然后是b[2]=a[2]= ' L',b[3]=a[3]= 'M',„„,b[0]中的字符保持不变,仍是' L'。15.' ' i++ 答案分析:因为while(str[i])是通过字符串末尾的 来判断字符串是否读取结束,所以字符数组str最后要有一个字符串结束符号 。16.b[j]=a[j][0];b[j]=a[j][k] 答案分析:用b数组存储每行中的最大字符,最终b[0]存放第一行字符中的最大字符,b[1] 存放第一行字符中的最大字符,„„。b[j]=a[j][0]的作用是在查找一串字符中最大字符前,先把这串字符第一个字符放到b[j]中,然后通过循环和条件判断来实现最大字符的查找。17.a[k++]=a[j] 答案分析:略 三、编程题 1.参考代码如下: #include int array[31],total=0; int i,j=1; for(i=0;i<30;i++) { array[i]=2*j; j++; total=total+array[i]; } array[30]=total/30; for(i=0;i<31;i++) printf(“%d,”,array[i]);} 答案分析:由于平均值要放在数组array的末尾,所以在定义数组时要多定义一个元素,即array[31]。另,为了保持数组类型一致性,故平均值也只取整数值。2.参考代码如下: #include int i,j,k,a[20],temp; srand(time(NULL)); for(i=0;i<20;i++) { a[i] = rand()% 101;//产生[0,100]之间的随机数,取整后赋给a[i] printf(“%d ”,a[i]); } printf(“n”); for(i=0;i<19;i++) { k=i; for(j=i+1;j<20;j++) if(a[j] if(k!=i)temp=a[i],a[i]=a[k],a[k]=temp; } for(i=0;i<20;i++) printf(“%d ”,a[i]);} 程序分析:略 3.参考代码如下: #include int i,maxi,a[30]; srand(time(NULL)); for(i=0;i<30;i++) { a[i] = rand()% 101; //产生[0,100]之间的随机数,取整后赋给a[i] printf(“%d ”,a[i]); } printf(“n”); maxi=0; for(i=1;i<30;i++)