文档库 最新最全的文档下载
当前位置:文档库 › C语言程序设计(第2版)答案修正版

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

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

本文由计算机技术价值贡献

doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。

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

第一章 1.请参照本章例题,编写一个 C 程序,输出以下信息: ************************** Very good! ************************** 解: #include void main() { printf(“**************************”); printf(“\n”); printf(“Very good!\n”); printf(“\n”); printf(“**************************”); } 2.编写一个 C 程序,输入 a、b、c 三个值,输出其中最大值。 解: #include void main() { int a,b,c,max; printf(“请输入三个数 a,b,c:\n”); scanf(“%d,%d,%d”,&a,&b,&c); max=a; if(max #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 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 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 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 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 void main() { char c1,c2; c1=getchar(); c2=getchar(); putchar(c1);putchar(‘\n’);putchar(c2);putchar(‘\n’); } #include 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 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 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: g

rade=’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 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 元(1000001000000)时,超过 1000000 元的部分按 1%提成。从键盘输入当年利润 I,求应发放奖金总数。要求: (1)用 if 语句编程序;(2)用 switch 语句编程序。 解: (1) 用 if 语句编程序。 #include void main() { long i; float bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; /*利润为 10 万元时的奖金*/ bon2=bon1+100000*0.075; /*利润为 20 万元时的奖金*/ bon4=bon2+200000*0.05; /*利润为 40 万元时的奖金*/ bon6=bon4+200000*0.03; /*利润为 60 万元时的奖金*/ bon10=bon6+400000*0.015; /*利润为 100 万元时的奖金*/ printf(“请输入利润 i: ”); scanf(“%ld”,&i); if(i<=100000) bonus=i*0.1; /*利润在 10 万元以内按 0.1 提成奖金*/ else if(i<=200000) bonus=bon1+(i-100000)*0.075; /*利润在 10 万至 20 万元时的奖金*/ else if(i<=400000) bonus=bon2+(i-200000)*0.05; /*利润在 20 万至 40 万元时的奖金*/ else if(i<=600000) bonus=bon4+(i-400000)*0.03; /*利润在 40 万至 60 万元时的奖金*/ else if(i<=1000000) bonus=bon6+(i-600000)*0.015; /*利润在 60 万至 100 万元时的奖金*/ else bonus=bon10+(i-1000000)*0.01; /*利润在 100 万元以上时的奖金*/ printf(“奖金是%10.2f\n”,bonus); } (2) 用 switch 语句编程序。 #include void main()

{ long i; float bonus, bon1, bon2, bon4, bon6, bon10; int c; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(“请输入利润 i: ”); scanf(“%ld”,&i); c=i/100000; if(c>10) c=10; switch(c) { case 0: bonus=1*0.1;break; case 1: bonus=bon1+(i-100000)*0.075;break; case 2 : case 3: bonus=bon2+(i-200000)*0.05; break; case 4: case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8: case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; } printf(“奖金是%10.2f”,bonus); } 9. 输入 4 个整数,要求按由小到大的顺序输出。 解: #include 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 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); }

2 11. 求 a x + b x + c = 0 方程的解。

根据代数知识,应该有以下几种可能: (1)a=0, 不是二次方程,而是一次方程。 (2) b ? 4ac = 0 ,有两个相等的实根。

(3) b ? 4ac > 0 ,有两个不等的实根。

(4) b ? 4ac < 0 ,有两个共轭复根。

编写程序,运行时,分别给出不同的 a, b, c 值,相应于上面 4 种情况,分析输出结果。 解: #include #include <math.h> #include 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 #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) break; if(i>=k+1) { printf(“%d”,m); n=n+1; } if(n%10==0) printf(“\n”); } printf(“\n”); } 2. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 解: #include 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=1^3+5^3+3^3。 解: #include #include<math.h> void main() { int i,j,k,n; printf(““水仙花”数是:”); for(n=100;n<1000;n++) { 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 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 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 #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 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 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 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 #include #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 #include 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 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 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]) end=mid-1; else start=mid+1; }while(start<end); }

7. 输出以下图案: ***** ***** ***** ***** ***** 解: #include 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 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 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 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 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 int maxyueshu(int m,int n) { int i=1,t; for(;i<=m&&i<=n;i++) { if(m%i==0&&n%i==0) t=i; } return(t); } int minbeishu(int m,int n) { int j; if(m>=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

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 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 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 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 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 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 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 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 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 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 #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 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 #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 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 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); } 2. 输入三个字符串,按由小到大的顺序输出。 解: #define N 3 #define M 20 #include 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) {strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);} m=strcmp(q,q+2); if(m>0) {strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);} n=strcmp(q+1,q+2);

if(n>0) {strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);} for(p=q;p<q+N;p++) puts(p); } 3. 输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三 个函数;①输入 10 个数;②进行处理;③输出 10 个数。 解: #include 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*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 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 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]); } 6. 写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。 解: int strlen(char *s) { int n=0; while(*s) {n++;s++;} return n; } #inc

lude 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 #include 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; } 8. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。 解: #include 

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 #include 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 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 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 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”); } 13. 写一函数,将一个 3*3 的整型二维数组转置,即行列互换。 解: #include 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 year,month,day:”); scanf(“%d,%d,%d”,&date.year,&date.month,&date.day); switch(date.month) { case 1: days=date.day; break; case 2: days=date.day+31; break; case 3: days=date.day+59; break; case 4: days=date.day+90; break; case 5: days=date.day+120; break; case 6: days=date.day+31; break; case 7: days=date.day+181; break; case 8: days=date.day+212; break; case 9: days=date.day+243; break; case 10: days=date.day+273; break; case 11: days=date.day+304; break; case 12: days=date.day+334; break; } if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3) days+=1; printf(“\n%d/%d is the %dth day in%d.”,date.month,date.day,days,date,year); } 2. 写一个函数 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%4==0&&date1.year%100!=0||date1.year%400==0)&&date1.month>=3) sum+=1; return sum; } 3. 编写一个函数 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”); } 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. name score1 sc

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

} 6. 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); } 7. 建立由 3 个学生数据结点构成的单向动态链表,向每个结点输入学生的数据(每个学生 的数据包括学号、姓名、成绩) ,然后逐个输出各结点的数据。 #include #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 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 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); } 6. 有 5 个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号、姓名、3 门课成绩) ,计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件 stud 中。 解: #include 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);

} } 7. 将上题 stud 文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个 新文件 stu-sort 中。 解: #include #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 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); } 9. 上题结果仍存入原有的 stu_sort 文件,而不另建立新文件。 解: #include 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); } 10. 有一磁盘文件 emploee,文件内存放职工的数据,每个职工的数据包括职工姓名、职工 号、性别、年龄、住址、工资、健康状况、文化程度。今要求将职工名、工资的信息单独抽 出来另建一个简明的职工工资文件。 解: #include 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 #incude 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 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); }

