C语言课后题编程答案_第1页
C语言课后题编程答案_第2页
C语言课后题编程答案_第3页
C语言课后题编程答案_第4页
C语言课后题编程答案_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言课后题编程答案所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程题掌握 到第九章即可。 希望大家通过课后的编程题熟悉典型的编程算法, 掌握基本 的编程思路,注意编程细节。第3章3-17 编写程序,把 560 分钟换算成用小时和分钟表示,然后进行输出。#includemain()int h,m;h=560/60;m=560%60;printf( “560分钟可转换成d小时d分钟” ,h,m);程序总结:(1)只要在程序中用到系统提供的库函数,必须把库函数所在的头文件用 #include 命令包含进来。否则库函数的使用无效。输入输出库函数的头文 件是: stdio.h; 数学函数的头文

2、件是: math.h; 字符处理函数的头文件是: ctype.h; 字符串处理函数的头文件是: string.h 。(2)注意C语言中的“/”和“ %两种运算符。“/”的运算结果取决于两 操作数的类型。比如: 1/2=0(与数学中不同,结果与操作数的类型一致, 所以结果只取商值) , 1.0/2=0.5( 除之前 2 要自动类型转换成 2.0 ,因为 只有同类型的操作数才能进行除运算 ), 1/2.0=0.5,1.0/2.0=0.5 。“%”的 两个操作数都必须是整数。(3) printf( “560分钟可转换成d小时小分钟”,h,m); printf 第一个 参数要尽量详细, 这样可以提高输

3、出结果的可读性, 恰当好处的添加提示性 信息,可以提高程序的质量。( 4) int h,m; 变量起名要有艺术性,尽量做到见名知意。3-18 编写程序, 输入两个整数, 1500和 350,求出它们的商和余数并进行 输出。#includemain()int a,b,m,n;printf( “请输入两个整数 :n ” );scanf( “%d%”d ,&a,&b);m=a/b;n=a%b;printf(“d除以 %dW%小余%d ,a,b,m,n);程序总结:(1) printf( “请输入两个整数 :n ” ); 这是一个提示信息,避免用户在看到 黑屏后不知所措。( 2) scanf( “%d

4、%”d ,&a,&b); scanf 的功能是用户要通过键盘输入数据, 赋值给各输入项。注意每个输入项前面必须要加&符号。cK输入项的个数要一致,类型要匹配。 苗int 一致,%f与float对应,%lf与double匹配,。与char对应。3-19 编写程序, 读入三个双精度数, 求它们的平均值并保留此平均值小数 点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。#includemain()double a,b,c,x;printf( “请输入三个双精度数 :n ”);scanf( “%lf%lf%lf ”,&a,&b,&c);x=(a+b+c)/3;x=x*10;x=x+0.5;x

5、=(int)x;x=x/10;printf( “x=%.1lf ”,x);程序总结:(1) double a,b,c,x; 和 scanf( “%lf%lf%lf ”,&a,&b,&c); 有 直 接 联 系, %lf 与输入项 a,b,c 在定义时所用的类型 double 一致。(2) %.1lf, .1 的意思是结果仅保留小数点后一位小数。3-20 编写程序,读入三个整数给a、b、c,然后交换他们中的数,把a中 原来的值给b,把b中原来的值给c,把c中原来的值给a,然后输出a,b,c。main() int a,b,c,t;printf( “请输入三个整数: n ” );scanf( “%d

6、%d%”d,&a,&b,&c);printf( “交换之前: a=%d,b=%d,c=%”d ,a,b,c);t=a;a=c;c=b;b=t;printf( “交换之后: a=%d,b=%d,c=%”d ,a,b,c);程序总结: 交换两个变量的值和三个变量的值,都需要借助另外一个变量。第4章4-21 若 a 的值小于 100,请将以下选择结构改写成由 switch 语句构成的选 择结构。if(a30) m=1;else if(a40) m=2;else if(a50) m=3;else if(a60) m=4;else m=5;main() int a;printf( “ enter a(a

7、100):n ” ); scanf( “ %d”,&a);printf( “ a=%dn”,a);switch(a/10) case 0:case 1:case 2:printf(case 3: printf(case 4: printf(case 5: printf( default: printf( m=1n”);break;m=2n” );break;m=3n” );break;m=4n” );break;“m=5n”);程序总结:1)选择结构的实现除了使用 if 语句以外,还可以使用 switch 语句来实 现。2) switch 后的表达式和 case 后的标号的类型要一致, swi

