C语言程序设计项目教程课后参考答案

时间:2019-05-12 18:45:34下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《C语言程序设计项目教程课后参考答案》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《C语言程序设计项目教程课后参考答案》。

第一篇:C语言程序设计项目教程课后参考答案

《C语言程序设计项目教程》课后参考答案

连雁平

武夷学院数学与计算机学院

2013.9.25 第一章: 1.填空题

(1)函数

主函数

函数

(2)/*

*/(3)连接

(4)#

(5).h

(6).c

.obj

.exe 2.选择题

(1)C(2)C(3)D(4)B(5)D(6)A 3.程序设计题

(1)#include

void main()

{

printf(“*”);

printf(“**”);

printf(“***”);

printf(“**”);

printf(“*”);}(2)#include

void main()

{

printf(“***************”);

printf(“这是我的C程序”);

printf(“***************”);} 第二章: 1.填空题

(1)0x(2)(3)5(4)a%2!=0(5)0(6)x>20&&x<=60(7)3.500000(8)0(9)2(10)4 2.选择题

(1)C(B答案如果斜杆之间无空格是对的)

(2)A(3)B(4)B(5)A(输出结果是字符5)

(6)C(7)B(8)A(9)C(10)A(11)B(12)D(13)D(14)D(15)B(16)A(17)B(18)C C(19)A(20)与第2题题目一样

(21)C(22)第一个w应该是变量x才是,无答案

(23)D(24)D(25)B 3.程序设计题

(1)#include

void main()

{ float a=2,b=6,h=3.6;printf(“%f”,(a+b)*h/2);}

(2)#include void main(){ int time,h,m,s;scanf(“%d”,&time);s=time%60;m=time/60%60;h=time/3600;printf(“时间是%d小时%d分%d秒”,h,m,s);} 第三章: 1.选择题

(1)D(2)D(A的答案要修改一下,不然也是不合法)(3)和(4)与第一题相同(5)D(6)D(7)A(8)B 2.编程题

(1)#include void main(){

char c;

c=getchar();

putchar(c-1);

putchar(c);

putchar(c+1);}(2)#include void main(){ int score1,score2,score3,score4,sum;

float avr;scanf(“%d,%d,%d,%d”,&score1,&score2,&score3,&score4);

sum=score1+score2+score3+score4;

avr=sum/4.0;

printf(“总成绩是:%d,平均分是:%f”,sum,avr);} 第四章: 1.填空题

(1)1(2)54321(3)(x%3==0||x%7==0)

f=1;(4)y is 1.I do this.2.选择题

(1)B(2)D(3)B(4)C(5)A(6)A 3.编程题(1)

#include

void main(){ int i;scanf(“%d”,&i);if(i%2==0)

printf(“%d是偶数!”,i);else

printf(“%d是奇数!”,i);}(2)

#include #include void main(){ int a,b,i;for(a=3;a<=100;a++){

b=sqrt(a);

for(i=2;i<=b;i++)

if(a%i==0)break;

if(i>b)

printf(“%d ”,a);} }(3)

#include void main(){ int n,t=1,T=0;for(n=1;n<=5;n++){

t*=n;

T+=t;} printf(“1!+2!+3!+4!+5!=%d”,T);}(4)

#include void main(){ char ch;int i=0;while((ch=getchar())!='n')

i++;

printf(“总共输入%d个字符”,i);} 第五章: 1.填空题

(1)14 0(2)[常量表达式1][常量表达式2](3)按行存放

(4)i*n+j+1(5)0

0(6)首地址

(7)字符

1(8)string.h(题干中“写入库函数”应该是“包含头文件”)

(9)2 1(10)for(i=0;i<20;i++)printf(“%d”,a[i]);(题干中应该写明“整形数组a[20],下标用i表示”)2.选择题

(1)B(2)D(3)CD(题干“数组a”应该是“数组b”)

(4)C(答案C应该是“double c[5][4];”)(5)D(B答案中的a[n]应该是a[m])

(6)C(7)D(8)D(9)D(该题与填空题第4题重复)

(10)C(11)B(12)C(13)D(14)B(15)B(16)D(17)A(18)B(19)D(20)D(题干“字符中”应该是“字符串”)(21)C(22)D(23)D(24)B(25)D 3.分析题

(1)1 0 0 0 0(第七行应该是s[i][j])(2)AB LMNP

0 1 0 0 0

(3)SW(case „I‟后面是冒号不是分号)

0 0 1 0 0

0 0 0 1 0

0 0 0 0 1(4)array a:(第一个for循环后面的左花括号去掉)(5)1 7

array b: 12 13 1 4

17 18 19 2 5

22 23 24 25 3 6 4.编程题(1)

#include void main(){ int a[20];

int i,j,t;printf(“input 20 numbers :n”);for(i=0;i<20;i++)

scanf(“%d”,&a[i]);

printf(“n”);for(j=0;j<19;j++)for(i=0;i<19-j;i++)

if(a[i]

{t=a[i];a[i]=a[i+1];a[i+1]=t;} printf(“the sorted numbers :n”);for(i=0;i<20;i++)printf(“%d ”,a[i]);

printf(“n”);}(2)

#include void main(){

int a[4][4],i,j,max,row1,column1;

int min,row2,column2;

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

for(j=0;j<4;j++)

scanf(“%d”,&a[i][j]);

max=a[0][0];row1=0;column1=0;

min=a[0][0];row2=0;column2=0;

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

for(j=0;j<4;j++)

{

if(max

{

max=a[i][j];

row1=i;

column1=j;

}

if(min>a[i][j])

{

min=a[i][j];

row2=i;

column2=j;

}

} printf(“max=%d,row=%d,column=%dn”,max,row1+1,column1+1);printf(“min=%d,row=%d,column=%dn”,min,row2+1,column2+1);}(3)

#include void main(){ int num[4][4]={32,30,49,56,15,7,31,9,2,8,24,17,37,19,98,35};int i,j,data1,data2,max,min;for(j= 0;j<4;j++){

min= num[j][0];

data1=0;

for(i=1;i<4;i++)

{

if(min>num[j][i])

{

min=num[j][i];

data1 = i;

}

}

max=num[0][data1];

data2 = 0;

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

{

if(max

{

max=num[i][data1];

data2 = i;

}

}

if(data2 == j)

printf(“该矩阵的马鞍点是: num[data2][data1]);

} }(4)

#include #include void main(){ char str[50];int i,s;printf(”请输入一行字符串:“);gets(str);s=strlen(str);printf(”字符串倒序输出:“);for(i=s-1;i>=0;i--)

printf(”%c“,str[i]);}(5)

#include #include void main(){ char a[80],str1[80],str2[80],str3[80];printf(”请输入三个字符串“);printf(”字符串str1:“);gets(str1);

num[%d][%d]=%dn”, data2, data1,printf(“字符串str2:”);gets(str2);printf(“字符串str3:”);gets(str3);if(strcmp(str1,str2)>0)strcpy(a,str1);else strcpy(a,str2);if(strcmp(a,str3)>0)puts(a);else puts(str3);}(6)

#include void main(){ int score[20][3],sum[20],i,j,t;for(i=0;i<20;i++)

for(j=0;j<3;j++)

scanf(“%d”,&score[i][j]);for(i=0;i<20;i++)

sum[i]=0;for(i=0;i<20;i++)

for(j=0;j<3;j++)

sum[i]+=score[i][j];for(i=0;i<20;i++)

for(j=0;j<20-i;j++)

if(sum[j]

{t=sum[j];sum[j]=sum[j+1];sum[j+1]=t;} printf(“总成绩从大到小顺序是:”);for(i=0;i<20;i++)

printf(“%4d”,sum[i]);} 第六章 1.填空题(1)int(2)值传递

址传递

(3)2(4)static(5)1(6)10,20,40,40(7)②

(8)13

2.选择题

(1)B(2)A(3)D(4)C(5)A(6)B(7)D 3.程序设计题 1.int fun(int x,int y){

char c;

switch(c=getchar())

{

case '+':return x+y;break;8)B 24

case '*':return x*y;break;default:printf(“输入的符号不对!”);

} } 2.#include void strfun(char a[],char b[]){

int alen=strlen(a);

int blen=strlen(b);

int i;

for(i=0;i

a[alen+i]=b[i];

puts(a);} 3.float fun(int n){ float i,t=1.0,s=0;for(i=1;i<=n;i++){

t=t/i;

s+=t;} return s;} 4.void charsum(char s[80],int sum[4]){

int i,strl;

strl=strlen(s);

for(i=0;i

if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))

sum[0]++;

else if(s[i]>='1'&&s[i]<='9')

sum[1]++;

else if(s[i]==' ')

sum[2]++;

else

sum[3]++;

printf(“字母个数是:%d,数字个数是:%d,空格个数是:是:%dn”,sum[0],sum[1],sum[2],sum[3]);} 5.%d,其他字符个数

#include #define MAX(a,b,c)((a)>(b)?(a):(b))>(c)?((a)>(b)?(a):(b)):(c)void main(){ int a,b,c;printf(“请输入三个数字:”);scanf(“%d%d%d”,&a,&b,&c);printf(“最大的数字是:%d”,MAX(a,b,c));}