1本文由计算机技术价值贡献

doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。

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

第一章 1.请参照本章例题,编写一个 C 程序,输出以下信息: ************************** Very good! ************************** 解: #include void main() { printf(“**************************”); printf(“\n”); printf(“Very good!\n”); printf(“\n”); printf(“**************************”); } 2.编写一个 C 程序,输入 a、b、c 三个值,输出其中最大值。 解: #include void main() { int a,b,c,max; printf(“请输入三个数 a,b,c:\n”); scanf(“%d,%d,%d”,&a,&b,&c); max=a; if(max #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 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 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 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 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 void main() { char c1,c2; c1=getchar(); c2=getchar(); putchar(c1);putchar(‘\n’);putchar(c2);putchar(‘\n’); } #include 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 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 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 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 元(1000001000000)时,超过 1000000 元的部分按 1%提成。从键盘输入当年利润 I,求应发放奖金总数。要求: (1)用 if 语句编程序;(2)用 switch 语句编程序。 解: (1) 用 if 语句编程序。 #include void main() { long i; float bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; /*利润为 10 万元时的奖金*/ bon2=bon1+100000*0.075; /*利润为 20 万元时的奖金*/ bon4=bon2+200000*0.05; /*利润为 40 万元时的奖金*/ bon6=bon4+200000*0.03; /*利润为 60 万元时的奖金*/ bon10=bon6+400000*0.015; /*利润为 100 万元时的奖金*/ printf(“请输入利润 i: ”); scanf(“%ld”,&i); if(i<=100000) bonus=i*0.1; /*利润在 10 万元以内按 0.1 提成奖金*/ else if(i<=200000) bonus=bon1+(i-100000)*0.075; /*利润在 10 万至 20 万元时的奖金*/ else if(i<=400000) bonus=bon2+(i-200000)*0.05; /*利润在 20 万至 40 万元时的奖金*/ else if(i<=600000) bonus=bon4+(i-400000)*0.03; /*利润在 40 万至 60 万元时的奖金*/ else if(i<=1000000) bonus=bon6+(i-600000)*0.015; /*利润在 60 万至 100 万元时的奖金*/ else bonus=bon10+(i-1000000)*0.01; /*利润在 100 万元以上时的奖金*/ printf(“奖金是%10.2f\n”,bonus); } (2) 用 switch 语句编程序。 #include void main()

{ long i; float bonus, bon1, bon2, bon4, bon6, bon10; int c; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(“请输入利润 i: ”); scanf(“%ld”,&i); c=i/100000; if(c>10) c=10; switch(c) { case 0: bonus=1*0.1;break; case 1: bonus=bon1+(i-100000)*0.075;break; case 2 : case 3: bonus=bon2+(i-200000)*0.05; break; case 4: case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8: case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; } printf(“奖金是%10.2f”,bonus); } 9. 输入 4 个整数,要求按由小到大的顺序输出。 解: #include 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 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); }

2 11. 求 a x + b x + c = 0 方程的解。

根据代数知识,应该有以下几种可能: (1)a=0, 不是二次方程,而是一次方程。 (2) b ? 4ac = 0 ,有两个相等的实根。

(3) b ? 4ac > 0 ,有两个不等的实根。

(4) b ? 4ac < 0 ,有两个共轭复根。

编写程序,运行时,分别给出不同的 a, b, c 值,相应于上面 4 种情况,分析输出结果。 解: #include #include <math.h> #include 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 #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) break; if(i>=k+1) { printf(“%d”,m); n=n+1; } if(n%10==0) printf(“\n”); } printf(“\n”); } 2. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 解: #include 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=1^3+5^3+3^3。 解: #include #include<math.h> void main() { int i,j,k,n; printf(““水仙花”数是:”); for(n=100;n<1000;n++) { 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 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 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 #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 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 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 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 #include #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 #include 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 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 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]) end=mid-1; else start=mid+1; }while(start<end); }

7. 输出以下图案: ***** ***** ***** ***** ***** 解: #include 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 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 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 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 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 int maxyueshu(int m,int n) { int i=1,t; for(;i<=m&&i<=n;i++) { if(m%i==0&&n%i==0) t=i; } return(t); } int minbeishu(int m,int n) { int j; if(m>=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

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 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 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 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 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 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 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 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 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 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 #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 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 #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 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 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); } 2. 输入三个字符串,

按由小到大的顺序输出。 解: #define N 3 #define M 20 #include 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) {strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);} m=strcmp(q,q+2); if(m>0) {strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);} n=strcmp(q+1,q+2);

if(n>0) {strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);} for(p=q;p<q+N;p++) puts(p); } 3. 输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三 个函数;①输入 10 个数;②进行处理;③输出 10 个数。 解: #include 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*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 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 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]); } 6. 写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。 解: int strlen(char *s) { int n=0; while(*s) {n++;s++;} return n; } #include 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 #include 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; } 8. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。 解: #include 

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 #include 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 te

mp; 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 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 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 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”); } 13. 写一函数,将一个 3*3 的整型二维数组转置,即行列互换。 解: #include 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 year,month,day:”); scanf(“%d,%d,%d”,&date.year,&date.month,&date.day); switch(date.month) { case 1: days=date.day; break; case 2: days=date.day+31; break; case 3: days=date.day+59; break; case 4: days=date.day+90; break; case 5: days=date.day+120; break; case 6: days=date.day+31; break; case 7: days=date.day+181; break; case 8: days=date.day+212; break; case 9: days=date.day+243; break; case 10: days=date.day+273; break; case 11: days=date.day+304; break; case 12: days=date.day+334; break; } if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3) days+=1; printf(“\n%d/%d is the %dth day in%d.”,date.month,date.day,days,date,year); } 2. 写一个函数 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; brea

