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 (x1)

y

2x1 (1x10)

3x 11 (x10)

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 /* s=a+(a*10+a)+((a*10+a)*10+a)+ ... */

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

for(j=0;j

if(a[j]

• 29 •

}

#include

main()

{int i,b[10];

for(i=0;i<10;i++) scanf("%d", &b[i]);

sort1(b,10);

for(i=0;i<10;i++) printf("%d,",b[i]);

}

(5) 编写函数sort2,在sort2中用选择排序法将无序数组进行从小到大排序。在主函数

中输入无序数组的各元素值,将数组名称和元素个数传递给sort2的形参。

void sort2(int a[ ],int n)

{ int i,j,t,p;

for(i=0; i

{ p=i;

for(j=i+1;j

if(a[j]

if(p!=i) { t=a[p]; a[p]=a[i]; a[i]=t; }

}

}

#include

main()

{int i,b[10];

for(i=0;i<10;i++) scanf("%d", &b[i]);

Sort2(b,10);

for(i=0;i<10;i++) printf("%d,",b[i]);

}

(6) 编写函数aver,aver的功能是计算数组元素的平均值,用return返回该平均值。

在主函数中输入数组的各元素值,将数组名称和元素个数传递给aver的形参,主函数根据

aver的返回值,输出大于平均值的数组元素。

float aver(int a[ ],int n)

{int i; float s=0;

for(i=0; i

return(s/n);

}

#include

main()

{int i,b[10]; float t;

for(i=0;i<10;i++) scanf("%d", &b[i]);

t=aver(b,10);

for(i=0;i<10;i++) if (b[i]>t) printf("%d,",b[i]);

}

(7) 编写函数delete_char(char str[ ],char ch),其功能是从字符串str中删除所有由ch指

定的字符。主函数调用delete_char,传递两个参数,输出删除之后的字符串。

void delete_char(char str[ ],char ch)

{ int j,k;

for(j=0,k=0;str[j]!='0';j++) if(str[j]!=ch) str[k++]=str[j];

str [k]='0';

}

#include

main()

{str ch,str[50];

printf("请输入一个字符串:"); gets(str);

printf("请输入一个字符:"); ch=getchar( );

delete_char(str,ch); puts(str);

}

(8) 编写函数calcu(float a,float b),calcu功能是用梯形法计算一元多项式f(x)=1+x

2

区间(a,b)上的定积分。在主函数中输入两个积分区间端点的值,传递给calcu的a和b。

float f(float x)

{float y; y=1+x*x; return(y); }

float calcu(float a, float b )

{ int k, n ; float f1,f2,s=0;

scanf("%d", &n) ; h=(b-a)/n ;

for (k=1; k<=n ; k++)

{ f1=f(a+(k-1)*h); f2=f(a+k*h); s=s+(f1+f2)*h/2 ; }

return(s);

}

#include

main()

{ float a,b,sum; scanf("%d,%d", &a,&b) ;

sum= calcu(a,b); printf("定积分为:%fn",sum);

}

(9) 编写函数count,求解如下问题:若一头小母牛,从出生起第四个年头开始每年生

一头母牛,不考虑其它因素,按此规律,第n年时有多少头母牛。n值在主函数中输入。

设母牛总数为sum,用数组元素存放各种母牛数。a[1] 存放1岁母牛数,a[2] 存放2

岁母牛数,a[3] 存放3岁母牛数,a[4] 存放4岁和4岁以上母牛数。函数count如下。

unsigned count(unsigned n)

{ int i, sum=0, a[5];

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

{if (i==1) {a[1]=1; a[2]=a[3]=a[4]=0; }

else if (i==2) {a[1]=0;a[2]=1;a[3]=a[4]=0;}

else if (i==3) {a[1]=a[2]=0;a[3]=1;a[4]=0;}

else

{a[4]=a[3]+a[4]; a[3]=a[2]; a[2]=a[1]; a[1]=a[4]; }

}

附录 各章习题参考答案

for (i=1;i<=4;i++) sum=sum+a[i];

printf("%u",sum);

}

• 31 •

本题也可以使用递归函数编写如下程序。

unsigned count(unsigned n)

{ if(n<=3) return(1);

else return(cow(n-1)+cow(n-3));

}

#include

main()

{ float n,sum; scanf("%d", &n) ;

sum= count( n); printf("母牛数为:%dn",sum);

}

(10) 定义包含10个元素的整型数组为全局变量。编写函数fun1、fun2、fun3、fun4,

fun1计算并输出数组元素的最大值;fun2计算并输出数组元素的最小值;fun3统计并输出

数组元素中等于整数n的数组元素个数;fun4查找整数k在数组中的位置。在主函数中可

以分别调用上面4个函数,整数n和k的值从键盘输入。

#include

int a[10]={23,12,35,46,37,26,29,30,18,15};

int fun1( )

{int i,max; max=a[0];

for(i=1; i<10; i++) if (a[i]>max) max=a[i];

printf("最大值为:%dn", max);

}

int fun2( )

{int i,min; max=a[0];

for(i=1; i<10; i++) if (a[i]

printf("最小值为:%dn", min);

}

int fun3( int n)

{int i,k; k=0;

for(i=0; i<10; i++) if (a[i]==n) k++;

printf("%d的个数为:%dn", n,k);

}

int fun4( int k)

{int i;

for(i=0; i<10; i++) if (a[i]==k) printf("%d在数组中的下标为:%dn", k,i);

}

main()

{int d,n,k;

while(1)

{ printf("1. 求数组元素的最大值n");

printf("2. 求数组元素的最小值n");

printf("3. 统计并输出数组元素中等于整数n的数组元素个数n");

printf("4. 查找整数k在数组中的位置n");

printf("5. 退出n");

scanf("%d",&d);

if (d==1) fun1();

else if (d==2) fun2();

else if (d==3) {printf("请输入整数n的值:"); scanf("%d",&n); fun3(n); }

else if (d==4) {printf("请输入整数k的值:"); scanf("%d",&k);

else {printf("程序结束!");break;}

}

}

第8章 习题参考答案

1. 阅读下列程序,写出运行结果。

(1)

#include

#define MIN(x,y) (x)<(y)?(x):(y)

int main( )

{int i=10, j=15, k;

k=10*MIN(i,j); printf("%d", k);

return 0;

}

输出:100

(2)

#include

#define N 2

#define M N+1

#define NUM 2*M+1

int main()

{ int i;

for(i=1;i<=NUM;i++) printf("%dn",i*i);

return 0;

}

输出:1

4

9

16

25

36

(3)

#include

#define ADD(x) x*x+2*x+3

fun4(k); }

附录 各章习题参考答案

int main()

{ int i, sum=0;

for(i=1;i<6;i++) sum=sum+ADD(i);

printf("%dn", sum);

return 0;

}

输出:100

• 33 •

(4)

#include

#define PI 3.141596

int main()

{int r=10; float v;

while(r>0)

{ v=3*PI*r*r*r;

if (v<=3*PI) printf("v=%10.4fn", v);

r--;

}

return 0;

}

输出:v= 9.4248

(5)

#include

#define PI 3.1416

#define R 100

#define AREA printf("area=%10.4fn", PI*R*R);

int main()

{ int i,j; char ch=‘*’;

for(i=1;i

{ printf("%c", ch);

AREA

printf("%cn", ch);

}

return 0;

}

输出:*area=31416.0000*

*area=31416.0000*

*area=31416.0000*

(6)

#include

#define N 10000

#define V(x,y,z) (x)*(y)*(z)

int main()

{int a,b,c; a=0; b=2; c=4;

do

{ printf("%d,", V(a,b+1,c+2));

a=a+50; b++; c--;

}while(a

return 0;

}

输出:0,1000,

(7)

#include

#define T1 (n) ((n)*(n) *(n))

#define T2 (n) (n*n *n)

int main()

{int i=1;

while(i<10)

{printf("%d,%dn ", T1(i+1),T2(i+1)); i=i+3; }

return 0;

}

输出:8,4

125,13

512,22

(8)

/*文件file1.c的内容如下*/

#include

#include "file2.c "

int main()

{ int x,y,z;

scanf(“%d,%d”, &x,&y); /*输入5和6*/

z=fun(x+1)+fun(2*y-5);

printf(“%dn”, z);

return 0;

}

/*文件file2.c的内容如下*/

int fun(int m)

{ int i,t=1;

for(i=1;i<=m;i++) t=t*i;

return (t);

}

输出:5760

2. 编写程序。

(1) 分别用函数和带参数的宏编写:已知圆柱的底面半径和高,计算圆柱体积。

用函数编写的程序代码如下:

volume (float r,float h)

{ float pi=3.14; return(pi*r*r*h); }

main()

{ float r,h; scanf("%f,%f", &r ,&h); printf("体积=%fn", volume (r,h)); }

用带参数的宏编写的程序代码如下:

#define V(r,h) 3.14*r*r*h

main()

附录 各章习题参考答案

• 35 •

{ float r1, h1, v; scanf("%f,%f", &r1, &h1); printf("体积=%fn", V(r1,h1)); }

(2) 分别用函数和带参数的宏编写:交换两个变量的值。

用函数编写的程序代码如下:

exchange(int b[2] )

{ int t; t=b[0]; b[0]=b[1]; b[1]=t; }

main()

{int a[2]; scanf("%d,%d", &a[0], &a[1]); printf("%d,%dn", a[0], a[1]); /*交换前的值*/

exchange(a); printf("%d,%dn", a[0],a[1]); /*交换后的值*/

}

用带参数的宏编写的程序代码如下:

#define JH(x,y,z) z=x; x=y; y=z

main()

{ int a,b,t; scanf("%d,%d", &a, &b); printf("%d,%dn", a,b); /*交换前的值*/

JH(a,b,t); printf("%d,%dn", a,b); /*交换后的值*/

}

(3) 分别用函数和带参数的宏编写:已知长方体的长、宽、高,计算长方体的体积。

用函数编写的程序代码如下:

volume (float a,float b, float c)

{ float v; v=a*b*c; return(v); }

main()

{ float x,y,z; scanf("%f,%f,%f", &x ,&y,&z); printf("体积=%fn", volume (x,y,z)); }

用带参数的宏编写的程序代码如下:

#define V(a,b,c) a*b*c

main()

{ float x,y,z; scanf("%f,%f,%f", &x ,&y,&z); printf("体积=%fn", V(x,y,z)); }

(4) 分别用函数和带参数的宏编写:已知内环半径和外环半径,计算圆环的面积。

用函数编写的程序代码如下:

area (float r1,float r2)

{ float s,pi=3.14; s=pi*r1*r1-pi*r2*r2; return(s); }

main()

{ float ra,rb; scanf("%f,%f ", &ra,&rb); printf("圆环面积=%fn", area(ra,rb)); }

用带参数的宏编写的程序代码如下:

#define S(r1,r2) 3.14*r1*r1-3.14*r2*r2

main()

{ float ra,rb; scanf("%f,%f", &ra,&rb); printf("圆环面积=%fn", S(ra,rb)); }

(5) 分别用函数和带参数的宏编写:找出4个数中的最大数。

用函数编写的程序代码如下:

fun(int x, int y)

{ int z; z=(x>y)?x:y; return(z); }

main()

{ int a,b,c,d,max; scanf("%d,%d,%d,%d", &a, &b,&c,%d);

max=fun(fun(a,b), fun(c,d)); printf("%d n", max);

}

用带参数的宏编写的程序代码如下:

#define F(x,y) (x>y)?(x):(y)

main()

{ int a,b,c,d,e,f,max; scanf("%d,%d,%d,%d",&a,&b,&c,&d);

e=F(a,b); f=F(c,d); max=F(e,f); printf("%d n", max);

}

(6) 分别用函数和带参数的宏编写:已知三角形的边长a、b、c,利用下面的公式计算

三角形的面积s。

用函数编写的程序代码如下:

#include "math.h"

fun(int a,int b,int c)

{ float p,s; p=(a+b+c)/2.0; s=sqrt(p*(p–a)*(p–b)*(p–c)); return(s); }

main()

{ int x,y,z; scanf("%d,%d,%d ",&x,&y,&z); printf("%f n", fun(x,y,z); }

用带参数的宏编写的程序代码如下:

#include "math.h"

#define T(a1,a2,a3) (a1+a2+a3)/2.0

#define S(p,x,y,z) sqrt(p*(p–x)*(p–y)*(p–z))

main()

{ int a,b,c; float q,area; scanf("%d,%d,%d",&a,&b,&c);

q=T(a,b,c); area=S(q,a,b,c); printf("%f n", area);

}

第9章 习题参考答案

1. 阅读程序,写出运行结果。

(1)

#include

附录 各章习题参考答案

int main()

{ int i, j, *p, *q;

i=2; j=10; p=&i; q=&j; *p=10; *q=2; printf("i=%d,j=%dn",i,j);

return 0;

}

输出:i=10, j=2

• 37 •

(2)

#include

int main()

{ int *p1,*p2,a[5]={1,2,3,4,5}; p1=a; p2=&a[4]; printf("%d, %dn",*p1,*p2);

p1++; p2--; printf("%d,%dn",*p1,*p2);

return 0;

}

输出:1,5

2,4

(3)

#include

int main()

{ char *p, s[ ]="abcdefg"; p=s; printf("%c,%cn",*p,*(p+5));

p=p+2; printf("%sn", p);

return 0;

}

输出:a,f

cdefg

(4)

#include

int main()

{int a[ ]={1,2,3,4,5,6},*p,s=0;

for(p=&a[5]; p>=a; p––) { printf("%d,",*p); s=s+*p; }

printf("%dn", s);

return 0;

}

输出:6,5,4,3,2,1,21

(5)

#include

int main()

{ int i,a[3][4]={{1,2,3.4},{5,6,7,8},{9,10,11,12}},*p1,*p2, *p3,s1=0,s2=0,s3=0;

p1=a; p2=a[1]; p3=a[0]+2;

for(i=0; i<3*4; i++,p1++) s1=s1+*p1; /*计算a数组所有12个元素之和*/

for(i=0; i<4; i++) s2=s2+*(p2+i); /*计算a数组第2行的4个元素之和*/

for(i=0; i<3; i++,p3=p3+4) s3=s3+*(p3+i); /*计算a数组第3列的3个元素之和*/

printf("%d, %d, %dn",s1,s2,s3);

}

输出:78,26,21

(6)

#include

int main()

{ int i; char a[3][5]={ "abcd","efgh","kxyz"},(*p)[5]; p=a;

for(i=0; i<3; i++) printf("%s,", a+i); printf("n");

for(i=0; i<3; i++) printf("%s,", a[i]); printf("n");

for(i=0; i<3; i++) printf("%s,", p+i); printf("n");

return 0;

}

输出:abcd,efgh,kxyz

abcd,efgh,kxyz

abcd,efgh,kxyz

2. 编写程序(要求用指针)。

(1) 从键盘输入3个整数,定义3个指针变量p1,p2,p3,使p1指向这3个数的最大

变量,p2指向次大变量,p3指向最小变量,然后按由大到小的顺序输出这3个数。

# include "stdio.h"

main()

{ int a1,a2,a3,*p=NULL,*p1,*p2,*p3; p1=&a1; p2=&a2; p3=&a3;

scanf("%d,%d,%d",p1,p2,p3);

if (*p1<*p2) {p=p1; p1=p2; p2=p; }

if (*p1<*p3) {p=p1; p1=p3; p3=p; }

if (*p2<*p3) {p=p2; p2=p3; p3=p; }

printf("%d,%d,%dn",*p1,*p2,*p3);

}

(2) 对包含100个整数的一维数组,找出其中能被3或5整除的数存储到另外一个数

组中。

main()

{ int i,j=0,a[100],b[100],*p;

for (p=a ,i=0;i<100;i++) scanf("%d",p++);

for (p=a ,i=0;i<100;i++,p++)

if ((*p)%3==0||(*p)%5==0) b[j++]=*p;

for (i=0;i

}

(3) 按照字典排序方式给若干个字符串排序。

#include

main()

{char *cp[6]={"red","green","blue","white","yellow","black"}; int i,j,k; char *t;

for (i=0;i<6;i++) /*选择排序法*/

{ k=i;

for (j=i+1;j<6;j++)

if (strcmp(cp[j],cp[k])<0) k=j;

if (k!=i) { t=cp[i]; cp[i]=cp[k]; cp[k]=t; }

}

for (i=0;i<6;i++) printf("n%s",cp[i]);

}

(4) 计算从键盘输入的100个实数的平均值,并输出这100个实数以及平均值。

附录 各章习题参考答案

main()

{ int i; float a[100],*p, aver=0;

for (p=a ,i=0;i<100;i++) scanf("%f", p++);

for (p=a,i=0;i<100;i++,p++) aver=aver+*p;

aver=aver/100;

for (p=a,i=0;i<100;i++,p++) printf("%f, ", *p);

printf("%fn",aver);

}

• 39 •

(5) 输入一串字符,统计其中字符a~f每个的出现频率(百分比)。

main()

{int i,j,num[6]={0},n=0; char s[40]; printf ("please input:"); scanf ("%s",s);

for (i=0;s[i]!='0';i++)

{n++; j=s[i]-'a';

if (j>=0 && j<=5) num[j]++;

}

for (i=0;i<6;i++)

{num[i]=num[i]*100.0/n+0.5;

printf("%d %% ,",num[i]);

}

}

(6) 编写一函数,不用字符串连接函数strcat,完成两个字符串的连接。

char *concat(char *dst,char *src)

{char *p,*q; p=dst;

while (*p!= '0' ) p++;

for (q=src; *q!= '0'; q++,p++) *p=*q;

*p='0';

return(dst);

}

main()

{char s1[80],s2[40];

gets(s1);gets(s2); puts(concat(s1,s2));

}

(7) 找出矩阵某一行(行数从键盘输入,行数从0开始)中的最大数。

# define M 4

# define N 8

main()

{ int n,i,j,max,s[M][N],(*p)[N]; p=s

for (i=0;i

for (j=0;j

printf("请输入行下标(从0开始):"); scanf("%d",&n);

max=s[n][0];

for (j=1;j

printf("行下标为%d的一行中最大数是%d",n,max);

}

(8) 从键盘输入a和b两个整数,在矩阵中查找与a相同的数,找到后用b替换。

#define M 3

#define N 5

main()

{ int a,b,i,j,s[M][N],*p; p=s; /*设矩阵为M行N列*/

for (i=0;i

for (j=0;j

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

for (i=0;i

for (j=0;j

if (s[i][j]==a) s[i][j]=b;

}

(9) 输入一个1到10的整数,输出与该整数对应的英语单词。例如,输入1,输出one;

输入2,输出tow;…;输入10,输出ten。

#include "stdio.h"

char *month_name(int n);

main()

{int n; printf ("nPlease enter 1 integer(1—10):"); scanf("%d",&n);

if (n>=1||n<=10) printf ("%d, %sn",n,month_name(n));

else printf ("Input error! n");

}

char *month_name(int n)

{static char *name[ ]=

{"","one","two","three","four","five","six","seven","eight ","nine","ten",);

return (name[n]);

}

(10) 已知两维数组中存放了20个不同的单词(每个小于10个字符)。从键盘输入一

个单词,查找该单词所在的位置(行数)。

#include "stdio.h"

#include "string.h"

main( )

{ int n,m=-1; char s[20][10], c[10],(*p)[10]; p=s; /*s存放20个单词,c存放一个单词*/

for (n=0; n<20; n++,p++) gets(p); /*输入20个单词,分别存放在数组s的每一行*/

gets(c); /*输入一个被查找的单词*/

for (p=s, n=0; n<20; n++,p++)

if(strcmp(p,c)==0) { m=n; break; }

if(m==-1) printf("找不到!n");

else printf("%s位于两维数组的第%d行.n", c, m+1);

}

(11) 编写一函数,对存储在一维数组中的英文句子,统计其中的单词个数。单词之间

用空格分隔。

#include "stdio.h"

int count_word(char *str);

main()

{ char str1[80],c,res; puts("nPlease enter a english sentence:"); gets(str1);

printf("There are %d words in this sentence",count_word(str1));

}

int count_word(char *str)

{int count,flag; char *p; count=0; flag=0; p=str;

while (*p!='0')

附录 各章习题参考答案

• 41 •

{if (*p==32) flag=0; /*空格的ASCII码为32*/

else if (flag==0) { flag=1; count++; } /* 若p指向的字符不是空格,则单词出现了 */

p++;

}

return(count);

}

(12) 用矩形法分别求函数y=sin(x)在[0,1]区间上的定积分、y=cos(x)在[–1,1]区间上的

定积分、y=5x

2

+6x+7在[1,3]区间上的定积分,要求使用指向函数的指针变量。

# include "math.h"

float f1(float x) /*计算y=sin(x)函数值*/

{float y; y=sin(x); return(y);}

float f2(float x) /*计算y=cos(x)函数值*/

{float y; y=cos(x); return(y);}

float f3(float x) /*计算y=5x

2

+6x+7函数值*/

{float y; y=5*x*x+6*x+7;return(y);}

float djf(float (*p)(float), float e, float f) /*矩形法求定积分*/

{int i,n=100; float h,s=0,x;

h=(f-e)/100; x=e;

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

{x=x+h;

s=s+h*(*p)(x);

}

return(s);

}

main()

{float a,b,s1,s2,s3,(*p)(float);

a=0; b=1; p=f1; s1=djf(p,a,b);

a=-1; b=1; p=f2; s2=djf(p,a,b);

a=1; b=3; p=f3; s3=djf(p,a,b);

printf("%f,%f,%fn",s1,s2,s3);

}

第10章 习题参考答案

1. 阅读程序,写出运行结果。

(1)

#include

struct jgt {int a; int b; } sz[2]={1, 3, 2, 7};

int main()

{printf ("%dn",sz[0].b*sz[1].a); return 0;}

输出:6

(2)

#include

struct stu {int num; char name[10]; int age; };

void fun (struct stu *p)

{printf("%sn", (*p).name); }

int main()

{struct stu students[3]={{0201,"Zhang",20},{0202,"Wang",19},{0203,"Zhao",18}};

fun(students+2);

return 0;

}

输出:Zhao

(3)

#include

int main()

{union {long i; int k; char ii; char s[4]; } mix;

mix.i=0x12345678; printf("mix.i=%lxn",mix.i);

printf("mix.k=%xn",mix.k); printf("=%xn",);

printf("mix.s[0]=%x t mix.s[1]=%xn",mix.s[0],mix.s[1]);

printf("mix.s[2]=%x t mix.s[3]=%xn",mix.s[2],mix.s[3]);

return 0;

}

输出:12345678

12345678

mix.s[0]=12 mix.s[1]=34

mix.s[2]=56 mix.s[3]=78

(4)

enum color {red, yellow, green, blue ,white, black};

char *name[ ]={"red","yellow","green","blue","white","black"};

int main()

{enum color co1 ,co2; co1= green; co2= black;

printf("%d , %d ,t" , co1 , co2);

printf("%s , %sn" , name[(int)co1] , name[(int)co2]);

return 0;

}

输出:2,3, green, blue

2. 编写程序。

(1) 有100种商品的数据记录,每个记录包括“商品编号”、“商品名”、“单价”和

(总价=单价*数量)的计算。

#define N 100

struct sp {char snum[20]; char sname[20]; float price; int total; float sum; };

main( )

{struct sp a[N]; int i;

for (i=0 ; i

{scanf("%s", a[i].snum); scanf("%s", a[i].sname); scanf("%f", &a[i].price);

scanf("%d", &a[i].total); a[i].sum=a[i].price*a[i].total;

}

for (i=0 ; i

“数量”。请用结构体数组实现对每种商品总价

附录 各章习题参考答案

printf("%s,%s,%f,%d,%fn", a[i].snum, a[i].sname, a[i].price, a[i].total, a[i].sum);

}

• 43 •

(2) 有若干个学生的数据,每个学生的数据包括“学号”、“姓名”和3门课的成绩。

请计算每个学生3门课的平均成绩,然后输出每个学生的数据(包括平均成绩)。

# define M 50 /*不妨设有M个学生*/

struct stud {char num[5]; char name[10]; int score[3]; float aver }

main( )

{int i,j,k ; struct stud s[M];

for (i=0 ; i

{ scanf("%s", s[i].num); scanf("%s", s[i].name); k=0;

for(j=0; j<=2; j++)

{scanf("%d", &s[i].score[j]); k=k+s[i].score[j]; }

s[i].aver=k/3.0 ;

}

for (i=0 ; i

{printf("%5s%12s", s[i].num, s[i].name);

for (j=0; j<=2; j++) printf("%6d", s[i].score[j]);

printf("%7.2f ",s[i].aver);

printf("n");

}

}

(3) 有若干个学生的数据,每个学生的数据包括“学号”、“姓名”和3门课的成绩。

请用结构体数组和结构体指针变量编程:输出成绩小于60的学生的“学号”、“姓名”(只

要有一门课的成绩小于60就输出)。

# define M 50 /*设有M个学生*/

struct stud {char name[10]; int num; int score[3]; }

main( )

{int i,j,k ; struct stud s[M],*p;

for (p=s,i=0 ; i

{ scanf("%s", (*p).name); scanf("%d", &(*p).num);

for(j=0; j<=2; j++)

scanf("%d", &(*p).score[j]);

}

for (p=s,i=0 ; i

for (j=0; j<=2; j++)

if (p->score[j]<60) { printf("%d,%sn", p->num, p->name);break;}

}

(4) 现有学生数据需要处理,已知学生人数不超过100人,学生数据包含学号(num)、

姓名(name)及英语(english)、数学(math)、计算机(comput)三门课成绩以及总分成绩(total)。

编程实现通过键盘输入除总分以外的其他学生信息,统计每个学生的总分和全部学生的总

平均分,然后按学生的总分对所有学生信息进行降序排序:如果学生总分相同,则按学号

从小到大的顺序排序。要求把所有学生数据放在一个结构体数组中。

#define N 100

#include

#include

#include

struct student

{unsigned long num; char name[20]; float english; float math; float comput; float total;};

void sort_by_total(struct student s[ ], int n)

{int i,j; unsigned long h1; char h2[20]; float h3;

for(i=0;i<=n-2;i++) /*冒泡排序*/

for(j=0;j<=n-2-i;j++) /*通过比较,交换s[j]与s[j+1]的各成员值,使数组元素降序排列*/

if (s[j].totals[j+1].num)

{ h1=s[j].num; s[j] .num =s[j+1] .num; s[j+1] .num =h1;

strcpy(h2,s[j].name); strcpy(s[j] .name ,s[j+1] .name); strcpy(s[j+1] .name ,h2);

h3=s[j]. english; s[j] . english =s[j+1] . english; s[j+1] . english =h3;

h3=s[j]. math; s[j] . math =s[j+1] . math; s[j+1] . math =h3;

h3=s[j]. comput; s[j] . comput =s[j+1] . comput; s[j+1] . comput =h3;

h3=s[j]. total; s[j] . total =s[j+1] . total; s[j+1] . total =h3;

}

}

int main()

{struct student stu[N]; int n,i; /*n表示实际学生数,由键盘输入*/

float aver=0.0; printf("the number of student:"); scanf("%d",&n);

for(i=0;i

{printf("input student data of %d:n",i+1);

scanf("%ld",&stu[i].num); scanf("%s",stu[i].name);

scanf("%f,%f,%f",&stu[i].english,&stu[i].math,&stu[i].comput);

stu[i].total=stu[i].english+stu[i].math+stu[i].comput;

aver=aver+stu[i].total;

}

aver= aver/n; sort_by_total(stu,n);

printf("---the scores of students(sorted by total descendly)---n");

printf("tNumbertNametEnglishtMathtComputtTotaln");

for(i=0;i

printf("t%ldt%st%.2ft%.2ft%.2ft%.2fn",

stu[i].num,stu[i].name,stu[i].english,stu[i].math,stu[i].comput,stu[i].total);

printf("the total average score:%.2fn",aver);

return 0;

}

(5) 创建一个链表,每个结点包括数据域和指针域,其中数据域类型为short型。

#define M 5 /*不妨设节点数为M*/

#include "stdlib.h"

#include "stdio.h"

struct list { int data; struct list *next; };

main()

{ struct list *ptr,*head; int num,i; ptr=( struct list *)malloc(sizeof(struct list)); head=ptr;

printf("请输入每个节点的数据==>n");

for(i=0;i<=M;i++)

{scanf("%d",&num); ptr->data=num; ptr->next=( struct list *)malloc(sizeof(struct list));

if(i==M) ptr->next=NULL;

else ptr=ptr->next;

}

ptr=head;

while(ptr!=NULL)

{ printf("节点值==>%dn",ptr->data); ptr=ptr->next; }

}

附录 各章习题参考答案

• 45 •

(6) 编写一个函数, 用于连接两个链表,函数原型为struct list * con_list(struct list * h1,

struct list* h2),实现将链表h2链接在链表h1的尾部,其中h1,h2分别是两个链表的头

指针。

#include "stdlib.h"

#include "stdio.h"

struct list{ int data; struct list *next; };

struct list *con_list(struct link * h1,struct link * h2)

{ struct list * tmp; tmp=h1;

while(tmp->next!=NULL) tmp=tmp->next;

tmp->next=h2;

return(h1);

}

(7) 设链表结点定义为“struct node { char ch; struct node *link;};”。编写一个函数struct

node * create_list(char *str),用于实现根据由参数str指定的字符串建立一个单链表,要求

链表中字符的存放顺序是原字符串str的逆序。

struct node *create_list(char *str)

{ struct node *head,*p; head= NULL;

while(*str!= '0')

{ if (head==NULL)

{head=(struct node *) malloc(sizeof(struct node));

head->ch=*str; head->link=NULL;

}

else

{p=(struct node *)malloc(sizeof(struct node));

p->ch=*str; p->link=head; head=p;

}

str++;

}

return (head);

}

(8) N个人(每个人有一个编号,按顺序取1到N之间的一个自然数)围成一圈,从第1

个人开始顺序报号1、2、3、……、M,凡报到M者退出圈子;然后留在圈子里的从下一

个人开始继续顺序报号1、2、3、……、M,报到M者又退出圈子,依次类推,直到圈子

里只有一个人。打印最后留在圈子里的人的编号。

#define N 13 /*不妨设N为13*/

#define M 3 /*不妨设M为3*/

struct per{int num; int next;} shu[N+1];

main( )

{int i, count=0, h ;

for (i=1; i<=N-1; i++)

{shu[i].num=i; /*第i个人的编号*/

shu[i].next=i+1; /*第i个人后面的人的编号*/

}

shu[N].num=N; shu[N].next=1; /*编号为N的人后面的人是编号为1的人*/

h=N;

while (count

{i=0;

while(i!=M) /*顺序报号,报到M时,报号为M者从圈里退出*/

{h=shu[h].next;

if (shu[h].num!=0) i++;

}

printf("%5d", shu[h].num); /*打印从圈里退出的人的编号*/

shu[h].num=0; /*凡从圈里退出的人,编号变为0*/

count++;

}

for (i=1; i<=N; i++) /*最后留在圈子里的人的编号不等于0*/

if (shu[i].num!=0)

printf("%5d", shu[h].num); /*打印最后留在圈子里的人的编号*/

}

第11章 习题参考答案

1. 阅读程序,写出运行结果。

(1)

#include

int main()

{unsigend a,b,c; a=077; b=03; c=a&b;

printf("The %o &%o is %o n", a,b,c);

b=07; c=a&b;

printf("The %o & %o is %o n", a,b,c);

return 0;

}

输出:The77&3is3

The77&7is7

(2)

#include

int main()

{unsigend a,b,c; a=077; b=03; c=a|b;

printf("The %o | %o is %o n", a,b,c);

b=07; c=a|b;

printf("The %o | %o is %o n", a,b,c);

return 0;

}

输出:The77 | 3is77

The77 | 7is77

(3)

#include

int main()

{unsigend a,b; a=077; b=03; c=a^b;

printf("The%o ^ %o is %o n", a,b,c);

附录 各章习题参考答案

b=07; c=a^b;

printf("The%o ^ %o is %o n", a,b,c);

return 0;

}

输出:The77 ^ 3 is74

The77 ^ 7 is70

• 47 •

(4)

#include

int main()

{ unsigned a,b;

printf("Pleas input a number: "); scanf("%d",&a); /*输入80*/

b=a>>3;

printf("%d>>3is%d n",a,b);

return 0;

}

输出:80>>3is10

2. 编写程序。

(1) 取unsigned short型变量a中存放的数从右端开始的4~7位(二进制)。

(注意:位号是从0开始的, 右端开始位号是0,然后是1、2,依此类推。)

可以这样考虑:首先使a右移4位(二进制),使原来的右端开始的4~7位成为右端开

始的0~3位。让a与15(二进制形式为00000000 00001111)进行&运算。代码如下:

main()

{ unsigned a,b,c,d; scanf("%o",&a);

b=a>>4; c=15; d=b&c; printf("%on%on",a,d);

}

(2) 输入一个八进制整数(大于0且小于77777),赋给unsigned short型变量a,将其二

进制形式左边第k位数码取出来,然后以八进制形式输出。例如,若a=017325(二进制形

式为0101),若k=6,则取出来的是1,以八进制形式输出为1;若k=8,则取

出来的是0,以八进制形式输出为0。

main()

{unsigned short a,b1,b2,c,k; scanf("%o",&a) ; scanf("%d",&k) ;

b1=~0; b2=(b1>>(k-1)) & (b1<<(16-k)); /* b2的二进制形式是:第k位是1,其余位是0*/

c=a&b2; c=c>>(16-k); printf("%on",c);

}

(3) 输入一个八进制整数(大于0且小于77777),赋给unsigned short型变量a,将其二

进制形式从左边第k1位到k2位之间的数码取出来,然后将这些数码按原位置关系组成的

二进制数以八进制形式输出。例如,a=017325(二进制形式为0101),k1=6,

k2=9,则取出来的是1101,以八进制形式输出为15。

main()

{unsigned short a,b1,b2, c,k1,k2; scanf("%o",&a) ; scanf("%d,%d",&k1,&k2) ;

b1=~0; b2=(b1>>(k1-1)) & (b1<<(16-k2));

/* b2的二进制形式是第k1位到k2位数码都是1, 其余数码是0*/

c=a&b2; c=c>>(16-k2); printf("%on",c);

}

(4) 输入一个八进制整数,赋给unsigned short型变量a,再输入一个十进制整数n(大

于等于–16且小于等于16)。n>0时将a的二进制形式循环右移n位,n<0时将a的二进制

形式循环左移n位。例如,若输入a等于(53267)

8

,则a的二进制形式为0111);

若输入n=3,循环右移后a变为(1110),即八进制数(165326)

8

;若输入n= –4,

循环左移后a变为0101),即八进制数(65565)

8

moveright(unsigned int a,int n)

{unsigned int z; z=(a>>n)|(a<<(16-n));

return(z);

}

moveleft(unsigned int a,int n)

{unsigned int z; z=(a<>(16-n));

return(z);

}

main()

{unsigned short int a; int n; scanf("%o",&a); scanf("%d",&n);

if (n>0) printf("循环右移的结果: %on", moveright(a,n));

else

{n=-n; printf("循环左移的结果: %on",moveleft(a,n)); }

}

第12章 习题参考答案

1. 阅读程序,写出运行结果。

(1)

#include

int main()

{FILE *fp; char ch, fname[10];

printf("输入一个文件名:"); gets(fname);

if ((fp=fopen(fname,"w+"))==NULL)

{printf("不能打开%s文件n",fname); exit(0); }

printf("请输入若干个字符,以字符#结尾:n");

while ((ch=getchar())!='#')

if ('a'<=ch && ch<= 'z') fputc(ch,fp);

else putchar(ch);

fclose(fp);

return 0;

}

若运行该程序时输入如下内容,则指定文件的内容是什么?

abcdefgh123456ab#↙

回答:指定文件的内容是:abcdefghab

附录 各章习题参考答案

• 49 •

(2) 已知文件的内容是:ghm345tuA**DEj963aHbvx##tipRT567。

#include

int main()

{FILE *fp; char ch; fp=fopen("", "r");

while (!feof(fp))

{ ch=fgetc(fp);

if (!(('a'<=ch && ch<= 'z') ||('A'<=ch && ch<= 'Z') )) putchar(ch);

}

fclose(fp);

return 0;

}

输出:345**963##567

(3)

#include

int main()

{FILE *fp; int i,n; fp=fopen("temp", "w+");

for (i=1;i<=9;i++) fprintf(fp, "%3d",i);

for (i=3;i<=7;i=i+2)

{ fseek(fp,i*3L,SEEK_SET);

fscanf(fp, "%3d",&n);

printf("%3d",n);

}

fclose(fp);

return 0;

}

输出:4 5 6 7 8

(4)

#include

#define N 5

struct product {int num; int year; int month; int day; }

struct product

a1[N],a2[N]={{1,1990,3,1},{2,1991,4,8},{3,1990,1,9},{4,1990,7,5},{5,1991,6,4}};

int main()

{ int i,s=0; FILE *fp;

if ((fp=fopen("", "wb+")) == NULL) { printf("不能建立文件!n"); exit(0); }

for(i=0;i

for(i=0;i

{fread(&a1[i], sizeof(struct product),1,fp);

if (a1[i].year%2==1) s=s+ a1[i].day;

}

printf("%d", s); fclose(fp);

return 0;

}

输出:12

2. 编写程序。

(1) 从键盘输入一个文件名,然后从键盘输入一些字符,逐个把这些字符送到磁盘文

件中去,直到输入一个'#'为止。

#include "stdio.h"

main()

{ FILE *fp; char ch,filename[10]; gets(filename);

if((fp=fopen(filename,"w"))==NULL) {printf("Cannot open filen"); exit(0); }

ch=getchar();

while(ch!='#')

{fputc(ch,fp); putchar(ch); ch=getchar(); }

fclose(fp);

}

(2) 从键盘输入一个字符串,将字符串中的小写字母全部转换成大写字母,然后将转

换后的字符串送到一个磁盘文件中保存。

#include "stdio.h"

main()

{ FILE *fp; char str1[100]; int i=0;

if((fp=fopen("test","w"))==NULL) { printf("Cannot open the filen"); exit(0); }

printf("Please input a string:n"); gets(str1);

while(str1[i]!='0')

{ if(str1[i]>='a' && str1[i]<='z') str1[i]=str1[i]-32; fputc(str1[i],fp); i++; }

fclose(fp);

}

(3) 请完成如下功能:将二维数组a的每一行均除以该行上的主对角元素(第1行除以

a[0][0],第2行除以a[1][1],依此类推),然后将a数组的所有元素值写入到当前目录下新

建的文件中。

#include

main()

{FILE *p; int i,j; float b, a[4][4]={{ 3,2,7, 6},{5,1,4,7},{8,4,1,9},{4,5,3,1}};

p=fopen("","w");

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

{ b=a[i][i];

for(j=0;j<4;j++) a[i][j]/=b;

}

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

{for(j=0;j<4;j++) fprintf(p,"%10.6f",a[i][j]);

fprintf(p,"n");

}

fclose(p);

}

(4) 在正整数中找出一个能被3、5、7、9除且余数分别为1、3、5、7的最小的数,

将该数以格式"%d"写到文件中。

#include

#include

main()

{FILE *p ; int i=1 ; p=fopen ("","w");

附录 各章习题参考答案

while ((i%3!=1) || (i%5!=3) || (i%7!=5) || (i%9!=7)) i++;

printf("%d",i); fprintf(p,"%d",i); fclose(p);

• 51 •

}

(5) 素数是只能被1和其自身整除的自然数。请找出在500至600之间的所有素数,

并顺序将每个素数用语句 “fprintf(p,"%5d",i);”追加入文件中。

#include

#include

main()

{ FILE *p; int i , j , bz=0; p=fopen("","a");

for (i=500; i<=600; i++)

{ bz=0;

for (j=2; j<=(int)sqrt(i); j++) if (i%j==0) {bz=1; break;}

if (bz==0) fprintf(p,"%5d",i);

}

fclose(p);

}

(6) 商品有编号、名称、数量、单价4项信息,将5件商品信息写到文件中。

#include "stdio.h"

main()

{struct record {int num; char name[4]; int count; float price; };

struct record s[5]={{1, "aaa",10,12.3},{2, "bbb",20,23.45},

{3, "ccc",20,13.45},{4, "ddd",50,78.6},{5, "eee",30,34.21}};

FILE *fp; int k;

if ((fp=fopen(" ", "wb"))==NULL) {printf("不能打开文件!n"); exit(0); }

for (k=0;k<5;k++) fwrite(&s[k],sizeof(struct record),1,fp);

fclose (fp);

}

(7) 从键盘输入5个学生的数据(包括:学号,姓名,3门课成绩),计算每个学生3门课

的平均分数,将原有的数据和计算出的平均分数存放在磁盘文件中。

# include "stdio.h"

struct student{ char num[6]; char name[8]; int score[3]; float avr; } stu[5];

main()

{int i,j,sum; FILE *fp;

for(i=0;i<5;i++) /*输入数据*/

{scanf("%s",stu[i].num); scanf("%s",stu[i].name);

sum=0;

for(j=0;j<3;j++) {scanf("%d",&stu[i].score[j]); sum+=stu[i].score[j]; }

stu[i].avr=sum/3.0;

}

fp=fopen(" ","wb");

for(i=0;i<5;i++)

if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("file write errorn");

fclose(fp);

}

(8) 从键盘输入10个学生数据(包括姓名、学号、年龄、住址),写入文件中,

再读出中的10个学生的数据,将年龄等于20的显示在屏幕上。

#include

struct stu{char name[10]; int num; int age; char addr[15]; }boya[10],boyb[10],*pp,*qq;

main()

{FILE *fp; char ch; int i; pp=boya; qq=boyb;

if((fp=fopen("","wb+"))==NULL)

{printf("Cannot open file, strike any key exit!"); getch(); exit(1);}

for(i=0;i<10;i++,pp++) scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);

pp=boya; fwrite(pp,sizeof(struct stu),10,fp);

rewind(fp); fread(qq,sizeof(struct stu),10,fp);

for(qq=boyb ,i=0;i<10;i++,qq++)

if(qq->age ==20) printf("%st%5d%7d%sn",qq->name,qq->num,qq->age,qq->addr);

fclose(fp);

}

(9) 磁盘文件a1和a2各存放一行字母,要求把这两个文件中的信息合并(按字母顺序

从小到大排列),输出到一个新文件a3中。

#include "stdio.h"

main()

{FILE *fp1,*fp2,*fp3; int i,j,k; char c[160],t,ch;

fp1=fopen("a1","r"); fp2=fopen("a2","r"); fp3=fopen("a3","w");

for(i=0;(ch=fgetc(fp1))!=EOF;i++) {c[i]=ch; putchar(c[i]); }

for(k=i;(ch=fgetc(fp2))!=EOF;k++) {c[k]=ch; putchar(c[j]); }

for(i=0;i<=k-1;i++) /*冒泡法,对k个字符从小到大排序*/

for(j=0;j<=k-2;j++)

if(c[j]>c[j+1])

{t=c[j];c[j]=c[j+1];c[j+1]=t;}

printf("n a3 file is:n");

for(i=0;i

fclose(fp1); fclose(fp2); fclose(fp3);

}

(10) 模仿例12.8,编写对某公司员工的信息(编号、姓名、年龄、电话号码)进行后

面3项工作的程序:将员工信息存储到文件中、根据输入的编号进行查找显示、向文件中

追加新员工信息。

#include

struct employee

{ unsigend num; char name[10]; unsigend age; char phone[11]; };

void sto()

{ FILE *fp; int yn=1 ;

struct employee stu;

if ((fp=fopen("d:", "w"))==NULL)

{printf ("Can't open file!"); return; }

while (yn==1)

{scanf("%d ,%s,%d ,%s", & ,, &, );

fwrite(&stu, sizeof(struct employee), 1, fp) ;

printf("若停止输入请按0,若继续输入请按1,然后按回车键。n");

scanf("%d",&yn);

}

fclose(fp);

return;

}

void sea()

附录 各章习题参考答案

{FILE *fp; int bz=0, k=0,bh;

struct employee a;

if ((fp=fopen("d:","r"))==NULL)

{printf("Can't open file!"); return; }

printf(" 请输入员工的编号:");

scanf("%d", &bh);

fseek(fp, k*sizeof(struct employee), SEEK_SET);

while(!feof(fp))

{fread(&a, sizeof(struct employee), 1, fp);

if (bh==)

{printf("查找成功!员工信息显示如下:n");

printf("n%d ,%s,%d ,%s", ,, , );

bz=1; break;

}

k++;

fseek(fp, k*sizeof(struct employee), SEEK_SET);

}

if (bz==0) printf("查找不到该员工!n");

fclose(fp);

return;

}

void app( )

{FILE *fp; int yn=1; struct employee stu;

if ((fp=fopen("d:","a"))==NULL)

{printf("Can't open file!"); return; }

while (yn==1)

{ scanf("%d ,%s,%d ,%s", & ,, &, );

fwrite(&stu, sizeof(struct employee), 1, fp) ;

printf("若停止追加输入请按0,若继续追加输入请按1,然后按回车键。n");

scanf("%d",&yn);

}

fclose(fp);

return;

}

int main()

{int xz;

while(1)

{printf("****************员工管理*****************n");

printf("1.将若干个员工信息存储到文件中n");

printf("2.根据输入的编号进行查找显示n");

printf("3.追加若干个员工的信息到文件的末尾n");

printf("4.结束程序运行n");

printf("请选择(1,2,3,4):");

scanf("%d", &xz);

if (xz==4) break;

switch (xz)

{case 1: sto(); break;

case 2: sea(); break;

case 3: app(); break;

}

}

• 53 •

printf("程序运行结束, 再见!");

return 0;

}


本文标签: 输出 输入 数组 函数 元素