第二篇: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 void main(){

printf(“金n木n水n火n土n”);} 2.参考代码如下: #include void main(){ int a,b;

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 void main(){

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 void main(){

int a=97;

printf(“%cn”,a);

printf(“%dn”,a);

printf(“%on”,a);

printf(“%xn”,a);} 程序分析:通过printf函数中不同的格式符号,即%c(字符),%d(十进制),%o(八进制),%x(十六进制)输出相应的值。2.参考代码如下: #include void main(){

int h,m,minute;

scanf(“%d:%d”,&h,&m);

minute=h*60+m;

printf(“minute=%dn”,minute);} 程序分析:输入形式为10:27,故scanf函数双引号中两个格式符号%d之间必须加入“:”。3.参考代码如下: #include void main(){

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 void main(){

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 void main(){

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 void main(){

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 void main(){

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 void main(){

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 void main(void){ float x,y;printf(“Please input the value of x:”);scanf(“%f”,&x);if(x>-5&&x<0)

y=x;else if(x==0)

y=x-1;else if(x>0&&x<10)

y=x+1;printf(“y=%f”,y);} 2.参考代码如下: #include void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 #include void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 void main(void){

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 #include #include void main(){

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 #include #include void main(){

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++)

if(a[maxi]

for(i=maxi+1;i<30;i++)//将最大数后边的数据依次前移一个位置

a[i-1]=a[i];

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

printf(“%d ”,a[i]);} 程序分析:略

4.参考代码如下: #include void main(){

int i,n=0,a[30],x;

scanf(“%d”,&x);//输入要转换的数据

do

{

a[n]=x%2;//取余数

n++;

x=x/2;

//整除

}while(x!=0);

for(i=n-1;i>=0;i--)//输出

printf(“%d”,a[i]);} 程序分析:利用十进制数除以2取余数的方法计算对应的二进制数。5.参考代码如下: #include #include void main(){

int right[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},s=0,i,y;

char num[18],check[11]= {'1','0','X','9','8','7','6','5','4','3','2'};

printf(“请输入身份证号码的前17位:”);

gets(num);

//输入身份证号码

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

//对前17位数字的权求和

s=s+(num[i]-'0')*right[i];

y=s%11;

//计算模

printf(“last number is %cn”,check[y]);} 程序分析:身份证前17位是以字符串的形式输入的,利用表达式num[i]-'0'可以得到每个字符对应的数字;然后算出y值,再将对应的验证码输出即可,例如若y=10,则输出字符2。6.参考代码如下: #include void main(){

int a[20][20]= {0},i,j,n;

scanf(“%d”,&n);

//输入要打印的杨辉三角形的行数

for(i=0;i

//对第一列和对角线元素赋值

a[i][0]=a[i][i]=1;

for(i=2;i

//求对角线以下、第一列右边的元素值

for(j=1;j

a[i][j]=a[i-1][j]+a[i-1][j-1];

for(i=0;i

//打印杨辉三角形

{

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

printf(“%8d”,a[i][j]);

printf(“n”);

} } 程序分析:杨辉三角形数据矩阵的第一列和对角线上数值均为1,通过for(i=0;i

7.参考代码如下: #include #include #include void main(){

int a[5][6],i,j,max,min;

srand(time(NULL));

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

{

for(j=0;j<6;j++)

{

a[i][j]=rand()%51;产生[0,50]之间的随机数,取整后赋给a[i][j]

printf(“%4d”,a[i][j]);

}

printf(“n”);

}

max=min=a[0][0];

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

for(j=0;j<6;j++)

{

if(max

max=a[i][j];

if(min>a[i][j])

min=a[i][j];

}

printf(“max=%d,min=%dn”,max,min);} 程序分析:先产生30个随机整数放到二维数组a中,然后假设第一个数即是最小数也是最大数,再通过双重循环和条件判断来找到这30个整数的最大值和最小值。8.参考代码如下: #include #include #include void main(){

int a[20][20],i,j,n;

srand(time(NULL));

printf(“请输入n(n*n)的值:”);

scanf(“%d”,&n);

for(i=0;i

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

{

a[i][j]=rand()%51;产生[0,50]之间的随机数,取整后赋给a[i][j]

a[j][i]=a[i][j];

}

for(i=0;i

{

for(j=0;j

printf(“%4d”,a[i][j]);

printf(“n”);

} } 程序分析:通过for(j=0;j<=i;j++)来控制只遍历数值方阵的下三角数据(包括主对角线上的数据),通过a[j][i]=a[i][j];语句完成与下三角对应位置的上三角数组元素的赋值,从而形成对称矩阵。

9.参考代码如下: #include void main(){

char str[80],c;

int i=0;

while((c=getchar())!='n')//接受从键盘输入的字符,直到遇到回车

{

str[i]=c;

//将接受到的字符存入字符数组中

i++;

}

str[i]='';

puts(str);

//检验以上程序的结果是否正确 } 程序分析:gets函数功能是从键盘输入字符串,遇到回车符号结束输入,所以通过while((c=getchar())!='n')来决定键盘输入的每一个字符是否放在数组str中。最后通过str[i]='';语句来添加字符串的结束标志''。10.参考代码如下: #include void main(){

char str[80],temp;

int i,j;

gets(str);

for(i=0;str[i];i++);

//测试字符串长度

i--;

//i为最后一个字符所在下标

for(j=0;j

//对换对称位置的字符

temp=str[i],str[i]=str[j],str[j]=temp;

puts(str);

//输出处理好的字符串 } 程序分析:略

11.参考代码如下: #include void main(){ char month[12][20]= {“****”,“January”,“February”,“March”,“April”,“May”,“June”,“July”, “August”,“September”,“October”,“November”,“December”};

int a,b,c,d,e,number;

printf(“请输入3位正整数,0或负数结束:”);

scanf(“%d”,&number);

while(number>0)

{

a=number/100;

b=number/10%10;

c=number%10;

d=a+b+c;

e=d%12;

if(e==0)printf(“%d=%d+%d+%d=%d,%d%%%d=%d,%sn”,number,a,b,c,d,d,12,e,month[e]);

else printf(“%d=%d+%d+%d=%d,%d%%%d=%d,%sn”,number,a,b,c,d,d,12,e,month[e]);

scanf(“%d”,&number);

} } 程序分析:按照题意先给month数组赋初值,再通过公式把一个3位整数的每位数值提取出来,计算这三个数的和d,然后d除以12取余数,最后输出余数作为下标的对应month数组的数组元素即可。12.参考代码如下: #include void main(){

char str[80];

int i;

gets(str);

for(i=0;str[i]!='';i++)

;

printf(“字符串的长度为%dn”,i);程序分析:通过for(i=0;str[i]!='';i++);中变量i值的递增来遍历数组,最终i的值就是字符串的长度。

第五章

一.选择题

1-5 DDBCB

6-10 BACAA

11-15DBBCD 二.填空题 1.How does she 2.*(p+i*4+j)

printf(“n”)3.*(++p)4.num+1 q

*q>max

*q

n++

b[n]= ''

三、编程题

1.参考代码如下: #include #include #include void main(){

int i,a[20],b[20],*pa,*pb,temp;

srand(time(NULL));

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

{

a[i] = rand()% 101;

b[i] = rand()% 101;

}

printf(“数组a:”);

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

printf(“%d ”,a[i]);

printf(“n”);

printf(“数组b:”);

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

printf(“%d ”,b[i]);

printf(“n”);

pa=a;

pb=b;

for(i=0;i<20;i++)//对换数组a和数组b相同位置的元素

{

temp=*pa;

*pa=*pb;

*pb=temp;

pa++;

pb++;

}

printf(“对换后n”);

printf(“数组a:”);

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

printf(“%d ”,a[i]);

printf(“n”);

printf(“数组b:”);

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

printf(“%d ”,b[i]);} 2.参考代码如下: #include main(){

char str1[80],str2[80],*p1,*p2;

int j;

printf(“input two kinds of string:n”);

gets(str1);

gets(str2);

for(p1=str1,p2=str2;*p1&&*p2;p1++,p2++)/*比较每一对字符,直到出现'',退出循环 */

{

if(*p1!=*p2)break;

/* 若某一对字符不同,则已分出大小,退出循环*/

}

j= *p1-*p2;

/*j为结束比较时那对字符的ASCII码差值 */

if(j>0)

printf(“%dn”,1);

else if(j<0)

printf(“%dn”,-1);

else

printf(“%dn”,0);} 3.参考代码如下: #include int main(){

int a[4][4],temp;

int(*p)[4];

int i,j;

p=a;

//为行指针p赋初值

printf(“Enter array elements:n”);

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

//输入数组元素的值

for(j=0;j<4;j++)

scanf(“%d”,*(p+i)+j);

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

for(j=0;j

{

temp=*(*(p+i)+j);

*(*(p+i)+j)= *(*(p+j)+i);

*(*(p+j)+i)=temp;

}

//转置矩阵

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

//输出数组元素的值

{

for(j=0;j<4;j++)

printf(“%4d”,p[i][j]);

printf(“n”);

}

return 0;} 4.参考代码如下: #include int main(){

char str[80],*sp;

int count[26]= {0},i,a;

gets(str);

for(sp=str;*sp;sp++)//用指针访问字符串

{

a=*sp-97;

//将a字符的个数统计在数组count下标为0的单元,依次类推

count[a]++;

}

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

if(count[i]!=0)

printf(“%c=%d ”,i+97,count[i]);

return 0;} 5.参考代码如下: #include int main(){

char str[80],*spf,*spr;

int flag=1;

gets(str);

for(spr=str;*spr;spr++)

//让指针spr指到字符串的末尾

;

spr--;

//用指针spr指到字符串最后一个字符

for(spf=str;spf

if(*spf!=*spr)

flag=0;

if(flag)

printf(“YESn”);

else

printf(“NOn”);

return 0;} 6.参考代码如下: #include #include int main(){

char name[5][15];

char *p[5];//定义指针数组

char *temp;

int i,j,k;

printf(“Enter 5 strings:n”);

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

{

gets(name[i]);//读入5个字符串

p[i]=name[i];//指针数组元素指向字符串

}

for(i=0;i<4;i++)//用选择排序法排序

{

k=i;

for(j=i+1;j<5;j++)

if(strcmp(p[j],p[k])<0)k=j;

if(k!=i)

{

temp = p[i];

p[i]=p[k];

p[k]=temp;//改变指针的指向

}

}

printf(“nThe sorted result:n”);

printf(“------------------------n”);

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

puts(p[i]);//按指针指向顺序输出

return 0;}

第六章

一.选择题

1-5 CBCDA

6-10 AADBB

11-15BBDBD

16-20 AABAA 二.填空题 1.四

auto, register, static, extern 2.5 6 3.8,17 4.1 2 6 24 120 5.return 1 return n+sum(n-1)

三、编程题

1.参考代码如下: #include #include int prime(int m){

int i,k;

if(m==1)return 0;

else

{

k=sqrt(m);

for(i=2;i<=k;i++)

if(m%i==0)

break;

if(i<=k)return 0;

else return 1;

} } int main(){

int i;

for(i=101;i<200;i+=2)

if(prime(i))

printf(“%d ”,i);} 2.参考代码如下: #include #include float fun(float x){

float y;

if(x>-5&&x<0)

y=x;

else if(x==0)

y=x-1;

else if(x>0&&x<10)

y=x+1;

return y;} void main(){

float x;

printf(“请输入x的值:”);

scanf(“%f”,&x);

printf(“%fn”,fun(x));} 3.参考代码如下: void tran(int x){ int i,s[20]={0};for(i=0;x;i++){

s[i]=x%8;

x/=8;} i--;for(;i>=0;i--)

printf(“%d”,s[i]);printf(“n”);} void main(){

int dec;

printf(“请输入一个十进制数:”);

scanf(“%d”,&dec);

tran(dec);} 4.参考代码如下: #include void swap(int a[],int n){

int *pf,*pr,temp;

for(pf=a,pr=a+n-1;pf

{

temp=*pf;

*pf=*pr;

*pr=temp;

} } void main(){

int array[20],n,i;

printf(“请输入要处理的数据的个数:”);

scanf(“%d”,&n);

printf(“请输入%d个数:”,n);

for(i=0;i

scanf(“%d”,&array[i]);

swap(array,n);

printf(“对换后的数据为:”);

for(i=0;i

printf(“%d ”,array[i]);} 5.参考代码如下: #include void swap2w(int a[][5]){

int i,j,temp;

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

for(j=0;j<5;j++)

{

temp=a[i][j];

a[i][j]=a[5-i-1][j];

a[5-i-1][j]=temp;

} } void main(){

int a[5][5],n,i,j;

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

for(j=0;j<5;j++)

scanf(“%d”,&a[i][j]);

swap2w(a);

printf(“对换后的数据为:n”);

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

{

for(j=0;j<5;j++)

printf(“%d ”,a[i][j]);

printf(“n”);

} } 6.参考代码如下: #include int huiwen(char str[]){

char *spf,*spr;

int flag=1;

for(spr=str;*spr;spr++)

//让指针spr指到字符串的末尾

;

spr--;

//用指针spr指到字符串最后一个字符

for(spf=str;spf

if(*spf!=*spr)

flag=0;

return flag;}

int main(){

char str[80];

gets(str);

if(huiwen(str))

printf(“YESn”);

else

printf(“NOn”);

return 0;} 7.参考代码如下: #include int delch(char str[],char ch){

int i,j;

for(i=0;str[i];i++)

if(ch==str[i])

for(j=i+1;str[j];j++)

//删除字符

str[j-1]=str[j];

str[j-1]=str[j];

//移动字符串末尾的'' }

int main(){

char str[80],c;

gets(str);

scanf(“%c”,&c);

delch(str,c);

puts(str);

return 0;} 8.参考代码如下: #include int he(int n){

if(n==1)

return 1;

else

return n+he(n-2);} int main(){

int i,s=0;

for(i=1;i<=19;i+=2)

s=s+he(i);

printf(“%dn”,s);

return 0;} 9.参考代码如下: #include int feb(int n){int f;

if(n==1||n==0)

return 1;

else

{

f=feb(n-1)+feb(n-2);

return f;

} } int main(){

int n;

scanf(“%d”,&n);

printf(“%d”,feb(n));

return 0;}

第七章

一.选择题

1-5BDDCC

6-10 BBDCB

11-15BBDCB

16-18 DBB 二.填空题 1.30

2.ARRAY a,b,c;3.2 3 4.a c 5.p->name &p->post_code

struct communication *

p->post_code

三、编程题

1.参考代码如下: #include #define N 4 /*结构体类型定义*/ struct student {

char no[10];

char name[10];

float score[3];

float total;};//主函数 int main(){

struct student stu[N];//定义结构体数组,存储4个学生信息

struct student temp;

//定义结构体变量,用于交换数据的临时存储空间

int i,j,k;/*从键盘输入学生信息*/

