tceic.com
学霸学习网 这下你爽了
赞助商链接
当前位置:首页 >> 理学 >>

C语言程序设计课后习题答案


C 语言程序设计课后习题答案

C 语言程序设计(第 2 版)课后习题答案 第一章 1.请参照本章例题,编写一个 C 程序,输出以下信息: ************************** Very good! ************************** 解: #include<stdio.h> void main() { printf("**************************"); printf("\n"); printf("Very good!\n"); printf("\n"); printf("**************************"); } 2.编写一个 C 程序,输入 a、b、c 三个值,输出其中最大值。 解: #include<stdio.h> void main() { int a,b,c,max; printf("请输入三个数 a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if(max<b) if(max<c) } 第二章 1.假如我国国民生产总值的年增长率为 10%,计算 10 年后我国国民生产总值与现在相比增长多 少百分比。计算公式为 P=(1+r)^n,r 为年增长率;n 为年数;P 为与现在相比的百分比。 解: #include<stdio.h> #include<math.h> void main() { double P, r=0.1, n=10; P=pow((1+r), n); max=b; max=c;

printf("最大数为: %d",max);

printf("%lf\n", P); } 3.请编程序将"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> void 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%c\n",c1,c2,c3,c4,c5); } 第三章 3.用下面的 scanf 函数输入数据,使 a=3, b=7, x=8.5, y=71.82, c1='A', c2='a'。 问在键盘上如何输入? 解: #include<stdio.h> void main() { int a, b; float x, y; char c1, c2; scanf("a=%d, b=%d", &a, &b); scanf(" 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 5. 设圆半径 r=1.5,圆柱高 h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用 scanf 输入数据,输出计算结果,输出时要求文字说明,取小数点后 2 位数字。请编程序。 解: #include<stdio.h> void 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=%.2f\n",C1); printf("Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n",Sa,Sb,Va,Vb); } 6. 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9,输出要求有文字说明,取位 2 小数。 解: #include<stdio.h> void main() { float F,c; scanf("%f",&F); c=5*(F-32)/9; printf("c=%.2f",c); } 7. 编程序,用 getchar 函数读入两个字符给 c1、c2,然后分别用 putchar 函数和 printf 函数输出 这两个字符。思

考以下问题: (1)变量 c1、c2 应定义为字符型或整形?或二者皆可? (2)要求输出 c1 和 c2 值的 ASCII 码,应如何处理?用 putchar 函数还是 printf 函数? (3)整形变量与字符变量是否在任何情况下都可以互相代替?如: char 解: #include<stdio.h> void main() { char c1,c2; c1=getchar(); c2=getchar(); putchar(c1);putchar(‘\n');putchar(c2);putchar(‘\n'); } #include<stdio.h> void main() { char c1,c2; c1=getchar(); c2=getchar(); printf("c1=%d c2=%d\n",c1,c2); c1,c2;与 int c1, c2; 是否无条件地等价?

printf("c1=%c c2=%c\n",c1,c2); } 第四章 3. 写出下面各逻辑表达式的值。设 a=3,b=4,c=5。 (1) (2) (3) (4) (5) 解: (1) (2) (3) (4) (5) 解: #include<stdio.h> void main() { int a,b,c,temp,max; printf("请输入 3 个整数: temp=(a>b)?a:b; max=(temp>c)?temp:c; printf("3 个整数的最大数是%d\n",max); } 6. 给一个百分制成绩,要求输出等级'A'、'B'、'C'、'D'、 'E'。90 分以上为'A',80~90 分为'B',70~79 分为'C',60 分以下为'D'。 解: #include<stdio.h> void main() { float score; char grade; printf("请输入学生成绩: while(score>100||score<0) { printf("\n 输入有误,请重新输入: scanf("%f", &score); } switch((int)(score/10)) { "); "); scanf("%f",&score); "); scanf("%d,%d,%d",&a,&b,&c); 0 1 1 0 1 a+b>c&&b==c a||b+c&&b-c !(a>b)&&!c||1 !(x=a)&&(y=b)&&0 !(a+b)+c-1&&b+c/2

5. 有 3 个整数 a、b、c,由键盘输入,输出其中最大的数,请编程序。

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';break; } printf("成绩是%5.1f, 相应的等级是%c. \n",score,grade); } 7. 给定一个不多于 5 位的正整数,要求: (1)求出它是几位数; (2)分别输出每一位数字; (3)按逆序输出各位数字。例如原数为 321,应输出 123。 解: #include <stdio.h> void main() { long int num; int indiv,ten,hundred,thousand,ten_thousand,place; 位数*/ printf("请输入一个整数(0~99999): "); scanf("%ld",&num); if (num>9999) else else else else if(num>999) if(num>99) if(num>9) place=1; place=5; place=4; place=3; place=2; /*分别代表个位、十位、百位、千位、万位和

