您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言内涵教程练习3参考答案
练习33.1把下面的代数式改写成c语言表达式:(1)ax3+bx2+d(2)ab-cd2a(3)acba(4)cos60°+8ey(5)12(ax+sinπ)答案:(1)a*x*x*x+b*x*x+d(2)(a*b–c*d)/(2*a)(3)a/(b+c/a)(4)cos(3.1415926/180*60)+8*pow(e,y),其中cos和pow为库函数,注意:cos函数的参数为弧度。(5)1/2.0*(a*x+sin(3.1415926)),其中sin为库函数,注意不能写成1/2*(a*x+sin(3.1415926)),可参考3.3。3.2把下面的C语言表达式还原成代数式:(1)a/b/c*e*3(2)exp(x*x/2)/sqrt(2*sin(30*3.1415926/180))(3)sqrt(fabs(pow(x,y)+log(y)))(4)a*e/c/b*3答案:(1)ebca3或bcae3(2)30sin222xe(3)yxyln(4)ebca3或bcae33.3求表达式1/2*(a*x+(b+x)/(4*a))的值。答:1/2的值为0,故整个表达式的值为0。3.4参考表3-1,根据操作符的优先级和结合性用加括号方式确定表达式的求值顺序,如a+=a+2的求值顺序可用加括号的方式表示为(a+=(a+2))。(1)flag&n!=0(2)c=getchar()!='\n'(3)hi4+low(4)*p[3](5)*p++(6)0nq(7)!x||y++(8)x+y0&&i++0答:(1)(flag&(n!=0))(2)(c=(getchar()!='\n'))(3)(hi(4+low))(4)(*(p[3]))(5)(*(p++))(6)((0n)q)(7)((!x)||(y++))(8)(((x+y)0)&&((i++)0))3.5试总结C语言操作符优先级的规律。答:1.单目操作符的优先级非常高(第二级)2.算术运算操作符的优先级较高3.赋值操作符的优先级倒数第二4.逗号操作符的优先级最低3.6写出下面程序的输出结果:#includestdio.hvoidmain(){charx=0xFFFF;printf(%d\n,x--);}答:分析:给字符型变量赋值时,如果字面量较大,则仅取一个字节,因此变量x的存储状态为8个1,当用%d解码时输出为-1.3.7inta=10时,求a-=a*=a+=a/=2的值,a的值为25时呢?答:a-=a*=a+=a/=2的求值顺序为(a-=(a*=(a+=(a/=2))))。a/=2为a=a/2,a=10时a/2为5,a/=2执行后a的值变为5,且子表达式的值为5。原表达式变为(a-=(a*=(a+=5)))。再化简为(a-=(a*=10))、(a-=100),最终变量a的值为0,整个表达式的值也为0。a的值为25时,(a-=(a*=(a+=(a/=2))))变为(a-=(a*=(a+=12)))、(a-=(a*=24))、(a-=576)),最终变量a的值为0,整个表达式的值也为0。3.8求下面表达式的值并编程验证结果。(1)-7/5(2)-7%5(3)7%-5(4)7/-5(5)-7/-5(6)-7%-5答:3.9对于整型变量i,求表达式(2*i+1)/2和表达式(2*i-1)/2的值。答:当变量i大于0时,表达式(2*i+1)/2的值为i,表达式(2*i-1)/2的值为i-1。当变量i小于0时,表达式(2*i+1)/2的值为i+1,表达式(2*i-1)/2的值为i。3.10计算下面表达式的值:(1)3/2+2.0(2)3/2.0+2(3)(float)3/2+2(4)float(3/2+2.0)(5)(4+1)/2+sqrt(9.0)*1.2/2+5.5(5)x%=7+7%5(其中x的值为12)(6)('z'-'a')%3+3.2(7)20000+20000-10000(int为2个字节时和4个字节时的值)答:(1)3/2+2.0=1+2.0=3.0(2)3/2.0+2=1.5+2=3.5(3)(float)3/2+2=1.5+2=3.5(4)(float)(3/2+2.0)=(float)(1+2.0)=3.0(5)(4+1)/2+sqrt(9.0)*1.2/2+5.5=2+1.8+5.5=9.3(5)x%=7+7%5(其中x的值为12)可改写为:x=x%(7+7%5)简化为x=12%9,求值后变量x的值为3,表达式的值也为3。(6)('z'-'a')%3+3.2=25%3+3.2=4.2(7)20000+20000-10000(int为2个字节时和4个字节时的值)int为2个字节时int为4个字节时3.11已知f为float型变量,分别求sizeof(f)、sizeof(f+2.3)、sizeof(f+2)、sizeof3.14和sizeof3.14f的值。答:注意:f+2的值为double型(这里VC的输出为4似乎有问题,如下所示,在TC中的输出为8),字面量3.14为double型,而字面量3.14f为float型。3.12-1+1U等于0吗?-2+1U等于几?-3+1U呢?答:当int为4个字节时,在VC中。因为-1+1U值的类型为无符号,所以应用格式字符串%u输出。3.13有unsignedshortui=3,uj=5时,表达式ui-uj等于几?有同学认为等于-2,因为编程验证时语句printf(%hd\n,ui-uj)的输出为-2。有同学认为表达式ui-uj的值是无符号型,它不可能等于-2。你的观点呢?当有shortk=-5时,表达式ui+k的值是多少呢?答:语句printf(%hd\n,ui-uj)的输出结果不能证明ui–uj的值为-2,因为printf函数只按格式字符串解码数据。表达式ui–uj中一个为无符号数,结果应该也为无符号数,但是由例3-4的讨论可知,由于算术运算时,“短整型”都要统一为int型,这个操作可能改变变量的类型,故原表达式的类型需要讨论,只有确定了类型之后,才能讨论它的值。在VC中,求值时unsignedshort要统一为4个字节的int型,统一后变量的类型也变成了有符号数,因此,表达式ui–uj的值为有符号整数,为-2。在TC中,int型为2个字节,unsignedshort类型可直接求值,表达式ui–uj的值为无符号数,为65534。在求ui–uj的值时,ui加uj的相反数,即–5的补码。当有shortk=-5时,表达式ui+k的求值过程与表达式ui–uj的类似。3.14写出并分析下面程序的输出结果:#includestdio.hvoidmain(){inti,j,k;i=j=k=3;k=i+++1;printf(%d,%d,,i,k);k=++i+1;printf(%d,%d\n,i,k);k=j---1;printf(%d,%d,,j,k);k=--j-1;printf(%d,%d\n,j,k);}答:k=i+++1;//k=3+1且变量i自增1变为4k=++i+1;//变量i自增1变为5,k=5+1k=j---1;//k=3-1且变量j自减1变为2k=--j-1;//变量j自减1变为1,k=1-13.15已知floatf=5.1739,求表达式(int)(f*100+0.5)/100、(int)(f*100+0.5)/100.0、(f*100+0.5)/100和(f*100+0.5)/100.0的值。答:(int)(f*100+0.5)/100=(int)517.89/100=517/100=5(int)(f*100+0.5)/100.0=517/100.0=5.17(f*100+0.5)/100=517.89/100=5.1789(f*100+0.5)/100.0=517.89/100.0=5.17893.16分析下面的程序,写出用户输入235时的输出结果,并与例3-16比较。#includestdio.hvoidmain(){intn,sum;printf(请输入一个三位数的正整数\n);scanf(%d,&n);/*用户输入235,变量n的值变为235*/printf((%d),n);/*输出变量n的值,屏幕上显示(235)*/sum=n/100;/*n/100为2,变量sum的值为2*/printf(%d+,sum);/*屏幕上显示(235)2+*/n=n%100;/*n%100为35,变量n的值变为35*/sum=sum+n/10;/*sum+n/10为2+3,变量sum的值变为5*/printf(%d+,n/10);/*屏幕上显示(235)2+3+*/n%=10;/*n%=10为n=n%10,变量n的值变为5*/sum+=n;/*sum+=n为sum=sum+n,变量sum的值变为10*/printf(%d=%d\n,n,sum);/*屏幕上显示(235)2+3+5=10*/}3.17输入二位数(如23)与四位数(如2352)时,分析例3-16的输出并上机验证。n的值为235时计算表达式n/100+(n/10-n/100*10)+n%100/10的值。答:n/100+(n/10-n/100*10)+n%100/10=2+(23–2*10)+35/10=2+3+3=83.18读取一个三位数的正整数,按如下规则对此数加密,每位数字都用加7的和除以10的余数取代,再把第1位与第3位交换,最后输出加密后的数字(如输入235显示209;输入523,显示92)。请编程实现。3.19请编程把3.20中的加密数字解密。(如输入209,显示235;输入92,显示523)3.20指出下面程序中的错误:#includestdio.hvoidmain(){intn,sum;printf(请输入一个自然数\n);scanf(%d,&n);sum=1/2*n*(n+1);printf(1+……+%d=%d\n,n,sum);}答:sum=1/2*n*(n+1);应改为sum=1.0/2*n*(n+1);或sum=0.5*n*(n+1);3.21编写程序,接收一个介于b~y的小写字母,输出该字母及与之前后相邻的字母,且输出时字母全部大写(如用户输入c时,程序输出BCD)。3.22编程交换两个float变量的值。3.23给出下面程序的运行结果:#includestdio.hvoidmain(){inta=3,b=5;printf(%d,%d\n,a,b);a=a+b;b=a-b;a=a-b;printf(%d,%d\n,a,b);}a=0x7fffffffb=3时,程序的输出是什么?答:3.24用3.23的方法改写例3-17。答:3.25已知三角形的三个边长为a、b、c,三角形面积area可以用海伦公式area=s(s-a)(s-b)(s-c)计算,其中s=(a+b+c)/2。编程当输入三角形的三边长时,输出三角形的面积。(提示用户输入的三边应能构成一个三角形)答:3.26模拟了1+2+3+4+5的过程。
本文标题:C语言内涵教程练习3参考答案
链接地址:https://www.777doc.com/doc-2907872 .html