puts(“Enter students' info:”);

for(i=0;i

{

printf(“student #%d:n”,i+1);

gets(stu[i].no);

//输入学号

gets(stu[i].name);

//输入姓名

scanf(“%f%f%f”,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

//输入3门课的成绩

getchar();

//接收输入缓冲区的字符

stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];//计算总成绩

}

/*用选择排序法,对学生成绩进行排序*/

for(i=0;i

{

k=i;

for(j=i+1;j

{

if(stu[j].total>stu[k].total)k=j;

else if(stu[j].total==stu[k].total)//若总成绩相等,按英语成绩排序

{

if(stu[j].score[2]>stu[k].score[2])

k=j;

}

}

/*交换学生信息*/

if(k!=i)

{

temp=stu[i];

//结构体变量赋值

stu[i]=stu[k];

stu[k]=temp;

}

} //输出排好序的学生信息

printf(“nThe sorted list:n”);printf(“%-12s%-22s%-10s%-10s%-10s%-10sn”,“no”,“name”,“course1”,“course2”,“course3”,“Total”);

for(i=0;i

{

printf(“%-12s%-22s”,stu[i].no,stu[i].name);

printf(“%-10.1f %-10.1f%-10.1f”,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

printf(“%-10.1fn”,stu[i].total);

}

return 0;} 2.参考代码如下: #include #define N 45 /*结构体类型定义*/ struct student {

char no[10];

char name[20];

int age;

float score;};//主函数 int main(){

struct student stu[N];//定义结构体数组,存储45个学生信息

int maxi=0;

//存储成绩最高的学生信息的下标

int i;

/*从键盘输入学生信息*/

puts(“Enter students' info:”);

for(i=0;i

{

printf(“student #%d:n”,i+1);

gets(stu[i].no);

//输入学号

gets(stu[i].name);

//输入姓名

scanf(“%d%f”,&stu[i].age,&stu[i].score);

//输入年龄和一门课的成绩

getchar();

//接收输入缓冲区的字符

if(stu[maxi].score

maxi=i;

} //输出成绩最高的学生信息

printf(“nThe highest score is:n”);

printf(“%-12s%-22s%-10s%-10sn”,“no”,“name”,“age”,“course”);

printf(“%-12s%-22s”,stu[maxi].no,stu[maxi].name);

printf(“%-10d %-10.1f%”,stu[maxi].age,stu[maxi].score);

return 0;} 3.参考代码如下: #include /*共用体类型定义*/ union cch {

unsigned int a;

char b[4];};//主函数 int main(){

union cch x;//定义共用体类型变量

scanf(“%u”,&x.a);

printf(“%cn”,x.b[0]);//低字节

printf(“%cn”,x.b[1]);

printf(“%cn”,x.b[2]);

printf(“%cn”,x.b[3]);

return 0;} //测试数据:1431989597 4.参考代码如下: #include #define N 3 struct person {

char name[15];//姓名

char job[30];//职业

char addr[30];

union

{

float score;//班级编号

char title[10];//职称

} cate;};struct person per[N];//定义结构体数组,存储人员信息 /*人员数据录入函数input()*/ void input(){

int i;

for(i=0;i

{

printf(“Enter name: ”);

gets(per[i].name);

// getchar();

printf(“Enter job,if teacher,first character should be 't',if student,should be 's': ”);

gets(per[i].job);

// getchar();

if(per[i].job[0]=='s')

{

printf(“Enter student's score: ”);

scanf(“%f%*c”,&per[i].cate.score);

}

else if(per[i].job[0]=='t')

{

printf(“Enter teacher's title: ”);

gets(per[i].cate.title);

}

printf(“Enter address: ”);

gets(per[i].addr);

} } /*人员数据打印函数print()*/ void print(){

int i;

printf(“name

job

addr

score/titlen”);

printf(“------------------n”);

for(i=0;i

{

printf(“%-10s”,per[i].name);

printf(“%-15s”,per[i].job);

printf(“%-15s”,per[i].addr);

if(per[i].job[0]=='s')

printf(“%fn”,per[i].cate.score);

else if(per[i].job[0]=='t')

printf(“%sn”,per[i].cate.title);

} } void sort(){

int i,j,k;

struct person temp;

for(i=0;i

{

k=i;

for(j=i+1;j

if(strcmp(per[k].name,per[j].name)>0)

k=j;

if(k!=i)

{

temp=per[i];

per[i]=per[k];

per[k]=temp;

}

} } //主函数 int main(){

input();

sort();

print();}

第八章

一.单选题

1-5 BABAD

6-10 DDDCD

D 二.填空题 1.二进制 文本

2.pf=fopen(“D:zk04data xfile.dat”,“w”)3.二进制 文本

文件结束符 非0值

三、编程题

1.参考代码如下: #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

exit(0);

}

else return fp;} main(){

FILE *fp;

char c;

int digcou=0,capcou=0,smacou=0,othercou=0;

/* 定义整型变量为计数器并初始化为0 */

fp = fopenfun(“file.txt”,“r”);/* 打开文件 */

while((c = fgetc(fp))!=EOF)/* 从文件中读字符 */

{

if(c>='0' && c<='9')

digcou++;

/* 统计数字字符 */

else if(c>='A' && c<='Z')

capcou++;

/* 统计大写字母 */

else if(c>='a' && c<='z')

smacou++;

/* 统计小写字母 */

else

othercou++;

/* 统计其它字符 */

}

printf(“数字字符有%d个n”,digcou);

/* 输出字符个数 */

printf(“大写字母有%d个n”,capcou);

printf(“小写字母有%d个n”,smacou);

printf(“其它字符有%d个n”,othercou);

fclose(fp);/* 关闭文件 */ } 2.参考代码如下: #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

//打开文件出错显示提示信息

exit(0);

//调用exit函数终止程序运行

}

else return fp;} #define SIZE 10 struct student /* 定义结构体*/ {

long num;

char name[10];

int age;

char address[10];} stu[SIZE], out;/* 存盘函数:将学生的信息以数据块形式写入文件 */ void fsave(){

FILE *fp;

int i;

fp=fopenfun(“student.dat”,“wb”);

for(i=0;i

if(fwrite(&stu[i], sizeof(struct student), 1, fp)!= 1)

printf(“File write error.n”);

/* 写过程中的出错处理 */

fclose(fp);

/* 关闭文件 */ } //主函数 main(){

FILE *fp;

int i;

for(i=0;i

/* 从键盘读入学生的信息*/

{

printf(“Input student %d:”, i+1);

scanf(“%ld%s%d%s”,&stu[i].num, stu[i].name, &stu[i].age, stu[i].address);

}

fsave();

/* 调用函数保存学生信息 */

fp = fopenfun(“student.dat”, “rb”);

printf(“ No.Name

Age

Addressn”);

while(fread(&out, sizeof(out), 1, fp))

/*读入数据块*/

printf(“%8ld %-10s %4d %-10sn”, out.num, out.name, out.age, out.address);

fclose(fp);/* 关闭文件 */ } 3.参考代码如下: #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

//打开文件出错显示提示信息

exit(0);

//调用exit函数终止程序运行

}

else return fp;} #define SIZE 5 struct student /* 定义结构体*/ {

long num;

char name[10];

float score[5];

float aver;} stu[SIZE], out;/* 存盘函数:将学生的信息以数据块形式写入文件 */ void fsave(){

FILE *fp;

int i;

fp=fopenfun(“student.dat”,“wb”);

for(i=0;i

if(fwrite(&stu[i], sizeof(struct student), 1, fp)!= 1)

printf(“File write error.n”);

/* 写过程中的出错处理 */

if(fwrite(&out, sizeof(struct student), 1, fp)!= 1)/*写入5门课的平均成绩 */

printf(“File write error.n”);

fclose(fp);

/* 关闭文件 */ } //主函数 main(){

FILE *fp;

float average[5]={0},t;

int i,j;

for(i=0;i

/* 从键盘读入学生的信息*/

{

printf(“Input student %d:”, i+1);

scanf(“%ld%s”,&stu[i].num, stu[i].name);

for(j=0,t=0;j<5;j++)

{scanf(“%f%*c”,&stu[i].score[j]);

t=t+stu[i].score[j];

average[j]+=stu[i].score[j];

}

stu[i].aver=t/5;

}

out.num=0;strcpy(out.name,“5course'ave”);

for(j=0;j<5;j++)

out.score[j]=average[j]/SIZE;

fsave();

/* 调用函数保存学生信息 */

fp = fopenfun(“student.dat”, “rb”);

printf(“ No.Name

course1 course2 course3 course4 course5n”);

while(fread(&out, sizeof(out), 1, fp))

/*读入数据块*/

{printf(“%8ld %-12s”, out.num, out.name);

for(j=0;j<5;j++)

printf(“%8.2f”, out.score[j]);

printf(“n”);

}

fclose(fp);/* 关闭文件 */ } 4.参考代码如下 #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

//打开文件出错显示提示信息

exit(0);

//调用exit函数终止程序运行

}

else return fp;} #define SIZE 5 struct warehouse /* 定义结构体*/ {

char KNO[10];

int KNOM };//主函数 main(){

FILE *fpr,*fpw;

struct warehouse t;

fpr=fopenfun(“CK.txt”,“r”);

fpw=fopenfun(“XK.txt”,“w”);

while(!feof(fpr))

{

fscanf(fpr,“%s%d”,t.KNO,&t.KNOM);

if(t.KNOM>100)

fprintf(fpw,“%s %dn”,t.KNO,t.KNOM);

}

fclose(fpr);/* 关闭文件 */

fclose(fpw);/* 关闭文件 */ }

第九章

1.(1)30(2)3(3)9(4)29 2.(1)1(2)1(3)1(4)7(5)15(6)6 3.参考代码如下 #include void main(){

char a,b;

a='C';

b=a&0125;

//0125的二进制为01010101

printf(“%dn”,b);} 4.参考代码如下 #include void main(){int i,bit;

/* 定义循环变量i和位1/0标志变量bit */ unsigned int n,mask;

/* 定义欲转换的整数n和屏蔽字变量mask */ mask=0x80000000;

/* 初始屏蔽字,从左边最高位开始检查 */ printf(“Enter a integer of Hexadecimal :”);scanf(“%x”,&n);

/* 输入要转换的整数 */ printf(“binary of %x is:”,n);for(i=0;i<32;i++)

/* 循环检查32位,并输出结果 */ { if(i%8==0&&i!=0)printf(“,”);/*习惯上二进制每8位用“,”分隔以便查看*/

bit=(n&mask)?1:0;

/* n&mask非0,该位为1;否则该位为:0 */

printf(“%1d”,bit);

/* 输出1或0 */

mask=mask>>1;

/* 右移1位得到下一个屏蔽字 */

}

printf(“n”);} 5.参考代码如下 #include void main(){

unsigned int value,res;

int n1,n2;

printf(“请输入一个整数:n”);

scanf(“%u”,&value);

printf(“输入n1、n2:n”);

scanf(“%d”,&n1);

scanf(“%d”,&n2);

if(n1>=n2||n2>32)

printf(“输入有误!n”);

res =((value <<(n1-1))>>(31-n2+n1))<<(32-n2);

//先向左移n1-1位,再将结果向右移n1-1+32-n2,再将结果左移32-n2位。

printf(“%un”,res);}

第十章

编程题

1.参考代码如下: #include #define rem(a,b)(a)%(b)void main(){

int x,y,z;

scanf(“%d%d”,&x,&y);

z=rem(x,y);

printf(“%dn”,z);} 2.参考代码如下: #include #define cube(x)(x)*(x)*(x)#define judge(x,y)(x)*(y)<50?1:0 void main(){

int x,y,z;

scanf(“%d%d”,&x,&y);

z=cube(x);

printf(“%d,%dn”,z,judge(x,y));} 3.参考代码如下: #include #define calc(year)(year)%4==0&&(year)%100!=0||(year)%400==0 #define judge(year)calc(year)?1:0 void main(){

int year;

scanf(“%d”,&year);

if(judge(year))

printf(“%d is leap year!n”,year);

else

printf(“%d is not a leap year!n”,year);} 4.参考代码如下: #include #define judge(a,b,c)a+b>c&&b+c>a&&a+c>b #define s(a,b,c)(a+b+c)/2 #define area(a,b,c)sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))void main(){

float a,b,c;

scanf(“%f%f%f”,&a,&b,&c);

if(judge(a,b,c))

printf(“The triangle area is %f!n”,area(a,b,c));

else