printf("place =%d\n", 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%d\n",indiv,ten,hundred,thousand,ten_thousand); break; case 4: printf("%d,%d,%d,%d",thousand,h

undred,ten,indiv); printf("\n 反序数字为: "); printf("%d%d%d%d\n",indiv,ten,hundred,thousand); break; case 3: printf("%d,%d,%d",hundred,ten,indiv); printf("\n 反序数字为: "); printf("%d%d%d\n",indiv,ten,hundred); break; case 2: printf("%d,%d",ten,indiv); printf("\n 反序数字为: "); printf("%d%d\n",indiv,ten); break; case 1: printf("%d",indiv); printf("\n 反序数字为: "); printf("%d\n",indiv); break; } } 8. 企业发放的奖金根据企业的当年利润决定。 当利润 I 低于或等于 100000 元时, 奖金可提成 10%; 利润大于 100000 元,小于 200000 元(100000<I≤200000)时,低于 100000 元的部分按 10% 提成,高于 100000 元的部分,可提成 7.5%;利润大于 200000 元,小于 400000 元(200000<I ≤400000)时,低于 200000 元的部分仍按上述办法提成(下同) ,高于 200000 元的部分按 5% 提成。利润大于 400000 元,小于 600000 元(400000<I≤600000)时,高于 400000 元的部分 按 3%提成。利润大于 600000 元,小于 1000000 元(600000<I≤1000000)时,高于 600000 的部分按 1.5%提成;利润大于 1000000 元(I>1000000)时,超过 1000000 元的部分按 1%提 成。从键盘输入当年利润 I,求应发放奖金总数。要求: (1)用 if 语句编程序;(2)用 switch 语句编程序。 解: (1) 用 if 语句编程序。 #include <stdio.h> void main() { long i; float bonus,bon1,bon2,bon4,bon6,bon10; 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); /*利润为 10 万元时的奖金*/ /*利润为 20 万元时的奖金*/ /*利润为 40 万元时的奖金*/ /*利润为 60 万元时的奖金*/ /*利润为 100 万元时的奖金*/

if(i<=100000) else else else else else

bonus=i*0.1;

/*利润在 10 万元以内按 0.1 提成奖金*/ /*利润在 10 万至 20 万元时的奖金*/ /*利润在 20 万至 40 万元时的奖金*/ /*利润在 40 万至 60 万元时的奖金*/ /*利润在 60 万至 100 万元时的奖金*/ /*利润在 100 万元以上时的奖金*/

if(i<=200000) if(i<=400000) if(i<=600000) if(i<=1000000)

bonus=bon1+(i-100000)*0.075; bonus=bon2+(i-200000)*0.05; bonus=bon4+(i-400000)*0.03; bonus=bon6+(i-600000)*0.015; bonus=bon10+(i-1000000)*0.01; } (2) 用 switch 语句编程序。 #include <stdio.h> void main() { long i;

printf("奖金是%10.2f\n",bonus);

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) switch(c) { case 0: c=10;

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); } 9. 输入 4 个整数,要求按由小到大的顺序输出。 解: #include <stdio.h> void main() { int t,a,b,c,d; printf("请输入 4 个整数: "); scanf("%d,%d,%d,%d",&a,&b,&c,&d); printf("\n a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); if(a>b) if(a>c) if(a>d) if(b>c) if(b>d) if(c>d) {t=a; a=b; b=t;} {t=a; a=c; c=t;} {t=a; a=d; d=t;} {t=a; b=c; c=t;} {t=b; b=d; d=t;} {t=c; c=d; d=t;}

printf("排序结果如下: \n"); printf("%d, %d, %d, %d\n",a,b,c,d); } 10. 有 4 个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为 1。这 4 个塔的高度 分别为 10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。 解: #include <stdio.h> void 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) 是否在塔外*/ printf("该点高度为%d\n",h); } 11. 求 方程的解。 根据代数知识,应该有以下几种可能: (1)a=0, 不是二次方程,而是一次方程。 h=0; /* 判断该点 /*求该点到各中心点的距离*/

(2) ,有两个相等的实根。 (3) ,有两个不等的实根。 (4) ,有两个共轭复根。 编写程序,运行时,分别给出不同的 a, b, c 值,相应于上面 4 种情况,分析输出结果。 解: #include <stdio.h> #include <math.h> #include <stdlib.h> void main() { float a,b,c,disc,x1,x2,realpart,imagpart; scanf("%f,%f,%f",&a,&b,&c); printf("The equation"); if(fabs(a)<=1e-6) printf("is not a quadratic\n"); else { disc=b*b-4*a*c; if(fabs(disc)<=1e-6) { printf("has tow eual roots:%8.4f\n",-b/(2*a)); else if(fabs(disc)>1e-6) x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2); } else { realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf("has complex roots:\n"); printf("%8.4f+%8.4fi\n",realpart,imagpart); printf("%8.4f-%8.4fi\n",realpart,imagpart); } } } 第五章 1. 求 100~200 间的全部素数。 解: #include<stdio.h> #include<math.h> void main() { int m,i,n=0; double k; for(m=101;m<=200;m=m+2)

