29
C 语言程序设计 练习题参考答案 第一章 概述 ......................................................................................................................................... 2 第二章 数据类型 运算符 表达式 ..................................................................................................... 2 第三章 (1) 顺序结构 输入输出......................................................................................................... 2 第三章 (2) 选择结构........................................................................................................................... 3 第三章 (3) 循环结构........................................................................................................................... 5 第四章 (1) 一维数组........................................................................................................................... 8 第四章 (2) 二维数组......................................................................................................................... 10 第四章 (3) 字符数组......................................................................................................................... 12 第五章 (1) 函数定义调用................................................................................................................. 16 第五章 (2) 递归函数......................................................................................................................... 19 第六章 (1) 结构体 综合练习........................................................................................................... 21 第七章 (1) 指针与变量 指针与数组............................................................................................... 22 第七章 (2) 指针与数组 main函数形参........................................................................................... 23 第八章 文件(1............................................................................................................................. 24 第八章 文件(2............................................................................................................................. 25 实验相关事项 ..................................................................................................................................... 27 2009 学年要求掌握的例题和习题 .................................................................................................... 28 2009 学年试卷结构 ............................................................................................................................ 29 建议学习步骤: 1 通过预习和听课的方式,学习和理解教材内容(尤其是例题)。 2 课后复习教材,结合教材和习题指导书,独立思考编写程序。 3 上机调试程序,撰写实验报告。 4 参考本答案,修正错误,弄清楚错误原因。 5 抛开教材和其他参考资料,再次独立编写程序。 声明: 为达到学习目的,请读者在独立思考编写程序之后,再参考本答案。 由于编者水平有限,其中错误、疏漏之处在所难免,恳请各位读者批评指正。 http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 1 of 29

C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

  • Upload
    others

  • View
    37

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

C 语言程序设计 练习题参考答案

第一章 概述 ......................................................................................................................................... 2 第二章 数据类型 运算符 表达式 ..................................................................................................... 2 第三章 (1) 顺序结构 输入输出......................................................................................................... 2 第三章 (2) 选择结构........................................................................................................................... 3 第三章 (3) 循环结构........................................................................................................................... 5 第四章 (1) 一维数组........................................................................................................................... 8 第四章 (2) 二维数组......................................................................................................................... 10 第四章 (3) 字符数组......................................................................................................................... 12 第五章 (1) 函数定义调用................................................................................................................. 16 第五章 (2) 递归函数......................................................................................................................... 19 第六章 (1) 结构体 综合练习........................................................................................................... 21 第七章 (1) 指针与变量 指针与数组............................................................................................... 22 第七章 (2) 指针与数组 main函数形参 ........................................................................................... 23 第八章 文件(1) ............................................................................................................................. 24 第八章 文件(2) ............................................................................................................................. 25 实验相关事项 ..................................................................................................................................... 27 2009 学年要求掌握的例题和习题 .................................................................................................... 28 2009 学年试卷结构 ............................................................................................................................ 29 建议学习步骤: 1 通过预习和听课的方式,学习和理解教材内容(尤其是例题)。 2 课后复习教材,结合教材和习题指导书,独立思考编写程序。 3 上机调试程序,撰写实验报告。 4 参考本答案,修正错误,弄清楚错误原因。 5 抛开教材和其他参考资料,再次独立编写程序。 声明: 为达到学习目的,请读者在独立思考编写程序之后,再参考本答案。 由于编者水平有限,其中错误、疏漏之处在所难免,恳请各位读者批评指正。

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 1 of 29

Page 2: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

第一章 概述 /* C 语言程序设计 第一章 p11, 1.5 输出以下文字:I am a student,I love China. */ #include<stdio.h> void main() { printf("I am a student,I love China."); } /* C 语言程序设计 第一章 p11, 1.6 求 a,b,c 三个数的平均值, 参考程序一 */ #include<stdio.h> void main() { int a, b, c, average; printf("请输入三个整数\n"); scanf("%d%d%d",&a,&b,&c); average=(a+b+c)/3; printf("平均值为%d\n",average); } /* C 语言程序设计 第一章 p11, 1.6 求 a,b,c 三个数的平均值, 参考程序二 */ #include<stdio.h> int aver(int x, int y, int z); void main() { int a, b, c, average; printf("请输入三个整数\n"); scanf("%d%d%d",&a,&b,&c); average=aver(a,b,c); printf("平均值为%d\n",average); } int aver(int x, int y, int z) { return (x+y+z)/3; } 第二章 数据类型 运算符 表达式 2.4 C, 2.5 B, 2.6 A, 2.7 B, 2.8 C, 2.9 C, 2.10 B, 2.11 A, 2.12 D, 2.13 A, 2.14 3,1 4,3 2,4 1,2 2.15 (1) 1 (2) 30 (3) 5.0 (4) 0.0 (5) 1 第三章 (1) 顺序结构 输入输出 /* 3.4 求两点之间的距离,(x1,x2) (y1,y2) 。类似于例 3.9 */ #include "stdio.h" #include "math.h" void main() { float x1,y1,x2,y2; double distance; printf("请输入两点(x1,x2) (y1,y2)\n 输入示例: 1 1 2 2 即指(1,1)(2,2)\n");

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 2 of 29

Page 3: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

scanf("%f%f%f%f",&x1,&y1,&x2,&y2); distance = sqrt((x2 - x1) * (x2 - x1)+(y2-y1)*(y2-y1)); printf("两点(%f,%f) (%f,%f)之间的距离为%lf\n",x1,y1,x2,y2,distance); } /* 3.5 摄氏华氏温度转换。 类似于例 3.9 */ #include "stdio.h" #include "math.h" void main() { float C,F,K; printf("请输入摄氏温度\n 输入示例 25.0 即指 25.0 摄氏度\n"); scanf("%f",&C); F=9.0/5.0*C+32; K=273.16+C; printf("华氏温度为%.1f,绝对温度为%.1f\n",F,K); } 第三章 (2) 选择结构 /* 3.6 求 3 个数中最大值。类似于例 1.2*/ #include <stdio.h> void main( ) { int a, b, c, max; printf("\n 请输入 3 个整数,整数以空格分隔:\n"); scanf("%d%d%d",&a,&b,&c); if(a>b) max=a; else max=b; if(max<c) max=c; printf("最大值是%d\n",max); } /*3.6 求 3 个数中最大值。类似于例 1.2*/ #include <stdio.h> void main( ) { int a, b, c, max; printf("\n 请输入 3 个整数,整数以空格分隔:\n"); scanf("%d%d%d",&a,&b,&c); max=a>b?a:b; max=max>c?max:c; printf("最大值是%d\n",max); } /*3.7 输入 x 求 y 的值。类似于例 3.13, 也可以用 switch 语句*/ #include <stdio.h> #include <math.h> void main( ) { float x, y; printf("\n 请输入一个实数:\n"); scanf("%f",&x); if( x>=0 && x<10)

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 3 of 29

Page 4: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

y=sin(x); if( x>=10 && x<20) y=cos(x); if( x>=20 && x<30) y=exp(x)-1; if( x>=30 && x<40) y=log(x+1); if( x<0 || x>=40) printf("无定义"); else printf("y=%f\n",y); } /*3.7 输入 x 求 y 的值。类似于例 3.13,解法二*/ #include <stdio.h> #include <math.h> void main( ) { float x, y; printf("\n 请输入一个实数:\n"); scanf("%f",&x); if(x>0 && x<=40) switch( (int)(x/10)) { case 0: y=sin(x); printf("y=%f\n",y); break; case 1: y=cos(x); printf("y=%f\n",y); break; case 2: y=exp(x)-1; printf("y=%f\n",y); break; case 3: y=log(x+1); printf("y=%f\n",y); break; } else printf("无定义"); } /*3.7 输入 x 求 y 的值。解法三*/ # include<stdio.h> # include<math.h> void main() { float x,y; scanf("%f",&x); if(x<0 || x>=40) printf ("无定义\n"); else if(x>30) y=log(x+1); else if(x>20) y=exp(x)-1; else if(x>10) y=cos(x); else

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 4 of 29

