admin 管理员组文章数量: 1184232
2024年4月25日发(作者:oracle19c安装最低配置)
各章习题参考答案
第1章 习题参考答案
1. 简述C程序的结构特点。
答:
(1) 一个C语言源程序由一个或多个源文件组成。每个源文件由一个或多个函数构成,
其中有且仅有一个主函数(main函数)。
(2) 一个函数由函数首部(即函数的第一行)和函数体(即函数首部下面的大括号内的部
分)组成。函数首部包括函数类型、函数名和放在圆括号内的若干个参数。函数体由声明部
分和执行部分组成。
(3) C程序书写格式自由,一行内可以写多条语句,一个语句也可以分写在多行中,每
个语句必须以分号结尾。
(4)程序的注释内容放在“/*”和“*/之”间,在‘/’和‘*’之间不允许有空格;注
释部分允许出现在程序中的任何位置处。
2. 分析例1.3程序的结构。
答:下面是例1.3的程序,它的结构是:有且只有一个主函数main以及若干个其它函
数,还有一个被主函数调用的sumab函数。函数有首部,包括类型和名称,首部下的大括
号中有变量定义、输入、计算和输出等语句。
#include
int sumab (int x, int y); /*函数声明*/
int main () /*主函数*/
{ int a,b,sum; /*定义变量*/
printf("请输入变量a与b的值:"); /*提示信息*/
scanf ("%d %d", &a, &b); /*输入变量a和b的值*/
sum=sumab(a,b); /*调用sumab函数*/
printf("a与b的和等于%d", sum); /*输出sum的值*/
return 0;
}
int sumab (int x, int y) /*定义sumab函数,并定义形参x、y */
{ int z;
z=x+y;
return z;
}
附录 各章习题参考答案
• 7 •
3. 分别编写完成如下任务的程序,然后上机编译、连接并运行。
(1) 输出两行字符,第1行是“The computer is our good friends!”,第2行是“We learn
C language.”。
main()
{printf("The computer is our good friends!n");
printf("We learn C language.n");
return 0;
}
(2) 从键盘输入变量a、b的值,分别计算a+b、a–b的值,将计算结果分别存放在变
量c、d中,最后输出计算结果。
main()
{int a=10,b=5,c,d;
c=a+b; d=a-b;
printf("a+b=%d,a-b=%d n",c,d);
return 0;
}
第2章 习题参考答案
1. 阅读程序,写出运行结果。
(1) # include
main()
{ int a,b,d=241; a=d/100%9; b=a*d; printf("%d, %d", a, b); return 0;}
输出:2,482
(2) #include
main()
{short a; unsigned short b=65535; a=b; printf("%d,%d", a, b); return 0;}
输出:56635,-1
(3)# include
main()
{ char c='A'; printf("%d,%o,%x,%cn",c,c,c,c); return 0;}
输出:65,101,41,A
(4) # include
main()
{float f=3.1415927; printf("%f,%en",f,f); return 0; }
输出:3.141593, 3.14159e+000
(5) # include
main()
{int i,j,x,y; i=5; j=7; x=++i; y=j++; printf("%d,%d,%d,%d",i,j,x,y); return 0;}
输出:6,8,6,7
(6) # include
main()
{long int a=123,b=456,c,d; c=– –b; d=(a– –, a+c); printf("%ld,%ld,%ld,%ld"a,b,c,d); return 0;}
输出:122,455,455,577
2. 编写程序。
(1) 利用变量k,将两个变量m和n的值交换。
main()
{ int m,n,k; scanf("%d,%d",&m,&n); /*如果输入3,5*/
k=m; m=n; n=k; printf("%d,%d",m,n); /*那么输出5,3*/
}
(2) 输入一个整数n,输出n除以3的余数。
main()
{ int n; scanf("%d",&n); printf("%d",n%3);
}
(3) 输入一个三位整数n,把n倒着输出(如输入672,输出276)。
main()
{ int n, a,b,c;
printf("输入一个三位数:"); scanf("%d",&n);
a=n/100; b=n/10%10; c=n%10; printf("%d%d%d",c,b,a);
}
(4) 输入一个三位整数n,求n的三位数码之和。
main()
{int n, p,s=0; scanf("%d",&n); /*如n为123*/
p=n%10; s=s+p; n=n/10; /*n变为12*/
p=n%10; s=s+p; n=n/10; /*n变为1*/
p=n%10; s=s+p;
printf("%d",s);
}
第3章 习题参考答案
1. 阅读程序,写出运行结果。
(1) # include
附录 各章习题参考答案
int main()
{char x='a',y='b'; printf("%d%cn",x,y);
printf("x='%3x','%–3x'n",x,x);
return 0;
}
输出:97b
x=' 61', ' 61 '
• 9 •
(2) # include
int main()
{int k=65; printf("k=%d,k=%0x,k=%cn",k,k,k); return 0; }
输出: k=65,k=41,k=A
(3) int main()
{int integer1,integer2; float sum1,sum2,sum;
char c='A'; integer1=65; integer2=–3; sum1=234.5; sum2=18.75; sum=sum1+sum2;
printf("%d %c %d %o %f t",integer1,integer1,integer2,integer2,sum);
printf("%c %d %s" , c, c, "good!");
return 0;
}
输出:65 A –3 177775 253.250000 A 65 good!
(4) int main()
{ int a=5,b=7; float x=67.8564,y=–789.124;
char c='A'; long n=1234567; unsinged long u=65535;
printf("%d%dt",a,b); printf("%3d%3dn",a,b);
printf("%f,%f t",x,y); printf("%–10f,%–10fn",x,y);
printf("%8.2f,%8.2f,%.4f,%.4f,%3f,%3fn",x,y,x,y,x,y);
printf("%e,%10.2en",x,y); printf("%c,%d,%o,%xn",c,c,c,c);
printf("%ld,%lo,%lxn",n,n,n); printf("%u,%o,%x,%dn",u,u,u,u);
printf("%s,%5.3sn","COMPUTER","COMPUTER”);
return 0;
}
输出:57 5 7
67.856400,–789.124000 67.856400 ,–789.124000
67.86, -789.12, 67.8564,–789.1240,67.856400,–789.124000
6.78564e+001, -7.89e+002
A,65,101,41
1234567,4547275,12cebd
65535, 177777, ffff, -1
COMPUTER,COM
(5) int main()
{ char c1='a',c2='b',c3='c',c4='101',c5='116';
printf("a%c b%ct%ct abcn",c1,c2,c3);
printf("tb%c %cn",c4,c5);
}
输出:aabb c abc
AN
(6) int main()
{ char ch1='A',ch2,ch3;
ch2=ch1+1; ch3=ch2+1;
printf("%3c %3c%3cn",ch1,ch2,ch3);
ch1=getchar(); ch2=ch1+1; ch3=ch2+1;
printf("%d,%d,%dn",ch1,ch2,ch3);
}
运行上面程序时,从键盘输入3后按回车。
输出: A B C
3,4,5
2. 编写程序
(1) 用scanf函数输入圆柱的半径和圆柱高,计算圆周长、圆面积、圆柱表面积、圆柱
体积,并输出计算结果,输出时要有文字说明,取小数点后两位数字。
main()
{float pi,h,r,l,s,sq,sq,sz; 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;
sq=4.0/3.0*pi*r*r*r; sz=pi*r*r*h;
printf("圆周长为: l=%6.2fn",l);
printf("圆面积为: s=%6.2fn",s);
printf("圆球表面积为: sq=%6.2fn",sq);
printf("圆球体积为: sq=%6.2fn",sq);
printf("圆柱体积为: sz=%6.2fn",sz);
}
(2) 输入一个华氏温度值f,计算并输出摄氏温度值c=(5/9)*(f–32)。输出要有文字说
明,取两位小数。
main()
{float c,f;
printf("请输入一个华氏温度:n"); scanf("%f",&f);
c=(5.0/9.0*(f-32); printf("摄氏温度为: %5.2fn",c);
}
(3) 用getchar函数读入两个小写英文字母分别给变量c1和c2,然后分别用putchar函
数和printf函数输出这两个小写英文字母以及对应的大写英文字母。
#include
main()
{char c1,c2;
printf("请输入两个字符:n"); c1=getchar(); c2=getchar();
附录 各章习题参考答案
printf("用putchar语句输出结果为: n");
putchar(c1); putchar(c1-32); putchar(c2); putchar(c2-32);
printf("n");
printf("用printf语句输出结果为: n");
printf("%c,%cn",c1,c2); printf("%c,%cn",c1-32,c2-32);
}
• 11 •
(4) 输入整型变量m、n的值,计算m除以n的商和余数,然后输出商和余数。
#include
main()
{ int m,n,s,y;
printf(
"
m=
"
); scanf(
"
%d
"
,&m);
printf(
"
n=
"
); scanf(
"
%d
"
,&n);
s=m/n; y=m%n;
printf(
"
%d除以%d的商是%d,余数是%d.
"
,m,n,s,y);
}
(5) 从键盘上输入长方体的长、宽、高,输出长方体的体积与表面积的比值。
#include
main()
{ float a,b,c,s,v;
printf("请输入长方体的长、宽、高a,b,c=");
scanf("%f,%f,%f",&a,&b,&c);
printf("长方体的长、宽、高为: %f,%f,%fn",a,b,c);
s=2*(a*b+a*c+b*c); v=a*b*c;
printf("体积与表面积之比=%fn",v/s);
}
(6) 输入直角平面坐标系中两个点的坐标,求它们中点的坐标并输出该坐标值。
#include
main()
{ float x1,x2,y1,y2,dx,dy;
scanf("%f,%f",&x1,&y1); scanf("%f,%f",&x2,&y2);
dx=(x1+x2)/2; dy=(y1+y2)/2;
printf("中点的坐标=(%f,%f)n",dx,dy);
}
(7) 已知z=(x-8)
2
+(y-7)
2
,请输入x和y的值,计算并输出z的值。
#include
main()
{ float x,y,z; scanf("%f,%f",&x,&y);
z=(x-8)*(x-8)+(y-7)*(y-7);
printf("z=%fn",z);
}
(8) 试用计算机绘制一个由星号*组成的如图3.3所示的图案。
*
***
*****
*******
#include
main()
{ printf(" *n ");
printf(" ***n ");
printf(" *****n ");
printf(" *******n ");
}
第4章 习题参考答案
1. 阅读程序,写出运行结果。
(1) # include
int main()
{ int a=3, b=6, c; c=a+b;
if (6*a>2*b-3) printf(“%d n”,a*b);
else printf(“%dn”,c);
return 0;
}
输出:18
(2) # include
int main()
{ int a, b, c; a=5; b=3; c=9;
if (a>b)
if (a>c) printf(“%dn”,a);
else printf(“%dn”,b);
printf(“endn”);
return 0;
}
输出:3
end
(3) # include
int main()
{int a,b,c; a=b=c=0;
if (++a||b++&&c++) printf(“%d,%d,%d”,a,b,c);
else printf(“OK”);
return 0;
}
输出:1,0,0 OK
(4) # include
int main()
{ float x,y; printf("Pleas input x:"); scanf("%f",&x); /*输入20*/
附录 各章习题参考答案
switch(x>=10)
{case 0 : y=7*x*x–6*x+5; break;
case 1 : switch (x>=30)
{case 0 : y=4*x*x+3*x+2; printf("y=%fn",y); break;
case 1 : y=9*x*x+8*x–7; printf("y=%fn",y); break;
}
}
return 0;
}
输出:222
• 13 •
2. 编写程序
(1) 输入3个数,判断能否构成三角形。
main()
{ float a,b,c ;
printf("a,b,c:"); scanf ("%f,%f,%f",&a,&b,&c);
if (a+b>c && a+c>b && b+c>a ) printf("truen");
else printf("falsen");
}
(2) 从键盘输入两个整数,分别赋给变量a、b (a
#include
main()
{int a,b;
printf("a,b="); scanf("%d,%d",&a,&b);
if (a*a==b) printf("%d是%d的平方根.",a,b);
else printf("%d不是%d的平方根.n",a,b);
}
(3) 输入一个整数,判断它能否被3整除,输出判断结果。
#include
main()
{ int num; printf("num="); scanf("%d",&num);
if (num%3==0) printf("Right!");
else printf("False!");
}
(4) 输入4个整数,要求按从小到大的顺序输出。
main()
{ int t,a,b,c,d; scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("nna=%d,b=%d,c=%d,d=%dn",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从小到大排序为: %d %d %d %d n",a,b,c,d);
}
(5) 输入一个三位整数,判断它的个位数码是否小于7、十位数码能否被3整除、百位
数码的平方是否大于20,若以上条件都满足,则输出YES,否则输出NO。
main()
{int t,a,b,c;
printf("t="); scanf("%d",&t);
a=t%10; b=t/10%10; c=t/100;
if ((a<7)&&(b%3==0)&&(c*c>20)) printf("YES");
else printf("NO");
}
(6) 用switch语句编写解决下面问题的程序:从键盘输入字符A时,输出“考核成绩
优秀”;输入字符B或C时,输出“考核成绩良好”;输入字符D或E时,输出“考核
成绩及格”;输入其他英文字符时,输出“考核成绩不及格”;若输入非英文字符,则输
出“输入错误”。
#include
main()
{char ch;
printf("input a character:"); scanf("%c",&ch);
if (!(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') ) printf("输入错误n");
else
switch(ch)
{ case 'A': case 'a': printf("考核成绩优秀n");break;
case 'B': case 'b':
case 'C': case 'c': printf("考核成绩良好");break;
case 'D': case 'd':
case 'E': case 'e': printf("考核成绩及格");break;
default : printf("考核成绩不及格");
}
}
(7) 从键盘输入x的值,分别用if语句编写程序计算下列分段函数的值。
x (x1)
y
2x1 (1x10)
3x 11 (x10)
main()
{ int x, y; printf("input x: "); scanf("%d",&x);
if (x<1) { y=x; printf("x=%d, y=x=%dn",x,y); }
else if (x<10) { y=2*x-1; printf("x=%d, y=2*X-1=%dn",x,y); }
else { y=3*x-11; printf("x=%d, y=3*x-11=%dn",x,y); }
}
第5章 习题参考答案
1. 阅读程序,写出运行结果。
(1) # include
附录 各章习题参考答案
int main( )
{ int i=1,s1=0,s2=0;
while (i<=10)
{ if ( i%2==0 ) s1=s1+2*i;
else s2=s2+3*i;
++i;
}
printf("s1=%d,s2=%dn", s1,s2);
return 0;
}
输出:s1=60,s2=75
• 15 •
(2) #include
int main()
{int i=10,sum=0;
do
{ if (i*i%3==0) continue;
sum=sum+i*i; i-- ;
} while(i>=1)
printf("sum=n", sum);
return 0;
}
输出:259
(3) #include
int main()
{int i,j;
for(i=4;i>=1;i––)
{printf("*");
for(j=1;j<=4–i;j++) printf("*");
printf("n");
}
return 0;
}
输出:
*
**
***
****
(4)
#include
int main()
{int s=0,k;
for (k=7; k>0; k––)
{for(n=1; n<=k; n++) printf("%2d ", k);
printf("n");
}
return 0;
}
输出:7 7 7 7 7 7 7
6 6 6 6 6 6
5 5 5 5 5
4 4 4 4
3 3 3
2 2
1
2. 编写程序
(1) 计算1–1/2+1/3–1/4+…+1/99–1/100的值,并输出结果。
#include
main()
{ int c,s; float sum=0;
for (c=1;c<=100;c++)
{ if(c%2==0) s=-1;
else s=1;
sum+=s*(1/(float)c);
}
printf("%fn",sum);
}
(2) 计算表达式1+(3/2)+(5/4)+(7/6)+
…
+(99/98)+(101/100)的值。
#include
main()
{float s=1.0; int n;
for(n=2;n<=100;n++) s=s+(float)(n+1)/n;
printf("s=%fn",s);
}
(3) 数列第1项为2,此后各项均为它前一项的2倍再加3,求该数列前10项之和。
# include
main()
{ int a=2, k=1, s=0;
while(k<=10)
{s=s+a; a=a*2+3;
k++;
}
printf("%dn",s);
}
(4) 判断101~200之间有多少个素数,并输出所有素数。
#include "math.h"
main()
附录 各章习题参考答案
{ int m,i,k,h=0,leap=1;
for(m=101;m<=200;m++)
{k=sqrt(m+1);
for(i=2;i<=k;i++) if (m%i==0) {leap=0;break;}
if (leap) {printf("%-4d",m);h++;}
leap=1;
}
printf("nThe total is %d",h);
}
• 17 •
(5) 输入一个整数,输出它的位数。例如输入-23156,输出-23156是5位数。
#include
main()
{int n,k=0; scanf("%d",&n);
while( n!=0)
{k++; n=n/10; }
printf("%dn",k);
}
(6) 对于200到300之间的整数,输出所有各位数码之和为12、数码乘积为42的数。
#include
main()
{int i,j,k,m,p,s,d;
for(d=200;d<=300;d++)
{i=d/100; j=d/10%10; k=d%10; s=i+j+k; p=i*j*k;
if(s==12 && p==42) printf("%6d",d);
}
}
(7) 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include "stdio.h"
main()
{ char c; int letters=0,space=0,digit=0,others=0;
printf("please input some charactersn");
while((c=getchar())!=13) /*按Enter键结束循环,Enter键的ASCII码值是13*/
{ if (c>='a'&&c<='z'||c>='A'&&c<='Z') letters++;
else if (c==32) space++; /*空格键的ASCII码值是32*/
else if (c>='0'&&c<='9') digit++;
else others++;
}
printf("all in all:char=%d space=%d digit=%d others=%dn", letters,space,digit,others);
}
(8) 打印出所有的“水仙花数”。所谓“水仙花数”,是指一个三位数,其各位数字
立方和等于该数本身。例如,153是一个“水仙花数”,因为153=1
3
+5
3
+3
3
。
# include
main()
{int i,j,k,n;
for(n=100;n<=999;n++)
{i=n/100; /*分解出百位数码*/
j=n/10%10; /*分解出十位数码*/
k=n%10; /*分解出个位数码*/
if(n==i*i*i+j*j*j+k*k*k) printf("%-6d",n);
}
}
(9) 百钱百鸡问题:公鸡1只5元,母鸡1只3元,小鸡3只1元,想用100元钱买
100只鸡,问有哪些不同的买法?输出所有不同的买法。
#include
main()
{int x,y,z;
for(x=0;x<=20;x++) /*公鸡最多20只*/
for(y=0;y<=33;y++) /*母鸡最多33只*/
{ z=100-x-y; /*小鸡数为100减去公鸡和母鸡*/
if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)
printf("n公鸡=%d 母鸡=%d 小鸡=%d", x,y,z);
}
}
(10) 计算并输出a+aa+aaa +
…
+aaa
…
a(n个a)之和。n由键盘输入。(例如,a=2,n=3
时,求2+22+222之和)。
#include
main( )
{unsigned a, n, i; unsigned long t, s; s=0 ; t=0 ;
printf("Pleas input a, n : "); scanf("%u, %u", &a, &n);
for (i=1; i<=n; i++)
{ t=t*10+a; s=s+t; }
printf("s = %lun", s);
}
(11) 将一个正整数分解质因数。例如,输入90,打印出90=2*3*3*5。
main()
{int n,i;
printf("nplease input a number:n"); scanf("%d",&n); printf("%d=",n);
for(i=2;i<=n;i++)
{while(n!=i)
{ if (n%i==0) { printf("%d*",i); n=n/i; }
else break;
}
}
printf("%d",n);
}
(12) 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6=1+2+3,
编程找出1000以内的所有完数。
# include
main()
{ int m,i,s;
for(m=2;m<1000;m++)
{s=0;
for(i=1;i 附录 各章习题参考答案 if (s==m) {printf("%d是一个完数,它的因子是:",m); for(i=0;i if ((m%i)==0) printf("%d,",i); } } • 19 • } (13) 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃 一个;第二天早上将剩下的桃子吃掉一半,然后又多吃了一个;以后每天早上都吃了前一 天剩下的一半零一个;到第10天早上想再吃时,看见只剩下一个桃子了。求猴子第一天共 摘了多少桃子。 # include main() {int day=9,x1,x2; x2=1; /* x2=1表示第10天早上只有1个桃子*/ /*从第10天桃子数推出第9天桃子数,从第9天桃子数推出第8天桃子数,*/ /*一直推下去,最后从第2天桃子数推出第1天桃子数,共推了9次。*/ while(day>0) {x1=(x2+1)*2; /*前一天的桃子数是后一天桃子数加1后的2倍*/ x2=x1; day--; } printf("the total is %dn",x1); } 第6章 习题参考答案 1. 阅读程序,写出运行结果。 (1) # include int main() {int i, j, a[6]={12,4,17,25,27,16}, b[6]={27,13,4,25,23,16}; for ( i=0; i<6; i++) {for ( j=0; j<6; j++) if (a[i]==b[j]) break; if (j<6) printf("%d ",a[i]); } printf ("n"); } 输出:4 25 27 16 (2) 运行下面程序时输入9个数,按顺序分别是1,2,3,4,5,6,7,8,9。 int main() {int a[3][3], sum=0, i, j; printf("please input element:n"); for (i=0;i<3;i++) for (j=0;j<3;j++) scanf("%d", &a[i][j]); for (i=0;i<3;i++) sum=sum+a[i][i]; printf("sum=%6d", sum); } 输出:sum=15 (3) int main() {int a[2][3]={{1,2,3},{4,5,6}}, b[3][2],i,j; printf("array a:n"); for (i=0;i<=1;i++) {for (j=0;j<=2;j++) printf("%5d",a[i][j]); printf("n"); } for(i=0;i<=1;i++) for(j=0;j<=2;j++) b[j][i]=a[i][j]; printf("array b:n"); for(i=0;i<=2;i++) {for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("n"); } } 输出:array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6 (4) int main() {char a[5]={'*','*','*','*','*'}; int i,j,k; char space=' '; for (i=0;i<=4;i++) {printf("n"); for(j=1;j<=3*i;j++) printf("%c",space); for (k=0;k<=4;k++) printf("%3c",a[k]); } } 输出:* * * * * * * * * * * * * * * * * * * * 附录 各章习题参考答案 * * * * * • 21 • (5) 运行下面程序,首先输入ABCDEFGHIJK,再输入abcdefgh。 int main() {char s1[80],s2[40]; int i=0,j=0; printf("n please input string1:"); scanf("%s",s1); printf("n please input string2:"); scanf("%s",s2); while (s1[i]!='0') i++; while (s2[j]!='0') s1[i++]=s2[j++]; s1[i]='0'; printf("nthe result is : %s",s1); } 输出:ABCDEFGHIJKabcdefgh 2. 编写程序 (1) 将长度相同的两个整型一维数组中的对应元素的值相加后输出。 #define N 10 #include main() {int a[N], b[N], k; for(k=0; k scanf("%d, %d ", &a[k], &b[k]); for(k=0; k printf("%d n", a[k]+b[k]); } (2) 整型一维数组中存放互不相同的10个数,从键盘输入一个整数,输出与该数相同 的数组元素的下标。 main() {int a[10], b, k; for(k=0; k<10; k++) scanf(“%d”, &a[k]); scanf(“%d”, &b); for(k=0; k<10; k++) if (a[k]==b) {printf("%d",k); break;} } (3) 将实型一维数组元素的最大值与第一个数组元素的值交换,最小值与最后一个数 组元素的值交换。 main() {int a[10], k, max, min, b1, b2, t; for (k=0;k<10;k++) scanf("%d", &a[k]); max=min=a[0]; for (k=1;k<10;k++) {if (a[k]>max) {max=a[k]; b1=k;} if (a[k] } t=a[0]; a[0]=a[b1]; a[b1]=t; t=a[9]; a[9]=a[b2]; a[b2]=t; for (k=0;k<10;k++) printf("%d,", a[k]); } (4) 求整型一维数组的10个元素的平均值,然后输出小于平均值的数组元素。 main() {int k,x[10]; flaot s=0; for(k=0; k<10; k++) {scanf("%d", &x[k]); s=s+x[k]; } s=s/10; for(k=0; k<10; k++) if(x[k] puts(str); } (5) 实型数组存放N个学生某门课的成绩,统计不低于平均成绩的学生人数。 #define N 40 main() {int i,count=0; float a[N],total=0, ave; for (i=0;i { scanf("%f",& a[i]); total=total+a[i]; } ave=total/N; for (i=0;i if (a[i]>=ave) count++; printf("ave=%f,count=%dn",ave,count); } (6) 将一个一维数组的元素值逆序存放后输出。 #include "stdio.h" #define N 10 main() { int a[N]={10,9,8,7,6,5,4,3,2,1},i,temp; for(i=0;i for(i=0;i { temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } printf(‘n’); for(i=0;i } (7) 用筛法求100之内的素数。算法是:用从2到100的平方根之间的每个数,按顺 序去除大于该数且小于等于100之间的每个数,凡能被整除的不是素数,将其筛掉,剩下 的就是素数。 # include "math.h" main() {int i,j,n,a[101]; for (i=1;i<=100;i++) a[i]=i; for (i=2;i for (j=i+1;j<=100;j++) {if (a[i]!=0 && a[j]!=0) if (a[j]%a[i]==0) a[j]=0; /*筛掉非素数, 使其对应的数组元素值为0*/ } 附录 各章习题参考答案 for (i=2,n=0;i<=100;i++) {if (a[i]!=0){printf("%4d", a[i]); n++; } /*非0数组元素为素数*/ if (n==10) {printf("n"); n=0; } } • 23 • } (8) 请用选择法对10个实数进行从大到小的排序。 #include "stdio.h" #define N 10 main() { int i, j, min;float a[N] , tem; printf("please input ten num:n"); for(i=0;i for(i=0;i for(i=0;i { min=i; for(j=i+1;j if(a[min]>a[j]) min=j; tem=a[i]; a[i]=a[min]; a[min]=tem; } for(i=0;i } (9) 请用冒泡法对10个整数进行从大到小的排序。 #include "stdio.h" #define N 10 main() { int i, j, min;float a[N] , tem; for(i=0;i for(i=0;i printf("n"); for(i=0;i for(j=0;j if(a[j] for(i=0;i } (10) 从键盘输入一个数b,将数组a中与b相同的数都删除。被删除的数组元素的位 置由后面数组元素依次前移一位来填补。 # define N 10 main() {int k,b,m,n, a[N]; k=0; printf("输入数组a的10个数n"); while (k for (k=0; k printf("n"); printf("输入被删除的数n"); scanf("%d",&b); k=0; n=0; while(k {if (b==a[k]) { n++; for (m=k; m } else k++; } for (k=0;k } (11) 求一个6*6矩阵中的非零元素之和。 #include "stdio.h" #define N 6 main() {float a[N][N],sum=0; int i,j; for(i=0;i for(j=0;j for(i=0;i for(j=0;j if (a[i][j]!=0) sum=sum+a[i][j]; printf("%fn",sum); } (12) 某公司有100个员工,将每个员工的年龄、身高、体重、工资存放两维数组中, 计算并输出所有员工的年龄、身高、体重、工资平均值。 # include "stdio.h" main() { int i, j,s1,s2,s3,s4, a[100][4]; for(i=0; i<100; i++) /*100个员工的年龄、身高、体重、工资存放二维字符数组a中*/ for(j=0; j<4; j++) scanf(“%d”, &a[i][j]); /*顺序输入员工的年龄、身高、体重、工资*/ for(i=0; i<100; i++) s1=s1+a[i][0]; /*计算所有员工的年龄总和*/ for(i=0; i<100; i++) s2=s2+a[i][1]; /*计算所有员工的身高总和*/ for(i=0; i<100; i++) s3=s3+a[i][2]; /*计算所有员工的体重总和*/ for(i=0; i<100; i++) s4=s4+a[i][3]; /*计算所有员工的工资总和*/ printf(“年龄、身高、体重、工资的平均值为%f, %f, %f,%f”, s1/100.0, s2/100.0, s3/100.0, s4/100.0); } (13) 从键盘输入10个字符串(每个字符串小于80个字符),查找最长的字符串。 # include "stdio.h" # include "string.h" # define N 10 main() {char str[N][80],ch[80]; int i,sp; for (i=0;i sp=0; strcpy(ch,str[0]); for (i=1;i if (strlen(ch) {sp=i; strcpy(ch,str[i]); } printf("下标为%d的字符串%s最长,有%d个字符n",sp,ch,strlen(ch)); } (14) 输入一行英文句子,将其中的空格用'*'取代,然后输出。 附录 各章习题参考答案 main() {int i=0,k; char str[20]; gets(str); for(k=0; str[k]!='0'; k++) if(str[k]==32) str[k]= '*'; puts(str); } • 25 • (15) 输入若干个国家的英文名字,将它们按字母顺序从大到小排列,然后输出。 编程思路是:由一个二维字符数组来存储N个国家名,每行存储一个国家名对应的字 符串,然后对这N个字符串用选择法排序,最后输出排序结果。程序代码如下。 #define N 10 main() {char st[20], cs[N][20]; int i,j,p; printf("input country's name:n"); for(i=0; i for(i=0; i { p=i; strcpy(st,cs[i]); for(j=i+1; j if(strcmp(cs[j],st)<0) {p=j;strcpy(st,cs[j]);} if(p!=i) {strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st); } puts(cs[i]); } } (16) 将100件商品的英文名称存储在数组中,输出名称的第3个字符是'b'的所有商品 英文名称;再输出名称的长度小于6个字符的商品英文名称。 # include # include main() {int k; char str[100][80]; /*设每个英文名称长度小于80*/ for(k=0; k<100; k++) gets(str[k]); for(k=0; k<100; k++) {if (str[k][2]==’b’) puts(str[k]); if (strlen(str[k])<6) puts(str[k]); } } 第7章 习题参考答案 1. 阅读程序,写出运行结果。 (1) 以下程序中,swap函数用于交换两个形参的值,两个实参数的值从main函数传 给swap函数。该程序能否输出5和3 (即交换a[0]和a[1]的值)?如果不能请说明原因。 #include void swap(int x, int y) { int t ;t=x ; x=y ; y=t ; } int main( ) { int a[2]={3,5}; swap(a[0],a[1]); printf("%d,%dn",a[0],a[1]); return 0; } 回答:不能。 因为形参和实参分别占用不同的存储空间,所以对形参的修改并不会 影响实参的值,尽管x和y的值交换了,但a[0]和a[1]的值并没有交换。 (2) #include float fun(int n) { int i; float s=0; for(i=1; i<=n; i++) s=s+2*i; pirntf("%d,",s); return(s/n); } int main( ) { int i; for(i=10; i>5; i--) printf("%fn", fun(i)); return 0; } 输出:110,11.000000 90,10.000000 72,9.000000 56,8.000000 42,7.000000 (3) #include int d=1; fun(int p) { int d=5; d+=p++; pirntf("%5d",d); } int main( ) { int a=3; fun(a); d+=a++; printf("%5d",d); return 0; } 输出: 8 11 (4) #include int main( ) { char line[]="How do you do!t hello";/*两个单词间有一个空格*/ int total; total=tw(line); printf("%dn",total); } 附录 各章习题参考答案 int tw(char line[]) { int k=0,cnt=0; while(line[k++]!='0') if (line[k]==32 || line[k]=='t') cnt++; return(cnt); /*空格的ASCII码是32*/ } 输出:5 • 27 • (5) #include int s=0,a[10]= {10,20,30,40,50,60,70,80,90,100}; int fun(int n) { int i,s=10,a[10]= {1,2,3,4,5,6,7,8,9,10}; for(i=0; i return(s); } int main( ) { int i,t; for(i=0; i<10; i++) s=s+a[i]; printf("%d; ", s/10); t=fun(9); for(i=0; i<10; i++) if (a[i]> t) printf("%d, ", a[i]); } 输出:55;60, 70, 80, 90,100 (6) #include try(void) {static int x=3; x++; return(x); } int main( ) { int i,y; for(i=0;i<=2;i++) y=try(); printf("%dn",y); return 0; } 输出:6 2. 编写程序 (1) 编写求n的阶乘的函数fact。主函数调用fact,传递给n一个正整数值。 long fac(int n) /*递归计算阶乘的函数*/ {if (n==1 || n==0) return(1); esle return(n*fac(n-1)); } long fac(int n) /*非递归计算阶乘的函数*/ {int i; long f; for (i=1; i<=n; i++) f=f*i; return(f); } main() {int n;long t; scanf("%d", &n); t=fac(n); printf("% ld", t); } (2) 编写函数comm,函数comm的功能是判定形参a是否是3与7的公倍数,如果是 则返回1,否则返回0。主函数可以多次调用comm,每次从键盘输入一个整数传递给a。 #include int comm(int a) {int flag=0; if (a%3==0 && a%7==0) flag=1; return(flag); } main( ) {int yn=1,a; while (yn==1) { printf(“请输入一个整数:”); scanf(“%d”, &a); if (comm(a)==1) printf(“%d是3与7的公倍数”, a); printf(“若要判断下一个整数是否是3与7的公倍数,请按1,否则按0。” ); scanf(“%d”, &yn); } } (3) 编写函数 fun(int n),fun的功能是:从键盘输入n个整数,求其中能被3或5整 除的数的和。主函数调用fun,在主函数中输入10传递给n。 #include fun(int n) {int s=0, k,a; for(k=1; k<=n; k++) {scanf("%d", &a); if(a%3==0 || a%5==0) s=s+a; } return(s); } main() { printf("%dn",fun(10));} (4) 编写函数sort1,在sort1中用冒泡排序法将无序数组进行从大到小排序。在主函数 中输入无序数组的各元素值,将数组名称和元素个数传递给sort1的形参。 void sort1(int a[ ],int n) {int i,j,t; 附录 各章习题参考答案 for(i=0; i
版权声明:本文标题:《C语言程序设计(第五版)》习题答案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1714058051a663676.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论