{

k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) if(i>=k+1) { printf("%d",m); } if(n%10==0) } printf("\n"); } 2. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 解: #include<stdio.h> void main() { char c; int i=0,j=0,k=0,l=0; while((c=getchar())!='\n') { if(c>='A'&&c<='Z'||c>='a'&&c<=&#39 ;z') i++; else if(c>='0'&&c<='9') j++; else if(c==' ') k++; else l++; } printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l); } 3. 输出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立 方和等于该本身。例如:153 是一个水仙花数,因为 153=1^3+5^3+3^3。 解: #include<stdio.h> #include<math.h> void main() { int i,j,k,n; printf(""水仙花"数是:"); for(n=100;n<1000;n++) { printf("\n"); n=n+1; break;

i=n/100; j=n/10-i*10; k=n%10; if(n==i*i*i+j*j*j+k*k*k) printf("%4d",n); } printf("\n"); } 4. 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第 二天早上又将剩下的桃子吃掉一半, 又多吃一个。 以后每天早上都吃了前一天剩下的一半零一个。 到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。 解: #include<stdio.h> void main() { int day,x1,x2; day=9; x2=1; while(day>0) { x1=(x2+1)*2; x2=x1; day--; } printf("total=%d\n",x1); } 5. 一球从 100 米高度自由下落, 每次落地后返回原高度的一半, 再落下。 求它在第 10 次落地时, 共经过了多少米?第 10 次反弹多高? 解: #include<stdio.h> void main() { int i,n;double h=100,s=100; scanf("%d",&n); for(i=1;i<=n;i++) { h*=0.5; if(i==1) s=2*h+s; } printf("h=%f,s=%f\n",h,s); } 6. 打印以下图案 * *** continue;

***** ******* ***** *** * 解: #include<stdio.h> #include<math.h> void 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. 两个乒乓球队进行比赛,各出 3 人。甲队为 A、B、C 3 人,乙队为 X、Y、Z 3 人。已抽签决定 比赛名单。有人向队员打听比赛的名单,A 说他不和 X 比,C 说他不和 X、Y 比,请编程序找出 3 三队选手的对阵名单。 解: #include<stdio.h> void main() { char i,j,k; /*i 是 A 的对手,j 是 B 的对手,k 是 C 的对手*/ for(i='X';i<='Z';i++) for(j='X';j<='Z';j++) { if(i!=j) for(k='X';k<='Z';k++) { if(i!=k&&j!=k) { if(i!='X'&&k!='X'&&k!='Z') printf("order

is A--%c\tB--%c\tC--%c\n",i,j,k); } } } } 第六章 1. 已知一个班 10 个学生的成绩,要求输入这 10 个学生

的成绩,然后求出它们的平均成绩。 解: #include <stido.h> main() { float a[10],sum,avg; int i; sum=0.0; printf("Please input the students score:"); for(i=0;i<10;i++) {scanf("%f",&a[i]); sum=sum+a[i]; } avg=sum/10; printf("The average is:%f\n",avg); } 2. 已知一个班 10 个学生的成绩,存放在一个一维数组中,要求找出其中成绩最高的学生的成绩 和该生的序号。 解: #include<stdio.h> void main() { int ch[10]; int i,max=0,xh; printf("请输入 10 个学生的成绩:\n"); for(i=0;i<10;i++) { scanf("%d",&ch[i]); if(ch[i]>max) { max=ch[i]; xh=i; } }

printf("成绩最高为:%d\n",max); printf("该生的序号为:%d\n",xh); } 3. 有 3 个学生,上 4 门课,要求输入全部学生的各门课成绩,并分别求出每门课的平均成绩。 解: #include<stdio.h> #include<stdlib.h> #define RENSHU 3 #define KECHENG 4 void main() { float chengji[4][4]; int i,j; printf("\n 请按人输入(一次输入一个人所有课程的成绩)成绩( %d 人, %d 门课程) : ",RENSHU,KECHENG); for(i=0;i<RENSHU;i++) { printf("\n 第%d 人:",i+1); for(j=0;j<KECHENG;j++) scanf("%f",&chengji[i][j]); } for(j=0;j<KECHENG;j++) { chengji[RENSHU][j]=0; for(i=0;i<RENSHU;i++) chengji[RENSHU][j]+=chengji[i][j]; chengji[RENSHU][j]=chengji[RENSHU][j]/RENSHU; } for(i=0;i<=RENSHU;i++) { for(j=0;j<KECHENG;j++) printf("%8.2f",chengji[i][j]); printf("\n"); } printf("\n"); } 4. 已知 5 个学生的 4 门课的成绩,要求求出每个学生的平均成绩,然后对平均成绩从高到低将 各学生的成绩记录排序。 解: #include <stdio.h> #include <stdlib.h> void main() { int a[5][4]={{94,78,87,76},{66,87,75,69},{100,98,89,77},{82,58,72,84},{82,73,67,54}};