C语言程序设计第三版习题库答案

C 语言程序设计(第三版)习题库 1、设圆半径r=,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf 输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 #include<> main(){ floatr,h,C1,Sa,Sb,Va,Vb; scanf(__”%f ”__,&r); scanf(”%d ”,__&h _);; C1=2**r; Sa=*r*r; Sb=4*Sa; Va=4**r*r*r/3; Vb=Sa*h; printf(___”Cl=%.2fSa=%.2fSb=%.2fVa=%.2fVb=%.2f ”,Cl,Sa,Sb,Va,Vb ); } 2、输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9 输出要求有文字说明,取位2小数。 #include<> main(){ floatF,c; scanf("%f",&F); ____c=5*(F-32)/9______; printf("c=%.2f",c); } 3、有一函数:?? ???≥-<≤-<=10113101121x x x x x x y 写一程序,输入x 值,输出y 值。 #include<> main(){ intx,y; printf("输入x :"); scanf("%d",&x); if(x<1){/*x<1*/ y=x; printf("x=%3d,y=x=%d\n",x,y);

}elseif(____x<10_______){/*1≤x-10*/ _____y=2*x-1_______; printf("x=%3d,y=2*x-1=%d\n",x,y); }else{/*x≥10*/ y=3*x-11; printf("x=%3d,y=3*x-11=%d\n",x#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d",y); }#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d\n",y); }#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d",y); }scanf("%d",&x);

c语言程序设计教程第二版课后习题答案

c 语言程序设计教程第二版课后习题 答 案 篇一: c 语言程序设计教程_李含光_ 郑关胜_ 清华大学 出版社习题答案习题答案[完美打印版]】1.单项选择题 (1)a (2)c(3)d (4)c (5)b 2.填空题(1)函数 (2)主函数(main )(3)printf(),scanf()第 2 章习题参考答案 1.单项选择题 1-5 cbccc 6-10 cdcdc 11-13 dbb 2 .填空题 (1)1(2)26 (3)6 , 4 , 2 (4)10 , 6 (5)3.000000 (6)双精度(double )(7)9 (8)字母,数字,下划线(9)13.700000 (10)11(11)((m/10 )%10 )*100+ (m/100 )*10+m%10 (12)0 (13)10 ,9 ,11(15) (x0y0)||(x0z0)||(y0||z0)(16 )double (17)x==0 (18)sqrt(fabs(a-b))/(3*(a+b))(19 )sqrt((x*x+y*y)/ (a+b)) 第 3 章习题参考答案 1.单项选择题 1-5 cccdd 6-10 bcdbc11-15 bcbbb16 a 2 .填空题 (1)用;表示结束(2){ } (3 )y=x0?1:x==0?0:-1 (4)y%4==0y%100!=0||y%400==0 (5)上面未配对(6)default 标号(7)while ,do while ,for (8)do while (9)本次(10)本层3.阅读程序,指出结果 (1)yes (2)*(3)abother (4)28 70 (5)2,0(6)8(7)36 (8)1(9)3,1,-1,3,1,-1(10)a=12 ,y=12 (11) i=6 ,k=4 (12)1,-2 4 .程序填空 (1)x:y ,u :z (2)m=n ,m !=0 ,m=m/10 (3)teps , t*n/(2*n+1) , printf( n”“,%2*lsf )(4)m%5==0 ,

C语言程序设计(第二版)课后答案 丁亚涛

习题二 一、选择题 二、填空题 1.18 2.int float double 3.10 11 4.8 16 10 5.% 三、阅读题 1. 10,10,9,10 2. j=1, i=2 k=3,i=3 i=3,i=2 k=1,i=1 习题三 一、选择题 二、填空题 1. 从键盘上读入一个字符在屏幕上输出一个字符 #include 2. 按十进制整数形式输出,有符号 按16进制整数形式输出,没有符号 按十进制小数形式输出,输出的数据长度为7位,有2位小数 按字符形式输出一个字符 3. 按十进制整数形式输入数据 按十进制整数形式输入三位数据 跳过3位十进制数据 按字符形式输入一个字符 4. 分程序;; 5. 大写字母L 6. -1 三、阅读题 1. 6 6 6.00 6.00

2. x=127,x= 127,x=177,x=7f y=123.4567,y= 123.46,y=123,45670 3. 2,1 4. 1234 5. 4,3 6. -6,-6 习题四一、选择题 二、填空题 1. 非0 0 、 2. k==0 3. n%7==0&&n%==0 else 三、阅读题 1. a=1,b=0 2. c=1 习题五一、选择题 二、填空题 1. for语句 do-while 语句 while 语句 2. a=14,y=26 3. k=14,n=-1 4. 39 5. s=19 6. 22222 7. 10 8. 7 9. 8 10. 5,5 三、改错题

1. for( i=0;i<5;i++);for控制部分用分号分隔 2. int j=0;while(j<10){j++;i=j} 分号是多余的,否则会造成死循环 3. int s=1,i=1; while(i<5) {s*=i; i++; } 两条语句需要加上花括号 4. while(j<10);(分号不能少) 5. continue改为break 习题六 一、选择题 二、填空题 1. 20 0 19 2. 数组名 3. 越界 4. 6 5. j==k a[j][k]=1; a[j][k]=0; 三、阅读题 1. 6 5 4 3 2 1 2. aaa bbb ccc ddd 3. 2,2,1 习题七 一、选择题 二、填空题 1. 整个函数体内局部 2. 整型 3. k<=b return y;

完整word版单片机C语言应用程序设计第五版马忠梅课后习题答案

第一章单片机由哪几部分组成?、80511可P2P0和个8位并行I/O口(其中8位中央处理器CPU、片内振荡电器及其时钟电路,4,个中断优先级)个中断源(具有2位定时器/计数器,5 用于外部存储器的扩展),2个16 全双工串行口,布尔处理器。单片机有多少个特殊功能寄存器?它们可以分为几组,各完成什么主要功能?、80512 表P7 1-3个特殊功能寄存器,在物理 上是分散在片内各功能部件中,在数218051单片机内部有答:中,以便能使用统一的直接寻址方式80H~FFH学上把它们组织在内部数据存储器地址空间来访问。这些特殊功能寄存器颁 在以下各个功能部件中:主要完;DPH两个8位寄存器组成)PSW、SP、DPTR(由DPL和(1)CPU:ACC、B、成运算和逻辑判断功能;完成中断管理IP、IE;(2)中断系统:完成 定时或者计数功能、TH1;TCOM、TL0、TH0、TL1(3)定时器/计数器:TMOD、口带有可选的纵向拓展I/O完成I/O口功能,其中部分P1P0、、P2、P3(4)并行I/O口:功能。主要完成数据的串行发送和接收SBUF、PCON5)串行口:SCON、(、决定程序执行顺序的寄存器是哪几个?它是几位寄存器?是否为特殊功能寄存器?它的3 内容是什么信息?它的内容是下一条 将要执行的不是特殊功能寄存器,它是16位寄存器,是程序计数器PC,程序的地址的用途是什么?它由哪几个特殊功能寄存器组DPTRDPTR是什么特殊功能寄存器?4、成?位)和8DPL (数据指针低是16位数据指针寄存器,它由两个8位特殊功能寄存器DPTR位地址,作地址寄存器用,可寻址外部16DPTR用于保存DPH(数据指针高8位)组成,数据存储器,也可寻址程序存储器。线?它们和单片机对外的地址总线和数据总线有什么关系?地址的引脚有多少I/O5、8051 总线和数据总线各是多少位?线可以在外扩存储器时分时复根I/OP0口8I/O8051单片机的40个引脚中有32根口线,和P3.6位地址总线,P2口作为高8用作为外部存储器的低8位地址 总线和8位数据总线,位。16位,数据总线为8P3.7分别作为外部存储器的写和读控制线。地址总线单片机堆栈的最大容量不能超过多少字8051、什么是堆栈?堆栈指针SP的作用是什么? 6 节?堆栈是数据寄存器的一部分,这一部分数据的存取是按照先入后出、后入先出的原则进行的。堆栈指针SP在启用堆栈之前是用来决定堆栈的位置。如在8051芯片复位后,SP的值为07H,则决定了堆栈从08H开始设置。修改SP值可以使堆栈设置在内部RAM的其它部分。在堆栈启 用之后,SP指向堆栈顶部,即由SP来决定数据读出和存入堆栈的地址。8051单片机内部用作 数据区的RAM的容量为128个字节,前8个字节要用来作为工作寄存器R0-R7。堆栈可以从08H开始设置直到7FH,共120个字节。但这只是最大可能的容量。一般情况下,内部RAM还要分出一部分作一般的数据区,或者还要用其中的位寻址区来用于位操作,等等。所以,8051 的堆栈区是比较小的,使用时要注意到这个限制。 8、8051内部RAM低128字节可分为几个区域?其中通用寄存器区的字节地址范围为多少?如何实现寄存器组的切换?可位寻址区的字节地址和位地址范围分别为多少? 8051内部RAM的低128字节可以分为通用寄存器区、位寻址区、便签(工作或者堆栈RAM)1 中的个字节。设置PSW区和特殊功能寄存器区。通用寄存器区的地址从00H到1FH共3212816个字节RS1可以切换当前通用寄存器组。位寻址区地址从20H到2FH共位RSO和127. 0到位,占用地址8051单片机对外有几条专用控制线?其功能是什么?9、,高电位有效,当有条专用控制线。它们是复位信号线RST一般的说法是8051单片机有4,低电平有效,当此复位信号从此线输入时,使单片机复位。访问外部存贮器控制信号EA先使用片单片机全部使用外部指令存贮器,而当此控制线为高电平时,控制线为低电平时,1000H(地址为,在4KB范围之外,才使用指令存贮器FFFFH内的4KB指令存贮器(0000H-)和外部地址锁存器允PSEN-FFFFH)。另有两条输出控制:外部程序存贮器的读选通信号。前者是低电平有效,在读外部程 序存贮器时使用。后者是高电平有效,在锁存ALE许信号P0口输出的低8位地址时使用。端必须怎样处理?为什么?10、8031的/EA为有效时,/EA访问内部ROM,当端是访问外部程序

c语言程序设计第二章课后参考答案

第二章:C程序的基本结构 一、单项选择题 1、以下不是C语言的特点的是________。 A)语言的表达能力强B)语言定义严格 C)数据结构系统化 D)控制流程结构化 2、TC编译系统提供了对C程序的编辑、编译、连接和运行环境,以下可以不在该环境下进行的环节是________。 A)编辑和编译 B)编译和连接 C)连接和运行D)编辑和运行 3、以下不是二进制代码文件是________。 A)标准库文件 B)目标文件C)源程序文件 D)可执行文件 4、下面个选项组中,均属于C语言关键字的一组是________。 A)auto,enum,include B)switch,typedef,continue C)signed,union,scanf D)if,struct,type 5、下面四组字符串中,都可以用作C语言标识符的是________。 A)print B)I \am C)signed D)if _maf scanf 3mf ty_pr mx_2d mx_ a.f x1# aMb6 AMB A&B 5XY 6、以下不属于流程控制语句的是_________。 A)表达式语句 B)选择语句 C)循环语句 D)转移语句 7、下面描述中,不正确的是________。 A)C语言的函数体由一系列语句和注释组成。 B)注释内容不能单独写在一行上。 C)C程序的函数说明部分包括对函数名、函数类型、形式参数等的定义和说明。 D)scanf和printf是标准库函数而不是输入和输出语句。 8、下面描述中,正确的是________。 A)主函数的花括号必须有,而子函数中的花括号是可有可无的。 B)一个C程序行只能写一个语句。 C)主函数是程序启动时的唯一入口。 D)函数体包含了函数说明部分。 二、填空题 1、一个完整的C程序至少要有一个________函数。(主函数) 2、标准库函数不是C语言本身的组成部分,它是由__________提供的功能函数。(编译系统) 3、C语言是以________为基本单位、整个程序由________组成。(函数函数) 4、常用的标准库函数有数学函数、字符函数和字符串函数、动态分配函数、随机函数和________函数等几个大类。(输入输出) 5、标准库函数存放在________文件中。(函数库) 6、目标程序文件的扩展名是________。(.obj) 7、程序连接过程是将目标程序、________或其它目标程序连接装配成可执行文件。(库函数) 8、因为源程序是________类型文件,所以用具有文本编辑功能的任何编辑软件程序完成编辑。(文本)

