C语言程序设计第三版谭浩强课后习题及答案

1.5请参照本章例题,编写一个C程序,输出以下信息:

**************************

Very Good!

**************************

解:

mian()

{printf(“**************************”);

printf(“n”);

printf(“Very Good!n”);

printf(“n”);

printf(“**************************”);

}

1.6 编写一个程序,输入a、b、c三个值,输出其中最大值。

解:

mian()

{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);

}

第三章

3.6写出以下程序运行的结果。

main()

{char c1=’a’,c2=’b’,c3=’c’,c4=’101’,c5=’116’;

printf(“a%cb%ctc%ctabcn”,c1,c2,c3);

printf(“tb%c %c”,c4,c5);

}

解:

aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabc

AㄩN

3.7 要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

解:

#include <stdio.h>

main()

{ char c1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;

c1+=4;

c2+=4;

c3+=4;

c4+=4;

c5+=4;

printf("密码是%c%c%c%c%cn",c1,c2,c3,c4,c5);

}

运行结果:

密码是Glmre

3.9求下面算术表达式的值。

(1)x+a%3*(int)(x+y)%2/4

设x=2.5,a=7,y=4.7

(2)(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.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.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。

a=_3_ _b=_4_ _c=_5

x=1.200000,y=2.400000,z=-3.600000

x+y=_3.600_ _y+z=-1.20_ _z+x=-2.40

c1=ˊaˊ_or_97(ASCII)

c2=ˊbˊ_or_98(ASCII)

main()

{int a=3,b=4,c=5;

long int u=51274,n=128765;

float x=1.2,y=2.4,z=3.6;

char c1=’a’,c2=’b’;

printf("a=%2d b=%2d c=%2dn",a,b,c);

printf("x=%f,y=%f,z=%fn",x,y,z);

printf("x+y=%5.2f y+z=%5.2f z+x=%5.2fn",x+y,y+z,z+x);

printf("u=%6ld n=%9ldn",u,n);

printf("%s %s %d%sn","c1=’a’","or",c1,"(ASCII)");

printf("%s %s %d%sn","c2=’a’","or",c2,"(ASCII)");

}

4.7用scanf下面的函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入?

main()

{

int a,b;float x,y;char c1c2;

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

scanf("_x=%f_y=%e",&x,&y);

scanf("_c1=%c_c2=%c",&c1,&c2);

}

a=3_b=7

_x=8.5_y=71.82

_c1=A_c2=a

4.8设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。

main()

{float r,h,C1,Sa,Sb,Va,Vb;

scanf("%f,%f",&r,&h);

C1=2*3.14*r;

Sa=3.14*r*r;

Sb=4*Sa;

Va=4*3.14*r*r*r/3;

Vb=Sa*h;

printf("C1=%.2fn",C1);

printf("Sa=%.2fnSb=%.2fnVa=%.2fnVb=%.2fn",Sa,Sb,Va,Vb);

}

4.9输入一个华氏温度,要求输出摄氏温度。公式为

c=5(F-32)/9

输出要求有文字说明,取位2小数。

main()

{float F,c;

scanf("%f",&F);

c=5*(F-32)/9;

printf("c=%.2f",c);

}

4.10编程序,用getchar函数读入两个字符给c1、c2,然后分别用函数和函数输出这两个字符。并思考以下问题:(1)变量c1、c2应定义为字符型或整形?抑二者皆可?(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3)整形变量与字符变量是否在任何情况下都可以互相代替?如:

char c1,c2;



int c1,c2;

是否无条件的等价?

#include"stdio.h"

main()

{char c1,c2;

c1=getchar();c2=getchar();

putchar(c1);putchar(’n’);putchar(c2);putchar(’n’);

}

#include"stdio.h"

main()

{char c1,c2;

c1=getchar();c2=getchar();

printf("c1=%d c2=%dn",c1,c2);

printf("c1=%c c2=%cn",c1,c2);

}

第五章

5.1 什么是算术运算?什么是关系运算?什么是逻辑运算?

解:略。

5.2 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

解:设有一个逻辑表达式,若其结果为“真”,则以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,由键盘输入,输出其中最大的数。

解:

方法一

#include <stdio.h>

main()

{ int a,b,c;

printf("请输入3个整数:");

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

if(a<b)

if(b<c) printf("max=%dn",c);

else printf("max=%dn",b);

else if(a<c) printf("max=%dn",c);

else printf("max=%dn",a);

}

方法二:使用条件表达式,可以使程序更加简明、清晰。

程序如下:

#include <stdio.h>

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个整数的最大数是%dn”,max);

}

5.5 有一函数:

写一程序,输入x值,输出y值。

解:

#include <stdio.h>

main()

{int x,y;

printf("输入x:");

scanf("%d",&x);

if(x<1) /* x<1 */

{ y=x;

printf("x=%3d, y=x=%dn",x,y);

}

else if (x<10) /* 1≤x-10 */

{ y=2*x-1;

printf("x=%3d, y=2*x-1=%dn",x,y);

}

else /* x≥10 */

{ y=3*x-11;

printf("x=%3d, y=3*x-11=%dn",x,y);

}

}

5.6 给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~90分为’B’,70~79分为’C’,60分以下为’D’。

解:

程序如下:

#include <stdio.h>

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("成绩是%5.1f,相应的等级是%c。n",score,grade);

}

说明:对输入的数据进行检查,如小于0或大于100,要求重新输入。(int)(score/10)的作用是将 (score/10) 的值进行强制类型转换,得到一个整型值。

5.7 给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。

解:

#include <stdio.h>

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 =%dn", place);

ten_thousand=num/10000;

thousand=num/1000%10;

hundred=num/100%10;

ten=num%100/10;

indiv=num%10;

switch(place)

{ case 5: printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);

printf("n反序数字为;");

printf("%d%d%d%d%dn",indiv,ten,hundred,thousand,ten_thousand);

break;

case 4: printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);

printf("n反序数字为:");

printf("%d%d%d%dn",indiv,ten,hundred,thousand);

break;

case 3: printf("%d,%d,%d",hundred,ten,indiv);

printf("n反序数字为:");

printf("%d%d%dn",indiv,ten,hundred);

break;

case 2: printf("%d,%d",ten,indiv);

printf("n反序数字为:");

printf("%d%dn",indiv,ten);

break;

case 1: printf("%d",indiv);

printf("n反序数字为:");

printf("%dn",indiv);

break;

}

}

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%提成。

(1) 用if语句编程序。

#include <stdio.h>

main()

{ long i;

float bonus,bon1,bon2,bon4,bon6,bon10;

bon1=100000*0.1; /*利润为10万元时的奖金*/

bon2=bon1+100000*0.075; /*利润为20万元时的奖金*/

bon4=bon2+200000*0.05; /*利润为40万元时的奖金*/

bon6=bon4+200000*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.2fn",bonus);

}

此题的关键在于正确写出每一区间的奖金计算公式。例如利润在10万元至20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即100000ⅹ0.1;②10万元以上部分应得的奖金。即(num-100000)ⅹ0.075。同理,20万~40万这个区间的奖金也应由两部分组成:①利润为20万元时应得的奖金,即100000ⅹ0.1ⅹ10万ⅹ0.075;②20万元以上部分应得的奖金,即(num-200000)ⅹ0.05。程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon1、bon2、bon4、bon6、hon10;然后再加上各区间附加部分的奖金。

(2) 用switch语句编程序。

输入利润i,确定相应的提成等级branch

根据branch确定奖金值

0 奖金=i*0.1

1 奖金=bon1+(i-105)*0.075

2 奖金=bon2+(i-2*105)*0.05

3

4 奖金=bon4+(i-4*105)*0.03

5

6 奖金=bon6+(i-6*105)*0.015

7

8

9

10 奖金=bon10+(i-106)*0.01

输出奖金

#include <stdio.h>

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("%ld",&i);

c=i/100000;

if(c>10) c=10;

switch(c)

{ case 0: bonus=1*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);

}

5.9 输入4个整数,要求按由大到小的顺序输出。

解:此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以有更多的排序方法。

#include <stdio.h>

main()

{ int t,a,b,c,d;

printf("请输入4个整数:");

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

printf("n a=%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=a; 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, %dn",a,b,c,d);

}

5.10 有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

程序如下:

#include <stdio.h>

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("该点高度为%dn",h);

}

第六章

第六章 循环控制

6.1输入两个正整数m和n,求其最大公约数和最小公倍数。

main()

{long m,n,i=1,j,s;

scanf("%ld,%ld",&m,&n);

for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0) s=i;}