int i,j,sum; float average,b[5],t; for(i=0;i<5;i++) { sum=0; for(j=0;j<4;j++) { sum=sum+a[i][j]; b[i]=sum/4.0; } printf("average%d=%4.2f\n",i+1,b[i]); } for(j=0;j<4;j++) for(i=j+1;i<5;i++) if(b[i]>b[j]) { t=b[i]; b[i]=b[j]; b[j]=t; } for(i=0;i<5;i++) printf("%.2f\n",b[i]); } 5. 将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5, 6,8。 解: #include<stdio.h> void main() { int i,a [10],temp; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%4d",a[i]); for(i=0;i<5;i++) { temp=a[i]; a[i]=a[9-i]; a[9-i]=temp; } for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n"); }

6. 有个 15 数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中 第几个元素的值。如果该数不在数组中,则输出"无此数"。 解: #include<stdio.h> void main() { int a[15]={14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}; int start,end,mid,i,find_flag; int x; printf("input x"); scanf("%d ",&x); start=0;

end=14; find_flag=0; do{ mid=(start+end)/2; if(x==a[mid]) { printf("Find the number,it is a[%d]",mid); break; } else if(x>a[mid]) else start=mid+1; }while(start<end); } 7. 输出以下图案: ***** ***** ***** ***** ***** 解: #include<stdio.h> void main() { int i,j,k;char a[5][5]; for(i=0;i<5;i++) { for(j=0;j<5;j++) { end=mid-1;

a[i][j]='*'; printf("%c",a[i][j]); } printf("\n"); for(k=1;k<=i+1;k++) printf(" } printf("\n"); } 8. 有一篇文章,共有 3 行文字,每行有个 80 字符。要求分别统计出其中英文大写字母、小写字 母、空格以及其它字符的个数。 解: #include<stdio.h> void main() { int i,j,upp,low,dig,spa,oth; char text[3][80]; upp=low=dig=spa=oth=0; for(i=0;i<3;i++) { printf("\nPlease input line %d:\n",i+1); gets(text[i]); for(j=0;j<80&&text[i][j]!='\0';j++) { if(text[i][j]>='A'&&text[i][j]<='Z') upp++; else if(text[i][j]>='a'&&text[i][j]<='z') low++; else if(text[i][j]>='0'&&text[i][j]<='9') dig++; else if(text[i][j]==' ') spa++; else oth++; } } for(i=0;i<3;i++) printf("%s\n",text[i]); printf("upper case:%d\n",upp); printf("lower case:%d\n",low); printf("digit case:%d\n",dig); printf("space case:%d\n",spa); printf("other case:%d\n",oth); } 9. 有一行电文,已按下面规律译成密码: A->Z B->Y C->X … a->z b->y c->x ");

即第 1 个字母变成第 26 个字母,第 i 个字母变成第(26-i+1)个字母。非字母字符不变。假如已 知道密码是 Umtorhs,要求编程序将密码译回原文,并输出密码和原文。 解: #include<stdio.h> void main() { int i;char str1[100],str2[100]; gets(str1); for(i=0;str1[i]!='\0';i++) if(str1[i]>=65&&str1[i]<=90) else } 10. 编一程序,将两个字符串连接起来,(1)用 strcat 函数;(2)不用 strcat 函数。 解: (1) #include<stdio.h> void main() { int i,j;char str1[100],str2[100],str3[201]; gets(str1); gets(str2); str3=strcat(str1,str2); printf("%s\n%s\n%s\n",str1,str2,str3); } (2) #include<stdio.h> void main() { int i,j;char str1[100],str2[100],str3[201]; gets(str1); gets(str2); for(i=0;str1[i]!='\0';i++) str3[i]=str1[i]; for(j=0;str2[j]!='\0';j++) str3[j+i]=str2[j]; printf("%s\n%s\n%s\n",str1,str2,str3); } 第七章 1. 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输 出结果两个整数由键盘输入。 解: str2[i]=str1[i]; str2[i]=155-str1[i]; str2[i]=219-str1[i]; else if(str1[i]>=97&&str1[i]<=122) printf("%s\n%s\n",str1,str2);

#include<stdio.h> int maxyueshu(int m,int n) { int i=1,t; for(;i<=m&&i<=n;i++) { if(m%i==0&&n%i==0) return(t); } int minbeishu(int m,int n) { int j; if(m>= t=i; }

n) j=m; else j=n; for(;!(j%m==0&&j%n==0);j++) ; return j; } void 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=%d\n",max,min); } 2. 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 解: #include<stdio.h> int psushu(int m) { int i,t=1; for(i=2;i<m/2&&t==1;i++) if(m%i==0) t=0; return t; } void main() { int a,s; printf("enter sushu is \n"); scanf("%d",&a);

s=psushu(a); if(s==1) printf("a is sushu\n"); else printf("s is not sushu\n"); } 3. 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 解: #include<stdio.h> int zhuangzhi(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;} } void 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"); } } 4. 写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。 解: #include<stdio.h> void main() { char str0[100]; gets(str0); fanxu(str0); puts(str0); }

