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

C语言程序设计答案(第三版)杜友福版


C 语言程序设计(第三版)习题答案 习题一 一、名词解释 (1)程序 P1 (2)程序设计 P1 (5)汇编程序 P3 (6)编译程序 P4 法 P10

(3)机器语言 P1 (7)算法 P5

(4)高级语言 P2 (8)结构化程序设计方

二、简答题 1. 设计程序时应遵循哪些基本原则?P4 答:正确性、可靠性、简明性、有效性、可维护性、可移植性。 2. 算法具有哪些特点? 答:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。 3. 算法的表示形式有哪几种? 答:自然语言、伪代码、传统流程图、N-S 流程图、计算机语言。 4. 结构化程序设计方法的三种基本结构是什么? 答:顺序结构、选择结构和循环结构。 5. 传统流程图与 N-S 流程图最大的区别是什么? 答: 流程图去掉了在传统流程图中常用的流程线, N-S 使得程序的结构显得更加清晰、 简单。 三、用传统流程图或 N-S 流程图表示求解以下问题的算法。 1. 从键盘输入 10 个整数,求出其中的最小数并输出。

2. 求 1+2+3+?+100 的值。

3. 求 10~50 的所有素数之和。

4. 求下列分段函数的值。

四、请参照本章例题,编写一个简单的 C 程序,输出以下三行信息。 ************************** Yangtze University ************************** #include <stdio.h> void main() { printf("**************************\n"); printf(" Yangtze University\n");

printf("**************************\n"); } 习题二 一、选择题 1~10: B C D C D D B C A A 11~20: D A C D B D B A C D 二、填空题 1.字母 L 或字母 l 2. %c(或字符) 、 %d(或整数) 3.在程序运行过程中,其值可以在一定的范围内变化的量 4. '\0' 5.小数形式、指数形式 6.关键字、预定义标识符、用户标识符 7.字母、数字、下划线、数字 8. 18 9. 2 、 1 、 30 10.双精度实数或 double 11.赋值、逗号、 20 、 20 、 20 、 4 12. 4 、 4 习题三 一、选择题 1~10: B C C B C C C D C C 注:第 4 题答案 D 为: 10 22↙ 33↙ 二、填空题 1. printf 、 scanf 2. h 3. "%5d" 4. '\0' 5. e 、 E 6. 6 7. 8. 9. 10. s * i 、 、 c +

三、编程题 1. 编写程序,从键盘输入一个以秒为单位的时间数,将其换算成几小时几分几秒,然后进 行输出。例如输入的时间为 4258 秒,则输出结果为:1 小时 10 分 58 秒。 #include <stdio.h>

void main() { int x,h,m,s; scanf("%d",&x); h=x/3600; m=x%3600/60; s=x%60; printf("%ds=%d:%d:%d!\n",x,h,m,s); } 2. 编写程序,读入三个整数给变量 a、b、c,然后交换它们中的数,把 a 中原来的值给 b, 把 b 中原来的值给 c,把 c 中原来的值给 a。 #include <stdio.h> void main() { int a,b,c,t; printf("input a b c:"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d\n",a,b,c); t=a;a=c;c=b;b=t; printf("a=%d,b=%d,c=%d\n",a,b,c); } 习题四 一、填空题 1. 1 、 0 2. !%+<= != && || = 3. x==0 4. 0 、 2 5. 20 、 0 、 0 二、选择题 1~7:D D C A D D C 三、程序阅读题 1. 595959 2. 0.500000 3. 1 4. 2 5. 6 6. a=2,b=1 7. pass warn 8. 1 四、编程题 1. 设 a 为整型变量且其值大于零,请将以下 if 语句改写成 switch 语句。

if(a<60) m=1; else if(a<70) m=2; else if(a<80) m=3; else if(a<90) m=4; else m=5; 方法 1 #include <stdio.h> void main() { int a,m; scanf("%d",&a); switch(a/10) { case 0:case 1:case 2:case 3: case 4:case 5:m=1;break; case 6:m=2;break; case 7:m=3;break; case 8:m=4;break; default:m=5;break; } printf("m=%d\n",m); } 方法 2 #include <stdio.h> void main() { int a,m; scanf("%d",&a); m=0; switch(a/10) { default:m++; case 8:m++; case 7:m++; case 6:m++; case 5:case 4:case 3:case 2: case 1:case 0:m++; } printf("m=%d\n",m); } 2. 编写程序,从键盘输入一个整数,打印出它是奇数还是偶数。 #include <stdio.h> void main() {

int a; scanf("%d",&a); if(a%2==1) printf("%d is a odd number!\n",a); else printf("%d is a even number!\n",a); } 3. 编写程序,从键盘输入一个字符,判别它是否是小写字母,如果是,将它转换为大写字 母;如果不是,不转换。然后输出最后得到的字符。 #include <stdio.h> void main() { char ch; scanf("%c",&ch); if(ch>='a' && ch<='z') ch=ch-32; printf("%c\n",ch); } 4. 编写程序,从键盘输入一个不多于 4 位的正整数,打印出它是几位数。 #include <stdio.h> void main() { int x,n; scanf("%d",&x); if(x>1000) n=4; else if(x>100) n=3; else if(x>10) n=2; else n=1; printf("%d\n",n); } 5. 当一个人的月收入在 3500 元以下时免税; 月收入在 3500 元到 5000 元之间时, 超过 3500 的部分纳税 3%;月收入在 5000 元以上时,3500 至 5000 之间的部分纳税 3%,超过 5000 的 部分纳税 10%。编写程序从键盘输入月收入 income,计算并输出应交税款 tax。 #include <stdio.h> void main() { int income; float tax; scanf("%d",&income); if(income<=3500) tax=0; else if(income<=5000) tax=0.03*(income-3500); else tax=0.03*(5000-3500)+0.10*(income-5000); printf("tax=%f\n",tax); }