if(m>=n) j=m;

else j=n;

for(;!(j%m==0&&j%n==0);j++);

printf("s=%ld,j=%ldn",s,j);

}

6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

#include"stdio.h"

main()

{char c;int i=0,j=0,k=0,l=0;

while((c=getchar())!=’n’)

{if(c>=65&&c<=90||c>=97&&c<=122) i++;

else if(c>=48&&c<=57) j++;

else if(c==32) k++;

else l++;}

printf("i=%d,j=%d,k=%d,l=%dn",i,j,k,l);

}

6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。

#include"math.h"

main()

{int n,sum=0,i=1,s=2;

scanf("%d",&n);

while(i<=n)

{sum=sum+s;s=s+2*pow(10,i);

i++;}

printf("sum=%dn",sum);

}

6.4 求 ,(即求1!+2!+3!+4!+5!+…+20!)

main()

{int n,i=1;long sum=0,s=1;

scanf("%d",&n);

while(i<=n) {s=s*i;sum=sum+s;i++;}

printf("sum=%ldn",sum);

}

6.5 求

main()

{double i=1,j=1,k=1,s1=0,s2=0,s3=0,sum;

for(;i<=100;i++) s1=s1+i;

for(;j<=50;j++) s2=s2+j*j;

for(;k<=10;k++) s3=s3+1/k;

sum=s1+s2+s3;

printf("sum=%fn",sum);

}

6.6打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。

#include"math.h"

main()

{int x=100,a,b,c;

while(x>=100&&x<1000) {a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b;

if(x==(pow(a,3)+pow(b,3)+pow(c,3))) printf("%5d",x);x++;}

}

6.7一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程序找出1000之内的所有完数,并按下面格式输出其因子:

6 its factors are 1、2、3

main()

{int m,i,j,s;

for(m=6;m<10000;m++)

{s=1;

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

if(m%i==0) s=s+i;

if(m-s==0)

{printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0)

printf("%d ",j);printf("n");}

}

}



main()

{int m,i,j,s;

for(m=6;m<1000;m++)

{s=m-1;

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

if(m%i==0) s=s-i;

if(s==0)

{printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0)

printf("%d ",j);printf("n");}

}

}

6.8有一分数序列:

求出这个数列的前20项之和。

main()

{int i=1,n;double t,x=1,y=2,s,sum=0;

scanf("%ld",&n);

while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;}

printf("%fn",sum);

}

6.9一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?

main()

{int i,n;double h=100,s=100;

scanf("%d",&n);

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

{h*=0.5;if(i==1) continue;s=2*h+s;}

printf("h=%f,s=%fn",h,s);

}

6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

main()

{int i=1,sum=0;

for(;i<=10;sum=2*sum+1,i++);

printf("sum=%dn",sum);

}

6.11用迭代法求 。求平方根的迭代公式为:

要求前后两次求出的得差的绝对值少于0.00001。

#include"math.h"

main()

{float x0,x1,a;

scanf("%f",&a);

x1=a/2;

do

{x0=x1;x1=(x0+a/x0)/2;}

while(fabs(x0-x1)>=0.00001);

printf("%.3fn",x1);

}

6.12 用牛顿迭代法求方程在1.5附近的根。

main()

{double x,y;x=1.5;

do{y=2*x*x*x-4*x*x+3*x-6;

x=x-y/(6*x*x-8*x+3);}

while(y!=0);

printf("x=%.3fn",x);

}

6.13用二分法求方程在(-10,10)之间的根

main()

{double x1,x2,y1,y2;x1=-10;x2=10;

do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6;

x1=x1-y1/(6*x1*x1-8*x1+3);}

while(y1!=0);

do

{y2=2*x2*x2*x2-4*x2*x2+3*x2-6;

x2=x2-y2/(6*x2*x2-8*x2+3);}

while(y2!=0);

printf("x1=%.3f,x2=%.3fn",x1,x2);

}

6.14打印以下图案

*

* * *

* * * * *

* * * * * * *

* * * * *

* * *

*

#include"math.h"

main()

{int i,j,k;

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

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

printf(" ");

for(k=0;k<=2*i;k++)

printf("*");

printf("n");

}

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

{for(j=0;j<=i;j++)

printf(" ");

for(k=0;k<=4-2*i;k++)

printf("*");

printf("n");

}

}

第七章

第七章 数组

7.1 用筛法求之内的素数。

main()

{ int i,j,a[100];

for(i=2;i<100;i++)

{ a[i]=i;

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

{if(j<i)

if(a[i]%j==0)

break;

if(a[i]-j==0)

printf("%5d",a[i]);

}

}

printf("n");

}



#include"math.h"

main()

{static int i,j,k,a[98];

for(i=2;i<100;i++)

{a[i]=i;k=sqrt(i);

for(j=2;j<=a[i];j++)

if(j<k) if(a[i]%j==0)

break;

if(j>=k+1)

printf("%5d",a[i]);

}

printf("n");

}

7.2用选择法对10个整数从小到大排序。

main()

{ int i,j,a[10],t;

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

scanf("%d",&a[i]);

for(j=1;j<10;j++)

for(i=0;i<=9-j;i++)

if(a[i]>a[i+1])

{t=a[i+1];a[i+1]=a[i];a[i]=t;}

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

printf("%5d",a[i]);

}



main()

{static int a[10],i,j,k,t;

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

scanf("%d",&a[i]);

for(j=1;j<10;j++)

for(i=1;i<=10-j;j++)

if (a[i]>a[i+1])

{t=a[i+1];a[i+1]=a[i];a[i]=t;}

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

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

printf("n");

}

7.3求一个3×3矩阵对角线元素之和。

main()

{int i=0,j=0,a[3][3],s1,s2;

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

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

scanf("%d",&a[i][j]);

s1=a[0][0]+a[1][1]+a[2][2];

s2=a[0][2]+a[1][1]+a[2][0];

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

}



main()

{

static int i,j,s1,s2,a[3][3];

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

for(j=1;j<=3;j++)

scanf("%d",&a[i][j]);

s1=a[1][1]+a[2][2]+a[3][3];

s2=a[1][3]+a[2][2]+a[3][1];

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

}

7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。

main()

{ static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t;

scanf("%d",&a[9]);

for(i=9;i>0;i--)

if(a[i]<a[i-1])

{t=a[i-1];a[i-1]=a[i];a[i]=t;}

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

printf("%5d",a[i]);printf("n");

}



main()

{

static int a[5]={1,4,5,6,7};

int i,t,b;

scanf("%d",&b);

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

{if(b<=a[i])

{t=a[i];a[i]=b;b=t;}

printf("%d ",a[i]);}

printf("%d",b);

}

7.5将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。

main()

{ int i,b[10];

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

scanf("%d",&b[i]);

for(i=9;i>-1;i--)

printf("%5d",b[i]);

printf("n");}

7.6打印出以下杨辉三角形(要求打印出10行)。

1

1  1

1  2  1

1  3  3  1

1  4  6  4  1

1  5  10 10  5  1





main()

{ static int m,n,k,b[15][15];

b[0][1]=1;

for(m=1;m<15;m++)

{for(n=1;n<=m;n++)

{ b[m][n]=b[m-1][n-1]+b[m-1][n];

printf("%-5d",b[m][n]);}printf("n");

}

}

}



main()

{ int i,j,n,k,a[10][10];

static a[][1]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}};

a[1][1]=1;

for(k=2,k<11;k++)

for(i=2;i<=k;i++)

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

a[i][j]=a[i-1][j-1]+a[i-1][j];

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

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

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

printf("%d",a[i][j]);

}

7.7 打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

要求打印出由1~n2的自然数构成的魔方阵。

解:

#include <stdio.h>

main()

{ int a[16][16],i,i,k,p,m,n;

p=1;

while(p==1) /*要求阶数为1~15的商数*/

{ printf("Enter n(n=1~15):");

scanf("%d",&n);

if((n!=0)&&(n<=15)&&(n%2!=0)) p=0;

}

for(i=1;i<=n;i++) /*初始化*/

for(j=1;j<=n;j++) a[i][j]=0;

j=n/2+1; /*建立魔方阵*/

a[1][j]=1;

for(k=2;k<=n*n;k++)

{ i=i-1;

j=j+1;

if((i<1)&&(j>n))

{ i=i+2;

j=j-1;

}

else

{ if(i<1) i=n;

if(j>n) j=1;

}

if(a[i][j]==0) a[i][j]=k;

else

{ i=i+2;

j=j-1;

a[i][j]=k;

}

}

for(i=1;i<=n;i++) /*输出魔方阵*/

{ for(j=1;j<=n;j++)

printf("%4d",a[i][j]);

printf("n");

}

}