fanxu(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]; } 5. 写一函数,将两个字符串连接。 解: #include<stdio.h> lianjie(char a[100],b[100]) { strcat(a,b); } void main() { char str1[100],str2[100]; gets(str1);gets(str2); lianjie(str1,str2); puts(str1); } 6. 写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。 解: #include<stdio.h> fuzhi(char a[100],b[100]) { int i,j=0; for(i=0;a[i]!='\0';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++;} } void main() { char str1[100],str2[100]; gets(str1); fuzhi(str1,str2); puts(str2); } 7. 写一函数,输入一个四位数字,要求输出这四个数字字符,但每个数字间空一个空格。如输 入 2008,应输出"2_0_0_8"。 解: #include<stdio.h> void insert(char str[])

{ int i; for(i=strlen(str);i>0;i--) { str[2*i]=str[i]; str[2*i-1]=' '; } printf("\noutput:\n%s",str); } void main() { char str[80]; printf("\ninput four digits:"); scanf("%s",str); insert(str); } 8. 编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数, 在主函数中输入字符串以及输出上述结果。 解: #include<stdio.h> char tongji(char str0[100],int b[4) { int

i; for(i=0;str0[i]!='\0';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]++; } } void main() { char str1[100];static int i,a[4]; gets(str1); tongji(str1,a); printf("zimu Shuzi Kongge Qita\n"); for(i=0;i<4;i++) printf("%-8d",a[i]); printf("\n");

} 9. 写一函数,输入一行字符,将此字符串中最长的单词输出。 解: #include<stdio.h> cechang(char str1[100],word0[15]) { int i=0,j=0,t=0; static char word1[15]; for(;str1[i]!='\0';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); } } void main() { char str0[100],longword[15]; gets(str0); cechang(str0,longword); puts(longword); } 10. 写一函数用"起泡法"对输入的 10 个字符按由小到大的顺序排列。 解: #include<stdio.h> int paixu(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;} } void 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"); } 11. 输入 10 个学生 5 门课的成绩,分别用函数实现下列功能: ①计算每个学生平均分;

②计算每门课的平均分; ③找出所有 50 个分数中最高的分数所对应的学生和课程; 解: #include<stdio.h> float x1[10],x2[5]; float pp(),cc(),find(); void main() { char name[10][20],class[5][20]; float score[10][5],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); for(i=0;i<10;i++) { puts(name[i]); printf("%.3f\n",x1[i]); } for(j=0;j<5;j++) { puts(class[j]); printf("%.3f\n",x2[j]); } for(j=0;j<5;j++) { printf("%.3f \n",max[j]); puts(name[a[j]]); puts(class[j]); } } float pp(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(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]; x2[j]=sum/10; } } float find(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;} } 12. 写几个函数: ①输入 10 个职工的姓名和职工号; ②按职工号由小到大顺序排序,姓名顺序也随之调整; ③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职 工姓名。 解: #include<stdio.h> #define N 10 find(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(int h[],k )

{ int i,j; for(i=0;i<N;i++) if(h[i]-k==0) j=i; return j; } void 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]]); } 13. 输入 4 个整数 a,b,c,d,找出其中最大的数。用函数的递归调用来处理。 解: #include <stdio.h> void main() { int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf("Please enter interger numbers:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max_4(a,b,c,d); printf("max=%d \n",max); } int max_4(int a,int b,int c,int d) { int max_2(int,int); int m; m=max_2(a,b); m=max_2(m,c); m=max_2(m,d); return(m);

} int max_2(int a,int b) { if(a>b) return a; else return b; } 14. 用递归法将一个整数 n 转换成字符串。 例如, 输入整数 2008, 应输出字符串"2008"。 n 的位数不确定,可以是任意位数的整数。 解: #include <stdio.h> #include<math.h> int x[10]; pf(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); } void 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]='\0'; puts(c); } 15. 给出年、月、日,计算该日是该年的第几天。 解: #include <stdio.h> int find(int x,int y,int 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); } void main() { int year,month,date,day; scanf("%d %d %d",&year,&month,&date); day=find(year,month,date); printf("THE DATE IS THE %dth DAYS\n",day); } 第八章 1. 输入三个整数,按由小到大的顺序输出。 解: #include <stdio.h> void 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) if(*p1>*p3) if(*p2>*p3) } 2. 输入三个字符串,按由小到大的顺序输出。 解: #define N 3 #define M 20 #include <stdio.h> void 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) if(m>0) {strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);} {strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);} m=strcmp(q,q+2); n=strcmp(q+1,q+2); {t=p1;p1=p2;p2=t;} {t=p1;p1=p3;p3=t;} {t=p2;p2=p3;p3=t;}

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

if(n>0) puts(p); }

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

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

3. 输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函 数;①输入 10 个数;②进行处理;③输出 10 个数。 解: #include <stdio.h> void main() { int number[10]; input(number); max_min_value(number); output(number); } input(int number[10]) { int i; printf("input 10 numbers:"); for(i=0;i<10;i++) scanf("%d",&number[10]); } max_min_value(int array[10]) { int *max, *min, *p, *array_end; array_end=array+10; max=min=array; for(p=array+1;p<array_end;p++) if(*p>*max) max=p; else if(*p<*min) min=p; *p=array[0]; array[0]=*min; *min=*p; *p=array[9]; array[9]=*max; *max=*p; return; } output(int array[10]) { int *p; printf("now,they are:"); for(p=array;p<=array+9;p++) printf("%d ",*p); } 4. 有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成前面 m 个数。写一函数: 实现以上功能,在主函数中输入 n 个数和输出调整后的 n 个数。 解:

