2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C语言程序设计(第2版)答案修正版 C语言程序设计(第2版)课后习题答案

C语言程序设计(第2版)答案修正版 C语言程序设计(第2版)课后习题答案

时间:2019-04-04 00:23:25

相关推荐

C语言程序设计(第2版)答案修正版 C语言程序设计(第2版)课后习题答案

C语言程序设计(第2版)答案修正版

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) max=b;

if(max<c) max=c;

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

}

第二章

1.假如我国国民生产总值的年增长率为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);

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=23.14r;

Sa=3.14rr;

Sb=4Sa;

Va=43.14rrr/3;

Vb=Sah;

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 c1,c2;与int c1, c2; 是否无条件地等价, 解:

#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); printf(“c1=%c c2=%c\n”,c1,c2); }

第四章 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. 有3个整数a、b、c,由键盘输入,输出其中最大的数,请编程序。

解:

#include<stdio.h>

void main()

{

int a,b,c,temp,max; printf(“请输入3个整数: ”);

scanf(“%d,%d,%d”,&a,&b,&c); 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(“请输入学生成绩: ”);

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?;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) place=5;

else if(num>999) place=4;

else if(num>99) place=3;

else if(num>9) place=2;

else place=1;

printf(“place =%d\n”, place);

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,hundred,ten,indiv);

printf(“\n反序数字为: ”);

printf(“%d%d%d%d\n”,indiv,ten,hundred,thousand);

break;

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

printf(“\n反序数字为: ”);

printf(“%d%d%d\n”,indiv,ten,hundred);

break;

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

printf(“\n反序数字为: ”);

printf(“%d%d\n”,indiv,ten);

break;

case 1: printf(“%d”,indiv);

printf(“\n反序数字为: ”);

printf(“%d\n”,indiv);

break;

}

}

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=1000000.1; /利润为10万元时的奖金/ bon2=bon1+1000000.075; /利润为20万元时的奖金/ bon4=bon2+2000000.05; /利润为40万元时的奖金/ bon6=bon4+2000000.03; /利润为60万元时的奖金/ bon10=bon6+4000000.015; /利润为100万元时的奖金/ printf(“请输入利润i: ”);

scanf(“%ld”,&i);

if(i<=100000) bonus=i0.1; /利润在10万元以内按0.1提成奖金/ else if(i<=200000)

bonus=bon1+(i-100000)0.075; /利润在10万至20万元时的奖金/ else if(i<=400000)

bonus=bon2+(i-200000)0.05; /利润在20万至40万元时的奖金/ else if(i<=600000)

bonus=bon4+(i-400000)0.03; /利润在40万至60万元时的奖金/ else if(i<=1000000)

bonus=bon6+(i-600000)0.015; /利润在60万至100万元时的奖金/ else

bonus=bon10+(i-1000000)0.01; /利润在100万元以上时的奖金/ printf(“奖金是%10.2f\n”,bonus);

}

(2) 用switch语句编程序。

#include <stdio.h>

void main()

{

long i;

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

int c;

bon1=1000000.1;

bon2=bon1+1000000.075; bon4=bon2+2000000.05; bon6=bon4+2000000.03; bon10=bon6+4000000.015; printf(“请输入利润i: ”);

scanf(“%ld”,&i);

c=i/100000;

if(c>10) c=10;

switch©

{

case 0: bonus=10.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) {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, %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) h=0; /判断该点是否在塔外/ printf(“该点高度为%d\n”,h);

}

2axbxc,,,011. 求方程的解。

根据代数知识,应该有以下几种可能:

(1)a=0, 不是二次方程,而是一次方程。

2(2),有两个相等的实根。 bac,40

2(3),有两个不等的实根。 bac,40

2(4),有两个共轭复根。 bac,40

编写程序,运行时,分别给出不同的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=bb-4ac;

if(fabs(disc)<=1e-6) printf(“has tow eual roots:%8.4f\n”,-b/(2a));

else if(fabs(disc)>1e-6)

{ x1=(-b+sqrt(disc))/(2a);

x2=(-b-sqrt(disc))/(2a);

printf(“has distinct real roots:%8.4f and %8.4f\n”,x1,x2);

}

else

{

realpart=-b/(2a);

imagpart=sqrt(-disc)/(2a);

printf(“has complex roots:\n”);

printf(“%8.4f+%8.4fi\n”,realpart,imagpart);

printf(“%8.4f-%8.4fi\n”,realpart,imagpart);

}

}

}

第五章

求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%i0) break;

if(i>=k+1)

{

printf(“%d”,m); n=n+1;

}

if(n%100) printf(“\n”);

}

printf(“\n”);

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

#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<=?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); }输出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该本

身。例如:153是一个水仙花数,因为153=13+53+3^3。

解:

#include<stdio.h>

#include<math.h> void main()

{

int i,j,k,n;

printf(““水仙花”数是:”);

for(n=100;n<1000;n++) {

i=n/100;

j=n/10-i10;

k=n%10;

if(n==iii+jjj+kk*k) printf(“%4d”,n); }

printf(“\n”);

}猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半

零一个。到第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);

}一球从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) continue; s=2*h+s;

}

printf(“h=%f,s=%f\n”,h,s); }打印以下图案

解:

#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<=2i;k++)

printf(“”);

