C语言内涵教程练习3参考答案.docx

上传人:b****8 文档编号:9707822 上传时间:2023-02-05 格式:DOCX 页数:14 大小:155.02KB
下载 相关 举报
C语言内涵教程练习3参考答案.docx_第1页
第1页 / 共14页
C语言内涵教程练习3参考答案.docx_第2页
第2页 / 共14页
C语言内涵教程练习3参考答案.docx_第3页
第3页 / 共14页
C语言内涵教程练习3参考答案.docx_第4页
第4页 / 共14页
C语言内涵教程练习3参考答案.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C语言内涵教程练习3参考答案.docx

《C语言内涵教程练习3参考答案.docx》由会员分享,可在线阅读,更多相关《C语言内涵教程练习3参考答案.docx(14页珍藏版)》请在冰豆网上搜索。

C语言内涵教程练习3参考答案.docx

C语言内涵教程练习3参考答案

练习3

3.1把下面的代数式改写成c语言表达式:

(1)ax3+bx2+d

(2)

(3)

(4)cos60°+8ey(5)

(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./180*60)+8*pow(e,y),其中cos和pow为库函数,注意:

cos函数的参数为弧度。

(5)1/2.0*(a*x+sin(3.)),其中sin为库函数,注意不能写成1/2*(a*x+sin(3.)),可参考3.3。

3.2把下面的C语言表达式还原成代数式:

(1)a/b/c*e*3

(2)exp(x*x/2)/sqrt(2*sin(30*3./180))

(3)sqrt(fabs(pow(x,y)+log(y)))(4)a*e/c/b*3

答案:

(1)

(2)

(3)

(4)

3.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)hi<<4+low(4)*p[3](5)*p++

(6)0

x||y++(8)x+y>0&&i++<0

答:

(1)(flag&(n!

=0))

(2)(c=(getchar()!

='\n'))

(3)(hi<<(4+low))

(4)(*(p[3]))

(5)(*(p++))

(6)((0

(7)((!

x)||(y++))

(8)(((x+y)>0)&&((i++)<0))

3.5试总结C语言操作符优先级的规律。

答:

1.单目操作符的优先级非常高(第二级)

2.算术运算操作符的优先级较高

3.赋值操作符的优先级倒数第二

4.逗号操作符的优先级最低

3.6写出下面程序的输出结果:

#include

voidmain()

{

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写出并分析下面程序的输出结果:

#include

voidmain()

{

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变为4

k=++i+1;//变量i自增1变为5,k=5+1

k=j---1;//k=3-1且变量j自减1变为2

k=--j-1;//变量j自减1变为1,k=1-1

3.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.1789

3.16分析下面的程序,写出用户输入235时的输出结果,并与例3-16比较。

#include

voidmain()

{

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

3.18读取一个三位数的正整数,按如下规则对此数加密,每位数字都用加7的和除以10的余数取代,再把第1位与第3位交换,最后输出加密后的数字(如输入235显示209;输入523,显示92)。

请编程实现。

3.19请编程把3.20中的加密数字解密。

(如输入209,显示235;输入92,显示523)

3.20指出下面程序中的错误:

#include

voidmain()

{

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给出下面程序的运行结果:

#include

voidmain()

{

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=(a+b+c)/2。

编程当输入三角形的三边长时,输出三角形的面积。

(提示用户输入的三边应能构成一个三角形)

答:

3.26

模拟了1+2+3+4+5的过程。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1