8、tch 后的表达 式直接决定了 switch 语句体的执行入口。 执行完入口的 case 语句后, 依次顺序往下执行,直到遇到 break 语句就彻底跳出 switch 语句体, 转去执行 switch 语句体后的语句。( 3) default 语句可有可无,位置无所谓,当 switch 后的表达式和所有 case 后的标号都不一致时,转去执行 default 语句,然后依次顺序执行 default 语句后其他的 switch 语句,直到遇到 break 语句,则彻底跳 出 switch 语句体。( 4) break 语句可出现在循环语句体和 switch 语句体内,目的是彻底跳出 循环体和

9、switch 语句体。( 5) case 和其后的标号之间必须要加空格。4-22编写程序,输入一位学生的生日(年:y0、月m0日d0),并输入当 前的日期(年:y1、月ml日di),输出该生的实际年龄。#includemain()int y0,m0,d0,y1,m1,d1,age;printf( “输入一位学生的生日: n ”);scanf( “%d%d%”d,&y0,&m0,&d0);printf( “输入当前日期: n ”);scanf( “%d%d%”d,&y1,&m1,&d1);age=y1-y0;if(m1m0|m0=m1&d1d0)age-;printf( “age=%dn” ,a

10、ge); 程序总结 :( 1) i f(m1m0|m0=m1&d0d1,) 在程序设计中,要学会用逻辑与、或、 非代替复杂的 if 语句嵌套。( 2) 在 printf 语句中,要尽量加上 n ,这样可以避免黑屏上的结束语 press any key to continue 出现在有价值的输出结果的后面,而是换行输 出。这样就提高了程序输出结果的可读性。(3)通过本设计,要加强对变量起名艺术性的认识。4-23 编写程序,输入一个整数,打印出它是奇数还是偶数。#includemain()int x,y;printf( “请输入一个整数 :n ” )scanf( “%d” ,&x);y=x%2;i

11、f(y=0)printf(“c是一个偶数! n ”,x);elseprintf(“ d是一个奇数! n ” ,x);程序总结:y=x%2;这是判断一个数是奇数还是偶数的一贯表示方式。计算机中的等号是双等号,与数学中的等号不一样。4-24 编写程序,输入 a,b,c 三个数,打印出最大者。方法#includemain()int a,b,c,max;printf( “请输入三个数: n ” ); scanf( “%d%d%”d,&a,&b,&c); if(ab)if(ac)max=a;elsemax=c;elseif(bc)max=b;elsemax=c;printf( “max=%”d ,max

12、);程序总结:利用 if-else 的嵌套,可求出一组数的最大值和最小值。在 if-else 的嵌套中, 要格外注意 if 和 else 的配对问题。配对的原则是:从最后一个 else 开始,寻找 与其配对的 if ,找的原则是离 else 最近的还没有配对的 if 就是该 else 的配对对 象。 if 和 else 的配对一旦出问题,输出结果全错。方法二:#includemain()int a,b,c,t;printf( “请输入三个数: n ” );scanf( “%d%d%”d,&a,&b,&c);if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(bc)t=

13、b;b=c;c=t;printf( “最大值为: %d” ,c);程序总结:) 方法一利用 if-else 的嵌套来进行程序设计,极易容易出错。而方法二采用三 个 if 语句的并列来实现,同样可以求出最大值。) 方法二算法分析:第一个 if 语句结束后, b 中保存 a 和 b 中的较大值;第二个 if 语句结束后, c 中保存 a 和 c 中的较大值;第三个 if 语句结束后, c 中保存 b 和 c 中的较大值;三次比较后, c 中的值就是三个数中最大的。) 现实生活中,交换两盆水必须要借助第三个盆子;在程序设计中,要想实现两 个变量中值的交换,就必须借助第三个变量。25 对于以下函数:Y

14、=x(-5x0),y=x-1(x=0),y=x+1(0x10),编写程序, 要求输入 x 的值,输出 y 的值。分别用:(1)不嵌套的 if 语句( 2)嵌套的 if 语句( 3)if-else 语句(4) switch 语句(1) #includemain()int x,y;printf( “请输入 x 的值: n ” );scanf( “%d” ,&x);if(x=0)y=x-1;if(x-5&x0&x10)y=x+1;printf( “ y=%dn” ,y);(2) #includemain()int x,y;printf( “请输入 x 的值: n ” );scanf( “%d” ,&