printf(“\n”);

}

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

{

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

printf(“ ”);

for(k=0;k<=4-2i;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(xa[mid])

{

printf(“Find the number,it is a[%d]”,mid);

break;

}

else if(x>a[mid]) end=mid-1;

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

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 a->z

B->Y b->y

C->X 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) str2[i]=155-str1[i];

else if(str1[i]>=97&&str1[i]<=122) str2[i]=219-str1[i];

else str2[i]=str1[i]; printf(“%s\n%s\n”,str1,str2);

}

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];

str3[j+i]=0

printf(“%s\n%s\n%s\n”,str1,str2,str3); }

第七章

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,

并输出结果两个整数由键盘输入。

解:

#include<stdio.h>

int maxyueshu(int m,int n) {

int i=1,t;

for(;i<=m&&i<=n;i++) { if(m%i0&&n%i0) t=i; } return(t);

}

int minbeishu(int m,int n) {

int j;

if(m>=n) j=m;

else j=n;

for(;!(j%m0&&j%n0);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); }写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。

解:

#include<stdio.h>

int psushu(int m) {

int i,t=1;

for(i=2;i<m/2&&t1;i++)

if(m%i0) 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”); }写一个函数,使给定的一个二维数组(,×,)转置,即行列互换。

解:

#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”);

}

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

解:

#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];

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

解:

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

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

解:

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

}写一函数,输入一个四位数字,要求输出这四个数字字符,但每个数字间空一个空格。

如输入,应输出“2_0_0_8”。

解:

#include<stdio.h>

void insert(char str[]) {

int i;

for(i=strlen(str);i>0;i–) {

str[2i]=str[i];

str[2i-1]=? ?;

}

printf(“\noutput:\n%s”,str);

}

void main()

{

char str[80];

printf(“\ninput four digits:”);

scanf(“%s”,str);

insert(str);

}编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的

个数,在主函数中输入字符串以及输出上述结果。 解:

#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”);

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

#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个字符按由小到大的顺序排列。 解:

#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”);

}输入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;}

}写几个函数:

?输入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]]); }输入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;

}用递归法将一个整数n转换成字符串。例如,输入整数,应输出字符串“”。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©;

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

#include <stdio.h>

int find(int x,int y,int z) {

int i,t,s,days=0;

if(x%40) t=1;

else t=0;

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

{

if(i2) 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); }

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

解:

#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) {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,%d\n”,*p1,*p2,*p3); }输入三个字符串,按由小到大的顺序输出。

解:

#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§;

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§;

}输入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);

}有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”);

}有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)) 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 %d\n”,a[i]); }写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。

解:

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)); }有一字符串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 *p1,char *p2)

{

strncpy(p1+11,p2+4,13); *(p1+23)=?.?;

*(p1+24)=\0;

}输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。

解:

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

}在主函数中输入10个等长的字符串。用另一函数对它们排序,然后在主函数输出这10

个已排好序的字符串。

解:

#include <stdio.h> #include<string.h> void main ()

{

int i;charp[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§;

printf(“now,the sequence is:\n”);

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

printf(“%s\n”,p[i]);

}

sort(charp[])

{

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

}将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;}

}编一个函数inv,将数组a中n个整数按相反顺序存放,用指针变量作为调用该函数时

的实参。

解:

#include <stdio.h> void inv(inta,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”);

}输入一个字符串,内有数字和非数字字符,例如: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?)) j++; else

{

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;

}

}

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

}写一函数,将一个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§;

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(intpointer) {

int i,j,t;

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

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

{t=(pointer+3i+j);(pointer+3i+j)=(pointer+3j+i);(pointer+3j+i)=t;}

}

}

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

struct

{int year;

int month;

int day;

}date;

void 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%40&&date.year%100!=0||date.year%4000)&&date.month>=3) days+=1;

printf(“\n%d/%d is the %dth day in%d.”,date.month,date.day,days,date,year); }写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日子数传回主函数输出。

解:

struct y_m_d

{int year:

int month;

int day;

}date;

int days(struct y_m_d date1)

{

int sum;

switch(date1.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 }

if((date1.year%40&&date1.year%100!=0||date1.year%4000)&&date1.month>=3)

sum+=1;

return sum;

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

#define N 5

struct student

{char num[6];

char name[8];

int score[4];

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

}在上题的基础上,编写一个函数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”);

}

}有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. name score1 score2 score3 average\n”); 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);

}13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最

后留在圈子中的人原来的序号。

解:

#define N 13

struct person

{int number;

int nextop;

}link[N+1];

void 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;i<=N;i++)

if(link[i].number) printf(“%3d”,lin[i].number); }建立由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); }

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

解:

#include <stdio.h>

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

}有两个磁盘文件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 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);

}有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[1],

stu[i].score[2] ,stu[i].ave);

}

}将上题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);

}将上题以排序的学生成绩文件进行插入处理。插入一个学生的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);

}上题结果仍存入原有的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);

}有一磁盘文件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()

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

}从上题的“职工工资文件”中删去一个职工的数据,再存回原文件。 解:

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

}从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中,再从该

文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。

解:

#include<stdio.h> main()

{int I,flag;

char str[80],c;

FILE *fp;

Fp=fopen(“text”,”w”);

Flag=1;

While(flag1)

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

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。