printf(“It's not a triangle!n”);}

第十一章

一.单选题

1-5 CBBDD

D 二.填空题

1.struct link *next;2.①struct student * ②tail->next ③head 3.Answer:3 4.①break ②(struct data *)malloc(struct data)③while(1)④p!=NULL ⑤p=p->link 5.①x ②p ③s

三、编程题

1.参考代码如下:

#include

#include

#include

#define N 3

typedef struct

{

char no[11];

char name[15];

float score[N];

float sum;} studdatatype;typedef struct z1

{

studdatatype studdata;

struct z1 *next;} STUDENT;/*以下是函数原型*/ STUDENT *create();

void print(STUDENT *head);

main(){

STUDENT *head;

head=create();

print(head);

/*I/O函数*/

/*动态内存分配函数及其他函数说明*/

/*字符串函数*/

/*定义常数*/

/*学生数据类型*/

/*定义结点数据类型*/

/*创建链表*/

/* 显示所有记录*/

/*定义链表头指针*/

} /*创建链表*/ STUDENT *create(){

STUDENT *head,*p,*listp;

char no[11];

head=(STUDENT *)malloc(sizeof(STUDENT));//建立头结点

head->next=NULL;

listp=head;//当前指针指到头结点

printf(“输入一个学生信息(学号(* 结束)、姓名,三门课成绩:”);

scanf(“%s”,&no);

while(no[0]!='*')

{

p=(STUDENT *)malloc(sizeof(STUDENT));//建立新结点

strcpy(p->studdata.no,no);

//将输入的数据存储到新结点的数据域

scanf(“%s”,p->studdata.name);scanf(“%f%f%f”,&p->studdata.score[0],&p->studdata.score[1],&p->studdata.score[2]);

p->studdata.sum=p->studdata.score[0]+p->studdata.score[1]+p->studdata.score[2];

p->next=NULL;

//将新结点的指针域置为空

listp->next=p;

//将新结点连接到当前指针的后面

listp=p;

//将新结点作为当前结点

printf(“输入一个学生信息(学号(* 结束)、姓名,三门课成绩:”);

scanf(“%s”,&no);

//输入下一个学生的成绩

}

return head;} /*输出链表中结点信息*/ void print(STUDENT *head){

int i=0;

/* 统计记录条数*/

STUDENT *p;

/*移动指针*/

system(“cls”);

/*清屏*/

p=head->next;

/*初值为第一个结点的指针*/

printf(“nnn*******************************STUDENT********************n”);

printf(“| rec| no

|

name

| sc1| sc2| sc3|

sum |n”);

printf(“|----|----------|---------------|----|----|----|--------|n”);

while(p!=NULL)

{

i++;

printf(“|%4d|%-10s|%-15s|%4.0f|%4.0f|%4.0f|%8.2f|n”,i,p->studdata.no, p->studdata.name,p->studdata.score[0],p->studdata.score[1],p->studdata.score[2],p->studdata.sum);

p=p->next;

}

printf(“********************************end***********************n”);}

2.参考代码如下:

/*查找成绩最高的学生信息*/ void searchmaxscore(STUDENT *h){

STUDENT *p,*pmax;

p=pmax=h->next;

while(p!=NULL)/*当指针不为空时,循环继续*/

{

if(pmax->studdata.sum

studdata.sum)

pmax=p;

p=p->next;

/*移动指针,指向下一结点*/

}

printf(“nnnThe highest total score of the students' information :n”);

printf(“*******************************STUDENT********************n”);

printf(“| no

|

name

| sc1| sc2| sc3|

sum |n”);

printf(“|----------|---------------|----|----|----|--------|n”);

printf(“|%-10s|%-15s|%4.0f|%4.0f|%4.0f|%8.2f|n”, pmax->studdata.no, pmax->studdata.name,pmax->studdata.score[0],pmax->studdata.score[1],pmax->studdata.score[2],pmax->studdata.sum);

printf(“********************************end***********************n”);}

3.参考代码如下:

/*用插入法按由大到小排序函数*/ STUDENT *sort(STUDENT *h){

STUDENT *p,*q,*t,*h1;

/*定义临时指针*/

h1=h->next->next;

/*从原表的第二个学生结点开始处理*/

h->next->next=NULL;

/*将原表的第一个学生结点作为有序表的第一个结点*/

while(h1!=NULL)

/*当还有元素没有插入到有序表时,进行排序*/

{

t=h1;

/*取未排序的第一个结点*/

h1=h1->next;

/*h1指针后移*/

p=h->next;

/*设定移动指针p,从第一个结点开始*/

q=h->next;

/*设定移动指针q做为p的前驱,指向第一个结点*/

while(p!=NULL && t->studdata.sum < p->studdata.sum)/*作总分比较*/

{

q=p;

/*待排序点值小,则有序表指针后移*/

p=p->next;

}

if(p==q)

/*p==q,说明待排序点值大,应排在首位*/

{

t->next=p;

/*待排序点的后继为p*/

h->next=t;

/*新头结点为待排序点*/

}

else

/*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/

{

t->next=p;

/*t的后继是p*/

q->next=t;

/*q的后继是t*/

}

}

printf(“sort sucess!!n”);

return h;

}

/*排序成功*/ /*返回头指针*/

第四篇:C语言程序设计教程 课后习题参考答案

《C语言程序设计教程》

课后习题参考答案

习题1 1.(1)编译、链接

.exe(2)函数

主函数(或main函数)(3)编辑

编译

链接 2.(1)-(5):DDBBC(6)-(10):ABBBC 3.(1)答:C语言简洁、紧凑,使用方便、灵活;C语言是高级语言,同时具备了低级语言的特征;C语言是结构化程序设计语言,具有结构化的程序控制语句;C语言有各种各样的数据类型;C语言可移植性好;生成目标代码质量高,程序执行效率高。

(2)编辑、编译、链接、执行

(3)一个C程序由一或多个函数组成,一函数若干条语句构成,每条语句的末尾必须以分号结束。

(4)标识符,关键字,运算符,分隔符,常量,注释符等 4.从键盘输入一个双精度小数,打印出它的余弦值。#include #include main(){ double x;scanf(“%lf”, &x);printf(“%lfn”, cos(x));}

第2章 1.(1)BDE、ACFG(2)D(3)C(4)C

2.(1)错(2)错(3)错(4)对(5)错 3.(1)a=3,b=-27(2)a=11,b=6,c=6(3)3(4)1 0 1 0 1 1 0(5)-9 9 8(6)1)20 2)8 3)70 4)0 5)0 6)0 4.(1)

#include main(){ double r, h ,v;r = 2.5;h = 3.5;v = 3.14*r*r*h;printf(“v=%lfn”, v);}(2)#include main(){ char ch;ch = getchar();printf(“%cn”, ch + 32);}(3)#include main(){ printf(“

*n”);printf(“

***n”);printf(“ *****n”);printf(“*******n”);}(4)#include main(){ double x;scanf(“%lf”, &x);printf(“%d , %lfn”,(int)x, x –(int)x);}(5)#include main(){ double a=3, b=5;double result =(-2 * a +(4*a – b)/(2*a + b))/((a32);}

第4章 1.(1)-(5):CAACA 2.(1)BBB(2)AAABBBCCC(3)end(4)d=20(5)s=2,t=3(6)first

third(7)y=0 y=5 y=10 y=5 3.(1)y=‟A‟ && ch<=‟Z‟

ch>=‟a‟&&ch<=‟z‟

ch = ch-32(3)x>2&&x<=10

x>-1&&x<=2(4)t=x;x=y;y=t;4.(1)#include main(){ int x, y , z, t;scanf(“%d%d%d”, &x, &y, &z);

if(x>y){ t=x;x=y;y=t;} if(x > z){ t = x;x = z;z= t;} if(y > z){ t = y;y= z;z = t;} printf(“%d %d %dn”, x, y ,z);}(2)#include main(){ int score;scanf(“%d”, &score);

if(score < 0 || score > 100)

printf(“成绩不合理n”);

else if(score>=90)

printf(“优秀n”);

else if(score>=80)

printf(“良好n”);

else if(score >= 70)

printf(“中等n”);

else if(score >= 60)

printf(“及格n”);

else

printf(“不及格n”);}(3)#include main(){ int n;int g,s,b,q;//各位上的数值

scanf(“%d”, &n);

g = n%10;//个位

s = n/10%10;//十位

b = n/100%10;//百位

q = n/1000%10;//千位

if(n < 10)//一位数

{

printf(“%dn”, 1);//位数

printf(“%dn”, g);//各位上的数值

} else if(n < 100)//两位数

{

printf(“%dn”, 2);//位数

printf(“%d %dn”, g,s);} else if(n < 1000)//三位数

{

printf(“%dn”, 3);//位数

printf(“%d %d %dn”, g, s, b);

} else if(n < 10000)//四位数

{

printf(“%dn”, 4);//位数

printf(“%d %d %d %dn”, g, s, b, q);

} }(4)#include main(){ int n;scanf(“%d”, &n);

if(n % 3==0 && n%5==0 && n%7==0)

printf(“能同时被3、5、7整除n”);

else if(n%3==0 && n%5==0)

printf(“能被3和5整除n”);

else if(n%3==0 && n%7==0)

printf(“能被3和7整除n”);

else if(n%5==0 && n%7==0)

printf(“能被5和7整除n”);

else if(n%3==0 || n%5==0 || n%7==0){

if(n%3==0)

printf(“能被3整除n”);

else if(n%5==0)

printf(“能被5整除n”);

else

printf(“能被7整除n”);

} else

printf(“不能被3、5、7中任一个数整除n”);}(5)#include main(){ int

carType;//车型。1代表夏利;2代表富康;3代表桑塔纳

double xiali = 2.1;//每公里价格 double fukang = 2.4;double sangtana = 2.7;double distance;//距离

double totalMoney;//总的收费

printf(“请输入您乘坐的车型:1代表夏利;2代表富康;3代表桑塔纳:”);scanf(“%d”, &carType);printf(“请输入您乘车的总路程:”);scanf(“%lf”, &distance);if(carType == 1)//夏利

{

if(distance < 3)

totalMoney = 7.0;

else

totalMoney = 7 + xiali *(distance – 3);} else if(carType == 2)//富康

{

if(distance < 3)

totalMoney = 8.0;

else

totalMoney = 8 + fukang *(distance – 3);} else if(carType == 3)//富康

{

if(distance < 3)

totalMoney = 9.0;

else

totalMoney = 9 + sangtana *(distance – 3);}

printf(“(四舍五入)您的车费为:%.0lfn”, totalMoney);}(6)#include main(){ double a, b, c;scanf(“%lf%lf%lf”, &a, &b, &c);

if(a+b>c && b+c>a && c+a>b){

if(a==b && b==c)

printf(“等边三角形n”);

else if(a==b || b== c || c==a)

printf(“等腰三角形n”);

else

printf(“一般三角形n”);

} else

printf(“不能构成三角形n”);}

第5章

1.(1)C(2)C(3)K=36(4)C(5)B 2.(1)3次

(2)x>=1 && x<=10 || x>=200&&x<210(3)e == 0(4)6次(5)10 3.(1)20,10(2)16,0(3)7BAB4BAB1BC(4)ABABABC(5)****** ****** ******

****** 4.(1)a!= b

(2)n / 10(3)scanf(“%d”, &a);

5.(3)行

int fac = 1, sum = 0;6.(1)#include main(){ char ch;int alpha=0, space=0, digit=0, other=0;while((ch=getchar())!= „n‟)

{

if(ch>=‟A‟&&ch<=‟Z‟ || ch>=‟a‟&&ch<=‟z‟)

alpha++;

else if(ch>=‟0‟ && ch<=‟9‟)

digit++;

else if(„ „ == ch)

space++;

else

other++;} printf(“%d %d %d %dn”, alpha, digit, space, other);}(2)#include main(){ int m20, m10;for(m20=1;m20<5;m20++){

for(m10 = 1;m10<10;m10++)

if(20*m20+10*m10 == 100)

printf(“%d, %dn”, m20, m10);} }(3)#include main(){ int x, y, z;for(x=0;x<10;x++)

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

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

if(x*100+y*10+z + y*100+z*10+z == 532)

printf(“%d %d %dn”, x, y, z);}(4)#include main(){ int row, spaceCount,starCount;int n;scanf(“%d”, &n);

for(row = 1;row <= n;++row){

for(spaceCount = 1;spaceCount <= n1;++starCount)

printf(“*”);//打印出某行上的所有星号

printf(“n”);//换行

} //打印下半部分

for(row=1;row

for(spaceCount = 1;spaceCount <= row;++ spaceCount)

printf(“ ”);//打印出某行上星号前的空格

for(starCount = 1;starCount <= 2*(n-row)byear;if(nmonth

age--;else if(nmonth == bmonth && nday>bday)

age--;return age;}

(4)

#include int sum(int n);main(){ int n,s;scanf(“%d”, &n);s = sum(n);printf(“s=%dn”, s);}

int sum(int n){ int s=0;while(n){

s += n % 10;

n /= 10;} return s;}

(5)

#include double sumfac(int n);main(){ int n;scanf(“%d”, &n);printf(“%.0lfn”, sumfac(n));} double sumfac(int n){ double f=1.0, s = 0.0;

int i;for(i=1;i<=n;i++){

f *= i;

s += f;} return f;}

(6)

#include int gcd(int m , int n);main(){ int m, n;scanf(“%d%d”, &m, &n);printf(“%dn”, gcd(m ,n));} int gcd(int m, int n){ int t,r;if(m < n){ t = m;m= n;n = t;}

r = m % n;while(r){

m = n;

n = r;

r = m % n;} return n;}

(7)

#include int gcd(int m , int n);int lcm(int m, int n);main(){ int m, n;scanf(“%d%d”, &m, &n);printf(“%dn”, lcm(m ,n));} int gcd(int m, int n){ int t,r;if(m < n){ t = m;m= n;n = t;}

r = m % n;while(r){

m = n;

n = r;

r = m % n;} return n;}

int lcm(int m, int n){ return m*n/gcd(m,n);}

(8)

#include double mypower(double x, int y);main(){ double x;

int y;scanf(“%lf%d”, &x, &y);printf(“%lfn”, mypower(x,y));} double mypower(double x, int y){ int i;double f=1.0;for(i=1;i<=y;i++)

f *= x;return f;}

第7章 1.(1)6(2)5(3)不能

(4)int a[3][2]={{1,2}, {3,4}, {5,6} };(5)6 9(6)abc G 2.(1)

#include

void reverse(int a[ ], int n);

int main()

{

int array[10]={0};

int i;

printf(“请输入10个整数:”);

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

scanf(“%d”, &array[i]);

reverse(array, 10);//调用函数逆序存储数组中的数据

printf(“逆序后的元素为:n”);

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

printf(“%5d”, array[i]);

printf(“n”);

return 0;

}

void reverse(int a[ ], int n)

{

int i;

int tmp;

for(i=0;i

{

tmp = a[i];a[i] = a[n-i-1];

}

}

(2)

#include #include void reverseStr(char str[ ]);main(){ char s[100];gets(s);reverseStr(s);puts(s);}

void reverseStr(char str[ ]){ int i,j;char t;i=0;j=strlen(str)-1;while(i < j){

t = str[i];

a[n-i-1] = tmp;

str[i] = str[j];

str[j] = t;

i++;

j--;} }

(3)

#include int copyTo(int s1[], int n, int s2[ ]);main(){ int s1[10], s2[10];int i,count;for(i=0;i<10;i++)

scanf(“%d”, &s1[i]);count = copyTo(s1, 10, s2);for(i=0;i

printf(“%d ”, s2[i]);printf(“n”);}

int copyTo(int s1[], int n, int s2[ ]){ int i, j=0;for(i=0;i

if(s1[i] % 2)

s2[j++] = s1[i];} return j;}

(4)

#include void copyToStr(char str1[ ], char str2[ ]);main(){ char s1[100], s2[100];gets(s1);copyToStr(s1, s2);puts(s2);} void copyToStr(char str1[ ], char str2[ ]){ int i=0,j=0;while(str1[i]!= ''){

if(str1[i]>='a'&&str1[i]<='z')

{

str2[j] = str1[i];

j++;

}

i++;} str2[j] = '';return j;}

