电脑桌面
添加蜗牛文库到电脑桌面
安装后可以在桌面快捷访问

C语言程序设计教程课后习题答案

栏目:合同范文发布:2025-01-29浏览:1收藏

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

第三篇:完整的delphi程序设计教程课后习题答案

1.239页1题小时钟 procedure TForm1.Timer1Timer(Sender: TObject);var xt,yt:integer;h,m,s,ms:word;begin decodetime(time,h,m,s,ms);xt:=paintbox1.clientwidth p 2;yt:=paintbox1.clientheight p 2;paintbox1.refresh;paintbox1.canvas.moveto(xt,yt);paintbox1.canvas.pen.width:=3;paintbox1.canvas.lineto(xt+round(sin((60*h+m)/(12*60)*2*pi)*100), yt-round(cos((60*h+m)/(12*60)*2*pi)*100));paintbox1.canvas.moveto(xt,yt);paintbox1.canvas.pen.width:=2;paintbox1.canvas.lineto(xt+round(sin(m/60*2*pi)*140), yt-round(cos(m/60*2*pi)*140));paintbox1.canvas.moveto(xt,yt);paintbox1.canvas.pen.width:=1;paintbox1.canvas.lineto(xt+round(sin(s/60*2*pi)*180), yt-round(cos(s/60*2*pi)*180));end;end.2.239页3题求两点间的距离 procedure TForm1.Button1Click(Sender: TObject);begin paintbox1.Refresh;formpaint(sender);end;procedure TForm1.FormPaint(Sender: TObject);var xt,yt:integer;ax,ay,bx,by:integer;begin xt:=paintbox1.ClientWidth p 2;yt:=paintbox1.Clientheight p 2;paintbox1.canvas.MoveTo(xt,0);paintbox1.canvas.lineTo(xt,2*yt);paintbox1.canvas.MoveTo(0,yt);paintbox1.canvas.lineTo(2*xt,yt);ax:=strtoint(edit1.text);ay:=strtoint(edit2.text);bx:=strtoint(edit3.text);by:=strtoint(edit4.text);

edit5.Text:=floattostr(sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)));

paintbox1.canvas.MoveTo(xt+ax*10,yt-ay*10);

paintbox1.canvas.lineTo(xt+bx*10,yt-by*10);end;end.3.226页5题输入学生成绩 var

Form1: TForm1;type

studentrecord=record xh,xm:string[6];xb:boolean;yy,sx,dz:integer;end;

implementation {$R *.dfm} procedure

TForm1.Button1Click(Sender: TObject);

var t:studentrecord;

f,f1:file of studentrecord;p1,p2:boolean;begin

assignfile(f,'c:my documentsstu.dat');reset(f);

assignfile(f1,'c:my documentsstu1.dat');rewrite(f1);

while not eof(f)do begin read(f,t);

p1:=(t.sx>=85)and(t.yy>=85)and(t.dz>=85);

p2:=t.sx+t.yy+t.dz>=270;if p1 or p2 then write(f1,t);end;

closefile(f);closefile(f1);end;

procedure

TForm1.FormCreate(Sender: TObject);

var t:studentrecord;f:file of studentrecord;xingbie:string;begin

assignfile(f,'c:my documentsstu.dat');reset(f);

while not eof(f)do begin read(f,t);if t.xb then xingbie:='男' else

xingbie:='女';

listbox1.Items.Add(t.xh+' '+t.xm+' '+xingbie+' '+inttostr(t.sx)+

' '+inttostr(t.yy)+' '+inttostr(t.dz));end;

closefile(f);end;

procedure

TForm1.Button2Click(Sender: TObject);begin close;end;end.4.226页8题保存获得奖学金者 var

Form1: TForm1;type

studentrecord=record xh,xm:string[6];xb:boolean;yy,sx,dz:integer;end;

implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);var t:studentrecord;f,f1:file of studentrecord;p1,p2:boolean;begin assignfile(f,'c:my documentsstu.dat');reset(f);assignfile(f1,'c:my documentsstu1.dat');rewrite(f1);while not eof(f)do begin read(f,t);p1:=(t.sx>=85)and(t.yy>=85)and(t.dz>=85);p2:=t.sx+t.yy+t.dz>=270;if p1 or p2 then write(f1,t);end;closefile(f);closefile(f1);end;procedure TForm1.FormCreate(Sender: TObject);var t:studentrecord;f:file of studentrecord;xingbie:string;begin assignfile(f,'c:my documentsstu1.dat');reset(f);while not eof(f)do begin read(f,t);if t.xb then xingbie:='男' else xingbie:='女';listbox1.Items.Add(t.xh+' '+t.xm+' '+xingbie+' '+inttostr(t.sx)+ ' '+inttostr(t.yy)+' '+inttostr(t.dz));end;closefile(f);end;procedure TForm1.Button2Click(Sender: TObject);begin close;end;end.5.166页22题素数 procedure

