C语言程序设计习题答案_第1页
C语言程序设计习题答案_第2页
C语言程序设计习题答案_第3页
C语言程序设计习题答案_第4页
C语言程序设计习题答案_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计习题答案习题六数组选择题1~10:BDBCDCDBAB11~20:BCDCCDABBC21~30:CCADCABBCB31~41:BDDDDCDCCBA填空题1.9、02.先行后列3.连续的存储空间中4.QuickC5.(c=getchar())、‘A’+i或65+i6.‘\0’、str1[i]-str2[iCDABC10146100000100000100000100000111.60012.AzyD134somestring*test编程题1.定义一个有20个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。答:程序参见文献Cprogram\xt6_3_01.c#include"stdio.h"#include"math.h"main(){inti,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("sumis:%dave=%f\n",s0,s0/10.0);for(i=1;i<20;i+=2) {printf("%3d",a[i]); s1=s1+a[i]; }printf("sumis:%dave=%f\n",s1,s1/10.0);}2.设有一个整型数组,另输入一个整数,编程查找这个整数是否在数组中出现过,若出现,则输出第一次出现的位置,否则,输出nofound。答:程序参见文献Cprogram\xt6_3_02.c#include"stdio.h"#include"math.h"main(){inti,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("nofound\n");for(i=0;i<20;i++) printf("%3d",a[i]);printf("\n");}3.设有一个已排好序的数组,今输入一个数,规定按本来排序的规律将它插入到数组中。答:程序参见文献Cprogram\xt6_3_03.c#include"stdio.h"#defineN10main(){inti,j,s,a[N]={17,15,13,11,9,7,5,3,1};//inta[N]={1,3,5,7,9,11,13,15,17};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.编一程序,从一个已排好序的数组中删去某个位置上的元素。答:程序参见文献Cprogram\xt6_3_04.c#include"stdio.h"#defineN10main(){inti,j,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];a[j]=0; for(i=0;i<N;i++)printf("%3d",a[i]);printf("\n");}5.将一个二维数组的行、列互换后存到另一个二维数组中并输出结果。答:程序参见文献Cprogram\xt6_3_05.c#include"stdio.h"main(){inti,j;inta[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("arraya:\n");for(i=0;i<3;i++) {for(j=0;j<4;j++) printf("%5d",a[i][j]);printf("\n"); }printf("arrayb:\n");for(i=0;i<4;i++) {for(j=0;j<3;j++) printf("%5d",b[i][j]);printf("\n"); }}6.编一程序,在一个二维数组中,查找第一次出现的负数,并输出该数及其所在的行、列号。答:程序参见文献Cprogram\xt6_3_06.c#include"stdio.h"main(){inti,j,flag;inta[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("nofound!");printf("arraya:\n");for(i=0;i<3;i++) {for(j=0;j<4;j++) printf("%5d",a[i][j]);printf("\n"); }}7.编程将一个字符数组中的字母,按由大到小的顺序进行排序。答:程序参见文献Cprogram\xt6_3_07.c#include"stdio.h"#include"string.h"main(){chart,s[]="ABCDIVBHFBVCNLKFDB";inti,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.输入一行字符,记录其中有多少个英语单词,单词之间用空格隔开。答:程序参见文献Cprogram\xt6_3_08.c#include"stdio.h"#include"string.h"main(){chars[81];intw,i,n;gets(s);i=0;n=0;w=0;while(s[i]!='\0'){if(s[i]=='') w=0;/*endofaword*/else if(w==0) {w=1;n++;}/*beginofaword*/i++;}printf("numberofword:%d\n",n);}9.编程将两个一维数组中的相应元素的值相减后进行输出。答:程序参见文献Cprogram\xt6_3_09.c#include"stdio.h"#include"math.h"main(){inti,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中,请将相同的那些数删得只剩得一个,输出通过删除后的数据。答:程序参见文献Cprogram\xt6_3_10.c#include"stdio.h"main(){inti,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.求二维数组中这样一个元素的位置:它在行上最小,在列上也最小。假如没有这样的元素则输出相应的信息。答:程序参见文献Cprogram\xt6_3_11.c#include"stdio.h"#include"math.h"main(){intj,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("mina[%d][%d]=%d\n",i,j,a[i][j]);} } }if(fz==0) printf("nofound!");}12.在一个二维数组中形成并输出如下矩阵:1111121111A=321114321154321答:程序参见文献Cprogram\xt6_3_12.c#include"stdio.h"#defineN5main(){intj,i,a[N][N];for(i=0;i<N;i++) for(j=0;j<N;j++) {if(i<=j) a[i][j]=1; elseif(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矩阵。答:程序参见文献Cprogram\xt6_3_13.c#include"stdio.h"main(){intj,i,k,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};intb[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("arrayA(3*4):\n");for(i=0;i<3;i++) {for(j=0;j<4;j++) printf("%4d",a[i][j]);printf("\n"); }printf("arrayB(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("arrayC(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.编程输出两个字符串中相应位置上相同的字符。答:程序参见文献Cprogram\xt6_3_14.c#include"stdio.h"main(){inti;chara[81]="acbsbdvhfejbvewvkbewljbv";charb[81]="anbdxwdbviuerkjvbfidbvuiebik";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中。答:程序参见文献Cprogram\xt6_3_15.c#include"stdio.h"#include"string.h"main(){inti,j,k;chara[81]="acdfhjklmopxz";charb[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中。答:程序参见文献Cprogram\xt6_3_16.c#include"stdio.h"#include"string.h"main(){inti,j,k;chara[81]="acdfhjklmopxz";charb[81]="abdnx";charc[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:BDCDDBDBAC11~20:AABBBABAAC21~31:CDAACDDABBA填空题函数声明自动将其转换为函数定义时的类型1011009.000000i<=n、s、0、f(k)0.5*(x0+a/x0)、a,x1Itis27210246k、-12、2p=j、x[i][p]5724age(n-1)+2、age(n)m%10、m/10、m或m!=0、r(m)编程题1.编一函数,判断某年是否为闰年,若是返回1,否则返回0。答:程序参见文献Cprogram\xt7_3_01.c#include<stdio.h>fun(intm){return(m%4==0)&&(m%100!=0)||(m%400==0);}main(){intn;for(n=1987;n<2023;n++)if(fun(n))printf("year:%disaleap!\n",n);}2.编写计算三角形面积的程序,将计算面积定义成函数。三角形面积公式为:A=式中s=(a+b+c)/2其中A为三角形面积,a、b、c为三角形的三条边的长度。答:程序参见文献Cprogram\xt7_3_02.c#include<math.h>#include<stdio.h>floatfun(floata,floatb,floatc){floatf,s;s=(a+b+c)/2;if((s<=a)||(s<=b)||(s<=c))//或(a+b)>c&&(a+c)>b&&(b+c)>af=0;elsef=sqrt(s*(s-a)*(s-b)*(s-c));returnf;}main(){floata,b,c;scanf("%f%f%f",&a,&b,&c);printf("areais:%f\n",fun(a,b,c));}3.编写两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。答:程序参见文献Cprogram\xt7_3_03.c#include<math.h>#include<stdio.h>intfmax(intm,intn){intr;r=m%n;while(r!=0){m=n;n=r;r=m%n;}returnn;}intfmin(intm,intn){returnm*n/fmax(m,n);}main(){inta,b;scanf("%d%d",&a,&b);printf("fmaxis:%d\n",fmax(a,b));printf("fminis:%d\n",fmin(a,b));}4.编写函数,根据整型形参m的值,计算公式t=1---…-的值。例如,若m=5,则应输出0.536389。答:程序参见文献Cprogram\xt7_3_04.c#include<stdio.h>floatfun(intm){floatt=1;inti;for(i=2;i<=m;i++)t=t-1.0/i/i;returnt;}main(){printf("t(5)=%f\n",fun(5));}5.计算s=1+++…+。n由终端输入,将计算n!定义成函数。答:程序参见文献Cprogram\xt7_3_05.c#include<stdio.h>floatfun(intm){inti;floats=0,t=1;for(i=1;i<=m;i++){t=t/i;s=s+t;}returns;}main(){printf("s(5)=%f\n",fun(5));}6.编写函数,运用公式:计算π的近似值,当某一项的值小于10-5时,认为达成精度规定。答:程序参见文献Cprogram\xt7_3_06.c#include<stdio.h>doublefun(){intn;doublepi=1,t=1;n=1;do{t=t*n/(2*n+1);pi=pi+t;n++;}while(t>1e-5);return2*pi;}main(){printf("pi=%f\n",fun());}7.编一函数,判断某一整数是否为回文数,若是返回1,否则返回0。所谓回文数就是该数正读与反读是同样的。例如12321就是一个回文数。答:程序参见文献Cprogram\xt7_3_07.c#include<stdio.h>#include<math.h>inthuiwen(intm){intt,n=0;t=m;while(t){n++;t=t/10;}//求出M是几位的数t=m;while(t){if(t/(int)pow(10,n-1)!=t%10)//比较其最高位和最低位return0;else{t=t%(int)pow(10,n-1);//去掉其最高位t=t/10;//去掉其最低位n=n-2;//位数去掉了两位}}return1;}main(){intx;scanf("%d",&x);if(huiwen(x))printf("%disahuiwen!\n",x);elseprintf("%disnotahuiwen!\n",x);}8.编写一个求水仙花数的函数,然后通过主函数调用该函数求100到999之间的所有水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数自身。例如:153就是一个水仙花数:153=1*1*1+5*5*5+3*3*3答:程序参见文献Cprogram\xt7_3_08.c#include<stdio.h>#include<math.h>intfun8(intm){inta,b,c;a=m/100;b=m/10%10;c=m%10;if(m==a*a*a+b*b*b+c*c*c)return1;elsereturn0;}main(){inti;for(i=100;i<=999;i++) if(fun8(i))printf("%5d",i);printf("\n");}9.编一函数primedec(m),求整数m的所有因子并输出。例如:120的因子为:2,2,2,3,5答:程序参见文献Cprogram\xt7_3_09.c#include<stdio.h>#include<math.h>voidprimedec(intm){intn=2;while(m>1){while(m%n==0) {printf("%d",n);m=m/n;}n++;}printf("\n");}main(){intx;scanf("%d",&x);primedec(x);}10.求100~200之间的所有素数,按每行6个输出。答:程序参见文献Cprogram\xt7_3_10.c#include<stdio.h>#include<math.h>intprime(intm){intn,f=1;for(n=2;n<m;n++) if(m%n==0) {f=0;break;}returnf;}main(){intx,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。答:程序参见文献Cprogram\xt7_3_11.c#include<stdio.h>#include<math.h>intreverse(intm){intx=0;while(m) {x=x*10+m%10; m=m/10; }returnx;}main(){intw;scanf("%d",&w);printf("%d==>%d\n",w,reverse(w));}12.编一函数,将一个字符数组中的数字字符存于另一个字符数组中。答:程序参见文献Cprogram\xt7_3_12.c#include<stdio.h>#include<string.h>voidfun12(chara[],charb[]){inti=0,j;for(j=0;j<strlen(b);j++) if(b[j]>='0'&&b[j]<='9') a[i++]=b[j];a[i]='\0';}main(){chars1[81],s2[81];gets(s2);fun12(s1,s2);puts(s2);puts(s1);}13.编一函数,记录一个字符串中字母、数字、空格和其它字符的个数。答:程序参见文献Cprogram\xt7_3_13.c#include<stdio.h>#include<string.h>voidfun13(chars[]){inti,num=0,ch=0,sp=0,oh=0;charc;for(i=0;(c=s[i])!='\0';i++)if(c=='')sp++;elseif(c>='0'&&c<='9')num++;elseif(toupper(c)>='A'&&toupper(c)<='Z')ch++;elseoh++;printf("char:%d,number:%d,space:%d,other:%d\n",ch,num,sp,oh);}main(){chars1[81];gets(s1);fun13(s1);}14.用递归的方法实现求1+2+3+…+n。答:程序参见文献Cprogram\xt7_3_14.c#include<stdio.h>#include<string.h>intfun14(intm){intw;if(m==1)w=1;elsew=fun14(m-1)+m;returnw;}main(){intx,i;scanf("%d",&x);printf("1+2+...+%d=%d\n",x,fun14(x));}15.用递归的方法将一个整数转换成字符串。例如:输入345,应输出字符串“345”答:程序参见文献Cprogram\xt7_3_15.c#include<stdio.h>#include<string.h>voidfun15(intm){if(m!=0){fun15(m/10);printf("%c",'0'+m%10);}}main(){intx;scanf("%d",&x);printf("%d==>",x);fun15(x);printf("\n");}16.用递归的方法计算下列函数的值:p(x,n)=x-x2+x3-x4+……(-1)n-1xnn>0答:程序参见文献Cprogram\xt7_3_16.c#include"stdio.h"#include"math.h"floatp(floatx,intn){floatf;if(n==0)f=0;elsef=p(x,n-1)+pow(-1,n-1)*pow(x,n);returnf;}main(){printf("p(2,3)=%f",p(2,3));}17.采用递归的方法计算x的n次方。答:程序参见文献Cprogram\xt7_3_17.c#include"stdio.h"#include"math.h"floatp(floatx,intn){floatf;if(n==0)f=1;elsef=p(x,n-1)*x;returnf;}main(){printf("p(2,8)=%f",p(2,8));}18.根据勒让德多项式的定义计算Pn(x)。n和x为任意正整数,把计算Pn(x)定义成递归函数。1n=0Pn(x)=xn=1((2n-1)Pn-1(x)-(n-1)Pn-2(x))/n)n>1答:程序参见文献Cprogram\xt7_3_18.c#include"stdio.h"floatp(floatx,intn){floatf;if(n==0)f=1;elseif(n==1) f=x; elsef=((2*n-1)*p(x,n-1)-(n-1)*p(x,n-2))/n;returnf;}main(){printf("p(2,8)=%f",p(2,8));}习题八用户标记符的作用域和存储类一.选择题1—10:ADBBCCABDB11-20:DBABCCCDAC二.填空题1.静态局部变量的作用域是从定义点到函数体(或复合语句)结束。2.凡在函数中未指定存储类别的变量,其隐含的存储类别为auto。3.变量的作用域是指变量的有效范围,在作用域内可以引用该变量。按作用域来说,变量可分为①局部变量和②全局变量。4.根据函数能否被其它源文献调用,函数可分为①外部函数和②静态(或内部)函数。5.下列程序的输出结果是2468。#include<stdio.h>#defineMAX_COUNT4voidfun();main(){intcount;for(count=1;count<=MAX_COUNT;count++)fun();}voidfun(){staticinti;i+=2;printf("%d",i);}6.下列程序的输出结果是2,5,1,2,3,-2。main(){inta=3,b=2,c=1;c-=++b;b*=a+c;{intb=5,c=12;c/=b*2;a-=c;printf(“%d,%d,%d,”,a,b,c);a+=--c;}printf(“%d,%d,%d\n”,a,b,c);}7.下列程序的输出结果是。a=5a*a=25a=5a*a=25a*a*a=8staticinta=5;main(){printf(“a=%d\n”,a);p1();p2();}p1(){printf(“a*a=%d\n”,a*a);a=2;}p2(){printf(“a*a*a=%d\n”,a*a*a);}8.下列程序的输出结果是20,10。#include<stdio.h>main(){intx=10;{intx=20;printf(“%d,”,x);}printf(“%d\n”,x);}9.下列程序由两个文献组成,其运营结果是x=2。/*文献1*/intx;sub(){x=4;}/*文献2*/staticintx=2;main(){sub();printf(“x=%d\n”,x);}10.下列程序由两个文献组成,其运营结果是x=25,y=25。/*文献1*/#include<stdio.h>intx=10;inty=10;voidadd(void){y=x+10;x*=2;}main(){externvoidsub();x+=5;add();sub();printf(“x=%d,y=%d\n”,x,y);}/*文献2*/voidsub(void){externintx;x-=5;}11.下列程序由两个文献组成,其运营结果是。/*文献1*/#include<stdio.h>add:y=25; sub:y=5; main:x=25; main:y=10intx=10;inty=10;add:y=25; sub:y=5; main:x=25; main:y=10externvoidsub();voidadd(void){inty=5;y=x+10;x*=2;printf(“add:y=%d;”,y);}main(){x+=5;add();sub();printf(“main:x=%d;main:y=%d\n”,x,y);}/*文献2*/externintx;voidsub(void){inty=5;x-=y;printf(“sub:y=%d;”,y);}12.下列程序由两个文献组成,其运营结果是。/*文献1*/inadd1x=4y=6ininadd1x=4y=6inadd2x=20y=8inadd1x=6y=11inadd2x=30y=13inmainx=6y=13staticintx=2;inty=3;externvoidadd2();voidadd1();main(){add1();add2();add1();add2();printf(“inmainx=%dy=%d\n”,x,y);}voidadd1(void){x+=2;y+=3;printf(“inadd1x=%dy=%d”,x,y);}/*文献2*/staticintx=10;voidadd2(void){externinty;x+=10;y+=2;printf(“inadd2x=%dy=%d\n”,x,y);}习题九编译预解决一.选择题1—10:DDCBCCABBB11-20:BBCBB二.填空题1.下列程序的输出结果是100010。#defineN10#defines(x)x*x#definef(x)(x*x)main(){inti1,i2;i1=1000/s(N);i2=1000/f(N);printf(“%d%d\n”,i1,i2);}2.设有如下宏定义:#defineMYSWAP(z,x,y){z=x;x=y;y=z;}以下程序段通过宏调用实现变量a、b内容互换,请填空。floata=5,b=16,c;MYSWAP(c,a,b);3.下列程序的输出结果是11。#defineNX2+3#defineNYNX*NXmain(){inti=0,m=0;for(;i<NY;i++)m++;printf(“%d\n”,m);}4.下列程序的输出结果是7。#defineMAX(x,y)(x)>(y)?(x):(y)main(){inta=5,b=2,c=3,d=3,t;t=MAX(a+b,c+d)*10;printf(“%d\n”,t);}5.下列程序的输出结果是MIN。#defineMAX(a,b)a>b#defineEQU(a,b)a==b#defineMIN(a,b)a<bmain(){inta=5,b=6;if(MAX(a,b))printf(“MAX\n”);if(EQU(a,b))printf(“EQU\n”);if(MIN(a,b))printf(“MIN\n”);}6.下列程序的输出结果是011。#defineTESTmain(){intx=0,y=1,z;z=2*x+y;#ifdefTESTprintf(“%d%d”,x,y);#endifprintf(“%d\n”,z);}三.编程题1.定义一个带参的宏,求两个整数的余数。通过宏调用,输出求得的结果。#defineR(m,n)(m)%(n)#include<stdio.h>voidmain(){ intm,n; printf("entertwointegers:\n"); scanf("%d%d",&m,&n); printf("remainder=%d\n",R(m,n));}2.分别用函数和带参的宏,从3个数中找出最大者。#include<stdio.h>#defineMAX(a,b)((a)>(b)?(a):(b))//implementationbyMACROintmax3(inta,intb,intc)//implementationbyfunction{intm;m=a>b?a:b;m=m>c?m:c;returnm;}voidmain(){ intm,n,k; printf("enter3integer:\n"); scanf("%d%d%d",&m,&n,&k); printf("1.MACROmax=%d\n",MAX(MAX(m,n),k)); printf("2.functionmax=%d\n",max3(m,n,k));}3.输入一个整数m,判断它能否被3整除。规定运用带参的宏实现。#include<stdio.h>#defineDIVIDEDBY3(m)(m)%3==0voidmain(){ intm; printf("enterainteger:\n"); scanf("%d",&m); if(DIVIDEDBY3(m)) printf("%disdividedby3\n",m); else printf("%disnotdividedby3\n",m);}习题十指针一.填空题1.指针变量是把内存中另一个数据的首地址作为其值的变量。2.可以直接赋值给指针变量的整数是0。3.假如程序中已有定义:intk;定义一个指向变量k的指针变量p的语句是int*p=&k;。通过指针变量,将数值6赋值给k的语句是*p=6;。定义一个可以指向指针变量p的变量pp的语句是int**pp;。通过赋值语句将pp指向指针变量p的语句是pp=&p;。通过指向指针的变量pp,将k的值增长一倍的语句是(**pp)*=2;。4.当定义某函数时,有一个形参被说明成int*类型,那么可以与之结合的实参类型可以是整型数组名、指向整型数据的指针值等。5.以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。#include<stdio.h>main(){char*p,s[6];intn;p=s;gets(p);n=*p-'0';while(*(p++)!='\0')n=n*8+*p-'0';printf("%d\n",n);}二.选择题1—10:BCADCAAABB11-15:CBCDC16.以下count函数的功能是记录substr在母串str中出现的次数。intcount(char*str,char*substr){inti,j,k,num=0;for(i=0;①;i++){for(②,k=0;substr[k]==str[j];k++,j++)if(substr[③]==’\0’){num++;break;}}returnnum;}①A)str[i]==substr[i]B)str[i]!=‘\0’C)str[i]==‘\0’D)str[i]>substr[i]②A)j=i+1B)j=iC)j=i+10D)j=1③A)kB)k++C)k+1D)++k17.以下Delblank函数的功能是删除字符串s中的所有空格(涉及Tab、回车符和换行符)。voidDelblank(char*s){inti,t;charc[80];for(i=0,t=0;①;i++)if(!isspace(②))c[t++]=s[i];c[t]=‘\0’;strcpy(s,c);}①A)s[i]B)!s[i]C)s[i]=‘\0’D)s[i]==‘\0’②A)s+iB)*c[i]C)*(s+i)=‘\0’D)*(s+i)18.以下conj函数的功能是将两个字符串s和t连接起来。char*conj(char*s,char*t){char*p=s;while(*s)①;while(*t){*s=②;s++;t++;}*s=‘\0’;③;}①A)s--B)s++C)sD)*s②A)*tB)tC)t--D)*t++③A)returnsB)returntC)returnpD)returnp-t19.下列程序的输出结果是。#include<stdio.h>main(){int**k,*a,b=100;a=&b;k=&a;printf(“%d\n”,**k);}A)运营犯错B)100C20.下列程序的输出结果是。#include<stdio.h>fun(int*a,int*b){int*w;*a=*a+*a;*w=*a;*a=*b;*b=*w;}main(){intx=9,y=5,*px=&x,*py=&y;fun(px,py);printf(“%d,%d\n”,x,y);}A)犯错B)18,5C)5,9D)5,1821.若定义了以下函数:voidf(……){……p=(double*)malloc(10*sizeof(double));……}p是该函数的形参,规定通过p把动态分派存储单元的地址传回主调函数,则形参p的对的定义应当是。A)double*p B)float**pC)double**p D)float*p三.编程题1.编写函数,对传递进来的两个整型量计算它们的和与积之后,通过参数返回。#include<stdio.h>voidcompute(intm,intn,int*sum,int*p);voidcompute(intm,intn,int*sum,int*p){ *sum=m+n; *p=m*n;}voidmain(){ intx,y,sum,product; printf("enter2integers:\n"); scanf("%d%d",&x,&y); compute(x,y,&sum,&product); printf("x=%dy=%dsum=%dproduct=%d\n",x,y,sum,product);}2.编写一个程序,将用户输入的字符串中的所有数字提取出来。#include<stdio.h>#include<string.h>voidmain(){ charstring[81],digit[81]; char*ps; inti=0; printf("enterastring:\n"); gets(string); ps=string; while(*ps!='\0') {if(*ps>='0'&&*ps<='9') { digit[i]=*ps; i++; } ps++; } digit[i]='\0'; printf("string=%sdigit=%s\n",string,digit);}3.编写函数实现,计算字符串的串长。#include<stdio.h>#include<string.h>intStringLength(char*s);intStringLength(char*s){ intk; for(k=0;*s++;k++); returnk;}voidmain(){ charstring[81]; printf("enterastring:\n"); gets(string); printf("lengthofthestring=%d\n",StringLength(string));}4.编写函数实现,将一个字符串中的字母所有转换为大写。#include<stdio.h>#include<string.h>char*Upper(char*s);char*Upper(char*s){ char*ps; ps=s; while(*ps) {if(*ps>='a'&&*ps<='z') *ps=*ps-32; ps++; } returns;}voidmain(){charstring[81]; printf("enterastring:\n"); gets(string); printf("beforeconvert:string=%s\n",string); printf("afterconvert:string=%s\n",Upper(string));}5.编写函数实现,计算一个字符在一个字符串中出现的次数。#include<stdio.h>#include<string.h>intOccur(char*s,charc);intOccur(char*s,charc){ intk=0; while(*s) {if(*s==c) k++; s++; } returnk;}voidmain(){ charstring[81],c; printf("enterastring:\n"); gets(string); printf("enteracharacter:\n"); c=getchar(); printf("character%coccurs%dtimesinstring%s\n",c,Occur(string,c),string);}6.编写函数实现,判断一个子字符串是否在某个给定的字符串中出现。#include<stdio.h>#include<string.h>intIsSubstring(char*str,char*substr){ inti,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; } } returnnum;}voidmain(){ charstring[81],sub[81]; printf("enterfirststring:\n"); gets(string); printf("entersecondstring:\n"); gets(sub); printf("string'%s'is",sub); if(!IsSubstring(string,sub)) printf("not"); printf("substringof'%s'\n",string);}7.有n个人围成一圈,顺序排号。由用户从键盘输入报数的起始位置,从该人开始报数(计数从0开始),凡报数为3的倍数出圈。问最后剩下的是几号?见导学例10.258.由一个整型二维数组,大小为m×n,规定找出其中最大值所在的行和列,以及该最大值。请编一个函数max,数组元素在main函数中输入,结果在函数max中输出。见导学例10.269.由n个学生,每个学生考m门课程,规定编一函数,能检查n个学生有无不及格的课程,假如由某一学生有一门或一门以上课程不及格,就输出该学生的号码(学号从0开始)和其所有课程成绩。见导学例10.27习题十一结构体、共用体和用户定义类型一、选择题1—10:AABDDBDDDC11-20:CBBCC二、填空题1.若有下面的定义:struct{intx;inty;}s[2]={{1,2},{3,4}},*p=s;则表达式++p->x的值为_____2______;表达式(++p)->x的值为____3_____。2.为了建立如图11.12所示的链表,结点的对的描述形式是:datanextdatanextdatanext图11.12链表的结点 structnode { int data; structnode*next; };3.已知head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。下面的sum函数是求出链表中所有结点数据域值的和,作为函数值返回。请填空完善程序。structlink{ intdata; structlink*next;}main(){ structlink*head;ints;┆ s=sum(head);┆}intsum(structlink*head){ structlink*p; ints=0; p=head->next; while(p) { s+=p->data; p=p->next; } return(s);}4.设有共用体类型和共用体变量定义如下: unionUtype { charch;intn;longm; floatx;doubley; };unionUtypeun; 并假定un的地址为ffca。则un.n的地址是__ffca_,un.y的地址是__ffca__。执行赋值语句:un.n=321;后,再执行语句:printf("%c\n",un.ch);其输出值是__A_。(提醒:321D=B)(进一步提醒:01000001B=65D,char与int的比特位分布关系参见课本P30。)三、编程题1.编写程序,进行两个复数的相减。#include<stdio.h>structComplex{ doublem_r,m_i;};structComplexsub(structComplexc1,structComplexc2){ structComplexc; c.m_r=c1.m_r-c2.m_r; c.m_i=c1.m_i-c2.m_i; returnc;}voidmain(){structComplexc1={1.2,2.3},c2={0.2,0.3};structComplexc;c=sub(c1,c2);printf(“c=%g+i%g\n”,c.m_r,c.m_i);}2.定义一个涉及年、月、日的结构体。输入一个日期,计算该日在本年中是第几天?注意闰年问题。#include<stdio.h>structymd{ intday; intmonth; intyear;};intdayof[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};intdays(structymd*p){ inti,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);}voidmain(){ structymddate; intd; 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("\nThedayoftheyearis%d!\n\n",d); }}3.有10个学生,每个学生的数据涉及学号、姓名、3门课程的成绩。从键盘输入10个学生的数据,规定输出3门课程的总平均成绩,以及最高分的学生的学号、姓名、3门课程成绩、平均分数。#include<stdio.h>#defineN10structstudent{charnum[6];charname[8];floatscore[3];floatavr;}stu[N];voidmain(){inti,j,maxi; floatsum,max,average; for(i=0;i<N;i++){printf("inputscoresofstudent%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.namescorelscore2score3average\n"); 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("Thehighestscoreis:student%s,%s.\n",stu[maxi].num,stu[maxi].name); printf("Hisscoresare:%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.13所示。/*结点结构Node*/structNode{intdata;structNode*next;};115\02连接前head179\0head2152连接后head179\0图11.13链表的连接提醒:函数原型为:structNode*link(structNode*head1,structNode*head2);structNode*link(structNode*head1,structNode*head2){ structNode*p,*head0; p=head1; head0=head1; while(p->next!=NULL) p=p->next; p->next=head2; returnhead0;}5.有两个链表a和b。设结点中涉及学号、姓名。从a链表中删除去与b链表中有相同学号的那些结点。#include<stdio.h>#include<string.h>#defineLA4#defineLB5structstudent{intnum;charname[8];structstudent*next;}a[LA],b[LB];voidmain(){structstudenta[LA]={{101,"Wang"},{102,"Li"},{105,"Zhang"},{106,"Wei"}};structstudentb[LB]={{103,"Zhang"},{104,"Ma"},{105,"Chen"},{107,"Guo"}, {108,"lui"}};inti;structstudent*p,*p1,*p2,*head1,*head2;head1=a;head2=b;printf("listA:\n");for(p1=head1,i=1;i<=LA;i++){if(i<LA)p1->next=a+i;elsep1->next=NULL;printf("%4d%8s\n",p1->num,p1->name);if(i<LA)p1=p1->next;}printf("\nlistB:\n");for(p2=head2,i=1;i<=LB;i++){if(i<LB)p2->next=b+i;elsep2->next=NULL;printf("%4d%8s\n",p2->num,p2->name);if(i<LB)p2=p2->

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论