C语言程序设计试题集与答案解析

一.填空 1. 每个C程序都必须有且仅有一个________ 函数。 2. C语言程序开发到执行通常要经过6个阶段即编辑、预处理、________、链接、加载和执行。 3. 软件是程序,以及______、使用和维护所需要的所有文档。 4. 国标中规定:“计算机程序是按照具体要求产生的适合于计算机处理的_________”。 5. 程序设计语言按照书写形式,以及思维方式的不同一般分为低级语言和________两大类。 6. C语言是由________组成的。 7. C语言的函数可分为主函数main、标准库函数和_________。 8. 一个函数是由两部分组成的,即:________和函数体。 9. 编译是将C语言所编写的源程序________成机器代码,也称为建立目标代码程序的过程。 10. 程序是由某种程序设计语言编制出来,体现了编程者的控制思想和对计算机执行操作 的要求。不同的任务功能,就会需求不同的软件程序,如:控制计算机本身软硬件协调工作,并使其设备充分发挥效力,方便用户使用的系统软件程序,称为操作系统;而为办公自动化(OA)、管理信息系统(MIS)、人工智能、电子商务、网络互联等等应用而开发的软件程序,统称为_________。 11. 机器语言是以__________形式表示的机器基本指令的集合,是计算机系统唯一不需要翻译可以直接识别和执行的程序设计语言。 12. 与机器语言相比,使用汇编语言来编写程序可以用_______来表示指令的操作码和操作对 象,也可以用标号和符号来代替地址、常量和变量。