#define N 10 #include<stdio.h> void shift(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; } void 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"); } 5. 有 n 个学生围成一圈,顺序排号。从第 1 个学生开始报数(从 1 到 3 报数) ,凡报到 3 的学生 退出圈子,到最后只留下一名学生,问最后留下的是原来的第几号学生。 解: #define N 5 #include<stdio.h> void 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)) if(*p!=0) if((i-3)==0) p++; } p=a+1; i++; {*p=0;i=0;k--;}

for(i=1;i<=N;i++) if(a[i]!=0) } 6. 写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。 解: int strlen(char *s) { int n=0; while(*s) {n++;s++;} return n; } #include <stdio.h> void main() { char s[255]; gets(s); printf("长度是 %d \n",strlen(s)); } 7. 有一字符串 a,内容为: "My name is Li jilin.",另有一字符串 b,内容为: "Mr. Zhang Haoling is very happy."。写一函数,将字符串 b 中从第 5 个到第 17 个字符复制到字符 串 a 中,取代字符串 a 中第 12 个字符以后的字符。输出新的字符串 a。 解: #define N 100 #include<stdio.h> #include<string.h> void main() { void change_name(char *p1,char *p2); char a[N]="My name is Li jilin.",*p1; char b[N]="Mr. Zhang Haoling is very happy.",*p2; p1=a,p2=b; change_name(p1,p2); printf("%s\n",p1); } void change_name(char printf("The last number is %d\n",a[i]);

*p1,char *p2) { strncpy(p1+11,p2+4,13); *(p1+23)='.'; *(p1+24)=\0;

} 8. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。 解: #include <stdio.h> void main () { int upp=0,low=0,dig=0,spa=0,oth=0,i=0; char *p,s[20]; printf("input string:"); while((s[i]=getchar())!='\n') i++; p=&s[0]; while(*p!='\n') { if((*p>='A')&&(*p<='Z')) ++upp; else if((*p>='a')&&(*p<='z')) ++low; else if(*p==' ') ++spa; else if((*p>='0')&&(*p<='9')) ++dig; else ++oth; p++; } printf("upper case:%d,lower case:%d,space:%d,digit:%d,other:%d",upp,low,spa,dig,oth); } 9. 在主函数中输入 10 个等长的字符串。用另一函数对它们排序,然后在主函数输出这 10 个已 排好序的字符串。 解: #include <stdio.h> #include<string.h> void main () { int i;char *p[10],str[10][20]; for(i=0;i<10;i++) p[i]=str[i]; printf("input 10 strings:\n"); for(i=0;i<10;i++) scanf("%s",p[i]); sort(p); printf("now,the sequence is:\n"); for(i=0;i<10;i++) printf("%s\n",p[i]); } sort(char *p[]) { int i,j;char temp; for(i=0;i<9;i++)

for(j=0;j<9-i;j++) if(strcmp(*(p+j),*(p+j+1))>0) {temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp;} } 10. 将 n 个数按输入时顺序的逆序排列,用函数实现。 解: #include <stdio.h> void main () { int i,n; char *p,num[20]; printf("input n:"); scanf("%d",&n); printf("input these numbers:\n"); for(i=0;i<n;i++) scanf("%d",&num[i]); p=&num[0]; sort(p,n); printf("now, the sequence is:\n"); for(i=0;i<n;i++) printf("%d",num[i]); } sort(char *p,int m) { int i;char temp,*p1,*p2; for(i=0;i<m/2;i++) {p1=p+i; p2=p+(m-1-i); temp=*p1; *p1=*p2;*p2=temp;} } 11. 编一个函数 inv,将数组 a 中 n 个整数按相反顺序存放,用指针变量作为调用该函数时的实 参。 解: #include <stdio.h> void inv(int *a,int n) { int temp,*q,i=0; q=a+n-1; while(a+i<q) { temp=*(a+i);*(a+i)=*q;*q=temp; i++;q--; } } void main () {

int a[10]={3,7,9,11,0,6,7,5,4,2} ; int k,*p; printf("the original array:\n"); for(p=a,k=0;k<10;k++) printf("%4d",*p++); p=a; inv(p,10 ); printf("the array has been inverted:\n"); for(p=a,k=0;k<10;k++) printf("%4d,",*p++); printf("\n"); } 12. 输入一个字符串,内有数字和非数字字符,例如:a123x456 17960? 302tab5876 将其中连续 的数字作为一个整数,依次存放到一数组 a 中。例如,123 放在 a[0],456 放在 a[1],统计共有 多少个整数,并输出这些数。 解: #include <stdio.h> void main () { char str[50],*pstr; int i,j,k,m,e10,digit,ndigit,a[10],*pa; printf("input a string:\n"); gets(str); printf("\n"); pstr=&str[0]; pa=&a[0]; ndigit=0; i=0; j=0; while(*(pstr+i)!='\0') { if((*(pstr+i)>='0')&&(*(pstr+i)<='9')) else { if(j>0) { digit=*(pstr+i-1)-48; k=1; while(k<j) { e10=1; j++;