Page 5: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

y=sin(x); if(x>=0 && x<40) printf ("y=%f\n",y); } /* 3.8 输入一个百分制成绩,给出提示, 类似于例 3.14,也可以用 switch 语句*/ #include "stdio.h" void main() { int score; printf("请输入一个分数(整数),示例 85\n"); scanf("%d",&score); if(score>=90 && score<=100) printf("excellent\n"); if(score>=80 && score<=89) printf("good\n"); if(score>=70 && score<=79) printf("middle\n"); if(score>=60 && score<=69) printf("pass\n"); if(score<60) printf("fail\n"); } 第三章 (3) 循环结构 /* 3.9 求派的值*/ #include "stdio.h" void main() { int n; double sum=0; for(n=1;n<=10000;n++) { sum=sum+1.0/(4*n-3)-1.0/(4*n-1); } printf("pi 的值为%lf\n",4*sum); } /* 3.9 求派的值*/ #include<stdio.h> void main() { double i=1, s=1.0, t=1.0; do { t=t*(-1)*((2*i-1)/(2*i+1)); s=s+t; i++; }while (i<=10000000); printf("pi=%.8lf\n",s*4); } /* 3.10 求最大公约数和最小公倍数 辗转相除法:见下面的介绍。 gcd(m,n)=gcd(n,r) */

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 5 of 29

Page 6: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

#include "stdio.h" void main() { int m,n,r,original_m,original_n; printf("输入 m 和 n,示例 6 8\n"); scanf("%d%d",&m,&n); original_m=m; original_n=n; r=m%n; while(r!=0) { m=n; n=r; r=m%n; } printf("最大公约数为%d,最小公倍数为%d\n",n,original_m*original_n/n); } 用辗转相除法求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数; 再用第一个余数除小的一个数,得第二个余数; 又用第二个余数除第一个余数,得第三个余数; 这样逐次用后一个数去除前一个余数,直到余数是 0 为止。那么,最后一个除数就是所求的最大公约数(如果最

后的除数是 1,那么原来的两个数是互质数)。 例如求 1515 和 600 的最大公约数, 第一次:用 600 除 1515,商 2 余 315; 第二次:用 315 除 600,商 1 余 285; 第三次:用 285 除 315,商 1 余 30; 四次:用 30 除 285,商 9 余 15; 第五次:用 15 除 30,商 2 余 0。 1515 和 600 的最大公约数是 15。 辗转相除法是求两个数的最大公约数的方法。如果求几个数的最大公约数,可以先求两个数的最大公约数,再求

这个最大公约数与第三个数的最大公约数。这样依次下去,直到最后一个数为止。最后所得的一个最大公约数,