7.8找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。

main()

{int a[5][5],b[5],c[5],d[5][5],k=0,l=0;int i,j;

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

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

scanf("%d",&d[i][j]);

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

for(j=0;j<5;j++,a[i][j]=d[i][j]);

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

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

{if(a[i][j]>=a[i][j+1])

b[k]=a[i][j+1]=a[i][j];

else

b[k]=a[i][j+1];

}

for(j=0,l=0;j<5;j++,l++)

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

{if(a[i][j]<=a[i+1][j])

c[l]=a[i+1][j]=a[i][j];

else

c[l]=a[i+1][j];

}

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

for(j=0,l=0;j<5;j++,l++)

if(d[i][j]-b[k]==0)

{if(d[i][j]-c[l]==0)

printf("d[%d][%d]=%dn",i,j,d[i][j]);

else

printf("d[%d][%d]=%d isnot andin",i,j,d[i][j]);

}

}

7.9有个15数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值。如果该数不在数组中,则打印出"无此数"

#include"math.h"

main()

{static int i,j,m,a[15]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812};

scanf("%d",&m);

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

printf("%4d",a[j]);

printf("n");

i=7;

while(fabs(i-7)<8)

{if(m<a[7])

{if(a[i]-m==0)

{printf("it is at (%d)n",i+1);break;}i--;}

else if(m>a[7])

{if(a[i]-m==0)

{printf("it is at (%d)n",i+1);break;}i++;}

else

printf("8n");

}

if(fabs(i-7)-8==0)

printf("There is notn");

}

7.10有一篇文章,共有3行文字,每行有个80字符。要求分别统计出其中英文大写字母、小写字母、空格以及其它字符的个数。

main()

{int i,j=0,k=0,l=0,m=0,n=0;char str0[301],str1[100],str2[100],str3[100];

gets(str1);gets(str2);gets(str3);

strcat(str0,str1);strcat(str0,str2);strcat(str0,str3);

for(i=0;str0[i]!=’’;i++)

{if(str0[i]>=65&&str0[i]<=90) j++;

else if(str0[i]>=97&&str0[i]<=122) k++;

else if(str0[i]>=48&&str0[i]<=57) l++;

else if(str0[i]==32) m++;

else n++;}

printf("Daxie Xiaoxie Shuzi Kongge Qitan");

printf("%5d %7d %5d %6d %4dn",j,k,l,m,n);

}

7.11打印以下图案

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

main()

{int i,j,k;char a[5][5];

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

{for(j=0;j<5;j++)

{a[i][j]=’*’;printf("%c",a[i][j]);}

printf("n");

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

printf("40");}

printf("n");

}

7.12有一行电文译文下面规律译成密码:

A->Z a->z

B->Y b->y

C->X c->x



即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变,要求编程序将密码回原文,并打印出密码和原文。

main()

{ int i;char str1[100],str2[100];

gets(str1);

for(i=0;str1[i]!=’’;i++)

if(str1[i]>=65&&str1[i]<=90)

str2[i]=155-str1[i];

else if(str1[i]>=97&&str1[i]<=122)

str2[i]=219-str1[i];

else

str2[i]=str1[i];

printf("%sn%sn",str1,str2);

}

7.13编一程序,将两个字符串连接起来,不要strcat函数。

main()

{ int i,j;char str1[100],str2[100],str3[201];

gets(str1);

gets(str2);

for(i=0;str1[i]!=’’;i++)

str3[i]=str1[i];

for(j=0;str2[j]!=’’;j++)

str3[j+i]=str2[j];

printf("%sn%sn%sn",str1,str2,str3);

}

7.14编一个程序,将两个字符串S1和S2比较,如果S1>S2,输出一个正数;S1=S2,输出0;S1<S2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,’A’与’C’相比,由于’A’<’C’,应输出负数,由于’A’与’C’的码差值为2,因此应输出"-2"。同理:"And"和"Aid"比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出"5"。

#include <stdio.h>

#include <string.h>

main()

{ int i,resu;

char s1[100],s2[100];

printf("n input string1:");

gets(s1);

printf("n Input string2:");

gets(s2);

i=0;

while(s1[i]==s2[i]&&s1[i]!=’’) i++;

if(s1[i]==’’&&s2[i]==’0’) resu=0;

else resu=s1[i]-s2[i];

printf("n result:%dn",resu);

}

7.15 编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不用strcpy函数。拷贝时,’’也要拷贝过去,’’后面的字符不拷贝。

解:

#include "stdio.h"

main()

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

int i;

printf("Input s2:");

scanf("%s",s2);

for(i=0;i<strlen(s2);i++)

s1[i]=s2[i];

printf("s1:%sn",s1);

}

第八章

第八章 函数

1.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。

maxyueshu(m,n)

int m,n;

{ int i=1,t;

for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0)

t=i;

}

return(t);

}

minbeishu(m,n)

int m,n;

{int j;

if(m>=n) j=m;

else j=n;

for(;!(j%m==0&&j%n==0);j++);

return j;

}

main()

{int a,b,max,min;

printf("enter two number is: ");

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

max=maxyueshu(a,b);

min=minbeishu(a,b);

printf("max=%d,min=%dn",max,min);

}

8.2求方程 的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。

#include"math.h"

float yishigen(m,n,k)

float m,n,k;

{float x1,x2;

x1=(-n+sqrt(k))/(2*m);

x2=(-n-sqrt(k))/(2*m);

printf("two shigen is x1=%.3f and x2=%.3fn",x1,x2);

}

float denggen(m,n)

float m,n;

{float x;

x=-n/(2*m);

printf("denggen is x=%.3fn",x);

}

float xugen(m,n,k)

float m,n,k;

{float x,y;

x=-n/(2*m);

y=sqrt(-k)/(2*m);

printf("two xugen is x1=%.3f+%.3fi and x2=%.3f-%.3fin",x,y,x,y);

}

main()

{float a,b,c,q;

printf("input a b c is ");

scanf("%f,%f,%f",&a,&b,&c);

printf("n");

q=b*b-4*a*c;

if(q>0) yishigen(a,b,q);

else if(q==0) denggen(a,b);

else xugen(a,b,q);

}

8.2写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。

psushu(m)

int m;

{int i=2,t;

for(;i<=m;i++)

if(m%i==0&&i<m) break;

if(m-i==0) t=1;

else t=0;

return m;

}

main()

{int a,s;

printf("enter sushu is n");

scanf("%d",&a);

s=psushu(a);

if(s==1) printf("a is sushun");

else printf("s is not sushun");

}

8.4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。

int zhuangzhi(b)

int b[3][3];

{int i,j,t;

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

for(j=0;j>=i&&j<3-i;j++)

{t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;}

}

main()

{int a[3][3];int i,j;

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

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

scanf("%d",&a[i][j]);

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

{for(j=0;j<3;j++)

printf(" %d",a[i][j]);

printf("n");}

zhuangzhi(a);

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

{for(j=0;j<3;j++)

printf(" %d",a[i][j]);

printf("n");}

}

8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。

main()

{char str0[100];

gets(str0);

fanxu(str0);

puts(str0);

}

fanxu(str1)

char str1[100];

{int i,t,j;

char str2[100];strcpy(str2,str1);

t=strlen(str1);

for(i=0,j=t-1;j>-1;i++,j--)

str1[i]=str2[j];

}

8.6写一函数,将两个字符串连接。

lianjie(a,b)

char a[100],b[100];

{strcat(a,b);

}

main()

{char str1[100],str2[100];

gets(str1);gets(str2);

lianjie(str1,str2);

puts(str1);

}

8.7写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。

fuzhi(a,b)

char a[100],b[100];

{int i,j=0;

for(i=0;a[i]!=’’;i++)

if(a[i]==97||a[i]==101||a[i]==105||a[i]==111||a[i]==117||a[i]==65||

a[i]==69||a[i]==73||a[i]==85) {b[j]=a[i];j++;}

}

main()

{char str1[100],str2[100];

gets(str1);

fuzhi(str1,str2);

puts(str2);

}

8.8写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出"1_9_9_0"。

char f(b)

char b[4];

{int i=0;

for(;i<4;i++)

{printf(" ");

printf("%c",b[i]);}

printf("n");

}

main()

{int a,u,v,w,t;char c[4];

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

u=a*0.001;v=0.01*(a-1000*u);w=(a-1000*u-100*v)*0.1;t=a-1000*u-100*v-10*w;

c[0]=u+48;

c[1]=v+48;

c[2]=w+48;

c[3]=t+48;

f(c);

}