6. 回文是指正读和反读都一样的数或字符串。例如:12321、55455、35553 等都是回文。 请编写一个程序, 从键盘上读取一个包含五位数字的长整数, 并判断它是否是回文。 (提示: 用除法运算和求余运算把一个数的个位、十位、百位、千位等分别分离出来。 ) #include <stdio.h> void main() { long x; int a,b,d,e; scanf("%ld",&x); a=x/10000; b=x%10000/1000; d=x%100/10; e=x%10; if(a==e && b==d) printf("%ld is huiwen!\n",x); else printf("%ld is not huiwen!\n",x); } 习题五 一、阅读题 1. 8 2. 4321 3. X 4. -1 5. 23 6. 52 7. 5 8. 3 二、填空题 1. 18 2. 2 3. b=i+1 4. 17 5. i<=9 6. d=1.0

、 、

j%3!=0 k=k+1



k<=10

三、选择题 1~8:A D D A B D D A 四、编程题 1. 编写程序,打印出所有的“水仙花数” ,所谓“水仙花数”是指一个三位数,其各位数字 的立方之和等于该数本身。例如,407 是一个“水仙花数” ,因为 407=43+03+73。 (注:若

将题意改为打印出最大的或最小的“水仙花数” ,则应将循环语句作如何调整?) 。 #include <stdio.h> void main() { int a,b,c,k; for(k=100;k<=999;k++) //求最大的“水仙花数”改用:for(k=999;k>=100;k--) { a=k/100;b=k/10%10;c=k%10; if(k==a*a*a+b*b*b+c*c*c) { printf("%5d",k); //求最大或最小”水仙花数”时增加一个语句:break; } } printf("\n"); } 2. 编写程序,输出 1980~2880 年所有闰年的年号。每输出 5 个年号换一行。 #include <stdio.h> void main() { int k,flag,n=0; for(k=1980;k<=2880;k++) { flag=(k%4==0)&&(k%100!=0)||(k%400==0); if(flag) { printf("%5d",k); n++; if(n%10==0) printf("\n"); } } printf("\n"); } 3. 编写程序,求 1-3+5-7+?-99+101 的值。 #include <stdio.h> void main() { int n,t=1,s=1; for(n=3;n<=101;n+=2) { t=-t; s=s+t*n; } printf("s=%d\n",s); }

4. 编写程序,计算并输出下列级数的前 n 项之和 Sn。n 的值从键盘输入。 #include <stdio.h> void main() { int fz,fm,n,i; float s,t; fz=2;fm=1;s=0; scanf("%d",&n); for(i=1;i<=n;i++) { t=(1.0*fz)/fm; s=s+t; fz=fz+fm; fm=fz-fm; } printf("s=%f\n",s); } 5.编写程序,求 e 的值 e=1+1/1!+1/2!+1/3!+1/4!+?+1/n! #include <stdio.h> void main() { int n,i; float t,fm=1,e=1; scanf("%d",&n); for(i=1;i<=n;i++) { fm=fm*i; t=1.0/fm; e=e+t; } printf("n=%d,e=%f\n",n,e); } 6. 已知某球从 80 米高度自由落下, 落地后反复弹起, 每次弹起的高度都是上次高度的一半。 求此球 8 次落地所经过的总路程。 #include <stdio.h> void main() { int n; float s=80,h=s/2; for(n=2;n<=8;n++) { s=s+2*h; h=h/2; } printf("s=%f\n",s); } 7. 用牛顿迭代法求高次方程 f(x)=2x3-4x2+5x-18=0 的根(约为 2.466) 。

注:牛顿迭代公式为:x2=x1-f(x1)/f’(x1),其中 f’(x1)为导函数在点 x1 的值。 #include <stdio.h> #include <math.h> void main() { float x,f,f1; x=8; do { f=2*x*x*x-4*x*x+5*x-18; f1=6*x*x-8*x+5; x=x-f/f1; }while(fabs(f)>0.00001); printf("x=%f,f=%f\n",x,f); } 8. 有这样一些真分数:其分子和分母都是两位正整数,且分子的个位数与分母的十位数相 同, 如果把该分数的分子的个位数与分母的十位数同时去掉, 所得到的新的分数正好与原分 数的值相等,如 26/65=2/5。试编程求出所有满足上述条件的真分数。 #include <stdio.h> void main() { int a,b,c; // 设这个分数为 ab/bc for(a=1;a<=9;a++) for(b=1;b<=9;b++) for(c=1;c<=9;c++) if((a<c)&&(1.0*a/c==(a*10.0+b)/(b*10.0+c))) printf("%d/%d=%d%d/%d%d=%f\n",a,c,a,b,b,c,1.0*a/c); } 9. 编写程序, 求数列: (1+1/2) 1+1/2+1/3) 1+1/2+1/3+1/4) 1+1/2+1/3+1/4+1/5) 1, ( , ( , ( , ,? 的前 10 项之和。 #include <stdio.h> void main() { float s,t; int i; s=0,t=0; for(i=1;i<=10;i++) { t=t+1.0/i; s=s+t; } printf("s=%f\n",s); } 10. 编写程序,求 3 到 100 之间的所有素数之和。 #include <stdio.h> void main() { int s,i,k,flag; s=0; for(i=3;i<=100;i++) // x 的初值可为任意值