就是所求的几个数的最大公约数。 /* 3.11 Sn=a+aa+aaa+...+aaa...a */ #include <stdio.h> void main( ) { int a,n,i; long sum=0, item; printf("请输入整数 n(n>=1 且 n<=9)\n"); scanf("%d",&n); printf("请输入一位数字 a(1-9)\n"); scanf("%d",&a); item=a; sum=a; for(i=1;i<n;i++ ) { item=item*10+a;

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 6 of 29

Page 7: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

sum=sum+item; } printf("sum=%ld\n",sum); } /* 3.12 分数序列求和,前 20 项。 2/1+3/2+5/3+8/5+...... */ #include <stdio.h> void main( ) { int i; float sum=0, item,fenzi=2,fenmu=1,jiufenmu; for(i=1;i<=20;i++ ) { item=fenzi/fenmu; jiufenmu=fenmu; printf("%f/%f ;\n",fenzi,fenmu); sum=sum+item; fenmu=fenzi; fenzi=fenzi+jiufenmu; } printf("sum=%f\n",sum); } /* 3.13 2-999 之间所有同构数 例.... 5×5=25 */ #include "stdio.h" void main() { int i; printf("2-999 之间所有同构数:"); for(i=2;i<=999;i++) { if(i>=2 && i<=9) if(i*i%10 == i) printf("%4d",i); if(i>=10 && i<=99) if(i*i%100 == i) printf("%4d",i); if(i>=100 && i<=999) if(i*i%1000 == i) printf("%4d",i); } } /* 3.14 输入 10 个数字,输出所有负数,及负数的和(要求不用数组) */ #include "stdio.h" #include "math.h" void main() { int i; float x,sum=0; printf("\n 请输入十个数字,并按回车键\n"); for(i=0;i<=9;i++)

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 7 of 29

Page 8: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

{ scanf("%f",&x); if(x<0) { printf("%f",x); sum=sum+x; } } printf("\n 所有负数之和为:%f",sum); } /* 例 3.15 任意输入 n 个数,输出其中最大数和最小数,并输出他们在序列中的位置*/ #include "stdio.h" #include "math.h" void main() { int i,n,max_location=1,min_location=1; float x,max=0,min=0; printf("你想输入几个数字(输入一个整数后按回车)"); scanf("%d",&n); printf("\n 请输入%d 个数字,并按回车键\n",n); scanf("%f",&x); max=x; min=x; for(i=2;i<=n;i++) { scanf("%f",&x); if(x>max) { max=x; max_location=i; } if(x<min) { min=x; min_location=i; } } printf("\n 最大数为%f,位置为:%d\n",max,max_location); printf("\n 最小数为%f,位置为:%d\n",min,min_location); } 第四章 (1) 一维数组 /* 4.11 fibonacci 数列,前 15 项 1,1,2,3,5,。。。。。*/ #include "stdio.h" void main() { int f[15]={1,1}, i; for(i=2;i<=14;i++) /* 计算 */ f[i]=f[i-2]+f[i-1];

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 8 of 29

Page 9: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

printf("fibonacci 数列,前 15 项\n"); /* 输出 */ for(i=0;i<=14;i++) { printf("%5d",f[i]); if((i+1)%5==0) printf("\n"); } } /* 4.12 数组元素前移动一个位置 */ #include "stdio.h" void main() { int a[10]={0,1,2,3,4,5,6,7,8,9}; int i,t; printf("\n 移动之前:\n"); for(i=0;i<=9;i++) printf("%3d",a[i]); /* 移动 */ t=a[0]; for(i=0;i<=9;i++) a[i]=a[i+1]; a[9]=t; printf("\n 移动之后:\n"); for(i=0;i<=9;i++) printf("%3d",a[i]); } /* 4.13 有序数列中插入若干个数,仍然保持有序 */ #include "stdio.h" void main() { int a[100]={1,4,8,10}; int i,k,x,count=4;/* i,k 循环变量, x 输入整数,count 有多少整数*/ printf("\n 请输入要插入的整数,输入之后按回车键,如要结束请输入-1\n"); scanf("%d",&x); while(x!=-1) { /* 寻找插入位置 */ for(i=0;i<count;i++) { /* 找到插入位置 */ if(a[i]>=x) { /* 移动 */ for(k=count;k>i;k--) a[k]=a[k-1]; /* 插入 */ a[i]=x; break; }

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 9 of 29

Page 10: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

} if(i>=count) a[i]=x; count=count+1; printf("\n 插入之后的数组为:\n"); for(i=0;i<count;i++) printf("%4d",a[i]); printf("\n 请输入要插入的整数,输入之后按回车键,如要结束请输入-1\n"); scanf("%d",&x); } } /* 4.15 将十进制数转换成二进制数,并按位存放到数组中。(限正整数) */ #include "stdio.h" #include "conio.h" void main() { int decimal, binary[32], i=0, quotient; printf("请输入一个十进制数\n"); scanf("%d",&decimal); /* 计算 */ quotient=decimal/2; binary[i]=decimal%2; decimal=quotient; while(quotient!=0) { i++; quotient= decimal/2; binary[i]=decimal%2; decimal=quotient; } /* 输出 */ while(i>=0) { printf("%d",binary[i]); i--; } getch(); } 第四章 (2) 二维数组 /* 4.16 5*5 矩阵中每行的绝对值最大值,与同行对角线交换*/ #include "stdio.h" #include "math.h" void main() { int a[5][5]={{1,2,3,4,-5},{3,5,-2,4,2},{4,1,2,3,-2}, {1,3,-2,4,6},{2,2,0,7,4}} ; int i,k,max,sub,temp; /* i 循环变量,控制行, k 循环变量,控制列,max 当前最大绝对值,sub 当前最大绝对值元素的下标 temp 临时用于交换的变量 */

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 10 of 29