8.9编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。

char tongji(str0,b)

char str0[100];

int b[4];

{int i;

for(i=0;str0[i]!=’’;i++)

{if(str0[i]>=65&&str0[i]<=90||str0[i]>=97&&str0[i]<=122) b[0]++;

else if(str0[i]>=48&&str0[i]<=57) b[1]++;

else if(str0[i]==32) b[2]++;

else b[3]++;}

}

main()

{char str1[100];static int i,a[4];

gets(str1);

tongji(str1,a);

printf("zimu Shuzi Kongge Qitan");

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

printf("%-8d ",a[i]);printf("n");

}

8.10写一函数,输入一行字符,将此字符串中最长的单词输出。

cechang(str1,word0)

char str1[100],word0[15];

{int i=0,j=0,t=0;

static char word1[15];

for(;str1[i]!=’’;i++)

{if(!(str1[i]>=97&&str1[i]<=122||str1[i]>=65&&str1[i]<=90))

{t=j;j=0;continue;}

word1[j]=str1[i];j++;

if(j>=t) strcpy(word0,word1);}

}

main()

{char str0[100],longword[15];

gets(str0);

cechang(str0,longword);

puts(longword);

}

8.11写一函数用起泡法对输入的个字符按由小到大的顺序排列。

int paixu(x)

int x[];

{int i,j,t;

for(j=1;j<10;j++)

for(i=0;i<=9-j;i++)

if(x[i]>x[i+1]) {t=x[i+1];x[i+1]=x[i];x[i]=t;}

}

main()

{int y[10];int i;

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

scanf("%d",&y[i]);

paixu(y);

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

printf("%5d",y[i]);

printf("n");

}

8.12用牛顿迭代法求根。方程为: ,系数a,b,c,d由主函数输入。求X在1附近的一个实根。求出后由主函数输出。

double qigen(s,t,u,v)

int s,t,u,v;

{double x,y;x=1;

do{y=s*x*x*x+t*x*x+u*x+v;

x=x-y/(3*s*x*x+2*t*x+u);}

while(y!=0);

return x;

}

main()

{int a,b,c,d;double x;

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

x=qigen(a,b,c,d);

printf("x=%.3fn",x);

}

8.13用递归方法求n阶勒让德多项式的值递归公式为

float p(x0,n)

int n;float x0;

{float y;

if(n==0||n==1) if(n==1) y=x0;else y=1;

else y=((2*n-1)*x0*p(x0,n-1)-(n-1)*p(x0,n-2))/n;

return(y);

}

main()

{float x,y0;int a,i;

scanf("%f,%d",&x,&a);

y0=p(x,a);

printf("y0=%.3fn",y0);

}

8.14输入10个学生5门课的成绩,分别用函数求:①每个学生平均分;②每门课的平均分;③找出最高分所对应的学生和课程;④求平均分方差:δ=[SXi^2]/n-(SXi/n)^2,为一学生的平均分

float x1[10],x2[5];

float pp(),cc(),find(),xx();

main()

{char name[10][20],class[5][20];float score[10][5],o,k=0,max[5];int a[5],i,j;

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

gets(name[i]);

for(j=0;j<5;j++) gets(class[j]);

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

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

scanf("%f",&score[i][j]);

pp(score);

cc(score);

find(score,max,a);

o=xx(k);

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

{puts(name[i]);

printf("%.3fn",x1[i]);}

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

{puts(class[j]);printf("%.3fn",x2[j]);}

for(j=0;j<5;j++) {printf("%.3f n",max[j]);

puts(name[a[j]]);

puts(class[j]);}

printf("o=%.3fn",o);

}

float pp(f)

float f[10][5];

{float sum=0;int i,j;

for(i=0,sum=0;i<10;i++)

{for(j=0;j<5;j++)

sum=sum+f[i][j];

x1[i]=sum/5;}

}

float cc(y)

float y[10][5];

{float sum=0;int i,j;

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

{for(i=0;i<10;i++)

sum=sum+y[i][j];

x1[j]=sum/10;}

}

float find(z,s,t)

float z[10][5],s[5];int t[5];

{int i,j;

for(j=0,s[j]=z[0][j];j<5;j++)

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

if(s[j]<z[i][j]) {s[j]=z[i][j];t[j]=i;}

}

float xx(q)

float q;

{float f=0,e=0;int i;

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

{e=x1[i]*x1[i]+e;

f=f+x1[i];}

q=e/10-(f/10)*(f/10);

return(q);

}

8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

#define N 10

find(a,b)

int a[],b[];

{int i,j,s,t,c[N][2];

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

{c[i][1]=a[i];c[i][1]=i;}

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

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

if(c[i][0]>c[i+1][0])

{t=c[i][0];c[i][0]=c[i+1][0];c[i+1][0]=t;

s=c[i][1];c[i][1]=c[i+1][1];c[i+1][1]=s;}

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

b[i]=c[i][1];

return;

}

lookfor(h,k)

int h[],k;

{int i,j;

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

if(h[i]-k==0) j=i;

return j;

}

main()

{int number[N],x[N],i,j,u,p;char name[N][20];

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

{gets(name[i]);

scanf("%d",&number[i]);}

scanf("%d",&p);

find(number,x);

u=lookfor(number,p);

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

{printf("%d",number[i]);

puts(name[x[i]]);}

puts(name[x[u]]);

}

8.16写一函数,输入一个十六进制数,输出相应的十进制数。

#include"math.h"

int x;

ff(shu)

char shu[];

