第一篇:C语言程序设计教程第二版答案 高教版 谭浩强 张基温
C语言程序设计教程第二版
高等教育出版社
谭浩强 张基温 唐永炎 等
第1章
1.1 请叙述什么是高级语言?
高级语言主要是指和机器硬件环境无关的程序设计语言。1.2 什么是过程化语言?什么是非过程化语言?
所谓面向过程语言,就是把解题过程看作是数据被加工的过程。其主要特点是数据与算法的分离。如C,PASCAL。可将过程程序设计语言简单地看作:程序=算法+数据结构。
非过程化语言的特点是数据和算法是一个有机的整体。如C++。1.3 请简述建立C语言程序的过程。
编辑,编译,连接,运行。File1.c file1.obj file1.exe 1.4 请编写一个程序,能显示出以下两行文字:
I am a student.I love China.//FileName:THQCh1_04.c #include
(1)cos3.5678(2)lg90(3)e2.567(4)5
(5)tan0.78563
//FileName:THQCh1_06.c #include
int SumofAandAbsB(int a,int b){ return a+abs(b);} 1.9 编写一个求0~100之间全部偶数之和的程序。//FileName:THQCh1_09.c #include
int SumofOddBetween0_100(){ int i,sum=0;for(i=0;i<=100;i++){
if(i%2==0)sum=sum+i;} return sum;} 1.10 编写一个程序,从5个整数中找出最小的数,并显示此数。int FindMinNum(int a[],int k);//从k个整数中找出最小的数 { if(n<1)exit(0);int i,x=a[0];for(i=1;i 2.1 为什么C语言中每个数据都要属于一个特定的类型? 因为不同的类型在内存中所占的存储空间不同,将数据区分为不同的类型可以更好地组织数据,提高数据处理的效率。 2.2 指出数的定点形式与浮点形式有何不同。 定点数不含指数部分,浮点数含指数部分。2.3 计算机中表示的数是连续的吗? 不是。 2.4 写一个程序测试你所用的C版本中的float型数据所占的字节数。int main(){ printf(“float型数据的长度为%dn”,sizeof(float));return 0;} 2.5 写一个程序测试一下把带小数的float和double型数据用printf函数输出时,小数部分截断还是四舍五入? #include 2.6 下列常数中哪些是合法的C常量那些是非法的C常量?对合法者指出其类型,对非法者指出原因。 3-0.-0x2aL 0x7g e3 003 23.e-5 ‘n’ “x-y” ‘{’ 12.5e “105” 0‘105’ “35′53” 3+5 357″ π e 2E5 ‘AB’ 0x2.5b 03e5 ±7f 7ff 2e-310 12356e 3e+2.3 5e+0 1g3 合法的常量如下: -0.-0x2al 0003 5e+0 3.e-5 2E5 ‘{’ ‘n’ “105” “x-y” “35′53” 不合法的常量如下: 32 0x7g e3 212.5e ‘105’ “35′53” 3+5 0357″ π e ‘AB’ 0x2.5b 03e5 ±7f 7ff 2e-310 12356e 3e+2.3 1g3 2.7 下面语句的执行结果是什么? (1)printf(“ 07 ABC 11 DE 12 FGH xA”);(2)printf(“nABCtDEnFGHn”);(3)printf(“n why is 21+31 equal to %d?nn”,21+31);(1) 07执行响铃,然后输出ABC; 11执行Tab键的功能; 12为换行; xA也为换行; (2)换行然后输出ABC,执行Tab键,输出DE,换行输出FGH,再换行;(3)换行后,输出why is 21+31 equal to 52? 然后两次换行。2.8 在下列符号中,你可以选用哪些作变量名?哪些不可以?为什么? a3B 3aB π +a b *x s b5 if next day e2 ok? Intger maxnumber i*j 可作变量名的有: a3B s next intger maxnumber 2.9 写出下面程序段执行后变量a,b,c的值。 char a=’2’,b=’a’;int c;c=a+b;a=c; a的ASCII码为147,为图形符号ô;b的值为’a’;c的值为147。2.10 写出下面程序的输出结果。main(){ int x;x=-3+4*5-6;printf(“%dn”,x);x=3+4%5-6;printf(“%dn”,x);x=-3*4%-6/5;printf(“%dn”,x);x=(7+6)%5/2;printf(“%dn”,x);} 1 0 1 2.11 写出下面程序的输出结果。main(){ printf(“%d%d%d%dn”,1+2,5.2,-2*4,11%3);printf(“%.5f%.5f%.5fn”,1.+2.,5.12,-2.*4.);} 32-82 3.000005.12000-8.00000 2.12 写出下面程序的执行结果。int main(){ int x=2,y,z;x*=3+2;printf(“%dn”,x);x*=y=z=4;printf(“%dn”,x);x=y=1;z=x++-1;printf(“%d,%dn”,x,z);z+=-x+++(++y);printf(“%d,%dn”,x,z);return 0;} 40 2,0 3,0 2.13 写出下面程序的运行结果。int main(){ int x=40,y=4,z=4;x=y==z;printf(“%dn”,x);x=x==(y-z);printf(“%dn”,x);return 0;} 0 2.14 写出下面程序的执行结果。int main(){ int x,y,z;x=y=z=3;y=x++-1;printf(“%dt%dt”,x,y);y=++x-1;printf(“%dt%dt”,x,y);y=z--+1;printf(“%dt%dt”,x,y);y=z--+1;printf(“%dt%dt”,x,y);y=--z+1;printf(“%dt%dt”,x,y);return 0;} 2 5 4 2 4 1 2.15 写出下面程序的输出结果。int main(){ int i,j;i=16;j=(i++)+i;printf(“%dn”,j);i=15;printf(“%dt%dn”,++i,i);i=20;j=i--+i;printf(“%dn”,j);i=13;printf(“%dt%dn”,i++,i);return 0;} 16 15 40 13 13 2.16 写出下列表达式的值。 (1)1<4 && 4<7(2)1<4 && 7<4(3)!(2<5==5)(4)!(1<3)||(2<5)(5)!(4<=6)&&(3<=7)(1)1(2)0(3)0(4)1(5)0 2.17 写出下面程序的输出结果。int main(){ int x,y,z;x=y=z=0;++x||++y&&++z;printf(“x=%dty=%dtz=%dn”,x,y,z);x=y=z=0;++x&&++y||++z;printf(“x=%dty=%dtz=%dn”,x,y,z);x=y=z=0;++x&&++y&&++z;printf(“x=%dty=%dtz=%dn”,x,y,z);x=y=z=-1;++x&&++y&&++z;printf(“x=%dty=%dtz=%dn”,x,y,z);x=y=z=-1;++x&&++y||++z;printf(“x=%dty=%dtz=%dn”,x,y,z);x=y=z=-1;++x||++y&&++z;printf(“x=%dty=%dtz=%dn”,x,y,z);return 0;} x=1 y=0 z=0 x=1 y=1 z=0 x=1 y=1 z=1 x=0 y=-1 z=-1 x=0 y=-1 z=0 x=0 y=0 z=-1 2.18 用C语言描述下列命题。 (1)a小于b或者小于c。(2)a或b都小于c。(3)a或b中有一个小于c。(4)a非负整数。(5)a是奇数。 (6)a不能被b整除。 (7)角A在第一或第三象限。 (8)a是一个带小数的正数,而b是一个带小数的负数。(1)a=0&&a<=PI/2)||(a>=PI&&a<=PI*3.2)(8)(floor(a)!=a&&a>0)&&(floor(b)!=b&&b<0),函数floor(a)的作用是求出不大于a的最大整数。 2.19 写出下面程序的输出结果。int main(){ int x=1,y=1,z=1;y=y+z;x=x+y;printf(“%dn”,x (1)(z>=y>=x)?1:0(2)z>=y&&y>=x(1)0(2)1 2.21 若x=3,y=2,z=1,求下列表达式的值。 (1)x 5 6 6 9 7 9 0 1 2.23 用条件表达式描述: (1)取三个数中的最大者。 (2)任意两数存放在变量c1与c2中,让小数存放在c1中,大数存放在c2中,并输出大数。 (1)设三个数分别为a,b,c,表达式如下: (max1=(a>b)?a:b)>c?max1:c(2)设任意两数分别为a,b,表达式如下: c2=(a>b)?a:b;c1=(a 128234.889999-123.456700 234.8902.349e+002 0234.8902.349e+002-123.457-123.456700-1.234567e+002 ***128% 2.26 有一字符串s的值为”ABCDEFGHIJKL”,写出执行完下面的程序段后的输出结果。int main(){ char s[]=“ABCDEFGHIJKL”;printf(“%%%20s%%n”,s);printf(“%%%-20s%%n”,s);printf(“%%%020s%%n”,s);printf(“%%%-020s%%n”,s);return 0;} % ABCDEFGHIJKL% %ABCDEFGHIJKL % %00000000ABCDEFGHIJKL% %ABCDEFGHIJKL % 2.27 写出下面程序的输出结果。int main(){ char c;short i;c='A';i=65;printf(“c:dec=%d oct=%o hex=%x ASCII=%cn”,c,c,c,c);printf(“i:dec=%d oct=%o hex=%x unsigned=%un”,i,i,i,i);c='x';i=-4;printf(“c:dec=%d oct=%o hex=%x ASCII=%cn”,c,c,c,c);printf(“i:dec=%d oct=%o hex=%x unsigned=%un”,i,i,i,i);return 0;} c:dec=65 oct=101 hex=41 ASCII=A i:dec=65 oct=101 hex=41 unsigned=65 c:dec=120 oct=170 hex=78 ASCII=x i:dec=-4 oct=177774 hex=fffc unsigned=65532 2.28 指出下面程序段中的错误,并改正。int main(){ int a;float b;fchar c;seanf(“%c%d%c%f;c,b,a,b);return 0;} char c;scanf(”%c%f%d%fn”,&c,&b,&a,&b);2.29 当输入流为”56789 012345a72”时,执行下面的程序段。 int i,j;float x,y;char c;scanf(“%2d%f%f%c%d”,&i,&x,&y,&c,&j); 56, 789.000000, 12345.000000, a, 72 2.30 请说明C语言的数据类型,并指出C语言有哪些特点? 整型字符型单精度型基本类型实型浮点型双精度型枚举类型数据类型 数组类型构造类型结构体类型共用体类型指针类型空类型 C语言的数据类型丰富,功能强。C语言兼有高级语言和低级语言的功能,灵活方便。缺点是较复杂,危险性高,不易掌握。 2.31 C语言为什么要规定对所有的变量要“先定义,后使用”?这样做有什么好处? (1)因为如果不加定义,就无从知道标识符是变量还是别的程序实体; (2)如果不加定义,就不知道它的类型,也就无法为其分配指定大小的存储单元;(3)如果不加定义,就无法在编译阶段对其进行检查,以确定其合法性。2.32 请将下面各数用八进制和十六进制数表示: (1)10 (2)32 (3)75 (4)–617(5)–111(6)2483(7)–28654(8)21003(1)012 0xa(2)040 0x20(3)0113 0x4b(4)037777776627 0xfffffd97(5)037777777621 0xffffff61(6)04663 0x9b3(7)037777710022 0xffff9012(8)051013 0x520b 2.34 写出以下程序的运行结果。int main(){ char c1='a',c2='b',c3='c',c4='101',c5='116';printf(“a%cb%ctc%ctabcn”,c1,c2,c3);printf(“tb%c %cn”,c4,c5);return 0;} aabb cc abc A N 2.35 要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5五个变量的值分别为‘C’,‘h’,‘i’,‘n’,‘a’,经过运算,使c1,c2,c3,c4,c5分别变为‘G’,‘l’,‘m’,‘r’,‘e’,并输出。int main(){ char c1,c2,c3,c4,c5;printf(“请输入五个字符:”);scanf(“%c %c %c %c %c”,&c1,&c2,&c3,&c4,&c5);c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf(“加密后的结果为:%c%c%c%c%cn”,c1,c2,c3,c4,c5);return 0;} 2.36 程序能否写成如下形式: int main(){ int c1,c2;c1=97;c2=98;printf(“%c %cn”,c1,c2);return 0;} 程序输出a b 2.37 求下面算术表达式的值。(1)x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7(2)(float)(a+b)/2+(int)x/y 设a=2,b=3,x=3.5,y=2.5(1)2.500000(2)3.700000 2.38 写出以下程序的运行结果。int main(){ int i,j,m,n;i=8;j=10;m=++i;n=j++;printf(“%d,%d,%d,%dn”,i,j,m,n);return 0;} 9,11,9,10 2.40 写出下面表达式运算后a的值,设原来a=12。 (1)a+=a(2)a-=2(3)a*=2+3(4)a%=(n%=2)(设n的值等于5)(5)a/=a+a(6)a+=a-=a*=a(1)24 (2)10 (3)60 (4)0(5)0 (6)0 2.41 什么是算术运算?什么是关系运算?什么是逻辑运算? 算术运算:+-* / % ++--关系运算:< > == >= <=!= 逻辑运算:!&& || 2.42 C语言中如何表示真假?系统如何判断一个量的真假? C语言用整数1和0表示真假 2.43 写出下面各逻辑表达式的值,设a=3,b=4,c=5。(1)a+b>c && b==c(2)a||b+c && b-c(3)!(a>b)&&!c &&!1(4)!(x=a)&&(y=b)&& 0(5)!(a+b)+c-1 && b+c/2(1)0(2)1(3)0(4)0(5)1 2.44 C语言为什么要把输入输出的功能用函数来实现,而不作为语言的基本部分? 因为输入输出的对象是数据,而数据是以介质为载体的,因此进行输入输出就要与各种外部设备打交道。由于不同的系统进行输入输出的差异较大,所以必须使用函数和操作系统进行交互,以便存取不同的设备文件。2.45 若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下的输出格式和结果,请写出程序。 要求输出结果如下: a= 3 b= 4 c= 5 x=1.200000,y=2.400000,z=-3.600000 x+y= 3.60 y+z=-1.20 z+x=-2.40 u= 51274 n= 128765 c1=’a’ or 97(ASCII)c2=’b’ or 98(ASCII)int main(){ int a=3,b=4,c=5;double x=1.2,y=2.4,z=-3.6;unsigned int u=51274,n=128765;char c1='a',c2='b';printf(“a=%2d b=%2d c=%2dn”,a,b,c);printf(“x=%f,y=%f,z=%fn”,x,y,z);printf(“x+y=%5.2f y+z=%5.2f z+x=%5.2fn”,x+y,y+z,z+x);printf(“u=%6u n=%10un”,u,n);printf(“c1=%c or %d(ASCII)n”,c1,c1);printf(“c2=%c or %d(ASCII)n”,c2,c2);return 0;} 2.46 请写出下面程序的输出结果: int main(){ int a=5,b=7;float x=67.8564,y=-789.124;char c='A';long n=1234567;unsigned u=65535;printf(“%d%dn”,a,b);printf(“%3d%3dn”,a,b);printf(“%f,%fn”,x,y);printf(“%-10f,%-10fn”,x,y);printf(“%8.2f,%8.2f,%.4f,%.4f,%3f,%3fn”,x,y,x,y,x,y);printf(“%e,%10.2en”,x,y);printf(“%c,%d,%o,%xn”,c,c,c,c);printf(“%ld,%lo,%xn”,n,n,n);printf(“%u,%o,%x,%dn”,u,u,u,u);printf(“%s,%5.3sn”,“COMPUTER”,“COMPUTER”);return 0;} 57 5 7 67.856400,-789.124023 67.856400 ,-789.124023 67.86,-789.12,67.8564,-789.1240,67.856400,-789.124023 6.785640e+001,-7.89e+002 A,65,101,41 1234567,4553207,12d687 65535,177777,ffff,65535 COMPUTER, COM 2.47 用下面的scanf函数输入数据,使a=3,b=7,x=8.5,7=71.82,c1=’A’,c2=’a’,问在键盘上如何输入? int main(){ int a,b;float x,y;char c1,c2;scanf(“%d %d %f %f %c %c”,&a,&b,&x,&y,&c1,&c2);printf(“%d %dn”,a,b);printf(“%f %fn”,x,y);printf(“%c %cn”,c1,c2);return 0;} 2.48 用下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据? int main(){ int a,b;char c1,c2;float x,y,z;scanf(“%d %d %c %c %f %f %f”,&a,&b,&c1,&c2,&x,&y,&z); printf(“%d %dn”,a,b);printf(“%f %f %fn”,x,y,z);printf(“%c %cn”,c1,c2);return 0;} 2.49 设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,然后输出计算结果。输出时要求有文字说明并取小数点后两位数字,请编程序。 #define Pi 3.1415926 int main(){ double r,h;scanf(“%lf %lf”,&r,&h);printf(“圆的周长=%.2fn”,2*Pi*r);printf(“圆的面积=%.2fn”,Pi*r*r);printf(“圆球表面积=%.2fn”,Pi*r*r/6);printf(“圆球体积=%.2fn”,4*Pi*r*r*r/3);printf(“圆柱体积=%.2fn”,Pi*r*r*h);return 0;} 2.50 输入一个华氏温度的取值F,要求输出摄氏温度的取值C。公式为 C=5(F-32)/9 输出要有文字说明,取两位小数。#include char c1,c2;与 int c1,c2;是否无条件等价? int main(){ char c1,c2;c1=getchar();c2=getchar();putchar(c1);putchar(c2);printf(“n%c %cn”,c1,c2);return 0;}(1)二者皆可。 (2)用printf函数将printf(“n%c %cn”,c1,c2)改成printf(“n%d %dn”,c1,c2)即可。(3)不是,整型可以代替字符型,但字符无法完全替代整型。第3章 3.1 写出下面程序的执行结果。int main(){ int value1,value2,sum;value1=50;value2=25;sum=value1+value2;printf(“The sum of %d and %d is %dn”,value1,value2,sum);return 0;} The sum of 50 and 25 is 75 3.2 请设计下列算法: (1)有两盘磁带,A录英语,B录音乐,把它们交换过程。(2)依次输入10个数,找出最大数。(3)把三个任意数按大小顺序排列。(4)判断一个整数n能否倍和5整除。(5)求两个正整数m和n的最大公约数。 (1)int a,b,c;c=a;a=b;b=c;(2)int max(int a[],N){ int a;int i;for(i=0;i if(ab){ if(a>c) if(b>c)printf(“%d %d %d”,a,b,c); else printf(“%d %d %d”,a,c,b); else printf(“%d %d %d”,c,a,b);} else{ if(b>c) if(a>c)printf(“%d %d %d”,b,a,c); else printf(“%d %d %d”,b,c,a); else printf(“%d %d %d”,c,b,a);} return 0;}(4)int main(){ int a;scanf(“%d”,&a);if(a%3 && a%5)printf(“不能被3和5整除n”);else if(a%3)printf(“不能被3整除但可以被5整除n”); else if(a%5)printf(“不能被5整除但可以被3整除n”);else printf(“既可以被3整除也可以被5整除n”);return 0;}(5)int MaxSameNum(int m,int n){ int u,v,r;u=m;v=n;if(u*v!=0){ while(r=u%v) { u=v;v=r; } return v;} else return 0;} 3.3 有下列条件语句: if(a (2)检查其中有无多余的判断条件或矛盾的判断条件。(3)重写一个等效的、简洁的条件语句。if(a=d */ else{ /* d<=c<=a } } } else x=7;检查: if(a } } else x=7;3.4 写出下面程序的执行结果。int main(){ int x,y=1,z;if(y!=0)x=5;printf(“x=%dt”,x);if(y==0)x=3;else x=5;printf(“x=%dtn”,x);z=-1;if(z<0) if(y>0)x=3; else x=5;printf(“x=%dtn”,x);if(z=y<0)x=3;else if(y==0)x=5; } else x=7;printf(“x=%dt”,x);printf(“z=%dtn”,z);if(x=z=y)x=3;printf(“x=%dt”,x);printf(“z=%dtn”,z);return 0;x=5 x=5 x=3 x=7 z=-1 x=3 z=1 3.5 设计一个从五个数中取最大数及最小数的程序。 int main(){ double n,max,min;printf(“enter 5 real numbers:n”);scanf(“%lf”,&n);max=n;min=n;while(scnaf(“%lf”,&n)!=EOF){ if(n>max)max=n; if(n int main(){ float a,b,c,x;printf(“nPlease enter 3 Reals:n”);scanf(“%f %f %f”,&a,&b,&c);if(a x=a; a=b; b=x;} if(b>c)printf(“%ft%ft%fn”,a,b,c);else if(c>a)printf(“%ft%ft%fn”,c,a,b); else printf(“%ft%ft%fn”,a,c,b);return 0;} 3.7 设计一个判断输入年份是否闰年的C程序。#include printf(“%d是闰年!n”,year);else printf(“%d不是闰年!n”,year);return 0;} int IsLeap(int year){ if(year%4==0 && year%100!=0 || year%400==0) return 1;else return 0;} 3.8 由键盘输入三个数,计算以这三个数为边长的三角形面积。#include s=(a+b+c)/2; s1=s*(s-a)*(s-b)*(s-c); s=sqrt(s1); return s;} else return 0;} 3.9 由键盘输入一个数,打印出它的类型标识符。int main(){ int label;char c;printf(“nPlease enter 1 number:”);c=getchar();while(c!=‟n‟){ if(c==‟.‟)label =1;c=getchar();} if(label==1)printf(“nfloat”);else printf(“nint”);return 0;} 3.10 指出下面程序的打印结果。int main(){ int n=0;while(n++<=1)printf(“%dt”,n);printf(“%dn”,n);return 0;} 2 3 3.11 把下列程序改写得更合理。(1)while(A){ if(B)continue;C;}(2)do{ if(!A)continue;else B;C;}while(A)(1)while(A){ if(!B)C;}(2)do{ if(A){ } }while(A)3.12 指出下面三个程序的功能。当输入为“quert?”时,它们的执行结果是什么?(1)int main(){ char c;c=getchar();while(c!=‟?‟){ putchar(c); c=getchar();} return 0;}(2)int main(){ char c;while((c=getchar())!=‟?‟)putchar(++c);}(3)int main(){ while(putchar(gechar())!=‟?‟);} (1)的功能是显示从键盘输入的每一个字符,当输入?时结束。当输入“quwet?”时,执行结果是quwet。 (2)的功能是显示从键盘输入的每一个字符的下一个字符,当输入?时结束。当输入“quwet?”时,执行结果是rvfsu。 (3)的功能与(1)相同,但输出结果多一个?。 3.13 把由键盘输入的数列(如1,3,5,7,9,…)按相反的顺序输出。#include scanf(“%d”,&a[i]);for(i=k;i>0;i--)printf(“%dn”,a[i-1]);return 0;} 3.14 打印ASCII码值为32~255的ASCII码值、字符对照表。int main(){ int i;for(i=32;i<256;i++){ if(i%8==0)printf(“n”); printf(“4d %c”,i,i);} return 0;} 3.15 打印形状为直角三角形的九九表。int main(){ int i,j;printf(“*”);for(i=1;i<10;i++)printf(“%4d”,i);printf(”nn”);for(i=1;i<10;i++){ printf(”%2d”,i); for(j=1;j<=i;j++) printf(“%4d”,j*k); printf(“n”);} return 0;} 3.16 计算e的值。 e=1 + 1/1!+ 1/2!+ 1/3!+ … 使误差小于给定的精度δ。#include mdiv(i,e); e[0]++;} printf(“e=%d.”,e[0]);for(i=1;i<=M;i++){ if(e[i]<10)printf(“00%d”,[i]); else if(e[i]<100)printf(“0%d”,e[i]); else printf(“%d”,e[i]); printf(“ ”);} printf(“n”);return 0;} void mdiv(int m,int e[]){ long int rem=0,d; for(int i=0;i<=M;i++){ d=e[i]; e[i]=(d+rem)/m; rem=(d+rem)%m*1000;} } 3.17 递增的牛群:若一头母牛,从第四年开始每年生一头母牛。按此规律,第n年时有多少头母牛? #include /*从第i年开始,三年前的小牛已可以生产,即a[i-3]属于可生产牛,则第i年将新增小牛数a[i-3]头。 将上年(i-1年)牛的总数a[i-1]加上新生小牛数a[i-3],即为第i年牛的总数a[i-1]+a[i-3]=a[i]。*/ for(i=3;i a[i]=a[i-3]+a[i-1];for(i=0;i printf(“%dn”,a[i]);return 0;} 3.18 把一元人民币换成5分、2分和1分的硬币,有多少种换法 #include for(x=0;x<=Total/5;x++){ for(y=0;y<=(Total-5*x)/2;y++){ z=Total-5*x-2*y; Times++; printf(“%d个5分,”,x); printf(“%d个2分,”,y); printf(“%d个1分n”,z); } } printf(“共有%d”种换法n“,Times);return 0;} 3.19 百马百担问题。有100匹马,驮100担货,大马驮3担,中马驮2担,两个小马驮1担。问有大,中,小马各多少匹? int main(){ int x,y,z;int HorseTotalNum=100;int BurdenTotalNum=100;int Times=0; for(x=0;x<=HorseTotalNum/3;x++) for(y=0;y<=(HorseTotalNum-3*x)/2;y++) for(z=0;z<=100;z++){ if(x+y+z==HorseTotalNum && 6*x+4*y+z==2*BurdenTotalNum){ Times++; printf(”大马%d个,“,x); printf(”中马%d个,“,y); printf(”小马%d个n“,z); } } printf(”共有%d种组合n“,Times);return 0;} 3.20 车票问题。某铁路线上共有10个车站,问需准备几种车票? int main(){ int i,j,station,Total=0;printf(”请输入车站的数量:“);scanf(“%d”,station);for(i=1;i for(j=i;j Total+=2;Printf(”共需%d种车票n“,Total);return 0;} 3.21 验证欧拉公式a(n)=n*n-n+41是-39~40之间的素数通项公式 #include p=i*i-i+41; printf(”n=%dtp=(%d)*(%d)-(%d)+41=%dt”,n,n,n,n,p); for(j=2;j<=sqrt((double)p);j++) if(!(p%j)){ printf(“errorn”); return 0; } printf(“OKn”);} return 0;} 3.22.延长数列。将下列数列: 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,1,5,10,10,5,1,… 延长到55个。int main(){ int a[60];int i,j,k=0;for(i=1;;i++){ if((k+1)>55)break; a[k+1]=1; for(j=2;j if((k+j)>55)break; a[k+j]=a[k-(i-1)+(j-1)]+a[k-(i-1)+j]; } if((k+j)>55)break; a[k+=i]=1;} for(i=1;i<=55;i++)printf(“%4d”,a[i]);return 0;} 3.23 吉普车穿越沙漠问题。用一辆吉普车穿越1000公里的沙漠。吉普车的总装油量为500L,耗油量为1L/km。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时加油库。该吉普车要以最少的油耗穿越沙漠,应在什么地方建立临时油库,以及在什么地方安放多少油最少? int main(){ int k;//倒数第k个站点 double Distation;//当前站点离终点的距离 double x;//下一站点离本站的距离 double Total;//当前站点的储油量 //显然,算法结束的条件是,当前站点离终点的距离Distation>1000 //倒数第一个站点的初条件是 k=0;Distation=0;Total=0; //从下一站点到本站的距离为x,//从下一站点跑到本站点k需要跑2k+1次x距离,//用以保证本站点有足够的油量储备 //下一站点的油量储备应为500*(k+1),或者本站点的油量储备为500k while(Distation<1000){ //显示当前站点号,当前站点离终点距离,当前站点储油量 printf(“倒数第%d个站点,”,k); printf(“该站点距终点的距离为%lfkm”,Distation); printf(“当前站点油量储备为%ldn”,Total); x=500.0/(2*k+1); Distation=Distation+x; Total=Total+500; k++;} //当前站点已经越过起点,所以应回到前一站点重新计算 Distation=Distation-x;Total=Total-500;k--; x=1000-Distation;Distation=Distation+x;Total=Total+(2*k+1)*x;printf(“倒数第%d个站点,”,k);printf(“该站点距终点的距离为%lfkm ”,Distation);printf(“当前站点油量储备为%lf升n”,Total);return 0;} 3.24.印度国王的奖励。相传古代印度国王奖励他的聪明能干的宰相达依尔(国际象棋的发明者),问他要少摸?达依尔回答:“陛下只要在国际象棋棋盘的第一个格子上放一粒麦子,第二个格子上放二粒麦子,以后每个格子的麦子都按前一格的两倍计算,如果陛下按此法给我64格的麦子,我就感激不尽,其他什么也不要了。”国王想:“这还不容易!”就让人扛了一袋麦子,但很快用光了,再扛出一袋还不够,请您为国王算一算共要给达依尔多少 8小麦?(设一立方小麦约1.4×10粒)int main(){ int i,frame;double wheattal=0;double wheatfnu=1;printf(“请输入棋盘格数:”);scanf(“%d”,frame);for(i=0;i wheattal+=wheatfnu; wheatfnu+=wheatfnu;} printf(“小麦的总量约为%lfn”,wheattal/1.4e8);return 0;} 3.25 输入两个正整数m和n,求其最大公约数和最小公倍数。int GreatestCommonDivisor(int m,int n)/*返回最大公约数*/ { int u,v,r;if(m==0 || n==0)return 0;u=m;v=n;while(r=u%v){ u=v; v=r;} return v;} int LeastCommonMultiple(int m,int n)/* 返回最小公倍数 */ { int u;u=GreatestCommonDivisor(m,n);if(!u)return 0;return u*(m/u)*(n/u);} 3.26 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。#define N 100 int main(){ char s[N];char *p;int i=0,j=0,k=0,m=0;gets(s);p=s;while(*p!=' '){ if(*p<123 && *p>64)i++; else if(*p==32)j++; else if(*p<58 && *p>47)k++; else m++; p++;} printf(“英文字符个数为:%dn”,i);printf(“空格数为:%dn”,j);printf(“数字个数为:%dn”,k);printf(“其它字符个数为:%dn”,m);return 0;} 3.27 求Sn=a + aa + aaa + … + aa…a(n个a)之值,其中a是一个数字。long int SumOfaa(int a,int k){ if(a<1 || k<1)return 0;if(k==1)return a;else return 10*(SumOfaa(a,k-1)-SumOfaa(a,k-2))+a+SumOfaa(a,k-1);} 3.28 求n!(即求1!+2!+3!+…+20!)。 n120long int SumOfRfact(int k){ if(k<1)return 0;else if(k<2)return 1; else } 3.29 求 100return k*(SumOfRfact(k-1)-SumOfRfact(k-2))+SumOfRfact(k-1);50101 kkk1k1k1k2long int SumOfk(int k){ int i,sum=0;if(k<1)return 0;for(i=1;i<=k;i++)sum+=i;return sum;} long int SumOfk2(int k){ int i,sum=0;if(k<1)return 0;for(i=1;i<=k;i++)sum+=i*i;return sum;} double SumOfk1(int k){ int i;double sum=0.0;if(k<1)return 0;for(i=1;i<=k;i++)sum+=1.0/i;return sum;} 3.30 打印出所有“水仙花数”。所谓水仙花数是指一个三位数,其各位数字立方和等于该333数本身。例如,153=1+5+3。int main(){ int i=0;int x,y,z;for(x=1;x<10;x++) for(y=0;y<10;y++) for(z=0;z<10;z++) if(x*x*x+y*y*y+z*z*z==x*100+y*10+z){ printf(“%dn”,x*100+y*10+z); i++; } printf(“共有%d个水仙花数n”,i);return 0;} 3.31 一个数如果恰好等于它的因子之和,这个数就称之为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数。并按下面的格式输出其因子。#define N 1000 int AllFactors(int a[],int k);int OverNum(int k);int main(){ int i,k=0;for(i=1;i<=N;i++){ if(OverNum(i)){ printf(“%d is OverNumn”,i); k++; } } printf(“There are %d OverNumsn”,k);return 0;} /* 求k的所有因子,因子保存在数组a中,返回因子的个数 */ int AllFactors(int a[],int k){ int i;int m=1;/* 用以记录因子的个数 */ if(k<1)return 0;a[0]=1;for(i=2;i if(k%i==0){ /* i是因子 */ a[m++]=i;/* 因子送数组保存 */ } } return m;} int OverNum(int k){ int a[100];int j,m;int sum=0;m=AllFactors(a,k);/* 记录因子个数 */ for(j=0;j return 1;else return 0;} 3.32 有一分数序列: 23581321,,,… 1235813求出这个序列的前20项之和。#define N 20 double SumFractions(int k);int main(){ printf(“%lfn”,SumFractions(N));return 0;} double SumFractions(int k){ int i;double sum=0.0;double a=2.0,b=1.0,temp;for(i=0;i sum=sum+a/b; temp=a; a=a+b; b=temp;} return sum;} 3.33 一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高? double TotalDistance(double Height,double Times,double Ratio);double ReboundingDistance(double Height,double Times,double Ratio);int main(){ double Height,Times,Ratio;printf(“请输入小球的高度,反弹次数,反弹高度比例:”);scanf(“%lf%lf%lf”,&Height,&Times,&Ratio);printf(“反弹的总距离为%lf米n”,TotalDistance(Height,Times,Ratio));printf(“最后一次反弹的高度为%lf米n”,ReboundingDistance(Height,Times,Ratio));return 0;} double TotalDistance(double Height,double Times,double Ratio){ int i;double sum=0.0;double h;h=Height;for(i=0;i if(i==0)sum=sum+h;else sum=sum+2*h; h=h*Ratio;} return sum;} double ReboundingDistance(double Height,double Times,double Ratio){ int i;double h;h=Height;for(i=0;i h=h*Ratio;} return h;} 3.34 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。已经每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩下一个桃子了。求第一天共摘多少桃子? int MonkeyEatPeach(int days);int main(){ int days;printf(“请输入猴子吃桃的天数:”);scanf(“%d”,&days);printf(“猴子总共摘了%d个桃子n”,MonkeyEatPeach(days));return 0;} int MonkeyEatPeach(int days){ int i,sum=1;for(i=0;i sum=2*(sum+1);return sum;} 3.35 用迭代法求x=a的近似根。求平方根的迭代公式为 xn11a xn2xn-5要求前后两次求出的x的误差的绝对值小于10。 double ApproximateSqrtRoot(double a,double precision);int main(){ double a,prec;printf(“请输入欲求平方根的数及精度:”);scanf(“%lf%lf”,&a,&prec);printf(“%lf的平方根近似为%lfn”,a,ApproximateSqrtRoot(a,prec));return 0;} double ApproximateSqrtRoot(double a,double precision){ double x1=a,x2;x2=(x1+a/x1)/2;if(a<0)exit(0);while(fabs(x1-x2)>precision){ x1=x2; x2=(x1+a/x1)/2;} return x2;} 3.36 用牛顿迭代法求方程在1.5附近的根。 322x-4x+3x-6=0 /* 牛顿迭代法解方程 */ double NewtonSolvingEquation(double x,double precision){ double x1,x2;x1=x;x2=x1-func1(x1)/dfunc1(x1);while(fabs(x1-x2)>precision){ x1=x2; x2=x1-func1(x1)/dfunc1(x1);} return x2;} double func1(double x)/* 方程f(x)=0的函数f(x)*/ { return 2*x*x*x-4*x*x+3*x-6;} double dfunc1(double x)/* f(x)的导函数 */ { return 6*x*x-8*x+3;} 3.37 用二分法求方程在(-10,10)之间的根。 322x-4x+3x-6=0 /* 二分法解方程 */ double BinarySolvingEquation(double x1,double x2,double precision){ double a,b,c;a=x1;b=x2;while(fabs(a-b)>precision){ c=(a+b)/2; if(func1(c)*func1(a)<0)b=c; else a=c;} return a;} double func1(double x)/* 方程f(x)=0的函数f(x)*/ { return 2*x*x*x-4*x*x+3*x-6;} 3.38 打印出以下图案。 * *** ***** ******* ***** *** * void ShowSpace(int k);int main(){ int MaxStarNum;int i,j;int bl,el;/* bl为起始位置,el为本行图案长度 */ scanf(“%d”,&MaxStarNum);if(MaxStarNum%2==0)return 0;/* 最大长度不是奇数,不符合题意退出 */ for(i=0;i if(i<=MaxStarNum/2){/* 计算上半区每行图案起始位置和长度 */ bl=MaxStarNum/2-i; el=2*i+1; } else{/* 计算下半区每行图案起始位置和长度 */ bl=i-MaxStarNum/2; el=MaxStarNum-(2*(i-MaxStarNum/2)); } ShowSpace(bl);/* 图案前的空格数 */ for(j=bl;j printf(“n”);} return 0;} void ShowSpace(int k){ int i=0;while(i++ for(B='X';B<='Z';B++) for(C='X';C<='Z';C++) if(A!='X' && C!='X' && C!='Z' && A!=B && B!=C && C!=A) printf(“A vs %c, B vs %c, C vs %cn”,A,B,C);return 0;} 3.40 有三个整数a,b,c,由键盘输入,输出其中最大的数。int Max3(int a,int b,int c);int main(){ int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“最大的数是%dn”,Max3(a,b,c));return 0;} int Max3(int a,int b,int c){ int temp;temp=a>b?a:b;return temp>c?temp:c;} 3.41 有一函数: x1xy2x11x10 3x11x10编写一程序,输入x,输出y值。 double funcy(double x);int main(){ double x,y;scanf(“%lf”,&x);y=funcy(x);printf(“最大的数是%lfn”,y);return 0;} double funcy(double x){ if(x<1)return x;else if(x<10)return 2*x-1; else return 3*x-11;} 3.42 给出百分制成绩,要求输出成绩等级’A’,’B’,’C’,’D’,’E’。90分以上为’A’,81~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。int main(){ double score;scanf(“%lf”,&score);if(score>100 || score<0)return 0;if(score>=90)printf(“An”);else if(score>=80)printf(“Bn”); else if(score>=70)printf(“Cn”); else if(score>=60)printf(“Dn”); else printf(“En”);return 0;} 3.43 给一个不多于5位的正整数,要求:(1)求出它是几位数;(2)分别打印出每一位数字;(3)按逆序打印出各位数字,例如原数为321,应输出123。int main(){ int i,k;int a[5];unsigned int x;scanf(“%u”,&x);if(x>99999 || x<0)return 0;a[0]=x/10000;a[1]=(x-a[0]*10000)/1000;a[2]=(x-a[0]*10000-a[1]*1000)/100;a[3]=(x-a[0]*10000-a[1]*1000-a[2]*100)/10;a[4]=x-a[0]*10000-a[1]*1000-a[2]*100-a[3]*10;/* 求出它的几位数 */ printf(“(1):”);if(a[0])printf(“5位数n”);else if(a[1])printf(“4位数n”); else if(a[2])printf(“3位数n”); else if(a[1])printf(“2位数n”); else printf(“1位数n”);/* 计算无效0的个数 */ k=0;while(k<5 && a[k]==0)k++;/* 打印每一位数字 */ printf(“(2):”);for(i=k;i<5;i++)printf(“%d ”,a[i]);printf(“n”);/* 逆序打印每一位数字 */ printf(“(3):”);for(i=4;i>=k;i--)printf(“%d ”,a[i]);printf(“n”);return 0;} 3.44 企业发放的奖金根据利润提成。利润(I)低于或等于10万元的,奖金可提10%;利润高于10万元,低于20万元(100000 if(I<=20) bouns=10*0.1+(I-10)*0.75; else if(I<=40) bouns=10*0.1+10*0.75+(I-20)*0.05; else if(I<=60) bouns=10*0.1+10*0.75+20*0.05+(I-40)*0.03; else if(I<=100) bouns=10*0.1+10*0.75+20*0.05+ 20*0.03+(I-60)*0.15; else bouns=10*0.1+10*0.75+20*0.05+ 20*0.03+40*0.15+(I-100)*0.01;printf(“本月总奖金数为%lf万元n”,bouns);return 0;} 3.45 输入四个整数,要求按大小顺序输出 #define N 4 int bubble(int a[],int k);int main(){ int i;int a[N];for(i=0;i for(i=0;i<4;i++)printf(“%d ”,a[i]); printf(“n”);} return 0;} int bubble(int a[],int k){ int i,j;int t,temp;if(k<1)return 0;for(i=1;i<=k-1;i++){ t=k-i;for(j=0;j<=t-1;j++) if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } return 1;} 3.46 有四个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1,见图 3.12。这四个塔的高度都为10米,塔以外无建筑物。今输入任一点的坐标,求该点相应的高度(塔外的高度为0)。double TowerHeight(double x,double y,double z);int main(){ double x,y,z;scanf(“%lf %lf %lf”,&x,&y,&z);printf(“该点的高度为%lfn”,TowerHeight(x,y,z));return 0;} double TowerHeight(double x,double y,double z){ if((x-2)*(x-2)+(y-2)*(y-2)<=1 || (x+2)*(x+2)+(y-2)*(y-2)<=1 || (x-2)*(x-2)+(y+2)*(y+2)<=1 || (x+2)*(x+2)+(y+2)*(y+2)<=1) return z;else return 0;} 第4章 函 数 4.1 指出下列程序中的错误或不合理之处,并改正之。int main(){ int s,x,n;s=power(x,n);} power(y){ int i,p=1;for(i=1;i<=n;++i) p=p*y;} int power(int x,int n);int main(){ int s,x,n;scanf(“%d %d”,&x,&n);s=power(x,n);printf(“%s=%dn”,s);return 0;} int power(int x,int n){ int i,p=1;for(i=1;i<=n;++i) p=p*x*i;return p;} 4.2 编写程序在屏幕上画一条正弦曲线。#include CurLoc=(int)(SetLoc+Amplitude*sin(i*PI/180)); if(CurLoc ShowSpace(CurLoc-1); printf(“*”); ShowSpace(SetLoc-CurLoc-1); printf(“I”); } else{ if(CurLoc==SetLoc){ ShowSpace(SetLoc-1); printf(“*”); } else{ ShowSpace(SetLoc-1); printf(“I”); ShowSpace(CurLoc-SetLoc-1); printf(“*”); } } printf(“n”);} return 0;} void ShowSpace(int k){ int i=0;while(i++ for(i=0;i printf(“没有公因子n”);printf(“n”);return 0;} int AllFactors(int a[],int k){ int i;int m=0;/* 用以记录因子的个数 */ int u=k;/* 用以保存余数 */ for(i=2;i while(u%i==0){ /* i是因子 */ a[m++]=i;/* 因子送数组保存 */ u=u/i;/* 余数 */ } } return m;} 4.5 写出计算Ackermann函数Ack(m,n)的递归函数。对于m≥0,n≥0,Ack(m,n)定义为: Ack(0,n)=n+1 Ack(m,0)=Ack(m-1,1)Ack(m,n)=Ack((m-1),Ack(m,n-1))对m>0,n>0要求显示计算过程。long int ack(int m,int k);int main(){ int m,k;printf(“请输入m,n的值:”);scanf(“%d %d”,&m,&k);printf(“%dn”,ack(m,k));return 0;} long int ack(int m,int k){ if(m<0 || k<0)exit(0);if(!m){ printf(“ack(%d,%d)=%dn”,m,k,k+1); return k+1;} else if(!k){ printf(“ack(%d,%d)=ack(”%d,1)n“,m,k,m-1); return ack(m-1,1); } else{ printf(”ack(%d,%d)=ack(%d,ack(%d,%d))n“,m,k,m-1,m,k-1); return ack((m-1),ack(m,k-1)); } } 4.6 写出计算Hermite多项式Hn(x)值的递归函数。Hn(x)定义如下: H0(x)=1 H1(x)=2x Hn(x)=2xHn-1(x)-2(n-1)Hn-2(x) (对x>1)#include if(k<2)return 2*x; else{ if(x<=1)exit(0); else return 2*x*Hermite(x,k-1)-2*(k-1)*Hermite(x,k-2); } } } 4.7 写一个求n个数的最大公约数和最小公倍数的递归函数。int TwoCommonDivisor(int m,int n)/*两个数的最大公约数*/ { int u,v,r;if(m==0 || n==0)return 0;u=m;v=n;while(r=u%v){ u=v; v=r;} return v;} int TwoCommonMultiple(int m,int n)/*两个数的最小公倍数*/ { int u;u=TwoCommonDivisor(m,n);if(!u)return 0;return u*(m/u)*(n/u);} int MaxCommonDivision(int a[],int k)/*最大公约数*/ { if(k<2)return 0;if(k<3)return TwoCommonDivisor(a[k-1],a[k-2]);else{ return TwoCommonDivisor(MaxCommonDivision(a,k-1),a[k-1]);} } int MinCommonMultiple(int a[],int k)/*最小公倍数*/ { if(k<1)return 0;if(k<2)return a[k-1];if(k<3)return TwoCommonMultiple(a[k-1],a[k-2]);else{ return TwoCommonMultiple(MinCommonMultiple(a,k-1),a[k-1]);} } 4.8 写一个将整数转换成字符串的函数。 /* 由于一个2字节整数的取值范围为-32768~32767,所以待转换的数最大不超过5位数*/ int IntegerToString(int k,char s[]);int main(){ int i=109;char s[10];if(IntegerToString(i,s))printf(”%sn“,s);else printf(”Errorn“);return 0;} int IntegerToString(int k,char s[]){ int k1,j,i=0;char str[20];if(k<-32768 || k>32767)return 0;if(k<0)k1=-k;/*如果是负数,仅转换其数字部分*/ else k1=k;do{ str[i++]=k1%10+'0';}while((k1/=10)>0);if(k<0)str[i++]='-';for(i=i-1,j=0;j<=i;j++)s[j]=str[i-j];s[j]=' ';return 1;} 4.9 写出下面程序的运行结果。void fun(int i,int j);int main(){ int i,j,x,y,n,g;i=2;j=3;g=x=5;y=9;n=7;fun(n,6);printf(”g=%d;i=%d;j=%d;n“,g,i,j);printf(”x=%d;y=%d;n“,x,y);fun(n,6);return 0;} void fun(int i,int j){ int x,y,g;g=8;x=7;y=2;printf(”g=%d;i=%d;j=%d;n“,g,i,j);printf(”x=%d;y=%d;n“,x,y);x=8;y=6;} g=8;i=7;j=6;x=7;y=2;g=5;i=2;j=3;x=5;y=9;g=8;i=7;j=6;x=7;y=2;4.10 写出下面程序的执行结果。void incx();void incy();int main(){ incx();incy();incx();incy();incx();incy();return 0;} void incx(){ int x=0;printf(”x=%dt“,++x);} void incy(){ static int y=0;printf(”ny=%dn“,++y);} x=1 y=1 x=1 y=2 x=1 y=3 4.11 写出下面程序的执行结果。int ran();int rand();int main(){ int i,j;for(i=0;i<3;i++){ for(j=0;j<2;j++)printf(”%3d“,ran()); printf(”n“);} for(i=0;i<2;i++){ for(j=0;j<2;j++)printf(”%3d“,rand()); printf(”n“);} return 0;} int ran(){ static int see=1234,n;printf(”(see=%4d)“,see);n=(see%1000)/10;return n;} int rand(){ int see=1234,n;printf(”(see=%5d)“,see);see=(see+25543)%7415;n=(see%1000)/10;return n;} (see=1234)23(see=1234)23(see=1234)23(see=1234)23(see=1234)23(see=1234)23(see= 1234)53(see= 1234)53(see= 1234)53(see= 1234)53 4.12 指出下列程序中各变量的存储属性,并写出程序的执行结果。#include printf(”i=%d;j=%d;n“,i,j); printf(”Next(i)=%dn“,Next(i)); printf(”Last(i)=%dn“,Last(i)); printf(”New(i+j)=%dn",New(i+j));} return 0;} int Reset(){ 第1章 程序设计基础知识 一、单项选择题(第23页)1-4.CBBC 5-8.DACA 二、填空题(第24页) 1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言 7.有穷性 8.直到型循环 9.算法 10.可读性 11.模块化 12.对问题的分析和模块的划分 三、应用题(第24页)2.源程序: main() {int i,j,k;/* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */ printf(“cock hen chickn”);for(i=1;i<=20;i++)for(j=1;j<=33;j++)for(k=1;k<=33;k++) if(i+j+k*3==100&&i*5+j*3+k==100)printf(“ %d %d %dn”,i,j,k*3);} 执行结果: cock hen chick 4 18 78 8 11 81 12 4 84 3.现计算斐波那契数列的前20项。 递推法 源程序: main() {long a,b;int i;a=b=1; for(i=1;i<=10;i++)/*要计算前30项,把10改为15。*/ {printf(“%8ld%8ld”,a,b);a=a+b;b=b+a;}} 递归法 源程序: main(){int i; for(i=0;i<=19;i++)printf(“%8d”,fib(i));} fib(int i) {return(i<=1?1:fib(i-1)+fib(i-2));} 执行结果: 1 2 3 5 8 13 21 34 55 233 377 610 987 1597 2584 4181 6765 4.源程序: #include “math.h”;main() {double x,x0,deltax;x=1.5; do {x0=pow(x+1,1./3);deltax=fabs(x0-x);x=x0; }while(deltax>1e-12);printf(“%.10fn”,x);} 执行结果: 1.3247179572 5.源程序略。(分子、分母均构成斐波那契数列)结果是32.66026079864 6.源程序: main() {int a,b,c,m; printf(“Please input a,b and c:”);scanf(“%d %d %d”,&a,&b,&c);if(a printf(“%d %d %dn”,a,b,c);} 执行结果: Please input a,b and c:123 456 789 789 456 123 7.源程序: main(){int a; scanf(“%d”,&a); printf(a%21==0?“Yes”:“No”);} 执行结果: Yes 第2章 C语言概述 一、单项选择题(第34页)1-4.BDCB 5-8.AABC 二、填空题(第35页) 1.主 2.C编译系统 3.函数 函数 4.输入输出 5.头 6..OBJ 7.库函数 8.文本 三、应用题(第36页) 5.sizeof是关键字,stru、_aoto、file、m_i_n、hello、ABC、SIN90、x1234、until、cos2x、s_3是标识符。 8.源程序: main(){int a,b,c; scanf(“%d %d”,&a,&b);c=a;a=b;b=c; printf(“%d %d”,a,b);} 执行结果:34 34 12 第3章 数据类型与运算规则 一、单项选择题(第75页) 1-5.DBACC 6-10.DBDBC 11-15.ADCCC 16-20.CBCCD 21-25.ADDBC 26-27.AB 二、填空题(第77页) 1.补码 2.±(10^-308~10^308)3.int(整数)4.单目 自右相左 5.函数调用 6.a或b 7.1 8.65,89 三、应用题(第78页)1.10 9 2.执行结果: 0 0 12 1 第4章 顺序结构程序设计 一、单项选择题(第90页)1-5.DCDAD 6-10.BACBB 二、填空题(第91页) 1.一 ;2.5.169000 3.(1)-2002500(2)I=-200,j=2500(3)i=-200 j=2500 4.a=98,b=765.000000,c=4321.000000 5.略 6.0,0,3 7.3 8.scanf(“%lf%lf%lf”,&a,&b,&c);9.13 13.000000,13.000000 10.a=a^c;c=c^a;a=a^c;(这种算法不破坏b的值,也不用定义中间变量。) 三、编程题(第92页) 1.仿照教材第27页例2-1。 2.源程序: main(){int h,m; scanf(“%d:%d”,&h,&m);printf(“%dn”,h*60+m);} 执行结果: 9:23 563 3.源程序: main() {int a[]={-10,0,15,34},i;for(i=0;i<=3;i++) printf(“%d370C=%g370Ft”,a[i],a[i]*1.8+32);} 执行结果: -10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F 4.源程序: main() {double pi=3.14***9,r=5; printf(“r=%lg A=%.10lf S=%.10lfn”,r,2*pi*r,pi*pi*r);} 执行结果: r=5 A=31.4159265359 S=49.3480220054 5.源程序: #include “math.h”;main() {double a,b,c; scanf(“%lf%lf%lf”,&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){double s=(a+b+c)/2; printf(“SS=%.10lfn”,sqrt(s*(s-a)*(s-b)*(s-c)));} else printf(“Data error!”);} 执行结果:5 6 SS=9.9215674165 6.源程序: main() {int a=3,b=4,c=5;float d=1.2,e=2.23,f=-43.56; printf(“a=%3d,b=%-4d,c=**%dnd=%gne=%6.2fnf=%-10.4f**n”,a,b,c,d,e,f);} 7.源程序: main() {int a,b,c,m; scanf(“%d %d %d”,&a,&b,&c);m=a;a=b;b=c;c=m; printf(“%d %d %dn”,a,b,c);} 执行结果:6 7 6 7 5 8.源程序: main(){int a,b,c; scanf(“%d %d %d”,&a,&b,&c); printf(“average of %d,%d and %d is %.2fn”,a,b,c,(a+b+c)/3.);执行结果: 7 9 average of 6,7 and 9 is 7.33 9.不能。修改后的源程序如下: 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);} 第5章 选择结构程序设计 一、单项选择题(第113页)1-4.DCBB 5-8.DABD 二、填空题(第115页)1.非0 0 2.k==0 3.if(abs(x)>4)printf(“%d”,x);else printf(“error!”); 4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf(“%d”,x);5.k=1(原题最后一行漏了个d,如果认为原题正确,则输出k=%。)6.8!Right!11 7.$$$a=0 8.a=2,b= 1三、编程题(第116页)1.有错。正确的程序如下: main(){int a,b,c; scanf(“%d,%d,%d”,&a,&b,&c); printf(“min=%dn”,a>b?b>c?c:b:a>c?c:a);} 2.源程序: main() {unsigned long a;scanf(“%ld”,&a); for(;a;printf(“%d”,a%10),a/=10);} 执行结果: 12345 54321 3.(1)源程序: main(){int x,y; scanf(“%d”,&x);if(x>-5&&x<0)y=x;if(x>=0&&x<5)y=x-1;if(x>=5&&x<10)y=x+1;printf(“%dn”,y);}(2)源程序: main(){int x,y; scanf(“%d”,&x); if(x<10)if(x>-5)if(x>=0)if(x>=5)y=x+1;else y=x-1;else y=x;printf(“%dn”,y);}(3)源程序: main(){int x,y; scanf(“%d”,&x); if(x<10)if(x>=5)y=x+1;else if(x>=0)y=x-1;else if(x>-5)y=x;printf(“%dn”,y);}(4)源程序: main(){int x,y; scanf(“%d”,&x);switch(x/5) {case-1:if(x!=-5)y=x;break;case 0:y=x-1;break;case 1:y=x+1;} printf(“%dn”,y);} 4.本题为了避免考虑每月的天数及闰年等问题,故采用面向对象的程序设计。 现给出Delphi源程序和C++ Builder源程序。 Delphi源程序: procedure TForm1.Button1Click(Sender: TObject);begin edit3.Text:=format('%.0f天',[strtodate(edit2.text)-strtodate(edit1.text)]);end; procedure TForm1.FormCreate(Sender: TObject);begin Edit2.Text:=datetostr(now);button1click(form1)end; C++ Builder源程序: void __fastcall TForm1::Button1Click(TObject *Sender){ Edit3->Text=IntToStr(StrToDate(Edit2->Text)-StrToDate(Edit1->Text))+“天”;} void __fastcall TForm1::FormCreate(TObject *Sender){ Edit2->Text=DateToStr(Now());Button1Click(Form1);} 执行结果:(运行于Windows下)http://img378.photo.163.com/nxgt/41463572/1219713927.jpg 5.源程序: main() {unsigned a,b,c; printf(“请输入三个整数:”); scanf(“%d %d %d”,&a,&b,&c); if(a&&b&&c&&a==b&&a==c)printf(“构成等边三角形n”);else if(a+b>c&&a+c>b&&b+c>a) if(a==b||a==c||b==c)printf(“构成等腰三角形n”);else printf(“构成一般三角形n”);else printf(“不能构成三角形n”);} 执行结果: 请输入三个整数:5 6 5 构成等腰三角形 6.源程序: main(){int x,y; scanf(“%d”,&x);if(x<20)y=1;else switch(x/60) {case 0:y=x/10;break;default:y=6;} printf(“x=%d,y=%dn”,x,y);} 7.源程序: main() {unsigned m;float n;scanf(“%d”,&m);if(m<100)n=0; else if(m>600)n=0.06;else n=(m/100+0.5)/100; printf(“%d %.2f %.2fn”,m,m*(1-n),m*n);} 执行结果: 450 450 429.75 20.25 8.2171天(起始日期和终止日期均算在内) 本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。 9.源程序: #include “math.h”;main() {unsigned long i;scanf(“%ld”,&i); printf(“%ld %dn”,i%10,(int)log10(i)+1);} 执行结果: 99887 7 5 10.源程序: main() {unsigned long i;unsigned j[10],m=0;scanf(“%ld”,&i); for(;i;){j[m++]=(i+2)%10;i/=10;} for(;m;m--)i=i*10+j[m-1];printf(“%ldn”,i);} 执行结果: 6987 8109 (注:要加密的数值不能是0或以0开头。如果要以0开头需用字符串而不能是整数。)第6章 循环结构程序设计 一、单项选择题(第142页)1-4.BCCB 5-8.CBCA 二、填空题(第143页) 1.原题可能有误。如无误,是死循环 2.原题有误。如果把b=1后面的逗号改为分号,则结果是8。3.20 4.11 5.2.400000 6.*#*#*#$ 7.8 5 2 8.①d=1.0 ②++k ③k<=n 9.①x>=0 ②x 三、编程题(第145页)1.源程序: main() {int i=1,sum=i; while(i<101){sum+=i=-i-2;sum+=i=-i+2;} printf(“%dn”,sum);} 执行结果: 51 2.源程序: main() {double p=0,n=0,f;int i;for(i=1;i<=10;i++){scanf(“%lf”,&f); if(f>0)p+=f;else n+=f;} printf(“%lf %lf %lfn”,p,n,p+n);} 3.源程序: main() {unsigned a;scanf(“%ld”,&a); for(;a;printf(“%d,”,a%10),a/=10);printf(“b n”);} 执行结果: 23456 6,5,4,3,2 4.源程序: main() {unsigned long a,b,c,i;scanf(“%ld%ld”,&a,&b);c=a%1000; for(i=1;i 57 009 5.略 6.原题提供的计算e的公式有误(前面漏了一项1)。正确的公式是e= 1 + 1 + 1/2!+ 1/3!+ … + 1/n!+ …(1)源程序: main() {double e=1,f=1;int n; for(n=1;n<=20;n++){f/=n;e+=f;} printf(“e=%.14lfn”,e);} 执行结果: e=2.7***05(2)源程序: main() {double e=1,f=1;int n; for(n=1;f>1e-4;n++){f/=n;e+=f;} printf(“e=%.4fn”,e);} 执行结果: e=2.7183 7.源程序: main() {unsigned long a=0,b=1,c=0;int i,d;scanf(“%d”,&d); for(i=1;i<=(d+2)/3;i++) printf(“%10ld%10ld%10ld”,a,b,(a+=b+c,b+=c+a,c+=a+b));} 本题还可以用递归算法(效率很低),源程序如下: unsigned long fun(int i) {return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3);} main() {int i,d;scanf(“%d”,&d);for(i=1;i<=d;i++) printf(“%10ld”,fun(i));} 执行结果: 68 230 423 778 1431 2632 4841 8.源程序: main(){int i; for(i=1010;i<=9876;i+=2) if(i/100%11&&i%100%11&&i/10%100%11&&i/1000!=i%10&&i/1000!=i/10%10&&i/100%10!=i%10)printf(“ %d”,i);} 执行结果: 1024 1026 1028 1032 1034 1036 …… …… 9874 9876 9.源程序: main(){int i,j,k; printf(“apple watermelon pearn”);for(i=1;i<=100;i++)for(j=1;j<=10;j++) if((k=100-i-j)*2==400-i*4-j*40)printf(“%4d%7d%9dn”,i,j,k);} 执行结果: apple watermelon pear 5 5 90 24 4 72 43 3 54 62 2 36 81 1 18 10.源程序: #include “stdio.h”; #define N 4 /* N为阶数,可以改为其他正整数 */ main(){int m=N*2,i,j; for(i=1;i putchar(N-abs(i-N)<=abs(j++-N)?' ':'*'));} 如果把N值改为5,则执行结果如下: * *** ***** ******* ********* ******* ***** *** * 作者:宁西贯通 2006-5-7 23:41 回复此发言 ------------------说明 注意:上面最后一题的输出结果应该是由星号组成的一个菱形,第7章 数 组 一、单项选择题(第192页)1-4.BBCC 5-8.AABA 二、填空题(第194页) 1.1 2 4 8 16 32 64 128 256 512 2.①a[age]++ ②i=18;i<26 3.①break ②i==8 4.①a[i]>b[j] ②i<3 ③j<5 5.①b[j]=a[j][0] ②b[j] 三、编程题(第196页)1.源程序: main() {int a[4][4],i,j,s=0;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf(“%d”,&a[i][j]);for(i=0;i<4;i++)for(j=0;j<4;j++) if(i==j||i+j==3)s+=a[i][j]; printf(“%dn”,s);} /* 注:5×5矩阵不能照此计算!*/ 执行结果: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 68 2.源程序: main() {int i,a[36];a[0]=2; for(i=1;i<=29;i++)a[i]=a[i-1]+2;for(;i<=35;i++)a[i]=a[(i-30)*5+2];for(i=0;i<=35;i++)printf(“%dt”,a[i]);} 执行结果: 4 6 8 10 12 14 16 18 20 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 6 16 26 36 46 56 3.源程序: #include “stdlib.h” #include “time.h” main() {int a[30],i,m=0;randomize(); for(i=0;i<=29;i++){a[i]=rand();if(m for(i=0;i<=29;i++)if(a[i]==m)a[i]=-1;printf(“n-----------------n”);for(i=0;i<=29;i++) if(~a[i])printf(“%dt”,a[i]);printf(“n”);} 执行结果: 20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 32499 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210----------------- 20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210 4.源程序: main() {int i,n=0,b[16];scanf(“%d”,&i); for(;i;i>>=1)b[n++]=i&1;for(;n;)printf(“%d”,b[--n]);} 执行结果: 9876 10011010010100 本题也可以不用数组。源程序如下: #include “stdio.h” main(){int i,n; scanf(“%d”,&i);for(n=16;n;n--){asm ROL i,1 putchar(i&1|48);} } /* ROL是循环左移的汇编指令 */ 5.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main() {int a[M][N],i,j,t[M];randomize(); /*生成M行N列随机数*/ for(i=0;i printf(“%4d”,a[i][j]=random(50)); /*找出每行的最小数,t[M]是第M行的最小数所在的列数*/ for(i=0;i if(a[i][t[i]]>a[i][j])t[i]=j; /*比较每个最小数在其所在的列上是否也是最小*/ for(j=0;j printf(“-------------------n”); /*输出在行和列上均为最小的数*/ for(i=0;i printf(“a[%d,%d]=%dn”,i,t[i],a[i][t[i]]);} 执行结果: 13 20 0 1 20 41 6 16 35 30 3 5 37 8 23 15 6 36 24 29 18 1 1 5 28 21 46 34-------------------a[0,4]=0 a[1,2]=6 a[3,5]=1 a[4,0]=1 6.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 7 main() {int a[M][N],i,j,t=0;randomize();for(i=0;i for(j=0;j {printf(“%4d”,a[i][j]=random(91)+10);a[i][N-1]+=a[i][j];} printf(“%4dn”,a[i][N-1]);} for(i=1;i if(a[i][N-1]>a[t][N-1])t=i;if(t)for(j=0;j {i=a[0][j];a[0][j]=a[t][j];a[t][j]=i;} printf(“-----------------n”);for(i=0;i 第7章 数 组 for(j=0;j 执行结果: 17 32 95 35 20 288 39 48 22 27 73 22 231 51 87 39 71 84 46 378 84 94 97 77 27 26 405 69 50 56 89 37 46 347----------------- 77 27 26 405 39 48 22 27 73 22 231 51 87 39 71 84 46 378 89 17 32 95 35 20 288 69 50 56 89 37 46 347 7.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main() {int a[M][N],i,j; struct data{int value,x,y;}max,min;max.value=0;min.value=100;randomize(); for(i=0;i {printf(“%4d”,a[i][j]=random(100)+1);if(max.value {max.value=a[i][j];max.x=i;max.y=j;} if(min.value>a[i][j]) {min.value=a[i][j];min.x=i;min.y=j;} } printf(“-----------------n”); i=a[0][N-1];a[0][N-1]=max.value;a[max.x][max.y]=i;i=a[M-1][0];a[M-1][0]=min.value;a[min.x][min.y]=i;for(i=0;i 执行结果: 65 30 40 30 26 50 6 61 27 47 16 54 58 76 19 57 74 44 92 71 48 73 57 60 32 73 67----------------- 65 30 92 30 26 50 73 61 27 47 16 54 58 76 19 57 74 44 40 71 48 6 57 60 32 73 67 9.源程序: main() {char s[255];int i,j,b=1;printf(“Input a string:”);scanf(“%s”,s);i=strlen(s); for(j=1;j<=i/2;j++)b=b&&(s[j-1]==s[i-j]);printf(b?“Yesn”:“Non”);} 执行结果: Input a string:level Yes 10.源程序: main() {char s[255],t,max=0,min=0,l,i;printf(“Input a string(length>4):”);gets(s);l=strlen(s); for(i=0;i {if(s[max] t=s[1];s[1]=s[max];s[max]=t;if(min==1)min=max;t=s[l-2];s[l-2]=s[min];s[min]=t;printf(“%sn”,s);} 执行结果: Input a string(length>4):C++Builder Cu+Beild+r 11.源程序: main() {char m[13][10]={“****”,“January”,“February”,“March”, “April”,“May”,“June”,“July”,“August”,“September”, “October”,“November”,“December”};int i,j,k,a,s,n; printf(“Please input an integer(100..999):”);scanf(“%d”,&n); printf(“%d:%d+%d+%d=%d, %d%%13=%d, %sn”, n,i,j,k,s,s,a,m[a=((s=(i=n/100)+(j=n/10%10)+(k=n%10))%13)]);} 执行结果: Please input an integer(100..999):539 539:5+3+9=17, 17%13=4, April 第8章 函 数 一、单项选择题(第241页) 1-5.BCCAA 6-10.CCDDD 11-15.ACACB 二、填空题(第243页) 1.看不出原题的意图。因为要计算1~n的累加和,n应是一个≥1的正整数。可是题目中却出现了n=0的情况。除非另加规定当n=0时1~n的累加和为0,或者把原题中的计算式改为计算0~n的累加和。据此猜测,原题应填为:①return(0)②return(n+sum(n-1))根据题意,如下程序较为合理: int sum(int n) {if(n<=0)return(-1);/*-1是出错标志 */ else if(n==1)return(1);else return(n+sum(n-1));} 2.①return(1)②return(n*facto(n-1)) 三、编程题(第244页)3.源程序: main() {int i,a,b,c; for(i=100;i<999;i++) if((a=i/100)*a*a+(b=i/10%10)*b*b+(c=i%10)*c*c==i)printf(“%dt”,i);} 执行结果: 153 370 371 407 8.源程序(非递归算法): #define P 13 /* P可以改为其他正整数 */ main() {int a[P],r,c; for(r=0;r<=P;r++){a[r]=1; for(c=r-1;c>=1;a[c--]+=a[c-1]);printf(“%*d”,(P-r)*3+1,a[0]); for(c=1;c<=r;printf(“%6d”,a[c++]));printf(“n”);} } 执行结果: (应该排列成一个三角形,是贴吧造成现在这个样子的,不是程序有问题)1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 126 84 36 9 1 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 9.源程序(递归算法): #include “stdio.h” void printOCT(unsigned long n){unsigned long i; if(i=n>>3)printOCT(i);putchar((n&7)+48);} main() {unsigned long i;scanf(“%ld”,&i);printOCT(i);} 执行结果: 1234567890 11145401322 本题也可以不用递归算法,源程序请参考第7章第三题4。回复:【C语言】《C语言程序设计教程(第二版)》习题答案 但是不同时间印刷的版本课后题不太一样呢,象我们的是1999年12月第2版,2005年12月第69次印刷的。没有选择填空,应用题和楼主不知道有多少相同的,因为看不到原题。这个比较麻烦呢。 作者:210.77.204.* 2006-5-9 18:38 回复此发言 ------------------回复:【C语言】《C语言程序设计教程(第二版)》习题答案 你对照一下主编和出版社,看看对吗?(见说明的第一条。)14 第9章 指 针 一、单项选择题(第276页) 1-5.DCDAC 6-10.CCABC 11-16.AABBB 16-20.DCDBD 二、填空题(第278页)1.①int * ②*z 2.*p++ 3.①' ' ②++ 4.①q=p+1 ②q max ④*q 三、编程题(第280页)7.源程序: main() {int i=0;char c[20]; do{scanf(“%s”,&c);i++;} while(strcmp(c,“stop”));printf(“%dn”,i);} 执行结果: This car ran form Nanyang to Luoyang without a stop 10 9.源程序: main() {char s[255],c[255]={0};int i;gets(s); for(i=0;s[i];c[s[i++]]++);for(i=0;i<255;i++) if(c[i])printf(“%c=%dt”,i,c[i]);} 执行结果: abcedabcdcd a=2 b=2 c=3 d=3 e=1 《C语言程序设计教程(第二版)》习题答案 说 明 1.本习题答案是我自己做的,错误和疏漏在所难免。编程题全部调试通过,但选择题和填空题不敢保证全对。 2.凡未指明解题所用的程序设计语言的,均指C语言。 3.凡未指明执行程序所需的操作系统的,均可在DOS下执行。4.本文中文字下面划线的表示输入。 第1章 程序设计基础知识 一、单项选择题(第23页)1-4.CBBC 5-8.DACA 二、填空题(第24页)1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言 7.有穷性 8.直到型循环 9.算法 10.可读性 11.模块化 12.对问题的分析和模块的划分 三、应用题(第24页)2.源程序: main(){int i,j,k;/* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */ printf(“cock hen chick ”);for(i=1;i<=20;i++)for(j=1;j<=33;j++) for(k=1;k<=33;k++) if(i+j+k*3==100&&i*5+j*3+k==100) printf(“ %d %d %d ”,i,j,k*3);} 执行结果: cock hen chick 3.现计算斐波那契数列的前20项。 递推法 源程序: main(){long a,b;int i;a=b=1;for(i=1;i<=10;i++)/*要计算前30项,把10改为15。*/ {printf(“%8ld%8ld”,a,b);a=a+b;b=b+a;}} 递归法 源程序: main(){int i;for(i=0;i<=19;i++)printf(“%8d”,fib(i));} fib(int i){return(i<=1?1:fib(i-1)+fib(i-2));} 执行结果: 233 377 610 987 1597 2584 4181 6765 4.源程序: #include “math.h”;main(){double x,x0,deltax;x=1.5;do {x0=pow(x+1,1./3);deltax=fabs(x0-x);x=x0;}while(deltax>1e-12);printf(“%.10f ”,x);} 执行结果: 1.3247179572 5.源程序略。(分子、分母均构成斐波那契数列)结果是32.66026079864 6.源程序: main(){int a,b,c,m;printf(“Please input a,b and c:”);scanf(“%d %d %d”,&a,&b,&c);if(a Please input a,b and c:123 456 789 789 456 123 7.源程序: main(){int a;scanf(“%d”,&a);printf(a%21==0?“Yes”:“No”);} 执行结果: 42 Yes 第2章 C语言概述 一、单项选择题(第34页)1-4.BDCB 5-8.AABC 二、填空题(第35页)1.主 2.C编译系统 3.函数 函数 4.输入输出 5.头 6..OBJ 7.库函数 8.文本 三、应用题(第36页)5.sizeof是关键字,stru、_aoto、file、m_i_n、hello、ABC、SIN90、x1234、until、cos2x、s_3是标识符。 8.源程序: main(){int a,b,c;scanf(“%d %d”,&a,&b);c=a;a=b;b=c;printf(“%d %d”,a,b);} 执行结果: 12 34 34 12 第3章 数据类型与运算规则 一、单项选择题(第75页)1-5.DBACC 6-10.DBDBC 11-15.ADCCC 16-20.CBCCD 21-25.ADDBC 26-27.AB 二、填空题(第77页)1.补码 2.±(10-308~10308)3.int(整数)4.单目 自右相左 5.函数调用 6.a或b 7.1 8.65,89 三、应用题(第78页)1.10 9 2.执行结果: 11 0 0 12 1 第4章 顺序结构程序设计 一、单项选择题(第90页)1-5.DCDAD 6-10.BACBB 二、填空题(第91页)1.一 ;2.5.169000 3.(1)-2002500(2)I=-200,j=2500(3)i=-200 j=2500 4.a=98,b=765.000000,c=4321.000000 5.略 6.0,0,3 7.3 8.scanf(“%lf%lf%lf”,&a,&b,&c);9.13 13.000000,13.000000 10.a=a^c;c=c^a;a=a^c;(这种算法不破坏b的值,也不再定义中间变量。) 三、编程题(第92页)1.仿照教材第27页例2-1。2.源程序: main(){int h,m;scanf(“%d:%d”,&h,&m);printf(“%d ”,h*60+m);} 执行结果: 9:23 563 3.源程序: main(){int a[]={-10,0,15,34},i;for(i=0;i<=3;i++)printf(“%d370C=%g370Ft”,a[i],a[i]*1.8+32);} 执行结果: -10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F 4.源程序: main(){double pi=3.14***9,r=5;printf(“r=%lg A=%.10lf S=%.10lf ”,r,2*pi*r,pi*pi*r);} 执行结果: r=5 A=31.4159265359 S=49.3480220054 5.源程序: #include “math.h”;main(){double a,b,c;scanf(“%lf%lf%lf”,&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){double s=(a+b+c)/2;printf(“SS=%.10lf ”,sqrt(s*(s-a)*(s-b)*(s-c)));} else printf(“Data error!”);} 执行结果: 4 5 6 SS=9.9215674165 6.源程序: main(){int a=3,b=4,c=5;float d=1.2,e=2.23,f=-43.56;printf(“a=%3d,b=%-4d,c=**%d d=%g e=%6.2f f=%-10.4f** ”,a,b,c,d,e,f);} 7.源程序: main(){int a,b,c,m;scanf(“%d %d %d”,&a,&b,&c);m=a;a=b;b=c;c=m;printf(“%d %d %d ”,a,b,c);} 执行结果: 5 6 7 6 7 5 8.源程序: main(){int a,b,c;scanf(“%d %d %d”,&a,&b,&c);printf(“average of %d,%d and %d is %.2f ”,a,b,c,(a+b+c)/3.);执行结果: 6 7 9 average of 6,7 and 9 is 7.33 9.不能。修改后的源程序如下: 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=%d ”,a,b,c);printf(“x=%d,y=%d ”,x,y);} 第5章 选择结构程序设计 一、单项选择题(第113页)1-4.DCBB 5-8.DABD 二、填空题(第115页)1.非0 0 2.k==0 3.if(abs(x)>4)printf(“%d”,x);else printf(“error!”);4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf(“%d”,x);5.k=1(原题最后一行漏了个d,如果认为原题正确,则输出k=%。)6.8!Right!11 7.$$$a=0 8.a=2,b=1 三、编程题(第116页)1.有错。正确的程序如下: main(){int a,b,c;scanf(“%d,%d,%d”,&a,&b,&c);printf(“min=%d ”,a>b?b>c?c:b:a>c?c:a);} 2.源程序: main(){unsigned long a;scanf(“%ld”,&a);for(;a;printf(“%d”,a%10),a/=10);} 执行结果: 12345 54321 3.(1)源程序: main(){int x,y;scanf(“%d”,&x);if(x>-5&&x<0)y=x;if(x>=0&&x<5)y=x-1;if(x>=5&&x<10)y=x+1;printf(“%d ”,y);}(2)源程序: main(){int x,y;scanf(“%d”,&x);if(x<10)if(x>-5)if(x>=0)if(x>=5)y=x+1;else y=x-1;else y=x;printf(“%d ”,y);}(3)源程序: main(){int x,y;scanf(“%d”,&x);if(x<10)if(x>=5)y=x+1;else if(x>=0)y=x-1; else if(x>-5)y=x;printf(“%d ”,y);}(4)源程序: main(){int x,y;scanf(“%d”,&x);switch(x/5){case-1:if(x!=-5)y=x;break;case 0:y=x-1;break;case 1:y=x+1;} printf(“%d ”,y);} 4.本题为了避免考虑每月的天数及闰年等问题,故采用面向对象的程序设计。现给出Delphi源程序和C++ Builder源程序。Delphi源程序: procedure TForm1.Button1Click(Sender: TObject);begin edit3.Text:=format('%.0f天',[strtodate(edit2.text)-strtodate(edit1.text)]);end;procedure TForm1.FormCreate(Sender: TObject);begin Edit2.Text:=datetostr(now);button1click(form1)end;C++ Builder源程序: void __fastcall TForm1::Button1Click(TObject *Sender){ Edit3->Text=IntToStr(StrToDate(Edit2->Text)-StrToDate(Edit1->Text))+“天”;} void __fastcall TForm1::FormCreate(TObject *Sender){ Edit2->Text=DateToStr(Now());Button1Click(Form1);} 执行结果:(运行于Windows下) 5.源程序: main(){unsigned a,b,c;printf(“请输入三个整数:”);scanf(“%d %d %d”,&a,&b,&c);if(a&&b&&c&&a==b&&a==c)printf(“构成等边三角形 ”);else if(a+b>c&&a+c>b&&b+c>a)if(a==b||a==c||b==c)printf(“构成等腰三角形 ”); else printf(“构成一般三角形 ”); else printf(“不能构成三角形 ”);} 执行结果: 请输入三个整数:5 6 5 构成等腰三角形 6.源程序: main(){int x,y;scanf(“%d”,&x);if(x<20)y=1;else switch(x/60){case 0:y=x/10;break;default:y=6;} printf(“x=%d,y=%d ”,x,y);} 7.源程序: main(){unsigned m;float n;scanf(“%d”,&m);if(m<100)n=0;else if(m>600)n=0.06; else n=(m/100+0.5)/100;printf(“%d %.2f %.2f ”,m,m*(1-n),m*n);} 执行结果: 450 450 429.75 20.25 8.2171天(起始日期和终止日期均算在内) 本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。9.源程序: #include “math.h”;main(){unsigned long i;scanf(“%ld”,&i);printf(“%ld %d ”,i%10,(int)log10(i)+1);} 执行结果: 99887 7 5 10.源程序: main(){unsigned long i;unsigned j[10],m=0;scanf(“%ld”,&i);for(;i;){j[m++]=(i+2)%10;i/=10;} for(;m;m--)i=i*10+j[m-1];printf(“%ld ”,i);} 执行结果: 6987 8109(注:要加密的数值不能是0或以0开头)第6章 循环结构程序设计 一、单项选择题(第142页)1-4.BCCB 5-8.CBCA 二、填空题(第143页)1.原题可能有误。如无误,是死循环 2.原题有误。如果把b=1后面的逗号改为分号,则结果是8。 3.20 4.11 5.2.400000 6.*#*#*#$ 7.8 5 2 8.①d=1.0 ②++k ③k<=n 9.①x>=0 ②x 三、编程题(第145页)1.源程序: main(){int i=1,sum=i;while(i<101){sum+=i=-i-2;sum+=i=-i+2;} printf(“%d ”,sum);} 执行结果: 51 2.源程序: main(){double p=0,n=0,f;int i;for(i=1;i<=10;i++){scanf(“%lf”,&f); if(f>0)p+=f;else n+=f;} printf(“%lf %lf %lf ”,p,n,p+n);} 3.源程序: main(){unsigned long a;scanf(“%ld”,&a);for(;a;printf(“%d,”,a%10),a/=10);printf(“b ”);} 执行结果: 23456 6,5,4,3,2 4.源程序: main(){unsigned long a,b,c,i;scanf(“%ld%ld”,&a,&b);c=a%1000;for(i=1;i 6.原题提供的计算e的公式有误(前面漏了一项1)。正确的公式是e= 1 + 1 + 1/2!+ 1/3!+ „ + 1/n!+ „(1)源程序: main(){double e=1,f=1;int n;for(n=1;n<=20;n++){f/=n;e+=f;} printf(“e=%.14lf ”,e);} 执行结果: e=2.7***05(2)源程序: main(){double e=1,f=1;int n;for(n=1;f>1e-4;n++){f/=n;e+=f;} printf(“e=%.4f ”,e);} 执行结果: e=2.7183 7.源程序: main(){unsigned long a=0,b=1,c=0;int i,d;scanf(“%d”,&d);for(i=1;i<=(d+2)/3;i++)printf(“%10ld%10ld%10ld”,a,b,(a+=b+c,b+=c+a,c+=a+b));} 本题还可以用递归算法(效率很低),源程序如下: unsigned long fun(int i){return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3);} main(){int i,d;scanf(“%d”,&d);for(i=1;i<=d;i++)printf(“%10ld”,fun(i));} 执行结果: 15 125 230 423 778 1431 2632 4841 8.源程序: main(){int i;for(i=1010;i<=9876;i+=2)if(i/100%11&&i%100%11&&i/10%100%11&&i/1000!=i%10&&i/1000!=i/10%10&&i/100%10!=i%10)printf(“ %d”,i);} 执行结果: 1024 1026 1028 1032 1034 1036 …… …… 9874 9876 9.源程序: main(){int i,j,k;printf(“apple watermelon pear ”);for(i=1;i<=100;i++)for(j=1;j<=10;j++) if((k=100-i-j)*2==400-i*4-j*40) printf(“%4d%7d%9d ”,i,j,k);} 执行结果: apple watermelon pear 10.源程序: #include “stdio.h”;#define N 4 /* N为阶数,可以改为其他正整数main(){int m=N*2,i,j;for(i=1;i putchar(N-abs(i-N)<=abs(j++-N)?' ':'*'));} 如果把N值改为5,则执行结果如下: * *** ***** ******* ********* ******* ***** *** * 第7章 数 组 一、单项选择题(第192页)1-4.BBCC 5-8.AABA 二、填空题(第194页)1.1 2 4 8 16 32 64 128 256 512(每个数占一行)2.①a[age]++ ②i=18;i<26 3.①break ②i==8 4.①a[i]>b[j] ②i<3 ③j<5 5.①b[j]=a[j][0] ②b[j] */ 三、编程题(第196页)1.源程序: main(){int a[4][4],i,j,s=0;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf(“%d”,&a[i][j]);for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==j||i+j==3)s+=a[i][j];printf(“%d ”,s);} /* 注:5×5矩阵不能照此计算!*/ 执行结果: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 68 2.源程序: main(){int i,a[36];a[0]=2;for(i=1;i<=29;i++)a[i]=a[i-1]+2;for(;i<=35;i++)a[i]=a[(i-30)*5+2];for(i=0;i<=35;i++)printf(“%dt”,a[i]);} 执行结果: 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 6 26 36 46 56 3.源程序: #include “stdlib.h” #include “time.h” main(){int a[30],i,m=0;randomize();for(i=0;i<=29;i++){a[i]=rand(); if(m printf(“%dt”,a[i]);} for(i=0;i<=29;i++)if(a[i]==m)a[i]=-1;printf(“-----------------”);for(i=0;i<=29;i++)if(~a[i])printf(“%dt”,a[i]);printf(“ ”);} 执行结果: 20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 32499 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210-----------------20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210 4.源程序: main(){int i,n=0,b[16];scanf(“%d”,&i);for(;i;i>>=1)b[n++]=i&1;for(;n;)printf(“%d”,b[--n]);} 执行结果: 9876 10011010010100 本题也可以不用数组。源程序如下: #include “stdio.h” main(){int i,n;scanf(“%d”,&i);for(n=16;n;n--){asm ROL i,1 putchar(i&1|48);} } /* ROL是循环左移的汇编指令 */ 5.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main(){int a[M][N],i,j,t[M];randomize();/*生成M行N列随机数*/ for(i=0;i printf(“%4d”,a[i][j]=random(50));/*找出每行的最小数,t[M]是第M行的最小数所在的列数*/ for(i=0;i if(a[i][t[i]]>a[i][j])t[i]=j;/*比较每个最小数在其所在的列上是否也是最小*/ for(j=0;j for(i=0;i {if(i==j)continue; if(a[j][t[j]]>a[i][t[j]]) {t[j]=-1;break;} } printf(“-------------------”);/*输出在行和列上均为最小的数*/ for(i=0;i printf(“a[%d,%d]=%d ”,i,t[i],a[i][t[i]]);} 执行结果: 19 13 20 0 41 16 35 30 37 23 15 36 24 29 18 28 21 46 34-------------------a[0,4]=0 a[1,2]=6 a[3,5]=1 a[4,0]=1 6.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 7 main(){int a[M][N],i,j,t=0;randomize();for(i=0;i for(j=0;j {printf(“%4d”,a[i][j]=random(91)+10); a[i][N-1]+=a[i][j];} printf(“%4d ”,a[i][N-1]);} for(i=1;i printf(“%4d”,a[i][j]);} 执行结果: 17 32 95 35 20 288 48 22 27 73 22 231 87 39 71 84 46 378 94 97 77 27 26 405 50 56 89 37 46 347----------------- 94 97 77 27 26 405 48 22 27 73 22 231 87 39 71 84 46 378 17 32 95 35 20 288 50 56 89 37 46 347 7.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main(){int a[M][N],i,j;struct data{int value,x,y;}max,min;max.value=0;min.value=100;randomize();for(i=0;i for(j=0;j {printf(“%4d”,a[i][j]=random(100)+1); if(max.value {max.value=a[i][j];max.x=i;max.y=j;} if(min.value>a[i][j]) {min.value=a[i][j];min.x=i;min.y=j;} } printf(“-----------------”);i=a[0][N-1];a[0][N-1]=max.value;a[max.x][max.y]=i;i=a[M-1][0];a[M-1][0]=min.value;a[min.x][min.y]=i;for(i=0;i printf(“%4d”,a[i][j]);} 执行结果: 53 74 65 30 40 26 50 61 27 16 54 58 76 19 74 44 92 71 48 57 60 32 73 67----------------- 53 74 65 30 92 26 50 73 61 27 16 54 58 76 19 74 44 40 71 48 57 60 32 73 67 9.源程序: main(){char s[255];int i,j,b=1;printf(“Input a string:”);scanf(“%s”,s);i=strlen(s);for(j=1;j<=i/2;j++)b=b&&(s[j-1]==s[i-j]);printf(b?“Yes ”:“No ”);} 执行结果: Input a string:level Yes 10.源程序: main(){char s[255],t,max=0,min=0,l,i;printf(“Input a string(length>4):”);gets(s);l=strlen(s);for(i=0;i Input a string(length>4):C++Builder Cu+Beild+r 11.源程序: main(){char m[13][10]={“****”,“January”,“February”,“March”, “April”,“May”,“June”,“July”,“August”,“September”, “October”,“November”,“December”};int i,j,k,a,s,n;printf(“Please input an integer(100..999):”);scanf(“%d”,&n);printf(“%d:%d+%d+%d=%d, %d%%13=%d, %s ”, n,i,j,k,s,s,a,m[a=((s=(i=n/100)+(j=n/10%10)+(k=n%10))%13)]);} 执行结果: Please input an integer(100..999):539 539:5+3+9=17, 17%13=4, April 第8章 函 数 一、单项选择题(第241页)1-5.BCCAA 6-10.CCDDD 11-15.ACACB 二、填空题(第243页)1.看不出原题的意图。因为要计算1~n的累加和,n应是一个≥1的正整数。可是题目中却出现了n=0的情况。除非另加规定当n=0时1~n的累加和为0,或者把原题中的计算式改为计算0~n的累加和。据此猜测,原题应填为:①return(0)②return(n+sum(n-1))根据题意,如下程序较为合理: int sum(int n){if(n<=0)return(-1);/*-1是出错标志 */ else if(n==1)return(1); else return(n+sum(n-1));} 2.①return(1)②return(n*facto(n-1)) 三、编程题(第244页)3.源程序: main(){int i,a,b,c;for(i=100;i<999;i++)if((a=i/100)*a*a+(b=i/10%10)*b*b+(c=i%10)*c*c==i)printf(“%dt”,i);} 执行结果: 153 370 371 407 8.源程序(非递归算法): #define P 13 /* P可以改为其他正整数 */ main(){int a[P],r,c;for(r=0;r<=P;r++){a[r]=1; for(c=r-1;c>=1;a[c--]+=a[c-1]); printf(“%*d”,(P-r)*3+1,a[0]); for(c=1;c<=r;printf(“%6d”,a[c++])); printf(“ ”);} } 执行结果: 126 126 120 210 252 210 120 165 330 462 462 330 165 220 495 792 924 792 495 220 286 715 1287 1716 1716 1287 715 286 9.源程序(递归算法): #include “stdio.h” void printOCT(unsigned long n){unsigned long i;if(i=n>>3)printOCT(i);putchar((n&7)+48);} main(){unsigned long i;scanf(“%ld”,&i);printOCT(i);} 执行结果: 1234567890 11145401322 本题也可以不用递归算法,源程序请参考第7章第三题4。第9章 指 针 一、单项选择题(第276页)1-5.DCDAC 6-10.CCABC 11-16.AABBB 16-20.DCDBD 二、填空题(第278页)1.①int * ②*z 2.*p++ 3.①' ' ②++ 4.①q=p+1 ②q max ④*q 三、编程题(第280页)7.源程序: main(){int i=0;char c[20];do{scanf(“%s”,&c);i++;} while(strcmp(c,“stop”));printf(“%d ”,i);} 执行结果: This car ran form Nanyang to Luoyang without a stop 10 9.源程序: main(){char s[255],c[255]={0};int i;gets(s);for(i=0;s[i];c[s[i++]]++);for(i=0;i<255;i++)if(c[i])printf(“%c=%dt”,i,c[i]);} 执行结果: abcedabcdcd a=2 b=2 c=3 d=3 第10章 结构、联合与枚举类型 一、单项选择题(第326页)1-4.DDAA e=1 C语言设计 学习笔记 早晨: 06:40 起床 07:20——08:20 上午: 08:30——10:30 10:50——11:30 中午: 12:00——02:00 下午: 02:30——04:30 晚上: 05:30——08:00 08:00——09:00 09:00——11:00 11:30 英语 1小时 新概念英语(单词、语法、听读背)大学英语(单词、语法、听读背) 计算机基础 2小时 计算机科学技术导论 计算机组成原理 微机原理及接口技术 Intel微处理器结构编程与接口 深入理解计算机系统 80x86汇编语言程序设计 8086-8088宏汇编语言程序设计教程 BIOS研发技术剖析 自己动手写操作系统 操作系统原理 Windows操作系统原理 Windows内部原理系列 Windows程序内部运行原理 计算机网络第五版 午休 计算机应用及编程 Windows用户管理指南、AD配置指南、网络专业指南、Windows即学即会教程 Windows下32位汇编语言程序设计、C#编程 锻炼、晚餐 辅导 专业基础 2小时 大学数学、大学物理、电机及拖动、电力电子技术、通信技术 休息 目 录 第一章 C语言概述.................................................................................................................................1.1 C程序结构特点16................................................................................................................1.2 C程序上机步骤17...................................................................................................................第二章 程序的灵魂——算法23............................................................................................................2.1 算法24.....................................................................................................................................2.2 算法的三种基本结构...............................................................................................................2.3 结构化程序设计方法42..........................................................................................................第三章 数据类型 运算符与表达式48..................................................................................................3.1 C语言的基本元素48...............................................................................................................3.2 C的数据类型48.......................................................................................................................3.3 常量与变量48..........................................................................................................................3.4 基本类型...................................................................................................................................3.5 变量63.....................................................................................................................................3.6 不同类型数据间的混合运算...................................................................................................3.7 函数的调用过程(补充).......................................................................................................第四章 最简单的C程序设计——顺序程序设计77...........................................................................4.1 字符数据的输入输出...............................................................................................................第五章 选择结构的程序设计97............................................................................................................第六章 循环结构程序设计.....................................................................................................................6.1 语句标号...................................................................................................................................6.2 break语句和continue语句......................................................................................................第七章 数组132......................................................................................................................................7.1 构造类型...................................................................................................................................7.2 数组133...................................................................................................................................7.3 二维数组...................................................................................................................................7.4 字符串——字符数组...............................................................................................................7.5 字符串处理函数 #include 1.1 C程序结构特点16 1、C程序的基本构件——函数。 2、一个函数由函数首部和函数体两部分构成。 函数首部一般包括函数类型、函数名、函数参数等。 函数体一般包括声明部分和执行部分。其中:在声明部分中定义所用到的变量;执行部分则由若干个语句组成。 3、C程序只有一个main函数,且总是从main函数开始执行。 4、C语言语句必须以“;”结束。 5、用/* */作为注释。 6、C编译器一般自顶向下顺序编译C源程序,如果被调函数定义在主调函数之后位置时,要在主调函数前,给出被调函数的原型说明。以便编译器在编译被调函数的调用语句时,对调用语句进行参数检查。 如果不进行原型说明,则无法通过编译检查。 原型说明:类型说明 函数名(参数类型,参数类型,„„) 7、头文件——头文件包含了C语言的标准函数库的原型说明。 C语言通过使用#include <>预处理命令,将库函数的原型说明插入到源文件中。 1.2 C程序上机步骤17 1、编辑源文件.c; 2、编译成目标文件.obj; 3、连接——将目标程序和库函数及其他目标程序连接起来,生产可执行文件,文件扩展名为.exe; 4、执行。 结构体、共用体、枚举型。 3、指针类型:用于存储地址的一类数据类型。 4、空类型: 编译器根据变量的数据类型,给变量分配存储单元。 3.3 常量与变量48 1、符号常量——符号常量在其作用域内不能改变,也不能被赋值。#define 符号常量(大写)常量 2、变量——变量由变量名和变量值标识。数据类型 变量; 变量名实际上是一个符号地址,编译连接程序时给每个变量名分配一个内存地址,当程序访问变量值时,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。 3.4 基本类型 1、整形数据在内存中的存放,是以补码形式存放的。 2、实型数据:单精度 双精度。 在内存中以指数形势存放。 若数据超过有效位,则超过C语言规定有效位的数据将被舍去,故产生误差。 3、字符型数据:用一个字节存储单元存储。即将字符的ASCII码存储到内存单元中。 用单引号括起来的一个字符。 转义字符——特殊字符常量或者控制字符常量,它们都以“”开头。 Char、unsigned char区别:char用7位数表示,最大表示编码为127的字符;unsigned char用8位数表示,最大表示编码为255的字符。 字符数据与整型数据可以相互赋值。 字符数据可以以字符数据输出,也可以以整型数据形式输出。 4、字符串常量:C语言中,必须是用字符数组来保存字符串常量。在内存中顺序存储。 用一对双引号括起来的字符序列。 (2)一般把建立存储空间的声明称为变量定义,把不需要建立存储空间的声明成为变量声明。 3.6 不同类型数据间的混合运算 不同类型数据进行混合运算时,不同类型的数据要先转换成同一类型,按照类型级别由低到高(char,short—int——unsigned—long—double;float—double)的顺序进行转换。 强制类型转换——(类型名)表达式。强制类型转换也就是将存储数据的内存单元强制转换为另一种数据类型的单元大小。即强制将存放数据的内存单元改变。 赋值时进行类型转换:将数据复制给变量时,将会将数据强制转换为要赋值变量的类型。一般短类型转换为长类型时,进行符号扩展;长类型转换为短类型时,仅赋值低位,难以保证数据的正确性。 3.7 函数的调用过程(补充) C函数其实就是一个程序模块。 C函数在编译时,单独编译成一个指令模块,在函数模块开始处定义保护现场指令,将用到的CPU寄存器压入堆栈。在返回时定义了恢复现场指令,将堆栈数据恢复到CPU寄存器。 在调用函数时,一般利用堆栈传递输入参数;利用EAX传递输出参数,注意在函数调用完成后,要维持堆栈平衡,且函数返回输出参数在EAX中,在使用输出参数前,不要改变EAX的值。 第四章 最简单的C程序设计——顺序程序设计77 4.1 字符数据的输入输出 1、C语言没有输入输出语句,IO操作通过调用系统函数实现。 2、在程序的开头,要有:#include “stdio.h”或 #include stdio.h 输入输出语句 2、数组——数组必须先定义后引用。静态数组变量定义时编译器自动初始化数据元素为0,动态数组变量在程序执行时分配存储空间,在未被赋值初始化之前其值随机。 3、C语言只能逐个引用数组元素,不能一次引用整个数组。 4、数组引用是“数组名+下标”引用,数组下标均为整数。如a[2]。 7.3 二维数组 1、数组元素为数组。 2、在内存中,C语言的二维数组中数组元素的存放顺序是按行存放的。 3、二维数组引用是“数组名+下标+下标”。如a[1][2]。 7.4 字符串——字符数组 1、一般用 来标识字符串结尾。 占用一个字符变量空间。 2、用字符串赋值字符数组时,C编译器在字符串后自动加 赋给字符数字。 3、字符数组可以一次引用整个字符串数组。如整个字符串(数组)的输入输出,用%s格式,且在输入字符数组时,用数组名代表数组的首地址,对于二维数组,仅仅写行下标不写列下标,也可以代表给行数组的首地址。 在用%s输入输出字符串数组时,遇到 结束。 7.5 字符串处理函数 #include 1、gets(字符数组名) 从键盘输入一个字符串(以回车结束),并返回字符数组的起始地址。如get(str)。 2、puts(字符数组名/字符串) 将数组中的字符串( 结尾的字符序列)输出到终端上,输完换行。如puts(str),puts(“ok”)。 3、strcpy(目的字符数组1名,源字符串/字符数组2名)拷贝时,将“ ”一起拷贝过去。 4、strcat(字符数组1名,字符串/字符数组2名)将字符串/字符数组2连接到字符数组1中。 在某个复合语句中定义的变量。 2、全局变量——在函数之外定义的变量。有效范围是从定义变量的位置开始到源文件结束。 8.4 变量的存储类别 变量的存储类别,即生存期。内存中供用户使用的存储空间包括:程序区、静态存储区、动态存储区。 1、静态存储区——在编译时分配空间,在程序运行完后才释放存储空间。存储静态局部变量和全局变量。 局部静态变量在编译时赋初值,在执行时可改变该值,但该存储空间一直保存到程序结束。 定义局部静态变量,如果没有赋初值,编译时会自动赋默认初值。 局部静态变量只能在定义它的函数中使用。 全局变量都是静态的。 利用extern 外部变量方式表示变量的定义在别的文件中,提示编译器遇到此变量时,在其他模块中寻找其定义。而函数则是利用函数原型来声明。 用static 关键字说明一个不能在其他源文件中引用的全局变量。即静态全局变量在声明它的整个文件都是可见的,但是在文件之外是不可见的。 2、动态存储区——仅在在执行时分配空间,用完后释放存储空间。存放自动变量和形式参数。 寄存器变量——用register关键字说明。寄存器变量对寄存器的占用是动态的。 第九章 预处理命令197 9.1 预编译命令作用 预编译命令主要完成宏定义、文件包含、条件编译三种功能。 1、宏定义——指用一个指定的标识符(名字)来代表一个字符串。在预编译时,将宏名替代成字符串的过程称为宏展开。如: # define PI 3.1415926 定义宏, # undef PI 终止宏定义的作用域。 #define V(a,b,c)a*b*c 定义带参数的宏。当宏展开时,将引用宏名语句中的实参字符串代替宏定义的形参字符串。int v =V(2,3,4)则宏展开后为:int v= 2*3*4; 2、文件包含——指一个源文件可以将另一个源文件的全部内容包含进来。如: #include “文件名”或 #include <文件名> 编译预处理时,将包含文件的全部内容复制到源文件中。在编译时作为一个源程序来编译。 3、条件编译——在预编译处理时,确定编译时要编译的部分。如: 0 而数组名的值不可以改变。 6、函数的指针专门用来存放函数的入口地址,当把函数的地址赋值给它时,它就指向该函数的入口地址。 声明格式:数据类型(*指针变量名)()如:int(*P)(); 赋值格式:p=max; 注max为定义的函数名;函数名代表该函数的入口地址。引用格式:c=(*p)(a,b);等价——c=max(a,b); 7、只能将变量已分配的地址赋值给指针变量,不能直接将整数赋值给指针变量。 8、指针变量可以有null值,防止指针误作用。 第十一章 结构体270 11.1 结构体270 1、作用——将不同类型的数据组合成一个有机的整体。 2、结构体的定义——结构体是一种数据结构,按照某种规则定义,将若干个不同数据类型(也可相同)的数据项的组合成的一个有机整体。 3、声明结构体类型的形式:struct 结构体类型名字 {成员列表}; 成员列表形式:类型符 成员名 如:int num; 11.2 声明结构体类型变量的方法271 1、先定义结构体类型:struct 结构体类型名字 {成员列表};再定义结构体变量:struct结构体类型名字 结构体变量名。 2、可在定义结构体类型时,定义结构体类型变量。struct 结构体类型名字 {成员列表}结构体类型变量1,结构体类型变量2,„„; 11.3 结构体变量引用273 1、不能将一个结构体变量作为一个整体进行输入输出,只能对结构体变量成员分别赋值。 2、结构体变量成员引用方式:结构体变量名.成员名 3、如果结构体变量成员是另一个结构体变量,则要用若干个成员运算符,一级一级找到最低一级的成员。 11.8 共用体 297 1、共用体指将几种不同类型的变量存储在同一段内存单元中。 2、共用体变量的存储单元大小等于最长成员变量所占内存的长度 3、共用体变量中起作用的是最后一次存放成员。 4、共用体类型声明方式:union 公用体类型名称 {成员变量列表}; 5、共用体变量声明方式:(1)union 公用体类型名称 {成员列表}共用体变量;(2)先声明共用体类型,然后声明共用体变量,union 公用体类型名称 共用体变量。 11.9 枚举类型301 1、枚举类型——指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内的一个。 2、声明枚举类型:enum 枚举类型名称 {枚举常量列表}; 3、声明枚举变量:enum 枚举类型名称 枚举类型变量; 普通文件——指磁盘文件。 2、从操作系统的角度看:每一个与主机相关联的输入输出设备都可看作一个文件。 (1)根据文件的组织形式分为:顺序存取文件 和 随机存取文件。(2)根据文件的存储形式分为:ASCII文件 和 二进制文件。 13.3 C语言对文件的处理方法319 C语言中对文件的存取是以字符(字节)为单位的,一个输入输出流就是一个字节流或二进制流。 文件的存储方式分为缓冲文件系统和非缓冲文件系统。区别是缓冲文件系统是系统自动开辟缓冲区,非缓冲文件系统是由程序为每个文件设定缓冲区。 ANSI C标准只采用 缓冲文件系统 来处理文件。 13.4 文件结构体类型321 缓冲文件系统中,每个被使用的文件都在内存中开辟一个FILE结构体类型的区,用来存放文件的有关信息(文件名字、文件状态、当前位置、缓冲区等有关信息),FILE结构体类型原型: typedef struct{ short level; /*缓冲区“满”或“空”的程度*/ unsigned flags;/*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold;/*如无缓冲区不读取字符*/ short bsize; /*缓冲区的大小*/ unsigned char *buffer;/ *数据缓冲区的位置*/ unsigned char *curp;/*指针,当前的指向*/ unsigned istemp;/*临时文件,指示器*/ short token;/*用于有效性检查*/}FILE; 13.5 文件结构体数组和指针321 FILE *fp——声明了一个指向FILE类型结构体的指针变量。 buffer:是一个指针。对fread 来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。 size: 要读写的字节数。 count: 要进行读写多少个size字节的数据项。fp: 文件型指针。 6、格式化读写函数: fprintf(文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列); 注意: 用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。 7、以“字”或者整数为单位读写函数: putw(int i,FILE * fp); int i = getw(FILE * fp); 8、以“字符串”为单位读写文件的函数: fgets(str,n,fp);从fp指向的文件读出n-1个字符,在最后加一个’ ’。返回值:str的首地址。如果遇到EOF则读入结束。 fputs(“china”,fp);把字符串写入到fp指向的文件。第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的′\0′不输出。 13.7 文件的定位333 1、将文件当前的位置指针重新返回到文件的开头位置:无返回值。 rewind(fp);执行后,将文件的位置指针重新定位到文件的开头。 2、随机读写:改变文件的位置指针,一般用于二进制文件。 fseek(文件类型指针,位移量,起始点);无返回值。起始点:文件开头 SEEK_SET 0 文件当前位置 SEEK_CUR 文件末尾 SEEK_END putw()把一个字输出到指定文件 fread()从指定文件中读取数据项 fwrite()把数据项写到指定文件中 fscanf()从指定文件按格式输入数据 fprintf()按指定格式将数据写到指定文件中 第十四章 C++对C的扩充 338 14.1 C++的特点338 1、C++保留了C语言原有的所有优点,增加了面向对象的机制。 2、C++源文件以.cpp为后缀。 3、除了可以用 /*……*/ 形式的注释行外,还允许使用以// 开头的单行注释。 4、除了可以用printf函数输出信息外,还可以用cout进行输出。cout的作用是将<<运算符右侧的内容送到输出设备中输出。使用cout需要用到头文件iostream.h,在程序的第一行用#include命令将该头文件“包含”进来。 cout <<“ This is a c++ program.n” ; 14.2 C++的输入输出 339 C++为了方便使用,除了可以利用printf和scanf函数进行输出和输入外,还增加了标准输入输出流cout和cin。cout是由c和out两个单词组成的,代表C++的输出流,cin是由c和in两个单词组成的,代表C++的输入流。它们是在头文件iostream.h中定义的。在键盘和显示器上的输入输出称为标准输入输出,标准流是不需要打开和关闭文件即可直接操作的流式文件。 14.3 C++的输出cout 1、cout必须和输出运算符<<一起使用。<< 在这里不作为位运算的左移运算符,而是起插入的作用,例如:cout<<“Hello!n”;的作用是将字符串“Hello!n” 插入到输出流cout中,也就是输出在标准输出设备上。 2、也可以不用n控制换行,在头文件iostream.h中定义了控制符endl代表回车换行操作,作用与n相同。endl的含义是end of line,表示结束一行。 0 存。在C++中,这种输入操作称为“提取”(extracting)或“得到”(getting)。>> 常称为“提取运算符”。 2、cin要与 >> 配合使用。例如: 3、C++为流输入输出提供了格式控制,如:dec(用十进制形式),hex(用十六进制形式),oct(用八进制形式),还可以控制实数的输出精度等。 14.5 函数的重载342 1、C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不同,而且函数类型也可不同,这就是函数的重载,即一个函数名多用。 2、系统会根据参数的类型和个数找到与之匹配的函数,并调用不同的函数。 14.6 带缺省参数的函数344 C++允许实参个数与形参个数不同。办法是在形参表列中对一个或几个形参指定缺省值(或称默认值)。 例如某一函数的首部可用如下形式: void fun(int a,int b,int c=100)在调用此函数时如写成fun(2,4,6),则形参a,b,c的值分别为2,4,6(这是与过去一样的)。如果写成fun(2,4),即少写了最后一个参数,由于在函数定义时已指定了c的缺省值为100,因此a,b,c的值分别为2,4,100。请注意:赋予缺省值的参数必须放在形参表列中的最右端。例如: void f1(float a,int b,int c=0,char d=′a′)(正确)void f2(float a,int c=0,char d=′a′,int b) (不正确)注意:不要同时使用重载函数和缺省参数的函数,因为当调用函数时少写一个参数,系统无法判定是利用重载函数还是利用缺省参数的函数,会发生错误。 14.7 变量的引用类型345 1、“引用”(reference)是C++的一种新的变量类型,是对C的一个重要扩充。它的作用是为一个变量起一个别名。 2、假如有一个变量a,想给它起一个别名b,可以这样写: int a; 实参把变量名传给形参。i的名字传给引用变量a,这样a就成了i的别名。同理,b成为j的别名。a和i代表同一个变量,b和j代表同一个变量。在swap函数中使a和b的值对换,显然,i和j的值同时改变了。 当读者看到&a这样的形式时,怎样区别是声明引用变量还是取地址的操作呢?请记住,当&a的前面有类型符时(如int &a),它必然是对引用的声明;如果前面无类型符(如&a),则是取变量的地址。 14.8 内置函数 348 调用函数时需要一定的时间,如果有的函数需要频繁使用,则所用时间会很长,从而降低程序的执行效率。C++提供一种提高效率的方法,即在编译时将所调用函数的代码嵌入到主调函数中。这种嵌入到主调函数中的函数称为内置函数(inline function),又称内嵌函数。 例如: #include { if(b>a)a=b;if(c>a)a=c;return a;} void main(){int i=7,j=10,k=25,m;m=max(i,j,k);cout<<“max=”< 14.9 作用域运算符349 1、作用域运算符∷,∷aa表示全局作用域中的变量。 2、不能用∷ 访问函数中的局部变量。 425- 第一章 程序设计和C语言 【第15页】 1-5 #include printf(“ Very Good!nn”); printf(“**************************n”); return 0;} 1-6 #include max=b;if(max max=c;printf(“The largest number is %dn”,max);return 0;} 第2章算法——程序的灵魂 【第36页】暂无答案 第3章最简单的C程序设计——顺序程序设计 【第82页】 3-1 #include printf(“p=%fn”,p);return 0;} 3-2-1 #include // 一次存5年期 p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期 p3=p*(1+3*r3)*(1+2*r2); // 先存3年期,到期后将本息再存2年期 p4=p*pow(1+r1,5); // 存1年期,到期后将本息存再存1年期,连续存5次 p5=p*pow(1+r0/4,4*5); // 存活期存款。活期利息每一季度结算一次 printf(“p1=%fn”,p1); // 输出按第1方案得到的本息和 printf(“p2=%fn”,p2); // 输出按第2方案得到的本息和 printf(“p3=%fn”,p3); // 输出按第3方案得到的本息和 printf(“p4=%fn”,p4); // 输出按第4方案得到的本息和 printf(“p5=%fn”,p5); // 输出按第5方案得到的本息和 return 0;} 3-2-2 #include // 一次存5年期 p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期 p3=p*(1+3*r3)*(1+2*r2); // 先存3年期,到期后将本息再存2年期 p4=p*pow(1+r1,5); // 存1年期,到期后将本息存再存1年期,连续存5次 p5=p*pow(1+r0/4,4*5); // 存活期存款。活期利息每一季度结算一次 printf(“p1=%fn”,p1); // 输出按第1方案得到的本息和 printf(“p2=%fn”,p2); // 输出按第2方案得到的本息和 printf(“p3=%fn”,p3); // 输出按第3方案得到的本息和 printf(“p4=%fn”,p4); // 输出按第4方案得到的本息和 printf(“p5=%fn”,p5); // 输出按第5方案得到的本息和 return 0;} 3-2-3 #include // 一次存5年期 p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期 p3=p*(1+3*r3)*(1+2*r2); // 先存3年期,到期后将本息再存2年期 p4=p*pow(1+r1,5); // 存1年期,到期后将本息存再存1年期,连续存5次 p5=p*pow(1+r0/4,4*5); // 存活期存款。活期利息每一季度结算一次 printf(“p1=%10.2fn”,p1); // 输出按第1方案得到的本息和 printf(“p2=%10.2fn”,p2); // 输出按第2方案得到的本息和 printf(“p3=%10.2fn”,p3); // 输出按第3方案得到的本息和 printf(“p4=%10.2fn”,p4); // 输出按第4方案得到的本息和 printf(“p5=%10.2fn”,p5); // 输出按第5方案得到的本息和 return 0;} 3-3.#include //要求输入圆半径r和圆柱高h l=2*pi*r; //计算圆周长l s=r*r*pi; //计算圆面积s sq=4*pi*r*r; //计算圆球表面积sq vq=3.0/4.0*pi*r*r*r; //计算圆球体积vq vz=pi*r*r*h; //计算圆柱体积vz printf(“圆周长为: l=%6.2fn”,l);printf(“圆面积为: s=%6.2fn”,s); printf(“圆球表面积为: sq=%6.2fn”,sq);printf(“圆球体积为: v=%6.2fn”,vq);printf(“圆柱体积为: vz=%6.2fn”,vz);return 0;} 3-8-1 #include int c1,c2; //整型定义 printf(“请输入两个整数c1,c2:”); scanf(“%d,%d”,&c1,&c2); printf(“按字符输出结果:n”); printf(“%c,%cn”,c1,c2); printf(“按ASCII码输出结果为:n”); printf(“%d,%dn”,c1,c2); return 0;} 3-8-2 #include char c1,c2; //定义字符型变量 int i1,i2; printf(“请输入两个字符c1,c2:”); scanf(“%c,%c”,&c1,&c2); i1=c1; i2=c2; printf(“按字符输出结果:n”); printf(“%c,%cn”,i1,i2); printf(“按整数输出结果:n”); printf(“%d,%dn”,c1,c2); return 0;} 3-8-3 #include char c1,c2; int i1,i2; printf(“请输入两个整数i1,i2:”); scanf(“%d,%d”,&i1,&i2); c1=i1; c2=i2; printf(“按字符输出结果:n”); printf(“%c,%cn”,c1,c2); printf(“按整数输出结果:n”); printf(“%d,%dn”,c1,c2); return 0;} 3-8 #include //定义整型变量 //赋值给整型变量 //定义为字符型 //定义为整型 //将整数赋值给字符变量 printf(“用putchar语句输出结果为:”);putchar(c1);putchar(c2);printf(“n”);printf(“用printf语句输出结果为:”);printf(“%c %cn”,c1,c2);return 0;} 第4章选择结构程序设计【第111页】 4-4-1 #include int a,b,c; printf(“请输入三个整数:”); scanf(“%d,%d,%d”,&a,&b,&c); if(a if(b printf(“max=%dn”,c); else printf(“max=%dn”,b); else if(a printf(“max=%dn”,c); else printf(“max=%dn”,a); return 0;} 4-4-2 #include printf(“请输入三个整数:”); scanf(“%d,%d,%d”,&a,&b,&c); temp=(a>b)?a:b; /*将a和b中的大者存入temp中*/ max=(temp>c)?temp:c; /*将a和b中的大者与c比较,取最大者*/ printf(“三个整数的最大数是%dn”,max); return 0;} 4-5-2 #include int i,k; printf(“请输入一个小于%d的整数i:”,M); scanf(“%d”,&i); while(i>M) {printf(“输入的数不符合要求,请重新输入一个小于%d的整数i:”,M); scanf(“%d”,&i); } k=sqrt(i); printf(“%d的平方根的整数部分是:%dn”,i,k); return 0;} 4-5 #include int i,k; printf(“请输入一个小于%d的整数i:”,M); scanf(“%d”,&i); if(i>M) {printf(“输入的数不符合要求,请重新输入一个小于%d的整数i:”,M); scanf(“%d”,&i); } k=sqrt(i); printf(“%d的平方根的整数部分是:%dn”,i,k); return 0;} 4-6.#include printf(“输入x:”); scanf(“%d”,&x); if(x<1) /* x<1 */ { y=x; printf(“x=%3d,y=x=%dn” ,x,y); } else if(x<10) /* 1= printf(“x=%d, y=2*x-1=%dn”,x,y);} else /* x>=10 */ { y=3*x-11; printf(“x=%d, y=3*x-11=%dn”,x,y);} return 0;} 4-7-1 #include int x,y; printf(“enter x:”); scanf(“%d”,&x); y=-1; if(x!=0) if(x>0) y=1; else y=0; printf(“x=%d,y=%dn”,x,y);return 0;} 4-7-2 #include int x,y; printf(“please enter x:”); scanf(“%d”,&x); y=0; if(x>=0) if(x>0)y=1; else y=-1; printf(“x=%d,y=%dn”,x,y);return 0;} 4-8 #include { float score; char grade; printf(“请输入学生成绩:”); scanf(“%f”,&score); while(score>100||score<0){printf(“n 输入有误,请重输”);scanf(“%f”,&score);} switch((int)(score/10)) {case 10: case 9: grade='A';break;case 8: grade='B';break;case 7: grade='C';break;case 6: grade='D';break;case 5: case 4: case 3: case 2: case 1: case 0: grade='E';} printf(“成绩是 %5.1f,相应的等级是%cn ”,score,grade);return 0;} 4-9 #include int num,indiv,ten,hundred,thousand,ten_thousand,place; //分别代表个位,十位,百位,千位,万位和位数 printf(“请输入一个整数(0-99999):”); scanf(“%d”,&num); if(num>9999) place=5; else if(num>999) place=4; else if(num>99) place=3; else if(num>9) place=2; else place=1; printf(“位数:%dn”,place); printf(“每位数字为:”); ten_thousand=num/10000; thousand=(int)(num-ten_thousand*10000)/1000; hundred=(int)(num-ten_thousand*10000-thousand*1000)/100; ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10; indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10); switch(place) {case 5:printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,indiv); printf(“n反序数字为:”); printf(“%d%d%d%d%dn”,indiv,ten,hundred,thousand,ten_thousand); break; case 4:printf(“%d,%d,%d,%d”,thousand,hundred,ten,indiv); printf(“n反序数字为:”); printf(“%d%d%d%dn”,indiv,ten,hundred,thousand); break; case 3:printf(“%d,%d,%d”,hundred,ten,indiv); printf(“n反序数字为:”); printf(“%d%d%dn”,indiv,ten,hundred); break; case 2:printf(“%d,%d”,ten,indiv); printf(“n反序数字为:”); printf(“%d%dn”,indiv,ten); break; case 1:printf(“%d”,indiv); printf(“n反序数字为:”); printf(“%dn”,indiv); break; } return 0;} 4-10-1 #include int i; double bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+100000*0.05; bon6=bon4+100000*0.03; bon10=bon6+400000*0.015; printf(“请输入利润i:”); scanf(“%d”,&i); if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bon1+(i-100000)*0.075; else if(i<=400000) bonus=bon2+(i-200000)*0.05; else if(i<=600000) bonus=bon4+(i-400000)*0.03; else if(i<=1000000) bonus=bon6+(i-600000)*0.015; else bonus=bon10+(i-1000000)*0.01; printf(“奖金是: %10.2fn”,bonus); return 0;} 4-10-2 #include int i; double bonus,bon1,bon2,bon4,bon6,bon10; int branch; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(“请输入利润i:”); scanf(“%d”,&i); branch=i/100000; if(branch>10)branch=10; switch(branch) { case 0:bonus=i*0.1;break; case 1:bonus=bon1+(i-100000)*0.075;break; case 2: case 3: bonus=bon2+(i-200000)*0.05;break; case 4: case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8: case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; } printf(“奖金是 %10.2fn”,bonus); return 0;} 4-11 #include printf(“请输入四个数:”); scanf(“%d,%d,%d,%d”,&a,&b,&c,&d); printf(“a=%d,b=%d,c=%d,d=%dn”,a,b,c,d); if(a>b) { t=a;a=b;b=t;} if(a>c) { t=a;a=c;c=t;} if(a>d) { t=a;a=d;d=t;} if(b>c) { t=b;b=c;c=t;} if(b>d) { t=b;b=d;d=t;} if(c>d) { t=c;c=d;d=t;} printf(“排序结果如下: n”); printf(“%d %d %d %d n” ,a,b,c,d); return 0;} 4-12 #include int h=10; float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4; printf(“请输入一个点(x,y):”); scanf(“%f,%f”,&x,&y); d1=(x-x4)*(x-x4)+(y-y4)*(y-y4); /*求该点到各中心点距离*/ d2=(x-x1)*(x-x1)+(y-y1)*(y-y1); d3=(x-x2)*(x-x2)+(y-y2)*(y-y2); d4=(x-x3)*(x-x3)+(y-y3)*(y-y3); if(d1>1 && d2>1 && d3>1 && d4>1) h=0;/*判断该点是否在塔外*/ printf(“该点高度为 %dn”,h); return 0;} 第5章循环结构程序设计【第140页】 5-2 #include // 程序中用到数学函数fabs,应包含头文件math.n int main(){ int sign=1,count=0; // sign用来表示数值的符号,count用来统计循环次数 double pi=0.0,n=1.0,term=1.0; // pi开始代表多项式的值,最后代表π的值, n代表分母,term代表当前项的值 while(fabs(term)>=1e-8) // 检查当前项term的绝对值是否大于或等于10的(-6)次方 { pi=pi+term; // 把当前项term累加到pi中 n=n+2; // n+2是下一项的分母 sign=-sign; // sign代表符号,下一项的符号与上一项符号相反 term=sign/n; // 求出下一项的值term count++; // count累加1 } pi=pi*4; // 多项式的和pi乘以4,才是π的近似值 printf(“pi=%10.8fn”,pi); // 输出π的近似值 printf(“count=%dn”,count); // 输出循环次数 return 0;} 5-3 #include int p,r,n,m,temp; printf(“请输入两个正整数n,m:”); scanf(“%d,%d,”,&n,&m); if(n { temp=n; n=m; m=temp; } p=n*m; while(m!=0) { r=n%m; n=m; m=r; } printf(“它们的最大公约数为:%dn”,n); printf(“它们的最小公约数为:%dn”,p/n); return 0;} 5-4 #include char c; int letters=0,space=0,digit=0,other=0; printf(“请输入一行字符:n”); while((c=getchar())!='n') { if(c>='a' && c<='z' || c>='A' && c<='Z') letters++; else if(c==' ') space++; else if(c>='0' && c<='9') digit++; else other++; } printf(“字母数:%dn空格数:%dn数字数:%dn其它字符数:%dn”,letters,space,digit,other); return 0; } 5-5 #include int a,n,i=1,sn=0,tn=0; printf(“a,n=:”); scanf(“%d,%d”,&a,&n); while(i<=n) { tn=tn+a;/*赋值后的tn为i个 a组成数的值*/ sn=sn+tn;/*赋值后的sn为多项式前i项之和*/ a=a*10; ++i; } printf(“a+aa+aaa+...=%dn”,sn); return 0; } 5-6 #include {double s=0,t=1; int n; for(n=1;n<=20;n++) { t=t*n; s=s+t; } printf(“1!+2!+...+20!=%22.15en”,s); return 0;} 5-7 #include int n1=100,n2=50,n3=10; double k,s1=0,s2=0,s3=0; for(k=1;k<=n1;k++)/*计算1到100的和*/ {s1=s1+k;} for(k=1;k<=n2;k++)/*计算1到50各数的平方和*/ {s2=s2+k*k;} for(k=1;k<=n3;k++)/*计算1到10的各倒数和*/ {s3=s3+1/k;} printf(“sum=%15.6fn”,s1+s2+s3); return 0;} 5-8 #include int i,j,k,n; printf(“parcissus numbers are ”); for(n=100;n<1000;n++) { i=n/100; j=n/10-i*10; k=n%10; if(n==i*i*i + j*j*j + k*k*k) printf(“%d ”,n); } printf(“n”); return 0; } 5-9-1 #define M 1000 /*定义寻找范围*/ #include int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10; int i,a,n,s; for(a=2;a<=M;a++) /* a是2-1000之间的整数,检查它是否完数 */ {n=0; /* n用来累计a的因子的个数 */ s=a; /* s用来存放尚未求出的因子之和,开始时等于a */ for(i=1;i /* 检查i是否a的因子 */ if(a%i==0) /* 如果i是a的因子 */ {n++; /* n加1,表示新找到一个因子 */ s=s-i; /* s减去已找到的因子,s的新值是尚未求出的因子之和 */ switch(n) /* 将找到的因子赋给k1...k9,或k10 */ {case 1: k1=i;break; /* 找出的笫1个因子赋给k1 */ case 2: k2=i;break; /* 找出的笫2个因子赋给k2 */ case 3: k3=i;break; /* 找出的笫3个因子赋给k3 */ case 4: k4=i;break; /* 找出的笫4个因子赋给k4 */ case 5: k5=i;break; /* 找出的笫5个因子赋给k5 */ case 6: k6=i;break; /* 找出的笫6个因子赋给k6 */ case 7: k7=i;break; /* 找出的笫7个因子赋给k7 */ case 8: k8=i;break; /* 找出的笫8个因子赋给k8 */ case 9: k9=i;break; /*找出的笫9个因子赋给k9 */ case 10: k10=i;break; /* 找出的笫10个因子赋给k10 */ } } if(s==0) { printf(“%d ,Its factors are ”,a); if(n>1)printf(“%d,%d”,k1,k2); /* n>1表示a至少有2个因子 */ if(n>2)printf(“,%d”,k3); /* n>2表示至少有3个因子,故应再输出一个因子 */ if(n>3)printf(“,%d”,k4); /* n>3表示至少有4个因子,故应再输出一个因子 */ if(n>4)printf(“,%d”,k5); /* 以下类似 */ if(n>5)printf(“,%d”,k6); if(n>6)printf(“,%d”,k7); if(n>7)printf(“,%d”,k8); if(n>8)printf(“,%d”,k9); if(n>9)printf(“,%d”,k10); printf(“n”);} } return 0;} 5-9-2 #include for(m=2;m<1000;m++) {s=0; for(i=1;i if((m%i)==0)s=s+i; if(s==m) {printf(“%d,its factors are ”,m); for(i=1;i if(m%i==0)printf(“%d ”,i); printf(“n”); } } return 0;} 5-10 #include int i,n=20; double a=2,b=1,s=0,t; for(i=1;i<=n;i++) { s=s+a/b; t=a,a=a+b,b=t; } printf(“sum=%16.10fn”,s); return 0; } 5-11 #include double sn=100,hn=sn/2; int n; for(n=2;n<=10;n++) { sn=sn+2*hn; /*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/ } printf(“第10次落地时共经过%f米n”,sn); printf(“第10次反弹%f米n”,hn); return 0; } 5-12 #include int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2; /*第1天的桃子数是第2天桃子数加1后的2倍.*/ x2=x1; day--; } printf(“total=%dn”,x1); return 0;} 5-13 #include float a,x0,x1; printf(“enter a positive number:”); scanf(“%f”,&a); x0=a/2; x1=(x0+a/x0)/2; do {x0=x1; x1=(x0+a/x0)/2; }while(fabs(x0-x1)>=1e-5); printf(“The square root of %5.2f is %8.5fn”,a,x1); return 0;} 5-14 #include x1=1.5; do {x0=x1; f=((2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x1=x0-f/f1; }while(fabs(x1-x0)>=1e-5); printf(“The root of equation is %5.2fn”,x1); return 0;} 5-15 #include do {printf(“enter x1 & x2:”); scanf(“%f,%f”,&x1,&x2); fx1=x1*((2*x1-4)*x1+3)-6; fx2=x2*((2*x2-4)*x2+3)-6; }while(fx1*fx2>0); do {x0=(x1+x2)/2; fx0=x0*((2*x0-4)*x0+3)-6; if((fx0*fx1)<0) {x2=x0; fx2=fx0; } else {x1=x0; fx1=fx0; } }while(fabs(fx0)>=1e-5); printf(“x=%6.2fn”,x0); return 0;} 5-16 #include for(i=0;i<=3;i++) {for(j=0;j<=2-i;j++) printf(“ ”); for(k=0;k<=2*i;k++) printf(“*”); printf(“n”); } for(i=0;i<=2;i++) {for(j=0;j<=i;j++) printf(“ ”); for(k=0;k<=4-2*i;k++) printf(“*”); printf(“n”); } return 0; } 5-17 #include int main(){ char i,j,k; /*是a的对手;j是b的对手;k是c的对手*/ for(i='x';i<='z';i++) for(j='x';j<='z';j++) if(i!=j) for(k='x';k<='z';k++)if(i!=k && j!=k) if(i!='x' && k!='x' && k!='z') printf(“A--%cnB--%cnC--%cn”,i,j,k); return 0; } 第6章利用数组处理批量数据 【第168页】 6-1 #include for(i=1;i<=100;i++) a[i]=i; a[1]=0; for(i=2;i for(j=i+1;j<=100;j++) {if(a[i]!=0 && a[j]!=0) if(a[j]%a[i]==0) a[j]=0; } printf(“n”); for(i=2,n=0;i<=100;i++) { if(a[i]!=0) {printf(“%5d”,a[i]); n++; } if(n==10) {printf(“n”); n=0; } } printf(“n”); return 0;} 6-2 #include printf(“enter data:n”); for(i=1;i<=10;i++) {printf(“a[%d]=”,i); scanf(“%d”,&a[i]); } printf(“n”); printf(“The orginal numbers:n”); for(i=1;i<=10;i++) printf(“%5d”,a[i]); printf(“n”); for(i=1;i<=9;i++) {min=i; for(j=i+1;j<=10;j++)if(a[min]>a[j])min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf(“nThe sorted numbers:n”); for(i=1;i<=10;i++) printf(“%5d”,a[i]); printf(“n”); return 0;} 6-3 #include printf(“enter data:n”); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf(“%3d”,&a[i][j]); for(i=0;i<3;i++) sum=sum+a[i][i]; printf(“sum=%6dn”,sum); return 0;} 6-4 #include int temp1,temp2,number,end,i,j; printf(“array a:n”); for(i=0;i<10;i++) printf(“%5d”,a[i]); printf(“n”); printf(“insert data:”); scanf(“%d”,&number); end=a[9]; if(number>end) a[10]=number; else {for(i=0;i<10;i++) {if(a[i]>number) {temp1=a[i];a[i]=number;for(j=i+1;j<11;j++) {temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } printf(“Now array a:n”); for(i=0;i<11;i++) printf(“%5d”,a[i]); printf(“n”); return 0;} 6-5 #include printf(“enter array a:n”); for(i=0;i scanf(“%d”,&a[i]); printf(“array a:n”); for(i=0;i printf(“%4d”,a[i]); for(i=0;i //循环的作用是将对称的元素的值互换 { temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } printf(“nNow,array a:n”); for(i=0;i printf(“%4d”,a[i]); printf(“n”); return 0;} 6-6 #include for(i=0;i {a[i][i]=1; a[i][0]=1; } for(i=2;i for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i {for(j=0;j<=i;j++) printf(“%6d”,a[i][j]); printf(“n”); } printf(“n”); return 0;} 6-7 #include p=1; while(p==1) {printf(“enter n(n=1--15):”); scanf(“%d”,&n); if((n!=0)&&(n<=15)&&(n%2!=0)) p=0; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0; j=n/2+1; a[1][j]=1; for(k=2;k<=n*n;k++) {i=i-1; j=j+1; if((i<1)&&(j>n)) {i=i+2; j=j-1; } else {if(i<1)i=n; if(j>n)j=1; } if(a[i][j]==0) a[i][j]=k; else {i=i+2; j=j-1; a[i][j]=k; } } for(i=1;i<=n;i++) {for(j=1;j<=n;j++) printf(“%5d”,a[i][j]); printf(“n”); } return 0;} 6-8 #include /* 数组为4行5列 */ int main(){ int i,j,k,a[N][M],max,maxj,flag; printf(“please input matrix:n”); for(i=0;i /* 输入数组 */ for(j=0;j scanf(“%d”,&a[i][j]); for(i=0;i {max=a[i][0]; /* 开始时假设a[i][0]最大 */ maxj=0; /* 将列号0赋给maxj保存 */ for(j=0;j /* 找出第i行中的最大数 */ if(a[i][j]>max) {max=a[i][j]; /* 将本行的最大数存放在max中 */ maxj=j; /* 将最大数所在的列号存放在maxj中 */ } flag=1; /* 先假设是鞍点,以flag为1代表 */ for(k=0;k if(max>a[k][maxj]) /* 将最大数和其同列元素相比 */ {flag=0; /* 如果max不是同列最小,表示不是鞍点令flag1为0 */ continue;} if(flag) /* 如果flag1为1表示是鞍点 */ {printf(“a[%d][%d]=%dn”,i,maxj,max); /* 输出鞍点的值和所在行列号 */ break;} } if(!flag) /* 如果flag为0表示鞍点不存在 */ printf(“It is not exist!n”); return 0;} 6-9 #include char c; printf(“enter data:n”); scanf(“%d”,&a[0]); i=1; while(i {scanf(“%d”,&a[i]); if(a[i]>=a[i-1]) i++; else printf(“enter this data again:n”); } printf(“n”); for(i=0;i printf(“%5d”,a[i]); printf(“n”); while(flag) {printf(“input number to look for:”); scanf(“%d”,&number); sign=0; top=0; //top是查找区间的起始位置 bott=N-1; //bott是查找区间的最末位置 if((numbera[N-1]))//要查的数不在查找区间内 loca=-1; // 表示找不到 while((!sign)&&(top<=bott)) {mid=(bott+top)/2; if(number==a[mid]) {loca=mid; printf(“Has found %d, its position is %dn”,number,loca+1); sign=1; }第二篇:《C语言程序设计教程(第二版)》习题答案
s[i])min=i;}第三篇:《C语言程序设计教程(第二版)》习题答案
第四篇:C语言程序设计谭浩强重点笔记
第五篇:C语言程序设计(谭浩强)第四版_课后答案精讲