{ flag=1; for(k=2;k<i;k++) if(i%k==0) { flag=0; break; } if(flag) { s=s+i; printf("%4d",i); } } printf("\nsum=%d\n",s); } 11. 编写程序,求 Fibonacci 数列中大于 800 的最小的一个数(结果为 987)。 #include <stdio.h> void main() { int f1=1,f2=1,f3; while(f3<=800) { f3=f1+f2; f1=f2; f2=f3; } printf("Fibonacci 数列中大于 800 的最小数是%5d\n",f3); } 习题六 一、选择题 1~10:D D C B A B C D C D 11~20:A B B C C D C A B B 21~30:B B D D D D C D C A 注:第 16 题答案 C 为:字符串"SHORT"与"SHORT "相等 第 19 题题目为:已知:char str1[10],str2[10]={"books"};则在程序中能够将字符串 "books"赋给数组 str1 的正确语句是。 第 21 题题目为:设有:char str1[20]="abcde",str2[20]="xyz";则执行语句: printf("%d",strlen(strcpy(str1,str2)); 的结果是。 第 28 题答案 D 为: aaaa bbbb cccc dddd 二、填空题 1. 9 、 2.先行后列 3.字符数组 4. QuickC

0

5. 6. 7. 8. 9. 1 0 1 0 0 0 0 0 0 10. 11. 12.

(c=getchar( )) 、 'A'+i 或 65+i '\0' 、 str1[i]-str2[i] CDABC 6 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 600 AzyD 4 some string *test

三、编程题 1. 定义一个有 20 个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。 #include <stdio.h> #include <math.h> void main() { int i,s0=0,s1=0,a[20]; for(i=0;i<20;i++) a[i]=rand()%100; for(i=0;i<20;i+=2) { printf("%3d",a[i]); s0=s0+a[i]; } printf(" sum is:%d ave=%f\n",s0,s0/10.0); for(i=1;i<20;i+=2) { printf("%3d",a[i]); s1=s1+a[i]; } printf(" sum is:%d ave=%f\n",s1,s1/10.0); } 2. 设有一个整型数组, 另输入一个整数, 编程查找这个整数是否在数组中出现过, 若出现, 则输出第一次出现的位置,否则,输出 no found。 #include <stdio.h> #include <math.h> void main() { int i,s,a[20]; for(i=0;i<20;i++) a[i]=rand()%100; scanf("%d",&s); for(i=0;i<20;i++) if(a[i]==s) { printf("found:a[%d]=%d\n",i,a[i]);

break;

}

if(i==20) printf("no found\n"); for(i=0;i<20;i++) printf("%3d",a[i]); printf("\n"); } 3. 设有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入到数组中。 #include <stdio.h> #define N 10 void main() { int i,j,s; //int a[N]={1,3,5,7,9,11,13,15,17}; int a[N]={17,15,13,11,9,7,5,3,1}; scanf("%d",&s); i=0; if(a[0]<a[1]) while(s>a[i]) i++; else while(s<a[i]) i++; for(j=N-1;j>i;j--) a[j]=a[j-1]; a[j]=s; for(i=0;i<N;i++) printf("%3d",a[i]); printf("\n"); } 4. 编一程序,从一个已排好序的数组中删去某个位置上的元素。 #include <stdio.h> #define N 10 void main() { int i,j; int a[N]={1,3,5,7,9,11,13,15,17,19}; for(i=0;i<N;i++) printf("%3d",a[i]); printf("\n"); scanf("%d",&i); for(j=i;j<N-1;j++) a[j]=a[j+1]; for(i=0;i<N-1;i++) printf("%3d",a[i]); printf("\n");

} 5. 将一个二维数组的行、列互换后存到另一个二维数组中并输出结果。 #include <stdio.h> void main() { int i,j; int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},b[4][3]; for(i=0;i<4;i++) for(j=0;j<3;j++) b[i][j]=a[j][i]; printf("array a:\n"); for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%5d",a[i][j]); printf("\n"); } printf("array b:\n"); for(i=0;i<4;i++) { for(j=0;j<3;j++) printf("%5d",b[i][j]); printf("\n"); } } 6. 编一程序,在一个二维数组中,查找第一次出现的负数,并输出该数及其所在的行、列 号。 #include <stdio.h> void main() { int i,j,flag; int a[3][4]={1,3,5,7,9,11,13,-15,17,19,-21,23}; flag=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(a[i][j]<0) { flag=1; printf("found:a[%d][%d]=%d\n",i,j,a[i][j]); i=j=100; //可使双重循环提前结束 } if(flag==0) printf("no found!"); printf("array a:\n");

for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%5d",a[i][j]); printf("\n"); } } 7. 编程将一个字符数组中的字母,按由大到小的顺序进行排序。 #include <stdio.h> #include <string.h> void main() { char t,s[]="ABCDIVBHFBVCNLKFDB"; int i,j,n; puts(s); n=strlen(s); for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(s[i]<s[j]) { t=s[i];s[i]=s[j];s[j]=t; } puts(s); } 8. 输入一行字符,统计其中有多少个英语单词,单词之间用空格隔开。 #include <stdio.h> #include <string.h> void main() { char s[81]; int w,i,n; gets(s); i=0;n=0;w=0; while(s[i]!='\0') { if(s[i]==' ') w=0; /*end of a word*/ else if(w==0) {w=1;n++;} /*begin of a word*/ i++; } printf("number of word:%d\n",n); } 9. 编程将两个一维数组中的对应元素的值相减后进行输出。 #include <stdio.h>

