1、C语言课后题编程答案C语言课后题编程答案所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程题掌握到第九章即可。希望大家通过课后的编程题熟悉典型的编程算 法,掌握基本的编程思路,注意编程细节。第3章3-17编写程序,把560分钟换算成用小时和分钟表示,然后进行输 出。#includemain()int h,m;h=560/60;m=560%60;printf( 560分钟可转换成%d小时%d分钟” ,h,m);程序总结:(1) 只要在程序中用到系统提供的库函数,必须把库函数所在的头 文件用#include命令包含进来。否则库函数的使用无效。输入输出库 函数的头文件是:stdioh;数学函数
2、的头文件是:mathh;字符处理函 数的头文件是:ctypeh;字符串处理函数的头文件是:stringh。(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小时%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 除以 %d 商%d 余%d ” ,a,b,m,n);程序总结:(1) printf(请输入两个整数:n”);这是一个提示信息,避免用户在看到 黑屏后不知所措。(2) scanf( %d%d ”,&a,&b); scanf的功能是用户要通
4、过键盘输入数据,赋值给各输入项。注意每个输入项前面必须要加 &符号。%d与输入项的个数要一致,类型要匹配。 %d与int 一致,%f与float对 应,lf与double匹配,%c与char对应。3-佃 编写程序,读入三个双精度数,求它们的平均值并保留此平均 值小数点后一位数,对小数点后第二位数进行四舍五入, 最后输出结果。#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+05;x=(int)x;x=x/10;printf( x=% 1lf”,x
5、);程序总结:(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。#includemain()int a,b,c,t;printf(请输入三个整数:n”;scanf( %d%d%d ”&a,&b,&c);printf(交换之前:a=%d,b=%d,c=%d ”a,b,c);t=a
6、;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;#include main() int a;printf( enter a(a100):n”; scanf( %d ”& a);printf( a=%dn”a); switch(a/10) case
7、 0:case 1:case 2:printf( m=1n”;break;case 3: printf( m=2n ”;break;case 4: printf( m=3n ”;break;case 5: printf( m=4n ”;break;default: printf( m=5n”;程序总结:(1)选择结构的实现除了使用if语句以外,还可以使用switch语句 来实现。(2) switch后的表达式和case后的标号的类型要一致,switch后的表达式直接决定了 switch语句体的执行入口。执行完入口的 case语句后,依次顺序往下执行,直到遇到 break语句就彻底跳出switc
8、h语句体,转去执行switch语句体后的语句。(3) default语句可有可无,位置无所谓,当switch后的表达式和所 有case后的标号都不一致时,转去执行 default语句,然后依 次顺序执行default语句后其他的switch语句,直到遇到break 语句,则彻底跳出switch语句体。(4) break语句可出现在循环语句体和 switch语句体内,目的是彻 底跳出循环体和switch语句体。(5) case和其后的标号之间必须要加空格。4-22编写程序,输入一位学生的生日(年: y0、月m0、日d0),并输入当前的日期(年:y1、月m1、日d1),输出该生的实际年龄。#inc
9、ludemain()int y0,m0,d0,y1,m1,d1,ageprintf(输入一位学生的生日:n”;scanf( %d%d%d ”&y0,&m0,&d0);printf(输入当前日期:n”;scanf( %d%d%d ”&y1,&m1,&d1);age=y1-y0;if(m1vm0|m0=m1 &d1d0)age-;printf( age=%dn”age);程序总结:(1)if(m1m0|m0=m1 &d0d1),在程序设计中,要学会用逻辑 与、或、非代替复杂的if语句嵌套。(2)在printf语句中,要尽量加上n,这样可以避免黑屏上的结束 语press any key to con
10、tinue出现在有价值的输出结果的后面, 而是换行输出。这样就提高了程序输出结果的可读性。(3)通过本设计,要加强对变量起名艺术性的认识。4-23编写程序,输入一个整数,打印出它是奇数还是偶数。#include main()int x,y;printf(请输入一个整数:n”scanf( %d ”& x);y=x%2;if(y=0)printf( %d 是一个偶数! n”x);elseprintf( %d 是一个奇数! n”x);程序总结:y=x%2;这是判断一个数是奇数还是偶数的一贯表示方式。计算机中 的等号是双等号,与数学中的等号不一样。4-24编写程序,输入a,b,c三个数,打印出最大者。
11、方法一:#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);程序总结:利用if-else的嵌套,可求出一组数的最大值和最小值。在 if-else的嵌套 中,要格外注意if和else的配对问题。配对的原则是:从最后一个 else开 始,寻找与其配对的if,找的原则是离else最近的还没有配对的if就是该 else的配对对象。if和else的配对一旦出问题,输出
12、结果全错。方法二:#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=b;b=c;c=t;printf(最大值为:d ”c);程序总结:(1) 方法一利用if-else的嵌套来进行程序设计,极易容易出错。而方法二采 用三个if语句的并列来实现,同样可以求出最大值。(2) 方法二算法分析:第一个if语句结束后,b中保存a和b中的较大值; 第二个if语句结束后,c中保存a和c中的较大值;第三个if语句结束 后,c中保存b和c中的
13、较大值;三次比较后,c中的值就是三个数中 最大的。(3) 现实生活中,交换两盆水必须要借助第三个盆子;在程序设计中,要想 实现两个变量中值的交换,就必须借助第三个变量。4-25对于以下函数:Y=x(-5vxv0),y=x-1(x=0),y=x+1(0vxvl0),编写程序,要求输入 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;prin
14、tf( y=%dn ”,y);(2)#includemain()int x,y;printf(请输入x的值:n”;scanf( %d ”& 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(
15、%d ”&x);if(x-5& x 0& x10) i=3;switch(i) case 1:y=x;printf( x=%d,y=%dn ”x,y);break;case 2: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编写程序,
16、求1-3+5-7+-99+101的值。方法一:#includemain()s=0;n=1;t=1;j=1;while(nv=101) s=s+t;n+=2; j=-j;t=j*n;printf( 1-3+5-7+ -99+10 %d ” ,s);程序总结:(1)循环结构可用循环语句来实现,循环语句有三种: while,do-while,for,循环语句的使用场合是:数之间有规律可循并且是重复执行某项操作。(2)本程序设计是正负数交替求和,所以必须单独定义一个变量,通过每次 乘以-1,来实现正负交替。本题中的j就扮演了这个角色。(3)while语句简介:功能是可实现循环结构。 While与其后的
17、括号之间无空格,括号里的表达式只要是合法的表达式即可,不过关系表达式最为常 见。While的管辖范围是紧跟在其后的一条“ C语句”(可以是单纯的一条 C语句,也可以是用花括号括起来的复合语句)。程序设计最忌讳死循环, 所以说循环体中必须要有使 while后表达式为假的趋势,这样才能正常的跳出循环体,从而避免死循环的出现。方法二:#include#includemain()int a,b,c,s;a=1;b=1;c=1;s=0;while(fabs(c)v=101)s+=c;b+=2;a=-a;c=a*b;printf( 1-3+5-7+ -99+10 %d ” ,s);程序总结:若程序中用到了
18、数学函数,就必须把 #include加上5-18 编写程序,求 e 的值,1+1/1!+1/2!+1/3!+1/4!+ (1)用for循环,计算前50項。用while循环,要求直至最后一项的值小于 10的-6次方。(1)方法一:#includemain() int m,n;float e=10,i=10,t;for(n=1;nv=50;n+)m=n;for(t=1 0;m=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=
19、1.0;a=1.0;c=0;for(b=1.0;匕50;匕+)e+=c;c=1.0/(a*b);a=a*b;printf( e=%f ”e);程序总结: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语言中表
20、示为1e-6。5-19编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10 个年号换一行,判断公元年是否为闰年的条件是:(1)公元年数如能被4整除,而不能被100整除,则是闰年。公元年数能被400整除也是闰年。#include main() int i,j=0;for(i=2000;iv=3000;i+) if(i%4=0&i%100!=0|i%400=0)printf( i=%d ”i);j+;if(j%10=0)printf( n”;printf( h ”;程序设计:(1) int i,j=0;这条语句中的j=0非常必要,因为j的作用就是累计闰年的个 数,在所有的程序设计中
21、,具有累计功能的变量都需要初始化为零。否则 随机数会来捣乱,从而导致最后累计结果的无意义。(2)if(j%10=0)这是换行的一贯表示形式。(3)语句printf( n”;在程序的最后出现两次,这两次的作用是不一样的,前者实现的是每10个闰年换行一次。后者的功能是让黑屏上的 press anykey to continue乖乖换行,从而提高程序输出结果的可读性。5-20编写程序,打印以下图形:*#include main() int i,j,k; for(i=3;i=0;i-) for(k=1;kv=i;k+) Printf( ”; for(j=0;jv7-i*2;j+) printf( “”
22、); printf( *”); for(i=4;i7;i+) for(k=4;kv=i;k+) printf( ”; for(j=3;jv=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代码值,每
23、行输出三对。#includemain()int n=0;char c;while(c=getchar()!=n n+;printf( ASCII=%d,c=%c ”,c,c);if(n%3=0)printf( tn);putchar( h);程序总结:(1)字符型数据在内存中保存的是与之相对应的 ASCII码值。大家要牢记的ASCII代码值有:数字字符 0的ASCII值是48,字符a的ASCII值是65,字符 A 的ASCII值是97,字符的ASCII 值是32,这4个特殊字符的ASCII值必须记住。其他的只要在它们 的基础上递推就可以。 在printf和scanf中所用到的%后的字母,取决于
24、输入输出项在定 义时所用的关键字。Int与%d对应,float与%f对应,double与%lf 对应,char与%c对应,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()外的这层括号忘掉,变成 while
25、(c=getchar()!=n ,由 于!=的优先级要高于=,所以导致运算顺序的改变,最终引起结果的 错误。(5)putchar( h;的功能仍然是让黑屏上的 press any key to continue乖 乖换行,从而提高程序输出结果的可读性。与 printf( n”;是完全等价的。(6)getchar()的功能是等待用户从键盘输入一个字符到内存, 它的功能决定了它的写法必须是赋给一个字符型的内存变量,如本题的c=getchar()。6-20请编写程序,输入一行数字字符(用回车结束),每个数字字符 的前后都有空格。请编程,把这一行中的数字转换成一个整数。例如, 若输入(代表Enter键
26、):2 4 8 3 ,则输出整数:2483。#includemain()char ch,int i=0;while(ch=getchar()!=n if(ch= 0 &ch=0&ch= &chv= 9)i=i*10+ch- ;红色标记的这对儿花括号是完全没有必要的,因为 if(ch=0&ch= 9)和 i=i*10+ch- 0是一体的,是一条语句。而while恰恰只需要对这一条语句负责,而不是对多条语句负责,所以 花括号是多余的。(3)大家要格外注意i=i*10+ch- 0这条语句,这条语句是本程序的一大 亮点。6-21请编写程序统计输入的行数,用!号结束输入,!号所在的行不 计入行数。#in
27、clude main()char ch;int i=0;while(ch=getchar()!=)if(ch=n i+;printf( %d ”,i);putchar( h;程序总结:本程序是要统计输入的行数,其实就是统计 n 出现的次数。6-22请编写程序统计输入的一行中小写字母的个数。#include main()char ch;int i=0;while(ch=getchar()!=n if(ch= a&ch=a&ch=不能写成av=chv=z。6-23请编写输出以下图案的程序,图案的行数由输入的整数值确定(每 行中字符之间没有空格)。ABBBCCCCCDDDDDDDEEEEEEEEE#includemain()int i,j,k,m,n;char ch;printf( Enter n:n”);scanf( %d ”&n);for(i=1;iv=n;i+)ch=A+i-1;m=2*i-1;for(k=n;k=i;k-)putchar( “”);for(j=1;j
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1