(5)

#include void deleteAll(char str[ ], char ch);main(){ char s[100], ch;gets(s);ch = getchar();deleteAll(s, ch);puts(s);} void deleteAll(char str[ ], char ch){ int i, j;i = 0;

j = 0;while(str[i]){

if(str[i]!= ch)

{

str[j++] = str[i];

}

i++;

} str[j] = '';}

(6)

#include void replaceAll(char str[ ], int ch1, char ch2);main(){ char s[100], c1, c2;gets(s);c1 = getchar();c2 = getchar();replaceAll(s, c1, c2);puts(s);} void replaceAll(char str[ ], int ch1, char ch2){ int i;i = 0;while(str[i]){

if(str[i] == ch1)

str[i] = ch2;

i++;} }

(7)

#include

int transformToBin(int dnum, int bin[ ]);

int main()

{

int array[32]={0};//保存转换后的二进制数

int num;//待转换的整数

int cc;//最后得到的二进制总共多少位

printf(“请输入一个整数:”);

scanf(“%d”, &num);

cc = transformToBin(num, array);//调用转换函数

cc--;//往回退一个元素下标,使cc指向最后一个元素

for(;cc>=0;cc--)//输出转换后的二进制数

printf(“%d”, array[cc]);

printf(“n”);

return 0;

}

int transformToBin(int dnum, int bin[ ]){

int count = 0;while(dnum)//当dnum还未转换完毕

{ bin[count++] = dnum % 2;//余数保留到数组对应元素中

dnum /= 2;//数本身除2 } return count;}

(8)

#include int transformToHex(int dnum, char hex[ ]);int main(){ char array[32];//保存转换后的进制数

int num;//待转换的整数

int cc;//最后得到的进制总共多少位

printf(“请输入一个整数:”);scanf(“%d”, &num);cc = transformToHex(num, array);//调用转换函数

cc--;//往回退一个元素下标,使cc指向最后一个元素

for(;cc>=0;cc--)//输出转换后的进制数

printf(“%c”, array[cc]);printf(“n”);return 0;}

int transformToHex(int dnum, char hex[ ]){ int count = 0;int t;while(dnum)//当dnum还未转换完毕

{

t = dnum % 16;

if(t < 10)

hex[count] = t+'0';//余数保留到数组对应元素中

else

hex[count] = t-10+'A';

count++;dnum /= 16;//数本身除16 } return count;}(9)

#include #include #include

#define M 5 //行 #define N 6 //列

void generate(int a[ ][N], int row, int col);void display(int a[][N], int row, int col);void getMaxEveryRow(int a[][N], int row, int col, int y[]);main(){ int arr[M][N], y[M]={0};int i;generate(arr, M, N);display(arr, M, N);getMaxEveryRow(arr,M,N,y);//输出最大值

for(i=0;i

printf(“%d ”, y[i]);printf(“n”);} void generate(int a[ ][N], int row, int col){ int i,j;srand(time(NULL));for(i=0;i

for(j=0;j

a[i][j] = rand()%101;} void display(int a[][N], int row, int col){ int i,j;for(i=0;i

for(j=0;j

printf(“%4d”, a[i][j]);

printf(“n”);} } void getMaxEveryRow(int a[][N], int row, int col,int y[]){ int i,j;for(i=0;i

y[i] = a[i][0];

for(j=1;j

if(y[i] < a[i][j])

y[i] = a[i][j];} }

(10)

#include #include #include

#define M 5 //行 #define N 6 //列

void generate(int a[ ][N], int row, int col);void display(int a[][N], int row, int col);void getMinEveryCol(int a[][N], int row, int col);main(){ int arr[M][N];int i;generate(arr, M, N);display(arr, M, N);getMinEveryCol(arr,M,N);//输出最小值

for(i=0;i

printf(“%d ”, arr[0][i]);printf(“n”);} void generate(int a[ ][N], int row, int col){ int i,j;srand(time(NULL));for(i=1;i

for(j=0;j

a[i][j] = rand()%101;} void display(int a[][N], int row, int col){ int i,j;for(i=1;i

for(j=0;j

printf(“%4d”, a[i][j]);

printf(“n”);} } void getMinEveryCol(int a[][N], int row, int col){ int i,j;for(i=0;i

a[0][i] = a[1][i];

for(j=2;j

if(a[0][i] > a[j][i])

a[0][i] = a[j][i];} }

第8章 1.(1)局部

(2)void(3)auto(4)auto(5)return(6)递归

(7)求 1!+2!+3!+4!+5!(8)注意全局变量和局部变量的区别

2.(1)

#include #include double xc(double x, double y);main(){ double a, b;double c;scanf(“%lf%lf”, &a, &b);

c = xc(a, b);printf(“ %lfn”, c);} double xc(double x, double y){ return sqrt(x*x+y*y);}

(2)

static extern

register

#include long seconds(int hour, int minute, int second);main(){ int h,m,s;long sec;printf(“输入时间:”);scanf(“%d%d%d”, &h, &m, &s);sec = seconds(h,m,s);printf(“离12点最近的秒数:%ldn”, sec);} long seconds(int hour, int minute, int second){ long s;if(hour < 6){

s = second+minute*60+hour*60*60;} else {

s = 60-second+(60-minute-1)*60+(12-hour-1)*60*60;} return s;}

(3)

#include int fun(int n);main(){ int n;scanf(“%d”, &n);if(fun(n))//是质数,则输出该数;不是的话,不作任何处理

printf(“%dn”, n);} int fun(int n){ int i;for(i=2;i

if(n%i == 0)

break;if(i

return 0;else

return 1;}

(4)

#include int fun(int n);main(){ int n;int count=0;for(n=2;n<1000;n++)

if(fun(n))

{

printf(“%4d”, n);

count++;

if(count % 10 == 0)

printf(“n”);

}

printf(“n”);} int fun(int n){ int i;for(i=2;i

if(n%i == 0)

break;if(i

return 0;else

return 1;}

(5)

#include int func(int n);main(){ int n;scanf(“%d”, &n);printf(“%dn”, func(n));} int func(int n){ if(1 == n)

return 3;return 2*func(n-1)-1;}

(6)

#include int gcd(int m, int n);main(){ int x,y,t;scanf(“%d%d”, &x, &y);if(x < y){

t=x;x=y;y=t;} printf(“%dn”, gcd(x,y));} int gcd(int m, int n){ if(0==n)

return m;return gcd(n, m%n);}

第9章 1.(1)xyzNKT(2)bcdefgh(3)4,4(4)qponmzyx(5)abcCD(6)0 2.(1)

#include #include void reverse(int *p, int n);main(){ int i;int a[10]={1,2,3,4,5,6,7,8,9,10};

reverse(a,10);for(i=0;i<10;i++)

printf(“%d ”, a[i]);printf(“n”);} void reverse(int *p, int n){ int *q;int t;q = p + n1;while(str < pEnd){

t = *str;

*str = *pEnd;

*pEnd = t;

str++;

pEnd--;} }(3)

#include int copyTo(int *s1, int n, int *s2);main(){ int a[10]={1,2,3,4,5,6,7,8,9, 10};int b[10], count,i;count=copyTo(a,10,b);for(i=0;i

printf(“%d ”, b[i]);printf(“n”);} int copyTo(int *s1, int n, int *s2){ int count=0;int *ps1, *ps2;ps2 = s2;for(ps1 = s1;ps1 < s1 + n;ps1++){

if(*ps1 % 2)//奇数

{

*ps2++ = *ps1;

} } return ps2-s2;}

(4)

#include void copyToStr(char *str1, char *str2);main(){ char s1[100], s2[100];gets(s1);copyToStr(s1, s2);puts(s2);} void copyToStr(char *str1, char *str2){ while(*str1){

if(*str1 >= 'a' && *str1 <= 'z')

{

*str2++=*str1;

}

str1++;} *str2 = '';}

(5)

#include void deleteAll(char *str, char ch);main(){ char s[100], c;gets(s);c = getchar();deleteAll(s, c);puts(s);} void deleteAll(char *str, char ch){ char *p;p = str;while(*str){

if(*str!= ch)

*p++ = *str;

str++;} *p = '';}

(6)

#include void replaceAll(char *str, char ch1, char ch2);main(){ char s[100], c1, c2;printf(“输入字符串:”);gets(s);printf(“输入查找字符:”);c1 = getchar();fflush(stdin);//清除键盘缓冲区

printf(“输入替换字符:”);c2 = getchar();replaceAll(s,c1, c2);puts(s);} void replaceAll(char *str, char ch1, char ch2){ while(*str){

if(*str == ch1)

{

*str = ch2;

}

str++;} }

(7)

#include int transformToBin(int dnum, int *bin);int main(){ int array[32];//保存转换后的进制数

int num;//待转换的整数

int cc;//最后得到的进制总共多少位

printf(“请输入一个整数:”);scanf(“%d”, &num);cc=transformToBin(num, array);//调用转换函数

cc--;//使cc指向最后一个元素

for(;cc>=0;cc--)//输出转换后的进制数

printf(“%d”, array[cc]);printf(“n”);return 0;}

int transformToBin(int dnum, int *bin){ int *pb;int t;pb = bin;while(dnum)//当dnum还未转换完毕

{

t = dnum % 2;

*pb = t;

pb++;

dnum /= 2;//数本身除2 } return pb-bin;}

(8)

#include #include void transformToHex(int dnum, char *hex);int main(){ char array[32];//保存转换后的进制数

int num;//待转换的整数

int cc;//最后得到的进制总共多少位

printf(“请输入一个整数:”);scanf(“%d”, &num);transformToHex(num, array);//调用转换函数

cc=strlen(array)-1;//使cc指向最后一个元素

for(;cc>=0;cc--)//输出转换后的进制数

printf(“%c”, array[cc]);printf(“n”);return 0;}

void transformToHex(int dnum, char *hex){ char *ph;int t;ph = hex;while(dnum)//当dnum还未转换完毕

{

t = dnum % 16;

if(t < 10)

*ph = t+'0';

else

*ph = t-10+'A';

ph++;dnum /= 16;//数本身除16 } *ph = '';}

(9)

#include void strToLow(char *str);main(){ char s[100];gets(s);strToLow(s);puts(s);} void strToLow(char *str){ while(*str){

if(*str>='A'&&*str<='Z')

*str = *str + 32;

str++;} }

第10章 1.(1)12(2)(++p)->num(5)B(6)B

2.(1)

struct myDate{ int year, month, day;};

(2)

struct empInfo{ char empNo[15];char empName[10];char xb;//性别

int age;struct myDate empDay;double salary;};

(3)

#include typedef struct STUDENT { char name[20];float height;

3)D 7)10,A

4)p2!= NULL

(((int score;}STUD;main(){ STUD a;printf(“姓名:”);

gets(a.name);printf(“身高:”);

scanf(“%f”, &a.height);

printf(“成绩:”);

scanf(“%d”, &a.score);

//输出信息(仅为测试用)

printf(“%s %.2f %d n”, a.name, a.height, a.score);}

第11章 1.(1)打开文件:fopen

关闭文件:fclose 使用:

FILE *fp;

fp = fopen(“myfile”, “r”);

fclose(fp);

(2)”w”

(3)文本文件:内容均以字符的形式存储,占的字节数可能会大些

二进制文件:内容以二进制编码的形式存储,占的字节数可能会稍小。

(4)第一个参数:读取得到的信息存储在内存的哪个地方

第二个参数:读取的字节数

第三个参数:读取的块数

第四个参数:文件指针,表示从哪个文件中读取数据

(5)第一个参数:待写入文件的信息存储在内存的哪个地方

第二个参数:写入的字节数

第三个参数:写入的块数

第四个参数:文件指针,表示要写入到哪个文件中(6)为了安全,gets少用,因为其没有指定输入字符的大小,限制输入缓冲区得大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出。后果非常怕怕fgets会指定大小,如果超出数组大小,会自动根据定义数组的长度截断。

2.(1)

#include #include main(){ FILE *fpr, *fpw;char ch;

fpr = fopen(“a.txt”, “r”);fpw = fopen(“b.txt”, “a”);

if(NULL==fpr){

printf(“文件打开不成功n”);

return 0;} if(NULL == fpw){

printf(“文件打开不成功n”);

return 0;}

while(!feof(fpr)){

ch = fgetc(fpr);

fprintf(fpw, “%c”, ch);}

fclose(fpr);fclose(fpw);}

(2)

#include main(){ FILE *fp1, *fp2;double pi = 3.1415926;fp1 = fopen(“a.txt”, “w”);//以文本的形式写入

fp2 = fopen(“b.txt”, “wb”);//以二进制的形式写入

if(NULL==fp1){

printf(“文件打开不成功n”);

return 0;} if(NULL == fp2){

printf(“文件打开不成功n”);

return 0;}

fprintf(fp1, “%lf”, pi);fwrite(&pi,sizeof(pi),1,fp2);

fclose(fp1);fclose(fp2);}

打开之后的效果:

