第一篇:C语言程序设计(谭浩强)第四版_课后答案精讲
第一章 程序设计和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,inp,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; inp=(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,inp); printf(“n反序数字为:”); printf(“%d%d%d%d%dn”,inp,ten,hundred,thousand,ten_thousand); break; case 4:printf(“%d,%d,%d,%d”,thousand,hundred,ten,inp); printf(“n反序数字为:”); printf(“%d%d%d%dn”,inp,ten,hundred,thousand); break; case 3:printf(“%d,%d,%d”,hundred,ten,inp); printf(“n反序数字为:”); printf(“%d%d%dn”,inp,ten,hundred); break; case 2:printf(“%d,%d”,ten,inp); printf(“n反序数字为:”); printf(“%d%dn”,inp,ten); break; case 1:printf(“%d”,inp); printf(“n反序数字为:”); printf(“%dn”,inp); 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; } else if(number bott=mid-1; else top=mid+1; } if(!sign||loca==-1) printf(“cannot find %d.n”,number);; printf(“continu or not(Y/N)?”); scanf(“ %c”,&c); if(c=='N'||c=='n') flag=0; } return 0; } 6-10 #include char text[3][80]; upp=low=dig=spa=oth=0; for(i=0;i<3;i++) { printf(“please input line %d:n”,i+1); gets(text[i]); for(j=0;j<80 && text[i][j]!='';j++) {if(text[i][j]>='A'&& text[i][j]<='Z') upp++; else if(text[i][j]>='a' && text[i][j]<='z') low++; else if(text[i][j]>='0' && text[i][j]<='9') dig++; else if(text[i][j]==' ') spa++; else oth++; } } printf(“nupper case: %dn”,upp); printf(“lower case: %dn”,low); printf(“digit : %dn”,dig); printf(“space : %dn”,spa); printf(“other : %dn”,oth);return 0;} 6-11 #include int i,j,k; char space=' '; for(i=0;i<5;i++) { printf(“n”); printf(“ ”); for(j=1;j<=i;j++) printf(“%c”,space); for(k=0;k<5;k++) printf(“%c”,a[k]); } printf(“n”); return 0;} 6-12a-c #include char ch[80],tran[80]; printf(“input cipher code:”); gets(ch); printf(“ncipher code :%s”,ch); j=0; while(ch[j]!='') { if((ch[j]>='A')&&(ch[j]<='Z')) tran[j]=155-ch[j]; else if((ch[j]>='a')&&(ch[j]<='z')) tran[j]=219-ch[j]; else tran[j]=ch[j]; j++; } n=j; printf(“noriginal text:”); for(j=0;j putchar(tran[j]); printf(“n”); return 0;} 6-12b #include char ch[80]; printf(“input cipher code:n”); gets(ch); printf(“ncipher code:%sn”,ch); j=0; while(ch[j]!='') { if((ch[j]>='A')&&(ch[j]<='Z')) ch[j]=155-ch[j]; else if((ch[j]>='a')&&(ch[j]<='z')) ch[j]=219-ch[j]; else ch[j]=ch[j]; j++; } n=j; printf(“original text:”); for(j=0;j putchar(ch[j]); printf(“n”); return 0;} 6-13 #include int i=0,j=0; printf(“input string1:”); scanf(“%s”,s1); printf(“input string2:”); scanf(“%s”,s2); while(s1[i]!='') i++; while(s2[j]!='') s1[i++]=s2[j++]; s1[i]=''; printf(“nThe new string is:%sn”,s1); return 0;} 6-14 #include char s1[100],s2[100]; printf(“input string1:”); gets(s1); printf(“ninput string2:”); gets(s2); i=0; while((s1[i]==s2[i])&&(s1[i]!=''))i++; if(s1[i]=='' && s2[i]=='') resu=0; else resu=s1[i]-s2[i]; printf(“nresult:%d.n”,resu); return 0;} 6-15 #include int i; printf(“input s2:”); scanf(“%s”,s2); for(i=0;i<=strlen(s2);i++) s1[i]=s2[i]; printf(“s1:%sn”,s1); return 0;} 第7章用函数实现模块化程序设计 【第218页】 7-1-1 #include int lcd(int,int,int); int u,v,h,l; scanf(“%d,%d”,&u,&v); h=hcf(u,v); printf(“H.C.F=%dn”,h); l=lcd(u,v,h); printf(“L.C.D=%dn”,l); return 0;} int hcf(int u,int v){int t,r;if(v>u) {t=u;u=v;v=t;} while((r=u%v)!=0) {u=v; v=r;} return(v);} int lcd(int u,int v,int h) { return(u*v/h); } 7-1-2 #include void lcd(int,int); int u,v; scanf(“%d,%d”,&u,&v); hcf(u,v); lcd(u,v); printf(“H.C.F=%dn”,Hcf); printf(“L.C.D=%dn”,Lcd); return 0;} void hcf(int u,int v){int t,r;if(v>u) {t=u;u=v;v=t;} while((r=u%v)!=0) {u=v; v=r; } Hcf=v;} void lcd(int u,int v) { Lcd=u*v/Hcf; } 7-2 #include { greater_than_zero(a,b); printf(“x1=%fttx2=%fn”,x1,x2); } else if(disc==0) {equal_to_zero(a,b); printf(“x1=%fttx2=%fn”,x1,x2); } else {smaller_than_zero(a,b); printf(“x1=%f+%fitx2=%f-%fin”,p,q,p,q); } return 0;} void greater_than_zero(float a,float b){x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a);} void equal_to_zero(float a,float b){ x1=x2=(-b)/(2*a);} void smaller_than_zero(float a,float b){ p=-b/(2*a); q=sqrt(-disc)/(2*a);} 7-3 #include int n; printf(“input an integer:”); scanf(“%d”,&n); if(prime(n)) printf(“%d is a prime.n”,n); else printf(“%d is not a prime.n”,n); return 0;} int prime(int n) {int flag=1,i; for(i=2;i if(n%i==0) flag=0; return(flag); } 7-4 #include for(j=0;j scanf(“%d”,&array[i][j]);printf(“noriginal array :n”);for(i=0;i {for(j=0;j printf(“%5d”,array[i][j]); printf(“n”); } convert(array);printf(“convert array:n”);for(i=0;i {for(j=0;j printf(“%5d”,array[i][j]); printf(“n”); } return 0;} void convert(int array[][3]){int i,j,t;for(i=0;i for(j=i+1;j {t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t; } } #include int i,j; for(i=0,j=strlen(str);i<(strlen(str)/2);i++,j--) {t=str[i]; str[i]=str[j-1]; str[j-1]=t; } } 7-6 #include string[i]=string1[i];for(j=0;string2[j]!='';j++) string[i+j]=string2[j];string[i+j]='';} 7-7 #include for(i=0,j=0;s[i]!='';i++) if(s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'|| s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U') {c[j]=s[i]; j++; } c[j]='';} 7-8 #include {str[2*i]=str[i]; str[2*i-1]=' '; } printf(“output:n%sn”,str);} 7-9 #include letter++;else if(str[i]>='0' && str [i]<='9') digit++;else if(str[i]==32) space++;else others++;} 7-10 #include printf(“%c”,line[i]);printf(“n”);return 0;} int alphabetic(char c){if((c>='a' && c<='z')||(c>='A'&&c<='z')) return(1);else return(0);} int longest(char string[]){int len=0,i,length=0,flag=1,place=0,point;for(i=0;i<=strlen(string);i++) if(alphabetic(string[i])) if(flag) {point=i; flag=0; } else len++; else {flag=1; if(len>=length){length=len; place=point; len=0;} } return(place);} 7-11 #include {printf(“input string:n”); scanf(“%s”,&str); if(strlen(str)>N) printf(“string too long,input again!”); else flag=0; } sort(str);printf(“string sorted:n”);for(i=0;i printf(“%c”,str[i]);printf(“n”);return 0;} void sort(char str[]){int i,j;char t;for(j=1;j for(i=0;(i if(str[i]>str[i+1]) {t=str[i]; str[i]=str[i+1]; str[i+1]=t; } } 7-12 #include float solut(float a,float b,float c,float d){float x=1,x0,f,f1;do {x0=x; f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c; x=x0-f/f1; } while(fabs(x-x0)>=1e-3);return(x);} 7-13 #include float h; float s_var(void); float highest(); void input_stu(void); void aver_stu(void); void aver_cour(void); input_stu(); aver_stu(); aver_cour(); printf(“n NO.cour1 cour2 for(i=0;i {printf(”n NO %2d “,i+1); for(j=0;j printf(”%8.2f“,score[i][j]); printf(”%8.2fn“,a_stu[i]); } printf(”naverage:“); for(j=0;j printf(”%8.2f“,a_cour[j]); cour3 cour4 cour5 avern”); printf(“n”); h=highest(); printf(“highest:%7.2f NO.%2d course %2dn”,h,r,c); printf(“variance %8.2fn”,s_var()); return 0;} void input_stu(void){int i,j; for(i=0;i {printf(“ninput score of student%2d:n”,i+1); for(j=0;j scanf(“%f”,&score[i][j]); } } void aver_stu(void){int i,j; float s; for(i=0;i {for(j=0,s=0;j s+=score[i][j]; a_stu[i]=s/5.0; } } void aver_cour(void){int i,j; float s; for(j=0;j {s=0; for(i=0;i s+=score[i][j]; a_cour[j]=s/(float)N; } } float highest(){float high; int i,j; high=score[0][0]; for(i=0;i for(j=0;j if(score[i][j]>high){high=score[i][j]; r=i+1; c=j+1;} return(high);} float s_var(void){int i; float sumx,sumxn; sumx=0.0; sumxn=0.0; for(i=0;i {sumx+=a_stu[i]*a_stu[i]; sumxn+=a_stu[i]; } return(sumx/N-(sumxn/N)*(sumxn/N));} 7-14 #include float h; float s_var(void); float highest(); void input_stu(void); void aver_stu(void); void aver_cour(void); input_stu(); aver_stu(); aver_cour(); printf(“n NO.cour1 cour2 cour3 cour4 cour5 for(i=0;i {printf(”n NO %2d “,i+1); for(j=0;j printf(”%8.2f“,score[i][j]); printf(”%8.2fn“,a_stu[i]); } printf(”naverage:“); for(j=0;j printf(”%8.2f“,a_cour[j]); printf(”n“); h=highest(); printf(”highest:%7.2f NO.%2d course %2dn“,h,r,c); avern”); printf(“variance %8.2fn”,s_var()); return 0;} void input_stu(void){int i,j; for(i=0;i {printf(“ninput score of student%2d:n”,i+1); for(j=0;j scanf(“%f”,&score[i][j]); } } void aver_stu(void){int i,j; float s; for(i=0;i {for(j=0,s=0;j s+=score[i][j]; a_stu[i]=s/5.0; } } void aver_cour(void){int i,j; float s; for(j=0;j {s=0; for(i=0;i s+=score[i][j]; a_cour[j]=s/(float)N; } } float highest(){float high; int i,j; high=score[0][0]; for(i=0;i for(j=0;j if(score[i][j]>high){high=score[i][j]; r=i+1; c=j+1;} return(high);} float s_var(void){int i; float sumx,sumxn; sumx=0.0; sumxn=0.0; for(i=0;i {sumx+=a_stu[i]*a_stu[i]; sumxn+=a_stu[i]; } return(sumx/N-(sumxn/N)*(sumxn/N));} 7-15 #include {void input(int [],char name[][8]); void sort(int [],char name[][8]);void search(int ,int [],char name[][8]);int num[N],number,flag=1,c; char name[N][8]; input(num,name); sort(num,name); while(flag==1) {printf(“ninput number to look for:”); scanf(“%d”,&number); search(number,num,name); printf(“continue ot not(Y/N)?”); getchar(); c=getchar(); if(c=='N'||c=='n') flag=0; } return 0; } void input(int num[],char name[N][8]){int i; for(i=0;i {printf(“input NO.: ”); scanf(“%d”,&num[i]); printf(“input name: ”); getchar(); gets(name[i]); } } void sort(int num[],char name[N][8]){ int i,j,min,templ; char temp2[8]; for(i=0;i {min=i; for(j=i;j if(num[min]>num[j])min=j; templ=num[i]; strcpy(temp2,name[i]); num[i]=num[min]; strcpy(name[i],name[min]); num[min]=templ; strcpy(name[min],temp2); } printf(“n result:n”); for(i=0;i printf(“n %5d%10s”,num[i],name[i]);} void search(int n,int num[],char name[N][8]) {int top,bott,mid,loca,sign; top=0; bott=N-1; loca=0; sign=1; if((n loca=-1; while((sign==1)&&(top<=bott)){mid=(bott+top)/2; if(n==num[mid]) {loca=mid; printf(“NO.%d , his name is %s.n”,n,name[loca]); sign=-1; } else if(n bott=mid-1; else top=mid+1;} if(sign==1 || loca==-1) printf(“%d not been found.n”,n); } 7-16 #include int c,i,flag,flag1; char t[MAX]; i=0; flag=0; flag1=1; printf(“input a HEX number:”); while((c=getchar())!='' && i {if(c>='0' && c<='9'||c>='a' && c<='f'||c>='A' && c<='F') {flag=1; t[i++]=c; } else if(flag) {t[i]=''; printf(“decimal number %dn”,htoi(t)); printf(“continue or not?”); c=getchar(); if(c=='N'||c=='n') flag1=0; else {flag=0; i=0; printf(“ninput a HEX number:”); } } } return 0; } int htoi(char s[]) { int i,n; n=0; for(i=0;s[i]!='';i++) {if(s[i]>='0'&& s[i]<='9') n=n*16+s[i]-'0'; if(s[i]>='a' && s[i]<='f') n=n*16+s[i]-'a'+10; if(s[i]>='A' && s[i]<='F') n=n*16+s[i]-'A'+10; } return(n); } 7-17 #include int number; printf(“input an integer: ”); scanf(“%d”,&number); printf(“output: ”); if(number<0) {putchar('-');putchar(' '); /* 先输出一个‘-’号和空格 */ number=-number; } convert(number); printf(“n”); return 0;} void convert(int n){ int i; if((i=n/10)!=0) convert(i); putchar(n%10+'0'); putchar(32);} 7-18 #include /* 调用函数sum_day */ if(leap(year)&&month>=3) /* 调用函数leap */ days=days+1;printf(“is the %dth day in this year.n”,days);return 0;} int sum_day(int month,int day) /* 函数sum_day:计算日期 */ {int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i; for(i=1;i day+=day_tab[i]; /* 累加所在月之前天数 */ return(day); } /* 函数leap:判断是否为闰年 */ int leap(int year){int leap; leap=year%4==0&&year%100!=0||year%400==0; return(leap);} 第8章善于利用指针 【第291页】 8-1 #include {int p; p=*p1;*p1=*p2;*p2=p; } #include strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 8-3 #include void max_min_value(int *); void output(int *); int number[10]; input(number); max_min_value(number); output(number); return 0;} void input(int *number) {int i; printf(“input 10 numbers:”); for(i=0;i<10;i++) scanf(“%d”,&number[i]); } void max_min_value(int *number) { int *max,*min,*p,temp; max=min=number; for(p=number+1;p if(*p>*max)max=p; else if(*p<*min)min=p; temp=number[0];number[0]=*min;*min=temp; if(max==number)max=min; temp=number[9];number[9]=*max;*max=temp; } void output(int *number) {int *p; printf(“Now,they are: ”); for(p=number;p printf(“%d ”,*p); printf(“n”); } 8-4 #include {void move(int [20],int,int); int number[20],n,m,i;printf(“how many numbers?”);scanf(“%d”,&n);printf(“input %d numbers:n”,n);for(i=0;i scanf(“%d”,&number[i]);printf(“how many place you want move?”);scanf(“%d”,&m);move(number,n,m);printf(“Now,they are:n”);for(i=0;i printf(“%d ”,number[i]);printf(“n”);return 0;} void move(int array[20],int n,int m) {int *p,array_end; array_end=*(array+n-1); for(p=array+n-1;p>array;p--) *p=*(p-1); *array=array_end; m--; if(m>0)move(array,n,m); } 8-5 #include *(p+i)=i+1; i=0; k=0; m=0; while(m {if(*(p+i)!=0)k++; if(k==3) {*(p+i)=0; k=0; m++; } i++; if(i==n)i=0; } while(*p==0)p++;printf(“The last one is NO.%dn”,*p);return 0;} 8-6 #include int length(char *p) {int n;n=0;while(*p!='') {n++; p++; } return(n);} 8-7 #include int m;char str1[20],str2[20];printf(“input string:”);gets(str1);printf(“which character that begin to copy?”);scanf(“%d”,&m);if(strlen(str1) printf(“input error!”);else {copystr(str1,str2,m); printf(“result:%sn”,str2); } return 0;} void copystr(char *p1,char *p2,int m) {int n;n=0;while(n {n++; p1++; } while(*p1!='') {*p2=*p1; p1++; p2++; } *p2='';} 8-8 #include {if(('A'<=*p)&&(*p<='Z')) ++upper; else if(('a'<=*p)&&(*p<='z')) ++lower; else if(*p==' ') ++space; else if((*p<='9')&&(*p>='0')) ++digit; else ++other; p++; } printf(“upper case:%d lower case:%d”,upper,lower);printf(“ space:%d digit:%d other:%dn”,space,digit,other); 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- 8.1 # include int a,b,Y,B;printf(“输入两个数字:n”);scanf(“%d%d”,&a,&b);Y=yueshu(a,b);B=beishu(a,b);printf(“最大公约数为Y=%dn最小公倍数为B=%dn”,Y,B);} int yueshu(int m,int n){ } int r,t;if(m } r=m%n;if(r==0)break;else { m=n;n=r;} return n;int beishu(int m,int n){ } 8.2 # include int c;c=m*n/yueshu(m,n);return c; int x1,x2; x1=(-b+sqrt(b*b-4*a*c))/(2*a); x2=(-b-sqrt(b*b-4*a*c))/(2*a);printf(“%fn%fn”,x1,x2);return 0;} float gen2(int a,int b,int c){ int x;x=-b/(2*a);printf(“%fn”,x);return x;} float gen3(int a,int b,int c){ } printf(“无实根;n”);return 0;float function(int a,int b,int c){ float x,y;y=a*x*x+b*x+c;return y;} void main(){ int x,a,b,c,y;printf(“请输入系数:n”); } 8.3 # include int sushu(int x);void main(){ int y;printf(“请输入要判断的数字:n”);scanf(“%d”,&y);sushu(y);} int sushu(int x){ } 8.4 # include } void zhuanzhi(int b[3][3]){ int i;float k;k=sqrt(x);for(i=2;i<=k;i++)if(x%i==0)break; if(i>k+1)printf(“%d就是素数!”,x);else printf(“%d不是素数n”,x);int a[3][3]={0};int i,j;printf(“请输入三维数组:n”);for(i=0;i<3;i++)for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);zhuanzhi(a);int i,j;for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf(“%2d”,b[j][i]); } 8.5 } } printf(“n”);# include char b[50];printf(“请输入字符串:n”);gets(b);fanxu(b);printf(“n”);} void fanxu(char a[50]){ int i;for(i=strlen(a);i>=0;i--) printf(“%c”,a[i]);} 8.6 # include lianjie(a,b);} { printf(“n”);void lianjie(char a1[20],char a2[20])int m,n,i;char a3[50];m=strlen(a1);n=strlen(a2);for(i=0;i } for(i=0;i a3[m+n]='';for(i=0;i printf(“%c”,a3[i]);8.7 # include char a1[50];printf(“请输入一字符串:n”);gets(a1);yuanyin(a1);} void yuanyin(char b[30]){ } 8.8 # include int i,j=0;char c1[20]={0},c2[20]={0};for(i=0;i if(b[i]=='a'||b[i]=='e'||b[i]=='i'||b[i]=='o'||b[i]=='u' ||b[i]=='A'||b[i]=='E'||b[i]=='I'||b[i]=='O'||b[i]=='U') { c1[j]=b[i]; j++;} // c1[j+1]=''; strcpy(c2,c1);for(i=0;i kong(a);printf(“n”);} void kong(int b[4]){ } 8.9 # include } printf(“%d”,b[i]);printf(“ ”);gets(a);tongji(a);} void tongji(char b[50]){ int i;int d=0,x=0,s=0,k=0,q=0;for(i=0;i if(b[i]>='A'&&b[i]<='Z')d++;else if(b[i]>='a'&&b[i]<='z')x++;else if(b[i]>='0'&&b[i]<='9')s++;else if(b[i]==' ')k++;else q++;} printf(“大写%d个n小写%d个n数字%d个n空格%d个n其他%d个n”,d,x,s,k,q);} 8.10 # include # include } void danci(char str1[100],char w0[15]){ } int i=0,j=0,t=0;char w1[15];for(i=0;i if(!((str1[i]>='a'&&str1[i]<='z')||(str1[i]>='A'&&str1[i]<='Z'))){ t=i;i=0;continue;gets(a);danci(a,b); } w1[j]=str1[i];j++;if(j>=t)strcpy(w0,w1);} puts(w0);8.11 # include int b[10]={0},i;printf(“请输入十个数字:n”);for(i=0;i<10;i++)scanf(“%d”,&b[i]);maopao(b);printf(“所排顺序为:”); for(i=0;i<10;i++)printf(“%-3d”,b[i]);printf(“n”); } void maopao(int a[10]){ } int i,j,t;for(j=1;j<9;j++){ for(i=0;i<9-j;i++) } { } if(a[i]>a[i+1]){ t=a[i];a[i]=a[i+1];a[i+1]=t;} 8.12 # include void main(){ } void ND(int a,int b,int c,int d){ int p,q,r,s; printf(“请输入系数:n”);scanf(“%d%d%d%d”,&p,&q,&r,&s);printf(“方程为:%dX^3+%dX^2+%dX+%d=0n”,p,q,r,s);ND(p,q,r,s); float x=1,x0,x1;do { x1=x; x0=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);x=x0;}while(fabs(x1-x0)>1e-6);printf(“%fn”,x0); } 8.13 # include } float lerangde(float x1,int n){ if(n==0||n==1) } { if(n==0) return 1;else return x1;} else return((2*n-1)*x1-lerangde(x1,n-1)-(n-1)*lerangde(x1,n-2))/n;float x,y;int m;printf(“请输入x以及阶数m:n”);scanf(“%f%d”,&x,&m);y=lerangde(x,m);printf(“勒让德多项式值为:%-f”,y);putchar(10); 8.14# include //调用函数; void main(){ int a[2][3]={0};int i,j;printf(“输入学生以及对应的成绩:n”);for(i=0;i scanf(“%d”,&a[i][j]); stu_average(a);sourse_average(a);max(a);average(a);printf(“每个学生的平均分为:%fn”,stu_average(a)); } //计算每个学生平均成绩; float stu_average(int a[M][N]){ int i,j,sum=0;float x1;for(i=0;i for(j=0;j return x1;} //课程平均成绩; void sourse_average(int a[M][N]){ int sum=0,i,j;float x1;for(i=0;i { } sum=sum+a[i][j];x1=(float)(sum/N);printf(“每门课程的平均分为:%fn”,x1); } //最高分; void max(int a[M][N]){ int max=a[0][0],t,s,k,i,j;for(i=0;i for(j=0;j } if(max } max=a[i][j];a[i][j]=t;s=i+1;k=j+1;printf(“%d %d %dn”,max,s,k); } 8.15# include } shuru();printf(“排好顺序为:n”);paixu();found();void shuru(){ int i;printf(“请输入职工姓名以及工号:n”); } void paixu(){ for(i=0;i<4;i++)scanf(“%s%d”,m[i],&n[i]);for(i=0;i<4;i++)printf(“%s的工号是:%dn”,m[i],n[i]);int i,t,j;char c[20];for(j=0;j<=3;j++){ for(i=0;i<3-j;i++){ } } } if(n[i]>n[i+1]){ } t=n[i];n[i]=n[i+1];n[i+1]=t; strcpy(c,*m[i]);strcpy(*m[i],*m[i+1]);strcpy(*m[i+1],c);for(i=0;i<4;i++)printf(“%st%dn”,m[i],n[i]); void found(){ int p,i,j,flag=0,mid; printf(“输入要查找的职工号:n”);scanf(“%d”,&p);i=0;j=3;while(i<=j){ } mid=(i+j)/2;if(p==n[mid]){ flag=1;break;} else { } if(p>n[mid])j=mid-1;else i=mid+1; if(flag==1) printf(“找到了,名字是%sn”,m[mid]); else printf(“无此人!n”); } 8.16 # include char a[20]={0},c[20],b[20];int i,j,m,n,y;printf(“请输入十六进制数字:n”);gets(a);n=strlen(a);m=strlen(c);for(i=0;i<20;i++){ if(a[i]<='9')a[i]=a[i]-48;else if(a[i]<='F')a[i]=a[i]-55;else { a[i]=a[i]-87;} } for(i=0;i } for(i=0;i<20;i++){ int k;c[0]=c[0]*16+a[i];for(k=1;k<=m;k++)c[k]=c[k]*16;y=0;y=a[i];for(j=3;j>=0;j--){ } b[i*4+j]=y%2;y=y/2; } for(k=0;k<=m;k++){ } while(y>0){ } m++;c[m]=y%10;y=y/10;y=y+c[k];c[k]=y%10;y=y/10;for(i=m;i>=0;i--)printf(“%d”,c[i]);getchar();} 8.17 # include } scanf(“%d”,&n);F(n);putchar(10);void F(int m){ int j;if(m>=0&&m<=9)printf(“%d”,m);else { } j=m%10;F(m/10); printf(“%d”,j);} 8.18 # include void DJT(int y,int m,int d);int leap(int year);void main(){ int year,month,day;printf(“请输入年-月-日:n”); } int leap(int year){ } int flag=0;if(year%4==0){ if(year%100==0){ if(year%400==0)flag=1;else flag=0;scanf(“%d%d%d”,&year,&month,&day);DJT(year,month,day); } else flag=1;} else flag=0;return flag; void DJT(int y,int m,int d){ int p=0;int r=0;if(leap(y))r=29;else r=28;switch(m){ case 1:p=d;break;case 2:p=31+d;break;case 3:p=31+r+d;break;case 4:p=31+r+31+d;break;case 5:p=31+r+31+30+d;break;case 6:p=31+r+31+30+31+d;break; } case 7:p=31+r+31+30+31+30+d;break;case 8:p=31+r+31+30+31+30+31+d;break;case 9:p=31+r+31+30+31+30+31+31+d;break;case 10:p=31+r+31+30+31+30+31+31+30+d;break;case 11:p=31+r+31+30+31+30+31+31+30+31+d;break;case 12:p=31+r+31+30+31+30+31+31+30+31+30+d;break;default :;} printf(“这是%d年的第%d天n”,y,p); C语言设计谭浩强第三版的课后习题答案 1.5请参照本章例题,编写一个C程序,输出以下信息: main(){ printf(“ ************ n”);printf(“n”);printf(“ Very Good!n”);printf(“n”);printf(“ ************n”);} 1.6编写一个程序,输入a b c三个值,输出其中最大者。解:main(){int a,b,c,max;printf(“请输入三个数a,b,c:n”); scanf(“%d,%d,%d”,&a,&b,&c);max=a;if(maxmax=b;if(maxmax=c;printf(“最大数为:%d”,max);} 第三章 3.3 请将下面各数用八进制数和十六进制数表示:(1)10(2)32(3)75(4)-617(5)-111(6)2483(7)-28654(8)21003 解:十 八 十六 (10)=(12)=(a) (32)=(40)=20 (75)=(113)=4b (-617)=(176627)=fd97 -111=177621=ff91 2483=4663=963 -28654=110022=9012 21003=51013=520b 3.5字符常量与字符串常量有什么区别? 解:字符常量是一个字符,用单引号括起来。字符串常量是由0个或若干个字符 而成,用双引号把它们括起来,存储时自动在字符串最后加一个结束符号''.3.6写出以下程序的运行结果: #include void main(){ char c1='a',c2='b',c3='c',c4='101',c5='116';printf(“a%c b%ctc%ctabcn”,c1,c2,c3);printf(“tb%c %cn”,c4,c5); 解:程序的运行结果为: aabb cc abc A N 3.7将“China”译成密码.密码规律:用原来的字母后面第4个字母代替原来的字母, 例如,字母“A”后面第4个字母是“E”,用“E”代替“A”.因此,“China”应译为“Glmre”.请编一程序,用赋初值的议程使c1,c2,c3,c4,c5分别变成'G','1','m','r','e',并 输出.main(){char c1=“C”,c2=“h”,c3=“i”,c4='n',c5='a';c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf(“密码是%c%c%c%c%cn”,c1,c2,c3,c4,c5);} 3.8例3.6能否改成如下: #include void main(){ int c1,c2;(原为 char c1,c2)c1=97;c2=98;printf(“%c%cn”,c1,c2);printf(“%d%dn”,c1,c2);} 解:可以.因为在可输出的字符范围内,用整型和字符型作用相同.3.9求下面算术表达式的值.(1)x+a%3*(int)(x+y)%2/4=2.5(x=2.5,a=7,y=4.7)(2)(float)(a+b)/2+(int)x%(int)y=3.5(设a=2,b=3,x=3.5,y=2.5)3.10写出下面程序的运行结果: #include void main(){ int i,j,m,n;i=8;j=10;m=++i;n=j++;printf(“%d,%d,%d,%dn”,i,j,m,n);} 解:结果: 9,11,9,10 第4章 4.4.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)解: main(){ int a,b,c;long int u,n;float x,y,z;char c1,c2;a=3;b=4;c=5;x=1.2;y=2.4;z=-3.6;u=51274;n=128765;c1='a';c2='b';printf(“n”);printf(“a=%2d b=%2d c=%2dn”,a,b,c);printf(“x=%8.6f,y=%8.6f,z=%9.6fn”,x,y,z);printf(“x+y=%5.2f y=z=%5.2f z+x=%5.2fn”,x+y,y+z,z+x);printf(“u=%6ld n=%9ldn”,u,n);printf(“c1='%c' or %d(ASCII)n”,c1,c2);printf(“c2='%c' or %d(ASCII)n”,c2,c2);} 4.5请写出下面程序的输出结果.结果: 57 7 67.856400,-789.123962 67.856400 ,-789.123962 67.86,-789.12,67.856400,-789.123962,67.856400,-789.123962 6.785640e+001,-7.89e+002 A,65,101,41 1234567,4553207,d687 65535,17777,ffff,-1 COMPUTER, COM 4.6用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1='A',c2='a', 问在键盘上如何输入? main(){ int a,b;float x,y; char c1,c2;scanf(“a=%d b=%d,&a,&b);scanf(” x=%f y=%e“,&x,&y);scanf(” c1=%c c2=%c“,&c1,&c2);} 解:可按如下方式在键盘上输入: a=3 b=7 x=8.5 y=71.82 c1=A c2=a 说明:在边疆使用一个或多个scnaf函数时,第一个输入行末尾输入的”回车“被第二 个scanf函数吸收,因此在第二三个scanf函数的双引号后设一个空格以抵消上行 入的”回车“.如果没有这个空格,按上面输入数据会出错,读者目前对此只留有一 初步概念即可,以后再进一步深入理解.4.7用下面的scanf函数输入数据使a=10,b=20,c1='A',c2='a',x=1.5,y=- 3.75,z=57.8,请问 在键盘上如何输入数据? scanf(”%5d%5d%c%c%f%f%*f %f“,&a,&b,&c1,&c2,&y,&z);解: main(){ int a,b;float x,y,z;char c1,c2;scanf(”%5d%5d%c%c%f%f“,&a,&b,&c1,&c2,&x,&y,&z);} 运行时输入: 20Aa1.5-3.75 +1.5,67.8 注解:按%5d格式的要求输入a与b时,要先键入三个空格,而后再打入10与20。%*f 是用来禁止赋值的。在输入时,对应于%*f的地方,随意打入了一个数1.5,该值不 会赋给任何变量。 4.8设圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积,用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后两位数字.请编 程.解:main(){ float pi,h,r,l,s,sq,vq,vz;pi=3.1415926;printf(”请输入圆半径r圆柱高h:n“);scanf(”%f,%f“,&r,&h); l=2*pi*r;s=r*r*pi;sq=4*pi*r*r;vq=4.0/3.0*pi*r*r*r;vz=pi*r*r*h;printf(”圆周长为: =%6.2fn“,l);printf(”圆面积为: =%6.2fn“,s);printf(”圆球表面积为: =%6.2fn“,sq);printf(”圆球体积为: =%6.2fn“,vz);} 4.9输入一个华氏温度,要求输出摄氏温度,公式为C=5/9(F-32),输出要有文字说明,取两位小数.解: main(){ float c,f;printf(”请输入一个华氏温度:n“);scanf(”%f“,&f);c=(5.0/9.0)*(f-32);printf(”摄氏温度为:%5.2fn“,c);} 第五章 逻辑运算和判断选取结构 5.4有三个整数a,b,c,由键盘输入,输出其中最大的数.main(){ 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);} 方法2:使用条件表达式.main(){int a,b,c,termp,max;printf(” 请输入 A,B,C: “);scanf(”%d,%d,%d“,&a,&b,&c);printf(”A=%d,B=%d,C=%dn“,a,b,c);temp=(a>b)?a:b;max=(temp>c)? temp:c;printf(” A,B,C中最大数是%d,“,max); } 5.5 main(){int x,y;printf(”输入x:“);scanf(”%d“,&x);if(x<1) {y=x; printf(”X-%d,Y=X=%d n“,x,y); } else if(x<10) {y=2*x-1; printf(” X=%d, Y=2*X-1=%dn“,x,y); } else {y=3*x-11; printf(”X=5d, Y=3*x-11=%d n“,x,y); } } (习题5-6:)自己写的已经运行成功!不同的人有不同的算法,这些答案仅供参考! void main(){ float s,i;char a;scanf(”%f“,&s);while(s>100||s<0){ printf(”输入错误!error!“);scanf(”%f“,&s);} i=s/10;switch((int)i){ case 10: case 9: a='A';break;case 8: a='B';break;case 7: a='C';break;case 6: a='D';break;case 5: case 4: case 2: case 1: case 0: a='E'; } printf(”%c“,a);} 5.7给一个不多于5位的正整数,要求:1.求它是几位数2.分别打印出每一位数字3.按逆序打印出各位数字.例如原数为321,应输出123.main(){ long int num;int inp,ten,hundred,housand,tenthousand,place;printf(”请输入一个整数(0-99999):“);scanf(”%ld“,&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(”place=%dn“,place);printf(”每位数字为:“);ten_thousand=num/10000;thousand=(num-tenthousand*10000)/1000;hundred=(num-tenthousand*10000-thousand*1000)/100;ten=(num-tenthousand*10000-thousand*1000-hundred*100)/10;inp=num-tenthousand*10000-thousand*1000-hundred*100-ten*10;switch(place){case 5:printf(”%d,%d,%d,%d,%d“,tenthousand,thousand,hundred,ten,inp);printf(”n反序数字为:“);printf(”%d%d%d%d%dn“,inp,ten,hundred,thousand,tenthousand);break;case 4:printf(”%d,%d,%d,%d“,thousand,hundred,ten,inp);printf(”n反序数字为:“);printf(”%d%d%d%dn“,inp,ten,hundred,thousand);break;case 3:printf(”%d,%d,%dn“,hundred,ten,inp);printf(”n反序数字为:“);printf(”%d%d%dn“,inp,ten,hundred);case 2:printf(”%d,%dn“,ten,inp);printf(”n反序数字为:“);printf(”%d%dn“,inp,ten); case 1:printf(”%dn“,inp);printf(”n反序数字为:“);printf(”%dn“,inp);} } 5.8 1.if语句 main(){long i;float bonus,bon1,bon2,bon4,bon6,bon10;bon1=100000*0.1;bon2=bon1+100000*0.075;bon4=bon2+200000*0.05;bon6=bon4+200000*0.03;bon10=bon6+400000*0.015;scanf(”%ld“,&i);if(i<=1e5)bonus=i*0.1;else if(i<=2e5)bonus=bon1+(i-100000)*0.075;else if(i<=4e5)bonus=bon2+(i-200000)*0.05;else if(i<=6e5)bonus=bon4+(i-400000)*0.03;else if(i<=1e6)bonus=bon6+(i-600000)*0.015;else bonus=bon10+(i-1000000)*0.01;printf(”bonus=%10.2f“,bonus);} 用switch语句编程序 main(){long i;float 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;scanf(”%ld“,&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(”bonus=%10.2f“,bonus);} 5.9 输入四个整数,按大小顺序输出.main() {int t,a,b,c,d; printf(”请输入四个数:“); scanf(”%d,%d,%d,%d“,&a,&b,&c,&d); printf(”nn a=%d,b=%d,c=%d,d=%d n“,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 排序结果如下: n“);printf(” %d %d %d %d n“,a,b,c,d);} 5.10塔 main(){ int h=10;float x,y,x0=2,y0=2,d1,d2,d3,d4;printf(”请输入一个点(x,y):“);scanf(”%f,%f“,&x,&y);d1=(x-x0)*(x-x0)+(y-y0)(y-y0);d2=(x-x0)*(x-x0)+(y+y0)(y+y0);d3=(x+x0)*(x+x0)+(y-y0)*(y-y0);d4=(x+x0)*(x+x0)+(y+y0)*(y+y0); if(d1>1 && d2>1 && d3>1 && d4>1)h=0;printf(”该点高度为%d“,h);} 第六章 循环语句 6.1输入两个正数,求最大公约数最小公倍数.main(){ int a,b,num1,num2,temp;printf(”请输入两个正整数:n“);scanf(”%d,%d“,&num1,&num2);if(num1{ temp=num1;num1=num2;num2=temp;} a=num1,b=num2;while(b!=0) { temp=a%b; a=b; b=temp; } printf(”它们的最大公约数为:%dn“,a);printf(”它们的最小公倍数为:%dn“,num1*num2/2);} 6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解: #include < > main(){ char c;int letters=0,space=0,degit=0,other=0;printf(”请输入一行字符:n“);scanf(”%c“,&c);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(”其中:字母数=%d 空格数=%d 数字数=%d 其它字符数=% dn“,letters,space, digit,other);} 6.3求s(n)=a+aa+aaa+…+aa…a之值,其中工是一个数字.解: main(){ int a,n,count=1,sn=0,tn=0;printf(”请输入a和n的值:n“);scanf(”%d,%d“,&a,&n);printf(”a=%d n=%d n“,a,n);while(count<=n){ tn=tn+a;sn=sn+tn;a=a*10;++count;} printf(”a+aa+aaa+…=%dn“,sn);} 6.4 求1+2!+3!+4!+…+20!.main(){ float n,s=0,t=1;for(n=1;n<=20;n++){ t=t*n;s=s+t;} printf(”1!+2!+…+20!=%en“,s);} 6.5 main(){ int N1=100,N2=50,N3=10;float k;float s1=0,s2=0,s3=0;for(k=1;k<=N1;k++){ s1=s1+k; } for(k=1;k<=N2;k++){ s2=s2+k*k;} for(k=1;k<=N3;k++){ s3=s3+1/k;} printf(”总和=%8.2fn“,s1+s2+s3);} 6.6水仙开花 main(){ int i,j,k,n;printf(” '水仙花'数是:“);for(n=100;n<1000;n++){ i=n/100;j=n/10-i*10;k=n%10;if(i*100+j*10+k==i*i*i+j*j*j+k*k*k){ printf(”%d“,n);} } printf(”n“);} 6.7完数 main()#include M 1000 main(){ int k0,k1,k2,k3,k4,k5,k6,k7,k8,k9;int i,j,n,s;for(j=2;j<=M;j++){ n=0;s=j;for(i=1;i { if((j%i)==0) { if((j%i)==0) { n++; s=s-i; switch(n) { case 1: k0=i;break;case 2: k1=i;break;case 3: k2=i;break;case 4: k3=i;break;case 5: k4=i;break;case 6: k5=i;break;case 7: k6=i;break;case 8: k7=i;break;case 9: k8=i;break;case 10: k9=i;break;} } } if(s==0) { printf(”%d是一个‘完数’,它的因子是“,j);if(n>1) printf(”%d,%d“,k0,k1);if(n>2) printf(”,%d“,k2); if(n>3) printf(”,%d“,k3);if(n>4) printf(”,%d“,k4);if(n>5) printf(”,%d“,k5);if(n>6) printf(”,%d“,k6);if(n>7) printf(”,%d“,k7);if(n>8) printf(”,%d“,k8);if(n>9) printf(”,%d“,k9);printf(”n“); } } 方法二:此题用数组方法更为简单.main(){ static int k[10];int i,j,n,s;for(j=2;j<=1000;j++){ n=-1;s=j;for(i=1;i{ if((j%i)==0){ n++;s=s-i;k[n]=i; } } if(s==0){ printf(”%d是一个完数,它的因子是:“,j);for(i=0;iprintf(”%d,“,k[i]);printf(”%dn“,k[n]);} } 6.8 有一个分数序列:2/1,3/2,5/3,8/5……求出这个数列的前20项之和.解: main(){ int n,t,number=20;float a=2,b=1,s=0;for(n=1;n<=number;n++){ s=s+a/b;t=a,a=a+b,b=t;} printf(”总和=%9.6fn“,s);} 6.9球反弹问题 main(){ float sn=100.0,hn=sn/2;int n;for(n=2;n<=10;n++){ sn=sn+2*hn;hn=hn/2;} printf(”第10次落地时共经过%f米 n“,sn);printf(”第10次反弹%f米.n“,hn);} 6.10猴子吃桃 main(){ int day,x1,x2;day=9;x2=1;while(day>0){ x1=(x2+1)*2;x2=x1;day--;} printf(”桃子总数=%dn“,x1);} 6.12 #include”math.h“ main(){float x,x0,f,f1;x=1.5; do {x0=x; f=((2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x=x0-f/f1; } while(fabs(x-x0)>=1e-5);printf(”x=%6.2fn“,x);} 6.13 #include”math.h“ main(){float x0,x1,x2,fx0,fx1,fx2;do {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(”x0=%6.2fn“,x0);} 6.14打印图案 main(){int i,j,k;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“); } } 6.15乒乓比赛 main(){ char i,j,k;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(”顺序为:na-%ctb--%ctc--%cn“,i,j,k); } } } } C语言设计谭浩强第三版的课后习题答案7-8(202_-10-21 17:15:29) 标签:杂谈 分类:淘金 C语言设计谭浩强第三版的课后习题答案 7.1用筛选法求100之内的素数.#include #define N 101 main(){int i,j,line,a[N]; for(i=2;ifor(i=2;ifor(j=i+1;j {if(a[i]!=0 && a[j]!=0) if(a[j]%a[i]==0)a[j]=0;printf(”n“);for(i=2,line=0;i{ if(a[i]!=0) {printf(”%5d“,a[i]);line++;if(line==10){printf(”n“);line=0;} } } 7.2用选择法对10个数排序.#define N 10 main(){ int i,j,min,temp,a[N]; printf(”请输入十个数:n“);for(i=0;i{ printf(”a[%d]=“,i); scanf(”%d“,&a[i]);} printf(”n“);for(i=0;i printf(”%5d“,a[i]);printf(”n“); for(i=0;i{ min=i; for(j=i+1;j if(a[min]>a[j])min=j; temp=a[i]; a[i]=a[min]; a[min]=temp;} printf(”n排序结果如下:n“);for(i=0;iprintf(”%5d“,a[i]);} 7.3对角线和: main(){ float a[3][3],sum=0;int i,j;printf(”请输入矩阵元素:n“); for(i=0;i<3;i++) for(j=0;j<3;j++)scanf(”%f“,&a[i][j]); for(i=0;i<3;i++) sum=sum+a[i][i]; printf(”对角元素之和=6.2f“,sum);} 7.4插入数据到数组 main(){int a[11]={1,4,6,9,13,16,19,28,40,100};int temp1,temp2,number,end,i,j;printf(”初始数组如下:“);for(i=0;i<10;i++)printf(”%5d“,a[i]);printf(”n“);printf(”输入插入数据:“);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;} } } for(i=0;j<11;i++) printf(”a%6d“,a[i]);} 7.5将一个数组逆序存放。 #define N 5 main(){ int a[N]={8,6,5,4,1},i,temp;printf(”n 初始数组:n“); for(i=0;iprintf(”%4d“,a[i]);for(i=0;i{ temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;} printf(”n 交换后的数组:n“);for(i=0;i printf(”%4d“,a[i]);} 7.6杨辉三角 #define N 11 main(){ int i,j,a[N][N]; for(i=1;i {a[i][i]=1; a[i][1]=1; } for(i=3;i for(j=2;j<=i-1;j++)a[i][j]=a[i01][j-1]+a[i-1][j]; for(i=1;i { for(j=1;j<=i;j++)printf(”%6d“,a[i][j];printf(”n“); } printf(”n“);} 7.8鞍点 #define N 10 #define M 10 main(){ int i,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;printf(”n输入行数n:“);scanf(”%d“,&n);printf(”n输入列数m:“);scanf(”%d“,&m); for(i=0;i { printf(”第%d行?n“,i);for(j=0;j scanf(”%d“,&a[i][j];} for(i=0;i { for(j=0;j printf(”%5d“,a[i][j]); pritf(”n“);} flag2=0;for(i=0;i { max=a[i][0];for(j=0;j if(a[i][j]>max) { max=a[i][j]; maxj=j;} for(k=0,flag1=1;k if(max>a[k][max]) flag1=0;if(flag1){ printf(”n第%d行,第%d列的%d是鞍点n“,i,maxj,max); flag2=1;} } if(!flag2) printf(”n 矩阵中无鞍点!n“);} 7.9变量说明:top,bott:查找区间两端点的下标;loca:查找成功与否的开关变量.#include #define N 15 main(){ int i,j,number,top,bott,min,loca,a[N],flag; char c; printf(”输入15个数(a[i]>[i-1])n); scanf(“%d”,&a[0]); i=1; while(i { scanf(“%d”,&a[i]); if(a[i]>=a[i-1])i++;esle {printf(“请重输入a[i]”);printf(“必须大于%dn”,a[i-1]);} } printf(“n”); for(i=0;i printf(“%4d”,a[i]); printf(“n”); flag=1; while(flag) { printf(“请输入查找数据:”); scanf(“%d”,&number); loca=0; top=0; bott=N-1; if((numbera[N-1]))loca=-1; while((loca==0)&&(top<=bott)) { min=(bott+top)/2; if(number==a[min]) { loca=min; printf(“%d位于表中第%d个数n”,number,loca+1); } else if(number bott=min-1;else top=min+1; } if(loca==0||loca==-1) printf(“%d不在表中n”,number); printf(“是否继续查找?Y/N!n”); c=getchar();if(c=='N'||c=='n')flag=0; } } 7.10 main(){ int i,j,uppn,lown,dign,span,othn; char text[3][80]; uppn=lown=dign=span=othn=0; for(i=0;i<3;i++) { printf(“n请输入第%d行:n”,i); gets(text[i]); for(j=0;j<80 && text[i][j]!='';j++) {if(text[i][j]>='A' && text[i][j]<='Z')uppn+=1;else if(text[i][j]>='a' && text[i][j]<='z')lown+=1;else if(text[i][j]>='1' && text[i][j]<='9')dign+=1;else if(text[i][j]=' ')span+=1;else othn+=1; } } for(i=0;i<3;i++)printf(“%s=n”,text[i]); printf(“大写字母数:%dn”,uppn); printf(“小写字母数:%dn”,lown); printf(“数字个数:%dn”,dign); printf(“空格个数:%dn”,span); printf(“其它字符:%dn”,othn);} 7.11 main() {static char a[5]={'*','*','*','*','*'}; int i,j,k; char space=' '; for(i=0;i<=5;i++) {printf(“n”); for(j=1;j<=3*i;j++)printf(“%lc”,space); for(k=0;k<=5;k++)printf(“%3c”,a[k]; } } 7.12 #include main(){int i,n;char ch[80],tran[80];printf(“请输入字符:”);gets(ch);printf(“n密码是%c”,ch);i=0;while(ch[i]!=''){if((ch[i]>='A')&&(ch[i]<='Z')) tran[i]=26+64-ch[i]+1+64;else if((ch[i]>='a')&&(ch[i]<='z')) tran[i]=26+96-ch[i]+1+96;else tran[i]=ch[i]; i++;} n=i; printf(“n原文是:”);for(i=0;iputchar(tran[i]);} 7.13 main() { char s1[80],s2[40]; int i=0,j=0; printf(“n请输入字符串1:”); scanf(“%s”,s1); printf(“n请输入字符串2:”); scanf(“%s”,s2); while(s1[i]!='') i++;while(s2[j]!='') s1[i++]=s2[j++];s1[i]='';printf(“n连接后字符串为:%s”,s1); } 7.14 #include main(){int i,resu;char s1[100],s2[100];printf(“请输入字符串1:n”);gets(s1);printf(“n 请输入字符串2:n”);gets(s2);i=0;while((s1[i]==s2[i])&&(s1[i]!=''))i++;if(s1[i]=='' && s2[i]=='')resu=0;else resu=s1[i]-s2[i];printf(“ %s与%s比较结果是%d”,s1,s2,resu);} 7.15 #include main() { char from[80],to[80]; int i; printf(“请输入字符串”); scanf(“%s”,from); for(i=0;i<=strlen(from);i++) to[i]=from[i]; printf(“复制字符串为:%sn”,to); } 第八章 函数 8.1(最小公倍数=u*v/最大公约数.)hcf(u,v)int u,v;(int a,b,t,r;if(u>v) {t=u;u=v;v=t;} a=u;b=v;while((r=b%a)!=0) {b=a;a=r;} return(a); } lcd(u,v,h) int u,v,h;{int u,v,h,l;scanf(“%d,%d”,&u,&v);h=hcf(u,v);printf(“H.C.F=%dn”,h);l=lcd(u,v,h);printf(“L.C.d=%dn”,l);} {return(u*v/h);} main(){int u,v,h,l;scanf(“%d,%d”,&u,&v);h=hcf(u,v);printf(“H.C.F=%dn”,h);l=lcd(u,v,h);printf(“L.C.D=%dn”,l); } 8.2求方程根 #include float x1,x2,disc,p,q; greater_than_zero(a,b)float a,b;{ x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);} equal_to_zero(a,b)float a,b;{x1=x2=(-b)/(2*a);} smaller_than_zero(a,b)float a,b;{p=-b/(2*a);q=sqrt(disc)/(2*a);} main(){ float a,b,c;printf(“n输入方程的系数a,b,c:n”);scanf(“%f,%f,%f”,&a,&b,&c);printf(“n 方程是:%5.2f*x*x+%5.2f*x+%5.2f=0n”,a,b,c);disc=b*b-4*a*c;printf(“方程的解是:n”);if(disc>0){great_than_zero(a,b);printf(“X1=%5.2ftX2=%5.2fnn”,x1,x2);} else if(disc==0){ zero(a,b);printf(“X1=%5.2ftX2=%5.2fnn”,x1,x2);} else { small_than_zero(a,b,c);printf(“X1=%5.2f+%5.2fitX2=%5.2f-%2.2fin”,p,q,p,q);} } 8.3素数 #include“math.h” main(){int number;scanf(“%d”,&number);if(prime(number)) printf(“yes”);else printf(“no”);} int prime(number)int number;{int flag=1,n;for(n=2;n if(number%n==0) flag=0;return(flag);} 8.4 #define N 3 int array[N][N];convert(array)int array[3][3];{ int i,j,t; for(i=0;i for(j=i+1;j { t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t;} } main(){ int i,j;printf(“输入数组元素:n”);for(i=0;i for(j=0;j scanf(“%d”,&array[i][j];printf(“n数组是:n”);for(i=0;i { for(j=0;j printf(“%5d”,array[i][j]); printf(“n”);} convert(array);printf(“转置数组是:n”);for(i=0;i { for(j=0;j printf(“%5d”,array[i][j]); printf(“n”);} } 8.5 main(){ char str[100]; printf(“输入字符串:n”); scanf(“%s”,str); inverse(str); printf(“转换后的字符串是: %sn”,str);} inverse(str)char str[];{ char t;int i,j;for(i=0,j=strlen(str);i { t=str[i];str[i]=str[i-1];str[i-1]=t;} } 8.6 char concatenate(string1,string2,string);char string1[],string2[],string[];{ int i,j;for(i=0;string1[i]!='';i++) string[i]=string1[i];for(j=0;string2[j]!='';j++)string[i+j]=string2[j];string[i+j]='';} main(){ char s1[100],s2[100],s[100];printf(“n输入字符串1:n”);scanf(“%s”,s1);printf(“输入字符串2:n”);scanf(“%s”,s2);concatenate(s1,s2,s);printf(“连接后的字符串:%sn”,s);} 8.8 main(){ char str[80];printf(“请输入含有四个数字的字符串:n”);scanf(“%s”,str);insert(str);} insert(str) char str[];{ int i;for(i=strlen(str);i>0;i--){ str[2*i]=str[i]; str[2*i-1]=' '; } printf(“n 结果是:n %s”,str);} 8.9 #include“math.h” int alph,digit,space,others;main(){char text[80];gets(text);alph=0,digit=0,space=0,others=0;count(text);printf(“nalph=%d,digit=%d,space=%d,others=%dn”,alph,digit,space,others);} count(str)char str[];{int i;for(i=0;str[i]!='';i++) if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) alph++; else if(str[i]>='0'&&str[i]<='9') digit++; else if(strcmp(str[i],' ')==0) space++; else others++;} 8.10 int alphabetic(c);char c;{ if((c>='a' && c<='z'||(c>='A' && c<='Z'))return(1); else return(0);} int longest(string)char string[];{ int len=0,i,length=0,flag=1,place,point;for(i=0;i<=strlen(string);i++) if(alphabctic(string[i]))if(flag){ point=i;flag=0;} else len++;else { flag=1; if len>length) {length=len; place=point; len=0; } } return(place); } main(){ int i;char line[100]; printf(“输入一行文本n”);gets(line);printf(“n最长的单词是:”);for(i=longest(line);alphabctic(line[i]);i++)printf(“%c”,line[i];printf(“n”);} 8.11 #include #define N 10 char str[N];main(){ int i,flag;for(flag=1;flag==1;){ printf(“n输入字符串,长度为10:n”);scanf(“%s”,&str);if(strlen(str)>N)printf(“超过长度,请重输!”);else flag=0;} sort(str);printf(“n 排序结果:”);for(i=0;i printf(“%c”,str[i]);} sort(str)char str[N];{ int i,j;char t;for(j=1;j for(i=0;(i if(str[i]>str[i+1]) { t=str[i]; str[i]=str[i+1]; str[i+1]=t; } } 8.12 #include #include float solut(a,b,c,d)float a,b,c,d; {float x=1,x0,f,f1;do {x0=x; f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c; x=x0-f/f1; } while(fabs(x-x0)>=1e-5);return(x);} main(){float a,b,c,d;scanf(“%f,%f,%f,%f”,&a,&b,&c,&d);printf(“x=%10.7fn”,solut(a,b,c,d));} 8.13 #include main(){int x,n;float p();scanf(“%d,%d”,&n,&x);printf(“P%d(%d)=%10.2fn”,n,x,p(n,x));} float p(tn,tx)int tn,tx;{if(tn==0) return(1);else if(tn==1) return(tx);else return(((2*tn-1)*tx*p((tn-1),tx)-(tn-1)*p((tn-2),tx))/tn);} 8.14 #include “stdio.h” #define N 10 #define M 5 float score[N][M];float a_stu[N],a_cor[M];main(){int i,j,r,c;float h; float s_diff();float highest();r=0;c=1;input_stu();avr_stu();avr_cor();printf(“n number class 1 2 3 4 5 avr”);for(i=0;i {printf(“nNO%2d”,i+1); for(j=0;j printf(“%8.2f”,score[i][j]); printf(“%8.2f”,a_stu[i]); } printf(“nclassavr”);for(j=0;j printf(“%8.2f”,a_cor[j]);h=highest(&r,&c);printf(“nn%8.2f %d %dn”,h,r,c);printf(“n %8.2fn”,s_diff());} input_stu(){int i,j;float x;for(i=0;i {for(j=0;j {scanf(“%f”,&x); score[i][j]=x; } } } avr_stu(){int i,j;float s;for(i=0;i {for(j=0,s=0;j s+=score[i][j]; a_stu[i]=s/5.0; } } avr_cor(){int i,j;float s;for(j=0;j {for(i=0,s=0;i s+=score[i][j]; a_cor[j]=s/(float)N; } } float highest(r,c)int *r,*c;{float high;int i,j; high=score[0][0];for(i=0;i for(j=0;j if(score[i][j]>high) {high=score[i][j]; *r=i+1; *c=j+1; } return(high);} float s_diff(){int i,j;float sumx=0.0,sumxn=0.0;for(i=0;i {sumx+=a_stu[i]*a_stu[i]; sumxn+=a_stu[i]; } return(sumx/N-(sumxn/N)*(sumxn/N));} 8.15 #include #define N 10 void input_e(num,name)int num[];char name[N][8];{int i;for(i=0;i {scanf(“%d”,&num[i]); gets(name[i]); } } void sort(num,name)int num[];char name[N][8];{int i,j,min,temp1;char temp2[8];for(i=0;i {min=i; for(j=i;j if(num[min]>num[j])min=j; temp1=num[i]; num[i]=num[min]; num[min]=temp1; strcpy(temp2,name[i]); strcpy(name[i],name[min]); strcpy(name[min],temp2); } for(i=0;i printf(“n%5d%10s”,num[i],name[i]); } void search(n,num,name)int n,num[];char name[N][8];{int top,bott,min,loca;loca=0;top=0;bott=N-1;if((nnum[N-1])) loca=-1;while((loca==0)&&(top<=bott)) {min=(bott+top)/2; if(n==num[min]) {loca=min; printf(“number=%d,name=%sn”,n,name[loca]); } else if(n bott=min-1; else top=min+1; } if(loca==0||loca==-1) printf(“number=%d is not in tablen”,n);} main(){int num[N],number,flag,c,n;char name[N][8];input_e(num,name);sort(num,name);for(flag=1;flag;) {scanf(“%d”,&number); search(number,num,name); printf(“continue?Y/N!”); c=getchar(); if(c=='N'||c=='n') flag=0; } } 8.16 #include #define MAX 1000 main(){ int c,i,flag,flag1; char t[MAX]; i=0;flag=0;flag1=1;printf(“n输入十六进制数:”);while((c=getchar())!=''&&i { if c>='0' && c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F') {flag=1; t[i++]=c; } else if(flag){ t[i]='';printf(“n 十进制数%dn”,htoi(t));printf(“继续吗?”);c=getchar();if(c=='N'||c=='n') flag1=0;else {flag=0; i=0; printf(“n 输入十六进制数:”);} } } } htoi(s)char s[];{ int i,n; n=0; for(i=0;s[i]!='';i++) {if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0'; if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10; if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10; } return(n);} 8.17 #include void counvert(n)int n;{ int i;if((i=n/10)!=0) convert(i);putchar(n%10+'0');} main(){ int number; printf(“n 输入整数:”); scanf(“%d”,&number); printf(“n 输出是: ”); if(number<0) { putchar('-'); number=-number; } convert(number);} 8.18 main(){ int year,month,day; int days; printf(“n 请输入日期(年,月,日)n”); scanf(“%d,%d,%d”,&year,&month,&day); printf(“n %d年%d月%d日”,year,month,day); days=sum_day(month,day); if(leap(year)&&month>=3) days=days+1; printf(“是该年的%d天.n”,days);} static int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} int(sum_day(month,day)int month,day; { int i; for(i=1;i day+=day_tab[i]; return(day); } int leap(year)int year; { int leap; leap=year%4==0&&year%100!=0||year%400==0; return(leap); 第九章 编译预处理 9.1 #define SWAP(a,b)t=b;b=a;a=t main(){ int a,b,t;printf(“请输入两个整数 a,b:”);scanf(“%d,%d”,&a,&b);SWAP(a,b);printf(“交换结果为:a=%d,b=%dn”,a,b);} 9.2 #define SURPLUS(a,b)((a)%(b))main(){ int a,b;printf(“ 请输入两个整数 a,b:”);scanf(“%d,%d”,&a,&b);printf(“a,b相除的余数为:%dn”,SURPLUS(a,b)); } 9.3 #include #defin S(a,b,c)((a+b+c)/2)#define AREA(a,b,c)(sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(s(a,b,c)-c)))main(){ float a,b,c; printf(“请输入三角形的三条边:”); scanf(“%f,%f,%f”,&a,&b,&c); if(a+b>c && a+c>b && b+c>a) printf(“其面积为:%8.2f.n”,AREA(a,b,c)); else printf(“不能构成三角形!”);} 9.4 #define LEAP_YEAR(y)(y%4==0)&&(y%100!=0)||(y%400==0)main(){ int year;printf(“n请输入某一年:”);scanf(“%d”,&year);if(LEAP_YEAR(year)) printf(“%d 是闰年.n”,year);else printf(“%d 不是闰年.n”,year);} 9.5解:展开后: printf(“&#118alue=%formatt”,x);printf(“&#118alue=%formatt”,x);putchar('n');printf(“&#118alue=%formatt”);printf(“&#118alue=%formatt”,x2);putchar('n');输出结果: &#118alue=5.000000ormat &#118alue=5.000000ormat &#118alue=3.000000ormat &#118alue=8.000000ormat 9.8 main() { int a,b,c; printf(“请输入三个整数:”); scanf(“%d,%d,%d”,&a,&b,&c); printf(“三个之中最大值为:%dn”,max(a,b,c)); } max(x,y,z)int x,y,z; { int t; t=(x>y? x:y); return(t>z? t:z); } 9.10 #include #define MAX 80 #define CHANGE 1 main(){ char str[MAX];int i;printf(“请输入文本行:n”);scanf(“%s”,str); #if(CHANGE) { for(i=0;i { if(str[i]!='' if(str[i]>='a' && str[i]<'z' || str[i]>='A'&&str[i]<'Z') str[i]+=1; else if(str[i]=='z' || str[i]=='Z') str[i]-=25; } } #endif printf(“输出电码为:n%s”,str);} 第十章 指针 10.1 main(){int n1,n2,n3;int *p1,*p2,*p3;scanf(“%d,%d,%d”,&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2)swap(p1,p2);if(n1>n3)swap(p1,p3);if(n2>n3)swap(p2,p3);printf(“%d,%d,%dn”,n1,n2,n3);} swap(p1,p2)int *p1,*p2;{int p;p=*p1;*p1=*p2;*p2=p;} 10.2 main(){char *str1[20],*str2[20],*str3[20];char swap();scanf(“%s”,str1);scanf(“%s”,str2);scanf(“%s”,str3);if(strcmp(str1,str2)>0)swap(str1,str2);if(strcmp(str1,str3)>0)swap(str1,str3);if(strcmp(str2,str3)>0)swap(str2,str3); printf(“%sn%sn%sn”,str1,str2,str3);} char swap(p1,p2)char *p1,*p2;{char *p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 10.3 main(){int number[10];input(number);max_min_&#118alue(number);output(number);} input(number)int number[10];{int i;for(i=0;i<10;i++) scanf(“%d”,&number[i]);} max_min_&#118alue(number)int number[10];{int *max,*min;int *p,*end;end=number+10;max=min=number;for(p=number+1;p if(*p>*max)max=p; else if(*p<*min)min=p;*p=number[0];number[0]=*min;*min=*p;*p=number[9];number[9]=*max;*max=*p;return;} output(number)int number[10];{int *p;for(p=number;p printf(“%d,”,*p);printf(“%dn”,*p); } 10.4 main(){int number[20],n,m,i;scanf(“%d”,&n);scanf(“%d”,&m);for(i=0;i scanf(“%d”,&number[i]);move(number,n,m);for(i=0;i printf(“%8d”,number[i]);} move(array,n,m)int array[20],n,m;{int *p,end;end=*(array+n-1);for(p=array+n-1;p>array;p--) *p=*(p-1);*array=end;m--;if(m>0)move(array,n,m);} 10.5 #define nmax 50 main(){int i,k,m,n,num[nmax],*p;scanf(“%d”,&n);p=num;for(i=0;i *(p+i)=i+1;i=k=m=0;while(m {if(*(p+i)!=0)k++; if(k==3) {*(p+i)=0; k=0; m++; } i++; if(i==n)i=0; } while(*p==0)p++;printf(“%d”,*p);} 10.6 main(){int len;char *str[20];scanf(“%s”,str);len=length(str);printf(“nlen=%dn”,len);} length(p)char *p;{int n=0;while(*p!='') {n++;p++;} return(n);} 10.7 main(){int m;char *str1[20],*str2[20];scanf(“%s”,str1);scanf(“%d”,&m);if(strlen(str1) printf(“error”);else {copystr(str1,str2,m); printf(“%s”,str2); } } copystr(p1,p2,m)char *p1,*p2;int m;{int n=0;while(n {n++;p1++;} while(*p1!='') {*p2=*p1; p1++; p2++; } *p2='';} 10.8 #include“stdio.h” main(){int cle=0,sle=0,di=0,wsp=0,ot=0,i; char *p,s[20];for(i=0;i<20;i++)s[i]=0;i=0;while((s[i]=getchar())!='n')i++;p=s;while(*p!='n') {if(*p>='a'&&*p<='z') ++sle; else if(*p>='A'&&*p<='Z') ++cle; else if(*p==' ') ++wsp; else if(*p>='0'&&*p<='9') ++di; else ++ot; p++; } printf(“sle=%d,cle=%d,wsp=%d,di=%d,ot=%dn”,sle,cle,wsp,di,ot);} 10.9 main(){int a[3][3],*p,i;for(i=0;i<3;i++) scanf(“%d,%d,%d”,a[i][0],a[i][1],a[i][2]);p=a;move(p);for(i=0;i<3;i++) printf(“%d %d %dn”,a[i][0],a[i][1],a[i][2]);} move(pointer)int *pointer;{int i,j,t;for(i=0;i<2;i++)for(j=i+1;j<3;j++) {t=*(pointer+3*i+j); *(pointer+3*i+j)=*(pointer+3*j+i); *(pointer+3*j+i)=t; } } 10.10 main() {int a[5][5],*p,i,j;for(i=0;i<5;i++)for(j=0;j<5;j++) scanf(“%d”,&a[i][j]);p=a;change(p);for(i=0;i<5;i++) {printf(“n”); for(j=0;j<5;j++) printf(“%8d”,a[i][j]); } } change(p)int *p;{int i,j,change;int *pmax,*pmin;pmax=p;pmin=p;for(i=0;i<5;i++) for(j=0;j<5;j++) {if(*pmax<*(p+5*i+j))pmax=p+5*i+j; if(*pmin>*(p+5*i+j))pmin=p+5*i+j; } change=*(p+12);*(p+12)=*pmax;*pmax=change;change=*p;*p=*pmin;*pmin=change;pmin=p+1;for(i=0;i<5;i++) for(j=0;j<5;j++) if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j;change=*(p+4);*(p+4)=*pmin;*pmin=change;pmin=p+1;for(i=0;i<5;i++) for(j=0;j<5;j++) if(((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;change=*(p+20);*(p+20)=*pmin;*pmin=change; pmin=p+1;for(i=0;i<5;i++) for(j=0;j<5;j++) if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20)) &&(*pmin>*(p+5*i+j)))pmin=p+5*i+j;change=*(p+24);*(p+24)=*pmin;*pmin=change;} 10.11 main(){int i;char *p,str[10][10];for(i=0;i<10;i++) scanf(“%s”,str[i]);p=str;sort(p);for(i=0;i<10;i++) printf(“%sn”,str[i]);} sort(p)char *p;{int i,j;char s[10],*smax,*smin;for(i=0;i<10;i++) {smax=p+10*i; for(j=i+1;j<10;j++) {smin=p+10*j; if(strcmp(smax,smin)>0) {strcpy(s,smin); strcpy(smin,smax); strcpy(smax,s); } } } } 10.12 #define MAX 20 main(){int i;char *pstr[10],str[10][MAX];for(i=0;i<10;i++) pstr[i]=str[i];for(i=0;i<10;i++) scanf(“%s”,pstr[i]);sort(pstr);for(i=0;i<10;i++) printf(“%sn”,pstr[i]);} sort(pstr)char *pstr[10];{int i,j;char *p;for(i=0;i<10;i++) {for(j=i+1;j<10;j++) {if(strcmp(*(pstr+i),*(pstr+j))>0) {p=*(pstr+i); *(pstr+i)=*(pstr+j); *(pstr+j)=p; } } } } 10.13 #include“math.h” main(){int n=20;float a,b,a1,b1,a2,b2,c,(*p)(),jiff();scanf(“%f,%f”,&a,&b);scanf(“%f,%f”,&a1,&b1);scanf(“%f,%f”,&a2,&b2);p=sin;c=jiff(a,b,n,p);printf(“sin=%fn”,c);p=cos;c=jiff(a1,b1,n,p);printf(“cos=%fn”,c);p=exp;c=jiff(a2,b2,n,p);printf(“exp=%fn”,c);} float jiff(a,b,n,p)float a,b,(*p)();int n;{int i; float x,f,h,area;h=(b-a)/n;x=a;area=0;for(i=1;i<=n;i++) {x=x+h; area=area+(*p)(x)*h; } return(area);} 10.14 main(){int i,n,num[20];char *p;scanf(“%d”,&n);for(i=0;i scanf(“%d”,&num[i]);p=num;sort(p,n);for(i=0;i printf(“%8d”,num[i]);} sort(p,m)char *p;int m;{int i;char change,*p1,*p2;for(i=0;i {p1=p+i; p2=p+(m-1-i); change=*p1; *p1=*p2; *p2=change; } } 10.15 main(){int i,j,*pnum,num[4];float score[4][5],aver[4],*psco,*pave;char course[5][10],*pcou;pcou=course[0];for(i=0;i<5;i++) scanf(“%s”,pcou+10*i);printf(“number”);for(i=0;i<5;i++) 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语言第八章答案.doc(范文模版)
第四篇:C语言设计谭浩强第三版的课后习题答案
第五篇:C语言程序设计教程课后习题答案