资源描述
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;数学函数的头文件是: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小时%d分钟”,h,m); printf第一个参数要尽量详细,这样可以提高输出结果的可读性,恰当好处的添加提示性信息,可以提高程序的质量。(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的功能是用户要通过键盘输入数据,赋值给各输入项。注意每个输入项前面必须要加&符号。%d与输入项的个数要一致,类型要匹配。%d与int一致,%f与float对应,%lf与double匹配,%c与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=(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。#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;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;#includemain() int a; printf(“enter a(a100):n”); scanf(“%d”,&a);printf(“a=%dn”,a);switch(a/10) case 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语句就彻底跳出switch语句体,转去执行switch 语句体后的语句。(3) default语句可有可无,位置无所谓,当switch后的表达式和所有case后的标号都不一致时,转去执行default语句,然后依次顺序执行default语句后其他的switch语句,直到遇到break语句,则彻底跳出switch 语句体。(4) break语句可出现在循环语句体和switch 语句体,目的是彻底跳出循环体和switch 语句体。(5) case和其后的标号之间必须要加空格。4-22编写程序,输入一位学生的生日(年:y0、月m0、日d0),并输入当前的日期(年:y1、月m1、日d1),输出该生的实际年龄。#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”,age);程序总结:(1) if(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;if(y=0) printf(“%d是一个偶数!n”,x);else printf(“%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;else max=c;elseif(bc) max=b; else max=c;printf(“max=%d”,max);程序总结:利用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=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中的较大值;三次比较后,c中的值就是三个数中最大的。(3) 现实生活中,交换两盆水必须要借助第三个盆子;在程序设计中,要想实现两个变量中值的交换,就必须借助第三个变量。4-25 对于以下函数:Y=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”,&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; else y=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 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编写程序,求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=-j;t=j*n;printf(“1-3+5-7+-99+101=%d”,s);程序总结:(1)循环结构可用循环语句来实现,循环语句有三种:while,do-while,for,循环语句的使用场合是:数之间有规律可循并且是重复执行某项操作。(2)本程序设计是正负数交替求和,所以必须单独定义一个变量,通过每次乘以-1,来实现正负交替。本题中的j就扮演了这个角色。(3) while语句简介:功能是可实现循环结构。While与其后的括号之间无空格,括号里的表达式只要是合法的表达式即可,不过关系表达式最为常见。While的管辖围是紧跟在其后的一条“C语句”(可以是单纯的一条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+101=%d”,s);程序总结:若程序中用到了数学函数,就必须把#include加上。5-18编写程序,求e的值,e1+1/1!+1/2!+1/3!+1/4!+(1)用for循环,计算前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);程序总结: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。5-19编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10个年号换一行,判断公元年是否为闰年的条件是:(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的作用就是累计闰年的个数,在所有的程序设计中,具有累计功能的变量都需要初始化为零。否则随机数会来捣乱,从而导致最后累计结果的无意义。(2) if(j%10=0)这是换行的一贯表示形式。(3) 语句printf(“n”);在程序的最后出现两次,这两次的作用是不一样的,前者实现的是每10个闰年换行一次。后者的功能是让黑屏上的press any key to continue 乖乖换行,从而提高程序输出结果的可读性。5-20编写程序,打印以下图形:* * * *#includemain() 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”);for(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代码值,每行输出三对。#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代码值有:数字字符0的ASCII值是48,字符a的ASCII值是65,字符A的ASCII值是97,字符的ASCII值是32,这4个特殊字符的ASCII值必须记住。其他的只要在它们的基础上递推就可以。(2) 在printf和scanf中所用到的%后的字母,取决于输入输出项在定义时所用的关键字。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(c=getchar()!=n),由于!=的优先级要高于=,所以导致运算顺序的改变,最终引起结果的错误。(5)putchar(n);的功能仍然是让黑屏上的press any key to continue 乖乖换行,从而提高程序输出结果的可读性。与printf(“n”);是完全等价的。(6)getchar()的功能是等待用户从键盘输入一个字符到存,它的功能决定了它的写法必须是赋给一个字符型的存变量,如本题的c=getchar()。6-20 请编写程序,输入一行数字字符(用回车结束),每个数字字符的前后都有空格。请编程,把这一行中的数字转换成一个整数。例如,若输入(代表Enter键):2 4 8 3 ,则输出整数:2483。#includemain()char ch,int i=0; while(ch=getchar()!=n)if(ch=0&ch=0&ch=9不能写成0=ch=0&ch=0&ch=9) 和i=i*10+ch-0是一体的,是一条语句。而while恰恰只需要对这一条语句负责,而不是对多条语句负责,所以花括号是多余的。(3)大家要格外注意i=i*10+ch-0;这条语句,这条语句是本程序的一大亮点。6-21 请编写程序统计输入的行数,用!号结束输入,!号所在的行不计入行数。#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 请编写输出以下图案的程序,图案的行数由输入的整数值确定(每行中字符之间没有空格)。A BBBCCCCCDDDDDDDEEEEEEEEE#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) 函数定义分为两部分,函数首部和函数体。结合本题,函数首部是int mymod(int a,int b),函数体是花括号的所有语句。(2) int mymod(int a,int b)中的int 是函数的返回值类型,return后的表达式是函数的返回值,所以int 类型的书写,是根据return后表达式的类型而定的,必须要保证两处的一致性。要是函数体中没有return语句,或是只有return这个单词,其后没有表达式,则认定为该函数没有返回值。那么函数首部中int 就要改写成void。要是函数首部省略函数的返回值类型,写成mymod(int a,int b)的形式,并不表示该函数没有返回值,而是系统默认该函数的返回值为int 类型。(3) int mymod(int a,int b)中的mymod是函数名,只要符合标识符的命名规则即可,尽量做到见名知义。(4) int mymod(int a,int b)中的a, b是该函数的两个形参。形参的个数取决于题目的实际需要,形参前的类型名一定不能少。(5) return s;语句的功能是把该被调用函数得到的结果返回调用函数。用return语句只能带回一个数据。要想返回多个数据,必须用到后面的知识点:传址。(6) %(取余运算符)是双目运算符,其左右的两个运算符必须都是整型数。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,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为0.5时,y2的值为166.75,y3的值为1.832721double 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;程序总结:本函数的设计思路是:在被调用函数中利用指针远程遥控,把三个数按从大到小的顺序排好,然后在调用函数中输出最大数a和最小数c。第9章9-27输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符0的个数,下标为1的元素统计字符1的个数,.#includemain()char ch; int num10=0;printf(“请输入一行字符:n”);while(c=getchar()!=n)if(ch=0&ch=9)numch-0+=1;for(i=0;i=0&ch=9,注意这个表达式的写法。千万不能写成0=ch=9。(2)int num10=0;因为num数组的功能是累加,所以在累加之前必须要清零。(3)注意语句numch-0+=1;进一步巩固数字字符转化为数字的算法:ch=ch-0。9-28编写函数,对具有10个整数的数组进行如下操作:从下标为0的元素开始直到最后一个元素,依次向前移动一个位置。输出移动后的结果。#includevoid move(int *w,int n)int i;for(i=n-1;i10;i+)wi=wi+1;main()int a10,n,i; printf(“给数组a赋值:n”); for(i=0;i10;i+) scanf(“%d”,ai);printf(“请输入n(0n10)的值:n”);scanf(“%d”,&n);move(a,n);for(i=0;i10;i+)printf(“%d ”,ai);程序总结:本题要求编写函数,而不是编写程序,所以大家只需把红色字体部分写上即可。9-29编写函数,把数组中所有奇数放在另一个数组中返回。#include#define M 100int fun(int *p,int *q,int n) int i,s=0; for(i=0;in;i+)if(pi%2!=0) *q=pi; q+; s+;return s;main()int aM,bM,i,j;printf(“给数组a赋值:n”);for(i=0;iM;i+) scanf(“%d”,&ai);j=fun(a,b,M);printf(“数组中的所有奇数为:n”);for(i=0;ij;i+)printf(“%d ”,bi);9-30 编写函数,对字符数组中的字母按由大到小的字母顺序进行排序。void arrsort(char *a,int n)int i,j,p;char t;for(j=0;jn-1;j+)p=j;for(i=j+1;iai) p=i;if(p!=j)t=aj;aj=ap;ap=t;第九章的其他编程题难度较大,不做要求。1. 若不给自己设限,则人生中就没有限制你发挥的藩篱。2. 若不是心宽似海,哪有人生风平浪静。在纷杂的尘世里,为自己留下一片纯静的心灵空间,不管是潮起潮落,也不管是阴晴圆缺,你都可以免去浮躁,义无反顾,勇往直前,轻松自如地走好人生路上的每一步3. 花一些时间,总会看清一些事。用一些事情,总会看清一些人。有时候觉得自己像个神经病。既纠结了自己,又打扰了别人。努力过后,才知道许多事情,坚持坚持,就过来了。4. 岁月是无情的,假如你丢给它的是一片空白,它还给你的也是一片空白。岁月是有情的,假如你奉献给她的是一些色彩,它奉献给你的也是一些色彩。你必须努力,当有一天蓦然回首时,你的回忆里才会多一些色彩斑斓,少一些苍白无力。只有你自己才能把岁月描画成一幅难以忘怀的人生画卷。34 / 34
展开阅读全文