main(){inta[]={1,2,3,4,5};intx,y,*p;p=&a[0];x=*(p+2);y=*(p+4);printf("%d,%d,%dn",*p,x,y);}A)1,3,5B)1,2,3C)1,2,4D)1,4,5【2.47】下面程序的输出结果是____。voidive(x,n)intx[],n;{intt,*p;p=x+n-1;while(xchar*p="abcdefghijklmnopq";main(){inti=0;while(*p++!='e');printf("%cn",*p);}A)cB)dC)eD)f【2.50】下面程序的输出结果是____。#includef(intx,inty){return(y-x);}main(){inta=5,b=6,c;intf(),(*g)()=f;printf("%dn",(*g)(a,b));}A)1B)2C)3D)前面三个参考答案均是错误的【2.51】下面程序的输出结果是____。#includemain(){inta=1,*p,**pp;pp=&p;p=&a;a++;printf("%d,%d,%dn",a,*p,**pp);}140nA)2,1,1B)2,1,2C)2,2,2D)程序有错误【2.52】下面程序的输出结果是____。main(){char*alpha[7]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX","YZ"};char**p;inti;p=alpha;for(i=0;i<4;i++)printf("%c",*(p[i]));printf("n");}A)AEIMB)BFJNC)ABCDD)DHLP【2.53】下面程序的输出结果是____。#includechar*pp[2][3]={"abc","defgh","ijkl","mnopqr","stuvw","xyz"};main(){printf("%cn",***(pp+1));/*①*/printf("%cn",**pp[0]);/*②*/printf("%cn",(*(*(pp+1)+1))[4]);/*③*/printf("%cn",*(pp[1][2]+2));/*④*/printf("%sn",**(pp+1));/*⑤*/}①A)aB)dC)iD)m②A)aB)dC)iD)m③A)hB)lC)qD)w④A)kB)oC)uD)z⑤A)ijklB)mnopqrC)stuvwD)xyz【2.54】下面程序的输出结果是____。#include"stdio.h"structstr1{charc[5];char*s;};main(){structstr1s1[2]={{"ABCD""EFGH"},{"IJK","LMN"}};structstr2{structstr1sr;intd;}s2={"OPQ","RST",32767};140nstructstr1*p[2];p[0]=&s1[0];p[1]=&s1[1];printf("%s",++p[1]->s);/*①*/printf("%c",s2.sr.c[2]);/*②*/}①A)LMNB)MNC)ND)IJK②A)OB)PC)QD)R【2.55】以下程序的输出结果是____。structst{intx,*y;}*p;ints[]={10,20,30,40};structsta[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};main(){p=a;printf("%dn",++(*(++p)->y));}A)10B)11C)20D)21【2.56】以下程序的输出结果是____。#includemain(){unionEXAMPLE{struct{intx,y;}in;inta,b;}e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf("%d,%dn",e.in.x,e.in.y);}A)2,3B)4,4C)4,8D)8,8【2.57】下面程序的输出结果是____。#includemain(){union{inti[2];140nlongk;charc[4];}r,*s=&r;s->i[0]=0x39;s->i[1]=0x38;printf("%cn",s->c[0]);}A)39B)9C)38D)8【2.58】下面程序的输出是。main(){printf("%dn",EOF);}A)-1B)0C)1D)程序是错误的 【阅读程序题参考答案】【2.1】参考答案:D注释:程序中除法运算的两个操作数均是整型,运算结果也是整型。【2.2】参考答案:B注释:C语言允许在程序块(分程序)中说明变量。【2.3】参考答案:C注释:变量i中的负号传送给变量n后,因n是无符号数,已不作为负号处理。【2.4】参考答案:D注释:对变量x的――操作是后缀形式,变量x的减1操作要在执行完printf函数之后才进行,所以变量x的值在输出的时候仍然保持原值10。【2.5】参考答案:B注释:C语言在执行printf()时,对函数中的表达式表列的处理顺序是从后向前,即先处理n--,再处理n++,最后处理n,而且每一个表达式作为一个处理单元,也就是说在不同的表达式中自增自减运算是单独考虑的。【2.6】参考答案:A注释:变量x和变量y做按位与,结果为0x0200,右移4位为0x0020,再与0x005f做按位或,最后结果为0x007f。【2.7】参考答案:A注释:逗号表达式的结果是用逗号分开的最后一个表达式的值,此题由于c=='A'的值是0,所以逗号表达式的值为0。【2.8】参考答案:B【2.9】参考答案:A【2.10】参考答案:C注释:在输出格式描述"%m.ns"中,m是输出总长度,n是实际字符的个数,这里m没有给出,则输出总长度就是实际输出字符的个数。【2.11】参考答案:C【2.12】参考答案:B【2.13】参考答案:C【2.14】参考答案:B140n【2.15】参考答案:D【2.16】参考答案:A【2.17】参考答案:C【2.18】参考答案:A【2.19】参考答案:C注释:在switch语句中,case本身仅起到语句标号的作用,不会改变语句的流程,执行break语句才能退出当前的switch语句。【2.20】参考答案:D注释:siwtch语句的表达式中,变量c是后缀的增一运算,第一次执行do-while循环时,执行case'A'后面的语句。 【2.21】参考答案:D【2.22】参考答案:B【2.23】参考答案:B注释:fabs()是浮点数绝对值函数。【2.24】参考答案:A【2.25】参考答案:C注释:C语言允许在程序块(分程序)内说明变量,如果在程序块内说明的变量和程序块外的变量同名,在块外说明的变量在块内是不可见的。可将此题和【2.11】进行比较,加深理解。【2.26】参考答案:C【2.27】参考答案:B【2.28】参考答案:①D②A【2.29】参考答案:D【2.30】参考答案:B注释:输出结果为字符串长度。【2.31】参考答案:D注释:字符串拷贝函数strcpy()要求的两个参数都是字符串首地址。本题中第二个参数是字符串常量,接受这个字符串的第一个参量不是直接给出字符数组名,而是进行了地址运算后的结果。由于str字符串的长度是13,除2取整后是6,第一个参数给出的地址是字符数组str的首地址加6,也就是原来字符串中第二个空格的位置,把"esshe"从该处放入,字符串str变为"Howdoesshe"。【2.32】参考答案:C注释:main函数调用func函数时,第一个实参使用的是逗号表达式的值,也就是x+y的结果。由于对变量x、y、z进行的是后缀运算,所以函数func的参数值是13和8。【2.33】参考答案:C【2.34】参考答案:①C②A③C【2.35】参考答案:C【2.36】参考答案:B注释:函数fun进行了递归调用,实际进行的运算是5×4×3×2×1×3×10。主函数内说明的局部变量w屏蔽了外部变量w,所以在主函数中外部变量w是不可见的,在调用printf函数时表达式"fun(5)*w"中w的值是10。【2.37】参考答案:D注释:main函数三次调用了函数funa,在funa函数中的静态变量c仅在第一次调用时进行了初始化,再次调用时不再对静态变量赋初值。【2.38】参考答案:B140n注释:main函数和num函数中都说明了变量a和b,由于它们是内部变量,所以它们分别在说明它们的函数内有效。外部变量x和y在函数num之后被说明,而在num函数中又要引用它们,所以在num函数中用关键字"extern"说明变量x和y是一个外部变量,也就是通知计算机这两个变量在fun函数以外被说明,此处不是定义两个int型变量。【2.39】参考答案:D注释:函数f中的变量c是静态变量,仅在第一次调用函数f时它被初始化为3,第二次调用函数f时c的值是4,第三次调用函数f时c的值是5。【2.40】参考答案:D 【2.41】参考答案:D注释:程序中有三个"x"分别在三个不同的函数中,这三个"x"都是自动变量,所以三个"x"分别局部于三不同的函数,在三个函数中对"x"的操作互不影响。【2.42】参考答案:A【2.43】参考答案:A注释:*(++p)和*++p都是指针变量值前加1,第一次指向a[1],第二次指向a[2];a+3是a[3]的地址。【2.44】参考答案:C注释:②句没有语法错误,但是a+6指向数组之外,因为a是a[0]的地址,a+1是a[1]的地址,a+2是a[2]的地址,显然数组a没有a[6]分量。③句错误,因为a[1]是地址常量,它是a[1][0]的地址,对于地址常量是不可以进行赋值运算的。【2.45】参考答案:①D②A注释:如果FMT定义为"%xn",则输出的16进制数据用小写字母表示。【2.46】参考答案:A注释:语句"p=&a[0]"表示将数组a中元素a[0]的地址赋给指针变量p,则p就是指向数组首元素a[0]的指针变量,"&a[0]"是取数组首元素的地址。对于指向数组首址的指针,p+i(或a+i)是数组元素a[i]的地址,*(p+i)(或*(a+i))就是a[i]的值。【2.47】参考答案:B【2.48】参考答案:D【2.49】参考答案:D【2.50】参考答案:A注释:变量g是指向函数的指针,(*g)(a,b)是调用指针g所指向的函数。【2.51】参考答案:C注释:p是指针,pp是指向指针的指针。【2.52】参考答案:A注释:对于指向数组的指针变量可以做下标运算,p[i]和alpha[i]都是指向字符串的首地址,*p[i]取出字符串的第一个字符。【2.53】参考答案:①D②A③D④D⑤B注释:pp是一个二维指针数组,pp+1指向数组的第二维,*(pp+1)是第二维的起始地址,**(pp+1)是第二维第一个元素的地址,***(pp+1)是第二维第一个元素的内容,所以,①的参考答案应选D。*(pp+1)+1是第二维第二个元素的地址,*(*(pp+1)+1)是第二维第二个元素,(*(*(pp+1)+1))[4]则是第二维第二个元素所指字符串下标为4的元素,即是字符w,故③应当选D。【2.54】参考答案:①B②C【2.55】参考答案:D【2.56】参考答案:C注释:联合体成员的取值是最后一次给成员赋的值。140n【2.57】参考答案:B注释:整型数组i和字符数组c共用存储空间,给i赋值也等于给c赋值,所以s->c[0]=0x39,所以输出9。【2.58】参考答案:A注释:基本概念。EOF是由C语言在头文件stdio.h中定义的,用户可以直接使用。三、程序填空题(答案P65)导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习的效率。【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。#includemain(){inta,b;scanf("%d%d",&a,&b);printf("a=%d,b=%dn",a,b);a=①;b=②;a=③;printf("a=%d,b=%dn",a,b);}【3.2】下面程序的功能是根据近似公式:π2/6≈1/12+1/22+1/32+……+1/n2,求π值。#includedoublepi(longn){doubles=0.0;longi;for(i=1;i<=n;i++)s=s+①;return(②);}140n【3.3】下面的程序的功能是求一维数组中的最小元素。findmin(int*s,intt,int*k){intp;for(p=0,*k=p;pamax)amax=x;if(②)amin=x;scanf("%f",&x);}printf("namax=%fnamin=%fn",amax,amin);}【3.7】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。fun(intx,intb[]){intk=0,r;do{r=x%①;b[k++]=r;x/=②;}while(x);}【3.8】下面程序的功能是输出1到100之间每位数的乘积大于每位数的和的数。例如数字26,数位上数字的乘积12大于数字之和8。main(){intn,k=1,s=0,m;for(n=1;n<=100;n++){k=1;s=0;①;while(②){k*=m%10;s+=m%10;③;}if(k>s)printf("%d",n);}}140n【3.9】下面程序的功能是统计用0至9之间的不同的数字组成的三位数的个数。main(){inti,j,k,count=0;for(i=1;i<=9;i++)for(j=0;j<=9;j++)if(①)continue;elsefor(k=0;k<=9;k++)if(②)count++;printf("%d",count);}【3.10】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。main(){inti,j;for(i=0;①;i++){j=i*10+6;if(②)countinue;printf("%d",j);}}【3.11】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。hcf(intm,intn){intr;if(mmain(){①;inti,j;printf("Input10numberspleasen");for(i=0;②;i++)scanf("%f",&a[i]);printf("n");for(i=2;③;i++)for(j=0;④;j++)if(⑤){x=a[j];⑥;a[j+1]=x;}printf("Thesorted10numbers;n");for(i=0;⑦;i++){if(⑧)printf("n");printf("%ft",a[i]);}printf("n");}【3.13】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。#include"stdio.h"main(){inti,a[20],s,count;s=count=0;for(i=0;i<20;i++)scanf("%d",①);for(i=0;i<20;i++){if(a[i]<0)②;s+=a[i];count++;}printf("s=%dtcount=%dn",s,count);}【3.14】下面程序的功能是删除字符串s中的空格。#includemain()140n{char*s="Beijingligongdaxue";inti,j;for(i=j=0;s[i]!=' ';i++)if(s[i]!='')①;else②;s[j]=' ';printf("%s",s);}【3.15】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。#includemain(){chars[80];inti,j;gets(s);for(i=j=0;s[i]!=' ';i++)if(s[i]!='c')①;s[j]=' ';puts(s);}【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。#includecharx[]="programming";chary[]="Fortran";main(){inti=0;while(x[i]!=' '&&y[i]!=' ')if(x[i]==y[i])printf("%c",①);elsei++;}【3.17】下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中,字符串a已排好序。#includemain(){chara[20]="cehiknqtw";chars[]="fbla";inti,k,j;for(k=0;s[k]!=' ';k++){j=0;140nwhile(s[k]>=a[j]&&a[j]!=' ')j++;for(①)②;a[j]=s[k];}puts(a);}【3.18】下面程序的功能是对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为"abcdefg"和"abceef",则输出为-1。#includemain(){charstr1[100],str2[100],c;inti,s;printf("Enterstring1:");gets(str1);printf("Enterstring2:");gets(str2);i=0;while((str1[i]==str2[i]&&str1[i]!=①))i++;s=②;printf("%dn",s);}【3.19】下面的函数expand在将字符串s复制到字符串t时,将其中的换行符和制表符转换为可见的转义字符表示,即用'n'表示换行符,用't'表示制表符。expand(chars[],chart[]){inti,j;for(i=j=0;s[i]!=' ';i++)switch(s[i]){case'n':t[①]=②;t[j++]='n';break;case't':t[③]=④;t[j++]='t';break;default:t[⑤]=s[i];break;}t[j]=⑥;}140n【3.20】下面的函数index(chars[],chart[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则送回-1。index(chars[],chart[]){inti,j,k;for(i=0;s[i]!=' ';i++){for(j=i,k=0;①&&s[j]==t[k];j++,k++);if(②)return(i);}return(-1);}n【3.21】下面程序的功能是计算S=k!。k=0longfun(intn){inti;longs;for(i=1;i①;i++)s*=i;return(②);}main(){intk,n;longs;scanf("%d",&n);s=③;for(k=0;k<=n;k++)s+=④;printf("%ldn",s);}【3.22】下面程序的功能是显示具有n个元素的数组s中的最大元素。#defineN20main(){inti,a[N];for(i=0;is[k])②;return(k);}【3.23】下面程序的功能是由键盘输入n,求满足下述条件的x、y:nx和ny的末3位数字相同,且x≠y,x、y、n均为自然数,并使x+y为最小。#includepow3(intn,intx){inti,last;for(last=1,i=1;i<=x;i++)last=①;return(last);}main(){intx,n,min,flag=1;scanf("%d",&n);for(min=2;flag;min++)for(x=1;xdoublemysqrt(doublea,doublex0){doublex1,y;x1=①;if(fabs(x1-x0)>0.00001)y=mysqrt(②);elsey=x1;return(y);}main(){doublex;printf("Enterx:");scanf("%lf",&x);printf("Thesqrtof%lf=%lfn",x,mysqrt(x,1.0));}140n【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。#includeage(intn){intc;if(n==1)c=10;elsec=①;return(c);}main(){intn=5;printf("age:%dn",②);}【3.26】下面的函数sum(intn)完成计算1~n的累加和。 sum(intn){if(n<=0)printf("dataerrorn");if(n==1)①;else②;}【3.27】下面的函数是一个求阶乘的递归调用函数。facto(intn){if(n==1)①;elsereturn(②);}【3.28】组合问题,由组合的基本性质可知:(1)C(m,n)=C(n-m,n)(2)C(m,n+1)=C(m,n)+C(m-1,n)公式(2)是一个递归公式,一直到满足C(1,n)=n为止。当n<2*m时,可先用公式(1)进行简化,填写程序中的空白,使程序可以正确运行。#include"stdio.h"main(){intm,n;printf("Inputm,n=");scanf("%d%d",&m,&n);printf("Thecombinationnumbeersis%dn",combin(m,n));}combin(intm,intn){intcom;140nif(n<2*m)m=n-m;if(m==0)com=1;elseif(m==1)①;else②;return(com);}【3.29】下列函数是求一个字符串str的长度。intstrlen(char*str){if(①)return(0);elsereturn(②);}【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。#include"stdio.h"main(){intn;printf("Inputn:");scanf("%d",①);r(n);printf("n");}r(intm){printf("%d",②);m=③;if(④)⑤;} 【3.31】输入n值,输出高度为n的等边三角形。例如当n=4时的图形如下:****************#includevoidprt(charc,intn){if(n>0){printf("%c",c);①;}}main()140n{inti,n;scanf("%d",&n);for(i=1;i<=n;i++){②;③;printf("n");}}【3.32】下面的函数实现N层嵌套平方根的计算。doubley(doublex,intn){if(n==0)return(0);elsereturn(sqrt(x+(①)));}【3.33】函数revstr(s)将字符串s置逆,如输入的实参s为字符串"abcde",则返回时s为字符串"edcba"。递归程序如下:revstr(char*s){char*p=s,c;while(*p)p++;①;if(s2)invent(①,n-2);else②;}【3.35】从键盘上输入10个整数,程序按降序完成从大到小的排序。#includeintarray[10];sort(int*p,int*q){int*max,*s;if(①)return;max=p;for(s=p+1;s<=q;s++)if(*s>*max)②;swap(③);sort(④);}swap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inti;printf("Enterdata:n");for(i=0;i<10;i++)scanf("%d",&array[i]);sort(⑤);printf("Output:");for(i=0;i<10;i++)printf("%d",array[i]);}【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483存放成"384"。#includevoidconvert(char*a,intn){inti;if((i=n/10)!=0)convert(①,i);*a=②;}140ncharstr[10]="";main(){intnumber;scanf("%d",&number);convert(str,number);puts(str);}【3.37】下面程序的功能是实现数组元素中值的逆转。#includemain(){inti,n=10,a[10]={1,2,3,4,5,6,7,8,9,10};invert(a,n-1);for(i=0;i<10;i++)printf("%4d",a[i]);printf("n");}invert(int*s,intnum){int*t,k;t=s+num;while(①){k=*s;*s=*t;*t=k;②;③;}}【3.38】下面程序通过指向整型的指针将数组a[3][4]的内容按3行×4列的格式输出,请给printf()填入适当的参数,使之通过指针p将数组元素按要求输出。#includeinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p=a;main(){inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",①);}}【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。140n#includemain(){charstr[81],*sptr;inti;for(i=0;i<80;i++){str[i]=getchar();if(str[i]=='n')break;}str[i]=①;sptr=str;while(*sptr)putchar(*sptr②);}【3.40】下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。voidfun(char*w,charx,int*n){inti,p=0;while(x>w[p])①;for(i=*n;i>=p;i--)②;w[p]=x;++*n;}【3.41】下面程序的功能是从键盘上输入两个字符串,对两个字符串分别排序;然后将它们合并,合并后的字符串按ASCII码值从小到大排序,并删去相同的字符。#includestrmerge(a,b,c)/*将已排好序的字符串a、b合并到c*/char*a,*b,*c;{chart,*w;w=c;while(*a!=' '①*b!=' '){t=②?*a++:*b<*a?*b++:(③);/*将*a、*b的小者存入t*/if(*w④' ')*w=t;elseif(t⑤*w)*++w=t;/*将与*w不相同的t存入w*/}while(*a!=' ')/*以下将a或b中剩下的字符存入w*/if(*a!=*w)*++w=*a++;elsea++;while(*b!=' ')if(*b!=*w)*++w=*b++;elseb++;*++w=⑥;}140nstrsort(char*s)/*将字符串s中的字符排序*/{inti,j,n;chart,*w;⑦;for(n=0;*w!=' ';⑧)w++;for(i=0;is[j]){⑨}}main(){chars1[100],s2[100],s3[200];printf("nPleaseInputFirstString:");scanf("%s",s1);printf("nPleaseInputSecondString:");scanf("%s",s2);strsort(s1);strsort(s2);⑩=' ';strmerge(s1,s2,s3);printf("nResult:%s",s3);}【3.42】已知某数列前两项为2和3,其后继项根据前面最后两项的乘积,按下列规则生成:①若乘积为一位数,则该乘积即为数列的后继项;②若乘积为二位数,则该乘积的十位上的数字和个位上的数字依次作为数列的两个后继项。下面的程序输出该数列的前N项及它们的和,其中,函数sum(n,pa)返回数列的前N项和,并将生成的前N项存入首指针为pa的数组中,程序中规定输入的N值必须大于2,且不超过给定的常数值MAXNUM。 例如:若输入N的值为10,则程序输出如下内容:sum(10)=442361886424#include"stdio.h"#defineMAXNUM100intsum(n,pa)intn,*pa;{intcount,total,temp;*pa=2;①=3;total=5;count=2;while(count++structstuinf{charname[20];/*学生姓名*/intscore;/*学生成绩*/}stu,*p;main(){p=&stu;printf("Entername:");gets(①);printf("Enterscore:");scanf("%d",②);printf("Output:%s,%dn",③,④);}140n【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入0时才结束。#include#include#defineNUM4structstudent{intrank;char*name;floatscore;};①stu[]={3,"liming",89.3,4,"zhanghua",78.2,1,"anli",95.1,2,"wangqi",90.6};main(){charstr[10];inti;do{printf("Enteraname");scanf("%s",str);for(i=0;i=NUM)printf("Notfoundn");}while(strcmp(str,"0")!=0);}【3.45】下面程序的功能是从终端上输入5个人的年龄、性别和姓名,然后输出。#include"stdio.h"structman{charname[20];unsignedage;charsex[7];};main(){structmanperson[5];data_in(person,5);data_out(person,5);}140ndata_in(structman*p,intn){structman*q=①;for(;page,p->sex);②;}}data_out(structman*p,intn){structman*q=__③__;for(;pname,p->age,p->sex);} 【3.46】输入N个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第3个整数为5,第7个整数也为5,则将先输入的整数5排在后输入的整数5的前面。程序如下:#include"stdio.h"#defineN10struct{intno;intnum;}array[N];main(){inti,j,num;for(i=0;i=0&&array[j].num②num;③)array[j+1]=array[j];array[④].num=num;array[⑤].no=i;}for(i=0;imain(){structnode{charinfo;structnode*link;}*top,*p;charc;top=NULL;while((c=getchar())①){p=(structnode*)malloc(sizeof(structnode));p->info=c;p->link=top;top=p;}while(top){②;top=top->link;putchar(p->info);free(p);}}【3.48】下面函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。#defineNULL0structlink{floata;structlink*next;};concatenate(p1,p2)structlist*p1,*p2;{if(p1->next==NULL)p1->next=p2;elseconcatenate(①,p2);}【3.49】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。#includestructnode{chardata;structnode*link;}*head;140nmain(){charch;structnode*p;head=NULL;while((ch=getchar())!='n'){p=(structnode*)malloc(sizeof(structnode));p->data=ch;p->link=①;head=②;}③;while(p!=NULL){printf("%c",p->data);p=p->link;}}【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于0时才停止输入。然后反序输出这些整数。#includestructdata{intx;structdata*link;}*p;input(){intnum;structdata*q;printf("Enterdata:");scanf("%d",&num);if(num<0)①;q=②;q->x=num;q->link=p;p=q;③;}main(){printf("Enterdatauntildata<0:n");p=NULL;input();printf("Output:");while(④){printf("%dn",p->x);140n⑤;}}【3.51】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储存学生的学号和成绩。新产生的结点总是位于链表的尾部。structstudent{longnum;intscore;structstudent*next;};structstudent*creat(){structstudent*head=NULL,*tail;longnum;inta;tail=①malloc(LEN);do{scanf("%ld,%d",&num,&a);if(num!=0){if(head==NULL)head=tail;else②;tail->num=num;tail->score=a;tail->next=(structstudent*)malloc(LEN);}elsetail->next=NULL;}while(num!=0);return(③);}【3.52】下面create函数的功能是建立一个带头结点的单向链表,新产生的结点总是插入在链表的末尾。单向链表的头指针作为函数值返回。#include#defineLENsizeof(structstudent)structstudent{longnum;intscore;structstudent*next;};structstudent*creat(){structstudent*head=NULL,*tail;longnum;inta;tail=(①)malloc(LEN);do140n{scanf("%ld,%d",&num,&a);if(num!=0){if(head==NULL)head=tail;elsetail=tail->next;tail->num=num;tail->score=a;tail->next=(②)malloc(LEN);}elsetail->next=NULL;}while(num!=0);③;}【3.53】下面程序的功能是统计文件中的字符的个数。#includemain(){longnum=0;①*fp;if((fp=fopen("fname.dat","r"))==NULL){printf("Can'topenthefile!");exit(0);}while(②){fgetc(fp);num++;}printf("num=%dn",num);fclose(fp);}【3.54】下面程序的功能是把从键盘输入的文件(用@作为文件结束标志)复制到一个名为second.txt的新文件中。#includeFILE*fp;main(){charch;if((fp=fopen(①))==NULL)exit(0);while((ch=getchar())!='@')fputc(ch,fp);②;}140n【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。#includemain(intargc,char*argv[]){FILE&f1,*f2;if(argc<①){printf("Thecommandlineerror!");exit(0);}f1=fopen(argv[1],"r");f2=fopen(arhv[2],"w");while(②)fputs(fgetc(f1),③);④;⑤;}【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是sm,则执行该程序时输入:"sm+10",可以实现10的累加;输入:"sm-10",可以实现求10的阶乘。#include#includemain(intargc,char*argv[]){intn;voidsum(),mult();void(*funcp)();n=atoi(argv[2]);if(argc!=3||n<=0)dispform();switch(①){case'+':funcp=sum;break;case'-':funcp=mult;break;default:dispform();}②;}voidsum(intm){inti,s=0;for(i=1;i0)n");exit(0);}【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。#includemain(){charstr[100];inti=0;FILE*fp;if((fp=fopen("test.txt",①))==NULL){printf("Can'topenthefile.n");exit(0);}printf("Inputastring:n");gets(str);while(str[i]){if(str[i]>='a'&&str[i]<='z')str[i]=②;fputc(str[i],fp);i++;}fclose(fp);fp=fopen("test.txt",③);fgets(str,strlen(str)+1,fp);printf("%sn",str);fclose(fp);}【3.58】下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为"bi.dat"的新文件中。#includeFILE*fp;main()140n{inti,j;if((fp=fopen(①,"wb"))==NULL)exit(0);for(i=0;i<10;i++){scanf("%d",&j);fwrite(②,sizeof(int),1,③);}fclose(fp);}【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或't'、'n'结束的字符串。#include#includeFILE*cp;charfname[20],buf[100];intnum;structkey{charword[10];intcount;}keyword[]={"if",0,"char",0,"int",0,"else",0,"while",0,"return",0};char*getword(FILE*fp){inti=0;charc;while((c=getc(fp))!=EOF&&(c==''||c=='t'||c=='n'));if(c==EOF)return(NULL);elsebuf[i++]=c;while((c=①&&c!=''&&c!='t'&&c!='n')buf[i++]=c;buf[i]=' ';return(buf);}lookup(char*p){inti;char*q,*s;for(i=0;imain(){FILE*fp;intflag;charname[30],data[30];if((fp=fopen("try.dat", ① ))==NULL){printf("Openfileerrorn");exit(0);}do{printf("Entername:");gets(name);if(strlen(name)==0) break;strcat(name,"n"); ② ;flag=1;while(flag&&(fgets(data,30,fp) ③ ))140nif(strcmp(data,name)==0)④;if(flag)fputs(name,fp);elseprintf("tDataentererror!n");}while( ⑤ );fclose(fp);}【程序填空题参考答案】【3.1】答案:①a+b②a-b③a-b【3.2】答案:①1.0/(float)(i*i)②sqrt(6*s)【3.3】答案:①*k=p【3.4】答案:①t=t*i②t=t>0?-1:1【3.5】答案:①d=1②k++③k<=n【3.6】答案:①x>=0②x0③m=m/10【3.9】答案:①i==j②k!=i&&k!=j【3.10】答案:①i<=9②j%3!=0【3.11】答案:①m=n②r!=0③return(n)【3.12】答案:①floata[10],x②i<=9③i<=8④j<=9-i⑤a[j]>a[j+1]⑥a[j]=a[j+1]⑦i<=9⑧i%5==0【3.13】答案:①&a[i]②continue注释:①是基本概念,使用scanf函数输入数组元素的值。当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。【3.14】答案:①s[j++]=s[i]②s[j]=s[i]【3.15】答案:①s[j++]=s[i]【3.16】答案:①x[i++]【3.17】答案:①i=strlen(a);i>=j;i--②a[i+1]=a[i]【3.18】答案:①' '②str1[i]-str2[i]【3.19】答案:①j++②'\'③j++④'\'⑤j++⑥' '【3.20】答案:①t[k]!=' '②t[k]==' '【3.21】答案:①<=n②s③0④fun(k)【3.22】答案:①a[fmax(a,N)]②k=p【3.23】答案:①last*n%1000②x!=min-x③flag=0【3.24】答案:①(x0+a/x0)/2②a,x1注释:根据迭代公式,①处应当是计算迭代值x1=(x0+a/x0)/2。按照求平方根的要求,当迭代的精度不能满足"(fabs(x1-x0)>0.00001)"时,则要继续迭代,因此②处应当填写"a,x1"。程序中调用了求绝对值的库函数fabs()。【3.25】答案:①2+age(n-1)②age(5)注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式:140nage(n)=10(n=1)age(n)=2+age(n-1)(n>1)对照程序和递归公式可以看出:n的含义是第n位学生。很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。在①处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。【3.26】答案:①return(1)②return(sum(n-1)+n)注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。 将问题"求1~n的累加和"的公式写成递归定义,可以是如下形式; sum(n)=1当n=1时sum(n)=sun(n-1)+n当n>1时根据此递归定义,可以很容易完成程序。【3.27】答案:①return(1)②n*facto(n-1)注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式; n!=1当n=1时n!=n*(n-1)当n>1时根据此递归定义,可以很容易完成程序。【3.28】答案:①com=n②com=combin(n-1,m-1)+combin(n-1,m)注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句"if(n<2*m)m=n-m;"完成了题目中叙述的"用公式(1)进行简化"的工作。【3.29】答案:①*str==' '②1+strlen(str+1)注释:求串长算法的关键是确定串结束标记' '的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符如果当前字符(*str)==串结束标记' '则串长=0否则串长=1+除第一个字符之外的剩余字符串的串长因此,在①的位置上应当填写"*str==' '",以判断当前字符(*str)是否是串结束标记' '。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写"1+strlen(str+1)"。【3.30】答案:①&n②m%10③m/10④m>0⑤r(m)【3.31】答案:①prt(c,n-1)②prt('',n-i)③prt('*',i)注释:函数prt的功能是输出n个字符c。【3.32】答案:①y(x,n-1)注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。 y(x,n)=x当n=0时y(x,n)=sqrt(x+y(x,n-1))当n>0时【3.33】答案:①p--②*p=' '③*p=c④p--⑤*s++注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p所指向的字符串尾的字符(' ')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行"c=*s",将首字符存入临时变量;然后执行"*s=*p",将尾字符存入串首;执行"revstr(s+1)"是递归处理串的中间部分,这时,在②处应当填入"*p=' '",即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写"*p=c"。140n【3.34】答案:①str+1②return①改为n-2【3.35】答案:①p>=q②max=s③p,max④p+1,q⑤&array[0],&array[9]注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句"for(s=p+1;s<=q;s++)"中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填"p>=q"、⑤处应填"&array[0],&array[9]"。由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填"max=s"。当调用函数swap交换两个变量值的时候,要求实参是变量的地址,因此,③处应填"p,max"将最大值存入指针p所指的单元。由于问题的要求是"从大到小"排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填"p+1,q"。【3.36】答案:①a+1②n%10+'0'【3.37】答案:①s