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

付费下载

下载本文档

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

文档简介

C语言课后题编程答案

所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程题掌握到第

九章即可。希望大家通过课后的编程题熟悉典型的编程算法,掌握基本的编程

思路,注意编程细节。

第3章

3-17编写程序,把560分钟换算成用小时和分钟表示,然后进行输出。

#include<stdio.h>

main()

{inth,m;

h=560/60;

m=560%60;

printf(“560分钟可转换成%d小时%d分钟”,h,m);

)

程序总结:

(1)只要在程序中用到系统提供的库函数,必须把库函数所在的头文件用

ttinclude命令包含进来。否则库函数的使用无效。输入输出库函数的头文件是:

stdio.h;数学函数的头文件是:math.h;字符处理函数的头文件是:ctype.h;

字符串处理函数的头文件是:string.ho

(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<stdio.h>

main()

{inta,b,m,n;

printf(“请输入两个整数:\n");

scanf("%d%d”,&a,&b);

m=a/b;

n=a%b;

printf("%d除以%d商%(1余%(1”,a,b,m,n);

)

程序总结:

(1)printf(“请输入两个整数:\n");这是一个提示信息,避免用户在看到黑

屏后不知所措。

(2)scanf(a%d%dw,&a,&b);scanf的功能是用户要通过键盘输入数据,赋

值给各输入项。注意每个输入项前面必须要加&符号0%d与输入项的个数要一致,

类型要匹配。%d与int一致,%f与float对应,%lf与double匹配,%c与char

对应。

3-19编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点

后一位数,对小数点后第二位数进行四舍五入,最后输出结果。

#include<stdio.h>

main()

{doublea,b,c,x;

printf(“请输入三个双精度数:\n");

scanf(u%lf%lf%lfw,&a,&b,&c);

x=(a+b+c)/3;

x=x*10;

x=x+0.5;

x=(int)x;

x=x/10;

printf(ax=%.llfw,x);

)

程序总结:

(1)doublea,b,c,x;和scanf(,&a,&b,&c);有直接联系,%lf

与输入项a,b,c在定义时所用的类型double一致。

(2)%.Ilf,.1的意思是结果仅保留小数点后一位小数。

3-20编写程序,读入三个整数给a、b、c,然后交换他们中的数,把a中原来

的值给b,把b中原来的值给c,把c中原来的值给a,然后输出a,b,c。

#include<stdio.h>

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=%dv,a,b,c);

)

程序总结:

交换两个变量的值和三个变量的值,都需要借助另外一个变量。

第4章

4-21若a的值小于100,请将以下选择结构改写成由switch语句构成的选择结

构。

if(a<30)m=l;

elseif(a<40)m=2;

elseif(a<50)m=3;

elseif(a<60)m=4;

elsem=5;

#include<stdio.h>

main()

{inta;

printf(Mentera(a<100):\nw);

scanf(“%d”,&a);

printf("a=%d\n",a);

switch(a/10)

{case0:

case1:

case2:printf(;break;

case3:printf("m=2\n");break;

case4:printf(am=3\nw);break;

case5:printf("mF4\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编写程序,输入一位学生的生日(年:yO、月mO、日dO),并输入当前的

日期(年:yl>月ml、Hdl),输出该生的实际年龄。

ttinclude<st.dio.h>

main()

{intyO,mO,dO,yl,ml,dl,age;

printf(“输入一位学生的生日:\n”);

scanf(a%d%d%dw,&y0,&m0,&d0);

printf(“输入当前日期:\n”);

scanf(nd%d%dw,&yl,&ml,&dl);

age=yl-yO;

if(ml<mO||mO==ml&&dl<dO)

age——;

printf("age=%d\n",age);

)

程序总结:

(1)if(ml<mO||mO==mU&dO<dl),在程序设计中,要学会用逻辑与、或、非代

替复杂的if语句嵌套。

(2)在printf语句中,要尽量加上\n,这样可以避免黑屏上的结束语pressany

keytocontinue出现在有价值的输出结果的后面,而是换行输出。这样

就提高了程序输出结果的可读性。

(3)通过本设计,要加强对变量起名艺术性的认识。

4-23编写程序,输入一个整数,打印出它是奇数还是偶数。

#include<stdio.h>

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<stdio.h>

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<stdio.h>

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("最大值为:%dw,c);

)

程序总结:

方法一利用if-else的嵌套来进行程序设计,极易容易出错。而方法二采用三个

if语句的并列来实现,同样可以求出最大值。

方法二算法分析:第一个if语句结束后,b中保存a和b中的较大值;第二个if

语句结束后,c中保存a和c中的较大值;第三个if语句结束后,c中保存b和c

中的较大值;三次比较后,C中的值就是三个数中最大的。

现实生活中,交换两盆水必须要借助第三个盆子;在程序设计中,要想实现两个变

量中值的交换,就必须借助第三个变量。

5对于以下函数:

Y=x(-5a<0),y=xT(x=0),y=x+l(0<x<10),编写程序,要求输入x的值,输出y的值。

分别用:(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch

语句

(l)#include<stdio.h>

main()

{intx,y;

printf(“请输入x的值:\n");

scanf("%d",&x);

if(x==0)

y=x-l;

if(x>-5&&x<0)

y=x;

if(x>0&&x<10)

y=x+l;

printf(ay=%d\nw,y);

)

(2)#include<stdio.h>

mainO

{intx,y;

printf(“请输入x的值:\n");

scanf("%d",&x);

if(x>-5)

if(x<0)

y=x;

if(x>0)

if(x<10)

y=x+l;

if(x==0)

y=x-l;

Printf("y=%d\n",y);

)

(3)#include<stdio.h>

main()

{intx,y;

printf(“请输入x的值:\n");

scanf("%d",&x);

if(x>-5&&x<0)

y=x;

elseif(x==0)

y=x-l;

else

y=x+l;

Printf(“y=%d\n",y);

)

(4)#include<stdio.h>

main()

{intx,y,i;

printf(“请输入x的值:\n");

scanf("%d",&x);

if(x>-5&&x<0)i=l;

if(x==O)i=2;

if(x>0&ax<10)i=3;

switch(i)

{case1:y=x;printf("x=%d,y=%d\n”,x,y);break;

case2:y=x-l;printf("x=%d,y=%d\n”,x,y);break;

case3:y=x-l;printf(ux=%d,y=%d\nw,x,y);

)

)

程序总结:

对于这个程序设计我建议大家采用第一种方法,因为第一种方法是大众化的思路,鉴

于上机考试是机器阅卷,希望大家不要在上机试题上展现自己的个性。大家可以在平

常练习中,尝试多种方法解决同一问题,这样可以通过一个程序设计,巩固多个知识

点。

第5章

5-17编写程序,求1-3+5-7+--99+101的值。

方法一:

#include<stdio.h>

main()

{ints,n,t,j;

s=0;

n=l;

t=l;

J=l;

while(n<=101)

{s=s+t;

n+=2;

j=-j;

t=j*n;

)

printf("1-3+5-7+・・・-99+101=%(1”,s);

)

程序总结:

⑴循环结构可用循环语句来实现,循环语句有三种:while,do-while,for,循环语

句的使用场合是:数之间有规律可循并且是重复执行某项操作。

(2)本程序设计是正负数交替求和,所以必须单独定义一个变量,通过每次乘以-1,

来实现正负交替。本题中的j就扮演了这个角色。

(3)while语句简介:功能是可实现循环结构。While与其后的括号之间无空格,括

号里的表达式只要是合法的表达式即可,不过关系表达式最为常见。While的管辖范

围是紧跟在其后的一条“C语句”(可以是单纯的一条C语句,也可以是用花括号括起

来的复合语句)。程序设计最忌讳死循环,所以说循环体中必须要有使While后表达

式为假的趋势,这样才能正常的跳出循环体,从而避免死循环的出现。

方法二:

#include<stdio.h>

#include<math.h>

mainO

{inta,b,c,s;

a=l;b=l;c=l;s=O;

while(fabs(c)<=101)

{s+=c;

b+=2;

a=-a;

c=a*b;

)

printf(wl-3+5-7+--99+101=%dw,s);

)

程序总结:

若程序中用到了数学函数,就必须把和慎1鼠6<皿珀,h>加上。

5-18编写程序,求e的值,e^l+l/l!+l/2!+l/3!+l/4!+-

(1)用for循环,计算前50项。

(2)用while循环,要求直至最后一项的值小于10的-6次方。

(1)方法一:

#include<stdio.h>

mainO

{intm,n;

floate=l.0,i=l.0,t;

for(n=l;n<=50;n++)

{m=n;

for(t=l,0;m>=l;m-)

i=l/t;

e=e+i;

)

printf("e=%f”,e);

}

程序总结:for(t=l.0;m>=l;m-)叫实现的是阶乘的求法。

方法二:

#include<stdio.h>

mainO

{floata,b,c,e;

e=l.0;a=l.0;c=0;

for(b=L0;b<50;b++)

{e+=c;

c=l.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<stdio.h>

main()

{floata=l.0,b=l.0,c=l.0,e=l.0;

while(c>=le-6)

{e+=c;

b++;

c=l.0/(a*b);

a=a*b;

)

printf(we=%f\nw,e);

)

程序总结:1乘以10的-6次方,在C语言中表示为le-6。

5-19编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10个年号换

一行,判断公元年是否为闰年的条件是:

(D公元年数如能被4整除,而不能被100整除,则是闰年。

(2)公元年数能被400整除也是闰年。

#include<stdio.h>

main()

{inti,j=0;

for(i=2000;i<=3000;i++)

{if(i%4==0&&i%100!=01|i%400==0)

{printf("i=%d",i);

j++;

)

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编写程序,打印以下图形:*

***

*7^

»

*T*«T^*T**T'

*T"^7^*1•*|w*1"

***

*

#include<stdio.h>

mainO

{inti,j,k;

for(i=3;i>=0;i—)

{for(k=l;k<=i;k++)

Printf("”);

for(j=0;j<7-i*2;j++)

printf("*");

printf(u\n");

)

for(i=4;i<7;i++)

{for(k=4;k<=i;k++)

printf("”);

for(j=3;j<=15-i*2;j++)

printf(“*");

printf(a\n");

)

程序总结:

(1)类似图形的设计是有规律可循的,比如此题:空格的个数从上往下依次

是3、2、1、0、1、2、3,星号的个数从上往下依次是1、3、5、7、5、3、

1,并且上下两部分是对称的。

(2)本题中for循环的控制条件很难想出来,大家只要把这个题记住就可以,

到时候稍微变一下型就可以o

第6章

6-19请编写程序,输入一行字符(用回车结束),输出每个字符以及与之对应的ASCII

代码值,每行输出三对。

#include<stdio.h>

main()

{intn=0;

charc;

while((c=getchar())!=,\n')

{n++;

printf(aASCII=%d,c=%cw,c,c);

if(n%3=0)

printf(“\n”);

)

putchar('\n');

)

程序总结:

(1)字符型数据在内存中保存的是与之相对应的ASCII码值。大家要牢记的ASCH

代码值有:数字字符'0'的ASCII值是48,字符'a,的ASCH值是65,字

符的ASCII值是97,字符''的ASCII值是32,这4个特殊字符的ASCII

值必须记住。其他的只要在它们的基础上递推就可以。

(2)在printf和scanf中所用到的%后的字母,取决于输入输出项在定义时所用的

关键字。1成与%(1对应,float与%£对应,double与%1£对应,char与祝对

应,longint与%16对应,shortint与姑(1对应。

(3)本题中的语句charc;和printf("ASCII=%d,c=%c",c,c);貌似与⑵中讲的

理论相冲突,其实是可行的,由于字符型数据在内存中保存的是与之相对应的

ASCII码值,ASCII码值都是整型数,所以char既可以与猊对应,也可以与%(1

对应。

(4)注意语句while((c=getchar())!="\n")中括号的用法,很多同学容易把

(c二getcharO)外的这层括号忘掉,变成while(c二getchar()!='\n'),由于!

二的优先级要高于二,所以导致运算顺序的改变,最终引起结果的错误。

(5)putchar();的功能仍然是让黑屏上的pressanykeytocontinue乖

乖换行,从而提高程序输出结果的可读性。与printf(“\n”);是完全等价的。

(6)getcharO的功能是等待用户从键盘输入一个字符到内存,它的功能决定了它

的写法必须是赋给一个字符型的内存变量,如本题的c=getchar()o

6-20请编写程序,输入一行数字字符(用回车结束),每个数字字符的前后都

有空格。请编程,把这一行中的数字转换成一个整数。例如,若输入(<CR>代

表Enter键):2483<CR>,则输出整数:2483。

#include<stdio.h>

main()

{charch,inti=0;

while((ch=getchar())!=,\n')

if(ch>=,O'&&ch<二'9')

i=i*10+ch-'O';

printf("%d",i);

putchar('\n');

)

程序总结:

(1)ch>='0,&&ch<-9,不能写成‘O'<=ch<=,9,。数字字符转换成相应

的数字,程序实现为:ch=ch-'0,;大写字母转换成小写字母,程序实现为:

ch二ch-'A,+,a,;小写字母转换成大写字母,程序实现为:

ch=ch-'a+'A'。

(2)while((c=getchar())!=,\n,)

{if(ch>=,0,&&ch<=,9,)

i=i*10+ch-'O';}

红色标记的这对儿花括号是完全没有必要的,因为if(ch>=,0,&&ch<='9,)

和i=i*10+ch-'0,是一体的,是一条语句。而while恰恰只需要对这一条语句

负责,而不是对多条语句负责,所以花括号是多余的。

(3)大家要格外注意i=i*10+ch-‘0';这条语句,这条语句是本程序的一大亮点。

6-21请编写程序统计输入的行数,用!号结束输入,!号所在的行不计入行数。

#include<stdio.h>

mainO

{charch;

inti=0;

while((ch=getchar())!=,!');

if(ch==,\n')i++;

printf(,i);

putchar('\n');

}

程序总结:本程序是要统计输入的行数,其实就是统计'\n,出现的次数。

6-22请编写程序统计输入的一行中小写字母的个数。

#include<stdio.h>

main()

{charch;

inti=0;

while((ch=getchar())!="\n')

if(ch>='a'&&ch<='z')

i++;

printf(,i);

putchar('\n');

)

程序总结:ch>=,a,&&ch<=,z'不能写成'a?<=ch<=,z'°

6-23请编写输出以下图案的程序,图案的行数由输入的整数值确定(每行中字符之

间没有空格)。A

BBB

CCCCC

DDDDDDD

EEEEEEEEE

#include<stdio.h>

mainO

{inti,j,k,m,n;

charch;

printf(Entern:\n");

scanf("%d",&n);

for(i=l;i<=n;i++)

{ch='A'+i-l;

m=2*i-l;

for(k=n;k>=i;k--)

putchar("");

for(j=l;j<=m;j++)

putchar(ch);

printf("\n”);

)

)

第7章

7T5编写函数intmymod(inta,intb)用以求a被b除之后的余数。

intmymod(inta,intb)

{ints;

s=a%b;

returns;}

程序总结:

(1)函数定义分为两部分,函数首部和函数体。结合本题,函数首部是int

mymod(inta,intb),函数体是花括号内的所有语句。

(2)intmymod(inta,intb)中的int是函数的返回值类型,return后的表

达式是函数的返回值,所以int类型的书写,是根据return后表达式的

类型而定的,必须要保证两处的一致性。要是函数体中没有return语句,

或是只有return这个单词,其后没有表达式,则认定为该函数没有返回

值。那么函数首部中int就要改写成void。要是函数首部省略函数的返

回值类型,写成mymod(inta,intb)的形式,并不表示该函数没有返回

值,而是系统默认该函数的返回值为int类型。

(3)intmymod(inta,intb)中的mymod是函数名,只要符合标识符的命名规

则即可,尽量做到见名知义。

(4)intmymod(inta,intb)中的a,b是该函数的两个形参。形参的个数取

决于题目的实际需要,形参前的类型名一定不能少。

(5)returns;语句的功能是把该被调用函数得到的结果返回调用函数。用

return语句只能带回一个数据。要想返回多个数据,必须用到后面的知

识点:传址。

(6)%(取余运算符)是双目运算符,其左右的两个运算符必须都是整型数。

7-16编写函数,根据整型形参n的值,计算如下公式的值:

1-1/2+1/3-1/4+1/5-1/6+1/7...

floatres(intn)

{inti=l;

floate=0,m,j;

for(j=l.0;j<=n;j++)

{m=l/j;

e+=i*m;

*♦

1=-1;

)

returne;

)

程序总结:

(1)要注意m=1/j;中的1/j,若是把j的类型定义成int类型的,只要1和j

(j大于1)进行整除运算,统统为0o只要把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=l-l/2*2-l/3*3-...

floatfun(intm)

{floati,t=l,n;

for(n=2;n<=m;n++)

{i=-l/(n*n);

t+=i;

returnt;

7-18编写函数用以求表达式x*x-5x+4的值,x作为参数传送给函数,调用此函

数求:

yl=2*2-5*2+4

y2=(x+15)*(x+15)+4

y3=sinx*sinx-5*sinx+4

yl的值为-2.0;x为0.5时,y2的值为166.75,y3的值为1.832721

doublefun(doublex)

{doubley;

y=x*x-5*x+4;

returny;

第8章

8-17请编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并通过

形参传送回调用函数。

Voidfun(floata,floatb,float*m,float*n)

{*m=a+b;

*n=a-b;

程序总结:

本题的要求是在调用函数中传递两数到被调用函数,在被调用函数中求出和值

和差值,然后传送到调用函数。显然return语句无能为力,因为return语句

仅能返回一个数据。像这样涉及到多个数据的传递的必须要用到传址运算。

8-18请编写函数,对传送过来的三个数选出最大数和最小数,并通过形参传回

调用函数。

voidfun(float*a,float*b,float*c)

{floatt;

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和最小数Co

第9章

9-27输入一行数字字符,请用

温馨提示

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

评论

0/150

提交评论