#include <math.h> void main() { int i,a[10],b[10]; for(i=0;i<10;i++) { a[i]=rand()%100; printf("%4d",a[i]); } printf("\n"); for(i=0;i<10;i++) { b[i]=rand()%100; printf("%4d",b[i]); } printf("\n"); for(i=0;i<10;i++) printf("%4d",a[i]-b[i]); printf("\n"); } 10. 有 n 个无序的数放在数组 a 中,请将相同的那些数删得只剩得一个,输出经过删除后的 数据。 #include <stdio.h> void main() { int i,j,k,a[10]={90,20,40,30,50,50,50,50,20,80}; for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n"); for(i=0;i<9;i++) for(j=i+1;j<10;j++) if(a[j]==a[i]) { a[j]=-888; } k=0; for(i=0;i<10;i++) if(a[i]!=-888) { printf("%4d",a[i]); a[k++]=a[i]; } //不相同的有效元素只有 K 个了 printf("\n"); } 11. 求二维数组中这样一个元素的位置:它在行上最小,在列上也最小。如果没有这样的元 素则输出相应的信息。 #include <stdio.h> #include <math.h> void main() { int j,i,k,flag,fz=0,a[4][5]; for(i=0;i<4;i++)

{ for(j=0;j<5;j++) { a[i][j]=rand()%100; printf("%4d",a[i][j]); } printf("\n"); } for(i=0;i<4;i++) { for(j=0;j<5;j++) { flag=1; for(k=0;k<5;k++) if(a[i][k]<a[i][j]) { flag=0;break; } for(k=0;k<4&&flag;k++) if(a[k][j]<a[i][j]) { flag=0;break; } if(flag) { fz++; printf("min a[%d][%d]=%d\n",i,j,a[i][j]); } } } if(fz==0) printf("no found!"); } 12. 在一个二维数组中形成并输出如下矩阵: 1 1 1 1 1 2 1 1 1 1 A= 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 #include <stdio.h> #define N 5 void main() { int j,i,a[N][N]; for(i=0;i<N;i++) for(j=0;j<N;j++) { if(i<=j) a[i][j]=1; else if(j==0) a[i][j]=i+1;

else a[i][j]=a[i-1][j-1]; } for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%4d",a[i][j]); printf("\n"); } } 13. 已知 A 是一个 3╳4 的矩阵,B 是一个 4╳5 的矩阵,编程求 A╳B 得到的新矩阵 C,并 输出 C 矩阵。 #include <stdio.h> void main() { int j,i,k,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int b[4][5]={3,2,1,5,4,4,3,2,5,1,2,3,5,4,1,7,8,5,6,9},c[3][5]; printf("array A(3*4):\n"); for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%4d",a[i][j]); printf("\n"); } printf("array B(4*5):\n"); for(i=0;i<4;i++) { for(j=0;j<5;j++) printf("%4d",b[i][j]); printf("\n"); } for(i=0;i<3;i++) for(j=0;j<5;j++) { c[i][j]=0; for(k=0;k<4;k++) c[i][j]+=a[i][k]*b[k][j]; } printf("array C(3*5)=A * B:\n"); for(i=0;i<3;i++) { for(j=0;j<5;j++) printf("%4d",c[i][j]); printf("\n");

} } 14. 编程输出两个字符串中对应位置上相同的字符。 #include <stdio.h> void main() { int i; char a[81]="acbsbdvhfejbvewvkbewljbv"; char b[81]="anbdxwdbviuerkjvbfidbvuie bik"; printf("string1: %s\n",a); printf("string2: %s\n",b); printf("string3: "); i=0; while(a[i]!='\0' && b[i]!='\0') { if(a[i]==b[i]) printf("%c",a[i]); i++; } printf("\n"); } 15. 设有一字符串已按升序排列在字符数组 a 中, 请将另一字符串 b 中的字符按升序的规律 插到数组 a 中。 #include <stdio.h> #include "string.h" void main() { int i,j,k; char a[81]="acdfhjklmopxz"; char b[81]="anbdx"; printf("string1: %s\n",a); printf("string2: %s\n",b); i=0; while(b[i]!='\0') { j=0; while(a[j]<b[i]&&a[j]!='\0') j++; k=strlen(a); while(k>=j) { a[k+1]=a[k];k--; } a[j]=b[i]; i++; }

printf("string3: %s\n",a); } 16. 将已按升序排列的两个字符串 a 和 b 中的字符按升序归并到字符数组 c 中。 #include <stdio.h> #include "string.h" void main() { int i,j,k; char a[81]="acdfhjklmopxz"; char b[81]="abdnx"; char c[81]; printf("string1: %s\n",a); printf("string2: %s\n",b); i=0;j=0;k=0; while(a[i]!='\0'&&b[j]!='\0') { if(a[i]<b[j]) c[k++]=a[i++]; else c[k++]=b[j++]; } while(a[i]) c[k++]=a[i++]; while(b[j]) c[k++]=b[j++]; c[k]='\0'; printf("string3: %s\n",c); }

