为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C语言同步练习册答案

2018-08-07 50页 doc 153KB 398阅读

用户头像

is_713593

暂无简介

举报
C语言同步练习册答案C语言同步练习册答案 第1章 概 述 练习题答案 一、单项选择题 1 2 3 4 5 6 7 8 9 10 A B B A D C A C B D 11 12 13 14 15 16 D A B B A D 二、填充题 1. 机器语言 问题的 2. 源程序 解释 编译 目标可执行程序 3. 大小写英文字母(52个) 数字(10个) 键盘符号(33个) 转义字符 4. \ 5. 保留字 6. 自定义 字符序列 7. 由字母或下划线开头的字母、数字、下划线组成的一串符号 8. 常量 变量 运算符 函数调...
C语言同步练习册答案
C语言同步练习册答案 第1章 概 述 练习答案 一、单项选择题 1 2 3 4 5 6 7 8 9 10 A B B A D C A C B D 11 12 13 14 15 16 D A B B A D 二、填充题 1. 机器语言 问题的 2. 源程序 解释 编译 目标可执行程序 3. 大小写英文字母(52个) 数字(10个) 键盘符号(33个) 转义字符 4. \ 5. 保留字 6. 自定义 字符序列 7. 由字母或下划线开头的字母、数字、下划线组成的一串符号 8. 常量 变量 运算符 函数调用 表达式 保留字 9. 数据定义 赋值 函数调用 表达式 流程控制 复合 空 其他 10. 1 主 主 11. /* */ 第2章 基本数据类型和运算 练习题答案 一、单项选择题 1 2 3 4 5 6 7 8 9 10 A B A C B C A D C A 11 12 13 14 15 16 17 18 19 20 C B B C C A D B A C 21 22 23 24 25 26 27 28 29 30 A D A C B C A B D A 31 32 33 34 35 36 37 38 39 40 B C D B D A C B D D 41 42 43 44 45 46 C D B B D C 二、填充题 1( 2 1 2( 非0 0 1 0 3( #define 符号常量 常量 4( 动态 auto 5( unsigned double char 6( 存储类型符 数据类型符 变量名1=初值1………变量名n=初值n ; 7( 内部变量或是外部变量 内部变量或外部变量 存储类型 8( 外部参照型 自动型 寄存器型 静态型 自动型 寄存器型 静态型 9( ++ && 10(11110000 11(1 0 (a>b>c a>b 为 1 1>c 假为 0 ) 12(1 (先求 !a 为 0 0设计
练习题答案 一、 单项选择题 1 2 3 4 5 6 7 8 9 10 B A C C D B B D D C 11 12 13 14 15 16 17 18 19 20 A A D C A B A A A C 21 22 23 24 25 26 27 28 29 30 B D C D A D 二、填充题 1. 顺序 循环 2. 等价 3. switch 循环 4. 结束本次循环 5. 26, 13, 19 6. if(a>b){y=2;printf(“***y=%d\n”,y);}else{x=1; printf(“***x=%d\n”,x);} 。 7. 10 8. ((k%3==0) || (k%7==0)) 9. int (n!=0) i+1 j+1 scanf(“%d”,&n) 10. (x%i==0) 三、程序分析题 1. 10,4,3 2. –1 3. 8 5 2 4. 3 1 -1 5. ABABCDCD 四、程序设计题 1. 解: mian() { float c,f; printf(“输入华氏温度(F): \n”); scanf(“%f”,&f); c=5.0*(f-32)/9; printf(“对应的摄氏温度(C)=%f\n”,c); } 2. 解: main() { int a; printf(“输入整数: \n”); scanf(“%d”,&a); if(a>=0) printf(“0\n”);else printf(“-1\n”); } 3. 解: main() { float x,y; printf(“输入数x: \n”); scanf(“%f”,&x); if(x<=1) y=x; else if(10) p++; else if(a<0) n++; else z++; } printf(“正数的个数=%d\n”,p); printf(“负数的个数=%d\n”,n); printf(“ 零的个数=%d\n”,z); } 7. 解: main() { e=x; while(x>1e-6){ n=1; for(i=1;i<=m;i++) n=n*i; m++; x=1.0/n; e=e+x; } printf(“e=%f\n”,e); } 8. 解: main() { int r=1; double x=1,y=0; while(x>1e-6){ x=1.0/(r*r+1); printf("x=%f\n",x); y=y+x; r++; } printf("y=%f\n",y); } 9. 解: main(0 { int i; for(i=0x20;i<=0x6f;i++) printf(“十进制数值=%d, 对应字符=%c\n”,i,i); } 10. 解: main() { int i; for(i=1;i<=100;i++){ if(i%5!=0) printf(“i=%3d i*i=%4d”,i,i*i); else printf(“i=%3d i*i=%4d\n”,i,i*i); } i=1; while(i<=100) { if(i%5!=0) printf(“i=%3d i*i=%4d”,i,i*i); else printf(“i=%3d i*i=%4d\n”,i,i*i); i++; } i=1; do{ if(i%5!=0) printf(“i=%3d i*i=%4d”,i,i*i); else printf(“i=%3d i*i=%4d\n”,i,i*i); i++; }while(i<=100); } 9. 解: “辗转相除法”算法如下: (1) 将两数放备份a,b。 (2) 将两数中大的那个放在m中,小的放在n中。 (3) 求出m被n除后的余数r。 (4) 若余数r为0则执行步骤(7);否则执行步骤(5) 。 (5) 把除数(n中的)作为新的被除数(放m中),把余数(r中的)作为新的除数(放n 中)。 (6) 重复步骤(3)(4)直到r为0, (7) 输出 n 即为最大公约数 (8) 原数(在备份a,b中)相乘除最大公约数即为最小公倍数。 #include void main() { int m,n,a,b,r,t; printf("输入个正整数:"); scanf("%d,%d",&m,&n); a=m; b=n; if (m>0 && n>0) { if(m void main() { int a,n,s,i,t; printf("输入a和n的值:"); scanf("%d,%d",&a,&n); printf("a=%d,n=%d:\n",a,n); t=a; for(i=1,s=0;i<=n;i++){ s=s+t; t=t*10+a; } printf("a+aa+aaa+....+aa..a=%d\n",s); return; } 13. 解: #include void main() { int i,j,k,a; printf("水仙花数是:\n"); for (i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++){ a=i*100+j*10+k; if(a==i*i*i+j*j*j+k*k*k) printf("%d\n",a); } return; } 14. 解: #include void main() { int n, s=0; printf(“输入一个正整数:”); scanf(“%d”,&n); do{ s+=n%10; n/=10; }while (n>0); printf(“各位数之和是:%d\n”,s); return; } 15. 解:设今天的挑子数为y,昨天的挑子数为x 则有:y=x-(x/2+1) x=2*(y+1) 从第 10 天 y=1 起 求出x,把x又当成今天(y=x)求昨天(x),这样向前推9天,即为第 一天的挑子数。 #include void main() { int i,x, y=1; for(i=1;i<10;i++) { x=2*(y+1); y=x; } printf(第一天共摘下桃子数为:%d\n”,x); return; } 第4章 数 组 练习题答案 一、 单项选择题 1 2 3 4 5 6 7 8 9 10 B C D A B D C B A C 11 12 13 14 15 C A D C C 二、填充题 1. 类型 0 越界 整型表达式 2. 连续 数组名 地址 3. 0 6 4. 0 0 5. d „\0? 6. [3][10] a[1] 7. #include #include 8. &a[i] i%9 printf(“%3d\n”,a[i]) 9. k=p 10. &x a[i] i-- i!=0 11. k i方法
,数组c的下标为0到25,当输入为ca=?A? 则ca-65=0,c[0]的值加1,依此类推。而输出时c[i]的下标i + 65正好又是相应的字母。 0 ca!=?#? 1 scanf(“%c”,&ca) 65 14. c[i]中放除16后的余数 把c[i]中的余数作b下标,取相应的字符 如:n=254 n%16 余 14 n=n/16 n=15 n%16 余 15 n=n/16 n=0 b 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 1 2 3 4 5 6 7 8 9 A B C D E F \0 c 0 1 2 3 .. .. ... ... 63 14 15 d=c[1]=15 取 b[15]=F d=c[0]=14 取 b[14]=E 结果输出 FE n%base b[d] 三、程序分析题 1. 该程序从键盘输入一行字符放在字符数组中,然后输出。 2. 该程序从输入的10个字符串中找出最长的那个串并显示长度。 3. 该程序的功能是从键盘输入10个字符串,从小到大排序并输出。 4. 运行结果,输出3x3矩阵的主对角线和辅对角线的元素之和。 18 10 5. 把矩阵a转置放到矩阵b 6. 运行结果输出: ***** ***** ***** ***** ***** 7. 运行结果把3x3矩阵a和b对应元素相加到矩阵c,输出矩阵c。 8. 程序边定义边赋值的方式定义了一个字符数组str。它包括22个字符(注意'\1' 和'\11'分别代表一个特定字符)及末尾由系统自动加入的串结束标志'\0',。程序利用for循环逐个读出str数组中的字符赋给字符变量c,再由内嵌的switch语句根据c的值来控制具体输出的字符。直到读到字符串结束标志'\0'为止。 (1) 循环是从k=2开始,首先读取的是str中的第三个字符S。循环体内除switch语句外,还有一条语句:putchar('*'); (2) continue语句要跳过循环体内尚未执行的语句,结束本次循环;break语句则仅仅跳出switch语句,仍要执行循环体中的语句。 (3)当从str中读取的字符与case中所有常量表达式的值都不相等时,执行default后的语句,原样输出字符,并跳过putchar('*') 结束本次for循环,(如第三个S,第一个W,I,T,C,H,第三个W,M和P均属此)。 (4)当读到字符L时,与case中的‘L’相等,执行continue,结束本次for循环。没有输出。 (5)当读到字符1时,与case中的‘1’相等,执行break语句,跳出switch,输出一个字符*。 (6)当读到字符'\1'(第一次出现的)时,代表一个8进制的1,与case中的1相等,执行while循环。在while循环中,首先执行c=str[++k],取下一个字符'\11',它既不等于'\1'又不等于'\0',while循环继续执行,取出'W'。同理,再次执行while循环,取出字符'\1',从而结束while循环,滑向下一个case,输出字符'#',顺序执行到continue,结束本次for循环。 (7)当读到大写字母A时,与case中的'A'相等,输出一个小写字母a,并结束本次for循环。 经以上分析可知,程序输出结果为:SWITCH*#WaMP* 四、程序设计题 1( 解: #include void main() { float a[10],x; int i; for(i=0;i<10;i++) { scanf(“%f”,&x); a[i]=x; } for(i=0,x=0;i<10;i++) x=x+a[i]; x=x/10.0; printf(“平均值=%f\n”,x); return ; } 2. 解: #include void main() { int a[10],x,i; for(i=0;i<10;i++) scanf(“%d”,&a[i]); for(i=0;i<5;i++) { x=a[i]; a[i]=a[9-i]; a[9-i]=x;} for(i=0;i<10;i++) printf(“%d ”,a[i]); printf(“\n”); return ; } 3(解: /* 算法: 数组a[3][3] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] */ #include void main() { float a[3][3],sum1=0,sum2=0; int i,j; for (i=0;i<3;i++) for (j=0;j<3;j++) scanf("%f",&a[i][j]); for (i=0;i<3;i++) { for (j=0;j<3;j++) printf("%f ",a[i][j]); printf("\n"); } for (i=0;i<3;i++) sum1=sum1+a[i][i]; for (i=0;i<3;i++) sum2=sum2+a[i][3-i-1]; printf("主对角线的和是sum1=%f\n",sum1); printf("辅对角线的和是sum2=%f\n",sum2); return; } 4( 解: #include #include void main() { char a[40],b[40],c[80]; int i,j; printf(“分二行输入两个字符串:\n); gets(a) gets(b); for(i=0;a[i]!=?\0?;i++) c[i]=a[i]; for(j=0;b[j]!=?\0?;j++) c[i+j]=b[j]; c[j]=?\0?; puts(c); return; } 5( 解: #include #define N 10 void main() { float x[N],t,x0=0,s=0; int i; for(i=0;i main() { int a[3][5],i,j,max,min,maxl,maxh,minl,minh; for(i=0;i<3;i++) for(j=0;j<5;j++) scanf(“%d”, &a[i][j]); max=min=a[0][0]; for(i=0;i<3;i++) for(j=0;j<5;j++) { if(a[i][j]>max) { max=a[i][j]; maxl=i; maxh=j; } if(a[i][j] #include void main() { char a[80]; int i; gets(a); for(i=0;i void main() { float a[50[3],vag[]={0,0,0},x; int i,j; printf(“每人一行的输入50名学生的三种成绩\n”): for(i=0;i<50;i++) for(j=0;j<3;j++) { scanf(“%f”,&x); a[i][j]=x; } for(j=0;j<3;j++) for(i=0;i<50;i++) vag[j]=vag[j]+a[i][j]; for(j=0;j<3;j+=) vag[j]=vag[j]/50; printf(“课程一的平均分=%f\n课程二的平均分=%f\n课程三的平均分 =%f\n”,vag[0],vag[1],vag[2]); return; } 9( 解: #include void main() { int a[5], n, i=0; printf(“输入一短整数:\n”); scanf(“%d”,&n); do { a[i]=n%10; i++; n=n/10; } while(n!=0); for(--i;i>0;--i) printf(“%c,”,a[i]+48); printf(“%c\n”,a[0]+48); return; } 10. 解: #include void main() { float a[3][3],max,min; int i,j,k,max_k,min_k,flag=0; for (i=0;i<3;i++) for (j=0;j<3;j++) scanf("%f",&a[i][j]); for (i=0;i<3;i++) { for (j=0;j<3;j++) printf("%f ",a[i][j]); printf("\n"); } for (i=0;i<3;i++){ max=a[i][0]; max_k=0; for(j=1;j<3;j++) if(a[i][j]>max) { max=a[i][j]; max_k=j; } min=a[0][max_k]; min_k=0; for(k=1;k<3;k++) if(a[k][max_k] #include void main() { char a[80]; int i; gets(a); for(i=0;i #include void main() { char a[80]; int i; gets(a); for(i=0;i #define N 15 void main() { int a[N]; int i,t; int top=N-1, low=0, mid; for(i=0; i1){ mid=(top-low)/2+low; if(t==a[mid]){ printf("%d 位于表中第 %d 个数\n",t,mid+1); break;} else if(t #include void main() { char a[3][80]; int i,j, d,x,s,k,q; d=x=s=k=q=0; printf("输入3行文字,每行不超过80个字符\n"); for(i=0; i<3; i++) gets(a[i]); for(i=0;i<3;i++) for(j=0;j<80 && a[i][j]!='\0';j++) if(a[i][j]>='A' && a[i][j]<='Z') d++; else if(a[i][j]>='a' && a[i][j]<='z') x++; else if(a[i][j]>='0' && a[i][j]<='9') s++; else if(a[i][j]==' ') k++; else q++; printf("大写字母数:%d\n",d); printf("小写字母数:%d\n",x); printf("数字字符数:%d\n",s); printf("空格字符数:%d\n",k); printf("其他字符数:%d\n",q); return; } 第5章 指 针 练习题答案 一、 单项选择题 1 2 3 4 5 6 7 8 9 10 C A B D D B A C C C 11 12 13 14 15 16 17 18 19 20 D C B B A C B C D A 21 22 23 24 25 C D C D C 二、填充题 1. 地址 加减 赋值 数组名 2. 地址 NULL 3. 取地址运算符 , 相互赋值 , 赋NULL 4. 加减整数 ++,-- 5. 指针(取值) 取地址 6. 比较 7. 3 +3 8. double *p=&a 9. 地址 指的变量 地址 10. sz[i] , p[i] , *(sz+i) 和 *(p+i) 11. ABCD A 12. 50 13. *min,*a,*b,*c a , b , c *a, *b, *c *min=*b *min *min=*c *min 14. ?\0? ++ 15. sp=str[i] sp strlen(sp) 三、程序分析题 1. 程序输出:ABCDEFGH 2. 程序的主要功能:把输入的10个整数反序一行一个的输出。 3. 程序运行的输出结果:A ABCD B BCD C CD D D 4. 该程序找出数组中最大和最小的元素,分别与第一和最后的元素交换,运行结果输出: 13,10,-3,1,7,-21 5. 程序用pi和指针pj指向字符串s的头尾,然后逐步向中比较字符,到不等时终止。若都 相等,则是“回文”,回答“YES”,否则回答“NO”。因此当输入字符串“LEVEL”时, 输出“YES”, 当输入字符串 “LEVAL”时输出 “NO”。 6. 四个字符指针指向四个字符串,程序每次循环p指向一个字符串,输出第一的字符*p,运 行的输出结果: AEIM 7. 程序运行输出:0 1 2 3 -1 0 1 2 -2 -1 0 1 -3 -2 -1 0 8. 程序运行输出:1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 四、程序设计题 1. #include main() { int a, b, c, *pa=&a, *pb=&b, *pc=&c; scanf(“%d,%d,%d”,pa,pb,pc); if(*pa>=*pb) if(*pb>*pc) printf(“%d, %d, %d\n“,*pa,*pb,*pc); else if(*pa>*pc) printf(“%d, %d, %d\n“,*pa,*pc,*pb); else printf(“%d, %d, %d\n“,*pc,*pa,*pb); else if(*pc>*pb) printf(“%d, %d, %d\n“,*pc,*pb,*pa); else if(*pa>*pc) printf(“%d, %d, %d\n“,*pb,*pa,*pc); else printf(“%d, %d, %d\n“,*pb,*pc,*pa); } 2. #include #define N 15 main() { int a[N], b, *p, *q; for(p=a;p #include main() { char str[81], *sptr; gets(str); sptr=str+strlen(str)-1; for(;sptr>=str;sptr--) printf(“%c”,*sptr); printf(“\n”); } 4. #include #define N 10 main() { float a[N], avg, *pm, *ps, *p; for(p=a;p*pm) pm=p; if(*p<*ps) ps=p; avg+=*p; } printf(“一维实型数组最大值=%f\n”,*pm); printf(“一维实型数组最小值=%f\n”,*ps); printf(“一维实型数组平均值=%f\n”,avg/N); } 5. #include main() { int a[3][6], (*p)[6],i,j,maxh=0,maxl=0,minh=0,minl=0,max,min; for(p=a,i=0;i<3;i++) for(j=0;j<6;j++) scanf(“%d”,*(p+i)+j); printf(“二维数组是:\n”); for(p=a,i=0;i<3;i++,p++) { for(j=0;j<6;j++) printf(“%3d ”,(*p)[j]); printf(“\n”); } max=min=a[0][0]; for(p=a,i=0;i<3;i++) for(j=0;j<6;j++) { if(*(*(p+i)+j)>max) { maxh=i; maxl=j; max=*(*(p+i)+j); } if(*(*(p+i)+j) #include main() { char s[3][81], *p[3]={s[0],s[1],s[2]}, *tp; int i; printf(“输入3个字符串: \n”); for(i=0;i<3;i++) gets(p[i]); tp=p[0]; for(i=1;i<3;i++) if(strcmp(p[i],tp)>0) tp=p[i]; printf(“其中最大的字符串是:%s\n”,tp); } 7. #include #include main() { char a[40],b[40],c[80],*s,*t=c; gets(a); gets(b); s=a; for(;*s;) *t++=*s++; s=b; for(;*s;) *t++=*s++; *t=?\0?; puts(c); } 8. #include #include main() { char a[81],b[81],*s=a,*t=b; gets(a); gets(b); whilw(*s&&*t) if(*s++!=*t++) break; if(!*s&&!*t) printf(“%s 与 %s 相等\n”,a,b); elas printf(“%s 与 %s 不相等\n”,a,b); } 9. #include #define N 10 main() { int x[N],*p=x, *min, *max, t1,t2; printf("输入十个整数(用空格分开):\n"); for(p=a;p*max) max=p; } t1=*min; *min=a[0]; a[0]=t1; t2=*max; *max=a[N-1];a[N-1]=t2; for(p=a;p void main() { int x[100],i,n,m,end_num,*p; printf("输入整数个数n(少于100个): ");scanf("%d",&n); printf("输入%d个整数(用空格分开):\n",n); for(p=x;p=x;p--) *p=*(p-1); x[0]=end_num; } printf("这%d个整数移动后%d是:\n",n,m); for(p=x;p void main() { int a[3][3],i,j,t,*p,(*q)[3]; p=a[0]; printf("输入3×3个整数:\n"); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",p++); p=a[0]; printf("3×3的整数矩阵:\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",*(p+i*3+j)); printf("\n"); } q=a; for(i=0;i<3;i++) for(j=i;j<3;j++) { t=*(*(q+i)+j); *(*(q+i)+j)=*(*(q+j)+i); *(*(q+j)+i)=t;} printf("转置后3×3的整数矩阵:\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",*(*(q+i)+j)); printf("\n"); } } 12. #include #include void main() { char a[80],*p; int count=0; printf("输入一个字符串:\n"); gets(a); p=a; for(;*p!='\0';p++) count++; printf("这个的长度是:%d\n",count); } 13. #include #include void main() { char a[80],*p; int up=0,lp=0,k=0,s=0,q=0; printf("输入一个字符串:\n"); gets(a); p=a; while(*p!='\0'){ if('A'<=*p&&*p<='Z') up++; else if('a'<=*p&&*p<='z') lp++; else if('0'<=*p&&*p<='9') s++; else if(*p==' ') k++; else q++; p++; } printf("大写字母个数是: %d\n",up); printf("小写字母个数是: %d\n",lp); printf("空格个数是: %d\n",k); printf("数字个数是: %d\n",s); printf("其他字符个数是: %d\n",q); } 14. #include #include void main() { char a[80], b[80],*p,*q; int m; printf("输入一个字符串:\n"); gets(a); printf("输入第几个字符开始复制: "); scanf("%d",&m); p=a; q=b; for(p=p+m-1; *p!='\0'; p++,q++) *q=*p; *q='\0'; printf("被复制的字符串是:%s\n",b); } 15. #include #include void main() { char a[10][80],t[80],*p[10],*k; int i,j; printf("输入10个字符串:\n"); for(i=0;i<10;i++) { p[i]=a[i]; gets(p[i]); } printf("这10个字符串原来是:\n"); for(i=0;i<10;i++) puts(p[i]); for(i=0;i<9;i++) { k=p[i]; for(j=i+1;j<10;j++) if(strcmp(k,p[j])>0) k=p[j]; if(k!=p[i]) { strcpy(t,k); strcpy(k,p[i]); strcpy(p[i],t); } } printf("这10个字符串交换后:\n"); for(i=0;i<10;i++) puts(p[i]); } 第6章 函 数 练习题答案 一、 单项选择题 1 2 3 4 5 6 7 8 9 10 B A C C A D B C A C 二、填充题 1. 所定义的函数或复合语句内 2. 地址传递 值传递 3. 函数内部 局部 4. return void 5. 变量地址 指针 数组名 6. fun函数中,先由for(;isspace(*s);s++);移过字符串中的先导空格字符,系统函数isspace(*s)是判断空格字符的。若有字符?-„,sign放-1,否则放1,移过字符?-„或?+„。从此取出字符串中的数字字符(系统函数isdigit(*s)是判断数字字符的)其他字符不要,变成整数后,按位乘10相加(n=n*10+(*s-„0?)),最后返回数sign*n值。 6354 7. 由于不用return返回值,因此z必须为指针 int *z ,调用时用add(a,b,&c)使z指 向实参c,相加结果放 *z =x+y 即放实参c。 8. w中从0算起有n指向数个字符,则w[*n]是空的,先把x中的字符放w[*n]。找出按序x中字符应放的位置p。(while(x>w[p]) p++),从最后一个字符w[i=*n](即要插入的字符)开始向前移位( w[i]= w[i-1] )直到位p,则就把最后一个字符(即要插入的字符)插入到了p位。 9. *s-*t 10. 该递归函数的出口是if,因此,在此要填入遇到字符串结束标志时返回。字符串结束标志 的方式有四种:*a==?\0?,*a==NULL,*a==0 或 !*a 。由于if中已有求反运算符!,故可填 入: *a 或填(*a!=?\0?),(*a!=NULL),(*a!=0)。 显然%c * 后要填入 a . 三、程序分析题 1. 函数的功能是能把p1和p2所指的实参数据交换。 2( 函数的功能:求出n个实数的平均值 3( 运算结果:把一个无符号整数一位一位取出相乘。结果为12 4( 程序运算结果: 0 0 0 0 , 这是因为sub(a,x)的调用x对应y,是值调用,y的值并不 返回给x,四次调用x都是0。 5( 程序运算结果: -85, 1, 2 该函数的功能是求二维数组中最小元素值及它的行列下标。由于有三个数据要返回,因此 用三个整数指针,而调用这个函数时,用了三个整数的地址。 6( 求fun(4),可用推展和回溯法读递归函数计算结果为:72 程序设计题 1( 解 float root(float a, float b, float c) { return(b*b-4*a*c); } 2(解 int year(int y) { if((y%4==0&&y%100!=0)||y%400==0) return 1; else return 0; } 3(解 #include void root2(float root[2], float a, float b, float c) { float p; p=sqtr(b*b-4*a*c); root[0]=(-b+p)/(2*a); root[1]=(-b-p)/(2*a); } 4. 解 void max_min(int m, int n) { int a,b,t,r; a=m; b=n; if (m void main() #include { int a; int prime(int m) for(a=3;a<=100;a++) { int k,i; if (prime(a)) printf(“%3d”,a); k=sqrt(m); printf(“\n”); for(i=2; i<=k; i++) } if(m%i==0) return 0; return 1; } 6. 解 int days(int y, int m, int d) { int n; switch(1) { case 1: n=0; if(m==1) break; case 2: n=n+31; if(m==2) break; case 3: n=n+28; if(m==3) break; case 4: n=n+31; if(m==4) break; case 5: n=n+30; if(m==5) break; case 6: n=n+31; if(m==6) break; case 7: n=n+30; if(m==7) break; case 8: n=n+31; if(m==8) break; case 9: n=n+31; if(m==9) break; case 10: n=n+30; if(m==10) break; case 11: n=n+31; if(m==11) break; case 12: n=n+30; } n=n+d; if(m>2) if((y%4==0&&y%100!=0)||(y%400==0)) n=n+1; return n; } 7. 解 void trus(int s1[2][3], int s2[3][2]) { int i,j; for(i=0;i<2;i++) for(j=0;j<3;j++) s2[j][i]=s1[i][j]; } 8. 解 include int countc(char array[]) { int i, n=0; for(i=0;i=?Z?) n++; return n; } 9. 解 include int link(char s1[40], char s2[40], char s3[80]) { int i, k, n=0; for(i=0;i*max) *max=a[i]; if(a[i]<*min) *min=a[i]; *vag=*vag+a[i]; } *vag=*vag/n; } 11(解 void sortc(char a[]) { int n, i, j; char ch; n=strlen(a); for(i=0;ia[j+1]) { ch=a[j]; a[j]=a[j+1]; a[j+1]=ch;} } 12(解 #include int tv(char *s) { int m,n=0; while(*s!='\0') { if(isalpha(*s)) *s=toupper(*s); switch(*s) { case 'F': m=15; break; case 'E': m=14; break; case 'D': m=13; break; case 'C': m=12; break; case 'B': m=11; break; case 'A': m=10; break; default: m=*s-48; } n=n*16+m; s++; } return n; } 13(解 #include for(i=1,b++;i<=l/2;i++,b++,p--) char a[255]; //全局数组 { c=*b; *b=*p; *p=c;} void contw(int m) //递归转换 return ; { int n; } static i=1; void main() char c; { int n; if(m!=0){ void contw( int m); n=m%10; c=n+48; a[i]=c; void convert(char *b); m=m/10; i++; printf("输入一整数:"); contw(m); scanf("%d",&n); } if(n<0) {a[0]='-'; n=-n;} return; else a[0]=' '; } contw(n); void convert(char *b) //倒置数组 convert(a); { int l,i; printf("字符串: %s\n",a); char c, *p; return; l=strlen(b); p=b+l-1; } 第7章 结构型、共用型和枚举型 练习题答案 一、 单项选择题 1 2 3 4 5 6 7 8 9 10 B D D B C B D B B D 二、填充题 1. 等价 2. 成员 指向成员 3. . -> 4. 18 5. 101 解答该题,要能画出如下的存储结构示意图: ++p->a即 ++(p->a),由于p->z数组则p即z,p->a即z[0].a为100,再将此值自增1, 后取值,为101 z p ?? 100 x[0] x[1] z[0].a 11 12 ?? x z[0].b 300 y[0] y[1] z[1].a ?? y z[1].b 31 32 6. struct ph c p->name p->tel p->name, x 三、程序分析题 1. 运行结果:由于对union 类型变量 z ,z.i[0]和z.c为同一内存位置,所以输出字符9。 2. 显然p指向结构数组第一个元素,故运行结果,第一个printf输出name=zhang total=170.0 而a[1]为结构数组第二个元素,故第二个printf输出name=wang total=150.0 3. 枚举值em3的值为2,因此相当于输出aa[3],aa[1],aa[2],故运行结果为DD,BB,CC 4. 程序的运行结果:由于p指向a,a和变量i,f,s等同时赋初值,因此二个printf 同 输出:1998 is Windows sal 1800.00 5. 程序的运行结果:p->9 a[0] a[1] a[2] a 5 7 9 p? n n n next next next 四、程序设计题 1. main() { struct emp { char name[10]; float jbg; float fdg; float zc; } e[3]={ {“zhao”,240,400,75},{“qian”,360,120,50},{“sun”,560,0,80}}; int i; for(i=0;i<3;i++) printf(“姓名:%5s, 实发数:%7.2f\n”, e[i].name,e[i].jbg+e[i].fdg-e[i].zc ); } 2. main() { struct emp { int eno; char en[20]; float jbg; float zwg; } a[10]; int i, k; float min; printf(“输入10个职工:编号,姓名,基本工资,职务工资:\n”); for(i=0; i<10; i++) scanf(“%d,%s,%f,%f”,&a[i].eno, a[i].en, &a[i].jbg, &a[i].zwg); min=a[0].jbg+a[0].zwg; for( k=0,i=1;i<10;i++) if(min> a[i].jbg+a[i].zwg) { min=a[i].jbg+a[i].zwg; k=i;} printf(“基本工资+职务工资 最少的职工姓名是:%s\n”,a[k].en); } 3. main() { struct student { int sno; char sn[20]; float score[3]; float sum; } s[10], *p=s,*q; int i; float max=0; printf("输入10个学生:学号,姓名:\n 成绩1 成绩2 成绩3: \n"); for(; psno, p->sn); p->sum=0; for(i=0;i<3;i++) { scanf(“%f”, &p->score[i]); p->sum+=p->score[i]; } } p=s; q=p; max=p->sum; for(; psum) { max=p->sum; q=p; } printf(“总分最高的学生姓名是:%s 总分 %f\n”,q->sn,q->sum); } 4. main() { struct student { char sn[20]; float score[3]; float avg; } s[4]={{“zhan”,97.5,89.0,78.0,0},{“qian”,90.0,93.0,87.5,0}, {“sun”,75.0,79.5,68.5,0},{“li”,82.5,69.5,54.0,0},}, *p=s; int i; for(; pavg+=p->score[i]; p->avg/=3; } p=s; printf(“name foxbase basic c average\n”); for(; psn, p->score[0], p->score[1], p->score[2], p->avg); } 5. int days(struct date *p) { int n; switch(1) { case 1: n=0; if(p->m==1) break; case 2: n=n+31; if(p->m==2) break; case 3: n=n+28; if(p->m==3) break; case 4: n=n+31; if(p->m==4) break; case 5: n=n+30; if(p->m==5) break; case 6: n=n+31; if(p->m==6) break; case 7: n=n+30; if(p->m==7) break; case 8: n=n+31; if(p->m==8) break; case 9: n=n+31; if(p->m==9) break; case 10: n=n+30; if(p->m==10) break; case 11: n=n+31; if(p->m==11) break; case 12: n=n+30; } n=n+p->d; if(p->m>2) if((p->y%4==0&&p->y%100!=0)||(p->y%400==0)) n=n+1; return n; } 6. struct student { int sno; char name[10]; float score[3]; }; struct student *nnew() { struct student *p; p=(struct student *)malloc(sizeof(struct student)); return p; } 第8章 文 件 练习题答案 一、 单项选择题 1 2 3 4 5 A C B B C 二、填充题 1. fopen fclose 2. 文本 二进制 文件结束标志 非零 3. ch=fgetc(fp) fscanf(fp,”%c”,&ch) fputc(ch,fp) fprintf(fp,”%c”,ch) 4. fp n-1 str fputs 写入文件的实际字符数 5. 文件型指针变量 stdio.h 6. rewind() 7. (!feof(fp)) 8. ((fp=fopen(“stu.dat”,”rb”))==NULL) fread(stud,sizeof(struct student),N,fp) 三、程序分析题 1(该程序的功能是:从键盘读入一个字符,如果是小写字母,则变成大写输出到屏幕上,否 则原样输出。当打入ctrl-z(即EOF) 时,输入结束。 2(该程序的功能是:统计文本文件fname.txt中的空格字符数。 3(该程序的功能是:把C盘根下的tc目录中的文件p1.c复制到A盘的根目录下,取同 样的文件名p1.c。如果C盘中的p1.c文件超过1000字节,则最多复制1000字节。 4(该程序先打开a1.txt文件,然后调用函数fc(),把文件中#号字符以前的在屏幕上现 示。再打开a2.txt文件,然后调用函数fc(),把文件中#号字符以前的内容在屏幕上接着 现示。因此程序运行后输出 121314252627 四、程序设计题 1. 解 #include “stdio.h” main() { FILE *fp; int i; if((fp=fopen(“f1.txt”,”w”))==NULL) { printf(“Can not open file!\n”); exit(1); } for( i=1;i<=200;i++) fputc(getchar(),fp); fclose(fp); } 2. 解 #include “stdio.h” main() { FILE *fp; int i; if((fp=fopen(“f1.txt”,”r”))==NULL) { printf(“Can not open file!\n”); exit(1); } for( i=1;i<=120;i++) putchar(fgetc(fp)); fclose(fp); } 3. 解 #include “stdio.h” main() { FILE *f1, *f2; if((f1=fopen(“ccw1.txt”,”r”))==NULL) { printf(“Can not open file!\n”); exit(0);} if((f2=fopen(“ccw2.txt”,”w”))==NULL) { printf(“Can not open file!\n”); exit(0);} while(!feof(f1)) fputc(fgetc(f1),f2); fclose(f1); fclose(f2); } 4. 解 设计思路:从文件CCW.TXT中读一个字符(字节),减10后写到一临时文件TMPCCW.TXT, 直到读到字符„@?。然后两文件反绕到头,从文件TMPCCW.TXT中读一个字符,写回到文件 CCW.TXT,把原字符复盖。因此两文件用r+和w+的形式打开。 #include main() { FILE *fp1,*fp2; char ch; if((fp1=fopen("ccw.txt","r+"))==NULL) { printf("Can not open file!\n"); exit(0);} if((fp2=fopen("tmpccw.txt","w+"))==NULL) { printf("Can not open file!\n"); exit(0);} while((ch=fgetc(fp1))!='@') { fputc(ch-10,fp2);} rewind(fp1); rewind(fp2); do { ch=fgetc(fp2); if(!feof(fp2)) fputc(ch,fp1); }while(!feof(fp2)) ; fclose(fp1); fclose(fp2); } 5. 解 #include main() { FILE *fp1; char ch; if((fp1=fopen("ccw.txt","r"))==NULL) { printf("Can not open file!\n"); exit(0);} while((ch=fgetc(fp1))!='@') putchar(ch+10); fclose(fp1); } 6( 解 方法一、 定义一个结构变量,每输入一个学生信息,即存入磁盘二进制数据文件student.dat 中。建立存有100个学生信息的文件后,设计一个总分为0的hs学生,再打开读取该文 件,每读入一个学生信息,即与hs比较,寻找总分最高的学生在hs,并输出该学生的所 有信息。 #include #include #include void main() { struct student { int sno; char sn[20]; int sage; float sg[7]; float sum; }; struct student s,t,hs; FILE *fp; int i,j; if((fp=fopen("student.dat","w"))==NULL) { printf("Can not open file!\n"); exit(0); } printf("以 学号\n 姓名\n 年龄\n成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 的形式输入:\n"); for(i=0;i<100;i++) { printf("学生%d:\n",i+1); scanf("%d",&s.sno); scanf("%s",s.sn); scanf("%d",&s.sage); s.sum=0; for(j=0;j<7;j++) { scanf("%f",&s.sg[j]); s.sum=s.sum+s.sg[j]; } fwrite(&s,sizeof(struct student),1,fp); } fclose(fp); if((fp=fopen("student.dat","r"))==NULL) { printf("Can not open file!\n"); exit(0); } hs.sum=0; while(!feof(fp)) { fread(&t,sizeof(struct student),1,fp); if(t.sum>hs.sum) { hs.sno=t.sno; strcpy(hs.sn,t.sn); hs.sage=t.sage; for(j=0;j<7;j++) hs.sg[j]=t.sg[j]; hs.sum=t.sum; } } printf("总分最高的学生是 "); printf("学号: %d 姓名: %s 年龄: %d\n",hs.sno,hs.sn,hs.sage); printf("成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 总分\n"); for(j=0;j<7;j++) printf("%5.1f ",hs.sg[j]); printf("%5.1f\n",hs.sum); } 方法二、 定义一个100个元素的结构数组s,输入100个学生的信息后,一次存入磁盘二进制数据 文件student.dat中。再打开该文件,读入100个学生信息到100个元素的结构数组t中。 数组t中,用结构指针sp和hsp寻找总分最高的学生,使hsp指向它,并输出该学生的 所有信息。 void main() { struct student { int sno; char sn[20]; int sage; float sg[7]; float sum; }; struct student s[100],t[100],*sp,*hsp; FILE *fp; int i,j; float hsum=0; if((fp=fopen("student.dat","w"))==NULL) { printf("Can not open file!\n"); exit(0); } printf("以 学号\n 姓名\n 年龄\n成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 的形式输入:\n"); for(i=0,sp=s;i<100;i++,sp++) { printf("学生%d:\n",i+1); scanf("%d",&sp->sno); scanf("%s",sp->sn); scanf("%d",&sp->sage); sp->sum=0; for(j=0;j<7;j++) { scanf("%f",&sp->sg[j]); sp->sum=sp->sum+sp->sg[j]; } } fwrite(s,sizeof(struct student),100,fp); fclose(fp); if((fp=fopen("student.dat","r"))==NULL) { printf("Can not open file!\n"); exit(0); } fread(t,sizeof(struct student),100,fp); for(i=0,hsp=t,sp=t;i<100;i++,sp++) { if(sp->sum>hsum) { hsum=sp->sum; hsp=sp; } } printf("总分最高的学生是 "); printf("学号: %d 姓名: %s 年龄: %d\n",hsp->sno,hsp->sn,hsp->sage); printf("成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 总分\n"); for(j=0;j<7;j++) printf("%5.1f ",hsp->sg[j]); printf("%5.1f\n",hsp->sum); fclose(fp); } 7. 解 #include void main() { char fname[20]; FILE *fp; int num=0, word=0; char ch; printf("输入要统计的文件名: "); scanf("%s",fname); if((fp=fopen(fname,"r"))==NULL) { printf("打不开文件 %s \n",fname); exit(0); } while(!feof(fp)) { ch=fgetc(fp); if(ch==' ') word=0; else if(word==0) { word=1; num++; } } printf("%s 文件中有 %d 个单词\n",fname,num); fclose(fp); } 8( 解 #include main() { FILE *fp1,*fp2,*fp3; char a[160],ch; int i=0,j,n; if((fp1=fopen("f1.txt","r"))==NULL) { printf("打不开文件f1.txt!\n"); exit(0); } if((fp2=fopen("f2.txt","r"))==NULL) { printf("打不开文件f2.txt!\n"); exit(0); } if((fp3=fopen("f3.txt","w"))==NULL) { printf("打不开文件f3.txt!\n"); exit(0); } while(!feof(fp1)) { ch=fgetc(fp1); if(!feof(fp1)) a[i++]=ch; /*读文件f1.txt放到数组a中*/ } while(!feof(fp2)) { ch=fgetc(fp2); if(!feof(fp2)) a[i++]=ch; /*读文件f2.txt接着放到数组a中*/ } a[i]='\0'; n=i; for(i=0;ia[j]) { ch=a[i]; a[i]=a[j]; a[j]=ch; } i=0; while(a[i]!='\0') { fputc(a[i],fp3); i++; } /*把数组a逐个字母写入文件f3.txt */ fclose(fp1); fclose(fp2); fclose(fp3); } 第9章 编译预处理与带参数的主函数 练习题答案 一、 单项选择题 1 2 3 4 5 6 7 8 9 10 A B C D C D C A C B 11 12 D C 二、填充题 1. 编译 处理 “编译预处理” 2. 非静态存储类型变量和外部函数 3. 7 4. i=”%d\n” 5. BBB AAA 123 命令行中有4个字符串(包括p),因此,argc=4, argv[0]?p , argv[1]?123 , argv[2]?AAA , argv[3]?BBB。 三、程序分析题 1. 程序运行结果为: 50 25 2. 程序运行结果为: x=9, y=5 3. 程序运行结果为:9 9 11 4. 程序输出:3 ABC FILE1 FILE2 5. 该程序的功能是:在用命令行的形式运行本程序时,必须在程序名后加二个参数,这二个 参数分别表示磁盘上的二个文件名。程序运行后,能把第一个文件的内容拷贝到第二个文 件。如果命令行缺少参数或文件打不开,程序终止运行并显示出错情况。 四、程序设计题 1. 解 #include #include #define S(a,b,c) 0.5*(a+b+c) #define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)) main() { float a,b,c; printf(“输入三角形的三条边长:a,b,c\n”); scanf(“%f,%f,%f”,&a,&b,&c); if((a+b>c)&&(b+c>a)&&(c+a>b)) { printf(“周长=%f\n”, 2*S(a,b,c)); printf(“面积=%f\n”, AREA(a,b,c)); } else printf(“a,b,c 的长度不能构成三角形\n”); } 2. 解 #include main(int argc, char *argv[]) { FILE *f1, *f2; char ch; if (argc<3) { printf(“Error! Useage: program_name source_file_name object_file_name \n”); exit(0); } if ((f1=fopen(argv[1],”r”))==NULL) { printf(“Can not open source file!\n”); exit(0); } if ((f2=fopen(argv[2],”w”))==NULL) { printf(“Can not open object file!\n”); exit(0); } while (!feof(f1)) fputc(fgetc(f1),f2); fclose(f1); fclose(f2); } 3. 解 #include #include main(int argc, char *argv[]) { int a,b; if (argc<3) { printf(“Parameter missing!\n”); exit(0); } a=atoi(argv[1]); b=atoi(argv[2]); //在stdlib.h中有库函数atoi,把字符串转换成整数 printf(“%5d + %5d = %5d\n”,a,b,a+b); printf(“%5d - %5d = %5d\n”,a,b,a-b); printf(“%5d * %5d = %5d\n”,a,b,a*b); printf(“%5d / %5d = %5d\n”,a,b,a/b); printf(“%5d %% %5d = %5d\n”,a,b,a%b); } 4. 解 #include #include main(int argc, char *argv[]) { int i, sum=0; for(i=1;i #include main(int argc, char *argv[]) { if (argc<3) { printf(“Parameter missing!\n”); exit(0); } if( strcmp(argv[1],argv[2])>0) puts(argv[1]); else puts(argv[2]); } 综合练习答案 一、判断题 题号 1 2 3 4 5 6 7 8 9 10 答案 ? ? × ? × × × ? ? × 题号 11 12 13 14 15 16 17 18 19 20 答案 ? × × ? ? × × ? ? × 题号 21 22 23 24 25 26 27 28 29 30 答案 × × ? ? ? × ? × ? × 题号 31 32 33 34 35 36 37 38 39 40 答案 ? × × ? ? × ? × × ? 题号 41 42 43 44 45 46 47 48 49 50 答案 × × ? ? ? × ? × × ? 题号 51 52 53 54 55 56 57 58 59 60 答案 × × ? ? ? × ? × × ? 二、选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 A B A A C D B A B A 题号 11 12 13 14 15 16 17 18 19 20 答案 B A D D D A A D D B 题号 21 22 23 24 25 26 27 28 29 30 答案 A B A D C B B B A C 题号 31 32 33 34 35 36 37 38 39 40 答案 A C B B C C B B B C 题号 41 42 43 44 45 46 47 48 49 50 答案 A C A B D A B B A B 题号 51 52 53 54 55 56 57 58 59 60 答案 B A D D B B A A C D 题号 61 62 63 64 65 66 67 68 69 70 答案 A C A C A D C A D D 题号 71 72 73 74 75 76 77 78 79 80 答案 A B C C A D B C C D 题号 81 82 83 84 85 86 87 88 89 90 答案 B C B D D C C A A C 题号 91 92 93 94 95 96 97 98 99 100 答案 A D C D A A D B A C 题号 101 102 103 104 105 106 107 108 109 110 答案 C D C A B C D B C C 题号 111 112 113 114 115 116 117 118 119 120 答案 C D A D B D D A B A 三、写输出结果 题号 1 2 3 4 5 6 7 8 9 10 答案 1 0 0 12 3 ### 0 11 5 U 题号 11 12 13 14 15 16 17 18 19 20 答案 0 1 6 10 4 *** 1 13 4 7 题号 21 22 23 24 25 26 27 28 29 30 答案 2.4 0 1 10 3 1 0 35 10 dow 题号 31 32 33 34 35 36 37 38 39 40 答案 1 -1 2 3 1 2 -1 0 5 5 题号 41 42 43 44 45 46 47 48 49 50 答案 1 -128 4 15 2 0 -1 0 2 2 题号 51 52 53 54 55 56 57 58 59 60 答案 10 255 0 43 6 10 -1 -1 6 6 四、阅读下列程序,写出输出结果 1、 3# 7、 2,1#3,2# 13、 4,1,5#2,4,5# 19、 2#3#4#5# 25、150 2、3# 8、2,3#3,5# 14、 3,2,5#3,3,4# 20、 -19# 26、 58 3、0# 9、1#2#3#4# 15、 4,3,8,9# 21、 128 27、 10 4、5# 10、 6,3#1,3# 16、 0,10#10,10# 22、 18#21#26# 28、 14 5、6# 11、11,1#12,3# 17、 -1,3,2,1# 23、 25# 29、 TA 6、4# 12、-4,12#2,13# 18、 3,2,1,6# 24、 I 0m 0 st4d1nt. 30、 16 五. 编程序 1. strcmp(char * s1, char * s2 ) { for(; *s1!= ’\0’ ; ++s1, ++s2) if (*s1!= *s2) break; return (*s1-*s2); } 2. #include #define SIZE 5 main() { int a[SIZE][SIZE], m,n, sum1, sum2; for(m=0;m0) printf("subscript is %d\n",sub); } 5. #include "stdio.h" void main() { int x,k,minsub,n,a[10],temp; scanf("%d",&n); for(k=0;ka[k]) minsub=k ; temp=a[0]; a[0]=a[minsub] ; a[minsub]=temp ; for(k=0;k void main() { FILE *fp; char ch; int count=0; if((fp=fopen("data.txt","r"))==NULL){ printf("不能打开文件data.txt!\n"); exit(0); } while((ch=fgetc(fp))!=EOF) if(ch==’$’) count++; printf("%d",count); fclose (fp); } 8( #include void main() { FILE *fp; char ch; int count=0; if((fp= fopen ("data.txt","r"))==NULL){ printf("不能打开文件data.txt!\n"); exit(0); } while((ch=fgetc(fp))!=EOF) if(ch>=’a’&&ch<=’z’) count++; printf("%d",count); fclose(fp); } 9. #include void main() { FILE *fp ; char ch; int count=0; if((fp=fopen("data.txt","r"))==NULL){ printf("不能打开文件data.txt!\n"); exit(0); } while((ch= fgetc (fp))!=EOF) if(ch<=’9’&&ch>=’0’) count++; printf("%d",count); fclose(fp); } 10. #include void main() { FILE *fp; char ch; int count=0; if((fp= fopen ("data.txt","r"))==NULL){ printf("不能打开文件data.txt!\n"); exit(0); } while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } 11. #include void main() { FILE *fpin,*fpout ; char ch; if((fpin=fopen("data.txt","r"))==NULL){ printf("不能打开文件data.txt!\n"); exit(0); } if((fpout=fopen("res.txt","w"))==NULL){ printf("不能打开文件res.txt!\n"); exit(0); } while((ch=fgetc(fpin))!=EOF) fputc (ch,fpout); fclose(fpin); fclose(fpout); } 12. #include void main() { FILE *fpout; char ch; int k,n; if((fpout=fopen("res.txt", "w"))==NULL){ printf("不能打开文件res.txt!\n"); exit(0); } scanf(“%d”,&n); for(k=0;k void main() { int m,n, i; long sum; sum=0; m=1; scanf(“%d”,&n); for(i=0;i void main() { int k,n,j; long sum; sum=0; k=2; scanf(“%d”,&n); for(j=0;j void main() { int k,n,j; long sum; k=1;sum=0; scanf(“%d”,&n); for(j=0;j void main() { int k,n,j; long sum; k=2; sum=0; scanf(“%d”,&n); for(j=0;j void main() { int k,n; float y; y=1; scanf(“%d”,&n); for(k=1;k<=n;k++) y *=k; printf("%f\n",y); } 18. #include void main() { int k,n; float x, y y=1; scanf(“%f%d”,&x,&n); for(k=1;k<=n;k++) y *=x; printf("%f\n",y); } 19. #define N 10 main( ) { int i, j, k, max, t ; int a[N] ; /* 输入数据 */ printf(" 请输入 10 个数据:\n"); for (i=0;i double mypow(float x, int n) { double y; int j; y=1; for(j=1;j<=n;j++) y*=x; return y; } void main() { int m,n; float x,e; scanf(“%d%d%f”,&m,&n,&x); e = mypow(x,m)/mypow(x,n)/mypow(x,m-n); printf("%f\n",e); } 21. #include #include void main() { int m; scanf("%d",&m); if(isprime(m)) printf("Yes”); else printf("No”); } int isprime(int x) { int i,m; if(x==1) return 0; m=sqrt(x); for(i=2;i<=m;i++) if(x%i==0) return 0; return 1; } 22(#include #include void main() { int m,n; scanf("%d%d",&m,&n); if(myfun(m+n)) printf("Yes”); else printf("No”); } int myfun(int x) { int k; for(k=2;k<=x/2;k++) if(x%k==0) return 0; return 1; } 23. #include #include void main() { int m,n,k; long sum; sum=0; scanf("%d%d",&m,&n); for(k=m;k<=n;k++) if(isodd(k)) sum+=k; printf(“%ld\n”,sum); } int isodd(int x) { return (x%2); } 24. #include float myfact(int n) { float y; int j; y=1; for(j=2;j<=n;j++) y*=j; return y; } void main() { int m,n; float e scanf(“%d%d”,&m,&n); e= myfact(m)/myfact(n)/myfact(m-n); printf("%f\n",e); } 综合自测题1答案 一、单项选择题(每题1分,共20分) 1 2 3 4 5 6 7 8 9 10 B D A C B D A B D A 11 12 13 14 15 16 17 18 19 20 D D C D C A B D B C 二、填充题(每空2分,共30分) 1.? sqrt(s*(s-a)*(s-b)*(s-c)) 2.? ch=(ch>='A'&&ch<='Z')? ch+32: ch 3.? ctype.h 和 string.h 4.? sizeof(student) 或 sizeof(x) 5.? float f1(float,float,float,float) ? void swap(float*,float*) 或 void swap(float&,float&) 6.? int a[], int n ? a[k]0),输出它们的偶数和。 #include void main() { int i,n,x,sum=0; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&x); if(x%2==0) sum+=x; } printf("%d\n",sum); } 2. 编制函数,将m行n列数组a每行所有元素都除以该行上绝对值最大的那个元素的绝对值,要求所编写的函数原型为“void f(float **a,int m,int n)”或“void f(float *a[],int m,int n)”。 void f(float **a,int m,int n) { int i,j; float x; for(i=0;ifabs(x)) x= fabs(*(*(a+i)+j)); for(j=0;jnext=p->next_____ ____p->next=p0___________ 三、程序分析题 (共30分) 1 (1) ______23________________ (2) ______35_________________ 2 ____2 1 6 1____________ 3 __3 4 5 6 7 8 9 0 1 2___________ 4 ___TC______________________ 四、程序设计题 (每题10分,共20分) 1. main() { int a[100], i, k; /* 输入99个有序整数 */ for(i=0; i<99; i++) scanf("%d",&a[i]); /* 输入一个整数 */ scanf("%d",&k); /* 把它放到数组适当位置 */ for(i=98; i>=0; i--) if(a[i]>k) a[i+1]=a[i]; else { a[i+1]=k; break; } /* 输出数组 */ for(i=0;i<100;i++) printf("a[%d]=%d ",i,a[i]); printf("\n"); } 2.# include # include void main(argc, argv) int argc; char ** argv; { FILE ,fp; char * option, * filename; int tag=0; char ch; if (argc <2 || argc>3) {printf( “Argument error\n”); return;} if (argc == 3) { “-l”) == 0) tag=1; if (strcmp(argv[1], “-u”) == 0) tag=2; else if (strcmp(argv[1], “Option error\n”); return;} else {printf( filename = argv[2]; } else filename = argv[1]; “r”)) == NULL) { if ((fp=fopen(filename, “Cannot open file\n”); printf( return; } while ( ! feof(fp) ) { ch = fgetc(fp); if ( tag == 1 ) putchar(tolower(ch)); else if ( tag == 2 ) putchar(toupper(ch)); else putchar(ch); } fclose(fp); return; } 综合自测题3答案 一、单项选择题(每题2分,共20分) 题号 1 2 3 4 5 6 7 8 9 10 选择 A B A D C A B D C C 二、填充题(每空3分,共24 分) 1 18,14,A 2 7, -13 3 0BC 4 0, 1, 3, 5 10, 41, 70 6 3, 7, 11, 7 g=4, g=3, k=6 8 typedef int NUM[10] 三、程序分析题 (每题5分,共20分) 1 4, 3, 4, 2, 7—1, 5, 4, 1, 6 2 3 统计二进制数中1的数目 3 2,1,4,3,6,(4,1,2,3,6,j) 4 ,3,4,5,1,2 四、程序填空题(每空 2 分,共 20 分) (1) sqrt( point[k].x * point[k].x + point[k].y * point[k].y ); (2) point[k].length > point[sub].length (3) sub = k; (4) strcpy( string,str[0] ); (5) strcat( string,str[k] ); (6) char s[ ] 或 char *s (7) d = d * 16 + s[k] - '0'; (8) d = d * 16 + s[k] - 'a' + 10; (9) yearday -= day_tab[leap][k]; (10) k 五、程序设计题 (共16分) 1、 int sum_fact(int number) 定义、变量说明、返回 2分 { int k, sum = 0; if ( number < 0 ) number = - number; for(k = 1; k <= number; k++) 1 分 if( number%k == 0 ) sum += k; 2 分 return sum; } 2、 # include 头文件、变量说明 1 分 main() { FILE *fpin, *fpout; int x; if (( fpin = fopen("input.txt","r" )) == NULL){ 2 分 printf( "Can't open file input.txt\n" ); exit(0); } if (( fpout = fopen("output.txt","w" )) == NULL){ 2 分 printf( "Can't creat file output.txt" ); exit(0); } while ( !feof( fpin )){ 1 分 fscanf( fpin, "%d", &x); 2 分 fprintf( fpout, "%d ", sum_fact(x)); 2 分 } fclose( fpin ); 关闭文件 1 分 fclose( fpout ); }
/
本文档为【C语言同步练习册答案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索