{int i=strlen(shu)-1,sum=0;

for(;i>-1;i++)

{if {if(48<=shu[i]<=57) sum=sum+(shu[i]-48)*pow(16,(i-1));

else if(65<=shu[i]<=90) sum=sum+(shu[i]-55)*pow(16,(i-1));

else if(97<=shu[i]<=102) sum=sum+(shu[i]-87)*pow(16,(i-1));

x=1;}

else x=0;

return x;

}

main()

{char shufu[100];int s;

gets(shufu);s=ff(shufu);

if(x) printf("s(D)=%dn",s);

else printf("The number is not oxn");

}

8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串"486"。n的位数不确定,可以是任意位数的整数。

#include"math.h"

int x[10];

pf(m,n)

unsigned long m;int n;

{int y;

if(n==0) {y=(int)(m%10);x[0]=y;}

else {y=(unsigned long)((m-pf(m,n-1))/pow(10,n))%10;x[n]=y;}

return(y);

}

main()

{unsigned long a,b;int i,j,k;char c[11];

scanf("%ld",&a);

for(j=0,b=a;b>0.1;j++,b/=10);

pf(a,j-1);

for(i=0,k=j-1;i<j;i++,k--)

c[i]=x[k]+48;c[10]=’’;

puts(c);}



#include"math.h"

char x[11];

pf(m,o)

unsigned long m;int o;

{int j,i;

for(i=o-1,j=0;i>-1;i--,j++)

x[i]=(int)((unsigned long)(m/pow(10,j))%10)+48;

return;

}

main()

{unsigned long a,b;int j,i;

scanf("%ld",&a);

for(j=0,b=a;b>0.1;j++,b/=10);

pf(a,j);

puts(x);printf("%dn",j);}



#include"math.h"

int x[10];unsigned long m;

pf(n)

int n;

{int y;

if(n==0) {y=m%10;x[0]=y;}

else {y=(unsigned long)((m-pf(n-1))/pow(10,n))%10;x[n]=y;}

return(y);

}

main()

{unsigned long a;int i,j,k;char c[11];

scanf("%ld",&m);

for(j=0,a=m;a>0.1;j++,a/=10);

pf(j-1);

for(i=0,k=j-1;i<j;i++,k--)

c[i]=x[k]+48;c[10]=’’;

puts(c);}

8.18给出年、月、日,计算该日是该年的第几天。

int find(x,y,z)

int x,y,z;

{ int i,t,s,days=0;

if(x%4==0) t=1;

else t=0;

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

{if(i==2) s=2-t;

else s=0;

days=days+30+i%2-s;

}

days=days+z;

return(days);

}

main()

{int year,month,date,day;

scanf("%d %d %d",&year,&month,&date);

day=find(year,month,date);

printf("THE DATE IS THE %dth DAYSn",day);

}

第九章

第九章 编译预处理

9.1定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

#define CHANGE(a,b,t) t=a;a=b;b=a

main()

{int c,d,s;

scanf("%d,%d",&c,&d);

CHANGE(c,d,s);

printf("c=%d,d=%dn",c,d);

}

9.2输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。

#define Q(a,b) a%b

main()

{int c,d,t;

scanf("%d %d",&c,&d);

t=Q(c,d);

printf("t=%dn",t);

}

9.3三角形面积为:

其中S=(a+b+c)/2,a、b、c为三角形的三边。定义两个带参的宏S,一个用来求area,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积area。

#include"math.h"

#define SSS(m,n,k) (m+n+k)/2

#define AQRT(m,n,k) sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k))

main()

{float a,b,c,s,area;

scanf("%f %f %f",&a,&b,&c);

s=SSS(a,b,c);

area=AQRT(a,b,c);

printf("s=%.3f area=%.3fn",s,area);

}



#include"math.h"

#define SSS(m,n,k) (m+n+k)*0.5

#define AQRT(m,n,k) sqrt(((m+n+k)/2)*((m+n+k)/2-m)*((m+n+k)/2-n)*((m+n+k)/2-k))

main()

{float a,b,c,t,area;

scanf("%f %f %f",&a,&b,&c);

t=SSS(a,b,c);

area=AQRT(a,b,c);

printf("t=%.3f;area=%.3fn",t,area);

}



#include"math.h"

#define SSS(m,n,k) ((m+n+k)/2)

#define AQRT(m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k) sqrt(SSS*(SSS-m)*(SSS-n)*(SSS-k))

main()

{float a,b,c,t,area;

scanf("%f %f %f",&a,&b,&c);

t=SSS(a,b,c);

area=AQRT(a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c);

printf("t=%.3f;area=%.3fn",t,area);

}

9.4给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为

#define LEAP_YEAR(y) (读者设计的字符串)

在程序中用以下语句输出结果:

if (LEAP_YEAR(year)) printf("%d is a leap year",year);

else printf ("%d is not a leap year",year);

#define LEAPYEAR(y) y%4

main()

{int y;

scanf("%d",&y);

if(LEAPYEAR(y)) printf("%d is a not leap yearn",y);

else printf("%d is a lear yearn",y);

}

9.6请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。

#define PR1(x) printf("%6.2fn",x)

#define PR2(x) printf("%6.2ft%6.2fn",x,x)

#define PR3(x) printf("%6.2ft%6.2ft%6.2fn",x,x,x)

main()

{float a;scanf("%f",&a);

PR1(a);PR2(a);PR3(a);

}

9.7设计所需的各种各样的输出格式(包括整数、实属、字符串等),用一个文件名"fornat.h",把信息都放到这个文件内,另编一个程序文件,用命令#include "fornat.h"以确保能使用这些格式。

分别用函数和带参的宏,从三个数中找出最大的数。

#define MAX(a,b,c) (a>((b>c)? b:c))? a:((b>c)? b:c)

main()

{float x,y,z,t;

scanf("%f,%f,%f",&x,&y,&z);

t=MAX(x,y,z);

printf("%.4fn",t);

}

9.10用条件编译方法实现以下功能:

输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。用命令来控制是否要译成密码。例如:

#define CHANGE 1

则输出密码。若:

#define CHANGE 0

则不译为密码,按原码输出。

#define CHANGE 1

main()

{char str[80],c;int i=0;

gets(str);

while(str[i]!=’’)

{

#if CHANGE

if(str[i]==90||str[i]==122) str[i]=str[i]-25;

else if(str[i]>=65&&str[i]<90||str[i]>=97&&str[i]<122) str[i]=str[i]+1;

#endif

i++;

}

puts(str);

}



#define CHANGE 1

main()

{char str[80],*c;int i=0;

gets(str);c=str;

while(*c!=’’)

{

#if CHANGE

if(*c==90||*c==122) *c=*c-25;

else if(*c>=65&&*c<90||*c>=97&&*c<122) *c=*c+1;

#endif

c++;

}

puts(str);

}

第十章

第十章 指针

10.1输入三个整数,按由小到大的顺序输出。

main()

{ int a,b,c,*p1,*p2,*p3,t;

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

p1=&a;p2=&b;p3=&c;

if(*p1>*p2)

{t=p1;p1=p2;p2=t;}

if(*p1>*p3)

{t=p1;p1=p3;p3=t;}

if(*p2>*p3)

{t=p2;p2=p3;p3=t;}

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

}



main()

{int a,b,c,*p1,*p2,*p3,t;

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

p1=&a;p2=&b;p3=&c;

if(a>b)

{t=*p1;*p1=*p2;*p2=t;}

if(a>c)

{t=*p1;*p1=*p3;*p3=t;}

if(b>c)

{t=*p2;*p2=*p3;*p3=t;}

printf("%d,%d,%dn",a,b,c);

}

10.2输入三个字符串,按由小到大的顺序输出

#define N 3

#define M 20

main()

{char str0[N][M],str1[M],*p,*q;

int i,l,m,n;

q=str0;

for(;p<q+N;p++)

gets(p);

l=strcmp(q,q+1);

if(l>0)

{strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);}

m=strcmp(q,q+2);

if(m>0)

{strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);}

n=strcmp(q+1,q+2);

if(n>0)

{strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);}

for(p=q;p<q+N;p++)

puts(p);

}

10.3输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;①输入10个数;②进行处理;③输出10个数。

f(x,n)

int x[],n;

{int *p0,*p1,i,j,t,y;

i=j=x[0];p0=p1=x;

for(y=0;y<n;y++)

{if(x[y]>i)

{i=x[y];p0=&x[y];}

else if(x[y]<j)

{j=x[y];p1=&x[y];}}

t=*p0;*p0=x[n-1];x[n-1]=t;

t=*p1;*p1=x[0];x[0]=t;

return;

}

main()

{int a[10],u,*r;

for(u=0;u<10;u++)

scanf("%d",&a[u]);

f(a,10);

for(u=0,r=a;u<10;u++,r++)

printf(" %d",a[u]);

printf("n");

}

10.4有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。

#define N 10

void shift(p,x)

float *p;int x;

{float a[N],*q,*o;int i;

o=a;q=p;

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

*(o+i)=*(q+N-x+i);

for(p=p+N-1;p>=q;p--)

*p=*(p-x);

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

*(q+i)=*(o+i);

return;}

main()

{float shuzhu[N],*u,*v;

int h,i;u=v=shuzhu;

scanf("%f",&h);

for(;u<v+N;u++)

scanf("%f",u);

shift(v,h);

for(u=v;u<v+N;u++)

printf("%.2f ",*u);

printf("n");

}

10.5有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

#define N 5

main()

{int i,j,k,a[N+1],*p;

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

*p=i;

p=a+1;k=N;

for(i=0,j=1;k!=1;j++)

{if(p>(a+N))

p=a+1;

if(*p!=0)

i++;

if((i-3)==0)

{*p=0;i=0;k--;}

p++;

}

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

if(a[i]!=0)

printf("The last number is %dn",a[i]);}

10.7有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

#include"stdio.h"

#define N 10

main()

{char a[N+1],b[N+1],*p,*q;

int m;

gets(a);

scanf("%d",&m);

p=a+m;q=b;

strcpy(q,p);

puts(q);

}

第十一章

11.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

解:Struct

{int year;

int month;

int day;

}date;

main()

{int days;

printf(“Input year,month,day:”);

scanf(“%d,%D,%d”,&date.year,&date.month,&date.day);

switch(date.month)

{case 1: days=date.day; break;

case 2: days=date.day+31; break;

case 3: days=date.day+59; break;

case 4: days=date.day+90; break;

case 5: days=date.day+120; break;

case 6: days=date.day+31; break;

case 7: days=date.day+181; break;

case 8: days=date.day+212; break;

case 9: days=date.day+243; break;

case 10: days=date.day+273; break;

case 11: days=date.day+304; break;

case 12: days=date.day+334; break;

}

if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3)days+=1;

printf(“n%d/%d is the %dth day in%d.”,date.month,data.day,days,date,year);

}
C语言程序设计第三版谭浩强课后习题及答案

11.2写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日数传回主函数输出。

解:struct y_m_d

{int year:

int month;

int day;

}date;

intdays(struct y_m_d date1)

{int sum;

switch(data.month)

{case 1:sum=date1.day; break;

case 2:sum=date1.day+31; break;

case 3:sum=date1.day+59; break;

case 4:sum=date1.day+90; break;

case 5:sum=date1.day+120; break;

case 6:sum=date1.day+151; break;

case 7:sum=date1.day+181; break;

case 8:sum=date1.day+212; break;

case 9:sum=date1.day+243; break

case 10:sum=date1.day+243; break

case 11:sum=date1.day+243; break

case 12:sum=date1.day+243; break

}

};