Page 11: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

printf("交换之前,输出\n"); /*交换之前,输出*/ for(i=0;i<=4;i++) { for(k=0;k<=4;k++) printf("%4d",a[i][k]); printf("\n"); } /*交换*/ for(i=0;i<=4;i++) { /*假设第一个元素最大*/ max=fabs(a[i][0]); sub=0; /*寻找绝对值最大的元素记下下标*/ for(k=1;k<=4;k++) { if(fabs(a[i][k])>max) { max=fabs(a[i][k]); sub=k; } } /*交换*/ temp=a[i][i]; a[i][i]=a[i][sub]; a[i][sub]=temp; } /*交换之后,输出*/ printf("交换之后,输出\n"); for(i=0;i<=4;i++) { for(k=0;k<=4;k++) printf("%4d",a[i][k]); printf("\n"); } } /* 4.17 在一个一维数组中存放任意 4 个数,如:5,1,8,6,生成如下矩阵 5 5 5 5 5 5 5 5 1 1 1 1 1 5 5 1 8 8 8 1 5 5 1 8 6 8 1 5 5 1 8 8 8 1 5 5 1 1 1 1 1 5 5 5 5 5 5 5 5 */ #include "stdio.h" #include "conio.h" void main() { int FourNumbers[4], array[7][7], i , row, column; printf("请输入 4 个整数\n"); scanf("%d%d%d%d",&FourNumbers[0],&FourNumbers[1],&FourNumbers[2],&FourNumbers[3]);

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 11 of 29

Page 12: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

for(i=0;i<=3;i++) { for(row=i;row<=6-i;row++) { for(column=i;column<=6-i;column++) array[row][column]=FourNumbers[i]; } } /* 输出矩阵 */ for(row=0;row<=6;row++) { for(column=0;column<=6;column++) printf("%4d",array[row][column]); printf("\n"); } getch(); } /* 习题 4.19 对一行电文加密,每个字母转换为字母表中循环右移的第三个字母, a-d, b-e, ......z-c */ #include "stdio.h" void main() { int c; while((c=getchar())!='\n') { if( (c>='a' && c<='z') || (c>='A' && c<='Z') ) { c=c+3; if ((c>'Z' && c<='Z'+3) || c>'z') c=c-26; } putchar(c); } } 第四章 (3) 字符数组 /* 例 4.19 电文加密,每个字母转换为字母表中循环右移的第三个字母, 解法一 */ #include "stdio.h" void main() { char s[256]; int i=0; printf("请输入一行字符,之后按回车键\n"); gets(s); while(s[i]!=0) { if(s[i]>=65 && s[i]<=87) /*A - W*/ { s[i]=s[i]+3;

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 12 of 29

Page 13: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

i++; continue; } if(s[i]>=88 && s[i]<=90) /* X,Y,Z */ { s[i]=s[i]+3-26; i++; continue; } if(s[i]>=97 && s[i]<=119) /*a - w*/ { s[i]=s[i]+3; i++; continue; } if(s[i]>=120 && s[i]<=122) /* x,y,z*/ { s[i]=s[i]+3-26; i++; continue; } i++; } puts("\n"); puts(s); } /* 例 4.19 电文加密,每个字母转换为字母表中循环右移的第三个字母,解法二 */ #include "stdio.h" void main() { char s[256]; int i=-1; printf("请输入一行字符,之后按回车键\n"); gets(s); while(s[++i]!=0) { if(s[i]>=65 && s[i]<=87) /*A - W*/ { s[i]=s[i]+3; continue; } if(s[i]>=88 && s[i]<=90) /* X,Y,Z */ { s[i]=s[i]+3-26; continue; } if(s[i]>=97 && s[i]<=119) /*a - w*/ { s[i]=s[i]+3; continue;

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 13 of 29

Page 14: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

} if(s[i]>=120 && s[i]<=122) /* x,y,z*/ { s[i]=s[i]+3-26; continue; } } puts("\n"); puts(s); } /* 例 4.19 电文加密,每个字母转换为字母表中循环右移的第三个字母,解法三:*/ #include "stdio.h" void main() { char s[256]; int i=-1; printf("请输入一行字符,之后按回车键\n"); gets(s); while(s[++i]!=0) { if(s[i]>=65 && s[i]<=90) /*A - Z*/ { s[i]=(s[i]-65+3)%26+65; continue; } if(s[i]>=97 && s[i]<=122) /*a - z*/ { s[i]=(s[i]-97+3)%26+97; continue; } } puts("\n"); puts(s); } /* 例 4.19 电文加密,每个字母转换为字母表中循环右移的第三个字母,解法三四:*/ /* 4.16 5*5 矩阵中每行的绝对值最大值,与同行对角线交换*/ #include "stdio.h" #include "math.h" void main() { int a[5][5]={{1,2,3,4,-5},{3,5,-2,4,2},{4,1,2,3,-2}, {1,3,-2,4,6},{2,2,0,7,4}} ; int i,k,max,sub,temp; /* i 循环变量,控制行, k 循环变量,控制列,max 当前最大绝对值,sub 当前最大绝对值元素的下标 temp 临时用于交换的变量 */ printf("交换之前,输出\n"); /*交换之前,输出*/ for(i=0;i<=4;i++) {

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 14 of 29