15、x);if(x-5)if(x0)if(x10)y=x+1;if(x=0)y=x-1;Printf( “ y=%dn” ,y);(3) #includemain()int x,y;printf( “请输入 x 的值: n ” ); scanf( “%d” ,&x);if(x-5&x0)y=x;else if(x=0)y=x-1;elsey=x+1;Printf( “ y=%dn” ,y);(4) #includemain()int x,y,i;printf( “请输入 x 的值: n ” ); scanf( “%d” ,&x);if(x-5&x0&x10) i=3;switch(i)case 2

16、:y=x-1; printf(x=%d,y=%dn”,x,y);break;case 3:y=x-1; printf(x=%d,y=%dn”,x,y);程序总结:对于这个程序设计我建议大家采用第一种方法, 因为第一种方法是大众化的思路, 鉴于上机考试是机器阅卷,希望大家不要在上机试题上展现自己的个性。大家可 以在平常练习中,尝试多种方法解决同一问题,这样可以通过一个程序设计,巩 固多个知识点。第5章5-17编写程序,求1-3+5-7+-99+101的值方法一:#includemain()int s,n,t,j;s=0;n=1;t=1;j=1;while(n=101) s=s+t;n+=2;j=

17、-j;t=j*n;printf(“ 1-3+5-7+-99+10仁才,s);程序总结:(1) 循环结构可用循环语句来实现,循环语句有三种: while,do-while,for ,循环 语句的使用场合是:数之间有规律可循并且是重复执行某项操作。(2) 本程序设计是正负数交替求和, 所以必须单独定义一个变量, 通过每次乘以 -1 , 来实现正负交替。本题中的 j 就扮演了这个角色。(3) while 语句简介:功能是可实现循环结构。 While 与其后的括号之间无空格, 括号里的表达式只要是合法的表达式即可,不过关系表达式最为常见。 While 的 管辖范围是紧跟在其后的一条“ C语句”(可以是

18、单纯的一条C语句,也可以是用 花括号括起来的复合语句) 。程序设计最忌讳死循环, 所以说循环体中必须要有使 while 后表达式为假的趋势,这样才能正常的跳出循环体,从而避免死循环的出 现。方法二:#include#includemain() int a,b,c,s;a=1;b=1;c=1;s=0;while(fabs(c)=101)s+=c;b+=2;a=-a;c=a*b;printf( “ 1-3+5-7+-99+10仁才,s);程序总结:若程序中用到了数学函数,就必须把 #include 加上5-18 编写程序,求 e 的值,1+1/1!+1/2!+1/3!+1/4!+(1) 用 for

19、 循环,计算前 50 项。(2) 用 while 循环,要求直至最后一项的值小于 10的-6 次方(1) 方法一:#includemain()int m,n;float e=1.0,i=1.0,t;for(n=1;n=1;m-)t=t*m;i=1/t;e=e+i;printf( “e=%f” ,e);程序总结: for(t=1.0;m=1;m-) t=t*m;实现的是阶乘的求法。方法二:#includemain()float a,b,c,e; e=1.0;a=1.0;c=0;for(b=1.0;b50;b+)e+=c;c=1.0/(a*b);a=a*b;printf( “e=%f” ,e);程

20、序总结: c=1.0/a*b; a=a*b; 这两句是阶乘的另一种实现方法。此算法的设计思路是:1! *2=2 ! , 2! *3=3 ! , 3! *4=4 ! 后一项的分母是前一项分母再乘以一 个有规律的数。(2) #includemain()float a=1.0,b=1.0,c=1.0,e=1.0;while(c=1e-6) e+=c;b+;c=1.0/(a*b);a=a*b;printf( “e=%fn ”,e);程序总结:1乘以10的-6次方,在C语言中表示为1e-6。10 个年5- 19 编写程序,输出从公元 2000 年至 3000 年所有闰年的年号,每输出 号换一行,判断公元

21、年是否为闰年的条件是:(1) 公元年数如能被 4 整除,而不能被 100 整除,则是闰年。(2) 公元年数能被 400 整除也是闰年。#includemain() int i,j=0;for(i=2000;i=3000;i+) if(i%4=0&i%100!=0|i%400=0)printf( “i=%d” ,i);j+;if(j%10=0)printf(“n ”);printf( “n ”);程序设计:(1) int i,j=0; 这条语句中的 j=0 非常必要,因为 j 的作用就是累计闰年的个数, 在所有的程序设计中,具有累计功能的变量都需要初始化为零。否则随机数会来 捣乱,从而导致最后累