习题七 一、选择题 1~10:D C D B D B C A A B 11~19:B B A B A D A B A 二、填空题 1. 声明 2. 自动将其转换为函数定义时的类型 3. 10 4. i<=n 、 s 、 0 、 5. Itis 6. 2721 7. 0246 8. k 、 -1

f(k)

9. 10. 11. 12. 13. 14.

2

、 2 p=j 、 x[i][p] 、 LineMax(x) 5 24 age(n-1)+2 、 age(n) m%10 、 m/10 、 m 或 m!=0

、 r(m)

三、编程题 1. 编一函数,判断某年是否为闰年,若是返回 1,否则返回 0。 #include <stdio.h> int fun(int m) { return (m%4==0)&&(m%100!=0)||(m%400==0); } void main() { int n; scanf("%d",&n); if(fun(n)) printf("year:%d is a leap!\n",n); } 2. 编写计算三角形面积的程序,将计算面积定义成函数。三角形面积公式为: A= 式中 s=(a+b+c)/2 其中 A 为三角形面积,a、b、c 为三角形的三条边的长度。 #include <math.h> #include <stdio.h> float fun(float a,float b,float c) { float f,s; s=(a+b+c)/2; if((s<=a)||(s<=b)||(s<=c)) //或(a+b)>c&&(a+c)>b&&(b+c)>a f=0; else f=sqrt(s*(s-a)*(s-b)*(s-c)); return f; } void main() { float a,b,c; scanf("%f%f%f",&a,&b,&c); printf("area is:%f\n",fun(a,b,c)); } 3. 编写两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两个函 数,并输出 结果,两个整数由键盘输入。 #include <math.h>

#include <stdio.h> int fmax(int m,int n) { int r; r=m%n; while(r!=0) { m=n;n=r;r=m%n; } return n; } int fmin(int m,int n) { return m*n/fmax(m,n); } void main() { int a,b; scanf("%d%d",&a,&b); printf("fmax is:%d\n",fmax(a,b)); printf("fmin is:%d\n",fmin(a,b)); } 4. 编写函数,根据整型形参 m 的值,计算公式 t=1- - -?- 的值。例如,若 m=5,则应输出 0.536389。 #include <stdio.h> float fun(int m) { float t=1.0; int i; for(i=2;i<=m;i++) t=t-1.0/i/i; return t; } void main() { int m; scanf("%d",&m); printf("t(%d)=%f\n",m,fun(m)); } 5. 计算 s=1+ + +?+ 。n 由终端输入,将计算 n!定义成函数。 #include <stdio.h> float fun(int m) { int i; float s=0.0,t=1.0; for(i=1;i<=m;i++) { t=t/i; s=s+t; } return s;

} void main() { int n; scanf("%d",&n); printf("s(%d)=%f\n",n,fun(n)); } 6. 编写函数,利用公式: 计算π 的近似值,当某一项的值小于 10-5 时,认为达到精度要求。 #include <stdio.h> double fun() { int n; double pi=1,t=1; n=1; do { t=t*n/(2*n+1); pi=pi+t; n++; }while(t>1e-5); return 2*pi; } void main() { printf("pi=%f\n",fun()); } 7. 编一函数,判断某一整数是否为回文数,若是返回 1,否则返回 0。所谓回文数就是该数 正读与反读是一样的。例如 12321 就是一个回文数。 #include <stdio.h> #include <math.h> int huiwen(int m) { int t,n=0; t=m; while(t) { n++; t=t/10; } //求出 M 是几位的数 t=m; while(t) { if(t/(int)pow(10,n-1)!=t%10) //比较其最高位和最低位 return 0; else { t=t%(int)pow(10,n-1); //去掉其最高位

t=t/10; n=n-2; } } return 1; } void main() { int x; scanf("%d",&x); if(huiwen(x)) printf("%d is a huiwen!\n",x); else printf("%d is not a huiwen!\n",x); }

//去掉其最低位 //位数去掉了两位

8. 编写一个求水仙花数的函数,然后通过主函数调用该函数求 100 到 999 之间的全部水仙 花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。 例如:153 就是一个水仙花数:153=1*1*1+5*5*5+3*3*3 #include <stdio.h> #include <math.h> int fun8(int m) { int a,b,c; a=m/100; b=m/10%10; c=m%10; if(m==a*a*a+b*b*b+c*c*c) return 1; else return 0; } void main() { int i; for(i=100;i<=999;i++) if(fun8(i)) printf("%5d",i); printf("\n"); } 9. 编一函数 primedec(m),求整数 m 的所有因子并输出。例如:120 的因子为:2,2,2,3, 5。 #include <stdio.h> #include <math.h> void primedec(int m) { int n=2;

while(m>1) { while(m%n==0) { printf("%d ",n);m=m/n; } n++; } printf("\n"); } void main() { int x; scanf("%d",&x); primedec(x); } 10. 求 100~200 之间的所有素数,按每行 6 个输出。 #include <stdio.h> #include <math.h> int prime(int m) { int n,f=1; for(n=2;n<m;n++) if(m%n==0) { f=0;break; } return f; } void main() { int x,n=0; for(x=100;x<=200;x++) if(prime(x)) { n++; printf("%5d",x); if(n%6==0) printf("\n"); } printf("\n"); } 11. 编一函数,求末尾数非 0 的正整数的逆序数,如:reverse(3407)=7043。 #include <stdio.h> #include <math.h> int reverse(int m) { int x=0; while(m)

