资源描述
C程序设计(第三版)课后习题参考解答
第1章 C语言概述
1.5 参照本章例题,编写一个C程序,输出以下信息:
******************************
Very Good!
******************************
解:
main ( )
{printf(“****************************** \n”);
printf(“\n”);
printf(“ Very Good! \n”);
printf(“\n”);
printf(“****************************** \n”);
}
1.6 写一个程序,输入a,b,c三个值,输出其中最大者。
解:
main ( )
{int a,b,c,max;
printf(“请输入三个数a,b,c: \n”);
scanf(“%d,%d,%d”,&a,&b,&c);
max=a;
if (max<b)
max=b;
if (max<c)
max=c;
printf(“ 最大数为:%d ”,max);
}
第2章 程序的灵魂——算法
2.1 什么叫结构化的算法?为什么要提倡结构化的算法?
解:由一些基本结构顺序组成的算法称为结构化的算法。由于在基本结构之间不存在非顺序的跳转,流程的转移只存在于一个基本结构范围之内,因而提高了算法的质量。
2.7 什么叫结构化程序设计?它的主要内容是什么?
解:结构化程序就是用高级语言表示的结构化算法。它的主要内容包括“自顶向下,逐步细化”的分析方法和“模块化设计”的解决方法,以及“结构化编码”的实现方法。
第3章 数据类型、运算符与表达式
3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存中的存储形式。
注:如果没有学过二进制和补码,此题可以不做。
解:各数据在内存中的存储形式如下表所示:
变量的类型
25
-2
32769
int型
00… 000011001
8 位
1111111111111110
15
100 … 001(溢出)
14
long型
00… 000011001
24
11 … 1110
31
00… 0100 … 001
16 14
short型
100… 000011001
8
1111111111111110
15
100 … 001(溢出)
14
signed char(8位)
100011001
11111110
00000001(溢出)
unsigned int型
00… 000011001
8
11 … 110
15
100 … 001
14
unsigned long型
00… 000011001
24
11 … 110
31
00… 0100 … 001
16 14
unsigned short型
00… 000011001
8
11 … 110
15
100 … 001
8
unsigned char型
00011001
11111110
00000001
其中int和short类型,其取值范围是-32768~32767。32769在这两种类型中实际表示负数,它是一个负数的补码,对其再求一次补码可得其真值,即-(65536-32769)=-32767。
char和unsigned char为8位,若将int或long类型数据赋给这种类型,则截取数据低8位。同理,若将long赋给int,则截取低16位。
3.5字符常量和字符串常量有什么区别?
解:字符常量是一个字符,用单引号括起来。字符串常量是由0个或若干个字符组合而成,用双引号括起来,存储时自动在字符串最后加一个结束符号’\0’。
3.6写出以下程序运行的结果:
main ( )
{ char cl=’a’, c2=’b’, c3=’c’, c4=’\101’, c5=’\116’;
printf (“a%c b%c\t c%c\t abc\n”, c1, c2, c3);
printf (“\t\b%c %c”, c4, c5);
}
解:程序运行的结果为:
aa bb cc abc
A N
3.7要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。
解:
main ( )
{ char cl=’C’, c2=’h’, c3=’i’, c4=’n’, c5=’a’;
c1+=4;
c2+=4;
c3+=4;
c4+=4;
c5+=4;
printf(“密码是%c%c%c%c%c\n, c1, c2, c3, c4, c5);
}
运行结果:
密码是Glmre
3.8例2.6能否改成如下:
main ( )
{ int c1, c2; (原为 char c1, c2)
c1=97;
c2=98;
printf (“%c %c\n”, c1, c2);
printf (“%d %d\n”, c1, c2);
}
解:可以。因为在可输出的字符范围内,用整型和用字符型作用相同。
3.9求下面算术表达式的值。
x+a%3*(int)(x+y)%2/4
设x=2.5,a=7,y=4..7
(float)(a+b)/2+(int)x%(int)y
设a=2,b=3,x=3.5,y=2.5
解:
(1)2.5
(2)3.5
3.10写出程序运行的结果。
main ( )
{ int i, j, m, n;
i=8;
j=10;
m=++i;
n=j++;
printf (“%d, %d, %d, %d”, i, j, m, n);
}
解:运行结果为:
9,11,9,10
3.11写出下面赋值的结果。格中写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。
int
99
42
char
‘d’
ⅹ
unsigned int
76
65535
float
53.65
long int
68
解:
int
99
100
76
53
68
42
-1
char
‘c’
‘d’
‘L’
‘5’
‘D’
‘*’
ⅹ
unsigned int
99
100
76
53
68
42
65535
float
99.000000
100.000000
76.000000
53.65
68.000000
42.000000
65535.000000
long int
99
100
76
53
68
42
65535
3.12 出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。
(1)a+=a (2)a-=2
(3)a*=2+3 (4)a/=a+a
(5)a%=(n%=2),n的值等于5 (6)a+=a-=a*=a
解:
(1)24 (2)10
(3)60 (4)0
(5)0 (6)0
第4章 最简单的C程序设计——顺序程序设计
4.4 若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。
要求输出的结果如下:
a=□3□□b=□4□□c=□5
x= 1.200000,y= 2.400000,z= -3.600000
x+y=□3.60□□y+z=-1.20□□z+x=-2.40
u= □51247□□n=□□□128765
c1=’a’□or□97(ASCII)
c2=’b’□or□98(ASCII)
解:
main ( )
{
int a,b,c;
long int u,n;
float x,y,z;
char c1,c2;
a=3;b=4;c=5;
x=1.2;y=2.4;z= -3.6;
u=51247;n=128765;
c1=’a’;c2=’b’;
printf(“\n”);
printf(“a=%2d□□b=%2d□□c=%2d\n”,a,b,c);
printf(“x=%.6f,y=%.6f,z=%.6f\n”,x,y,z);
printf(“x+y=□%.2f□□y+z=%.2f□□z+x=%.2f\n”,x+y,y+z,z+x);
printf(“u=%6ld□□n=%9ld\n”,u,n);
printf(“c1=’%c’ or %d(ASCII)\n”,c1,c1);
printf(“c2=’%c’ or %d(ASCII)\n”,c2,c2);
}
4.5请写出下面程序的输出结果:
main ( )
{ int a=5,b=7;
float x=67.8564,y=-789.124;
char c=’A’;
long n=1234567;
unsigned u=65535;
printf(“%d%d\n”,a,b);
printf(“%3d%3d\n”,a,b);
printf(“%f,%f\n”,x,y);
printf(“%-10f,%-10f\n”,x,y);
printf(“%8.2f, %8.2f,%4f, %4f, %3f, %3f\n”,x,y,x,y,x,y);
printf(“%e,%10.2e\n”,x,y);
printf(“%c,%d,%o,%x\n”,c,c,c,c);
printf(“%ld,%lo,%x\n”,n,n,n);
printf(“%u,%o,%x,%d\n”,u,u,u,u);
printf(“%s,%5.3s\n”,”COMPUTER”,”COMPUTER”);
}
运行结果:
5□7
□□5□□7
67.856400, -789.124023
67.856400□, -789.124023
□□□67.86,□□-789.12,67.8564,-789.1240,67.856400,-789.124023
6.785640e+01,□□-7.9e+02
A,65,101,41
1234567,4553207,d687
65535,177777,ffff,-1
COMPUTER,□□COM
可以发现,输出数据中若有负号、e和小数点,这些字符也占位。
4.6 用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入?
#include <stdio.h>
void main()
{
int a , b;
float x , y;
char c1 ,c2;
scanf(“a=%d b=%d”,&a , &b);
scanf(“ %f %e”,&x , &y);
scanf(“ %c %c”,&c1 , &c2);
}
解:
a=3□b=7
□8.5□71.82
□A□a
4.7下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据?
scanf(“%5d%5d%c%c%f%f%*f,%f”,&a,&b,&c1,&c2,&x,&y,&z);
解:
main ( )
{
int a,b;float x,y,z;
char c1,c2;
scanf(“%5d%5d%c%c%f%f%*f,%f”,&a,&b,&c1,&c2,&x,&y,&z);
printf(“a=%d, b=%d, c1=5c, c2=%c, x=%6.2f, y=6.2f, z=6.2f\n”),a,b,c1,c2,x,y,z);
}
运行情况如下:
□□□10□□□20Aa1.5 –3.75□1.5,67.8 (此行为输入的数据,其中□为空格)
a=10, b=20, c1=A, c2=a, x=1.50, y=-3.75, z=67.80 (此行为输出)
说明:按%5d格式的要求输入a和b时,要先键入三个空格,然后再键入10与20。%*f是用来禁止赋值的。在输入时,对应于%*f的地方,随意打入了一个数1.5,该值不会赋给任何变量。
4.8圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。
解:
main ( )
{
float pi,h,r,l,s,sq,vq,vz;
pi=3.1415926;
printf(“请输入圆半径r,圆柱高h:\n”);
scanf(“%f,%f”,&r,&h);
l=2*pi*r;
s=r*r*pi;
sq=4*pi*r*r;
vq=3.0/4.0*pi*r*r*r;
vz=pi*r*r*h;
printf(“圆周长为: l=%6.2f\n”,l);
printf(“圆面积为: s=%6.2f\n”,s);
printf(“圆球表面积为: sq=%6.2f\n”,sq);
printf(“圆球体积为: sv=%6.2f\n”,vq);
printf(“圆柱体积为: sz=%6.2f\n”,vz);
}
运行结果:
请输入圆半径r,圆柱高h:
1.5,3↙
圆周长为: l=9.42
圆面积为: s=7.07
圆球表面积为: sq=28.27
圆球体积为: sv=7.95
圆柱体积为: sz=21.21
4.9输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F-32)
输出要有文字说明,取2位小数。
解:
main ( )
{ float c,f;
printf(“请输入一个华氏温度:\n”);
scanf(“%f”,&f);
c=(5.0/9.0)*(f-32); /*注意5和9要用实型表示,否则5/9的值为0*/
printf(“摄氏温度为:%5.2f\n”,c);
};
运行结果:
请输入一个华氏温度:
78↙
摄氏温度为:25.56
第5章 选择结构程序设计
5.2语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
解:设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示。但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”。例如3&&5的值为“真”,系统会给出3&&5的值为1。
5.3写出下面各逻辑表达式的值。设a=3,b=4,c=5。
(1)a+b>c&&b==c
(2)a||b+c&&b-c
(3)!(a>b)&&!c||1
(4)!(x=a)&&(y=b)&&0
(5)!(a+b)+c-1&&b+c/2
解:
(1)0
(2)1
(3)1
(4)0
(5)1
5.4有3个整数a,b,c,由键盘输入,输出其中最大的数。
解:方法一:
程序如下:
main ( )
{ int a,b,c;
printf(“请输入3个整数:”);
scanf(“%d,%d,%d”,&a,&b,&c);
if (a<b)
if (b<c)
printf(“max=%d\n”,c);
else
printf(“max=%d\n”,b);
else if (a<c)
printf(“max=%d\n”,c);
else
printf(“max=%d\n”,a);
}
运行结果:
请输入3个整数:12, 34, 9↙
max=34
方法二:使用条件表达式,可以使程序更简明,清晰。
main ( )
{ int a,b,c,temp,max ;
printf(“请输入3个整数:”);
scanf(“%d,%d,%d”,&a,&b,&c);
temp=(a>b)? a:b; /* 将a和b中的大者存入temp中 */
max=(temp>c)? temp:c; /* 将a和b中的大者与c比较,取最大者 */
printf(“3个整数中最大数是%d\n”,max);
}
方法三:a>b?(a>c?a:c):(b>c?b:c)
运行结果:
请输入3个整数:12,34,9↙
3个整数的最大数是34。
5.5有一函数:
写一程序,输入x值,输出y值。
解:程序如下
main ( )
{ int x,y;
printf(“输入x:”);
scanf(“%d”,&x);
if (x<1) /* x<1 */
{ y=x;
printf(“x=%d3d, y=x=%d\n”,x,y);
}
else if (x<10) /* 1≤x<10 */
{y=2*x-1;
printf(“x=%3d, y=2*x-1=%d\n”,x,y);
}
else /* x≥10 */
{ y=3*x-11;
printf(“x=%3d, y=3*x-11=%d\n”,x,y);
}
}
运行结果:
输入x:4↙
x=4, y=2*x-1=7
输入x:-1↙
x=-1, y=x=-1
输入x:20↙
x=20, y=3*x-11=49
5.6给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。
解:程序如下
#include "stdio.h"
void main()
{
float score;
char grade;
printf("请输入学生成绩:");
scanf("%f",&score);
while(score>100 || score<0)
{
printf("\n输入有误,请重输");
scanf("%f",&score);
}
switch((int)(score/10))
{
case 10:
case 9:grade='A';break;
case 8:grade='B';break;
case 7:grade='C';break;
case 6:grade='D';break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:grade='E';
}
printf("\n成绩是%5.1f,相应的等级是%c。\n",score,grade);
}
5.7给定一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。
解:
main ( )
{
long int num;
int indiv,ten,hundred,thousand,ten_thousand,place;
/*分别代表个位,十位,百位,千位,万位和位数*/
printf(“请输入一个整数(0~99999):”);
scanf(“%ld”,&num);
if (num>9999)
place=5;
else if (num>999)
place=4;
else if (num>99)
place=3;
else if (num>9)
place=2;
else place=1;
printf(“place=%d\n”,place);
printf(“每位数字为:”);
ten_thousand=num/10000;
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
switch(place)
{case 5:printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,indiv);
printf(“\n反序数字为:”);
printf(“%d%d%d%d%d\n”,indiv,ten,hundred,thousand,ten_thousand);
break;
case 4:printf(“%d,%d,%d,%d”,thousand,hundred,ten,indiv);
printf(“\n反序数字为:”);
printf(“%d%d%d%d \n”,indiv,ten,hundred,thousand);
break;
case 3:printf(“%d,%d,%d”,hundred,ten,indiv);
printf(“\n反序数字为:”);
printf(“%d%d%d \n”,indiv,ten,hundred);
break;
case 2:printf(“%d,%d”, ten,indiv);
printf(“\n反序数字为:”);
printf(“%d%d \n”,indiv,ten);
break;
case 1:printf(“%d”, indiv);
printf(“\n反序数字为:”);
printf(“%d\n”,indiv);
break;
}
}
运行结果:
请输入一个整数(0~99999):98765↙
位数=5
每位数字为:9,8,7,6,5
反序数字为:56789
5.8企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元(100000<I≤200000)时,其中10万元按10%提成,高于10万元的部分,可提成7.5%;200000 <I≤400000时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000<I≤1000000时,高于60万的部分按1.5%提成;I>1000000时,超过100万的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。
要求:(1)用if语句编程序;(2)用switch语句编程序。
解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中由10万元按10%的比例提成,另外5万元则按7.5%提成。
用if语句编程序,
main ( )
{ long i;
float bonus,bon1,bon2,bon4,bon6,bon10;
bon1=100000*0.1; /*利润为10万元时的奖金*/
bon2=bon1+100000*0.075 /*利润为20万元时的奖金*/
bon4=bon2+100000*0.05 /*利润为40万元时的奖金*/
bon6=bon4+100000*0.03 /*利润为60万元时的奖金*/
bon10=bon6+400000*0.015; /*利润为100万元时的奖金*/
printf(“请输入利润i:”);
scanf(“%ld”,&i);
if (i<=100000)
bonus=i*0.1; /*利润在10万元以内按0.1提成奖金*/
else if (i<=200000)
bonus=bon1+(i-100000)*0.075 /*利润在10万至20万元时的奖金*/
else if (i<=400000)
bonus=bon2+(i-200000)*0.05 /*利润在20万至40万元时的奖金*/
else if (i<=600000)
bonus=bon4+(i-400000)*0.03 /*利润在40万元至60万元时的奖金*/
else if (i<=1000000)
bonus=bon6+(i-600000)*0.015 /*利润在60万元至100万元时的奖金*/
else bonus=bon10+(i-1000000)*0.01 /*利润在100万元以上时的奖金*/
printf(“奖金是 %10.2f”,bonus);
}
运行结果:
请输入利润i:234000↙
奖金是:19200.00
用switch语句编程序,
main ( )
{ long i;
float bonus,bon1,bon2,bon4,bon6,bon10;
int c;
bon1=100000*0.1
bon2=bon1+100000*0.075
bon4=bon2+200000*0.05
bon6=bon4+200000*0.03
bon10=bon6+400000*0.015
printf(“请输入利润i:”);
scanf(“%d”,&i);
c=i/100000;
if (c>10) then c=10;
switch (c)
{ case 0: bonus=i*0.1; break;
case 1: bonus=bon1+(i-100000)*0.075; break;
case 2:
case 3: bonus=bon2+(i-200000)*0.05; break;
case 4:
case 5: bonus=bon4+(i-400000)*0.03; break;
case 6:
case 7:
case 8:
case 9: bonus=bon6+(i-600000)*0.015; break;
case 10: bonus=bon10+(i-1000000)*0.01;
}
printf(“奖金是%10.2f”,bonus);
}
运行结果:
请输入利润i:234000↙
奖金是:19200.00
5.9输入4个整数,要求按由小到大的顺序输出。
解:程序如下
#include "stdio.h"
void main()
{
int t,a,b,c,d;
printf("请输入4个整数:");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(a>d)
{t=a;a=d;d=t;}
if(b>c)
{t=b;b=c;c=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)
{t=c;c=d;d=t;}
printf("排序结果如下:\n");
printf("%d %d %d %d\n",a,b,c,d);
}
5.10有4个圆塔,圆心分别为(2,2),(-2,2),(2,-2),(-2,-2),圆半径为1。见图4.4。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。
解:程序如下
main ( )
{ int h=10;
float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;
printf(“请输入一个点(x,y):”);
scanf(“%f,%f”,&x,&y); /*求该点到各中心点的距离*/
d1=(x-x1)*(x-x1)+(y-y1)* (y-y1);
d2=(x-x2)*(x-x2)+(y+y2)* (y+y2;
d3=(x+x3)*(x+x3)+(y-y3)* (y-y3);
d4=(x+x4)*(x+x4)+(y+y4)* (y+y4);
if (d1>1 && d2>1 && d3>1 && d4>1) h=0; /*判断该点是否在塔外*/
printf(“该点高度为%d”,h);
}
运行情况:
请输入一个点(x,y):0.5,0.7↙
该点高度为0
请输入一个点(x,y):2.1,2.3↙
该点高度为10
第6章 循环控制
6.1输入两个正整数m和n,求其最大公约数和最小公倍数。
解:用辗转相除法求最大公约数
main ( )
{ int p,r,n,m,temp;
printf(“请输入两个正整数n,m:”);
scanf(“%d,%d”,&n,&m);
if (n<m)
{ temp=n;
n=m;
m=temp; /*把大数放在n中,小数放在m中*/
}
p=n*m; /*先将m和n的乘积保存在p中,以便求最小公倍数时用*/
while (m!=0) /*求m和n的最大公约数*/
{ r=n%m;
n=m;
m=r;
}
printf(“它们的最大公约数为:%d\n”,n);
printf(“它们的最小公倍数为:%d\n”,p/n); /*p是原来两个整数的乘积*/
}
运行情况:
请输入两个正整数:12,8↙
它们的最大公约数为:4
它们的最小公倍数为:24
6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。
解:
#include <stdio.h>
main ( )
{ char c;
int letter=0,space=0,digit=0,other=0;
printf(“请输入一行字符:\n”);
while((c=getchar( ))!=’\n’)
{ if (c>=’a’ && c<=’z’ || c>=’A’ && c<=’Z’)
letter++;
else if (c==’ ’)
space++;
else if (c>=’0’ && c<=’9’)
digit++;
else
other++;
}
printf(“字母数=%d,空格数=%d,数字数=%d,其它字符数=%d\n”,letter,space,digit,other);
}
运行情况:
请输入一行字符:
My teacher’s address is “#123 Beijing Road,Shanghai”.
字母数:38,空格数:6,数字数:3,其它字符数:6
6.3
求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。例如:2+22+222+2222+22222
n个a
(此时n=5),n由键盘输入。
解:
main ( )
{ int a,n,i=1,sn=0,tn=0;
printf(“a,n= :”);
scanf(“%d,%d”,&a,&n);
while (i<=n)
{ tn=tn+a; /*赋值后的tn为i个a组成数的值*/
sn=sn+tn; /*赋值后的sn为多项式前I项之和*/
a=a*10;
++i;
}
printf(“a+aa+aaa+…=%d\n”,sn);
}
运行情况:
a,n:2,5↙
a+aa+aaa+…=24690
6.4求∑n!(即求1+2!+…+20!)。
解:
main ( )
{float s=0,t=1;
int n;
for (n=1;n<=20;n++)
{
t=t*n; /*求n!*/
s=s+t; /*将各项累加*/
}
printf(“1!+2!+…+20!=%e\n”,s);
}
运行结果:
1!+2!+…+20!=2.56133e+18
注意:s不能定义为int型,因为int型数据的范围是-32768~32767;也不能定义为long型,因为long型数据的范围为-21亿~21
展开阅读全文