《c程序设计第八章答案.wps》由会员分享,可在线阅读,更多相关《c程序设计第八章答案.wps(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第八章第八章 函数函数例子例子 8.1 函数调用的简单例子函数调用的简单例子#includevoid main()void printstar();void print_message();printstar();print_message();printstar();void printstar()int i;for(i=0;i=17;i+)printf(*);printf(n);void print_message()printf(How do you do!n);注:c 程序的执行是从 main 函数开始的,如是在 main 函数中调用其他函数,在调用结束后流程返回到 main 函数,在
2、 main 函数中结束整个程序的运行。8.1 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。注:在程序开发中,常将一些常用的功能模块编写成函数,放在公共函数库中供大家选用。程序设计人员要善于利用函数,以减少重复编写程序段的工作量。#includevoid main()int gy(int x,int y);int gb(int x,int y);int a,b,gys,gbs;scanf(%d%d,&a,&b);gys=gy(a,b);gbs=gb(a,b);printf(gys=%d,gbs=%dn,gys,gbs);int gy
3、(int x,int y)int t,i,g1;if(xy)t=y;else t=x;for(i=1;i=t;i+)if(x%i=0&y%i=0)g1=i;return(g1);int gb(int x,int y)int z,c;c=gy(x,y);z=(x*y)/c;return(z);注:这是一个调用两个函数的源程序文件。注:求一个矩阵的转置程序为:#includevoid main()int i,j;int b33,a33=1,2,3,4,5,6,7,8,9;for(i=0;i3;i+)for(j=0;j3;j+)printf(%d,aij);bji=aij;printf(n);pri
4、ntf(它的转制为:n);for(i=0;i3;i+)for(j=0;j3;j+)printf(%d,bij);printf(n);例 8.2 调用函数时的数据传递#includevoid main()int max(int x,int y);int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(max is%dn,c);int max(int x,int y)int z;z=xy?x:y;return(z);注:对于不带回值的函数,应当用“void”定义函数为无类型,或称空类型。这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值
5、。此时在函数体中不得出现 return 语句。例 8.4 实参的求值顺序#includevoid main()int f(int a,int b);int i=2,p;p=f(i,+i);printf(%dn,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);注:在 turbo c 2.0 和 turbo c+3.0,vc 6.0 系统上运行的结果:0 这是按自右至左的顺序求实参的值。例 8.5 对被调用函数的声明。#includevoid main()float add(float x,float
6、 y);float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(%fn,c);float add(float x,float y)float z;z=x+y;return z;注:这是一个很简单的函数调用,程序第四行是对被调用函数的声明。#includefloat add(float x,float y)float z;z=x+y;return z;void main()float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(%fn,c);这样,在主函数 main()中就不用在对 add 声明。函数的递归调用:
7、#include#includefloat f(float x)float y;y=(x-5.0)*x+16.0)*x-80.0;return y;float xpoint(float x1,float x2)float y;y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1);return y;float root(float x1,float x2)float x,y,y1;y1=f(x1);dox=xpoint(x1,x2);y=f(x);if(y*y10)y1=y;x1=x;elsex2=x;while(fabs(y)=0.0001);return x;void main
8、()float x1,x2,f1,f2,x;do printf(input x1,x2:n);scanf(%f,%f,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(a root of equation is%8.4fn,x);注:这就是函数的嵌套调用。简单的函数递归调用8.7 递归调用int age(int n)int c;if(n=1)c=10;elsec=age(n-1)+2;return c;#includevoid main()printf(%dn,age(5);注:应该强调说明的是在某一次调用 age 函
9、数式并不是立即就得到 age(n)的值,而是一次又一次的进行递归调用,到 age(1)时才有确定的。#includevoid main()float fac(int n);int n;float y;printf(input an integer number:);scanf(%d,&n);y=fac(n);printf(%d!=%10.0fn,n,y);float fac(int n)float f;if(n0)printf(n0,dataerror!);else if(n=0|n=1)f=1;else f=fac(n-1)*n;return f;函数的递归调用(hanoi 问题)#incl
10、udevoid main()void hanoi(int n,char one,char two,char three);int m;printf(input the number of disks:);scanf(%d,&m);printf(the step to moving%disks:n,m);hanoi(m,A,B,C);void hanoi(int n,char one,char two,char three)void move(char x,char y);if(n=1)move(one,three);elsehanoi(n-1,one,three,two);move(one,t
11、hree);hanoi(n-1,two,one,three);void move(char x,char y)printf(%c-%cn,x,y);例 8.10 数组元素作为函数实参。#includevoid main()int large(int x,int y);int a10,b10,i,n=0,m=0,k=0;printf(enter array a:n);for(i=0;i10;i+)scanf(%d,&ai);printf(n);printf(enter array b:n);for(i=0;i10;i+)scanf(%d,&bi);printf(n);for(i=0;ibi%d
12、timesnai=bi%d timesnaik)printf(array a is larger than array bn);else if(ny)flag=1;else if(xy)flag=-1;else flag=0;return(flag);例 8.11 数组名作函数参数#includevoid main()float average(float array10);float score10,aver;int i;printf(input 10 scores:n);for(i=0;i10;i+)scanf(%f,&scorei);printf(n);aver=average(scor
13、e);printf(average score is%5.2fn,aver);float average(float array10)int i;float aver,sum=array0;for(i=1;i10;i+)sum=sum+arrayi;aver=sum/10;return(aver);注:形参数组可以不指定大小,在定义数组时可以在数组名后跟一个空的方括号。有时为了在被调用函数中处理数组元素的需要,可以另设一个形参,传递需要处理的数组元素的个数。#includevoid main()float average(float array,int n);float score_15=98
14、.5,97,91.5,60,55;float score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5;printf(the average score of class A is%6.2fn,average(score_1,5);printf(the average score of class B is%6.2fn,average(score_2,10);float average(float array10,int n)int i;float aver,sum=array0;for(i=1;in;i+)sum=sum+arrayi;aver=
15、sum/n;return(aver);注:用数组名做函数实参时,不是把数组元素的值传递给形参,而是把数组的首元素的地址传递给形参数组,这样两个数组就共占有同一段内存单元。#includevoid main()void sort(int array,int n);int a10,i;printf(enter the array:n);for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);printf(the sorted array:);for(i=0;i10;i+)printf(%5d,ai);printf(n);void sort(int array,int n)i
16、nt i,j,t,k;for(i=0;in-1;i+)k=i;for(j=i+1;jarrayj)k=j;t=arrayk;arrayk=arrayi;arrayi=t;注:数组名作为函数参数的情况下,用选择法(当然也可以用冒泡排序法)对数组的 10 个元素进行由小到大的排序时,形参数组改变也使实参数组随之改变。#includevoid main()int max_value(int array4);int a34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max value is%dn,max_value(a);int max_value(int array4)i
17、nt i,j,max;max=array00;for(i=0;i3;i+)for(j=0;j4;j+)if(maxarrayij)max=arrayij;return max;注:多维数组元素可以作为函数参数,这点与前述的情况相类似。局部变量:在函数内定义的变量。而在函数之外定义的变量称为外部变量(全局或全程变量)。#includefloat Max=0,Min=0;void main()float average(float array,int n);float aver,score10;int i;for(i=0;i10;i+)scanf(%f,&scorei);aver=average(
18、score,10);printf(Max=%6.2fnMin=%6.2fnaver=%6.2fn,Max,Min,aver);float average(float array,int n)int i;float aver,sum=array0;Max=array0;Min=array0;for(i=1;in;i+)if(Maxarrayi)Min=arrayi;sum=sum+arrayi;aver=sum/n;return aver;注:Min 和 Max 是全局变量,是公用的,它们的值可以供各个函数使用,如果在一个函数中,改变了它们的值,在其他函数中也可以使用这个已改变的值。由此看出,可
19、以利用全局变量以减少函数形参和实参的个数,从而减少内存空间以及传递数据时的时间消耗。#includevoid main()int f(int);int a=2,i;for(i=0;i3;i+)printf(%d,f(a);printf(n);int f(int a)auto int b=0;static int c=3;b=b+1;c=c+1;return(a+b+c);注:考察静态局部变量的值。#includevoid main()int fac(int);int i;for(i=1;i=10;i+)printf(%d!=%dn,i,fac(i);printf(n);int fac(int
20、n)static int f=1;f=f*n;return(f);注:每次调用 fac(i),输出一个 i!,同时保留这个 i!的值以便下次再乘 i+1.C 语言允许将局部变量的值放在 cpu 中的寄存器中,需要时直接从寄存器取出参加运算,不必再到内存中去存取。#includevoid main()long fac(long);long i,n;scanf(%ld,&n);for(i=1;i=n;i+)printf(%d!=%dn,i,fac(i);printf(n);long fac(long n)register long i,f=1;for(i=1;i=n;i+)f=f*i;return
21、(f);有时需要用 extern 来声明外部变量,以扩展外部变量的作用域。文件 file1.c 中的内容为:#includeint A;void main()int power(int);int b=3,c,d,m;printf(enter the number a and its power m:n);scanf(%d,%d,&A,&m);c=A*b;printf(%d*%d=%dn,A,b,c);d=power(m);printf(%d*%d=%dn,A,m,d);文件 file2.c 中的内容为:extern A;int power(int n)int i,y=1;for(i=1;i=n
22、;i+)y*=A;return(y);注:用 extern 将外部变量的作用域扩展到其他文件。上述两个文件是在同一个工程中的,它们之间通过 extern 将数据进行了传输。File1.c:#includemain()extern void enter_string(char str);extern void delete_string(char str,char ch);extern void print_string(char str);/*以上三行声明在本函数中将要调用的其他文件中定义的 3 个函数*/char c;char str80;enter_string(str);scanf(%c
23、,&c);delete_string(str,c);print_string(str);File2.c:#includevoid enter_string(char str80)gets(str);File3.c:#includevoid delete_string(char str,char ch)int i,j;for(i=j=0;stri!=0;i+)if(stri!=ch)strj+=stri;strj=0;File4.c:#includevoid print_string(char str)printf(%sn,str);注:整个程序有四个文件组成。每个文件包含一个函数。Math.h
24、 包含的函数:三角函数:Sin()正弦函数Cos()余弦函数Tan()正切函数反三角函数aSin()反正弦函数aCos()反余弦函数aTan()反正切函数(主值)Atan2()反正切函数(整圆值)双曲三角函数:sinh()双曲正弦函数cosh()双曲余弦函数tanh()双曲正切函数指数和对数exp()e 的 xpow()反余弦函数log()以 e 为底的对数log10()求绝对值:abs()绝对值fabs()浮点型数绝对值labs()长整形数绝对值指数和对数exp()enpow()xnlog()以 e 为底的对数log10()以10为底的对数取整:ceil()取上整floor()取下整标准化浮
25、点数ldexp()y=x*2nfrexp()x=y/(2 n)取整和取余modf()将一个数分解成整数和小数部分并返回小数部分fmod()两参数相除的余数String.h 库包含的函数:下面为 string.h 文件中函数的详细用法,附加实例:1、strcpy函数名:strcpy功 能:拷贝一个字符串到另一个用 法:char*strcpy(char*destin,char*source);程序例:#include#include int main(void)char string10;char*str1=abcdefghi;strcpy(string,str1);printf(%sn,stri
26、ng);return 0;2.strncpy函数名:strncpy原型:char*strncpy(char*dest,char*src,size_t n);功能:将字符串 src 中最多 n 个字符复制到字符数组 dest 中(它并不像 strcpy 一样遇到 NULL才停止复制,而是等凑够 n 个字符才开始复制),返回指向 dest 的指针。3、strcat函数名:strcat功 能:字符串拼接函数用 法:char*strcat(char*destin,char*source);程序例:#include#include int main(void)char destination25;cha
27、r*blank=,*c=C+,*Borland=Borland;strcpy(destination,Borland);strcat(destination,blank);strcat(destination,c);printf(%sn,destination);return 0;4、strchr函数名:strchr功 能:在一个串中查找给定字符的第一个匹配之处用 法:char*strchr(char*str,char c);程序例:#include#include int main(void)char string15;char*ptr,c=r;strcpy(string,This is a
28、 string);ptr=strchr(string,c);if(ptr)printf(The character%c is at position:%dn,c,ptr-string);elseprintf(The character was not foundn);return 0;5、strcmp函数名:strcmp功 能:串比较用 法:int strcmp(char*str1,char*str2);看 Asic 码,str1str2,返回值 0;两串相等,返回0程序例:#include#include int main(void)char*buf1=aaa,*buf2=bbb,*buf3
29、=ccc;int ptr;ptr=strcmp(buf2,buf1);if(ptr 0)printf(buffer 2 is greater than buffer 1n);elseprintf(buffer 2 is less than buffer 1n);ptr=strcmp(buf2,buf3);if(ptr 0)printf(buffer 2 is greater than buffer 3n);elseprintf(buffer 2 is less than buffer 3n);return 0;6、strnicmp函数名:strnicmp功 能:将一个串中的一部分与另一个串比较
30、,不管大小写用 法:int strnicmp(char*str1,char*str2,unsigned maxlen);程序例:#include#include int main(void)char*buf1=BBB,*buf2=bbb;int ptr;ptr=strnicmp(buf2,buf1);if(ptr 0)printf(buffer 2 is greater than buffer 1n);if(ptr 0)printf(buffer 2 is less than buffer 1n);if(ptr=0)printf(buffer 2 equals buffer 1n);retur
31、n 0;7、strlen函数名:strlen功能:strlen 函数求的是字符串的长度,它求得方法是从字符串的首地址开始到遇到第一个0停止计数,如果你只定义没有给它赋初值,这个结果是不定的,它会从字符串首地址一直记下去,直到遇到0才会停止。原型:size_t strlen(const char*s);#include#include int main()int i=0;char*he=Hello,world;i=strlen(he);printf(字符串长度为%dn,i);return 0;/运行结果:字符串长度为118、strcspn函数名:strcspn功 能:在串中查找第一个给定字符集内
32、容的段用 法:int strcspn(char*str1,char*str2);程序例:#include#include#include int main(void)char*string1=1234567890;char*string2=747DC8;int length;length=strcspn(string1,string2);printf(Character where strings intersect is at position%dn,length);return 0;9、strdup函数名:strdup功 能:将串拷贝到新建的位置处用 法:char*strdup(char*
33、str);程序例:#include#include#include int main(void)char*dup_str,*string=abcde;dup_str=strdup(string);printf(%sn,dup_str);free(dup_str);return 0;10、stricmp函数名:stricmp功 能:以大小写不敏感方式比较两个串用 法:int stricmp(char*str1,char*str2);程序例:#include#include int main(void)char*buf1=BBB,*buf2=bbb;int ptr;ptr=stricmp(buf2
34、,buf1);if(ptr 0)printf(buffer 2 is greater than buffer 1n);if(ptr 0)printf(buffer 2 is less than buffer 1n);if(ptr=0)printf(buffer 2 equals buffer 1n);return 0;11、strerror函数名:strerror功 能:返回指向错误信息字符串的指针用 法:char*strerror(int errnum);程序例:#include#include int main(void)char*buffer;buffer=strerror(errno)
35、;printf(Error:%sn,buffer);return 0;12、strcmpi函数名:strcmpi功 能:将一个串与另一个比较,不管大小写用 法:int strcmpi(char*str1,char*str2);程序例:#include#include int main(void)char*buf1=BBB,*buf2=bbb;int ptr;ptr=strcmpi(buf2,buf1);if(ptr 0)printf(buffer 2 is greater than buffer 1n);if(ptr 0)printf(buffer 2 is less than buffer
36、1n);if(ptr=0)printf(buffer 2 equals buffer 1n);return 0;13.strncmp函数名:strncmp功 能:串比较用 法:int strncmp(char*str1,char*str2,int maxlen);程序例:#include#include int main(void)char*buf1=aaabbb,*buf2=bbbccc,*buf3=ccc;int ptr;ptr=strncmp(buf2,buf1,3);if(ptr 0)printf(buffer 2 is greater than buffer 1n);elseprin
37、tf(buffer 2 is less than buffer 1n);ptr=strncmp(buf2,buf3,3);if(ptr 0)printf(buffer 2 is greater than buffer 3n);elseprintf(buffer 2 is less than buffer 3n);return(0);14、strncpy函数名:strncpy功 能:串拷贝用 法:char*strncpy(char*destin,char*source,int maxlen);程序例:#include#include int main(void)char string10;cha
38、r*str1=abcdefghi;strncpy(string,str1,3);string3=0;printf(%sn,string);return 0;15、strnicmp函数名:strnicmp功 能:不注重大小写地比较两个串用 法:int strnicmp(char*str1,char*str2,unsigned maxlen);程序例:#include#include int main(void)char*buf1=BBBccc,*buf2=bbbccc;int ptr;ptr=strnicmp(buf2,buf1,3);if(ptr 0)printf(buffer 2 is gr
39、eater than buffer 1n);if(ptr 0)printf(buffer 2 is less than buffer 1n);if(ptr=0)printf(buffer 2 equals buffer 1n);return 0;16、strnset函数名:strnset功 能:将一个字符串前 n 个字符都设为指定字符用 法:char*strnset(char*str,char ch,unsigned n);程序例:#include#include int main(void)char*string=abcdefghijklmnopqrstuvwxyz;char letter=
40、x;printf(string before strnset:%sn,string);strnset(string,letter,13);printf(string after strnset:%sn,string);return 0;17、strpbrk函数名:strpbrk功 能:在串中查找给定字符集中的字符用 法:char*strpbrk(char*str1,char*str2);程序例:#include#include int main(void)char*string1=abcdefghijklmnopqrstuvwxyz;char*string2=onm;char*ptr;ptr=
41、strpbrk(string1,string2);if(ptr)printf(strpbrk found first character:%cn,*ptr);elseprintf(strpbrk didnt find character in setn);return 0;18、strrchr函数名:strrchr功 能:在串中查找指定字符的最后一个出现用 法:char*strrchr(char*str,char c);程序例:#include#include int main(void)char string15;char*ptr,c=r;strcpy(string,This is a st
42、ring);ptr=strrchr(string,c);if(ptr)printf(The character%c is at position:%dn,c,ptr-string);elseprintf(The character was not foundn);return 0;19、strrev函数名:strrev功 能:串倒转用 法:char*strrev(char*str);程序例:#include#include int main(void)char*forward=string;printf(Before strrev():%sn,forward);strrev(forward);
43、printf(After strrev():%sn,forward);return 0;20、strset函数名:strset功 能:将一个串中的所有字符都设为指定字符用 法:char*strset(char*str,char c);程序例:#include#include int main(void)char string10=123456789;char symbol=c;printf(Before strset():%sn,string);strset(string,symbol);printf(After strset():%sn,string);return 0;21、strspn函
44、数名:strspn功 能:在串中查找指定字符集的子集的第一次出现用 法:int strspn(char*str1,char*str2);程序例:#include#include#include int main(void)char*string1=1234567890;char*string2=123DC8;int length;length=strspn(string1,string2);printf(Character where strings differ is at position%dn,length);return 0;22、strstr函数名:strstr功 能:在串中查找指定
45、字符串的第一次出现用 法:char*strstr(char*str1,char*str2);程序例:#include#include int main(void)char*str1=Borland International,*str2=nation,*ptr;ptr=strstr(str1,str2);printf(The substring is:%sn,ptr);return 0;23、strtod函数名:strtod功 能:将字符串转换为 double 型值用 法:double strtod(char*str,char*endptr);程序例:#include#include int
46、main(void)char input80,*endptr;double value;printf(Enter a floating point number:);gets(input);value=strtod(input,&endptr);printf(The string is%s the number is%lfn,input,value);return 0;24、strtok函数名:strtok功 能:查找由在第二个串中指定的分界符分隔开的单词用 法:char*strtok(char*str1,char*str2);程序例:#include#include int main(voi
47、d)char input16=abc,d;char*p;/*strtok places a NULL terminatorin front of the token,if found*/p=strtok(input,);if(p)printf(%sn,p);/*A second call to strtok using a NULLas the first parameter returns a pointerto the character following the token*/p=strtok(NULL,);if(p)printf(%sn,p);return 0;25、strtol函数
48、名:strtol功 能:将串转换为长整数用 法:long strtol(char*str,char*endptr,int base);程序例:#include#include int main(void)char*string=87654321,*endptr;long lnumber;/*strtol converts string to long integer*/lnumber=strtol(string,&endptr,10);printf(string=%s long=%ldn,string,lnumber);return 0;26、strupr函数名:strupr功 能:将串中的小
49、写字母转换为大写字母用 法:char*strupr(char*str);程序例:#include#include int main(void)char string =abcdefghijklmnopqrstuvwxyz,*ptr;/定义为数组才能修改/*converts string to upper case characters*/ptr=strupr(string);printf(%sn,ptr);return 0;27、swab函数名:swab功 能:交换字节用 法:void swab(char*from,char*to,int nbytes);程序例:#include#includ
50、e#include char source15=rFna koBlrna d;char target15;int main(void)swab(source,target,strlen(source);printf(This is target:%sn,target);return 0;原型:extern char*strstr(char*haystack,char*needle);*所在头文件:#include*功能:从字符串 haystack 中寻找 needle 第一次出现的位置(不比较结束符 NULL)。*说明:返回指向第一次出现 needle 位置的指针,如果没找到则返回 NULL。