{ x=x*10+m%10; m=m/10; } return x; } void main() { int w; scanf("%d",&w); printf("%d==>%d\n",w,reverse(w)); } 12. 编一函数,将一个字符数组中的数字字符存于另一个字符数组中。 #include <stdio.h> #include <string.h> void fun12(char a[],char b[]) { int i=0,j; for(j=0;j<strlen(b);j++) if(b[j]>='0'&&b[j]<='9') a[i++]=b[j]; a[i]='\0'; } void main() { char s1[81],s2[81]; gets(s2); fun12(s1,s2); puts(s2);puts(s1); } 13. 编一函数,统计一个字符串中字母、数字、空格和其它字符的个数。 #include <stdio.h> #include <string.h> void fun13(char s[]) { int i,num=0,ch=0,sp=0,oh=0; char c; for(i=0;(c=s[i])!='\0';i++) if(c==' ') sp++; else if(c>='0'&&c<='9') num++; else if(toupper(c)>='A' && toupper(c)<='Z') ch++; else oh++; printf("char:%d,number:%d,space:%d,other:%d\n",ch,num,sp,oh); }

void main() { char s1[81]; gets(s1); fun13(s1); } 14. 用递归的方法实现求 1+2+3+?+n。 #include <stdio.h> #include <string.h> int fun14(int m) { int w; if(m==1) w=1; else w=fun14(m-1)+m; return w; } void main() { int x,i; scanf("%d",&x); printf("1+2+...+%d=%d\n",x,fun14(x)); } 15. 用递归的方法将一个整数转换成字符串。例如:输入 345,应输出字符串“345” 。 #include <stdio.h> #include <string.h> void fun15(int m) { if(m!=0) { fun15(m/10); printf("%c ",'0'+m%10); } } void main() { int x; scanf("%d",&x); printf("%d==>",x); fun15(x); printf("\n"); }

16. 采用递归的方法计算 x 的 n 次方。 #include <stdio.h> #include <math.h> float p(float x,int n) { float f; if(n==0) f=1; else f=p(x,n-1)*x; return f; } void main() { float x; int n; scanf("%f%d",&x,&n); printf("p(%f,%d)=%f",x,n,p(x,n)); } 习题八 一、选择题 1~10: A D B C C A B D B A 11~14: B C C D 二、填空题 1. 从定义点到函数体(或复合语句)结束 2. auto 3. ①局部、②全局 4. ①外部、②内部 5. 2,5,1,2,3,-2 6. a=5 a*a=25 a*a*a=8 7. add:y=25;sub:y=5;main:x=25;main:y=10

习题九 一、选择题 1~8: D C B C A B B B 二、填空题

1. 2. 3.

1000 10 11 011

三、编程题 1. 定义一个带参的宏,求两个整数的余数。通过宏调用,输出求得的结果。 #define R(m,n) (m)%(n) #include <stdio.h> void main() { int m,n; printf("enter two integers:\n"); scanf("%d%d",&m,&n); printf("remainder=%d\n",R(m,n)); } 2. 分别用函数和带参的宏,从 3 个数中找出最大者。 #include <stdio.h> #define MAX(a,b) ((a)>(b)?(a):(b)) // implementation by MACRO int max3(int a,int b,int c) //implementation by function { int m; m=a>b?a:b; m=m>c?m:c; return m; } void main() { int m,n,k; printf("enter 3 integer:\n"); scanf("%d%d%d",&m,&n,&k); printf("1. MACRO max=%d\n",MAX(MAX(m,n),k)); printf("2. function max=%d\n",max3(m,n,k)); } 3. 输入一个整数 m,判断它能否被 3 整除。要求利用带参的宏实现。 #include <stdio.h> #define DIVIDEDBY3(m) (m)%3==0 void main() { int m; printf("enter a integer:\n"); scanf("%d",&m); if(DIVIDEDBY3(m)) printf("%d is divided by 3\n",m); else

printf("%d is not divided by 3\n",m); } 习题十 一、填空题 1. 首地址 2. 0 3. 1) int *p=&k; 2) *p=6; 3) int **pp; 4) pp=&p; 5) (**pp)*=2; 4. 5. 整型数组名、指向整型数据的指针值 *(++p)

二、选择题 1~10: B C A D C A A A B B 11~15: C B C D C 16: ① B ② B ③ C 17: ① B ② D 18: ① B ② A ③ C 19~21: B A C 三、编程题 1. 编写函数,对传递进来的两个整型量计算它们的和与积之后,通过参数返回。 #include <stdio.h> void compute(int m,int n,int *sum,int *p) { *sum=m+n; *p=m*n; } void main() { int x,y,sum,product; printf("enter 2 integers:\n"); scanf("%d%d",&x,&y); compute(x,y,&sum,&product); printf("x=%d y=%d sum=%d product=%d\n",x,y,sum,product); } 2. 编写一个程序,将用户输入的字符串中的所有数字提取出来。 #include <stdio.h> #include <string.h> void main() {

char string[81],digit[81]; char *ps; int i=0; printf("enter a string:\n"); gets(string); ps=string; while(*ps!='\0') { if(*ps>='0' && *ps<='9') { digit[i]=*ps; i++; } ps++; } digit[i]='\0'; printf("string=%s digit=%s\n",string,digit); } 3. 编写函数实现,计算字符串的串长。 #include <stdio.h> #include <string.h> int StringLength(char *s) { int k; for(k=0;*s++;k++); return k; } void main() { char string[81]; printf("enter a string:\n"); gets(string); printf("length of the string=%d\n",StringLength(string)); } 4. 编写函数实现,将一个字符串中的字母全部转换为大写。 #include <stdio.h> #include <string.h> char *Upper(char *s) { char *ps; ps=s; while(*ps) { if(*ps>='a' && *ps<='z')