22、计结果的无意义。(2) if(j%10=0) 这是换行的一贯表示形式。(3) 语句 printf( “n ”); 在程序的最后出现两次, 这两次的作用是不一样的, 前 者实现的是每 10 个闰年换行一次。后者的功能是让黑屏上的 press any key to continue 乖乖换行,从而提高程序输出结果的可读性。5-20 编写程序,打印以下图形: *#include main() int i,j,k;for(i=3;i=0;i-) for(k=1;k=i;k+)Printf( “ ” );for(j=0;j7-i*2;j+)printf(“ * ” );printf( “ n ”);fo

23、r(i=4;i7;i+)for(k=4;k=i;k+)printf( “ ” );for(j=3;j=15-i*2;j+)printf(“ * ” );printf( “ n ” );程序总结:(1) 类似图形的设计是有规律可循的, 比如此题: 空格的个数从上往下依 次是 3、2、1、0、1、2、3,星号的个数从上往下依次是 1、3、5、7、5、 3、1,并且上下两部分是对称的。(2) 本题中 for 循环的控制条件很难想出来, 大家只要把这个题记住就可以,到时候稍微变一下型就可以。第6章6- 19 请编写程序,输入一行字符(用回车结束) ,输出每个字符以及与之对应的 ASCII 代码值,每行

24、输出三对。#includemain()int n=0;char c;while(c=getchar()!=n )n+;printf( “ASCII=%d,c=%c” ,c,c);if(n%3=0)printf(“n ”);putchar( n );程序总结:(1) 字符型数据在内存中保存的是与之相对应的 ASCII 码值。大家要牢记的ASCII代码值有:数字字符O的ASCII值是48,字符 a的ASCII值 是65,字符 A的ASCII值是97,字符的ASCII值是32,这4个 特殊字符的 ASCII 值必须记住。其他的只要在它们的基础上递推就可以。(2) 在 printf 和 scanf 中

