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%,计算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=4
3.14rrr/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 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/(2
a));
else if(fabs(disc)>1e-6)
{ x1=(-b+sqrt(disc))/(2a);
x2=(-b-sqrt(disc))/(2
a);
printf(“has distinct real roots:%8.4f and %8.4f\n”,x1,x2);
}
else
{
realpart=-b/(2a);
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%i0) break;
    if(i>=k+1)
    {
    printf(“%d”,m); n=n+1;
    }
    if(n%100) printf(“\n”);
    }
    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<=?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=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==i
    ii+jjj+kk*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) continue; s=2*h+s;
    }
    printf(“h=%f,s=%f\n”,h,s); }
  6. 打印以下图案





解:
#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); }
第七章

  1. 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,
    并输出结果两个整数由键盘输入。
    解:
    #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); }
  2. 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。
    解:
    #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”); }
  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[2i]=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©;
    }
  15. 给出年、月、日,计算该日是该年的第几天。 解:
    #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); }
    第八章
  16. 输入三个整数,按由小到大的顺序输出。
    解:
    #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); }
  17. 输入三个字符串,按由小到大的顺序输出。
    解:
    #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§;
    }
  18. 输入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);
    }
  19. 有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”);
    }
  20. 有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]); }
  21. 写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。
    解:
    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)); }
  22. 有一字符串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;
    }
  23. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。
    解:
    #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);
    }
  24. 在主函数中输入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§;
    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;}
    }
  25. 将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;}
    }
  26. 编一个函数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”);
    }
  27. 输入一个字符串,内有数字和非数字字符,例如: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”);
    }
  28. 写一函数,将一个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(int pointer) {
    int i,j,t;
    for(i=0;i<3;i++)
    for(j=i;j<3;j++)
    {t=
    (pointer+3
    i+j); (pointer+3i+j)= (pointer+3j+i); (pointer+3j+i)=t;}
    }
    }
    第九章
  29. 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 解:
    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); }
  30. 写一个函数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;
    }
  31. 编写一个函数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”);
    }
  32. 在上题的基础上,编写一个函数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”);
    }
    }
  33. 有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);
    }
  34. 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); }
  35. 建立由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); }
    第十章
  36. 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件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);
    }
  37. 有两个磁盘文件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);
    }
  38. 有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);
    }
    }
  39. 将上题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);
    }
  40. 将上题以排序的学生成绩文件进行插入处理。插入一个学生的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);
    }
  41. 上题结果仍存入原有的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);
    }
  42. 有一磁盘文件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 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);
    }
  43. 从上题的“职工工资文件”中删去一个职工的数据,再存回原文件。 解:
    #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);
    }
  44. 从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中,再从该
    文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。
    解:
    #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);
    }

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

  1. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

    浙大版<C语言程序设计>第四版(何钦铭颜晖) 第9章 结构 课后习题答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可 ...

  2. 计算机组成原理实用教程课后答案,王万生《计算机组成原理实用教程》课后习题答案..doc...

    王万生<计算机组成原理实用教程>课后习题答案. 习题1参考答案 一.选择题 1.微型计算机的分类通常是以微处理器的 D 来划分. A.芯片名B.寄存器数目 C.字长 D.规格 2. 将有关 ...

  3. python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...

    推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 一些知识点总结和几个例题 选择题:1~5 填空题:1~8 ...

  4. 《Python语言程序设计》王恺 王志 机械工业出版社 第一章 初识Python 课后习题答案

    1.6 课后习题 (1)高级语言翻译为机器语言的方式有两种:一种是编译,一种是解释.Python属于解释型语言 (2)Python程序支持两种运行方式:交互式和脚本式 (3)Python的单行注释以 ...

  5. 数据库笔记整理--基于《数据库系统概论》第五版王珊一书|第二章--关系数据库知识整理和课后习题答案

    该系列的博客都是基于<数据库系统概论>第五版王珊一书 前提: 因为最近要升学的原因,再加上重温数据库部分内容,所以整理一份比较详细且重点的笔记.适合有考研升学需求的人收藏 -------- ...

  6. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第12章 文件 课后习题答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 一.选择题 1.以下语句的输出结果是( ). printf(" ...

  7. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第8章 指针 课后习题答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 一.选择题 1.下列语句定义 px 为指向 int 类型变量的指针,正确 ...

  8. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第7章 数组 课后习题答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 一.选择题 1.假定 int 类型变量占用两个字节,则以下定义的数组 a ...

  9. C#程序设计第三版(李春葆)第12章文件操作课后习题答案

    编程题 (上机实验题在最后!) ----------------------------------------------分割线----------------------------------- ...

最新文章

  1. Keil 二进制数输入宏
  2. leetcode算法题--最长回文子序列★★
  3. 安卓 java编译_Android源码分析(七)-----如何解决java编译版本问题
  4. web.xml文件中可以配置哪些内容?
  5. 充分条件反过来是必要条件吗_“充分必要条件”引发的现实思考
  6. luoguP4242树上的毒瘤
  7. 头条限流是什么原因_抖音为什么会被限流?被限流了如何补救?
  8. vue 指令 v-model
  9. 织梦php版本图片不能上传,织梦Dedecms会员中心无法上传图片的解决方法
  10. 逆向链表c语言,C语言逆向打印双向链表程序
  11. CTO 要我把这份 MySQL 规范贴在工位上!
  12. 天锐绿盾移动终端支持 Android、IOS 移动客户端
  13. win10 linux重置密码,Win10重置Linux子系统用户密码教程
  14. Pandas 筛选数据的 8 个神操作
  15. du_Welch_cov_burg 功率谱估计 matlab
  16. 少儿编程学习(循环及条件语句)
  17. RK920C键盘出现输入del键,会输出q信息,输入Ins键会输出1信息
  18. windows内核开发学习笔记十八:IRP 处理的标准模式
  19. 中国有多少个省,多少个直辖市,多少个特别行政区,多少个自治区
  20. powerdesigner中cmd模型中多对多_拼多多,在喧嚣中本分前行

热门文章

  1. 强化商标专用权保护 国家知识产权局出台《商标侵权判断标准》
  2. 反射框架Reflections
  3. 生成器 推导式 练习
  4. Windows11初体验——感觉图标变圆润、界面更清爽了
  5. 宅米网性能优化实践——初创互联网公司的野蛮成长
  6. 林志玲9宫格的报名照代码生成(firemonkey)
  7. AES,DES,3DES加密方式的特点
  8. 如何在Spring官网下载各种jar包?
  9. 解决windows输入法出不来两招
  10. 《城市轨道交通系统运营管理》在线作业