何钦铭版C语言第3章答案
- 格式:pdf
- 大小:551.87 KB
- 文档页数:15
第4章循环结构【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果是什么?为什么?如果将精度改为 10-3,运行结果有变化吗?为什么?解答:如果对item赋初值0,则程序运行结果是pi=0,因为item为0时不满足while 循环的执行条件,即不执行循环,故 pi 值为 0。
如果将精度改为 10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度变大使得while循环次数减少,必然影响到n的值。
【练习 4-2】运行例 4-2程序时,如果将最后一个输入数据改为-2,运行结果有变化吗?如果第一个输入数据是 -1,运行结果是什么?为什么?解答:如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是一结束标志,不进行统计,故任意一个负数都可以。
如果第一个输入数据是-1,运行结果是:Grade averageis 0,因为第一个输入就是-1,则while循环条件不成立,不执行循环体。
【练习4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数eps, 计算序列1-1/4+1/7-1/10+1/13-1/16+…的值,精确到最后一项的绝对值小于eps (保留6位小数)。
试编写相应程序。
解答:#include <stdio.h>#include <math.h>int main(void){int denominator, flag;double item, s,eps;printf(“Input eps:”);scanf(“%lf”,&eps);flag = 1;denominator = 1 ;item = 1.0;s = 0;while(fabs (item) >= eps) {item = flag * 1.0 / denominator;s = s + item;flag = -flag;denominator = denominator +3;}printf ( “s = %f\n”, s);return 0;}【练习4-4】如果将例4-3程序中的do-while语句改为下列while语句,会影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0){number = number / 10; count ++;}解答:会有影响,因为当输入数据 number 为 0时,上述 while 循环将不执行,count 值仍为 0,故输出为 0,不符合题目要求。
c语言程序设计谭浩强版何钦铭颜晖版习题答案全集【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++)/*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}-----------------------------------------------------------------------------【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
第三章计习题解答3.1 用C语言描述下列命题。
(1) a小于b或小于c。
(2) a和b都大于c。
(3) a和b中有一个小于c。
(4) a是非正整数。
(5) a是奇数。
(6) a不能被b整除。
(7) 角A在第一或第三象限。
(8) a是一个带小数的正数,而b是一个带小数的负数。
[解答](1)a<b || a<c(2)a>c && b>c(3)a<c && b>=c || a>=c && b<c(4)a==(int)a && a<=0(5)a%2==1(6)a%b!=0(7)0<fmod(A,2*PI) && fmod(A,2*PI)<PI/2 || PI<fmod(A,2*PI) && fmod(A,2*PI)<3*PI/2(其中PI=3.14159265为圆周率)(8)a-(int)a>0 && b-(int)b<03.2 写出下列表达式的值。
(1) 1<4 && 4<7(2) 1<4 && 7<4(3) !(2<=5)(4) !(1<3)||(2<5)(5) !(4<=6) && (3<=7)[解答](1) 1 (2) 0 (3) 0 (4) 1 (5) 03.3 若x=3,y=z=4,求下列表达式的值。
(1) (z>=y>=x)? 1:0(2) z>=y && y>=x[解答](1) 0 (2) 13.4 若x=3,y=2,z=1,求下列表达式的值。
(1) x<y? y:x(2) x<y? x++:y++(3) z+=(x<y?x++:y++)[解答](1) 3 (2) 2 (3) 33.5 写出下面程序段的输出结果。
《C语⾔程序设计》-何钦铭第⼀章引⾔1.2 程序与程序设计语⾔冯 · 诺依曼模型的存储程序概念:将程序与数据共同存储结构化的程序设计⽅法:将复杂程序划分为若⼲个相互独⽴的模块(⼀个模块可以是⼀条语句、⼀段程序或⼀个函数等)使完成每个模块的⼯作变得单纯⽽明确,在设计⼀个模块时不受其他模块的牵连。
同时,通过现有模块积⽊式的扩展就可以形成复杂的、更⼤的程序模块或程序1.3 C语⾔的发展历史与特点C语⾔的特点:(拥有底层操作能⼒)1.结构化语⾔2.易于移植3.简洁紧凑,使⽤⽅便灵活4.强⼤的处理能⼒5.⽣成的⽬标代码质量⾼,运⾏效率⾼第⼆章⽤C语⾔编写程序2.3 计算分段函数#include <stdio.h> //编译预处理指令程序运⾏时,⾸先从main函数开始运⾏%f指定输出时保留6位⼩数,%.2f则指定输出时保留2位⼩数循环体语句只能是⼀条语句(如果循环体语句由多条语句组成,必须⽤⼤括号把他们括起来,变成⼀条复合语句)整型数据的输出格式控制说明%md,指定了数据的输出宽度为m(包括符号位)。
若数据的实际位数(含符号位)⼩于m,左端补空格;若⼤于m,按实际位数输出实型数据的输出格式控制说明 %m.nf,指定了输出浮点型数据时保留n位⼩数,且输出宽度是m(包括符号位和⼩数点)。
若数据的实际位数(含符号位)⼩于m,左端补空格;若⼤于m,按实际位数输出f是针对浮点型数据⽽⾔,若输出数据为整型,则%m.nf应改为%md赋值运算符左边只能是⼀个变量第三章分⽀结构ch = getchar() //从键盘输⼊⼀个字符,并赋值给变量chputchar(输出参数); //输出参数是字符型变量或字符型常量第四章循环结构else和 if 的匹配准则:else与最靠近它的、没有与别的 else 匹配过的匹配do-while语句:循环条件需要在循环体中明确,且⾄少会执⾏⼀次循环体do {循环体语句} while (表达式);//判断⼀个数是否为素数#include <stdio.h>int main() {int i,m;printf("Enter a number:");scanf("%d", &m);for(i=2;i<=m/2;i++)if(m%i==0)break; //若m能被某个i整除,则m不是素数,提前结束循环if(i>m/2 && m!=1) //若循环正常结束,说明m不能被任何⼀个i整除printf("%d is a prime number! \n", m);elseprintf("No! \n");return 0;}break语句强制循环结束,不再执⾏循环体中位于其后的其他语句,break语句应该和if语句配合使⽤,即条件满⾜时,才执⾏break跳出循环;否则若break⽆条件执⾏,意味着永远不会执⾏循环体中break后⾯的其他语句continue语句:跳过循环体中continue后⾯的语句,继续下⼀次循环,continue语句⼀般也需要与if语句配合使⽤break语句和continue语句的区别在于,break结束循环,⽽continue跳过后⾯语句继续循环。
习题参考答案 习题一 1./*在C语言中,下列标识符中哪些是合法的,哪些不合法?”*/合法:total, _debug, Counter1, begin_不合法:Large&Tall2. /*写出流程图,求1~100中能被6整除的所有整数之和*/3./*写出源程序,求1~100中能被6整除的所有整数之和”。
*/#include<stdio.h>void main(){int sum=0, i;for(i=1; i<=100; i++)if( i%6==0) sum =sum+i;sum);printf(“sum=%d”,}4./*画流程图,判别整数n是否是素数*/习题参考答案 习题十1.选择题(1) A(2) C(由于p指向x, 等式p≡&x, *p≡x成立. 故&*p≡&x≡p)(3) B (int c[]={1, 7, 12}; → c[0]=1, c[1]=7, c[2]=12. 而k=c, 即k指向数组c的首元素c[0]。
printf(“…”, *++k); 输出参数*(++k)的值是*(k+1), 即c[1] )(4) D (对字符数组只能在定义的同时赋初值,但不能在定义之后再用‘=’赋值)(5) D(*p[3]是由3个整型指针组成的数组,p是数组名,代表该数组的基地址,是地址常量,不能对p赋值,故A,C错。
*p代表p[0]这个指针,a[0]是普通整型变量,两者不应互相赋值,故B错。
p[0]=&a[0]或p[0]=a,都是正确的,作用是令p[0]这个指针指向数组a的首元素a[0])(6) D ( 指针数组元素p[3]是一个指针,指向a[3*3]=a[9], 即*p[3]==a[9] 而二维数组元素p[3][2]= *(p[3]+2)=*(&a[9]+2)=*(&a[11])=a[11])2./*写输出结果*/(1) 3,2,5 # 3,3,4 #注: z是全局变量,它在p()中有效,但在main()中另有与它同名的局部变量,所以在main()中无效。
《C语⾔程序设计》第4版何钦铭、颜晖主编课后习题答案第2章 ⽤C语⾔编写程序Page 0201#include<stdio.h>//练习2-32int main(void)3{4 int i,j,k;5 for(int i=1;i<=4;i++)//第i⾏6 {7 for(int j=1;j<=i-1;j++)//j个空格8 {9 printf(" ");10 }11 for(k=1;k<=5-i;k++)//k个*12 {13 printf("* ");14 }15 printf("\n");16 }1718 return 0;19}Page 0231#include<stdio.h>2int main(void)3{4 int f,c;//练习2-55 f=150;6 c=5*(f-32)/9;//或者是c=5/9.0*(f-32)||c=5.0/9*(f-32),但不可以是5/9,会得到0.因为:两个整型数据做除法运算,结果⼀定是整数。
7 printf("华⽒温度%d对应的摄⽒温度为%d.\n",f,c);89 printf("\n");1011 /*计算物体⾃由下落的距离(练习2-6)*/12 int h,g,t;13 t=3;//下落时间14 g=10;//重⼒加速度 10m/s^215 h=g*t*t/2;16 printf("⼀个物体从100⽶的⾼空⾃由下落,前3秒内下落的距离为:%d⽶.\n",h);1718 return 0;19}20Page 0292#include<math.h>3int main(void)4{5 /*计算摄⽒温度(练习2-8)*/6 double c,f;7 printf("输⼊华⽒温度:");8 scanf("%lf",&f);9 c=5*(f-32)/9.0;10 printf("华⽒温度%.2lf对应的摄⽒温度为%.3lf\n",f,c);1112 printf("\n");1314 /*整数四则运算(练习2-9)*/15 int x,y,z_1,z_2,z_3;16 double z_4;17 printf("输⼊两个正整数x,y:");18 scanf("%d %d",&x,&y);19 z_1=x+y;20 z_2=x-y;21 z_3=x*y;22 z_4=x/y;23 printf("%d和%d的和为%d,差为%d,积为%d,商为%lf\n",x,y,z_1,z_2,z_3,z_4); 2425 printf("\n");2627 /*计算分段函数(判断x是否不为0)(练习2-10)*/28 double x_1,y_1;29 printf("输⼊x_1:");30 scanf("%lf",&x_1);31 if(x_1!=0)32 y_1=1/x_1;33 else y_1=0;34 printf("输⼊%.2lf时,对应的y值为%.1lf\n",x_1,y_1);3536 printf("\n");3738 /*计算分段函数(判断x是否⼩于0)(练习2-11)*/39 double x_2,y_2;40 printf("输⼊x_2:");41 scanf("%lf",&x_2);42 if(x_2<0)43 y_2=pow(1+x_2,2)+2*x_2+1/x_2;44 else y_2=sqrt(x_2);45 printf("输⼊%.2lf时,对应的y值为%.2lf\n",x_2,y_2);464748 printf("\n");4950 return 0;51}Page 0372int main(void)3{4 int i,n,flag;//例2-85 double t,sum;6 printf("输⼊⼀个正整数n:");7 scanf("%d",&n);8 sum=0;9 flag=1;10 for(i=1;i<=n;i++)11 {12 t=flag*(1.0/(2*i-1));13 sum+=t;14 flag=(-1)*flag;1516 }17 printf("sum=%lf\n",sum);1819 printf("\n");2021 /*求1+1/2+···的前n项和(练习2-13)*/22 int n_1,j;23 double sum_1=0;24 printf("Enter n_1(n_1>=0):");25 scanf("%d",&n_1);26 for(j=1;j<=n;j++)27 {28 sum_1+=1.0/j;29 }30 printf("sum_1=%.2lf\n",sum_1);3132 printf("\n");3334 /*求1+1/3+1/5+···的前n项和(练习2-14)*/35 int n_2,k;36 double sum_2;37 printf("Enter n_2:");38 scanf("%d",&n_2);39 for(k=1;k<=n_2;k++)40 {41 sum_2+=1.0/(2*k-1);42 }43 printf("sum_2=%.2lf\n",sum_2);4445 printf("\n");4647 /*求1-1/4+1/7-1/10+···的前n项和(练习2-15)*/48 int n_3,m,flag_1=1;49 double sum_3=0;50 printf("Enter n_3:");51 scanf("%d",&n_3);52 for(m=1;m<=n;m++)53 {54 sum_3+=flag_1*1.0/(3*m-2);55 flag_1=flag_1*(-1);56 }57 printf("sum_3=%.2lf\n",sum_3);5859 return 0;60}Page 0402#include<math.h>3int main(void)4{5 int n,i;6 double power;7 printf("Enter n:");8 scanf("%d",&n);9 printf("2的乘⽅表:\n");10 for(i=0;i<=n;i++)11 {12 power=pow(2,i);13 printf("2的%d次⽅为%.0lf\n",i,power);14 }1516 printf("\n");1718 /*3的乘⽅表(练习2-17)*/19 int m,j;20 double power_1;21 printf("Enter m:");22 scanf("%d",&m);23 for(j=0;j<=m;j++)24 {25 power_1=pow(3,j);26 printf("pow(3,%d)=%.lf\n",j,power_1);27 }2829 return 0;30}1#include<stdio.h>//练习2-182double fact(int n)3{4 int i;5 double product;6 product=1;7 for(i=1;i<=n;i++)8 {9 product*=i;10 }1112 return product;13}14int main(void)15{16 int n,m,i;17 double result_1,result_2,result_3,c;18 printf("输⼊两个正整数m和n(m<=n):");19 scanf("%d %d",&m,&n);20 for(i=0;i<=n;i++)21 {22 result_1=fact(i);23 }24 for(i=0;i<=m;i++)25 {26 result_2=fact(i);27 }28 for(i=0;i<=n-m;i++)29 {30 result_3=fact(i);31 }32 c=result_1/(result_2*result_3);33 printf("c=%.lf",c);3435 return 0;36}。