11.3编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。

解:

#define N 5

struct student

{char num[6];

char name[8];

int score[4];

}stu[N];

main()

{int I,j ;

for(I=0;I<N;I++)

{printf(“Input score of student %d:n”,I+1);

printf(“no.:”);

scanf(“%s”,stu[i].num);

printf(“name:”);

scanf(“%s”,stu[i].name);

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

{printf(“score%d:”j+1);

scanf(“%d”,&stu[i].score[j]);

}

printf(“n”);

}

print(stu);

}

print(struct student stu[6])

{int I,j;

printf(“%5s%10s”,stu[i].num,stu[i].name);

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

printf(“%9d”,stu[i].score[j]);

print(“n”);

}

11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。

解:

#define N 5

struct student

{char num[6];

char name[8];

int score[4]

}stu[N];

input(struct student stu[])

{int I,j;

for(I=0;I<N;I++)

{printf(“input scores of student %d:n”,I+1);

printf(“NO.:”);

scanf(“%s”,stu[i].num);

printf(“name: ”);

scanf(“%s”, stu[i].name);

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

{printf(“score%d:”,j++);

scanf(“%d”, &stu[i].score[j]);}

}

printf(“n”);

}

}

11.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)

解:#define N 10

struct student

{char num[6]

char name[8]

int score[4]

float avr;

}stu[N];

main()

{int I,j,max,maxi,sum;

float average;

for(I=0;I<N;I++)

{printf(“nInput scores of student %d:n”,I+1);

printf(“NO.:”);

scanf(“%s”,stu[i].num);

printf(“name”);

scanf(“%s”,stu[i].name);

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

{printf(“score %d:”,j+1);

scanf(“%d”, &stu[i].score[j]);

}

}

average=0;

max=0;

maxi=0;

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

{sum=0;

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

sum+=stu[i].score[j];

stu[i].avr=sum/3.0;

average+=stu[i].avr;

if(sum>max)

{max=sum;

maxi=I;

}

}

average/=N;

printf(“NO. name score1 score2 score3 averagen”);

for(I=0;I<N;I++)

{printf(“%5s%10s”,stu[i].num, stu[i].name);

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

printf(“%9d”,stu[i].score[j]);

printf(“%8.2fn”,stu[i].avr);

}

printf(“average=%6.2fn”,average);

printf(“The highest score is:%s,score total:%d.”stu[maxi].name,max);

}

11.6 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的内存空间。

解:new函数如下:

#define NULL 0

#define NEWSIZE 1000

char newbuf[NEWSIZE];

char *newp=newbuf;

char *new(int n)

{if (newp+n<=newbuf+ NEWSIZE)

{ newp= newp+n;

return(newp-n);

}

else

return(NULL);

}

11.7写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放。

解:

#define Null o

#define NEWSIZE 1000

char newbuf[NEWSIZE];

char *newp=newbuf;

free(char *p)

{if((p>=newbuf)&&(p<newbuf+NEWSIZE))

newp=p;

}

11.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。

解:

#include<stdio.h>

#define NULL 0

#define LENsizeof(struct student)

strut student

{long num;

int scor;

struct student *next

};

struct student listA,listB;

int n,sum=0;

main()

{struct student *creat(void);

struct student *insert(struct student *,struct student *);

void print(struct student *);

stuct student *ahead , *bhead,*abh;

printf(“ninput list a:n”);

ahead=creat();

sum=sum+|n;

abh=insert(ahead,bhead);

print(abh);

}

struct student *creat(void)

{struct student *p1,*p2,*head;

n=0;

p1=p2=(struct student *)malloc(LEN);

printf(“input number&scores of student:n”);

printf(“if number Is 0,stop inputing.n”);

scanf(“%ld,%d”,&p1->num,&p1->score);

head=NULL;

while(p1->num!=0)

{n=n+1;

if(n==1)head=p1;

else p2->next =p1;

p2=p1;

p1=(struct student *)malloc(LEN);

scanf(“%ld,,%d”,&p1->num,&p1->score);

}

p2->next=NULL;

return(head);

}

struct student *insert(struct student *ah,struct student *bh)

{struct student *pa1 , *pa2,*pb1,*pb2;

pa2=pa1=ah;

pb2=pb1=bh;

do

{while((pb1->num>pa1->num)&&(pa1->next!=NULL))

{pa2=pa1;

pa1=pa1->next;

}

if(pb->num<=pa1->num)

{if(ah=pa1)

ah=pb1;

else pa2->next=pb1;

pb1=pb1->next;

pb2->next=pa1;

pa2=pb2;

pb2=pb1;

}

}

while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));

if((pb1->num>pa1->num)&&(pa1->next==NULl))

ap1->next=pb1;

return(ah);

}

void print(struct student *head)

{struct student *p;

printf(“%ld%dn”,p->num,p->score);

p=p->next;

while(p!=NULL);

}

11.9 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。

解:

#define N 13

struct person

{int number;

int nextop;

}link[N+1];

main()

{int I,count,h;

for(I=1;I<=N;I++)

{if(I==N)

link[i].nextp=1;

else

link[i].nextp=I+1;

link[i].number=I;

}

printf(“n”);

count=0;

h=N;

printf(“sequence that person2 leave the circle:n”);

while(count<N-1)

{I=0;

while(I!=3)

{h=link[h].nextp;

if(link[h].number)

I++;

}

printf(“%4d”,link[h].number);

link[h].number=0;

count++;

}

printf(“nThe last one is”);

for(I=1;ii<=N;I++)

if(link[i].number)

printf(“%3d”,lin[i].number);

}

11.10有两个链表a和b,设结点中包含学号、姓名。从1链表中删去与b链表中有相同学号的那些结点。

解:

#define LA 4

#define LB 5

#define NULL 0

struct student

{char nump[6];

char name[8];

struct student *next;

}A[LA],b[LB];

main()

{struct student a[LA]={{“101”,”Wang”},{“102”,”LI”},{“105”,”zhang”},{“106”,”Wei”}};

struct studentb[LB]={{“103”,”Zhang”},{“104”,”Ma”},{“105”,”Chen”},{“107”,”Guo”},

{“108”,”Lui”}};

int I,j;

struct student *p, *p1,*p2,*pt,*head1,*head2;

head1=a;

head2=b;

printf(“list a :n”);

for(p1=head1,i=1;p1<a=LA;i++)

{p=p1;

p1->next=a+I;

printf(“%8s%8sn”,p1->num,p1->name);

p1=p1->next;

}

p->next=NULL;

printf(“n list b:n”);

for(p2=head2,I=1;p2<b+LB;I++)

{p=p2;

p2->next=b+I;

printf(“%8s%8sn”,p2->num,p2->name);

p2=pa->next;

}

p->next=NULL;

printf(“n”);

p1=head1;

while(p1!=NULL)

{p2=head2;

while(p2!=NULL&&strcmp(p1->num,p2->num)!=0)

p2=p2->next;

if(strcmp(p1->num,p2->num==0))

if(p1==head1)

head1=p1->next;

else

p->next=p1->next;

p=p1;

p1=p1->next;

}

p1=hedad1;

printf{“n result:n”};

while(p1!=NULL)

{printf(“%7s %7sn”,p1->num,p1->name);

p1=p1->next;

}

}

11.11建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

解:#define NULL 0

#define LEN sizeof(struct student)

struct student

{char num[6];

char name[8];

char sex[2];

int age;

stuct student *next;

}stu[10];

main()

{struct student *p,*pt,*head;

int I,length,iage,flag=1;

int find=0;

while(flag==1)

{printf(“input length of list(<10):”);

scanf(“%d”,&length);

if(length<10)

flag=0;

}

for(I=0;I<lenth;I++)

{p=(struct student *)malloc(LEN);

if(I==0)

head=pt=p;

else

pt->next=p;

pt=p;

ptintf(“NO:”);

scanf(“%s”,p->num);

prntf(“name:”);

scanf(“%s”,p->name);

printf(“sex:”);

scanf(“%s”,p->sex);

printf(“age:”);

scanf(“%s”,p->age);

}

p->next=NULL;

p=head;

printf(“n NO. name sex agen”);

while(p!=NULL)

{printf(“%4s%8s%6s%6dn”,p->num, p->name, p->sex, p->age);

p=p->next;

}

printf(“Input age:”);

scanf(“%d”,&iage);

pt=head;

p=pt;

if(pt->age==iage)

{p=pt->next;

head=pt=p;

find=1;

}

else

pt=pt->next;

while(pt!=NULL)

{if(pt->age==iage)

{p->next=pt->next;

find=1;

}

else p=pt;

pt=pt->next;

}

if(!find)

printf(“Not found%d.”,iage);

p=head;

printf(“n NO.name sex agen”);

while(p!=NULL)

{

printf(“%4s%8s”,p->num,p->name);

printf(“%6s%6d”,p->sex,p->age);

p=p->next;

}

}