Page 15: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

for(k=0;k<=4;k++) printf("%4d",a[i][k]); printf("\n"); } /*交换*/ for(i=0;i<=4;i++) { /*假设第一个元素最大*/ max=fabs(a[i][0]); sub=0; /*寻找绝对值最大的元素记下下标*/ for(k=1;k<=4;k++) { if(fabs(a[i][k])>max) { max=fabs(a[i][k]); sub=k; } } /*交换*/ temp=a[i][i]; a[i][i]=a[i][sub]; a[i][sub]=temp; } /*交换之后,输出*/ printf("交换之后,输出\n"); for(i=0;i<=4;i++) { for(k=0;k<=4;k++) printf("%4d",a[i][k]); printf("\n"); } } /* 4.17 在一个一维数组中存放任意 4 个数,如:5,1,8,6,生成如下矩阵 5 5 5 5 5 5 5 5 1 1 1 1 1 5 5 1 8 8 8 1 5 5 1 8 6 8 1 5 5 1 8 8 8 1 5 5 1 1 1 1 1 5 5 5 5 5 5 5 5 */ #include "stdio.h" #include "conio.h" void main() { int FourNumbers[4], array[7][7], i , row, column; printf("请输入 4 个整数\n"); scanf("%d%d%d%d",&FourNumbers[0],&FourNumbers[1],&FourNumbers[2],&FourNumbers[3]); for(i=0;i<=3;i++) { for(row=i;row<=6-i;row++)

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 15 of 29

Page 16: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

{ for(column=i;column<=6-i;column++) array[row][column]=FourNumbers[i]; } } /* 输出矩阵 */ for(row=0;row<=6;row++) { for(column=0;column<=6;column++) printf("%4d",array[row][column]); printf("\n"); } getch(); } /* 习题 4.19 对一行电文加密,每个字母转换为字母表中循环右移的第三个字母, a-d, b-e, ......z-c */ #include "stdio.h" void main() { int c; while((c=getchar())!='\n') { if( (c>='a' && c<='z') || (c>='A' && c<='Z') ) { c=c+3; if ((c>'Z' && c<='Z'+3) || c>'z') c=c-26; } putchar(c); } } 第五章 (1) 函数定义调用 /* 5.6 编写函数,输出所有水仙花数 */ #include "stdio.h" int isdaffodil( int n ) ; /* isdaffodil 函数原型声明 */ void main() { int i; for( i=100; i<=999; i++) if( isdaffodil( i ) ) printf("%5d",i); } int isdaffodil( int n ) /* isdaffodil 函数 ,判断数 n 是不是水仙花数 */ { int units, tens, hundreds; if(n>999 || n<100) return 0; /* it is not a daffodil */

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 16 of 29

Page 17: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

units=n%10; tens=n/10%10; hundreds=n/100; if(n==units*units*units+ tens*tens*tens+hundreds*hundreds*hundreds) return 1; /* it is a daffodil ,返回 1*/ else return 0; /* it is not a daffodil,返回 0 */ } /* 5.7 编写函数,求最大公约数和最小公倍数 */ #include "stdio.h" #include "conio.h" int CommonDivisor(int m, int n) ; int LowestCommonMultiple(int m, int n); void main() { int m, n; printf("求最大公约数和最小公倍数 ,请输入 m 和 n\n"); scanf("%d%d", &m, &n ); printf("最大公约数为%d, 最小公倍数为%d",CommonDivisor(m,n),LowestCommonMultiple(m, n)) ; getch(); } int CommonDivisor(int m, int n) { int remainder, temp; if(n<m) { temp=m; m=n; n=temp; } remainder=m%n; while( remainder != 0 ) { m=n; n=remainder; remainder=m%n; } return n; } int LowestCommonMultiple(int m, int n) { return m*n/CommonDivisor(m,n); } /* 5.8 编写函数,重复打印给定字符 n 次*/ #include "stdio.h" void printchar(char ch, int count); /* 函数原型声明 */ void main() { char c;

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 17 of 29

Page 18: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

int n; printf("请输入要重复打印的字符\n"); c=getchar( ); printf("请输入重复次数\n"); scanf("%d", &n); printf("重复输出给定字符%c 共计%d 次\n", c, n); printchar(c, n); } void printchar(char ch, int count) /* 重复打印字符 ch,count 表示次数 */ { int i; for(i=1; i<=count; i++) putchar(ch); } 闰年是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份, 即有闰日的年份为闰年 公历闰年判定遵循的规律为: 四年一闰,百年不闰,四百年再闰. 公历闰年的简单计算方法(符合以下条件之一的年份即为闰年) 1。能被 4 整除而不能被 100 整除。 2。能被 100 整除也能被 400 整除。 详情如下: 闰年(leap year),指在公历(格里历)或夏历中有闰日的年份,以及在中国旧历农历中有闰月的年份。 地球绕太阳运行周期为 365 天 5 小时 48 分 46 秒(合 365.24219 天),即一回归年(tropical year)。公历的

平年只有 365 日,比回归年短约 0.2422 日,每四年累积约一天,把这一天加于 2 月末(2 月 29 日),使当年的历

年长度为 366 日,这一年就为闰年。 按照每四年一个闰年计算,平均每年就要多算出 0.0078 天,经过四百年就

会多出大约 3 天来,因此,每四百年中要减少三个闰年。所以规定公历年份是整百数的,必须是 400 的倍数才是