TForm1.Button1Click(Sender: TObject);type

sushuset=set of byte;var

sushu:sushuset;i,j,n,m,k:longword;s,s0:string;begin

n:=strtoint(edit1.text);m:=strtoint(edit2.text);if n mod 2=0 then n:=n+1;k:=m-n;

if k>255 then

showmessage('范围太大,请重新输入区间端点!')else begin

sushu:=[0..k];for i:=2 to n-1 do for j:=n to m do

if j mod i =0 then sushu:=sushu-[j-n];for i:=n to m p 2 do for j:= i+1 to m do

if j mod i =0 then sushu:=sushu-[j-n];s:='';s0:='';

for i:=n to m do if i-n in sushu then begin

if length(s0+' '+inttostr(i))>60 then begin

s:=s+s0+chr(13);s0:='' end;

s0:=s0+' '+inttostr(i);end;s:=s+s0;label1.caption:=s;

groupbox1.Top:=(panel1.Top-groupbox1.height)p 2;end;end;

procedure

TForm1.FormCreate(Sender: TObject);begin

groupbox1.Top:=(panel1.Top-groupbox1.height)p 2;end;

procedure

TForm1.Edit1KeyPress(Sender: TObject;var Key: Char);var j:set of char;begin

j:=['0'..'9',#8];

if not(key in j)then key:=#0;end;end.6.148页12题整除的数 implementation {$R *.dfm}

function d7(x:integer):boolean;begin

if x mod 7=0 then d7:=true else d7:=false;end;

function d17(x:integer):boolean;begin

if x mod 17=0 then d17:=true else d17:=false;end;

procedure

TForm1.FormActivate(Sender: TObject);var

n:integer;begin

for n:=1000 to 4000 do if d7(n)and d17(n)then memo1.Lines.Add(inttostr(n));end;end.7.148页17题求斐波那契数列问题 implementation {$R *.dfm} function fib(n:integer):int64;begin case n of 1,2:fib:=1;else fib:=fib(n-1)+fib(n-2);end;end;procedure TForm1.Button1Click(Sender: TObject);var k:integer;begin memo1.lines.clear;for k:=1 to strtoint(edit1.text)do memo1.lines.add(format('%2d %3d',[k,fib(k)]));end;end.8.120页10题,判断是否是闰年 procedure TForm1.Button1Click(Sender: TObject);var y,m:integer;begin y:=strtoint(edit1.text);m:=strtoint(edit2.text);label3.Caption:='';if((y mod 4 = 0)and(y mod 100 <> 0))or(y mod 400=0)then label3.Caption:=edit1.text+'年是闰年,' else label3.Caption:=edit1.text+'年不是闰年,';case m of 3,4,5:Label3.Caption:=Label3.Caption+edit2.Text+'月份是春天,';6,7,8:Label3.Caption:=Label3.Caption+edit2.Text+'月份是夏天,';9,10,11:Label3.Caption:=Label3.Caption+edit2.Text+'月份是秋天,';else Label3.Caption:=Label3.Caption+edit2.Text+'月份是冬天,';end;

case m of

1,3,5,7,8,10,12:Label3.Caption:=Label3.Caption+'共有31天,';

4,6,9,11:Label3.Caption:=Label3.Caption+'共有30天,';else

if((y mod 4 = 0)and(y mod 100 <> 0)or(y mod 400=0))then Label3.Caption:=Label3.Caption+'共有29天,' else

Label3.Caption:=Label3.Caption+'共有28天,';end;end;end.9.120页11题求和的 procedure

TForm1.Button1Click(Sender: TObject);var

n,k,j:integer;s:int64;begin

n:=strtoint(edit1.text);j:=0;s:=0;

for k:=1 to n do begin j:=j+k;s:=s+j;end;

panel2.Caption:=format('s = %d',[s]);edit1.setfocus;end;

procedure

TForm1.Edit1KeyPress(Sender: TObject;var Key: Char);var b:boolean;begin

b:=(key<>#8)and(key<#48)or(key>#57);

if b then key:=#0;end;end.10.120页12题男人,女人,小孩各有多少人 procedure

TForm1.Button1Click(Sender: TObject);var

x,y,z:integer;p:string;begin

memo1.clear;for x:=0 to 16 do for y:=0 to 24 do begin

z:=30-x-y;

if 3*x+2*y+z/1=50 then begin

p:=format('%3d %3d %3d',[x,y,z]);

memo1.lines.add(p);end;end;end;end.11.98页2题求长方体的表面积 procedure

TForm1.Button1Click(Sender: TObject);var

s,l,k,h:double;begin

l:=strtofloat(edit1.text);k:=strtofloat(edit2.text);h:=strtofloat(edit3.text);s:=2*l*k+2*k*h+2*l*h;label1.Caption:=floattostr(s);end;end.12.98页5题计算圆的面积和周长 procedure

TForm1.Edit1KeyPress(Sender: TObject;var Key: Char);var r:real;b:boolean;begin b:=(key<>#8)and(key<>'.')and(key<>#13)and(key<#48)or(key>#57);if b then key:=#0;if key =#13 then begin if edit1.text='' then edit1.text:='0';r:=strtofloat(edit1.text);if radiobutton1.Checked then label1.Caption:=format('圆的面积为: %f',[pi*r*r]);if radiobutton2.Checked then label1.Caption:=format('圆的周长为: %f',[2*pi*r]);if radiobutton3.Checked then label1.Caption:=format('圆的面积为: %f'+chr(13)+ '周长为: %f',[pi*r*r,2*pi*r]);edit1.SelectAll;end;end;procedure TForm1.RadioButton1Click(Sender: TObject);var sender0:tobject;key:char;begin sender0:=edit1;key:=#13;form1.edit1keypress(sender0,key);end;procedure TForm1.RadioButton2Click(Sender: TObject);var sender0:tobject;key:char;begin sender0:=edit1;key:=#13;form1.edit1keypress(sender0,key);end;procedure TForm1.RadioButton3Click(Sender: TObject);var sender0:tobject;key:char;begin

sender0:=edit1;key:=#13;

form1.edit1keypress(sender0,key);end;end.13.98页6题统计奇数和偶数的个数

procedure

TForm1.Button1Click(Sender: TObject);var

k,j,n:word;begin k:=0;

n:=combobox1.items.count;for j:=1to n do

if strtoint(combobox1.items[j-1])mod 2 = 0 then k:=k+1;

label1.caption:=format('共有: '+#13+'%d个偶数,'+#13+'%d个奇数。',[k,n-k]);end;

procedure

TForm1.Button2Click(Sender: TObject);begin

combobox1.items.clear;end;

procedure

TForm1.ComboBox1KeyPress(Sender: TObject;var Key: Char);begin if(key =#13)and(combobox1.text<>'')then

//按键后接收输入的选项 begin

combobox1.items.insert(0,combobox1.text);

//按键后移去选项

combobox1.selstart:=0;combobox1.text:='';end;

if key = #27 then

if combobox1.itemindex<>-1 then

combobox1.items.Delete(combobox1.itemindex);end;end.14.98页8题设置倒计时的时间,并进行倒计时 procedure

TForm1.Timer1Timer(Sender: TObject);var

m,n,s,h:integer;begin

timer1.Tag:=timer1.Tag-1;m:=timer1.Tag;if m<0 then begin

timer1.enabled:=false;

showmessage('预定的时间到了!');edit1.Text:='0';end else begin s:=m;

n:=s p 60;s:=s mod 60;h:=n p 60;n:=n mod 60;

maskedit1.text:=format('%d:%d:%d',[h,n,s]);

if n <> strtoint(edit1.text)then edit1.Text:=inttostr(n);end;end;

procedure

TForm1.Button1Click(Sender: TObject);begin

timer1.enabled:=True;

timer1.Tag:=strtoint(edit1.Text)*60;end;end.

第四篇: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 汇编语言中的表达式与高级语言中的表达式有何相同点和不同点? 答: 汇编语言中的表达式与高级语言中的表达式的相同点是都采用运

C语言程序设计教程课后习题答案

第一篇:C语言程序设计教程课后习题答案 C语言程序设计教程课后习题答案 第一章 C语言程序设计概述 -习题答案 算法的描...
点击下载
分享:
最新文档
热门文章
    确认删除?
    QQ
    • QQ点击这里给我发消息
    微信客服
    • 微信客服
    回到顶部