C语言课后题编程答案.docx
《C语言课后题编程答案.docx》由会员分享,可在线阅读,更多相关《C语言课后题编程答案.docx(27页珍藏版)》请在冰豆网上搜索。
C语言课后题编程答案
C语言课后题编程答案
所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程
题掌握到第九章即可。
希望大家通过课后的编程题熟悉典型的编程算法,掌握基本的编程思路,注意编程细节。
第3章
3-17编写程序,把560分钟换算成用小时和分钟表示,然后进行输出。
#include
main()
{inth,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)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-佃编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结
果。
#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+0・5;
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;
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(a<30)m=1;
elseif(a<40)m=2;
elseif(a<50)m=3;
elseif(a<60)m=4;elsem=5;
#includemain()
{inta;
printf(entera(a<100):
\n”;scanf(%d”&a);
printf(a=%d\n”a);switch(a/10)
{case0:
case1:
case2:
printf(m=1\n”;break;
case3:
printf(m=2\n”;break;
case4:
printf(m=3\n”;break;
case5:
printf(m=4\n”;break;
default:
printf(m=5\n”;
}
}
程序总结:
(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),输出该生的实际年龄。
#include
main()
{inty0,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(m1vm0||m0==m1&&d1age--;
printf(age=%d\n”age);
}
程序总结:
(1)if(m1(2)在printf语句中,要尽量加上\n,这样可以避免黑屏上的结束语pressanykeytocontinue出现在有价值的输出结果的后面,而是换行输出。
这样就提高了程序输出结果的可读性。
(3)通过本设计,要加强对变量起名艺术性的认识。
4-23编写程序,输入一个整数,打印出它是奇数还是偶数。
#includemain()
{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);
}
程序总结:
(1)方法一利用if-else的嵌套来进行程序设计,极易容易出错。
而方法二采用三个if语句的并列来实现,同样可以求出最大值。
(2)方法二算法分析:
第一个if语句结束后,b中保存a和b中的较大值;第二个if语句结束后,c中保存a和c中的较大值;第三个if语句结束后,c中保存b和c中的较大值;三次比较后,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)#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)
if(x<10)
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;
printf(请输入x的值:
\n”;
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()
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与其后的括号之间无
空格,括号里的表达式只要是合法的表达式即可,不过关系表达式最为常见。
While的管辖范围是紧跟在其后的一条“C语句”(可以是单纯的一条C语句,也可以是用花括号括起来的复合语句)。
程序设计最忌讳死循环,所以说循环体中必须要有使while后表达式为假的趋势,这样才能正常的
跳出循环体,从而避免死循环的出现。
方法二:
#include
#include
main()
{inta,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);
}
程序总结:
若程序中用到了数学函数,就必须把#include加上
5-18编写程序,求e的值,1+1/1!
+1/2!
+1/3!
+1/4!
+…
(1)用for循环,计算前50項。
⑵用while循环,要求直至最后一项的值小于10的-6次方。
(1)方法一:
#include
main(){intm,n;
floate=1・0,i=1・0,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;实现的是阶乘的求法
方法二:
#include
main()
{floata,b,c,e;
e=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)#include
main()
{floata=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=%f\n”e);
}
程序总结:
1乘以10的-6次方,在C语言中表示为1e-6。
5-19编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10个年号换一行,判断公元年是否为闰年的条件是:
(1)公元年数如能被4整除,而不能被100整除,则是闰年。
⑵公元年数能被400整除也是闰年。
#includemain()
{inti,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)inti,j=0;这条语句中的j=0非常必要,因为j的作用就是累计闰年的个数,在所有的程序设计中,具有累计功能的变量都需要初始化为零。
否则随机数会来捣乱,从而导致最后累计结果的无意义。
(2)if(j%10==0)这是换行的一贯表示形式。
(3)语句printf(\n”;在程序的最后出现两次,这两次的作用是不一样的,
前者实现的是每10个闰年换行一次。
后者的功能是让黑屏上的pressany
keytocontinue乖乖换行,从而提高程序输出结果的可读性。
5-20编写程序,打印以下图形:
*
*****
*******
*****
#includemain(){inti,j,k;for(i=3;i>=0;i--){for(k=1;kv=i;k++)Printf(”;for(j=0;jv7-i*2;j++)printf(“”);printf(*”);
}for(i=4;i<7;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代码值,每行输出三对。
#include
main()
{intn=0;
charc;
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中所用到的%后的字母,取决于输入输出项在定义时所用的关键字。
Int与%d对应,float与%f对应,double与%lf对应,char与%c对应,longint与%ld对应,shortint与%hd对应。
(3)本题中的语句charc和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(\h';的功能仍然是让黑屏上的pressanykeytocontinue乖乖换行,从而提高程序输出结果的可读性。
与printf(\n”;是完全等
价的。
(6)getchar()的功能是等待用户从键盘输入一个字符到内存,它的功能
决定了它的写法必须是赋给一个字符型的内存变量,如本题的
c=getchar()。
6-20请编写程序,输入一行数字字符(用回车结束),每个数字字符的前后都有空格。
请编程,把这一行中的数字转换成一个整数。
例如,若输入(代表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(\h);
}
程序总结:
(1)ch>='0‘&&ch<=9不能写成)'v=chv='9)。
数字字符转换成相
应的数字,程序实现为:
ch=ch-0);大写字母转换成小写字母,程序实现为:
ch=ch-A'+))小写字母转换成大写字母,程序实现为:
ch=ch-a+'A'。
(2)while((c=getchar())!
='\n)
{if(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请编写程序统计输入的行数,用!
号结束输入,!
号所在的行不计入行数。
#includemain()
{charch;
inti=0;
while((ch=getchar())!
=)'
if(ch=='n'i++;
printf(%d”,i);
putchar(\h';
}
程序总结:
本程序是要统计输入的行数,其实就是统计'n'出现的次数。
6-22请编写程序统计输入的一行中小写字母的个数。
#includemain()
{charch;
inti=0;
while((ch=getchar())!
='\n'
if(ch>='a'&&ch<=''
i++;
printf(%d”,i);
putchar(\h‘);
}
程序总结:
ch>='a‘&&ch<=''不能写成'a'v=chv='z'。
6-23请编写输出以下图案的程序,图案的行数由输入的整数值确定(每行中字符之间没有空格)。
A
BBB
CCCCC
DDDDDDD
EEEEEEEEE
#include
main()
{inti,j,k,m,n;
charch;
printf(Entern:
\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