闰年,不是 400 的倍数的就是平年。比如,1700 年、1800 年和 1900 年为平年,2000 年为闰年。闰年的计算,归

结起来就是通常说的:四年一闰,百年不闰,四百年再闰. /* 5.9 编写函数,给出年月日,计算该日是本年的第几天 */ #include "stdio.h" int isleapyear(int y); /*函数原型声明*/ int dayofyear(int year, int month, int day);/*函数原型声明*/ void main() { int y,m,d; printf("请输入年月日,数字间以空格隔开\n"); scanf("%d%d%d",&y, &m, &d); printf("%d 年%d 月%d 日是该年的第%d 天", y, m, d, dayofyear(y, m, d)); } int isleapyear(int y) /* 判断某年 y 是不是闰年*/ { if (( y%4==0 && y%100!=0 ) || y%400==0 ) return 1; /* it is a leap year ,返回 1*/ else return 0; /* it is not a leap year ,返回 0*/ }

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 18 of 29

Page 19: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

int dayofyear(int year, int month, int day) /* 计算某日是该年第几天 */ { int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i, daycount=0; if( isleapyear( year ) ) days[2]=29; for(i=1; i<month; i++) daycount=daycount + days[i]; daycount=daycount + day; return daycount; } 第五章 (2) 递归函数 /* 5.10 编写函数,求 Fibonacci 数列的第 n 项 */ #include "stdio.h" int fibonacci(int n); void main() { int n; printf("求 Fibonacci 数列的第 n 项,请输入 n\n"); scanf("%d", &n); /* VC6 中 n 要小于 ? */ printf("Fibonacci 数列的第%d 项为%d", n, fibonacci(n)); } int fibonacci(int n) { if(n==1 || n==2) return 1; else return fibonacci(n-1) + fibonacci(n-2) ; } /* 5.11 编写函数,判断一个整数是否是回文数 palindrome */ #include "stdio.h" int palindrome(long n); void main() { long n; printf("判断一个整数是否是回文数,请输入 n\n"); scanf("%ld", &n); if(palindrome( n )) printf("%ld 是回文数",n); else printf("%ld 不是回文数",n); } int palindrome(long n) { int i,bit=0; int a[10]; while(n!=0)

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 19 of 29

Page 20: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

{ a[bit]=n%10; n=n/10; bit++; } for(i=0; i<bit/2; i++) { if(a[i]!=a[bit-1-i]) return 0; } return 1; } /* 5.12 编写函数,求 x 的 n 次方,n 为不小于 0 整数 n>=0 */ #include "stdio.h" double power(double x, int n); void main() { int n; double x; printf("求 x 的 n 次方,请输入 x 和 n,数字间以空格隔开\n"); scanf("%lf%d", &x, &n); printf("%lf 的%d 次方为%lf", x, n, power(x, n) ); } double power(double x, int n) { if(n==0) return 1; else return (x * power(x, n-1)); } /* 5.13 编写一个函数,用递归方法求 n 阶勒让德多项式的值 */ #include "stdio.h" #include "conio.h" double P(double x, int n); void main() { double x; int n; printf("求 n 阶勒让德多项式,请输入 x 和 n\n"); scanf("%lf%d",&x, &n); printf("结果为%lf", P(x, n)) ; getch(); } double P(double x, int n) { if(n==0) return 1; if(n==1) return x;

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 20 of 29

Page 21: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

if(n>1) return ((2*n-1)*x-P(x,n-1)-(n-1)*P(x,n-2))/n; } 第六章 (1) 结构体 综合练习 /* 6.9 10 个学生,每个学生 3 门课程成绩,求平均分及前五名 */ #include "stdio.h" #include "conio.h" #define N 6 struct student /* 定义结构体数据类型 */ { int num; char name[10]; int score[3]; /* 不能使用 float */ float average; }; void sort(struct student stu[ ] ); /* 函数原型声明, 排序 */ void print( struct student stu[ ] ); /* 函数原型声明, 输出 */ void printtopfive( struct student stu[ ] ); /* 函数原型声明,输出前 5 名 */ void main() { struct student s[N]; /* s 为结构体数组 */ int i; for(i=0;i<N;i++) { printf("请输入第%d 个学生的学号 姓名 成绩 1 成绩 2 成绩 3\n",i+1); scanf("%d%s%d%d%d",&s[i].num,s[i].name,&s[i].score[0], &s[i].score[1],&s[i].score[2]); s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0; } printf("原始成绩报表\n"); print(s); sort(s); printf("排序之后的成绩报表\n"); print(s); printf("前五名成绩报表\n"); printtopfive(s); getch(); } void sort( struct student stu[ ] ) /* 函数, 选择排序 */ { int i,k,j; struct student t; for(i=0;i<N-1;i++) { k=i; for(j=i+1;j<N;j++)

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 21 of 29

Page 22: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

{ if(stu[k].average<stu[j].average) k=j; if(k!=i) { t=stu[i]; stu[i]=stu[k]; stu[k]=t; } } } } void print( struct student stu[ ] ) /* 函数, 输出 */ { int i; printf("Student ID Student Name Score1 Score2 Score3 Average\n"); for(i=0;i<N;i++) printf("%-10d%-12s%8d%8d%8d%8.1f\n",stu[i].num,stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average); } void printtopfive( struct student stu[ ] ) /* 函数,输出前 5 名 */ { int i; printf("Student Name Average\n"); for(i=0;i<5;i++) printf("%-12s%8.1f\n",stu[i].name,stu[i].average); } 第七章 (1) 指针与变量 指针与数组 /* 7.13 输入三个整数,从小到大排序, (指针,函数实现交换) */ #include "stdio.h" #include "conio.h" void swap(int *a, int *b, int *c); void main() { int x, y, z; printf("请输入三个整数,示例 1 2 3\n"); scanf("%d%d%d",&x,&y,&z); swap(&x,&y,&z); printf("排序后:%d,%d,%d\n",x,y,z); getch(); } void swap(int *a, int *b, int *c) { int t; if(*a>*c) {t=*a;*a=*c;*c=t;} if(*a>*b) {t=*a;*a=*b;*b=t;}

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 22 of 29

