C语言课后题编程答案.docx
- 文档编号:6736215
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:20
- 大小:102.85KB
C语言课后题编程答案.docx
《C语言课后题编程答案.docx》由会员分享,可在线阅读,更多相关《C语言课后题编程答案.docx(20页珍藏版)》请在冰豆网上搜索。
C语言课后题编程答案
C语言课后题编程答案
所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程
题掌握到第九章即可。
希望大家通过课后的编程题熟悉典型的编程算
法,掌握基本的编程思路,注意编程细节。
第3章
3-17编写程序,把560分钟换算成用小时和分钟表示,然后进行输
出。
#include<>
main()
{inth,m;
h=560/60;
m=560%60;
printf(560分钟可转换成%d小时%d分钟”,h,m);
程序总结:
1)只要在程序中用到系统提供的库函数,必须把库函数所在的头
文件用#include命令包含进来。
否则库函数的使用无效。
输入输出库
函数的头文件是:
;数学函数的头文件是:
;字符处理函数的头文件是:
字符串处理函数的头文件是:
。
2)注意C语言中的“/”和“%”两种运算符。
“/”的运算结果取
决于两操作数的类型。
比如:
1/2=0(与数学中不同,结果与操作数
的类型一致,所以结果只取商值),2=(除之前2要自动类型转换成,
因为只有同类型的操作数才能进行除运算),1/=,=。
“%”的两个操
作数都必须是整数。
(3)printf(560分钟可转换成%d小时%d分钟”,h,m);printf第一
个参数要尽量详细,这样可以提高输出结果的可读性,恰当好处的添加提示性信息,可以提高程序的质量。
4)inth,m;变量起名要有艺术性,尽量做到见名知意。
3-18编写程序,输入两个整数,1500和350,求出它们的商和余数
并进行输出。
#include<>main(){inta,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编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。
#include<>main(){doublea,b,c,x;
printf(“请输入三个双精度数:
\n”);
scanf(“%lf%lf%lf”,&a,&b,&c);
x=(a+b+c)/3;
x=x*10;
x=x+;
x=(int)x;
x=x/10;
printf(“x=%.1lf”,x);
程序总结:
(1)doublea,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。
#include<>main()
{inta,b,c,t;
t=a;
a=c;
c=b;
b=t;
程序总结:
交换两个变量的值和三个变量的值,都需要借助另外一个变量。
第4章
4-21若a的值小于100,请将以下选择结构改写成由switch语句构成的选择结构。
if(a<30)m=1;
elseif(a<40)m=2;
elseif(a<50)m=3;
elseif(a<60)m=4;
elsem=5;
#include<>main()
{inta;
switch(a/10)
{case0:
case1:
程序总结:
1)选择结构的实现除了使用if语句以外,还可以使用switch语句
来实现。
(2)switch后的表达式和case后的标号的类型要一致,switch后的
case语句后,依次顺序往下执行,直到遇到break语句就彻底跳出switch语句体,转去执行switch语句体后的语句。
3)default语句可有可无,位置无所谓,当switch后的表达式和所
有case后的标号都不一致时,转去执行default语句,然后依次顺序执行default语句后其他的switch语句,直到遇到break
语句,则彻底跳出switch语句体。
4)break语句可出现在循环语句体和switch语句体内,目的是彻
底跳出循环体和switch语句体。
(5)case和其后的标号之间必须要加空格。
4-22编写程序,输入一位学生的生日(年:
yO、月m0、日dO),并
输入当前的日期(年:
y1、月m1、日d1),输出该生的实际年龄。
#include<>main()
{inty0,m0,d0,y1,m1,d1,age;
age=y1-y0;
if(m1 printf(“age=%d\n”,age); 程序总结: 1)if(m1 与、或、非代替复杂的if语句嵌套。 2)在printf语句中,要尽量加上\n,这样可以避免黑屏上的结束 语pressanykeytocontinue出现在有价值的输出结果的后面,而是换行输出。 这样就提高了程序输出结果的可读性。 3)通过本设计,要加强对变量起名艺术性的认识。 4-23编写程序,输入一个整数,打印出它是奇数还是偶数。 #include<>main(){intx,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三个数,打印出最大者。 方法一: #include<>main(){inta,b,c,max; printf(“请输入三个数: \n”); scanf(“%d%d%d”,&a,&b,&c); if(a>b) {if(a>c) max=a; else max=c; else{if(b>c) max=b; else max=c; printf(“max=%d”,max); 程序总结: 利用if-else的嵌套,可求出一组数的最大值和最小值。 在if-else的嵌套 中,要格外注意if和else的配对问题。 配对的原则是: 从最后一个else开 始,寻找与其配对的if,找的原则是离else最近的还没有配对的if就是该 else的配对对象。 if和else的配对一旦出问题,输出结果全错。 方法二: #include<> main() {inta,b,c,t; printf(“请输入三个数: \n”); scanf(“%d%d%d”,&a,&b,&c); 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; printf(“最大值为: %d”,c); 程序总结: 方法一利用if-else的嵌套来进行程序设计,极易容易出错。 而方法二采 用三个if语句的并列来实现,同样可以求出最大值。 2) 方法二算法分析: 第一个if语句结束后,b中保存a和b中的较大值; 第二个if语句结束后,c中保存a和c中的较大值;第三个if语句结束 后,c中保存b和c中的较大值;三次比较后,c中的值就是三个数中 最大的。 现实生活中,交换两盆水必须要借助第三个盆子;在程序设计中,要想 实现两个变量中值的交换,就必须借助第三个变量。 Y=x(-5 y的值。 分别用: (1)不嵌套的if语句 (2)嵌套的if语句(3)if-else语 句(4)switch语句 (1)#include<> main() {intx,y; printf(“请输入x的值: \n”); scanf(“%d”,&x); if(x==0)y=x-1; if(x>-5&&x<0)y=x; if(x>0&&x<10)y=x+1; printf(“y=%d\n”,y); (2)#include<> main(){intx,y; printf(“请输入x的值: \n”); scanf(“%d”,&x); if(x>-5) if(x<0) y=x; if(x>0) y=x+1; if(x==0) y=x-1; Printf(“y=%d\n”,y); (3)#include<> main(){intx,y; printf(“请输入x的值: \n”); scanf(“%d”,&x); if(x>-5&&x<0) y=x; elseif(x==0) y=x-1; else y=x+1; Printf(“y=%d\n”,y); (4)#include<> main(){intx,y,i; scanf(“%d”,&x); if(x>-5&&x<0)i=1; if(x==0)i=2; if(x>0&&x<10)i=3; switch(i){case1: y=x;printf(“x=%d,y=%d\n”,x,y);break; case2: y=x-1;printf(“x=%d,y=%d\n”,x,y);break; case3: y=x-1;printf(“x=%d,y=%d\n”,x,y); 程序总结: 对于这个程序设计我建议大家采用第一种方法,因为第一种方法是大众化 的思路,鉴于上机考试是机器阅卷,希望大家不要在上机试题上展现自己 的个性。 大家可以在平常练习中,尝试多种方法解决同一问题,这样可以 通过一个程序设计,巩固多个知识点。 第5章 5-17编写程序,求1-3+5-7+…-99+101的值。 方法一: #include<> main() {ints,n,t,j; 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<> #include<> main() {inta,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的值,1+1川+1/2! +1/3! +1/4! + (1)用for循环,计算前50项。 (2)用while循环,要求直至最后一项的值小于10的-6次方。 (1)方法一: #include<> main() {intm,n; floate=,i=,t; for(n=1;n<=50;n++) {m=n; for(t=;m>=1;m--) t=t*m; i=1/t; e=e+i; printf(“e=%f”,e); 程序总结: for(t=;m>=1;m--)t=t*m;实现的是阶乘的求法。 方法二: #include<> main(){floata,b,c,e; e=;a=;c=0; for(b=;b<50;b++){e+=c; c=(a*b); a=a*b; printf(“e=%f”,e); 程序总结: c=a*b;a=a*b;这两句是阶乘的另一种实现方法。 此算法的设计思路是: 1! *2=2! 2! *3=3! 3! *4=4! ……后一项的分母是前一项分母再乘以一个有规律的数。 (2)#include<> main() {floata=,b=,c=,e=; while(c>=1e-6){e+=c; b++; c=(a*b); a=a*b; printf(“e=%f\n”,e); 程序总结: 1乘以10的-6次方,在C语言中表示为1e-6。 5-19编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10 个年号换一行,判断公元年是否为闰年的条件是: (1)公元年数如能被4整除,而不能被100整除,则是闰年。 (2)公元年数能被400整除也是闰年。 #include<> main() {inti,j=0; for(i=2000;i<=3000;i++) {if(i%4==0&&i%100! =0||i%400==0) {printf(“i=%d”,i); if(j%10==0) printf(“\n”); printf(“\n”); 程序设计: (1)inti,j=0;这条语句中的j=0非常必要,因为j的作用就是累计闰年的个数,在所有的程序设计中,具有累计功能的变量都需要初始化为零。 否则随机数会来捣乱,从而导致最后累计结果的无意义。 (2)if(j%10==0)这是换行的一贯表示形式。 (3)语句printf(“\n”);在程序的最后出现两次,这两次的作用是不一样的,前者实现的是每10个闰年换行一次。 后者的功能是让黑屏上的pressanykeytocontinue乖乖换行,从而提高程序输出结果的可读性。 5-20编写程序,打印以下图形: * *** ******* ***** *** #include<> main() {inti,j,k; for(i=3;i>=0;i--) {for(k=1;k<=i;k++) Printf( for(j=0;j<7-i*2;j++) printf(“*” printf(“\n”); for(i=4;i<7;i++) {for(k=4;k<=i;k++) printf( for(j=3;j<=15-i*2;j++) printf(“*” printf(“\n”); 程序总结: 1、 (1)类似图形的设计是有规律可循的,比如此题: 空格的个数从上往 下依次是3、2、1、0、1、2、3,星号的个数从上往下依次是3、5、7、5、3、1,并且上下两部分是对称的。 (2)本题中for循环的控制条件很难想出来,大家只要把这个题记住就 可以,到时候稍微变一下型就可以。 第6章 6-19请编写程序,输入一行字符(用回车结束),输出每个字符以及与之 对应的ASCII代码值,每行输出三对。 #include<>main(){intn=0; charc; while((c=getchar())! ='\n') {n++; printf(“ASCII=%d,c=%c”,c,c); if(n%3==0) printf(“\n”); 程序总结: 记的ASCII代码值有: 数字字符''勺ASCII值是48,字符‘a’的 ASCII值是65,字符‘A'的ASCII值是97,字符‘’的ASCII 值是32,这4个特殊字符的ASCII值必须记住。 其他的只要在它们 的基础上递推就可以。 (2) (3) 在printf和scanf中所用到的%后的字母,取决于输入输出项在定 义时所用的关键字。 Int与%d对应,float与%f对应,double与%lf 对应,char与%c对应,longint与%ld对应,shortint与%hd对应。 本题中的语句charc;和printf(ASCII=%d,c=%c”c,c);貌似与⑵中 讲的理论相冲突,其实是可行的,由于字符型数据在内存中保存的 是与之相对应的ASCII码值,ASCII码值都是整型数,所以char 既可以与%c对应,也可以与%d对应。 4)注意语句while((c=getchar())! ='\n')中括号的用法,很多同学容易 把(c=getchar())外的这层括号忘掉,变成while(c二getchar()! ='n',由 于! =的优先级要高于=,所以导致运算顺序的改变,最终引起结果的 错误。 (5)putchar(\h'的功能仍然是让黑屏上的pressanykeytocontinue乖 乖换行,从而提高程序输出结果的可读性。 与printf(“\n”);是完全等 价的。 决定了它的写法必须是赋给一个字符型的内存变量,如本题的 c=getchar()。 6-20请编写程序,输入一行数字字符(用回车结束),每个数字字符 的前后都有空格。 请编程,把这一行中的数字转换成一个整数。 例如, 若输入(vCR>代表Enter键): 2483 2483。 #include<>main(){charch,inti=0; while((ch=getchar())! ='\n') if(ch>='0'&&ch<='9') i=i*10+ch-‘0'; printf(“%d”,i); putchar(‘\n'); 程序总结: 1)ch>='0'&&ch<='9'不能写成'0'<=ch<='9'。 数字字符转换成相 应的数字,程序实现为: ch=ch-‘0';大写字母转换成小写字母,程序 实现为: ch=ch-‘A'+'a';小写字母转换成大写字母,程序实现为: ch=ch-‘a+'A'。 {if(ch>='0'&&ch<='9') i=i*10+ch-‘0';} 红色标记的这对儿花括号是完全没有必要的,因为 if(ch>='0'&&ch<='9')和i=i*10+ch-‘0'是一体的,是一条语句。 而 while恰恰只需要对这一条语句负责,而不是对多条语句负责,所以 花括号是多余的。 3)大家要格外注意i=i*10+ch-‘0';这条语句,这条语句是本程序的一大 亮点。 6-21请编写程序统计输入的行数,用! 号结束输入,! 号所在的行不 计入行数。 #include<>main(){charch; inti=0; while((ch=getchar())! ='! '); if(ch=='\n')i++; printf(“%d”,i); putchar(‘\n'); 程序总结: 本程序是要统计输入的行数,其实就是统计'n'出现的次数。 6-22请编写程序统计输入的一行中小写字母的个数。 #include<>main(){charch; inti=0; while((ch=getchar())! ='\n') if(ch>='a'&&ch<='z') i++; printf(“%d”,i); putchar(‘\n'); 程序总结: ch>='a'&&ch<=z'不能写成''二chv二z'。 6-23请编写输出以下图案的程序,图案的行数由输入的整数值确定(每 行中字符之间没有空格)。 A BBB CCCCC DDDDDDD EEEEEEEEE #include<>main(){inti,j,k,m,n; charch; printf(“Entern: \n”); scanf(“%d”,&n); {ch='A'+i-1; m=2*i-1; for(k=n;k>=i;k--) putchar(“”); for(j=1;j<=m;j++) putchar(ch); printf(“\n”); 第7章 7-15编写函数intmymod(inta,intb)用以求a被b除之后的余数。 intmymod(inta,intb) {ints; s=a%b; returns;} 程序总结: 1)函数定义分为两部分,函数首部和函数体。 结合本题,函数首 部是intmymod(inta,intb),函数体是花括号内的所有语句。 2)intmymod(inta,intb)中的int是函数的返回值类型,return后 的表达式是函数的返回值,所以int类型的书写,是根据return 后表达式的类型而定的,必须要保证两处的一致性。 要是函数体中没有return语句,或是只有return这个单词,其后没有表达式,则认定为该函数没有返回值。 那么函数首部中int就要改写成void。 要是函数首部省略函数的返回值类型,写成 系统默认该函数的返回值为int类型。 intmymod(inta,intb)中的mymod是函数名,只要符合标识符的命名规则即可,尽量做到见名知义。 intmymod(inta,intb)中的a,b是该函数的两个形参。 形参的个数取决于题目的实际需要,形参前的类型名一定不能少。 returns;语句的功能是把该被调用函数得到的结果返回调用函 数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课后 编程 答案