11.12将一个链表按逆序排列,即将链头当链尾,链尾当链头。

解:

# define NULL 0

struct stu

{int num;

struct stu *next;

}

main()

{int len=1l

struct stu *p1,*p2,*head,*new,*newhead;

p1=p2=head=(struct stu * )malloc(sizeof(strct stu));

printf(“input number(0:list end):”);

scanf(“%d”,&p1->num);

while(p1->num!=o)

{p1=(struct stu*)malloc(sizeof(struct stu));

printf(“input number(n:listend):”);

scanf(“%d”,&p1->num);

if(p1->num==0)

p2->next=null;

else

{p2=>next=p1;

p2=p1;

len++;

}

}

p1=head;

pritnf(“n the original list:n”);

do

{printf(“%4d”,p1->num);

if(p1->next!=NULL)

p1=p1->next;

}

while(p1->next!=NULL)

{p2=p1;

p1=p1->next;

}

if(I==0)

newhead=new=p1;

else

new=nes->next=p1;

p2->next=NULL;

}

printf(nn The new listLn);

p1=newhead;

for(I=0l;I<len;I++)

{pritf(“4d,p1->num”);

p1=p1->next,

}

printf(“n”);

第12章

12.1编写一个函数getbits,从一个16位的 单元中取出某几位(即该几位保留原值,其余位为0)。函数调用形式为:getbits(value,n1,n2)其中value为该16位单元中的数据值,n1为欲取出的起始位,n2为欲取出的结束位。

解:main()

{unsingned int a;

int n1,n2;

printf(“input an octal number:”);

scanf(“%o”,&a);

printf(“input n1,n2:”);

scanf(“%d,%d”,&n1,&n2);

printf(“result:%on”,getbits(a,n1-1,n2));

}

getbits(unsigned value,int n1,n2)