13. 在编译程序之前,凡以____开头的代码行都先由预处理程序预处理。 14. C程序的执行均是由执行_________开始。 15. 函数体即为包含在{}内的部分。它分为________和为完成功能任务由若干个C 语句 组成的执行部分。 16. C语言程序中一条简单语句是以________字符作为结束符的。 17. C语言是结构化、________的程序设计语言。 18. 由于计算机硬件不能直接识别高级语言中的语句,因此,必须经过“_______程序”,将用高级语言编写的程序翻译成计算机硬件所能识别的机器语言程序方可执行。 19. 用高级语言编写的程序需翻译成计算机硬件所能识别的机器语言程序方可执行。所以 说,用高级语言进行程序设计,其编程效率高,方便易用,但_______没有低级语言高。 20.

第5章-C语言程序设计(第2版)教材习题答案

【教材】《C语言程序设计(第2版)》清华大学出版社,黄保和,江弋编著。2011年10月第二版。ISBN:978-7-302-26972-4。售价:35元。 【答案版本】本习题答案为2012年2月修订版本。 一、选择题 1. 设有程序段”int k=10; while(k=0) k=k-1;”,则下面叙述正确的是D)循环体语句一次也不执行。 A. while循环执行10次 B. 循环是无限循环 C. 循环体语句执行一次 D. 循环体语句一次也不执行 2. 设有程序段”int x=0,s=0;while(!x!=0) s+=++x; printf(“%d”,s);”则A)运行程序段后输出1。 A. 运行程序段后输出1 B. 程序段执行无限次 C. 运行程序段后输出0 D. 程序段中的控制表达式是非法的 3. 下面循环语句中,错误的是D) int a=1,b=2;do b-- while(b= =0);。 A. int a=1,b=2; while(b--); B. int a=1,b=2; do a++; while(a==b); C. int a=1,b=2; while(a=3); D. int a=1,b=2; do b-- while(b==0); 4. 已知”int i=5;”,下列do…while循环语句的循环次数为C) 5。 do{ printf(“%d\n”,i--); } while(i!=0); A. 0 B. 1 C. 5 D. 无限 5. 循环语句”for(int i=0,j=10; i==j; i++,j--)”的循环次数是A) 0。 A. 0 B. 5 C. 10 D. 无限 6. 下述有关break语句的描述中,不正确的是C) break语句用于if语句的内嵌语句内,它结束该if语句。 A. break语句用于循环体内,它将结束该循环 B. break语句用于开关语句,它结束该开关语句 C. break语句用于if语句的内嵌语句内,它结束该if语句 D. break语句在一个循环体内可使用多次 7. 下面关于循环语句的描述中,错误的是B)循环体内必须同时出现break语句和continue 语句。 A. 循环体内可以包含有循环语句 B. 循环体内必须同时出现break语句和continue语句 C. 循环体内可以出现选择语句 D. 循环体可以是空语句 8. 以下不是死循环的是D)for(;(c=getchar()!=’\n’);)printf(“%c”,c);。 A. for(; ; x+=i); B. while(1) { x++; } C. for( i=10; ; i--) sum+=i; D. for( ; (c=getchar() )!=’\n’ ; ) printf( “%c”,c); 9. 执行语句”for(i=0;i++<3;);”后,变量i的值为C) 4。 A.2 B. 3 C. 4 D. 5 10.语句”for(x=0,y=0;y!=1&&x<4;x++);”是C)循环4次。 A. 无限循环 B. 循环次数不定 C. 循环4次 D. 循环3次

c语言程序设计第五版习题答案()

习题解析与答案 第1章C语言概述 一.简答题 1.概述C语言的主要特点。 【解答】 (1)语言简洁、紧凑,使用方便、灵活。 (2)数据类型丰富,表达能力强。 (3)运算符多样。C语言中的运算符包含的范围非常广泛。 (4)具有结构化的控制语句。如if…else语句、while语句、do while语句、switch语句、for语句。 (5)允许直接访问物理地址。C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。 (6)所生成的目标代码质量高,可移植性好。 2.构成C语言程序的基本单位是什么它由哪几部分组成 【解答】函数是构成C语言程序的基本单位。一个完整的C程序一般由文件包含、宏定义、函数说明、变量和一个或若干个函数组成。 3.C语言程序的运行一般要经过哪几个步骤 【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。 二.运行程序写结果 1.输入下面程序并运行。 main() { int a1,a2,x; a1=100;

a2=50; x=a1-a2; printf(″x=%d\n″,x); } 【解答】运行结果为:x=50 2.输入下面程序并运行。 main() { int a1,a2,x; a1=10; a2=20; x=a1*a2; printf(″a1=%d,a2=%d\n″,a1,a2); printf(″x=%d\n″,x); } 【解答】运行结果为:a1=10,a2=20 x=200 3.输入下面程序并运行。 #include <> main() { printf("******\n"); printf(" *****\n"); printf(" ****\n"); printf(" ***\n"); printf(" **\n"); printf(" *\n"); } 【解答】运行结果为:****** ***** **** *** ** *