for(m=1;m<=k;m++) e10*=10; digit+=(*(pstr+i-1-k)-48)*e10;

k++; } *pa=digit; ndigit++; pa++; j=0; } } i++; } if(j>0) { digit=*(pstr+i-1)-48; k=1; while(k<j) { e10=1; for(m=1;m<=k;m++) e10*=10; digit+=(*(pstr+i-1-k)-48)*e10; k++; } *pa=digit; ndigit++; pa++; j=0; } printf("There are %d numbers in this line. They are:\n",ndigit); j=0; pa=&a[0]; for(j=0;j<ndigit;j++) printf("%d ",*(pa+j)); printf("\n"); } 13. 写一函数,将一个 3*3 的整型二维数组转置,即行列互换。 解: #include <stdio.h> void main () { int a[3][3],*p,i; printf("input matrix:\n"); for(i=0;i<3;i++) scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]); p=&a[0][0];

move(p); printf("now, matrix:\n"); for(i=0;i<3;i++) printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]); } move(int *pointer) { int i,j,t; for(i=0;i<3;i++) for(j=i;j<3;j++) {t=*(pointer+3*i+j); *(pointer+3*i+j)= *(pointer+3*j+i); *(pointer+3*j+i)=t;} } } 第九章 1. 定义一个结构体变量(包括年、月、日) 。计算该日在本年中是第几天?注意闰年问题。 解: struct {int year; int month; int day; }date; void main() { int days; printf("Input switch(date.month) { case 1: days=date.day; case 2: days=date.day+31; case 3: days=date.day+59; case 4: days=date.day+90; case 5: days=date.day+120; case 6: days=date.day+31; case 7: days=date.day+181; case 8: days=date.day+212; case 9: days=date.day+243; case 10: days=date.day+273; case 11: days=date.day+304; case 12: days=date.day+334; } 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,date.day,days,date,year); break; break; break; break; break; break; break; break; break; break; break; break; year,month,day:"); scanf("%d,%d,%d",&date.year,&date.month,&date.day);

} 2. 写一个函数 days,实现上面的计算。由主函数将年、月、日传递给 days 函数,计算后将日子 数传回主函数输出。 解: struct y_m_d {int year: int month; int day; }date; int days(struct { int sum; switch(date1.month) { case 1:sum=date1.day; case 2:sum=date1.day+31; case 3:sum=date1.day+59; case 4:sum=date1.day+90; case 5:sum=date1.day+120; case 6:sum=date1.day+151; case 7:sum=date1.day+181; case 8:sum=date1.day+212; case 9:sum=date1.day+243; case 10:sum=date1.day+243; case 11:sum=date1.day+243; case 12:sum=date1.day+243; } if((d break; break; break; break; break; break; break; break; break break break break y_m_d date1)

ate1.year%4==0&&date1.year%100!=0||date1.year%400==0)&&date1.month&gt ;=3) } 3. 编写一个函数 print,打印一个学生的成绩数组,该数组中有 5 个学生的数据记录,每个记录 包括 num、name、score[3],用主函数输入这些记录,用 print 函数输出这些记录。 解: #define N 5 struct student {char num[6]; char name[8]; int score[4]; sum+=1; return sum;

}stu[N]; void 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"); } 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"); } } 5. 有 10 个学生,每个学生的数据包括学号、姓名、3 门课的成绩,从键盘输入 10 个学生的数 据, 要求输出各学生 3 门课的平均成绩, 然后按照平均成绩由高到低输出学生的信息 (包括学号、 姓名、3 门课成绩、平均分数) 。 解: #define N 10 struct student { char num[6]; char name[8]; int score[4]; float avr; }stu[N]; void 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++); scanf("%d", &stu[i].score[j]);} } } average=0;max=0;maxi=0; for(i=0;i<N;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. 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.2f\n",stu[i].avr); } printf("average=%6.2f\n",average); printf("The highest score is: %s,score total:%d.",stu[maxi].name,max); } 6. 13 个人围成一圈,从第 1 个人开始顺序报号 1、2、3。凡报到"3"者退出圈子。找 出最后留在圈子中的人原来的序号。 解: #define N 13 struct person {int number; int nextop; }link[N+1]; void main() { name score1 score2 score3 average\n");