(3)

#include #include main(){ FILE *fpr;fpr = fopen(“a.txt”, “r”);

if(NULL==fpr){

printf(“文件打开不成功n”);

return 0;}

while(!feof(fpr)){

putchar(fgetc(fpr));} fclose(fpr);}

(4)

#include typedef struct STUDENT { char no[15];char name[10];int score;}STUD;#define N 3 main(){ STUD s[N];int i;FILE *fp;int count;//读取文件时才使用

for(i=0;i

printf(“请输入第%d个学生信息:n” , i+1);

printf(“

学号:”);

gets(s[i].no);

printf(“

姓名:”);

gets(s[i].name);

printf(“

成绩:”);

scanf(“%d”, &s[i].score);

fflush(stdin);//清除键盘缓冲区

}

//打开文件,并写入

fp = fopen(“a.txt”, “wb”);if(NULL == fp){

printf(“文件打开不成功,不能写入n”);

return 0;} for(i=0;i

fwrite(&s[i], sizeof(s[i]), 1, fp);fclose(fp);

//以下代码从文件中读取出信息,并显示在屏幕上

fp = fopen(“a.txt”, “rb”);

} count = 0;while(!feof(fp)){ if(fread(&s[count], sizeof(s[count]), 1, fp))

count++;} fclose(fp);//输出