《C语言程序设计教程(第二版)》习题答案

2 第1章程序设计基础知识 一、单项选择题(第23页) 1-4.CBBC 5-8.DACA 二、填空题(第24页) 1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言7.有穷性8.直到型循环9.算法10.可读性11.模块化12.对问题的分析和模块的划分 三、应用题(第24页) 2.源程序: main() {int i,j,k; /* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */ printf("cock hen chick\n"); for(i=1;i<=20;i++) for(j=1;j<=33;j++) for(k=1;k<=33;k++) if (i+j+k*3==100&&i*5+j*3+k==100) printf(" %d %d %d\n",i,j,k*3);} 执行结果: cock hen chick 4 18 78 8 11 81 12 4 84 3.现计算斐波那契数列的前20项。 递推法源程序: main() {long a,b;int i; a=b=1; for(i=1;i<=10;i++) /*要计算前30项,把10改为15。*/ {printf("%8ld%8ld",a,b); a=a+b;b=b+a;}} 递归法源程序: main() {int i; for(i=0;i<=19;i++) printf("%8d",fib(i));} fib(int i) {return(i<=1?1:fib(i-1)+fib(i-2));} 执行结果: 1 1 2 3 5 8 13 21 3 4 55 89 144 233 377 610 987 1597 2584 4181 6765

标准C语言程序设计第五版课后练习题答案

课后练习题答案 Chapter 1 1.1×√×√√×√××√ 1.2b c 1.3ad 1.4semicolon printf math、h \n Chapter 2 2、1 ×√××√√×√××√× 2、2 typedef 255 external const Chapter 3 3、1 ×√××√√×××√√√ 3、2 integer modula 6 logical sizeof paratheses typeconversion precedence 3、3 F F T F F F 3、4 F T T T F 3、5 (b) (c) 3、6 0 -2 7 10、25 false 3 3 1 3、10 0 1 1 1 1 3、11 d } 100 3、12 110 111 3、13 1 3、14 200 3、15 x<=y 3、16 TRUE 3、19 2 1 4 3、20 -40 40 Chapter 4 4、1 ×√√√√√××√√√× 4、2 %hd %x ctype、h %l %*d [^] blank 6 - %e 4、4 (a) scanf(“%d %c %d”, &a, &b, &c); (b)scanf(“%d %f %s”, &a, &b, &c); (c) scanf(“%d-%d-%d”, &a, &b, &c); (d) scanf(“%d %s %d”, &a, &b, &c);

4、5 (a)10x1、230000 (b)1234x 1、23 (c)1234 456、000000 (d) “123、40 ” (e) 1020 1222(乱码) 4、7 (a)1988 x (b)乱码 (c)120 乱码 (d)乱码 x 4、8 (a)1275 -23 5、740000 (b) 1275 -235、740000 (c) 0 0、000000 (d) 1275xxxx-235、74 (e)Cambridge (f)1275 Cambridge 4、10 1988 无无 Chapter 5 5、1 √×√××××××√ 5、2 && switch break if-else x=y 5、4 (a)x = 2; y = 0; (b) x = 1; y = 0; 5、5 (a) if (grade <= 59) if (grade >= 50) second = second + 1; (b) if (number > 100) printf(“out of range”); else if (number < 0) printf(“out of range”); else sum = sum + number; (c) if (T > 200) printf(“admitted”); else if (M > 60) {if (M > 60) printf(“admitted”);} else printf(“not admitted”); 5、6 F T F T 5、8 (a) x > 10 (b) (x != 10)||(y ! = 5) || (z >= 0) (c) (x + y != z) || (z > 5) (d) (x > 5) || (y != 10) || (z >= 5) 5、9 (a) x = 5; y = 10; z = 1 (b) x = 5; y = 10; z = 1 (c) x = 5; y = 0; z =0 (d) 无变化 5、10 (a) x= 0; y = 2; z = 0; (b) x = 1; y = 2; z = 0; 5、12 8 5、13 Delhi Bangalore END 5、14 2 4 4 8 5、15 0 0 2 5、16 25 5、17 Number is negative 5、18 ABC

(完整版)C语言程序设计练习及答案

《C语言程序设计》练习及答案 得分评卷人复查人 一、单选题,每小题1分,共60分(将正确答案的序号写在题目的括号中)。 1、结构化程序设计的三种基本控制结构是(D )。 A、主程序、子程序、函数 B、输入、处理、输出 C、调用,返回,转移 D、顺序、选择、循环 2、下列关于C程序变量的叙述, ( D )是错误的。 A、变量名必须由字母或下划线开头。 B、程序中的变量必须在被使用之前定义。 C、不同的基本类型的变量之间可以混合运算。 D、变量的数据类型决定变量的"作用域"。 3、能将C语言编写的源程序转换为目标程序的软件是(C )。 A、编辑程序 B、汇编程序 C、编译程序 D、解释程序 4、以下符号中,合法的用户标识符是( D )。 A、-p B、int C、3ab D、_xt_ 5、以下选项中,与m=n++完全等价的表达式是( C )。 A、m=++n B、m+=n+1 C、m=n, n=n+1 D、n=n+1,m=n 6、若有定义:int aa[8];。则以下表达式中不能代表数组元aa[1]的地址的是(C )。 A、&aa[0]+1 B、&aa[1] C、&aa[0]++ D、aa+1 7、表达式!5&(7+3)&&(4+5)的值是(A)。 A、0 B、1 C、5 D、9 8、以下选项中非法的C语言表达式是(A )。 A、x+1=x+1 B、0<=x<100 C、i=j==0 D、(char)(65+3) 9、在TURBO C中, int类型变量所占字节数是(B )。 A、1 B、2 C、4 D、8 10、C语言中基本的数据类型包括(B)。 A、整型,实型,逻辑型 B、整型,实型,字符型