{unsigned int z;

z=~0;

z=(z>>n1)&(z<<(16-n2);

return(z);;

}

12.2写一个函数,对一个16位的二进制数驱除它的奇数位。

解:main()

{unsigned getbits(unsigned);

unsigne int a;

printf(“ninput an octal number:”);

scanf(“%o”,&a);

printf(“result:%on”,,getbits(a));

}

unsigner getbits(unsigned value)

{int I,j,m,n;

unsigned int z,a q;

z=0;

for(I=1;I<=15;I+=2)

{q=1;

for(j=1;j<=(16-I-1)/2;j++)

q=q*2;

a=value>>(16-i);

a=a<<15;

a=a>>15;

z=z+a*q;

}

return(z);

}

12.3编一程序,检查一下年一所用的计算机系统的C编译在执行有移时是按照逻辑位移的原则,还有按照算术右移的原则。如果是逻辑右移,请编一函数实现算术右移。如果是算术右移,请编写一函数实现逻辑右移。

解:

main()

{int a,n,m;

a=~0;

if(a>>5)!=a

{printf(“nTurbo C,logical move!n”);

m=0;

}

else

{printf(“nTurbo C,arithmetic move!n”);

m=1;

}

printf(“input an octal number:”);

scanf(“%o”,&a);

printf(“how mang digit move thwards the right ::”);

scanf(“%d”,&n);

if(m==0)

printf(“Arithmetic right move,result:%on”,getbits1(a,n));

else

printf(“Logical ritht move,result:%o”, getbits2(a,n));

}

getbits1(unsigned value,int n)

{unsigned z;

z=~0;

z=z>>n;

z=~z;

z=z|(value>>n);

return(z);

}

egtbit2(unsigned valud,int n )

{unsigned z;

z=(~(1>>n)&(value>>n));

}

12.4编一函数用来实现左右循环移位。函数名为move,调用方法为:

move(value,n) 其中value为要循环位移的数,n为位移的位数。

解:

main()

{unsigned moveright(unsigned,int);

unsigned moveleft(unsigned,int);

unsigned a;

int n;

printf(“n input an octal number:”);

scanf(“%o”,&a);

printf(“input n:”);

scanf(“%d”,&n);

if(n>0)

{moveright(a,n);

printf(“result:%on”,moveright(a,n));

}

else

{n=-n;

moveleft(a,n);

printf(“result:%on”,moveleft(a,n));

}

}

unsigned moveright(unsigned value,int n)

{unsigned z;

z=(value>>n)|(value<<(16-n));

return(z);

}

unsigned moveleft(unsigned value,int n )

{unsigned z;

z=(value>>(16-n))|(value<<n);

return(z);

}

12.5设计一个函数,使给出一个数的原码,能得到该数的补码。

解:

main()

{unsigned int a;

unsigned int getbits(unsigned);

pritf(“nInput an octal number:”);

scanf(“%o”,&a);

printf(“result:%on”,getbits(a));

}

unsigned int getbits(unsigned value)

{unsigned int z;

z=value&0100000;

if(z==0100000)

z=~value+1;

else

z=value;

return(z);

}

第十三章

13.4从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束。

解:#include <stdio.h>

main()

{

File *fp;

Char str[100];

Int I=0;

If((fp=fopen(“test”,”w”)==NULL)

{printf(“Can not open the filen”);

exit(0);

}

printf(“Input a string:n”);

gets(str);

while(str[i]!=’!’)

{if (str[i]>=’a’&&str[i]<=’z’)

str[i]=str[I-32];

fputc(str[i],fp);

I++;

}

fclose(fp);

fp=fopen(“test”,”r”);

fgets(str,strlen(str)+1,fp);

printf(“%sn”,str);

fclose(fp);

}

13.5有两个磁盘文件”A”和”B”,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件”C”中。

解:#include<stdio.h>

main()

{

FILE *fp;

Int I,j,n,i1;

Char c[100],t ,ch;

If((fp=fopen(“a1”,”r”))==NULL)

{printf(“can not open the filen”);

exit(0);

}

printf(“n file A:n”);

for(I=0;(ch=fgetc(fp)!=EOF;I++)

{c[i]=ch;

putchar(c[i]);

}

fclose(fp);

i1=I;

if((fp=fopen(“b1”,”r”))==NULL)

{printf(“n can not ipen the file”);

exit(0);

}

printf(“n file B:n”);

for(I=i1;(ch=fgenc(fp))!=EOF;I++)

{c[i]=ch;

putchar(c[i]);

}

fclose(fp);

n=I;

for(i=0;I<n;I++)

for(j=I+1;j<n;j++)

if(c[i]>c[j])

{t=c[i];

c[i]=c[j];

c[j]=t;

printf(“n file C:n”);

fp=fopen(“c1”,”w”);

for(I=0;I<n;I++)

{putc(c[i],fp);

putchar(c[i]);

}

fclose(fp);

}

13.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。

解:

#include<stdio.h>

struct student

{char num[10];

char name[8];

int score[3];

float ave;

}stu[5];

main()

{int I,j,sum;

FILE *fp;

For(I=0;I<5;I++)

{printf(“n input score of student%d:n”,I+1);

printf(“NO.:”);

scanf(“%s”,stu[i].num);

printf(“name:”);

scanf(“%s”,stu[i].name);

sum=0;

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

{printf(“score %d :”j+1);

scanf(“%d”,&stu[i].score[j]);

sum+=stu[i].score[j];

}

stu[i].ave=sum/3.0

}

fp=fopen(“stud”,”w”);

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

if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)

printf(“File write errorn”);

fclose(fp);

fp=fopen(“stud”,”r”);

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

{fread(&stu[i],sizeof(struct student),1,fp);

printf(“%s,%s,%d,%d,%d,%6.2fn”,stu[i].num,stu[i].name,stu[i].score[0], stu[i].score[1], stu[i].score[2] ,stu[i].ave);

}

}

13.7将上题stud文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一个新文件stu-sort中。

解:

#include <stdio.h>

#define N 10

struct student

{char num[10];

char name[8];

int score[3];

float ave;

}st[N],temp;

main()

{

FILE *fp;

Int I,j,n;

If((fp=fopen(“stud”,”r”))==NULL)

{printf(“can not open the file”);

exit(0);

}

printf(“n file ‘stud’:”);

for(I=0;fread(&st[i],sizef(struct student),1,fp)!=0;I++)

{printf(“n%8s%8s”,st[i].num,,st[i].name);

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

printf(“%8d”,st[i].score[j]);

printf(“%10.f”,st[i].ave);

fclose(fp);

n=I;

for(I=0;I<n;I++)

for(j=I+1;j<n;j++)

if(st[i].ave<st[j].ave)

{temp=st[i];

st[i]=st[j];

st[j]=temp;

}

printf(“nnow:”);

fp=fopen(“stu-sort”,”w”);

for(I=0;I<n;I++)

{fwrite(&st[i],sizeof(struct student),1,fp);

printf(“n%8s%8s”,st[i].num,st[i].name);

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

printf(“%8d”,st[i].score[j]);

printf(“%10.2f”,st[i].ave);

fclose(fp);

}

13.8将上题以排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件。

解:#include <stdio.h>

struct student

{char num[10];

char name[8];

int score[3];

float ave;

}st[10],s;

main()

{FILE *fp, * fp1 ;

int I,j,t,n;

printf(“n NO.:”);

scanf(“%s”,s.num);

printf(“name:”);

scanf(“%s”,s.name);

printf(“score1,score2,score3:”);

scanf(“%d,%d,%d”,&s. score[0], &s. score[1], &s. score[2]);

s.ave=(s.score[0]+s.score[1]+s.score[2])/3.0;

if((fp=fopen(“stu_sort”,”r”))==NULL)

{printf(“can not open file.”);

exit(0);

}

printf(“original data:n”);

for(I=0;fread(&st[i],sizeof(struct student),1,fp)!=0;I++)

{printf(“n%8s%8s”,st[i].num,st[i].name);

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

printf(“%8d”,st[i].score[j]);

printf(“%10.2f”,st[i].ave);

}

n=I;

for(t=0;st[t].ave>s.ave&&t<n;t++);

printf(“nnow:n”);

fp1=fopen(“sort1.dat”,”w”);

for(I=p;j<t;I++)

{fwrite(&st[i],sizeof(stuct student),1,fp1);

print(“n%8s%8s”,st[i],num,st[i].name);

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

ptintf(“%8d”,st[i].score[j]);

printf(“%10.2f”,st[i].ave);

}

fwrite(&s,sizeof(struct student),1,fp1);

printf(“n%8s%7s%7d%7d%7d%10.2f”,s.num,s.name,s.score[0],s.score[1],s.score[2],s.ave);

for(I=t;I<n;I++)

{fwrite(&st[i],sizeof(struct student),1,fp1);

printf(“n %8s%8s”,st[i].num,st[i].name);

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

printf(“%8d”,st[i].score[j]);

printf(“10.2f”,st[i].ave);

fclose(fp);

fclose(fp1);

}

13.9上题结果仍存入原有的stu_sort文件而不另建立新文件。

解: #include<stdio.h>

struct student

{char num[10];

char name[8];

int score[3];

float ave;

}st[10],s;

main()

{FILE *fp, *fp1;

int I ,j,t,n;

printf(“nNO.:”);

scanf(“%s’,s.num);

printf(“name:”);

scanf(“%s’,s.name);

printf(“score1,score2,score3:”);

scanf(“%d%d%d”,&s.score[0]+&s.score[1]+&s.score[1], &s.score[2]);

s.ave=( s.score[0]+ s.score[1]+ s.score[2])/3.0;

if((fp=fopen(“stu=sort”,”r”))==NULL)

{printf(“can not open the file.”);

exit(0);

}

printf(“original data:n”);

for(I=0;fread(&st[i],sizeof(struct student),1,fp)!=0;I++)

{printf(“n%8s%8s”,st[i].num,st[i].name);

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

printf(“%8d”,st[i].score[j]);

printf(“%10.2f”,st[i].ave);

}

fclose(fp);

n=I;

for(t=0;st[t].ave>s.ave+&&t<n;t++);

ptintf(“nnow:n”);

fp=fopen(“stu_sort”,”w”);

for(I=0;I<t;I++)

{fwrite(&st[i],sizeof(struct student),1,fp);

printf(“n%9s%8s%8d%8d%8d%10.2f”,s.num,s.name,s.score[0],s.score[1] s.score[2] s.ave);

for(I=t;I<n;I++)

{fwrit(&sr[i],sizeof(struct srudent),1,fp);

printf(“n %8s%8s”,st[i].num,st[i].name);

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

printf(“%8d”,st[i].score[j]);

printf(“%10.2f”,st[i].ave);

}

fclose(fp);

}

13.10 有一磁盘文件emploee,内存放职工的数据。每个职工的数据包括:职工姓名、职工号、性别、年龄、住址、工资、健康状况、文化程度。要求将职工名和工资的信息单独抽出来另建一个简明的职工工资文件。

解:#include<stdio.h>

struct emploee

{char num[6];

char name[10];

char sex[2];

int age;

char addr[20];

int salary;

char health[8];

char class[10];

}en[10];

struct emp

{char name[10];

int salary;

}em-case[10];

main()

{FILE *fp1, *fp2;

int I,j;

if ((fp1=fopen(“emploee”,”r”))==NULL)

{printf(“can not open the file.”);

exit(0);

}

printf(“n NO. name sex age addr salary health classn”);

for(I=0;fread(&em[i],sizeof(struct emploee),1,fp1)!=p;I++)

{printf(“n%4s%8s%4s%6s%10s%6s%10s%8s”,em[i].num,em[i].name,em[i].sex, em[i].age, em[i].addr, em[i].salary, em[i].health, em[i].class);

strcpy(em_case[i].name, em[i].name);

em_case[i].salary=en[i].salary;

}

printf(“nn*****************************************”);

if((fp2=fopen(“emp_salary”,”wb”))==NULL)

{printf(“can not open the file.”);

exit(0);}

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

{if(fwrite(&en_case[j],sizeof(struct emp),1,fp2)!=1)

printf(“error!”);

printf(“n %12s%10d”,em_case[j].name,em_case[j].salary);

}

printf(“n*******************************************”);

fclose(fp1);

fclose(fp2);

}

13.11从上题的“职工工资文件”中删区一个职工的数据,再存回原文件。

解:#incude <stdio.h>

#incude <string.h>

struct emploee

{char name[10];

int salary;

}emp[20];

main()

{FILE *fp;

int I,j,n,flag;

char name[10];

int salary;

if((fp=fopen(“emp_salary”,”rb”))==NULL)

{printf(“can not open file.”);

exit(0);

}

printf(“n original data:”);

for(I=0;fead(&emp[i],sizeof(struct emploee),1,fp)!=0;I++)

printf(“n %8s %7d”,emp[i].name,emp[i].salary);

fclose(fp);

n=I;

printf(“n input name deleted:”);

scanf(“%s”,name);

for(flag=1,I=0;flag&&I<n;I++)

{if(strcmp(name,emp[i].name)==0)

{for(j=I;j<n-1;j++)

{strcmp(name,emp[i].name)==0

{for(j=I;j<n-1;j++)

{strcpy(emp[j].name,emp[j+1].name);

emp[j].salary=emp[j+1].salary;

}

flag=0;

}

}

if(!flag)

n=n-1;

else

printf(“n Now,the content of file:n”);

fp=fopen(“emp-dalary”,”wb”);

for(I=p;I<n;I++)

fwrite(&emp[i],sizeof(struct emploee),1,fp);

fclose(fp);

fp=fopen(“emp_salary”,”r”);

for(I=0;fread(&emp[i],sezeof(struct emploee),1,fp)!=0;I++)

printf(“n%8s%7d”,emp[i].name,emp[i].salary);

fclose(fp);

}

13.12 从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。

解: #include<stdio.h>

main()

{int I,flag;

char str[80],c;

FILE *fp;

Fp=fopen(“text”,”w”);

Flag=1;

While(flag==1)

{printf(“n Input string:n”);

ges(str);

fprintf(fp,”%s”,str);

printf(“nContinue?”);

c=getchar();

if((c==’N’)||(c==’n’))

flag=0;

getchar();

}

fcolse()fp;

fp=fopen(“text”,”r”);

while(fscanf(fp,”%s”,str)!=EOF)

{for(I=0;str[i]!=’’;I++)

if((str[i]>=’a’)&& (str[i]<=’z’))

str[i]-=32;

printf(“n%sn”,str);

}

fclose(fp);

}

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/192548.html

更多阅读

声明:《C语言程序设计第三版谭浩强课后习题及答案》为网友死灵的哀伤分享!如侵犯到您的合法权益请联系我们删除