25、所用到的 %后的字母,取决于输入输出项在定义时所 用的关键字。Int与小对应,float 与f对应,double 与lf对应,char 与。对应,long int与%ld对应,short int与hd对应。(3) 本题中的语句 char c;和 printf( “ASCII=%d,c=%C ,c,c);貌似与(2)中讲 的理论相冲突,其实是可行的,由于字符型数据在内存中保存的是与之相 对应的ASCII码值,ASCII码值都是整型数,所以char既可以与c对应, 也可以与d对应。(4) 注意语句 while(c=getchar()!=n ) 中括号的用法, 很多同学容易把(c=getchar()

26、 外的这层括号忘掉,变成 while(c=getchar()!= n ),由于! =的优先级要高于 =,所以导致运算顺序的改变,最终引起结果的错误。(5) putchar( n ); 的功能仍然是让黑屏上的 press any key to continue 乖 乖换行,从而提高程序输出结果的可读性。 与 printf(“n ”); 是完全等价的。(6) getchar() 的功能是等待用户从键盘输入一个字符到内存,它的功能决定 了它的写法必须是赋给一个字符型的内存变量,如本题的 c=getchar() 。6-20 请编写程序,输入一行数字字符(用回车结束) ,每个数字字符的前后 都有空格。请

27、编程,把这一行中的数字转换成一个整数。例如,若输入(代表 Enter 键): 2 4 8 3 , 则输出整数: 2483。#includemain()char ch,int i=0;while(ch=getchar()!= n )if(ch= 0 &ch= O &ch= 9不能写成O =ch= O &ch= O &ch= 9)和 i二i*1O+ch- O是一体的,是一条语句。而 while 恰恰只需要对这一条语句负责, 而不是对多条语句负责, 所以花括 号是多余的。( 3)大家要格外注意 i=i*1O+ch- O ; 这条语句,这条语句是本程序的一大亮点。6- 21 请编写程序统计输入的行数,

28、用!号结束输入, !号所在的行不计入行 数。#includemain() char ch;int i=0;while(ch=getchar()!=! );if(ch= n ) i+;printf(“ %d” ,i);putchar( n );程序总结 : 本程序是要统计输入的行数,其实就是统计 n 出现的次数。 6-22 请编写程序统计输入的一行中小写字母的个数。#includemain()char ch;int i=0;while(ch=getchar()!=n )if(ch= a&ch= a &ch= z 不能写成a =ch= z 。6-23 请编写输出以下图案的程序,图案的行数由输入的整

29、数值确定(每行中字符 之间没有空格)。 ABBBCCCCCDDDDDDDEEEEEEEEE#includemain()int i,j,k,m,n;char ch;printf( “ Enter n:n ”); scanf( “%d” ,&n);for(i=1;i=i;k- -) putchar( “ ” );for(j=1;j=m;j+)putchar(ch);printf( “n ”);第7章7- 15 编写函数 int mymod(int a,int b)用以求 a 被 b 除之后的余数。int mymod(int a,int b)int s;s=a%b;return s;程序总结:(1)

30、 函数定义分为两部分, 函数首部和函数体。 结合本题, 函数首部是 int mymod(int a,int b) ,函数体是花括号内的所有语句。( 2) i nt mymod(int a,int b) 中的 int 是函数的返回值类型, return 后的 表达式是函数的返回值,所以 int 类型的书写,是根据 return 后表 达式的类型而定的,必须要保证两处的一致性。要是函数体中没有 return 语句,或是只有 return 这个单词,其后没有表达式,则认定 为该函数没有返回值。 那么函数首部中 int 就要改写成 void 。要是函 数首部省略函数的返回值类型,写成 mymod(in

31、t a,int b) 的形式,并 不表示该函数没有返回值,而是系统默认该函数的返回值为 int 类 型。(3) i nt mymod(int a,int b)中的mymo(是函数名,只要符合标识符的命 名规则即可,尽量做到见名知义。(4) i nt mymod(int a,int b) 中的 a, b 是该函数的两个形参。形参的个数 取决于题目的实际需要,形参前的类型名一定不能少。( 5) return s; 语句的功能是把该被调用函数得到的结果返回调用函数。 用 return 语句只能带回一个数据。要想返回多个数据,必须用到后面的 知识点:传址。6) %(取余运算符) 是双目运算符, 其左右

32、的两个运算符必须都是整型数。7- 16 编写函数,根据整型形参 n 的值,计算如下公式的值:1-1/2+1/3-1/4+1/5-1/6+1/7float res(int n) int i=1;float e=0,m,j;for(j=1.0;j=n;j+)m=1/j;e+=i*m;i=-i;return e;程序总结:(1)要注意m=1/j;中的1/j,若是把j的类型定义成int类型的,只要1和 j( j 大于 1)进行整除运算, 统统为 0。只要把 j 的类型定义成 float 类 型 , 这 种 情 况 即 可 避 免 。 举 例 : 1/2=0, 而 1/2.0=0.5,1.0/2=0.5

33、,1.0/2.0=0.5, 运算结果的类型取决于两操作数 中较大的类型,双目运算符在运算之前,首先要统一两操作数的类型 (统一的原则请参看附录 5)。7-17编写函数,根据整型形参 m的值,计算如下公式的值:t=1-1/2*2-1/3*3-float fun(int m)float i,t=1,n;for(n=2;n=m;n+)i=-1/(n*n);t+=i;return t;7- 18编写函数用以求表达式x*x-5x+4的值,x作为参数传送给函数,调用 此函数求:y1=2*2-5*2+4y2=(x+15)*(x+15)+4y3=sinx*sinx-5*sinx+4y1的值为-2.0 ; x为

34、0.5时,y2的值为166.75 , y3的值为1.832721 double fun(double x)double y;y=x*x-5*x+4;return y;第8章8- 17 请编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并 通过形参传送回调用函数。Void fun(float a,float b,float *m,float *n)*m=a+b;*n=a-b;程序总结:本题的要求是在调用函数中传递两数到被调用函数, 在被调用函数中求出和 值和差值,然后传送到调用函数。显然 return 语句无能为力,因为 return 语句仅能返回一个数据。 像这样涉及到多个数据的传递的必须要用到传址运 算。8- 18 请编写函数,对传送过来的三个数选出最大数和最小数,并通过形参 传回调用函数。void fun(float *a,float*b,float *c)float t;if(*a*b)t=*a;*a=*b;*b=t;if(*a*c)t=*a;*a=*c;*c=t;if(*b*c)t=*b;*b=*c;*c=t; 程序总结:本函数的设计思路是:在被调用函数中利用指针远程遥控,把三 个数按从大到小的顺序排好,然后在调用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论