*ps=*ps-32; ps++; } return s; } void main() { char string[81]; printf("enter a string:\n"); gets(string); printf("before convert: string=%s\n",string); printf(" after convert: string=%s\n",Upper(string)); } 5. 编写函数实现,计算一个字符在一个字符串中出现的次数。 #include <stdio.h> #include <string.h> int Occur(char *s, char c) { int k=0; while(*s) { if(*s==c) k++; s++; } return k; } void main() { char string[81],c; printf("enter a string:\n"); gets(string); printf("enter a character:\n"); c=getchar(); printf("character %c occurs %d times in string %s\n", c,Occur(string,c),string); } 6. 编写函数实现,判断一个子字符串是否在某个给定的字符串中出现。 #include <stdio.h> #include <string.h> int IsSubstring(char *str,char *substr) { int i,j,k,num=0; for(i=0;str[i]!='\0' && num==0;i++)

{ for(j=i,k=0;substr[k]==str[j];k++,j++) if(substr[k+1]=='\0') { num=1; break; } } return num; } void main() { char string[81],sub[81]; printf("enter first string:\n"); gets(string); printf("enter second string:\n"); gets(sub); printf("string '%s' is ",sub); if(!IsSubstring(string,sub)) printf("not "); printf("substring of '%s'\n",string); } 7. 有 n 个人围成一圈,顺序排号。由用户从键盘输入报数的起始位置,从该人开始报数(计 数从 0 开始) ,凡报数为 3 的倍数出圈。问最后剩下的是几号? 见导学例 10.25 8. 由一个整型二维数组, 大小为 m×n, 要求找出其中最大值所在的行和列, 以及该最大值。 请编一个函数 max,数组元素在 main 函数中输入,结果在函数 max 中输出。 见导学例 10.26 9. 由 n 个学生, 每个学生考 m 门课程, 要求编一函数, 能检查 n 个学生有无不及格的课程, 如果由某一学生有一门或一门以上课程不及格,就输出该学生的号码(学号从 0 开始)和其 全部课程成绩。 见导学例 10.27 习题十一 一、选择题 1~10: A A B D D B D D D C 11~20: C B B C C 二、填空题 1.___2___、___3_ _ 2. struct node *next 3. struct link *head 4.__ A _



p->data



p->next

三、编程题 1.编写程序,进行两个复数的相减。 #include <stdio.h>

struct Complex { double m_r,m_i; }; struct Complex sub(struct Complex c1,struct Complex c2) { struct Complex c; c.m_r=c1.m_r-c2.m_r; c.m_i=c1.m_i-c2.m_i; return c; } void main() { struct Complex c1 ={1.2,2.3},c2={0.2,0.3}; struct Complex c; c=sub(c1,c2); printf(“c=%g+i%g\n”,c.m_r,c.m_i); } 2.定义一个包括年、月、日的结构体。输入一个日期,计算该日在本年中是第几天?注意 闰年问题。 #include <stdio.h> struct ymd { int day; int month; int year; }; int dayof[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int days(struct ymd *p) { int i,d; if(p->year%4==0&&p->year%100!=0||p->year%400==0) dayof[2]=29; d=p->day; for(i=1;i<p->month;i++) d=d+dayof[i]; return (d); } void main() { struct ymd date; int d; for(;;) {

printf("date(yyyy/mm/dd)=? (yyyy=0--Exit)\n\n"); scanf("%d/%d/%d",&date.year,&date.month,&date.day); if(date.year==0) break; d=days(&date); printf("\nThe day of the year is %d !\n\n",d); } } 3.有 10 个学生,每个学生的数据包括学号、姓名、3 门课程的成绩。从键盘输入 10 个学 生的数据,要求输出 3 门课程的总平均成绩,以及最高分的学生的学号、姓名、3 门课程成 绩、平均分数。 #include <stdio.h> #define N 10 struct student { char num[6]; char name[8]; float score[3]; float avr; }stu[N]; void main() { int i,j,maxi; float sum,max,average; 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+1); scanf("%f",&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 scorel score2 for(i=0;i<N;i++) { printf("%5s%10s",stu[i].num,stu[i].name); for(j=0;j<3;j++) printf("%9.2f",stu[i].score[j]); printf(" %8.2f\n",stu[i].avr); } printf("average=%5.2f\n",average); printf("The highest score is: student %s,%s.\n", stu[maxi].num,stu[maxi].name); printf("His scores are: %6.2f,%6.2f,%6.2f,average:%5.2.\n", stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2], stu[maxi].avr); } 4.设单向链表 head1 和 head2 已建立。编写将单向链表 head2 连接到单向链表 head1 之后 的函数,以 head1 返回,如图 11.10 所示。 /* 结点结构 Node */ struct Node { int data; struct Node *next; }; 提示:函数原型为:struct Node *link(struct Node *head1, struct Node *head2); struct Node *link(struct Node *head1,struct Node *head2) { struct Node *p,*head0; p=head1; head0=head1; while(p->next!=NULL) p=p->next; p->next=head2; score3 average\n");