Page 23: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

if(*b>*c) {t=*b;*b=*c;*c=t;} } /* 7.15 实现字符串连接函数 strcat(); */ #include "stdio.h" #include "conio.h" char * strcat(char *p1, char *p2); void main() { char s1[20]="s1"; char s2[20]="s2"; strcat(s1,s2); printf("连接 s1,s2 之后的 s1: %s\n",s1); strcat(s1,"string"); printf("连接 s1 和 string 之后的 s1: %s\n",s1); getch(); } char * strcat(char *p1, char *p2) { char * head=p1; while(*p1!='\0') p1++; while(*p2!='\0') { *p1=*p2; p1++; p2++; } *p1='\0'; return head; } 第七章 (2) 指针与数组 main 函数形参 /* 7.16 实现测试字符串长度函数 strlen() */ #include "stdio.h" int strlen(char *p); void main() { char s1[20]="s1s2s3s4"; char *p=s1; printf("s1 的长度: %d\n",strlen(s1)); printf("s1 的长度: %d\n",strlen(p)); printf("字符串 abc123 的长度: %d\n",strlen("abc123")); } int strlen(char *p) { int length=0; while(*p!='\0')

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 23 of 29

Page 24: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

{ length++; p++; } return length; } /* 7.19 指针数组做 main 函数的形参。 注:按照习题要求,此文件必须取名为 welcome.c */ #include "stdio.h" void main(int argc, char * argv[]) { int i; printf("Welcome to you "); for(i=1;i<argc;i++) printf(" %s",argv[i]); } 第八章 文件(1) /* 8.5 从键盘输入一行字符,将其中小写字母转换为大写字母 */ #include "stdio.h" void main() { FILE *fp; char ch; if((fp=fopen("c:\\ex85.txt","w"))==NULL) { printf("不能创建文件 c:\\ex85.txt"); exit(1); } printf("请输入一行字符\n"); while((ch=getchar())!='\n') { if(ch>='a' && ch<='z') ch=ch-32; fputc(ch,fp); } fclose(fp); printf("操作成功"); } /* 8.7 把一个 ASCII 文件连接在另外一个ASCII文件之后。 把 c:\\ex87_1.txt 中的字符连接在 c:\\ex87_2.txt中的之后*/ #include "stdio.h" void main() { FILE *fp1,*fp2; char ch; if((fp1=fopen("c:\\ex87_1.txt","r"))==NULL) { printf("不能打开文件 c:\\ex87_1.txt"); exit(1); }

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 24 of 29

Page 25: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

if((fp2=fopen("c:\\ex87_2.txt","a"))==NULL) { printf("不能打开文件 c:\\ex87_2.txt"); exit(1); } while((ch=fgetc(fp1))!=EOF) { fputc(ch,fp2); } fclose(fp1); fclose(fp2); printf("操作成功,请打开 c:\\ex87_2.txt 查看结果"); } 第八章 文件(2) /* 8.8从文件 ex88_1.txt 中取出成绩,排序后,按降序存放 EX88_2.TXT 中 */ #include "stdio.h" #define N 10 struct student { int num; char name[20]; int score[3]; /*不能使用 float*/ float average; }; void sort(struct student stu[]); void print(FILE *fp, struct student stu[]); void printtopfive(FILE *fp, struct student stu[]); void main() { struct student s[N]; int i; FILE *fp1,*fp2; char ch; if((fp1=fopen("c:\\ex88_1.txt","r"))==NULL) { printf("不能打开文件 c:\\ex88_1.txt"); exit(1); } if((fp2=fopen("c:\\ex88_2.txt","w"))==NULL) { printf("不能打开文件 c:\\ex88_2.txt"); exit(1); } for(i=0;i<N;i++) { fscanf(fp1,"%d%s%d%d%d",&s[i].num,s[i].name,&s[i].score[0],

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 25 of 29

Page 26: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

