C语言课后题编程答案



《C语言课后题编程答案》由会员分享,可在线阅读,更多相关《C语言课后题编程答案(33页珍藏版)》请在装配图网上搜索。
1、
C 语言课后题编程答案
所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程题掌握到第九章即可。希望大家通过课后的编程题熟悉典型的编程算法,掌握基本的编程思路,注意编程细节。
第 3 章
3-17 编写程序,把 560 分钟换算成用小时和分钟表示,然后进行输出。
#include
2、 (1)只要在程序中用到系统提供的库函数,必须把库函数所在的头文件 用#include 命令包含进来。 否则库函数的使用无效。 输入输出库函数的头文件是: stdio.h; 数学函数的头文件是: math.h; 字符处理函数的头文件是: ctype.h; 字符串处理函数的头文件是: string.h 。 (2)注意 C 语言中的“ / ”和“ %”两种运算符。“/ ”的运算结果取决于 两操作数的类型。比如: 1/2=0 (与数学中不同,结果与操作数的类型一 致,所以结果只取商值) , 1.0/2=0.5(
3、除之前 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 编写程序,输入两个整数
4、, 1500 和 350,求出它们的商和余数并进
行输出。
#include
5、( “%d%d”,&a,&b); scanf 的功能是用户要通过键盘输入数据,
赋值给各输入项。注意每个输入项前面必须要加 &符号。 %d与输入项的个
数要一致,类型要匹配。 %d与 int 一致,%f 与 float 对应,%lf 与 double
匹配, %c与 char 对应。
3-19 编写程序,读入三个双精度数,求它们的平均值并保留此平均值小
数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。
#include
6、 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); 有直接
7、联
系, %lf 与输入项
a,b,c
在定义时所用的类型
double
一致。
(2) %.1lf, .1的意思是结果仅保留小数点后一位小数。
3-20 编写程序,读入三个整数给 a、b、c,然后交换他们中的数,把 a 中原来的值给 b,把 b 中原来的值给 c,把 c 中原来的值给 a,然后输出 a,b,c 。
#include
8、 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;
9、
else if(a<40) m=2;
else if(a<50) m=3;
else if(a<60) m=4;
else m=5;
#include
10、eak; case 3: printf( “m=2\n”);break; case 4: printf( “m=3\n”);break; case 5: printf( “m=4\n”);break; default: printf( “m=5\n”); } } 程序总结: (1)选择结构的实现除了使用 if 语句以外,还可以使用 switch 语句来 实现。 (2)switch 后的表达式和 case 后的标号的类型要一致, switch 后的表达式直接决定了 switch 语句体
11、的执行入口。执行完入口的 case 语 句后,依次顺序往下执行,直到遇到 break 语句就彻底跳出 switch 语句体,转去执行 switch 语句体后的语句。 (3)default 语句可有可无,位置无所谓,当 switch 后的表达式和所有 case 后的标号都不一致时,转去执行 default 语句,然后依次顺序执行 default 语句后其他的 switch 语句,直到遇到 break 语句,则 彻底跳出 switch 语句体。 (4)break 语句可出现在循环语句体和 switch 语句体内,目的是彻底跳
12、
出循环体和 switch 语句体。
(5)case 和其后的标号之间必须要加空格。
4-22 编写程序,输入一位学生的生日(年: y0、月 m0、日 d0), 并输入当
前的日期(年: y1、月 m1、日 d1),输出该生的实际年龄。
#include
13、 ”);
scanf( “%d%d%d”,&y1,&m1,&d1);
age=y1-y0;
if(m1 14、ntinue 出现在有价值的输出结果的后面,而
是换行输出。这样就提高了程序输出结果的可读性。
(3)通过本设计,要加强对变量起名艺术性的认识。
4-23 编写程序,输入一个整数,打印出它是奇数还是偶数。
#include 15、 “%d是一个奇数! \n ”,x);
}
程序总结:
y=x%2;这是判断一个数是奇数还是偶数的一贯表示方式。 计算机中的等号
是双等号,与数学中的等号不一样。
4-24 编写程序,输入 a,b,c 三个数,打印出最大者。
方法一:
#include 16、)
max=a;
else
max=c;
}
else
{if(b>c)
max=b;
else
max=c;
}
printf( “max=%d”,max);
}
程序总结:
利用
if-else
的嵌套,可求出一组数的最大值和最小值。 在
if-else
的嵌套中,
要格外注意
17、
if
和
else
的配对问题。 配对的原则是: 从最后一个
else
开始,寻找
与其配对的
if
,找的原则是离
else
最近的还没有配对的
if
就是该
else
的配对
对象。 if 和 else 的配对一旦出问题,输出结果全错。
方法二:
#include 18、\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 的嵌套来进行程序设计,极易容易出错。而方法二采用
19、三个 if 语句的并列来实现,同样可以求出最大值。
) 方法二算法分析:第一个 if 语句结束后, b 中保存 a 和 b 中的较大值;第二
个 if 语句结束后, c 中保存 a 和 c 中的较大值;第三个 if 语句结束后, c 中保存 b 和 c 中的较大值;三次比较后, c 中的值就是三个数中最大的。
) 现实生活中,交换两盆水必须要借助第三个盆子;在程序设计中,要想实现
两个变量中值的交换,就必须借助第三个变量。
4-25 对于以下函数:
Y=x(-5 20、要求输入 x 的值,输出 y 的值。分别用:(1)不嵌套的 if 语句(2)嵌套的 if 语句(3)if-else 语句(4)
switch 语句
(1)#include 21、d\n”,y);
}
(2) #include 22、
main() {int x,y;
printf( “请输入 x 的值: \n ” ); scanf( “%d”,&x); if(x>-5&&x<0)
y=x;
else if(x==0)
y=x-1;
else
y=x+1;
Printf( “y=%d\n”,y);
}
(4) #include 23、&x<0) i=1;
if(x==0) i=2;
if(x>0&&x<10) i=3;
switch(i)
{ case 1:y=x;printf(“x=%d,y=%d\n”,x,y);break;
case 2:y=x-1; printf(“x=%d,y=%d\n”,x,y);break;
case 3:y=x-1; printf( “x=%d,y=%d\n”,x,y);
}
}
程序总结:
对于这个程序设计我建议大家采用第一种方法,因为第一种方法是大众化的思路,鉴于上机考 24、试是机器阅卷,希望大家不要在上机试题上展现自己的个性。大家可以在平常练习中,尝试多种方法解决同一问题,这样可以通过一个程序设计,巩固多个知识点。
第 5 章
5-17 编写程序,求 1-3+5-7+ -99+101 的值。
方法一:
#include 25、intf( “1-3+5-7+ -99+101=%d”,s);
}
程序总结:
(1) 循环结构可用循环语句来实现,循环语句有三种: while,do-while,for ,循
环语句的使用场合是:数之间有规律可循并且是重复执行某项操作。
(2) 本程序设计是正负数交替求和,所以必须单独定义一个变量,通过每次乘以
-1 ,来实现正负交替。本题中的 j 就扮演了这个角色。
(3) while 语句简介:功能是可实现循环结构。 While 与其后的括号之间无空格,括号里的表达式只要是合法的表达式即可, 不过关系表达式最为常见。 26、 While 的
管辖范围是紧跟在其后的一条“ C 语句”(可以是单纯的一条 C 语句,也可以是
用花括号括起来的复合语句) 。程序设计最忌讳死循环,所以说循环体中必须要
有使 while 后表达式为假的趋势,这样才能正常的跳出循环体,从而避免死循
环的出现。
方法二:
#include 27、s+=c;
b+=2;
a=-a;
c=a*b;
}
printf( “1-3+5-7+ -99+101=%d”,s);
}
程序总结:
若程序中用到了数学函数,就必须把 #include 28、tdio.h>
main()
{int m,n;
float e=1.0,i=1.0,t;
for(n=1;n<=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 29、
{float a,b,c,e;
e=1.0;a=1.0;c=0;
for(b=1.0;b<50;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) #include 30、h>
main()
{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=%f\n”,e);
}
程序总结: 1 乘以 10 的-6 次方,在 C语言中表示为 1e-6 。 5-19 编写程序,输出从公元 2000 年至 3000 年所有闰年的年号, 每输出 10 个年号换一行,判断公元年是否为闰年的条件是:
(1) 公元年数如能被 4 整除,而不能被 1 31、00 整除,则是闰年。
(2) 公元年数能被 400 整除也是闰年。
#include 32、nt i,j=0; 这条语句中的 j=0 非常必要,因为 j 的作用就是累计闰年的个数,在所有的程序设计中,具有累计功能的变量都需要初始化为零。否则随机
数会来捣乱,从而导致最后累计结果的无意义。
(2) if(j%10==0) 这是换行的一贯表示形式。
(3) 语句 printf( “\n ”); 在程序的最后出现两次,这两次的作用是不一样的,
前者实现的是每 10 个闰年换行一次。后者的功能是让黑屏上的 press any key to
continue 乖乖换行,从而提高程序输出结果的可读性。
5-20 编写程序,打印以 33、下图形: *
***
*****
*******
*****
***
*
#include 34、{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 循环的控制条件很难想出来, 大家只要把这个题记住就
35、
可以,到时候稍微变一下型就可以。
第 6 章
6-19 请编写程序,输入一行字符(用回车结束) ,输出每个字符以及与之对应
的 ASCII 代码值,每行输出三对。
#include 36、( ‘\n ’);
}
程序总结:
(1) 字符型数据在内存中保存的是与之相对应的 ASCII 码值。大家要牢记的 ASCII 代码值有:数字字符’ 0’的 ASCII 值是 48,字符‘ a’的 ASCII 值是 65,字符‘ A’的 ASCII 值是 97,字符‘ ’的 ASCII 值是 32,这 4
个特殊字符的 ASCII 值必须记住。其他的只要在它们的基础上递推就可
以。
(2) 在 printf 和 scanf 中所用到的 %后的字母,取决于输入输出项在定义时所用的关键字。Int 与%d对应,floa 37、t 与%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对应。 38、
(4)注意语句
while((c=getchar())!=
’\n ’) 中括号的用法,很多同学容易
把(c=getchar())
外的这层括号忘掉,变成
while(c=getchar()!=
’\n
’) ,
由于!=的优先级要高于 =,所以导致运算顺序的改变, 最终引起结果的错误。
(5)putchar( ‘\n ’); 的功能仍然是让黑屏上的 press any key to continue
乖乖换行,从而提高程序输出结果的可读性。与
39、
printf(
“\n
”);
是完全等
价的。
(6)getchar() 的功能是等待用户从键盘输入一个字符到内存, 它的功能决定
了它的写法必须是赋给一个字符型的内存变量,如本题的 c=getchar() 。
6-20 请编写程序,输入一行数字字符(用回车结束) ,每个数字字符的前
后都有空格。请编程,把这一行中的数字转换成一个整数。例如,若输入
( 40、clude 41、 ch=ch- ‘A’+’a’; 小写字母转换成大写字母,程序实现为:
ch=ch- ‘a+’A’。
(2)while((c=getchar())!= ’\n ’)
{ 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- ‘ 42、0’; 这条语句,这条语句是本程序的一大亮
点。
6-21 请编写程序统计输入的行数,用!号结束输入, !号所在的行不计入
行数。
#include 43、数,其实就是统计’ \n ’出现的次数。
6-22 请编写程序统计输入的一行中小写字母的个数。
#include 44、
6-23 请编写输出以下图案的程序,图案的行数由输入的整数值确定(每行中字
符之间没有空格)。A
BBB
CCCCC
DDDDDDD
EEEEEEEEE
#include 45、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)函数定义分为两部分,函数首部和函数体。结合本题,函数首部是
46、
int mymod(int a,int b) ,函数体是花括号内的所有语句。
(2)i nt mymod(int a,int b) 中的 int 是函数的返回值类型, return 后
的表达式是函数的返回值,所以 int 类型的书写,是根据 return
后表达式的类型而定的,必须要保证两处的一致性。要是函数体中
没有 return 语句,或是只有 return 这个单词,其后没有表达式,
则认定为该函数没有返回值。 那么函数首部中 int 就要改写成 void 。
要是函数首部省略函数的返回值类型,写成 mymod( 47、int a,int b) 的
形式,并不表示该函数没有返回值,而是系统默认该函数的返回值
为 int 类型。
(3)i nt mymod(int a,int b) 中的 mymod是函数名,只要符合标识符的
命名规则即可,尽量做到见名知义。
(4)i nt mymod(int a,int b) 中的 a, b 是该函数的两个形参。形参的个
数取决于题目的实际需要,形参前的类型名一定不能少。
(5)r eturn s; 语句的功能是把该被调用函数得到的结果返回调用函数。
用 return 48、语句只能带回一个数据。要想返回多个数据,必须用到后面的知识点:传址。
(6)%(取余运算符)是双目运算符,其左右的两个运算符必须都是整型
数。
7-16 编写函数,根据整型形参 n 的值,计算如下公式的值:
1-1/2+1/3-1/4+1/5-1/6+1/7
float 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;
}
49、
程序总结:
(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的值,计算如下公式的 50、值:
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+4
y2=(x+15)*(x+15)+4
y3=sinx*sinx-5*sinx+4
y1 的值为 -2.0 ;x 为 51、0.5 时, y2 的值为 166.75 ,y3 的值为 1.832721
double 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;
}
程序总结:
52、本题的要求是在调用函数中传递两数到被调用函数, 在被调用函数中求出
和值和差值,然后传送到调用函数。显然 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; 53、*a=*c;*c=t;}
if(*b<*c)
{t=*b;*b=*c;*c=t;}
}
程序总结:本函数的设计思路是:在被调用函数中利用指针远程遥控,把
三个数按从大到小的顺序排好, 然后在调用函数中输出最大数 a 和最小数
c。
第 9 章
9-27 输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的
个数。用下标为 0 的元素统计字符’ 0’的个数,下标为 1 的元素统计字
符’ 1’的个数, .
#include 54、n()
{char ch;
int num[10]={0};
printf( “请输入一行字符: \n ”);
while((c=getchar())!= ’\n ’)
if(ch>= ’0’&&ch<=’9’)
num[ch- ‘0’]+=1;
for(i=0;i<10;i++)
printf( “num[%d]=%d\n”,i,num[i]);
}
程序总结:
(1)ch>= ’0’&&ch<=’9’, 注 意 这 个 表 达 式 的 写 法 。 千 万 55、不 能 写
成’ 0’<=ch<=’9’。
(2)int num[10]={0}; 因为 num数组的功能是累加, 所以在累加之前必须要清零。
(3) 注意语句 num[ch- ‘0’]+=1; 进一步巩固数字字符转化为数字的算法:
ch=ch- ‘0’。
9-28 编写函数,对具有 10 个整数的数组进行如下操作:从下标为 0 的元
素开始直到最后一个元素,依次向前移动一个位置。输出移动后的结果。
#include 56、
for(i=n-1;i<10;i++)
w[i]=w[i+1];
}
main()
{int a[10],n,i;
printf( “给数组 a 赋值 :\n ”);
for(i=0;i<10;i++)
scanf( “%d”,a[i]);
printf( “请输入 n(0 57、
}
程序总结:本题要求编写函数,而不是编写程序,所以大家只需把红色字
体部分写上即可。
9-29 编写函数,把数组中所有奇数放在另一个数组中返回。
#include 58、
{int a[M],b[M],i,j;
printf( “给数组 a 赋值 :\n ”);
for(i=0;i
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年水电工程运行维护管理合同示范文本.docx
- 2025年工程勘测设计合同模板.docx
- 2025年区域产品销售代理合同.docx
- 2025年经销商授权合同样本.docx
- 2025年员工住房资金借贷合同.docx
- 2025年轻钢建筑施工合同示例.docx
- 2025年网络推广托管合同.docx
- 2025年简明个人借款正式合同范例.docx
- 2025年房产按揭贷款合同范例.docx
- 2025年技术合同争议调解.docx
- 2025年电子版城市住宅租赁合同范本.docx
- 2025年简易转让合同协议书样本.docx
- 2025年投资顾问服务合同实例.docx
- 2025年经销合同模板.docx
- 2025年工业项目设计合同样本.docx