return head0; } 5.有两个链表 a 和 b。设结点中包括学号、姓名。从 a 链表中删除去与 b 链表中有相同学 号的那些结点。 #include <stdio.h> #include <string.h> #define LA 4 #define LB 5 struct student { int num; char name[8]; struct student *next; }a[LA],b[LB]; void main() { struct student a[LA]={{101,"Wang"},{102,"Li"}, {105,"Zhang"},{106,"Wei"}}; struct student b[LB]={{103,"Zhang"},{104,"Ma"},{105,"Chen"}, {107,"Guo"},{108,"lui"}}; int i; struct student *p,*p1,*p2,*head1,*head2; head1=a; head2=b; printf("list A: \n"); for(p1=head1,i=1;i<=LA;i++) { if(i<LA) p1->next=a+i; else p1->next=NULL; printf("%4d%8s\n",p1->num,p1->name); if(i<LA) p1=p1->next; } printf("\nlist B:\n"); for(p2=head2,i=1;i<=LB;i++) { if(i<LB)p2->next=b+i; else p2->next=NULL; printf("%4d%8s\n",p2->num,p2->name); if(i<LB)p2=p2->next; } p1=head1; while(p1!=NULL) { p2=head2; while((p1->num!=p2->num)&&(p2->next!=NULL))

p2=p2->next; if(p1->num==p2->num) if(p1==head1) head1=p1->next; else { p->next=p1->next;p1=p1->next; } else { p=p1;p1=p1->next; } } printf("\nresult:\n"); p1=head1; while(p1!=NULL) { printf("%4d %7s \n",p1->num,p1->name); p1=p1->next; } } 习题十二 一、选择题 1~8: C B D B C A A B 二、填空题 1. 32 2.__ a&0__ 3. _ x|0xFF00_ 4. 64 三、编程题 1.取一个整数 a 从右端开始的 4~7 位。 #include <stdio.h> void main() { int num,mask; printf("Input a integer number:"); scanf("%d",&num); printf("the number:0x%x\n",num); num >>= 4; /* 右移 4 位,将 4~7 位移到低 4 位上 */ mask=~(~0<<4); /* 间接构造 1 个低 4 位为 1、其余各位为 0 的整数 */ printf("4~7:0x%x\n",num & mask); } 2.编一个将十六进制数转换成二进制形式显示的程序。 #include <stdio.h> void main()

{ int num,mask,i; printf("Input a hexadecimal number:"); scanf("%x",&num); mask=1<<15; printf("%d=",num); for(i=1;i<=16;i++) { /* 构造 1 个最高位为 1、其余各位为 0 的整数(屏蔽字) */

putchar(num&mask?'1':'0'); /* 输出最高位的值(1/0) */ num<<=1; /* 将次高位移到最高位上 */ if(i%4==0)putchar(','); /* 四位一组,用逗号分开 */ } printf("\bB\n"); } 习题十三 一、选择题 1~7: B D A B B B C 二、填空题 1. 2 、 !feof(f1) 2. fopen(filename, "w") 3. 0 、 "r" 、 4. BBBBCCCCDDDD 5. 6. 7. "w+" 、 str[i]-32 "bi.dat" 、 fp fopen 、 ftell

、 f2 、 ch !feof(fp) 、 rewind(fp)

三、编程题 1. 调用 fputs 函数,把 10 个字符串输出到文件中;再从此文件中读入这 10 个字符串放在一 个数组中;最后把字符串数组中的字符串输出到终端屏幕,以检查所有操作的正确性。 #include <stdio.h> void main() { int i; FILE *fp=fopen("test.txt","w"); char *str[10]={"One","two","three","four","five","six", "seven","eight","nine","ten"}; char str2[10][20]; if(fp==NULL) { printf("Can not open write file\n"); return; }

for(i=0;i<10;i++) { fputs(str[i],fp); fputs("\n",fp); } fclose(fp); fp=fopen("test.txt","r"); if(fp==NULL) { printf("Can not open read file\n"); return; } i=0; while(i<10&&!feof(fp)) { printf("%s",fgets(str2[i],20,fp)); i++; } } 2. 从键盘读入 10 个浮点数, 以二进制形式存入文件中。 再从文件中读出数据显示在屏幕上。 修改文件中第四个数据。再从文件中读出数据显示在屏幕上,以验证修改的正确性。 #include <stdio.h> void ctfb(FILE *fp) { int i; float x; for(i=0;i<10;i++) { scanf("%f",&x); fwrite(&x,sizeof(float),1,fp); } } void fbtc(FILE *fp) { float x; rewind (fp); fread(&x,sizeof(float),1,fp); while(!feof(fp)) { printf("%f ",x); fread(&x,sizeof(float),1,fp); } } void updata(FILE *fp,int n,float x)

{ fseek(fp,(long)(n-1)*sizeof(float),0); fwrite(&x,sizeof(float),1,fp); } void main() { FILE *fp; int n=4; float x; if((fp=fopen("e:file.dat","wb+"))==NULL) { printf("can't open this file\n"); exit(0); } ctfb(fp); fbtc(fp); scanf("%f",&x); updata(fp,n,x); fbtc(fp); fclose(fp); }



推荐相关:

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

C语言程序设计习题参考答案!(第二版 杜友福)_IT/计算机_专业资料。C 语言程序...编写程序,读入三个整数给变量 a、b、c,然后交换它们中的数,把 a 中原来的...


《C语言程序设计》教学大纲

第二节 算法 第三节 结构化程序设计方法 第四节 C 语言程序的基本结构 第二...六、主要参考书 1、 《C 语言程序设计》第一版,杜友福主编,科学出版社,2004...

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