int i,count,h; for(i=1;i<=N;i++) { if(i==N) else } printf("\n"); count=0; h=N; printf("sequence that person2 leave the circle:\n"); while(count<N-1) { i=0; while(i!=3) link[i].nextp=1; link[i].nextp=i+1;

link[i].number=i;

{ 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;i<=N;i++) if(link[i].number) } 7. 建立由 3 个学生数据结点构成的单向动态链表,向每个结点输入学生的数据(每个学生的数 据包括学号、姓名、成绩) ,然后逐个输出各结点的数据。 #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct student) struct student { int num; char sex; float score; struct student *next; }; void main() { struct student *head,*p,*q; head=p=q=(struct student *)malloc(LEN); scanf("%d,%s,%f",&p->num,&p->sex,&p->score); p=(struct student *)malloc(LEN); scanf("%d,%s,%f",&p->num,&p->sex,&p->score); q=(struct student *)malloc(LEN); scanf("%d,%s,%f",&q->num,&q->sex,&q->score); head->next=p; p->next=q;q->next=NULL; p=head; printf("\n 结点 1:%d,%s,%6.2f\n",p->num,p->sex,p->score); p=p->next; printf("\n 结点 2:%d,%s,%6.2f\n",p->num,p->sex,p->score); p=p->next; printf("\n 结点 3:%d,%s,%6.2f\n",p->num,p->sex,p->score); } 第十章 4. 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件 test 中保存。输入的字符串以"!"结束。 解: #include <stdio.h> printf("%3d",lin[i].number);

main() { File *fp; Char str[100]; Int I=0; If((fp=fopen("test","w")==NULL) {printf("Can not open the file\n"); 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("%s\n",str); fclose(fp); } 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 file\n"); 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 {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= file B:\n"); for(I=i1;(ch=fgenc(fp))!=EOF;I++)

0;I<n;I++) {putc(c[i],fp); putchar(c[i]); } fclose(fp); } 6. 有 5 个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号、姓名、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 error\n"); 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.2f\n",stu[i].num,stu[i].name,stu[i].score[0], stu[i].score[2] ,stu[i].ave); } } 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':"); stu[i].score[1],

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); } 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_s

ort","r"))==NULL) {printf("can 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); } 9. 上题结果仍存入原有的 stu_sort 文件,而不另建立新文件。 解: #include<stdio.h> struct student {char num[10]; char name[8]; not open file.");

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.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); } 10. 有一磁盘文件 emploee,文件内存放职工的数据,每个职工的数据包括职工姓名、职工号、 性别、年龄、住址、工资、健康状况、文化程度。今要求将职工名、工资的信息单独抽出来另建 s.score[2]

一个简明的职工工资文件。 解: #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 class\n"); 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("\n\n*****************************************"); 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); } 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); } 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]!='\0';I++) if((str[i]>='a')&& (str[i]<='z')) str[i]-=32; printf("\n%s\n",str); } fclose(fp); }



推荐相关:

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

C语言程序设计第三版谭浩强课后习题答案完整版_教育学_高等教育_教育专区。c语言 C 语言程序设计第三版谭浩强 课后习题答案完整版 第一章 1.5 请参照本章例题,...


C语言程序设计课后习题答案

C语言程序设计课后习题答案 - 循环部分习题 1. 编写程序,求 1+2+3+…+n 之和超过 2000 的第一个 n 值及其和。 参考方法 1: #include<iostream.h> vo....


《C语言程序设计》课后习题答案(第四版)

C语言程序设计课后习题答案(第四版) - 第 1 章程序设计和 C 语言 1 1.1 什么是计算机程序 1 1.2 什么是计算机语言 1 1.3C 语言的发展及其特点 3 ...


C语言程序设计(郑莉)课后习题答案

C++语言程序设计(清华大学郑莉)课后习题答案第 一章 概述 由于图形用户界面的应用,程序运行由顺序运行演变为事件驱 动, 使得软件使用起来越来越方便, 但开发起来却...


《C语言程序设计》课后习题答案(第四版)谭浩强

C语言程序设计课后习题答案(第四版)谭浩强_理学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档《C语言程序设计课后习题答案(第四版)谭浩强_理学_...


《C语言程序设计》课后习题答案(第四版)谭浩强

C语言程序设计课后习题答案(第四版)谭浩强_理学_高等教育_教育专区。第 1 章程序设计和 C 语言 1 1.1 什么是计算机程序 1 1.2 什么是计算机语言 1 1...


C语言程序设计(谭浩强)第四版_课后答案

C语言程序设计(谭浩强)第四版_课后答案 - 第一章 程序设计和 C 语言 【第 15 页】 1-5 #include <stdio.h> int main ( ) { printf (***...


C语言程序设计课后答案_罗朝盛

C语言程序设计课后答案_罗朝盛_IT认证_资格考试/认证_教育专区。第 1 章 习题参考答案 1. (略) 2 判断题 1 √ 3 2 × 3 √ 4 × 5 √ 填空题 (1)...


C语言程序设计教程 课后习题参考答案

C语言程序设计教程 课后习题参考答案_IT认证_资格考试/认证_教育专区。《C 语言程序设计教程》 课后习题参考答案 习题 1 1. (1)编译、链接 .exe (2)函数 主...


《C语言程序设计》课后习题答案(第四版)谭浩强

C语言程序设计课后习题答案(第四版)谭浩强 - 第 1 章程序设计和 C 语言 1 1.1 什么是计算机程序 1 1.2 什么是计算机语言 1 1.3C 语言的发展及其...

网站首页 | 网站地图
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com