1C语言程序设计(第三版)谭浩强第8章函数参考答案2【知识要点】C语言的基本组成单位函数。C是由一个且仅有一个主函数(main)和若干个子函数组成.子函数可有可无。一个C语言源程序执行,从主函数开始,以主函数结束。C语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。采用了函数模块式的结构的特点:程序的层次结构清晰,便于程序的编写、阅读和调试。C语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。如:数学函数#includemath.h字符函数#includectype.h字符串函数#includestring.h输入输出函数#includestdio.h动态存储分配函数#includestdlib.h#includemalloc.h清屏函数#includeconio.h日期和时间函数#includetime.h函数可以嵌套调用,而不可嵌套定义。函数的值:函数的值的数据类型由函数定义时所决定的。调用函数时可有返回值和无返回值两种。有返回值的函数在函数体内必有一条或多条return语句,无返回值的函数定义为void类型,且在函数体无return语句。函数调用时参数的传递:主调函数和被调函数之间数据传递有两种,数值传递和地址传递。【习题参考答案】8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。【解析】用碾转相除法求最大公约数。最小公倍数=两个整数之积/最大公约数。#includestdio.hintgcf(intx,inty)/*求两整数的最大公约数*/{intt,r;if(xy){t=x;x=y;y=t;}while((r=x%y)!=0){x=y;y=r;}returny;}intlcm(intx,inty,inth)/*求两整数的最小公倍数*/{3return(x*y/h);}voidmain(){inta,b,df,sc;/*df:所求的最大公约数,sc:所求的最小公倍数*/printf(Inputa,b\n);scanf(“%d%d”,&a,&b);df=gcf(a,b);printf(“G.C.F=%d\n”,df);sc=lcm(a,b,df);printf(“L.C.M=%d\n”,sc);}8.2求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0,等于0和小于0时的根,并输出结果。从主函数输入a,b,c的值。#includemath.hvoidreal_root(floata,floatb,floatdisc)/*求方程的两个不相同的实根*/{floatx1,x2;x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf(x1=%5.2f\tx2=%5.2f\n,x1,x2);}voidequal_root(floata,floatb)/*求方程的两个相同的实根*/{floatx1,x2;x1=x2=(-b)/(2*a);printf(x1=%5.2f\tx2=%5.2f\n,x1,x2);}voidimaginary_root(floata,floatb,floatdisc)/*求方程的两个不相同的虚根*/{floatp,q;p=-b/(2*a);q=sqrt(disc)/(2*a);printf(x1=%5.2f+%5.2fi\tx2=%5.2f-%5.2fi\n,p,q,p,q);}voidmain(){floata,b,c,disc;printf(\nInputa,b,c:\n);scanf(%f%f%f,&a,&b,&c);disc=b*b-4*a*c;4if(disc0)real_root(a,b,disc);elseif(disc==0)equal_root(a,b);elseimaginary_root(a,b,disc);}8.3写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。【解析】:素数(质数):只能被1和该整数本身整除的数为素数。换句话说,只有两个正因数(1和自己)的自然数即为素数。#includestdio.hintprime(intn){intflag=1,i;/*flag:标识变量*/for(i=2;i=n/2&&flag==1;i++)if(n%i==0)flag=0;returnflag;}voidmain(){intn;printf(\nInputaninteger:);scanf(%d,&n);if(prime(n))printf(\n%disaprime.,n);elseprintf(\n%disnotaprime.,n);}【扩展】求100以内的所有的素数。#includestdio.hintprime(intn){intflag=1,i;/*flag:标识变量*/for(i=2;i=n/2&&flag==1;i++)if(n%i==0)flag=0;returnflag;}voidmain()5{inta[100],i,j=0;for(i=2;i=100;i++)a[i]=i;for(i=2;i=100;i++)if(prime(a[i])){if(j++%5==0)printf(\n);/*控制每行输出的个数,每行按5个输出*/printf(%5d,a[i]);}}8.4写一函数,使给定的一个二维数组(3×3)转置,即行列互换。#defineN3#defineM3#includestdio.hvoidfun(inta[N][M],intb[M][N]){inti,j,t;for(i=0;iN;i++)for(j=0;jM;j++)b[j][i]=a[i][j];}voidmain(){inti,j,a[N][M],b[M][N];printf(Input%d*%darray:\n,N,M);for(i=0;iN;i++)for(j=0;jN;j++)scanf(%d,&a[i][j]);printf(\Originalarray:\n);for(i=0;iN;i++){for(j=0;jN;j++)printf(%4d,a[i][j]);printf(\n);}fun(a,b);printf(Convertarray:\n);for(i=0;iN;i++){for(j=0;jN;j++)printf(%4d,b[i][j]);printf(\n);}}8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。6【解析】字符串处理方法,一是字符数组,二是指针,编写函数时,采用地址传递。#includestdio.h#includestring.hvoidinverse(charstr[]){chart;inti,j;for(i=0,j=strlen(str)-1;istrlen(str)/2;i++,j--){t=str[i];str[i]=str[j];str[j]=t;}}voidmain(){charstr[80];voidinverse(charstr[]);printf(“Inputstring:”);gets(str);inverse(str);puts(str);}8.6写一函数,将两个字符串连接。【解析】:将串2连接在串1的后面,形成一新串。新串末尾须加字符串结束标志。#includestdio.h#includestring.hcharconnect(charstr1[],charstr2[]){inti,j;for(j=strlen(str1),i=0;str2[i]!='\0';i++)str1[i+j]=str2[i];str1[i+j]='\0';/*新串末尾须加字符串结束标志\0*/}voidmain(){chars1[80],s2[80];printf(\nInputstring1:);gets(s1);printf(\nInputstring2:);gets(s2);connect(s1,s2);puts(s1);}ngis%s\n”,s);}78.7写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。#includestdio.h#includestring.hvoidstring_copy(charstr[]){inti,j=0;for(i=0;str[i]!='\0';i++)if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u')str[j++]=str[i];str[j]='\0';puts(str);}voidmain(){charstr[80];intn;gets(str);string_copy(str);}8.8写一函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字之间有一个空格。如输入1990,应输出”1990”。#includestdio.h#includestring.hvoidchange(intn,charstr[])/*该函数的功能将数值转换为数字字符*/{inti;for(i=3;i=0;i--){str[i]=n%10+'0';n/=10;}str[4]='\0';}voidinsert(charstr[])/*该函数的功能插入空格并输出该数字字符*/{inti;for(i=strlen(str);i0;i--){str[2*i]=str[i];str[2*i-1]='';}puts(str);}voidmain()8{charstr[80];intn;printf(\nInputnumber:);do/*该循环控制输入的数为四位整数*/scanf(%d,&n);while(n999||n10000);change(n,str);insert(str);}8.9编写一函数,有实参传来一个字符串,统计此字符串中字母,数字,空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果。#includestdio.h#includestring.h#includectype.hintletter,digit,space,others;/*说明定义为全局变量,全局变量不赋值时自动赋0值*/intcount(charstr[]){inti;for(i=0;str[i]!='\0';i++)if(isalpha(str[i]))letter++;elseif(isdigit(str[i]))digit++;elseif(str[i]=='')space++;elseothers++;}voidmain(){charstr[80];printf(\nInputstring:\n);gets(str);printf(string:);puts(str);count(str);printf(letter:%d,digit:%d,space:%d,others:%d\n,letter,digit,space,others);}8.10写一函数,输入一行字符,将此字符串中最长的单词输出。【解析】先确定单词是如何组成的。假若以空格、数字或其它字符作为单词的分隔。#includestdio.h#includestring.h9#includectype.hcharstring_long(charstr[]){inti,j,k=1,flag=1,max=0,si=0,sj;for(i=0;str[i]!='\0';i++){if(isalpha(str[i]))if(flag){j=i;flag=0;}elsek++;else{if(maxk){max=k;si=j;/*si:记长串的起始位置*/sj=si+k;/*sj:记