for(i=0;i

第五篇:80X86语言程序设计教程(杨季文)课后习题答案

第二章 答案

题2.1 8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门用途?哪些寄存器可作为存储器寻址方式的指针寄存器? 答:8086/8088通用寄存器的通用性表现在:

这些寄存器除了各自规定的专门用途外,他们均可以用于传送和暂存数据,可以保存算术逻辑运算中的操作数和运算结果; 8个通用寄存器的专门用途如下: AX 字乘法,字除法,字I/O BX 存储器指针

CX 串操作或循环控制中的计数器 DX 字乘法,字除法,间接I/O SI 存储器指针(串操作中的源指针)DI 存储器指针(串操作中的目的指针)BP 存储器指针(存取堆栈的指针)SP 堆栈指针

其中BX,SI,DI,BP可作为存储器寻址方式的指针寄存器

题2.2 从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可访问的8位 寄存器?

答: 从程序员的角度看,8086/8088有14个可访问的16位寄存器;有8个可访问的8位寄存器;

题2.3 寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器

AX的内容: MOV AX,1234H MOV AL,98H MOV AH,76H ADD AL,81H SUB AL,35H ADD AL,AH ADC AH,AL ADD AX,0D2H SUB AX,0FFH 答: MOV AX,1234H AX=1234H MOV AL,98H AX=1298H MOV AH,76H AX=7698H ADD AL,81H AX=7619H SUB AL,35H AX=76E4H ADD AL,AH AX=765AH ADC AH,AL AX=D15AH ADD AX,0D2H AX=D22CH SUB AX,0FFH AX=D12DH 题2.4 8086/8088标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志的状态?

答: 8086/8088标志寄存器中定义了9个标志,如下: CF: Carry Flag ZF: Zero Flag SF: Sign Flag OF: Overflow Flag PF: Parity Flag AF: Auxiliary Carry Flag DF: Direction Flag IF: Interrupt-enable Flag TF: Trap Flag

这些标志可分为两类,分别为:

1、运算结果标志;

2、状态控制标志;

采用指令SAHF可把AH中的指定位送至标志寄存器低8位SF、ZF、AF、PF、CF;

采用CLC可清除CF,置CF到0 采用STC可置CF到1 采用CLD可置DF到0 采用sTD可置DF到1 采用CLI可置IF到0 采用STI可置IF到1 另外,在某些指令执行过程中会改变部分标志的状态; 题2.5 请说说标志CF和标志OF的差异。答: 如果把指令中处理的数据按照无符号数看待,则处理结果达到进位是,置CF为1;

如果把该处理中的数据按照有符号数看待,则处理结果超过有符号数表达范围的,置OF为1;两个标志同步进行,CPU并不知道该数的类型;

题2.6 8086/8088如何寻址1M字节的存储器物理地址空间?在划分段时必须满足的两个条件是什么?最多可把1M字节空间划分成几个段?最少可把1M字节地址空间划分成几个段? 答: 8086/8088通过对存储器分段和使用段寄存器的方式寻址1M字节的存储器物理地址空间;

在划分段时必须满足的两个条件是:

1、逻辑段的开始地址必须是16的倍数;

2、逻辑段的嘴道长度是64K;

1M的字节空间划分为64K个逻辑段;最少可把1M字节地址划分成16个逻辑段; 题2.7 在8086/8088上运行的程序某一时刻最多可访问几个段?程序最多可具有多少个段?程序至少几个段?

答: 在8086/8088上运行的程序某一时刻最多可访问4个当前段:代码段,数据段,堆栈段和附加段;程序最多可具有4种类型的段,最少要有一个代码段; 题2.8 存储单元的逻辑地址如何表示?存储单元的20位物理地址如何构成? 答: 存储单元的逻辑地址由段值和偏移两部分组成:段值:偏移;

存储单元的20位物理地址可以表示为:

物理地址=段值×16+偏移;

题2.9 当段重叠时,一个存储单元的地址可表示成多个逻辑地址。请问物理地址12345H可表示多少个不同的逻辑地址?偏移最大的逻辑地址是什么?偏移最小的逻辑地址是什么?

答: 12345H可表示1000H(4096)个不同的逻辑地址,偏移最大的逻辑地址是235:0FFF5H 偏移最小的逻辑地址是1234:0005H 题2.10 为什么称CS为代码段寄存器?为什么称SS为堆栈寄存器?

答: 因为在取指令的时候,规定的段寄存器就是CS,所以CS为代码段寄存器;

而堆栈操作时规定的寄存器是SS,所以SS为堆栈寄存器; 题2.11 请举例说明何为段前缀超越。什么场合下要使用段前缀超越? 答: 在存取一般存储器操作数时,段寄存器可以不是DS;当偏移设计BP寄存器时,段寄存器也可以不必是SS;如Mov AX,[si] 默认段地址在DS中,也可以改变:Mov AX, ES:[si] 当数据并不在默认的DS指定段时,可以采用段前缀超越; 题2.12 8086/8088的基本寻址方式可分为哪三类?他们说明了什么? 答: 8086/8088的基本寻址方式可分为以下三类:

1、存储器寻址;

2、立即寻址;

3、寄存器寻址;

他们说明了cpu有三类合计七种方式进行基本寻址;

题2.13 存储器寻址方式分为哪几种?何为存储器的有效地址? 答: 存储器寻址方式分为以下几种:

1、立即寻址;

2、直接寻址;

3、寄存器寻址;

4、寄存器间接寻址;

5、寄存器相对寻址;

6、基址加变址寻址;

7、相对基址加变址寻址;

存储器的有效地址是一个16bit的无符号数; 题2.14 什么场合下缺省的段寄存器是SS?为什么这样安排? 答: 当使用堆栈时,缺省的段寄存器是SS;

因为SS定义为堆栈段寄存器,配合SP堆栈指针,用来指向堆栈的栈顶; 题2.15 请说明如下指令中源操作数的寻址方式,并作相互比较: MOV BX,[1234H] MOV BX,1234H MOV DX,BX MOV DX,[BX] MOV DX,[BX+1234H] MOV DX,[BX+DI] MOV DX,[BX+DI+1234H] 答: MOV BX,[1234H] ;直接寻址 MOV BX,1234H :立即寻址 MOV DX,BX :寄存器寻址 MOV DX,[BX] :寄存器间接寻址 MOV DX,[BX+1234H] :寄存器相对寻址 MOV DX,[BX+DI] :基址加变址寻址 MOV DX,[BX+DI+1234H] :相对基址加变址寻址

题2.16 8086/8088提供了灵活多样的寻址方式,如何适当的选择寻址方式? 答: 每种寻址方式都有其特点,首先应该掌握不同寻址方式之间的区别,以及 适用的范围,结合程序中的需要进行灵活选择。

题2.17 设想一下这些寻址方式如何支持高级语言的多种数据结构? 答: 自己设想!

题2.18 为什么目标操作数不能采用立即寻址方式?

答: 立即寻址表示是一个操作数,并非一个存储空间,作为目标操作数是不合适的;

题2.19 处理器的通用寄存器是否越多越好?通用寄存器不够用怎么办?

答: 处理器的通用寄存器并非越多越好,因为如果处理器的通用寄存器数量太多,势必造成处理器的成本增加,同时也增加了处理器设计的复杂度;

如果通用寄存器不够用,应该采用内存中的存储单元代替,不过速度上要有所牺牲; 题2.20 哪些存储器寻址方式可能导致有效地址超出64K的范围?8086/8088如何处理这种 情况?

答: 寄存器相对寻址,基址加变址寻址,相对基址加变址寻址这三种寻址方式有可能导致有效地址超出64K的范围,8086/8088将取其64K的模进行访问;

题2.21 什么情况下根据段值和偏移确定的存储单元地址会超出1M?8086/8088如何处理这种情况?

答: 当物理地址的计算超过FFFFFH时,存储单元地址会超出1M,8086/8088将取其1M的模覆盖存取; 题2.22 8086/8088的指令集可分为哪6个子集? 答: 8086/8088的指令集可分为以下6个子集:

1、数据传输

2、算术运算

3、逻辑运算

4、串操作

5、程序控制

6、处理器控制

题2.23 8086/8088的指令集合中,最长的指令有几个字节?最短的指令有几个字节? 答: 8086/8088的指令集合中,最长的指令4个字节,最短的指令2个字节; MOV AX,[BX+SI+1234H]

题2.24 8086/8088的算术逻辑运算指令最多一次处理多少二进制位?当欲处理的数据 长度超出该范围怎么办?

答: 8086/8088的算术逻辑运算指令最多一次处理16bit的二进制位;如果处理的数据长度超出则分成若干部分进行逻辑运算,最后进行整合; 题2.25 如何时序数据段和代码段相同?

答: 将数据段的内容写入代码段中,并将代码段的段值赋给DS即可;

题2.26 通常情况下源操作数和目的操作数不能同时是存储器操作数。请给出把存储器操作

数甲送到存储器操作数乙的两种方法。答:

法一: MOV AX, [BX] MOV [SI],AX DS:[BX]=甲,DS:[SI]=乙

法二: MOV AX,[BX] XCHG AX,[SI] 法三:

PUSH WORD PTR [BX] POP WORD PTR [SI] 题2.27 请用一条指令实现把BX的内容加上123并把和送到寄存器AX。答: LEA AX, [BX+123H] 题2.28 堆栈有哪些用途?请举例说明。答: 堆栈的用途主要有:

1、现场和返回地址的保护; MOV AX, OFFSET ADDRESS PUSH AX JMP XXX...RET

2、寄存器内容的保护; PUSH AX PUSH BX...POP BX POP AX

3、传递参数; PUSH [BX] CALL XXX...XXX: POP AX...4、存储局部变量; PUSH DS PUSH CS POP DS...POP DS 题2.29 在本章介绍的8086/8088指令中,哪些指令把寄存器SP作为指针使用?8086/8088指令集中,哪些指令把寄存器SP作为指针使用? 答: 以下指令把寄存器SP作为指针使用:

1、PUSH

2、POP

3、PUSHF

4、POPF

5、PUSHA

6、POPA

7、RET

8、CALL

9、RETF

题2.30 请说说标志CF的用途。请至少给出使标志CF清0的三种方法。答: CF的用途主要有:

1、配合条件转移语句进行条件转移;

2、配合移位指令实现操作数之间的位转移;

3、常作为子程序的出口参数;如DOS磁盘文件管理功能调用等; CF清0的方法:

法一: CLC 法二: ADD AX,0FFFFH 法三: CMP AX,0 题2.31 请写出如下程序片段中每条算术运算指令执行后标志CF、ZF、SF、OF、PF和AF的状态。

MOV AL,89H ADD AL,AL ADD AL,9DH CMP AL,0BCH SUB AL,AL DEC AL INC AL 答:

INSTRUCTION CF ZF SF OF PF AF MOV AL,89H 0 0 0 0 0 0 ADD AL,AL 1 0 0 1 1 1 ADD AL,9DH 0 0 1 0 1 0 CMP AL,0BCH 1 0 1 0 1 0 SUB AL,AL 0 1 0 0 1 0 DEC AL 0 0 1 0 1 1 INC AL 0 1 0 0 1 1

题2.32 什么是除法溢出?如何解决16位被除数8位除数可能产生的溢出?

答: 除法溢出是指除数如果是0,或者在8位除数时商超过8位,或者在16位除时商超过16位,则认为是除法溢出,引起0中断;

首先要确定8位除数不能为0,其次要确定商的最大值不能超过8位,如果超过8位,则可 采用16位的除法;

题2.33 请写出如下程序片段中每条逻辑运算指令执行后标志ZF、SF、PF的状态: MOV AL,45H AND AL,0FH OR AL,0C3H XOR AL,AL

答: INSTRUCTION ZF SF PF MOV AL,45H 0 0 0 AND AL,0FH 0 0 1 OR AL,0C3H 0 1 0 XOR AL,AL 1 0 1

题2.34 “MOV AX,0”可寄存器AX清0。另外再写出三条可使寄存器AX清0的指令。答: 法一: XOR AX,AX 法二: AND AX,0 法三: SUB AX,AX

题2.35 请写出如下程序片段中每条移位指令执行后标志CF、ZF、SF和PF的状态。MOV AL,84H SAR AL,1 SHR AL,1 ROR AL,1 RCL AL,1 SHL AL,1 ROL AL,1 答:

INSTRUCTION CF ZF SF PF MOV AL,84H 0 0 0 0 SAR AL,1 0 0 1 0 SHR AL,1 0 0 0 0 ROR AL,1 1 0 0 0(该命令不影响SF位)RCL AL,1 1 0 0 0 SHL AL,1 0 0 1 0 ROL AL,1 1 0 1 0

题2.36 8086/8088中,哪些指令把寄存器CX作为计数器使用?哪些指令把寄存器BX作为基指针寄存器使用?

答: 8086/8088中,以下指令把寄存器CX作为计数器使用:

1、LOOP

2、LOOPE

3、LOOPZ

4、LOOPNZ

5、LOOPNE

6、JCXZ

以下指令把寄存器BX作为基指针寄存器使用:

1、MOV

2、XCHG

3、LEA

4、LDS

5、LES

6、ADD...题2.37 请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能: CMP AL,BL JGE OK XCHG AL,BL OK:......答: 如下命令可实现同样功能: PUSH CX;Reserve CX XOR CX,CX;CX=0 MOV CH,02H;CH=02H MOV CL,AL;CL=AL MOV BH,0H;BH=0 SUB CX,BX;If CH=2, AL>=BL;If CH=1, AL

题2.39 8086/8088的条件转移指令的转移范围有多大?如何实现超出范围的条件转移? 答: 8086/8088的条件转移指令的转移范围只能从-126到+129之间,如果出现超出 范围的条件转移,要借助无条件转移命令JMP;

题2.40 相对转移和绝对转移的区别是什么?相对转移的有何优点?

答: 相对转移和绝对转移的区别是相对转移记录了目标地址与当前地址的差值,而绝对转移在转移命令中直接包含了目标地址;

相对转移有利于程序的浮动,比如说增加了命令语句等; 题2.41 请指出下列指令的错误所在: MOV CX,DL XCHG [SI],3 POP CS MOV IP,AX SUB [SI],[DI] PUSH DH OR BL,DX AND AX,DS MUL 16 AND 7FFFH,AX DIV 256 ROL CX,BL MOV ES,1234H MOV CS,AX SUB DL,CF ADC AX,AL MOV AL,300 JDXZ NEXT

答: MOV CX,DL XCHG [SI],3 POP CS MOV IP,AX SUB [SI],[DI] PUSH DH OR BL,DX AND AX,DS MUL 16 AND 7FFFH,AX DIV 256 ROL CX,BL MOV ES,1234H 转

MOV CS,AX SUB DL,CF ADC AX,AL MOV AL,300

POP指令的对象不能是CS,PUSH可以 IP不能是源也不能是目的

PUSH和POP只能处理16位的操作数(8086/8088)

BL不可以作为操作数

CS不能为目的 CF是Flag中的一个bit,不能如此

300超过0FFh,Over 8bit

;寄存器大小不一;不能与立即数进行交换;;;如果参与的操作数有两个,只能有一个是存储器操作数 ;;寄存器大小不一;段寄存器不可以是操作数;不可以使用立即数;立即数不能是目的操作数;不可以使用立即数;;段寄存器为目的时,源不能是立即数,需由通用寄存器;代码段寄存器;;寄存器大小不一; JDXZ NEXT ;JCXZ

题2.42 请指出如下指令哪些是错误的,并说明原因: MOV [SP],AX PUSH CS JMP BX+100H JMP CX ADD AL,[SI+DI] SUB [BP+DI-1000],AL ADD BH,[BL-3] ADD [BX],BX MOV AX,BX+DI LEA AX,[BX+DI] XCHG ES:[BP],AL XCHG [BP],ES

答: MOV [SP],AX ;SP非有效寄存器间接寻址之寄存器 PUSH CS ;对 JMP BX+100H ;对 JMP CX ;对

ADD AL,[SI+DI] ;SI和DI只能出现一个,与BX,BP一致 SUB [BP+DI-1000],AL ;对

ADD BH,[BL-3] ;BL只是一个8bit寄存器 ADD [BX],BX ;对 MOV AX,BX+DI ;对 LEA AX,[BX+DI] ;对 XCHG ES:[BP],AL ;对

XCHG [BP],ES ;段寄存器不能是操作数

题2.43 下列程序片段完成什么功能,可否有更简单的方法实现同样的功能: XCHG AX,[SI] XCHG AX,[DI] XCHG AX,[SI]

答: 程序实现[SI]和[DI]中的内容交换;AX中内容不变;

有,如下: PUSH [SI] PUSH [DI] POP [SI] POP [DI]

题2.44 请比较如下指令片段: LDS SI,[BX]

MOV SI,[BX] MOV DS,[BX+2]

MOV DS,[BX+2] MOV BX,[BX]

答: LDS SI,[BX] ;DS=[BX+2],SI=[BX]

MOV SI,[BX];DS=[BX+2],SI=[BX] MOV DS,[BX+2]

MOV DS,[BX+2];DS=[BX+2],BX=[BX] MOV BX,[BX] 第一组和第二组功能一致;

第三章答案

题3.1 伪指令语句与指令语句的本质区别是什么?伪指令的主要作用是什么?

答: 伪指令语句与指令语句的本质区别是指令语句有其对应的机器指令,而伪指令没有;

伪指令的主要作用是指示汇编程序如何汇编源程序;

题3.2 汇编语言中的表达式与高级语言中的表达式有何相同点和不同点? 答: 汇编语言中的表达式与高级语言中的表达式的相同点是都采用运算符、操作符以及括号把常数和符合连起来;

不同点是汇编语言的表达式除了数值表达式外还有地址表达式;

题3.3 汇编语言中数值表达式与地址表达式有何区别? 答: 汇编语言中数值表达式在汇编过程中由汇编程序计算出数值,而地址表达式中部分相对地址的地方,在汇编时无法确定其确定地址;

题3.4 汇编语言中的变量和标号有何异同之处?

答: 汇编语言中的变量和标号的相同之处是都代表着一个地址; 不同之处是变量表示的地址中存放的是数据,而标号表示的地址中存放的是代码;

题3.5 请计算如下各数值表达式的值:

23H AND 45H OR 67H 1234H/16+10H NOT(65535 XOR 1234H)1024 MOD 7+3 LOW 1234 OR HIGH 5678H 23H SHL 4 “Eb” GE 4562H XOR-1 1234H SHR 6 'a' AND(NOT('a'-'A')'H' OR 00100000B 76543Q LT 32768 XOR 76543 3645H AND 0FF00H

答: 23H AND 45H OR 67H;67H 1234H/16+10H;133H NOT(65535 XOR 1234H);1234H 1024 MOD 7+3;5 LOW 1234 OR HIGH 5678H;D6H 注意1234 不是1234H 23H SHL 4;30H “Eb” GE 4562H XOR-1;0 1234H SHR 6;0048H 'a' AND(NOT('a'-'A');41H or 'A' 'H' OR 00100000B;68H or 'h' 76543Q LT 32768 XOR 76543;题目最后的76543有错,按照76543Q处理:829CH 3645H AND 0FF00H;3600H

题3.6 请计算如下程序片段中各地址表达式的值,设BX=1000H,SI=2000H,DI=3000H,BP=4000H [BX+100H] [DI][BP] 2000H[SI] 10H[BX][SI] [BP-128] [BX][DI-2]

答: [BX+100H];[1100H] [DI][BP];[7000H] 2000H[SI];[4000H] 10H[BX][SI];[3010H] [BP-128];[3F80H] [BX][DI-2];[3FFEH]

题3.7 设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:

ORG 100H VARW DW 1234H,5678H VARB DB 3,4 VARD DD 12345678H BUFF DB 10 DUP(?)MESS DB 'HELLO' BEGIN: MOV AX,OFFSET VARB + OFFSET MESS MOV AX,TYPE BUFF + TYPE MESS + TYPE VARD MOV AX,SIZE VARW + SIZE BUFF + SIZE MESS MOV AX,LENGTH VARW + LENGTH VARD MOV AX,LENGTH BUFF + SIZE VARW MOV AX,TYPE BEGIN MOV AX,OFFSET BEGIN

答: ORG 100H VARW DW 1234H,5678H VARB DB 3,4 VARD DD 12345678H BUFF DB 10 DUP(?)MESS DB 'HELLO' BEGIN: MOV AX,OFFSET VARB + OFFSET MESS;AX=0218H MOV AX,TYPE BUFF + TYPE MESS + TYPE VARD;AX=0006H MOV AX,SIZE VARW + SIZE BUFF + SIZE MESS;AX=000DH MOV AX,LENGTH VARW + LENGTH VARD;AX=0002H MOV AX,LENGTH BUFF + SIZE VARW;AX=000CH MOV AX,TYPE BEGIN;AX=FFFFH MOV AX,OFFSET BEGIN;AX=0119H

题3.8 设如下两条指令中的符号ABCD是变量名,请说明这两条指令的异同。

MOV AX,OFFSET ABCD LEA AX,ABCD

答: 两条指令都是将ABCD的偏移地址放入AX寄存器中;

不同之处是OFFSET只能取得用数据定义伪指令的变量的有效地址,而不能取得一般操作数的有效地址;

题3.9 请指出如下指令的不明确之处,并使其明确:

MOV ES:[BP],5 ADD CS:[1000H],10H DEC SS:[BX-8] JMP CS:[SI+1000H] MUL [BX+DI+2] DIV [BP-4]

答: MOV ES:[BP],5 ;未指定存储单元属性 MOV WORD PTR ES:[BP],5 ADD CS:[1000H],10H ;同上 ADD WORD PTR CS:[1000H],10H DEC SS:[BX-8] ;同上 DEC WORD PTR SS:[BX-8] JMP CS:[SI+1000H] ;无法确定段间还是段内转移

JMP WORD PTR CS:[SI+1000H] MUL [BX+DI+2] ;无法确定是8位乘法还是16位乘法

MUL WORD PTR [BX+DI+2] DIV [BP-4] ;同上 DIV WORD PTR [BP-4]

题3.10 设在某个程序中有如下片段,请改正其中有错误的指令语句:

VARW DW 1234H,5678H VARB DB 3,4 VARD DD 12345678H......MOV AX,VARB MOV VARD,BX MOV VARD+2,ES MOV CL,VARW+3 LES DI,VARW

答: MOV AX,VARB ;VARB是8bit量,应该修改AX到AL or AH MOV VARD,BX ;VARD是32bit量,要分两次传

MOV VARD+2,ES ;同上

MOV CL,VARW+3 ;同上,CL改为CX LES DI,VARW ;VARW非32位量,应改为VARD

题3.11 请举例说明伪指令ASSUME的作用。

答: ASSUME的作用是声明现在开始CS寄存器对应于哪个段,DS对应于哪个段,SS和ES分别对应哪个段,可以相同也可以不同;如:

ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:ESEG 可以根据需要重新建立对应关系;

题3.12 设在某个程序片段中有如下语句,请说明各符号的属性:

SYMB1 LABEL BYTE SYMB2 EQU THIS BYTE SYMB3 DW ? SYMB4 EQU BYTE PTR SYMB3

答: SYMB1:BYTE SYMB2:BYTE SYMB3:WORD SYMB4:BYTE 题3.13 为什么说汇编语言中的等价语句EQU可理解为简单的宏定义?请举例说明。答: EQU可以用符号定义常数,表达式,指令助记符,字符串等;

而宏定义是指定一个宏指令名,宏指令可表示相对应的程序片段。

如:

HELLO EQU “How are you!” 与:

HELLO MACRO 'How are you!' ENDM 一致;

题3.14 设在某个程序片段中有如下语句,请说明各符号所表示的值:

SYMB1 = 10 SYMB2 = SYMB1*2 SYMB1 = SYMB1 + SYMB2 + 4 SYMB3 EQU SYMB1

答: SYMB1 = 22H SYMB2 = 14H SYMB3 = 22H

题3.15 请改写3.3.3的程序T3-1.ASM,使其只有一个段。答:;程序名:T3-1.ASM;功能 :显示信息“HELLO" cseg segment assume cs:cseg mess db 'HELLO',0dh,0ah,'$' start: mov ax,cseg mov ds,ax mov dx,offset mess mov ah,9 int 21h mov ah,4ch int 21h cseg ends end start

题3.16 请说明指令”JMP $+2“指令的机器码中的地址差值是多少? 答: 2H 题3.17 源程序是否一定要以END语句结束?程序是否一定从代码段的偏移0开始执行?

如果不是,那么如何指定?

答: 源程序可以不以END语句结束,不过END之后的内容汇编程序将忽略。程序不一定要从代码的偏移0开始执行,一个比较简单的方法是利用END语句,如END XXX,程序将从XXX标号处开始执行;

题3.18 利用查表的方法实现代码转换有何特点?利用查表的方法求函数值有何特点? 答: 利用查表的方法实现代码转换的特点是:

1、转换代码间不需要直接的算术或逻辑关系,只需要安排好表的组织即可;

2、对于部分代码,其转换效率比较高,主要时间用在寻址上;

利用查表的方法求函数值的特点是:

1、对于大部分的数学函数值的求值,直接计算困难较大,采用查表法可祢补

不足;

2、程序比较简单;

3、能够得到十进制或者十六进制格式的高精度函数值。

4、函数值必须事先计算好;

5、精度无法由程序控制;

题3.19 利用地址表实现多向分支有何特点?请举例说明。答: 利用地址表实现多向分支的特点有:

1、对于实现5路以上的多向分支,使用地址表既方便又高效;

2、对于如何确定地址的位置,需要采用不同的方法实现;

例子看书。

题3.20 请举例说明如何避免条件转移超出转移范围。

答: 如果出现条件转移超出了范围,则可以利用无条件转移指令帮助跳转;

如:

cmp ax,'A' jb out_program

如果超出范围:

cmp ax,'A' jb out_com...out_com: jmp far ptr out_program

题3.21 请写一个程序片段统计寄存器AX中置1的个数。答: count db ?,?,0dh,0ah,'$'......call countAX

cmp bl,9 ja sub10 jmp go sub10: sub bl,10 mov count,31h go: add bl,30h mov count+1,bl mov dx,offset count mov ah,9 int 21h mov ah,4ch int 21h;==============================;入口:AX;出口:BL=AX中1的个数

countAX proc mov cx,16 mov bl,0 count1: shl ax,1 jnc ADDAX1 add bl,1 ADDAX1: loop count1 ret countAX endp;=============================

题3.22 设一个32位有符号数存放在DX:AX中,请写一个求其补码的程序片段。

答: Invert proc mov bx,dx and bx,8000h cmp bx,0 jz out_1 not dx not ax add ax,1 adc dx,0 or dx,8000h out_1: nop ret Invert endp

题3.23 写一个程序片段实现如下功能:依次重复寄存器AL中的每一位,得到16位的结果存

放到DX寄存器中。

答: Expand proc mov cx,7 xor dx,dx

S0: shl dx,1 shl dx,1 shl al,1 jnc CF0 add dx,3h CF0: nop loop S0 ret Expand endp

题3.24 写一个程序片段实现如下功能:依次重复四次寄存器AL中的每一位,得到32位的结果

存放到DX:AX寄存器中。

答: Expand proc mov cx,3 xor dx,dx xor bx,bx S0: shl al,1 jnc CF0 add dx,0Fh CF0: shl dx,1 shl dx,1 shl dx,1 shl dx,1 loop S0

mov cx,4 S1: shl al,1 jnc CF0_1 add bx,0Fh CF0_1: shl bx,1 shl bx,1 shl bx,1 shl bx,1 loop S1 mov ax,bx ret Expand endp

题3.25 写一个程序片段实现如下功能:把寄存器AL和BL中的位依次交叉,得到的16位结果

存放到DX寄存器中。

答: Expand proc mov cx,8 xor dx,dx S0: shl dx,1 shl al,1 jnc CF0 add dx,1h CF0: shl dx,1 shl bl,1 jnc CF0_1 add dx,1h CF0_1: loop S0 ret Expand endp

题3.26 写一个优化的程序片段,实现把字符串中的小写子母变换为对应的大写子母。设字符串

以0结尾。

答: InvertC proc begin: mov al,mess[si] cmp al,'0' jz exit_1 cmp al,61h jb next cmp al,7AH ja next and al,11011111b mov mess[si],al next: inc si jmp begin exit_1: nop ret InvertC endp

题3.27 写一个优化的程序片段,统计字符串的长度。设字符串以0结尾。答: count proc mov al,mess[si] cmp al,'0' jz exit_2 inc si jmp count exit_2: nop ret count endp;si=数量

题3.28 写一个程序片段,滤去某个字符串中的空格符号(ASCII码20H),设字符串以0结尾。

答: DeleteSpace proc;设si=0,bx=0,Mess为字符串首地址

mov al,mess[si] cmp al,'0' jz exit_2 cmp al,' ' jz next3 xchg al,mess[bx] xchg al,mess[si] inc bx next3: inc si jmp DeleteSpace exit_2: nop ret DeleteSpace endp 题3.29 请写一个把两个字符串合并的示例程序。答: dseg segment string1 db 'Welcome to $' string2 db 'Beijing!$' dseg ends

cseg segment assume cs:cseg,ds:dseg start: mov ax,dseg mov ds,ax

xor bx,bx xor si,si

keepfind: mov al,string1[bx] cmp al,'$' jz combine inc bx jmp keepfind combine: mov al,string2[si] mov string1[bx],al cmp al,'$' jz exit inc si inc bx jmp combine exit:

mov dx,offset string1 mov ah,09h int 21h

mov ah,4ch int 21h cseg ends end start 题3.30 请写一个可把某个字变量的值传唤为对应二进制数ASCII码串的示例程序。答:;Name : Show_hex_ascii;input : ah=Hex;output: dx='Hex' show_hex_ascii proc

mov dh,ah and dh,0f0h;reserve high 4bit shr dh,4 add dh,30h;change 0-9 to '0-9' cmp dh,39h ja add_dh_7 dh_ok: mov dl,ah and dl,0fh;reserve low 4bit add dl,30h cmp dl,39h ja add_dl_7 dl_ok: nop ret add_dl_7: add dl,7h;revert A-F to 'A-F' jmp dl_ok

add_dh_7: add dh,7h jmp dh_ok

show_hex_ascii endp 题3.31 请写一个可把某个十进制数ASCII码串转换成对应非压缩BCD何压缩BCD的示例程序。

答:;非压缩BCD码

;Input ah=十进制数ASCII码

;Output al=非压缩BCD码

TEST1 proc cmp ah,'0' jb exit cmp ah,'9' ja exit sub ah,30h mov al,ah exit: nop ret TEST1 endp

;压缩BCD码

;Input ax=两个十进制数ASCII码

;Output bl=压缩BCD码

TEST2 proc

cmp ah,'0' jb exit cmp ah,'9' ja exit sub ah,30h mov bl,ah shl bl,4

cmp al,'0' jb exit cmp al,'9' ja exit1 sub al,30h add bl,al exit1: nop ret TEST2 endp 题3.32 请写一个可把某个十进制数ASCII码转换为对应的二进制的示例程序。答: table db '0000','0001','0010','0011','0100','0101','0110','0111' db '1000','1001'......;Input bl=一个十进制数ASCII码

;Output dx:ax=二进制ASCII码

;程序未检验该十进制数是否在范围以内

TEST3 proc sub bl,30h xor bh,bh shl bx,1 shl bx,1 mov dh,table[bx] mov dl,table[bx+1] mov ah,table[bx+2] mov al,table[bx+3]

ret TEST3 endp

题3.33 请写出一个可把某个十六进制数ASCII码转换为对应的二进制的示例程序。答: table db '0000','0001','0010','0011','0100','0101','0110','0111' db '1000','1001','1010','1011','1100','1101','1110','1111'......;Input bl=一个十六进制数ASCII码

;Output dx:ax=二进制ASCII码

TEST3 proc cmp bl,30h jb exit1;小于30H的不在范围内

sub bl,30h cmp bl,0Ah;如果在9以内,开始转换0-9 jb change1

sub bl,0Ah cmp bl,6h;如果在‘9’-‘A’之间,不在范围内

jb exit1

sub bl,6h;‘A’=0 cmp bl,7h;如果在‘A’-‘F’之间,开始转换

jb change2

cmp bl,21h;如果大于‘F’,看是否在‘F’和‘a’之间

jb exit1;如果在,则不在范围内

sub bl,20h;'a'=0 cmp bl,6h;如果大于‘f’,则不在范围内

ja exit1 change2: add bl,9h;按照table表,如果A=0还需要加9才可以

change1: xor bh,bh shl bx,1 shl bx,1 mov dh,table[bx] mov dl,table[bx+1] mov ah,table[bx+2] mov al,table[bx+3] exit1: ret TEST3 endp

题3.34 请写一个实现数据块移动的示例程序。答: data segment data1 db 'Hello!!.....$'....data2 db 128 dup(?)data ends

....xor ax,ax xor bx,bx mov1: mov al,data1[bx] cmp al,'$' jz out1 mov data2[bx],al inc bx jmp mov1 out1:......题3.35 请编一个程序求从地址F000:0000H开始的64K字节内存区域的检验和,并转换为

十六进制的数的ASCII码串。

答:;F000:0000H 字检验和

;Output: BX=字检验和

TEST5 proc

mov ax,0F000H mov es,ax

mov cx,0ffffh xor si,si xor bx,bx ADD0: add bx,es:[si] inc si inc si loop add0

ret TEST5 endp

table1 db '0','1','2','3','4','5','6','7','8','9' db 'A','B','C','D','E','F';Input bx=字检验和

;Output dx:ax=字检验和ASCII码

TEST4 proc push cx

mov cx,bx push cx mov cl,12 shr bx,cl pop cx mov dh,table1[bx] mov bx,cx and bx,0F00h push cx mov cl,8 shr bx,cl pop cx mov dl,table1[bx] mov bx,cx and bx,00f0h push cx mov cl,4 shr bx,cl pop cx mov ah,table1[bx] mov bx,cx and bx,000fh mov al,table1[bx]

mov bx,cx pop cx ret TEST4 endp

题3.36 设已在地址F000:0000H开始的内存区域安排了100个字节的无符号8位二进制数。

请编写一个程序求它们的和,并转换为对应十进制数的ASCII码串。

答:;从 F000:0000H开始100个byte无符号数相加

;output BX=Sum TEST6 proc push cx push ax push si mov ax,0f000h mov es,ax xor bx,bx xor si,si xor ax,ax mov cx,100 ADD2: mov al,es:[si] add bx,ax inc si loop ADD2

pop si pop ax pop cx ret TEST6 endp

......Dec_ASC db ' $';在数据区

......;Name:Convert1;function: Hex convert to Dec;Input: BX=a word of Hex;Output: DS:Dec_ASC Convert1 proc push ax push cx push dx mov ax,bx xor dx,dx mov cx,2710h;2710H=10000 div cx add ax,30h mov dec_asc[0],al;[0]=万位

mov ax,dx xor dx,dx mov cx,3E8h;3E8H=1000 div cx add ax,30h mov dec_asc[1],al;[1]=千位

mov ax,dx mov cl,64h;64H=100 div cl add al,30h mov dec_asc[2],al;[2]=百位

mov al,ah mov ah,0 mov cl,0ah;0A=10 div cl add ax,3030h mov dec_asc[3],al;[3]=十位

mov dec_asc[4],ah;[4]=个位

pop dx pop cx pop ax ret Convert1 endp

题3.37 设已在地址F000:0000H开始的内存区域安排了1024个16位有符号数。请编写一个程序

统计其中的正数、负数和零的个数,并分别转换为对应的十进制数的ASCII码串。

答:;从 F000:0000H开始1024个Word有符号数统计

;output Di=0的个数

;Bx=正数的个数

;DX=负数的个数

TEST7 proc push cx push ax push si mov ax,0f000h mov es,ax xor bx,bx xor si,si xor ax,ax xor di,di xor dx,dx mov cx,1024 Next1: mov ax,es:[si] cmp ax,0 jnz check_P inc di jmp next2 check_p: shl ax,1 jnc ADD_P inc dx jmp next2 ADD_P: inc bx next2: inc si inc si loop Next1

pop si pop ax pop cx ret TEST7 endp

分别call convert1, 并保存到不同的地方即可;

题3.38 设从地址F000:0000H开始的内存区域是缓冲区,存放了一组单字节的正数或负数,以0结尾。请编写一个程序确定其中最大的正数和最小的负数。

答:;从 F000:0000H开始以0结尾的单字节正数负数统计

;output bh=最大的正数

;bl=最小的负数

TEST8 proc xor bx,bx xor si,si mov ax,0F000h mov es,ax next9: mov al,es:[si] cmp al,0 jz exit9 test al,80h jnz Neg_1 cmp al,bh jb next7 xchg al,bh next7: inc si jmp next9 Neg_1: cmp al,bl jg next8 xchg al,bl next8: inc si jmp next9 exit9: ret TEST8 endp 题3.39 设从地址F000:0000H开始的1K字节内存区域是缓冲区。请写一个可收集该区域内

所有子串“OK”开始地址的程序

答:;从 F000:0000H开始1K字节内存区域,统计子串“OK”开始地址

;output 开始地址=ADDRESS TEST9 proc xor bx,bx xor si,si mov ax,0F000h mov es,ax mov cx,1024 next5: mov ax,es:[si] cmp ax,'OK' jnz next6 mov ADDRESS[BX],si inc bx inc bx next6: inc si inc si loop next5 ret TEST8 endp 题3.40 请优化3.6.2节例7所示排序程序。答:自己优化下;

下载C语言程序设计项目教程课后参考答案word格式文档
下载C语言程序设计项目教程课后参考答案.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