&s[i].score[1],&s[i].score[2]); s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0; } fprintf(fp2,"原始成绩报表\n"); print(fp2,s); sort(s); fprintf(fp2,"排序之后的成绩报表\n"); print(fp2,s); fprintf(fp2,"前五名成绩报表\n"); printtopfive(fp2,s); } void sort(struct student stu[]) { int i,k,j; struct student t; for(i=0;i<N-1;i++) { k=i; for(j=i+1;j<N;j++) { if(stu[k].average<stu[j].average) k=j; if(k!=i) { t=stu[i]; stu[i]=stu[k]; stu[k]=t; } } } } void print(FILE *fp, struct student stu[]) { int i; fprintf(fp,"StudentID StudentName Score1 Score2 Score3 Average\n"); for(i=0;i<N;i++) fprintf(fp,"%-10d%-12s%8d%8d%8d%8.1f\n",stu[i].num,stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average); } void printtopfive(FILE *fp, struct student stu[]) { int i; fprintf(fp,"StudentName Average\n"); for(i=0;i<5;i++) fprintf(fp,"%-12s%8.1f\n",stu[i].name,stu[i].average);

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 26 of 29

Page 27: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

} /*ex88_1.txt 中取出成绩? 20001 姓名(1) 70 80 90 20002 姓名(2) 71 81 91 20003 姓名(3) 72 82 92 20004 姓名(4) 73 83 93 20005 姓名(5) 74 84 94 20006 姓名(6) 75 85 95 20007 姓名(7) 76 86 96 20008 姓名(8) 77 87 97 20009 姓名(9) 78 88 98 20010 姓名(10) 79 89 99 */ /*排序后,按降序存放 EX88_2.TXT 中 原始成绩报表 StudentID StudentName Score1 Score2 Score3 Average 20001 姓名(1) 70 80 90 80.0 20002 姓名(2) 71 81 91 81.0 20003 姓名(3) 72 82 92 82.0 20004 姓名(4) 73 83 93 83.0 20005 姓名(5) 74 84 94 84.0 20006 姓名(6) 75 85 95 85.0 20007 姓名(7) 76 86 96 86.0 20008 姓名(8) 77 87 97 87.0 20009 姓名(9) 78 88 98 88.0 20010 姓名(10) 79 89 99 89.0 排序之后的成绩报表 StudentID StudentName Score1 Score2 Score3 Average 20010 姓名(10) 79 89 99 89.0 20009 姓名(9) 78 88 98 88.0 20008 姓名(8) 77 87 97 87.0 20007 姓名(7) 76 86 96 86.0 20006 姓名(6) 75 85 95 85.0 20005 姓名(5) 74 84 94 84.0 */ 实验相关事项 实验报告首页内容: 课程:C 语言程序设计。(不要填写 C 语言,C 程序设计,C) 专业班号: ***。(自然班) 组别:填写序号。(分配的编号 1,2,3,..) 姓名:填写姓名。 学号:填写学号。 同组者:“无”。 第几页共几页请别忘记填写(所有页都需要填写)。 实验日期:上机的日期。 交报告日期:一般填写上机的日期或者下周上机日期。 报告退发:不填写。

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 27 of 29

Page 28: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

实验报告的内容(参考实验指导书最后一页的说明): 实验序号(实验编号)(必须填写) 实验题目,(不能简写) 实验目的,(必须填写) 实验内容,(必须填写) 源程序(代码),(必须填写) 实验步骤和结果(实验数据和运行结果),(必须填写) 总结(小结,心得)。(必须填写) 注意: 1 请把报告订在一起,或粘在一起,以免丢失。 2 不合格的报告一律重写,直到合格为止。 3 延期上交的报告一律酌情另行扣分(可以提前交报告)。 4 返工的报告一律酌情另行扣分。 5 报告内容不完整的酌情另行扣分。 6 抄袭报告的酌情另行扣分。 7 使用实验报告专用纸。 8 实验课要携带实验报告纸,边做实验,边写报告。 9 上机之前,写好程序;上机时调试程序;调试成功写实验报告。 实验结束时: 1 收拾好自己的随身物品,不要遗忘手机,mp3,mp4,U 盘,存储卡等物品。 2 关闭计算机(不要让其重新启动)。 3 放好凳子和键盘。把凳子和键盘放在桌子下面。 2009 学年要求掌握的例题和习题 要求掌握的例题和习题 (2009 学年包含但不限于以下内容)。 第 1 章 概述 第 2 章 基本数据类型、运算符及表达式 习题:2.7, 2.8, 2.11, 2.12, 2.13, 2.14, 2.15 第 3 章 基本结构程序设计 例题: 例 3.3, 例 3.4, 例 3.9, 例 3.11, 例 3.12, 例 3.14, 例 3.16, 例 3.17, 例 3.18, 例 3.19, 例 3.21, 例 3.23, 例3.24 习题:3.5,3.6,3.7,3.9,3.10,3.13,3.14,3.15 第 4 章 数组 例题:例 4.3, 例 4.5, 例 4.7, 例 4.11, 例 4.12 习题:4.14,4.13,4.15,4.16,4.19 第 5 章 函数 例题:例 5.1, 例 5.4, 例 5.5, 例 5.6, 例 5.10, 例 5.11 习题:5.6,5.8,5.9,5.12 第 6 章 结构体与公用体 例题:例 6.1, 例 6.4 习题:6.3,6.4,6.9 第 7 章 指针 例题:例 7.2,例 7.5, 例 7.6, 例 7.7, 例 7.13, 例 7.19 例 7.21 习题:7.13,7.15,7.16,7.19 第八章 文件 例题:例 8.1, 例 8.3, 例 8.5, 例 8.6, 例 8.7, 例 8.8 习题:8.5,8.7,8.8

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 28 of 29

Page 29: C 语言程序设计 练习题参考答案 · c 语言程序设计 练习题参考答案 第一章 概述..... 2

2009 学年试卷结构 1、填空(10 题,2 分/题)20 分 2、阅读程序写运行结果(7 小题,5 分/题)35 分 3、补充程序题(8 空,2 分/空,补充函数或主程序 1 题,4 分)20 分 4、程序改错题(错误点 5 个)10 分 5、编程题(2 小题)15 分(5+10) 每套试卷要求覆盖的知识点(三大基本程序结构、函数、数组、指针、文件、结构体)

http://emanlee.cnblogs.com Version 1.0 2010-04-05 仅供参考 Page 29 of 29