C语言习题答案全解.ppt
C语言习题答案,第一章第三章第四章,第五章 第六章 第七章,第八章,第一章,1.51.6,1.5请参照本章例题,编写一个C程序,输出以下信息:*Very Good!*解:main()printf(*n);printf(n);printf(Very Good!n);printf(n);printf(*n);,for(i=0;i30;i+)printf(“*”);,循环语句,1.6编写一个程序,输入a b c三个值,输出其中最大者。解:main()int a,b,c,max;printf(请输入三个数a,b,c:n);scanf(%d,%d,%d,#include void main()int max(int x,int y);int a,b,c,d;scanf(“d,d,%d”,第三章,3.33.53.63.73.83.93.10,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个或若干个字符连接而成,用双引号把它们括起来,存储时自动在字符串最后加一个结束符号0.,3.6写出以下程序的运行结果:#include void main()char c1=a,c2=b,c3=c,c4=101,c5=116;printf(a%c _b%ctc%ct_abcn,c1,c2,c3);printf(tb%c_%cn,c4,c5);,A,N,P48 转义字符(一个制表区8位),解:程序的运行结果为:aa_bb_ _ _cc_ _ _ _ _ _abc _ _ _ _ _ _ _ A _ N,P364 ASCII码,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(“The key is%c%c%c%c%cn,c1,c2,c3,c4,c5);,P62 复合赋值运算符,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),P55 算术运算符,(除法运算符。如:)除号两边为整型则结果为整型(模运算符,或称求余运算符,两侧均应为整型数据,如:的值为)。正负号取决于被除数符号-的值为-,-(-)的值仍为-,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);,P57 自增自减运算符,i+与+i的区别:是先执行后,再使用的值;是先使用的值后,再执行。,解:结果:9,11,9,10,第四章,4.44.54.74.84.9,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.想得 到以下的输出格式和结果,请写出程序要求输出的结果,P76 格式字符,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,c1);printf(c2=%c or%d(ASCII)n,c2,c2);,结果如下: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),4.5请写出下面程序的输出结果.结果:57 _ _ 5 _ _ 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解:可按如下方式在键盘上输入:a=3 b=7 8.5 _ 71.82 A _ a,说明:在编程使用一个或多个scanf函数时,第一个输入行末尾输入的“回车”被第二个scanf函数吸收.因此在第二三个scanf函数的双引号后设一个空格以抵消上行输入的回车.如果没有这个空格,按上面输入数据会出错.,4.7用下面的scanf函数输入数据使a=10,b=20,c1=A,c2=a,x=1.5,y=-3.75,z=67.8,请问 在键盘上如何输入数据?scanf(%5d%5d%c%c%f%f%*f%f,运行时输入:_ _ _ 10 _ _ _ 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,4.9输入一个华氏温度,要求输出摄氏温度,公式为C=5/9(F-32),输出要有文字说明,取两位小数.解:main()float c,f;printf(请输入一个华氏温度:n);scanf(%f,第五章,5.45.55.65.7,5.85.95.10,5.4有三个整数a,b,c,由键盘输入,输出其中最大的数.main()int a,b,c;printf(请输入三个数:);scanf(%d,%d,%d,/*ab&ac*/,P99 if语句嵌套,P97 else if语句,方法2:使用条件表达式.main()int a,b,c,termp,max;printf(请输入 A,B,C:);scanf(%d,%d,%d,P102 条件运算符,条件运算符格式:表达式?表达式表达式 功能:判断表达式1的值,如果成立就执行表 达式2,否则就执行表达式3,5.5 main()int x,y;printf(输入x:);scanf(%d,5.6百分制成绩#includevoid main()float score;char grade;printf(“请输入学生成绩”);scanf(“%f”,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(“score=%d,grade=%cn”,score,grade);,default:grade=E;,main()long int num;int indiv,ten,hundred,housand,tenthousand,place;printf(请输入一个整数(0-99999):);scanf(%ld,5.7给一个不多于5位的正整数,要求:1.求它是几位数2.分别打印出每一位数字3.按逆序打印出各位数字.例如原数为321,应输出123.,switch(place)case5:printf(%d,%d,%d,%d,%d,tenthousand,thousand,hundred,ten,indiv);printf(n反序数字为:);printf(%d%d%d%d%dn,indiv,ten,hundred,thousand,tenthousand);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,%dn,hundred,ten,indiv);printf(n反序数字为:);printf(%d%d%dn,indiv,ten,hundred);break;case 2:printf(%d,%dn,ten,indiv);printf(n反序数字为:);printf(%d%dn,indiv,ten);break;case 1:printf(%dn,indiv);printf(n反序数字为:);printf(%dn,indiv);,5.8 1.if语句 main()long i;float bonus,bon1,bon2,bon4,bon6,bon10;bon1=100000*0.1;/*初始化变量*/bon2=100000*0.075+bon1;bon4=200000*0.05+bon2;bon6=200000*0.03+bon4;bon10=400000*0.015+bon6;printf(请输入利润);scanf(%ld,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;printf(请输入利润:);scanf(%ld,用switch语句编程序,5.9 输入四个整数,按大小顺序输出.main()int t,a,b,c,d;printf(请输入四个数:);scanf(%d,%d,%d,%d,5.10塔#include”stdio.h”#include”math.h”void main()int h=10;float x,y,x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,d1,d2,d3,d4;printf(请输入一个点(x,y):);scanf(%f,%f,第六章,6.16.26.36.46.56.6,6.76.86.96.106.146.15,6.1输入两个正数,求最大公约数最小公倍数.main()int a,b,num1,num2,temp;printf(请输入两个正整数:n);scanf(%d,%d,6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解:#include main()char c;int letters=0,space=0,degit=0,other=0;printf(请输入一行字符:n);while(c=getchar()!=n)if(c=a,6.3求s(n)=a+aa+aaa+aaa之值,其中a是一个数字.解:main()int a,n,count=1,sn=0,tn=0;printf(请输入a和n的值:n);scanf(%d,%d,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);,P43,p46数据范围,%f:以小数形式输出单,双精度数,隐含输出六位小数%e:以指数形式输出实数%g:选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0(了解),结果:2.561327e+18%f:2561327455189073920.000000%g:2.56133e+18,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+)/*计算1到100的和*/s1=s1+k;for(k=1;k=N2;k+)/*计算1到50各数平方和*/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;n1000;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);,运行结果:水仙花数是:153 370 371 407,#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;ij;i+)if(j%i)=0)if(j%i)=0)n+;s=s-i;switch(n)/*将每个因子赋给k0,k1k9*/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(n1)printf(%d,%d,k0,k1);if(n2)printf(,%d,k2);if(n3)printf(,%d,k3);if(n4)printf(,%d,k4);if(n5)printf(,%d,k5);if(n6)printf(,%d,k6);if(n7)printf(,%d,k7);if(n8)printf(,%d,k8);if(n9)printf(,%d,k9);printf(n);,6.7完数,方法二:此题用数组方法更为简单.main()static int k10;int i,j,n,s;for(j=2;j=1000;j+)n=-1;s=j;for(i=1;ij;i+)if(j%i)=0)n+;s=s-i;kn=i;/*将每个因子赋给k0,k1.k9*/if(s=0)printf(%d是一个完数,它的因子是:,j);for(i=0;in;i+)printf(%d,ki);printf(%dn,kn);,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;/*第n次落地时共经过的米数*/hn=hn/2;/*第n次反跳高度*/printf(第10次落地时共经过%f米 n,sn);printf(第10次反弹%f米.n,hn);,运行结果:第10次落地时共经过299.609375米第10次反弹0.097656米,6.10猴子吃桃 main()int day,x1,x2;day=9;x2=1;while(day0)x1=(x2+1)*2;x2=x1;day-;printf(桃子总数=%dn,x1);,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);,_ _ _*_ _*_*_*_ _*_ _ _*,_ _ _ _ _ _*_ _ _ _ _*_*_*_ _ _*_*_*_*_*_*_*_*_*_*_*_*_ _ _*_*_*_*_*_ _ _ _*_*_*_ _ _ _ _ _*_,for(j=0;j=(2-i)*2+1;j+,for(j=0;j=i*2+1;j+),printf(*);,printf(*);,6.14打印图案,6.15乒乓比赛 main()char i,j,k;/*i是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,第七章,7.17.27.37.57.67.8,7.107.117.127.137.147.15,7.1用筛选法求100之内的素数./*用筛选法求100之内的素数*/#include#define N 101 main()int i,j,line,aN;for(i=2;iN;i+)ai=i;for(i=2;isqrl(N);i+)for(j=i+1;jN;j+)if(ai!=0,7.2用选择法对10个数排序.#define N 10/*选择法排序.*/main()int i,j,min,temp,aN;printf(请输入十个数:n);/*输入数据*/for(i=0;iaj)min=j;temp=ai;ai=amin;amin=temp;printf(n排序结果如下:n);/*输出*/for(i=0;iN;i+)printf(%5d,ai);,7.3对角线和:/*计算矩阵对角线元素之和*/main()float a33,sum=0;int i,j;printf(请输入矩阵元素:n);for(i=0;i3;i+)for(j=0;j3;j+)scanf(%f,if(numberend)a10=number;else for(i=0;inumber)temp1=ai;ai=number;for(j=i+1;j11;j+)temp2=aj;aj=temp1;temp1=temp2;break;for(i=0;j11;i+)printf(a%6d,ai);,7.5将一个数组逆序存放。/*数组逆序存放*/#define N 5 main()int aN=8,6,5,4,1,i,temp;printf(n 初始数组:n);for(i=0;iN;i+)printf(%4d,ai);for(i=0;iN/2;i+)temp=ai;ai=aN-i-1;aN-i-1=temp;printf(n 交换后的数组:n);for(i=0;iN;i+)printf(%4d,ai);,7.6杨辉三角/*打印杨辉三角形*/#define N 11 main()int i,j,aNN;for(i=1;iN;i+)aii=1;ai1=1;,for(i=3;iN;i+)for(j=2;j=i-1;j+)aij=ai01j-1+ai-1j;for(i=1;iN;i+)for(j=1;j=i;j+)printf(%6d,aij;printf(n);printf(n);,7.8鞍点#define N 10/*查找鞍点*/#define M 10 main()int i,j,k,m,n,flag1,flag2,aNM,max,maxi,maxj;printf(n输入行数n:);scanf(%d,for(i=0;imax)max=aij;maxj=j;for(k=0,flag1=1;kakmax)flag1=0;if(flag1)printf(n第%d行,第%d列的%d是鞍点n,i,maxj,max);flag2=1;if(!flag2)printf(n 矩阵中无鞍点!n);,#include/*折半查找*/#define N 15 main()int i,j,number,top,bott,min,loca,aN,flag;char c;printf(输入15个数(aii-1)n);scanf(%d,7.9变量说明:top,bott:查找区间两端点的下标;loca:查找成功与否的开关变量.,while(flag)printf(请输入查找数据:);scanf(%d,7.10/*统计字符数*/main()int i,j,uppn,lown,dign,span,othn;char text380;uppn=lown=dign=span=othn=0;for(i=0;i=A,for(i=0;i3;i+)printf(%s=n,texti);printf(大写字母数:%dn,uppn);printf(小写字母数:%dn,lown);printf(数字个数:%dn,dign);printf(空格个数:%dn,span);printf(其它字符:%dn,othn);,7.11/*打印图案*/main()static char a5=*,*,*,*,*;int i,j,k;char space=;for(i=0;i5;i+)printf(n);for(j=1;j=3*i;j+)printf(%c,space);for(k=0;k5;k+)printf(%3c,ak);,运行结果:_ _*_ _*_ _*_ _*_ _*_ _ _ _ _*_ _*_ _*_ _*_ _*_ _ _ _ _ _ _ _*_ _*_ _*_ _*_ _*_ _ _ _ _ _ _ _ _ _ _*_ _*_ _*_ _*_ _*_ _ _ _ _ _ _ _ _ _ _ _ _ _*_ _*_ _*_ _*_ _*,/*打印图案*/main()int i,j,k;for(i=0;i=2;i+)for(j=0;ji;j+)printf(“_);for(k=0;k5;k+)printf(“*_”);printf(“n”);,运行结果:*_*_*_*_*_*_*_*_*_*_ _*_*_*_*_*_*_*_*_*_*_*_*_*_*,for(i=0;i=1;i+)for(j=0;j1-i;j+)printf(“_);for(k=0;k5;k+)printf(“*_”);printf(“n”);,7.12/*译电文*/main()int i,n;char ch80,tran80;printf(请输入字符:);gets(ch);printf(n密码是%c,ch);i=0;while(chi!=0)if(chi=A),7.13/*连接两个字符串(不用stract)*/main()char s180,s240;int i=0,j=0;printf(n请输入字符串1:);scanf(%s,s1);printf(n请输入字符串2:);scanf(%s,s2);while(s1i!=0)i+;while(s2j!=0)s1i+=s2j+;s1i=0;printf(n连接后字符串为:%s,s1);,7.14/*字符串比较*/#include main()int i,resu;char s1100,s2100;printf(请输入字符串1:n);gets(s1);printf(n 请输入字符串2:n);gets(s2);i=0;while(s1i=s2i),7.15/*字符串复制*/#include main()char from80,to80;int i;printf(请输入字符串);scanf(%s,from);for(i=0;i=strlen(from);i+)toi=fromi;printf(复制字符串为:%sn,to);,第八章,8.18.11,8.1(最小公倍数=u*v/最大公约数.)#include“stdio.h”void main()int hcf(int u,int v);int lcd(int u,int v,int h);int u,v,h,l;scanf(%d,%d,int hcf(int x,int y)int z;z=x%y;if(z!=0)for(;y%z!=0;)z=y%z;return z;return y;int lcd(int a,int b,int c)return(a*b/c);,#include“stdio.h”#include”string.h”#define N 10char strNvoid main()void sort(char);int i,flag;for(flag=1;flag=1;)printf(“input string:n”);scanf(“%s”,void sort(char str)int i,j;char t;for(j=1;jstri+1)t=stri;stri=stri+1;stri+1=t;,8.11”起泡法”对输入的 10个字符按从大到小顺序排序,有些以“”开头的特殊字符称为转义字符,n 换行t 横向跳格r 回车 反斜杠ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字,为便于记忆,可以这样理解:a+=b(其中a为变量,b为表达式)a+=b(将有下划线的“a+”移到“=”右侧)|_ a=a+b(在“=”左侧补上变量名a),格式控制符完整格式%-0 m.n l/h 格式字符,宽度和精度,输出数据长度修正符,输出数据类型,指定空位填0,左对齐输出,格式说明引导符号,else if 语句流程图,