C语言程序的设计习题参考答案(第二版_杜友福)

C 语言程序设计习题答案 习题一 C 语言程序设计概述 一、名词解释 (1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6)编译程序P3 (7)解释程序P3 (8)算法P4 (9)结构化的程序设计P9 二、简述题 1. 设计程序时应遵循哪些基本原则?P4 答:正确性、可靠性、简明性、有效性、可维护性、可移植性。 2. 算法的要素是什么?算法具有哪些特点? 答:算法的要素是:操作与控制结构;算法的特点有:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。 3. 算法的表示形式有哪几种? 答:算法的表示形式有:自然语言、传统流程图、伪代码、结构化的流程图(N_S 流程图,盒图)。 4. 有哪三种基本结构? 答:三种基本结构是:顺序结构、选择结构和循环结构。 5. 传统流程图与N-S 流程图最大的区别是什么? 答:N-S 流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。 三、用传统流程图、N-S 图分别表示求解以下问题的算法。 1. 有3个数a ,b ,c ,要求按由大到小的顺序把它们输出。 2. 依次将10个数输入,求出其中最大的数 和最小的数并输出。 3. 求1+2+3+…+100的值。 4. 求1×2×3×…×10的值。

5. 求下列分段函数的值。 6. 求100~200之间的所有素数。 7. 求一元二次方程ax 2+bx+c=0的根。分别考虑d=b 2-4ac 大于0、等于0和小于0三种情况。 四、注释下面C 程序的各个组成部分。 main() /*主函数 */ { /*程序开始 */ int a,k,m; /*定义三个用来存放整数的变量 */ a=10; /*将整数10赋值给变量a */ k=2; /*将整数2赋值给变量k */ m=1; /*将整数1赋值给变量1 */ a=(k+m)*k/(k-m); /*先求出算术表达式的值,并将其赋值给变量a */ printf("%d\n",a); /*在屏幕上打印出变量a 的值 */ } /*程序结束 */ 习题二 数据类型、运算符与表达式 一、选择题 1~10:BCDCB DDBCA 11~20: ADDAA DBADC 21~28: DABAD CDD Y= 3X (X<1) 4X-1 (X=1) 5(X-1)+6 (1

(完整版)《C语言程序设计》基本知识点

《C语言程序设计》教学基本知识点 第一章C语言基本知识 1.C源程序的框架 尽管各个C源程序的功能千变万化,但框架是不变的,主要有:编译预处理、主函数()、函数n()等,主函数的位置不一定在最前面,可以在程序的中部或后面,主函数的名字固定为main。 2.C语言源程序的书写规则: (1)C源程序是由一个主函数和若干个其它函数组成的。 (2)函数名后必须有小括号,函数体放在大括号内。 (3)C程序必须用小写字母书写。 (4)每句的末尾加分号。 (5)可以一行多句。 (6)可以一句多行。 (7)可以在程序的任何位置加注释。 3.语句种类 语句是程序的基本成分,程序的执行就是通过一条条语句的执行而得以实现的,根据表现形式及功能的不同,C语言的基本语句可以分为五大类。 (1)流程控制语句 流程控制语句的功能是控制程序的走向,程序的流程有三种基本结构:顺序结构、分支结构和循环结构,任何复杂的程序都可以由这三种基本结构复合而成。其中后两种结构要用特定的流程控制语句实现。 (2)表达式语句 表达式语句的形式是:表达式;,即表达式后跟一分号“;”,分号是语句结束符,是一个语句必不可少的成分。表达式和表达式语句的区别在于表达式代表的是一个数值,而表达式语句则代表一种动作。最常见的表达式语句是赋值语句。 (3)函数调用语句 函数调用语句实际上也是一种表达式语句,形式为:在一次函数调用的小括号后面加上一个分号。 (4)空语句 空语句的形式就是一个分号,它不代表任何动作,常常作为一个意义转折点使用。 (5)复合语句 复合语句从形式上看是多个语句的组合,但在语法意义上它只相当于一个语句,在任何单一语句存在的地方都可以是复合语句。注意复合语句中最后一个语句末尾的分号不能少。复合语句右大括号后面没有分号。 4.运算符 用来表示数据各种操作的符号称为运算符。运算符实际上代表了一种类型数据的运算规则。不同的运算符具有不同的运算规则,其操作的数据类型必须符合该运算符的要求,运算结果的数据类型也是固定的。 根据参加操作的数据个数多少,可以将C语言的运算符分为单目运算符,双目运算符和三目运算符(三目运算符只有条件运算符一个)。 根据运算对象和运算结果的数据类型可分为算术运算符、关系运算符、逻辑运算符等。 5.表达式 表达式是由常量、变量、函数,通过运算符连接起来而形成的一个算式。一个常量,一个变量或一个函数都可以看成是一个表达式。 表达式的种类有: 算术表达式、关系表达式、逻辑表达式、赋值表达式、字位表达式、强制类型转换表达式、逗号

C语言程序设计第二版习题参考答案

C语言程序设计第二版 习题参考答案 Document serial number【LGGKGB-LGG98YT-LGGT8CB-LGUT-

C语言程序设计习题参考答案 习题 1 一、判断题 1.在计算机中,小数点和正负号都有专用部件来保存和表示。 2.二进制是由0和1两个数字组成的进制方式。 3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。 4.在整数的二进制表示方法中,0的原码、反码都有两种形式。 5.有符号数有三种表示法:原码、反码和补码。 6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。 解:1.F2.T 3.T 4.T 5.T 6.T 二、单选题 1.在计算机中,最适合进行数值加减运算的数值编码是。 A. 原码 B. 反码 C. 补码 D. 移码 2.已知英文小写字母m的ASCII码为十进制数109,则英文小写字母y的ASCII 码为十进制数。 A. 112 B. 120 C. 121 D. 122 3.关于ASCII码,在计算机中的表示方法准确地描述是。 A. 使用8位二进制数,最右边一位为1 B. 使用8位二进制数,最左边一位为1 C. 使用8位二进制数,最右边一位为0 D. 使用8位二进制数,最左边一位为0 4.设在机器字长4位,X=0111B,Y=1011B,则下列逻辑运算中,正确的是 ___________。 A. X∧Y=1000 B. X∨Y=1111 C. X⊕Y=0011 D. ˉY=1000 5.下列叙述中正确的是()。 A.高级语言就是机器语言 B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算机可以直接识别并执行的程序 C.C语言因为具有汇编语言的一些特性,所以是汇编语言的一种 D.C源程序经过编译、连接,若正确,执行后就能得到正确的运行结果6.用C语言编写的源程序经过编译后,若没有产生编译错误,则系统将()。 A.生成可执行文件B.生成目标文件 C.输出运行结果D.自动保存源文件 7.下列叙述中不正确的是()。 A.main函数在C程序中必须有且只有一个 B. C程序的执行从main函数开始,所以main函数必须放在程序最前面 C. 函数可以带参数,也可以不带参数。

C语言程序设计(第二版)习题参考答案

C语言程序设计习题参考答案 习题1 一、判断题 1.在计算机中,小数点和正负号都有专用部件来保存和表示。 2.二进制是由0和1两个数字组成的进制方式。 3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。 4.在整数的二进制表示方法中,0的原码、反码都有两种形式。 5.有符号数有三种表示法:原码、反码和补码。 6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。 解:1.F 2.T 3.T 4.T 5.T 6.T 二、单选题 1.在计算机中,最适合进行数值加减运算的数值编码是。 A. 原码 B. 反码 C. 补码 D. 移码 2.已知英文小写字母m的ASCII码为十进制数109,则英文小写字母y的ASCII码为十进制数。 A. 112 B. 120 C. 121 D. 122 3.关于ASCII码,在计算机中的表示方法准确地描述是。 A. 使用8位二进制数,最右边一位为1 B. 使用8位二进制数,最左边一位为1 C. 使用8位二进制数,最右边一位为0 D. 使用8位二进制数,最左边一位为0 4.设在机器字长4位,X=0111B,Y=1011B,则下列逻辑运算中,正确的是___________。 A. X∧Y=1000 B. X∨Y=1111 C. X⊕Y=0011 D. ˉY=1000 5.下列叙述中正确的是()。 A.高级语言就是机器语言 B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算机可以直接识别并执行的程序 C.C语言因为具有汇编语言的一些特性,所以是汇编语言的一种 D.C源程序经过编译、连接,若正确,执行后就能得到正确的运行结果6.用C语言编写的源程序经过编译后,若没有产生编译错误,则系统将()。 A.生成可执行文件B.生成目标文件 C.输出运行结果D.自动保存源文件 7.下列叙述中不正确的是()。 A.main函数在C程序中必须有且只有一个 B. C程序的执行从main函数开始,所以main函数必须放在程序最前面 C. 函数可以带参数,也可以不带参数。 D. 每个函数执行时,按函数体中语句的先后次序,依次执行每条语句 解:1.C 2.C 3.D 4.B 5.B 6.B 7.B 三、填空题

C语言程序设计习题参考答案!(第二版--杜友福)

C语言程序设计习题参考答案!(第二版--杜友福)

C语言程序设计习题答案 习题一 C语言程序设计概述 一、名词解释 (1)程序P1 (2)程序设计P1(3)机器语言P1(4)汇编程序P2 (5)高级语言P2(6)编译程序P3(7)解释程序P3(8)算法P4 (9)结构化的程序设计P9 二、简述题 1. 设计程序时应遵循哪些基本原则?P4 答:正确性、可靠性、简明性、有效性、可维护性、可移植性。 2. 算法的要素是什么?算法具有哪些特点? 答:算法的要素是:操作与控制结构;算法的特点有:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。 3. 算法的表示形式有哪几种? 答:算法的表示形式有:自然语言、传统流程图、伪代码、结构化的流程图(N_S流程图,盒图)。 4. 有哪三种基本结构? 答:三种基本结构是:顺序结构、选择结构和循环结构。 5. 传统流程图与N-S流程图最大的区别是什么?

答:N-S 流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。 三、用传统流程图、N-S 图分别表示求解以下问题的算法。 1. 有3个数a ,b ,c ,要求按由大到小的顺序把它们输出。 2. 依次将10个数输入,求出其中最大的数 和最小的数并输出。 3. 求1+2+3+…+100的值。 输入三个数给a,b,c 如果a

4. 求1×2×3×…×10的值。 5. 求下列分段函数的值。 6. 求100~200之间的所有素数。 Y 3X (X<1) 输入一个数给x X<=1 Yes no

c语言程序设计(科学出版社)课后习题解答

第3章习题解答 第1章 1.C 语言程序主要由预处理命令、函数、注释等组成。 2.填空 (1)分号 (2)main (3)stdio.h 3. 源程序: #include main( ) { printf(“*************************\n”); printf(“Hello World!\n”); printf(“*************************”); } 4. 源程序: #include main( ) { int a, b, c; /* 定义变量*/ scanf(“%d”, &a); /* 输入第一个整数*/ scanf(“%d”, &b); /* 输入第二个整数*/ c=a-b; /* 计算差*/ printf(“%d-%d=%d”,a,b,c); /* 输出结果*/ } 5. (1) (2)x=10; (3)printf(“s=%d\n”,s); 第2章 1. (1) c (2) a (3) b g (4) a d e (5) d 2. a. 5 b. 295 c. 4 d. 29 e. 9 3. a.x=4,y=6

b. x=4,y=3 f.x=3,y=6 4. 16 5. #include main() { int a,b,c; scanf("%d%d",&a,&b); c=a*b; printf("%d*%d=%d",a,b,c); } 第3章 1. (1) b (2) b (3) d (4) a (5) b 2. (1)&a,&b (2)l,s 3. printf(“x=%.2f,y=%.2f\n”,x,y); 4. #include main() { int num1,num2,num3,sum; float average; scanf("%d%d%d",&num1,&num2,&num3); sum=num1+num2+num3; average=sum/3.0; printf("sum=%d,average=%.2f\n",sum,average); } 5. #include main() { int hour,minute,second,total; /* 定义变量代表时、分、秒和总秒数*/ scanf("%d",&total); hour=total/3600; minute=total%3600/60; second=total%3600%60;

相关文档
相关文档 最新文档