已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章,第七章 函数,退出,7.1 C函数概述 7.1.1 函数的概念 7.1.2 C函数分类 7.2 函数定义 7.2.1 函数定义的一般形式 7.2.2 return语句 7.3 函数调用与函数声明 7.3.1 函数调用 7.3.2 函数声明 7.3.3 函数间参数传递的二种方式,7.4 函数的嵌套调用和递归调用 7.4.1 函数嵌套调用 7.4.2 函数递归调用 7.5 局部变量与全局变量 7.5.1 变量作用域 7.5.2 局部变量 7.5.3 全局变量 7.6 变量的存储类别 7.6.1 程序占用内存空间情况 7.6.2 变量的四种存储类别 7.6.3 各种存储类别变量使用举例 7.7 函数编写实例,本章小结,7.1 C函数概述,所谓函数,是结构化程序设计的基本模块单元,它用于完成某一特定的功能。在C语言中,C程序的基本结构是由函数构成,一个C程序可以有一个或多个函数构成,各函数在C程序中位置上是并列的关系,即所有函数处于平等的地位,不存在从属关系,但每个完整的C源程序有且只有一个主函数main()。主函数是C程序执行的起点。 1C函数模块的一般结构形式 函数首部 函数体 其中, (1) 函数首部包括函数类型、函数名、函数参数类型及参数名,其一般形式为: 函数类型 函数名(参数类型1参数名1,参数类型n,参数名n) (2) 函数体包括:声明部分和执行部分 声明部分:在这部分给出本函数所使用的变量定义说明和需要调用的函数声明等。 执行部分:程序段,由若干条语句组成命令序列(可以在其中调用其它函数)。 看书本P138页的例7.1,7.1.1 函数的概念,7.1 C函数概述,2C函数的执行方式(举例) 计算并输出i!/j!(i-j)!;本例中阶层出现三次,可以用函数完成,避免程序中多次出现重复的语句,程序如下: #include main() int i,j; long jc(int x); for(i=0;i6;i+) for(j=0;j=i;j+) printf(“%ldt“,jc(i)/(jc(j)*jc(i-j); printf(“n“); long jc(int x) long jcx=1; int k; for(k=1;k=x;k+) jcx=jcx*k; return jcx; 书本P139-P142的例7.2更能说明利用函数可使得程序设计模块化, 提高可读性。,返回,7.1 C函数概述,C语言中的函数可分为三类:主函数、标准库函数、用户自定义函数。 1主函数 函数是C程序的基本单位,即一个C程序可由一个或多个函数构成,但任何一个完整的C程序必须有一个主函数,且函数名必须是main,主函数是C程序执行的起点,不论main函数在程序中的位置。 2标准库函数 C语言编译系统将一些常用的操作或计算定义为函数,实现特定的功能,例如,数学中求数的平方根函数sqrt,这些函数称为标准库函数,简称库函数。每一种C编译系统都提供了一批库函数,并按函数功能分类存放在相应“库文件”中,供用户使用。C标准函数库非常丰富,ANSI C提供100多个库函数,Turbo C提供300多个库函数。不同的C编译系统提供的库函数的数量和功能不同,但有一些基本的函数是共同的。 3自定义函数 在用C语言编程时,除使用系统提供的标准库函数外,用户也可以自己定义函数,以实现用户需要的功能,这种由用户自定义的函数,称为用户自定义函数。 本章主要介绍自定义函数的定义、申明与调用等内容。,7.1.2 C函数分类,返回,7.2 函数定义,函数需要先定义后使用,没有定义过的函数不能使用。函数定义的形式有两种: 1现代方式(ANSI C新标准推荐形式) 函数类型标识符 函数名(类型1 形参1,类型2 形参2,类型n 形参n) 函数体 2传统形式 (老版本C中使用) 函数类型标识符 函数名(形参1, 形参2,形参n) 类型1 形参1;类型2 形参2; 类型n 形参n; 函数体 例7.3 用现代方式定义一个比较两个整数大小的函数,函数名为xycmp,函数返回大数,函数返回值类型为整型。 int xycmp(int x, int y) int max; max=xy?x:y; return xy?x:y; return max; ,7.2.1 函数定义的一般形式,当函数定义中缺省形参说明列表时,则为无参函数的定义形式若既缺少形参列表说明又缺少函数体则为空函数的定义形式,同一类型的多个形参说明可放在一起,用逗号隔开,形参说明用分号结束,7.2 函数定义,例7.4 下面两种函数定义都是错误的,找一找错在哪里 (1) int xycmp(int x, int y); return xy?x:y ; (2) int xycmp(int x,y ) return xy?x:y; 错误分析:在(1)的函数定义中,函数首部后不能加分号;在(2)的函数定义中,函数首部中对同类型形参的说明不能合在一起说明,应改为 int x, int y 函数定义的说明: (1) 当函数首部中有形参时,函数为有参函数,若无任何形参,称无参函数。 (2) 在函数定义中,若缺少函数类型,默认为int,因此例7.3中自定义函数 xycmp的函数定义中函数类型int也可省。 (3)为明确表示函数无返回值,可以用 void定义函数类型为无类型或空类型。,返回,7.2 函数定义,return语句属于C语言的控制语句,它一般是放在函数体内,用于返回函数值,在函数体中一旦执行return语句,则结束当前函数的执行,返回到主调函数的调用点。一个函数中可以有一个以上的return语句,但只会有一个return语句被执行,即执行到哪一个return语句,哪一个语句起作用。 1return 语句一般形式 形式1:return ; 此形式函数无返回值,在函数体中该语句也可省。 形式2:return (表达式); 表达式的值作为函数返回值,返回供主调函数使用 2return 语句使用的说明 若需要从被调函数带回函数值供主调函数使用,被调函数中必须有return语 句,反之不需要。 (2) return语句中,表达式的括号可以省略。 (3) 如果函数值的类型和return语句中表达式值类型不一致,则以函数类型为准。 系统可以进行自动类型转换,即函数类型决定返回值的类型。,7.2.2 return语句,返回,7.3 函数调用与函数声明,程序中使用已定义好的函数,称为函数调用。如果函数A调用函数B,则称函数A为主调函数,函数B为被调函数。除了主函数,其他函数的执行都必须通过函数调用来执行。 函数调用的三种形式: (1) 表达式方式:即函数调用出现在一个表达式中,这类函数必须有返回值, 其返回值参加表达式的运算。 (2) 参数方式:即函数调用出现在另一个函数调用的实参列表中。这类函数也 必须是有返回值,其返回值作为另一个函数调用的实参。 (3) 语句方式:即函数调用作为一个独立的语句。一般用在仅要求函数完成一 定的操作,丢弃函数的返回值或函数本身没有返回值。如 printf函数的调用。,7.3.1 函数调用,7.3 函数调用与函数声明,例7.5 有参函数的调用(输出两数之中较大的一个数) #include “stdio.h “ int max(int x, int y) /*max函数形参有两个形参x,y*/ int d; d=xy?x:y; return d; void main( ) int a=4,b=7,m; m=max(a,b); /*表达式调用方式*/ printf(“max=%d”,m); 如果要输出三数之中较大的数,怎么表达? 例7.6 无参函数的调用 #include “stdio.h “ void star( ) /*star函数无形参*/ printf(“*n”); void main( ) int i; for(i=0;i4;i+) star(); /*语句调用方式*/ ,返回,7.3 函数调用与函数声明,函数声明:在函数的执行部分,若需要调用函数就同使用变量一样,在调用前应该在主调函数中事先对被调用函数加以说明。 函数声明的方法:在主调函数函数体的声明部分或函数之外加上被调用函数的函数原型,即函数定义中的函数首部形式。 1函数声明的一般形式 在C语言,对被调用的自定义函数声明有以下三种合法形式。 形式一: 函数类型标识符 函数名(类型1 形参1,类型2 形参2,类型n 形参n); 形式二: 函数类型标识符 函数名(类型1,类型2,类型n); 形式三: 函数类型标识符 函数名( ); 2函数声明的作用 函数声明的目的是向编译系统提供被调函数的信息,即函数返回值的类型、函数名、形参的个数及类型等信息,编译系统根据这些信息对函数体中的函 数调用语句进行核对,以检验函数调用是否正确。,7.3.2 函数声明,3函数声明的位置 函数声明的位置一般放在主调函数的函数体中声明部分;但当此函数被多个函数调用时,其位置也可放在函数模块外,位于各主调函数之前。 例7.7 函数声明位置在函数模块内。按级数展开式求e的近似值,要求精确到最后一项的值小于10-4。e=1+1/1!+1/2!+1/3!+1/n!。 #include “stdio.h“ main() double e=1,t=1;int i=1; long jc(int x); while(t=10e-4) t=1.0/jc(i); e=e+t; i+; printf(“e=%lf“,e); ,7.3 函数调用与函数声明,long jc(int x) long jcx=1;int n; for(n=1;n=x;n+) jcx=jcx*n; return jcx; ,例7.8 函数声明位置在函数模块外。编程求an的值。a为非零实数,n为整数,其值由键盘输入。 #include double mp(double,int); /*在主函数模块外对函数mp的声明*/ main() double a;int n; printf(“input a and n :“); scanf(“%lf%d“, ,返回,7.3 函数调用与函数声明,程序运行结果为:,7.3 函数调用与函数声明,1传值方式 在传值方式下,主调函数将实参的数据复制到被调函数对应的形参中,实现实参与形参间的数据传递。传值方式的特点是:实参和形参在内存中占有不同的存储单元。形参只能复制实参的值,而不能改变实参所在存储单元中的值。 2传地址 在传址方式下,主调函数将实参的地址复制给对应的形参,形参直接引用该地址中的数据。由于实参和形参指向同一地址,因而在被调函数内操作的是与实参共享的同一存储区域的数据。 说明: (1)当函数调用时实参为常量、变量和表达式,其值的类型为整型、实型、字符 型等数据类型,实参与形参间的数据传递方式为传值方式。 (2)当函数调用时实参值是指针类型的数据,形参可以是数组或指针变量。 实参 可以是常量、变量或表达式,但实参值类型必须是地址。,7.3.3 函数间参数传递的二种方式,传递方式 形参 实参 传值 变量 常量、变量、表达式、数组元素 传址 指针、数组名 变量地址、指针、数组名,7.3 函数调用与函数声明,例7.9 传值方式函数间参数传递示例。 编程实现输出100至999之间所有的水仙花数,所谓水仙花数是指一个三位数 的各位数字立方和等于该数本身。例如153=13+53+33,则153即为水仙花数。 #include #include int isflower(int x) int g,s,b; g=x%10; s=x/10%10; b=x/100; if (g*g*g+s*s*s+b*b*b=x) return 1; else return 0; main() int i; for(i=100;i1000;i+) if(isflower(i) printf(“%-7d”,i); 运行程序后输出结果为: 153 370 371 407,7.3 函数调用与函数声明,例7.10 传值方式函数间参数传递示例。 交换a、b两数的值。 #include main() int a,b; void swap(int,int); printf(“input a and b:“); scanf(“%d%d“, 正确交换的程序是?,void swap(int x,int y) int t; t=x; x=y; y=t; printf(“x=%d,y=%dn“,x,y); ,7.3 函数调用与函数声明,作业分析:编程判断一个整形数x是否为素数的函数isprime(),若是素数,函数返回1,否则返回0。 #include #include main() int n; printf(“input a number:“); scanf(“%d“, ,int isprime(int x) int m,i,flag=0; m=sqrt(x); for(i=2;i=m;i+) if(x%i=0) flag=1;break; if (flag=0) return 1; else return 0; ,作业分析:编写程序,用近似计算公式计算e的x次方。函数f1用来计算每数据项中分子的值,函数f2用来计算每数据项中分母的值。 ex =1+x+x2/2!+x3/3!+(前15项的和) #include double f1(double x,int y) double rs=1; while(y-!=0) rs*=x; return(rs); long f2(int x) long jcx=1;int k; for(k=1;k=x;k+) jcx=jcx*k; return jcx;,7.3 函数调用与函数声明,main() double e=1,t=1;int j=1,x; long jc(int x); double mp(double,int); printf(“iput a numer:“); scanf(“%d“, ,编写一个程序,求满足以下条件的最大的n的值。要求编写一个求2n的函数实现。 21+22+23+2n double mp(double,int); main() double s=0;int n=0; do n+; s=s+mp(2,n); while(s1000); printf(“%dn“,n-1); ,7.3 函数调用与函数声明,double mp(double x,int y) double rs=1; while(y-!=0) rs*=x; return (rs); ,作业分析:编写函数,函数功能为判断字符串是否为回文,如果是,则函数返回1,否则返回0。 #include #include int hw(char a) int len,i,flag=1; len=strlen(a); for(i=0;i=len/2;i+) if(ai!=alen-i-1) flag=0;break; if(flag=1) return 1; else return 0; ,main() char a80; gets(a); if(hw(a) printf(“This string is huiwen!“); else printf(“This string is not huiwen!“); ,7.3 函数调用与函数声明,7.3 函数调用与函数声明,函数调用特别申明: 在C语言中,各函数之间的逻辑联系是通过函数调用来实现的。有参函数被调用时,其中的形参(被调函数)用于接收来自主调函数中对应的实参数据,形参和实参不是靠名称相同来传递数据的,而是在对应位置之间传递数据,因此要求形参和实参在数据类型、个数及顺序上要一一对应,而不需要形参和实参同名。 另外,需要注意的是,在函数未被调用时,函数的形参并不占有内存单元,也没有实际值,只有当函数被调用时,系统才为形参分配存储单元,并完成实参和形参之间的数据传递。,7.3 函数调用与函数声明,例7.11 传址方式函数间参数传递示例。求一个一维整型数组中元素的平均值。 #include main() int i,a4; /*定义一个一维整型数组a*/ float pv,aver(int x); /*函数声明*/ printf(“input 4 integers:“); for(i=0;i4;i+) scanf(“%d“,程序运行结果为:,7.3 函数调用与函数声明,例7.12 传址方式函数间参数传递示例。对一个一维整型数组中前5 个元素按其值从大到小进行排序。 #include main() int i,n,a10; /*定义一个一维整型数组a*/ void sort(int x,int n); /*函数声明*/ printf(“input 10 integers: “); for(i=0;i10;i+) scanf(“%d“, ,返回,7.4 函数的嵌套调用和递归调用,C源程序中各函数模块的定义是互相平行独立的,不允许嵌套定义,即在一个 函数内不能再定义另一个函数,但是允许函数的嵌套调用,即在一个函数内可以 调用另一个函数,被调用的函数还可以再调用其他函数,这种函数调用称为函数 嵌套调用。 例7.16 求表达式1!+2!+3!+n!的值。 #include main( ) int n;long sum; long mysum(int); /*函数声明*/ printf(“input n:“); scanf(“%d“,7.4.1 函数嵌套调用,返回,7.4 函数的嵌套调用和递归调用,7.4.2 函数递归调用,在一个函数的函数体中又调用该函数本身的形式称函数递归调用。使用递归函数的优点是程序代码简洁,程序容易阅读和理解。C语言的特点之一就在于允许函数的递归调用。 注意:当函数具有下面二个特点时,可以采用递归函数实现。 (1) 在函数体内有递归终止条件。(2) 函数f(n)与f(n-1)存在函数关系。 例7.17 编写递归函数jc求n!,假设n为10以内的正整数。 递归方式: long jc(int n) if (n=1) return 1; /*递归终止条件*/ else return jc(n-1)*n; /*递归调用*/ ,非递归方式: long jc(int x) long jcx=1;int n; for(n=2;n=x;n+) jcx=jcx*n; return jcx;,7.3 函数调用与函数声明,利用递归方法写出求an的值的函数。,double mp(double x,int y) if(y=0) return 1; else return mp(x,y-1)*x;,编写一个程序,求满足以下条件的最大的n的值。要求编写一个求2n的函数实现。 21+22+23+24+2n1000。,#include double mp(double,int); main() double s=0;int n=0; do n+; s=s+mp(2,n); while(s1000); printf(“%dn“,n-1); ,double mp(double x,int y) if(y=0) return 1; else return mp(x,y-1)*x; ,7.4 函数的嵌套调用和递归调用,例7.18 编写递归函数myprint实现使整数N按逆序输出每个数字。例如键盘输入354,则调用该函数输出4 5 3。 #include void myprint(int n) if (n=0) return ; /*递归终止条件*/ else printf(“%2d“,n%10); myprint(n/10); /*递归调用*/ return; main() int x; printf(“ninput x: “); scanf(“%d“, ,程序运行结果为:,返回,7.4 函数的嵌套调用和递归调用,编写分别用递归和非递归函数的方法将整数N倒置。例如键盘输入1234, 则调用该函数输出4321。,#include int dz(int x) int n,s=0; while(x!=0) n=x%10; s=s*10+n; x=x/10; return s; main() int a; printf(“input a number: “); scanf(“%d“, ,#include int dz(int n,int m) if(n=0) return m; else return dz(n/10,m*10+n%10); main() int a; printf(“input a number: “); scanf(“%d“, ,7.4 函数的嵌套调用和递归调用,自定义一个函数itos,实现将一个整数转换为字符串的功能,并编写主函数调用该函数,实现键盘输入一个整数,输出一个对应数字字符串。,#include #include void itos (int n,char s); main() int n; char s10; printf(“Input n:n“); scanf(“%d“, ,void itos (int n,char s) int i,j,sign; if(sign=n)=0;j-) printf(“%c“,sj); ,7.5 局部变量与全局变量,7.5.1 变量作用域,C程序是由若干个函数组成,在函数体内或函数体外部均可以定义变量,但不同位置定义的变量,其作用域不同。作用域确定程序能在何时、何地访问变量。简单地说,变量定义的位置决定了变量的作用域,而从变量作用域角度,把变量划分为局部变量和全局变量;在函数内定义的变量称为局部变量;在函数外定义的变量称为全局变量。 变量的作用域:即变量的有效范围或者变量的可见性。变量定义的位置决定了变量的作用域。,返回,7.5 局部变量与全局变量,7.5.2 局部变量,局部变量即指在函数内定义的变量。函数内部定义的局部变量只在该函数范围内有效,因此,不同函数中(或不同的复合语句中)的局部变量可以重名,互不混淆。特别要指出的是,函数中的形参也是局部变量。局部变量的作用域在其所在的函数。局部变量又称内部变量。 1定义位置与形式 C语言中,局部变量的定义位置与形式有几种情况,但均在函数内定义。在以下各位置定义的变量均属于局部变量。 (1)在函数体内定义的变量,在本函数范围内有效,作用域局限于函数体内。 (2)在复合语句内定义的变量,在本复合语句范围内有效,作用域局限于复合语 句内。 (3)有参函数的形式参数也是局部变量,只在其所在的函数范围内有效。,7.5 局部变量与全局变量,2局部变量定义示例 例7.20 局部变量定义位置及形式示例 编写判断自然数x是否为素数的函数ss,若是素数则返回值为1,否则为0。 int ss(int x) /*形参x是局部变量,其作用域为ss函数内*/ int n; /*函数内定义的变量n是局部变量,其作用域为ss函数内*/ for(n=2;n main( ) int a,b; printf(“input a,b: “); scanf(“%d%d”, ,返回,7.5 局部变量与全局变量,7.5.3 全局变量,1全局变量的定义位置与其作用域 全局变量即在函数外定义的变量。(这里的函数外可以指所有函数前、各个函数之间或所有被调用函数后);全局变量的作用域是从定义全局变量的位置起到本源程序结束为止。 2全局变量应用示例 注意: (1)全局变量可以和局部变量同名,当局部变量有效时,同名全局变量不起作用。 (2)使用全局变量可以增加各个函数之间的数据传输渠道,在一个函数中改变一个 全局变量的值,在另外的函数中就可以利用。但是,使用全局变量使函数的通 用性降低,使程序的模块化、结构化变差,所以要慎用、少用全局变量。,7.5 局部变量与全局变量,例7.22全局变量与局部变量的作用域区别。 编程实现键盘输入圆的半径,求圆的面积并输出结果至屏幕。 程序代码1(程序有错) #include #define PI 3.14 void round(double r) double s; s=PI*r*r; main ( ) double x=3; round(x); printf(“%.3f”,s); /*s是局部变量,其作用域为round函数内*/ 程序代码2(程序正确) #include #define PI 3.14 double s; /*s是全局变量,其作用域为整个程序*/ void round(double r) s=PI*r*r; main ( ) double x=3; round(x); printf(“%.3f”,s); /*s是全局变量,在main和round函数模块中都能引用该变量。*/,7.5 局部变量与全局变量,编程实现键盘输入圆的半径,求圆的面积并输出结果至屏幕。 用函数返回值方式写: 程序代码3(正确) #include #define PI 3.14 double round(double r) double s; s=PI*r*r; return s; main ( ) double x=3; printf(“%.3f”,round(x); ,7.5 局部变量与全局变量,例7.23 全局变量与局部变量同名时的处理方式及全局变量的初值问题。 #include double add,mult; /*在函数外定义了两个全局变量add,mult */ void fun(double x,double y) double add,mult; /*在函数fun内定义了两个局部变量add,mult */ add=x+y; /*在函数fun内引用的是局部变量add,给其赋值为x+y */ mult=x*y; /*在函数fun内引用的是局部变量mult,给其赋值为x*y */ void main() double a,b; scanf(“%lf%lf“, 运行程序后输出结果为: 7 5 add=0.00 mult=0.00,返回,7.6 变量的存储类别,7.6.1 程序占用内存空间情况,C语言中,变量有两种属性:数据类型和存储类别。 数据类型:决定了变量中数据的表示形式,占据存储空间的多少及构造特点。如 整型(int)、实型(float)、字符型(char)、双精度型(double)等。 存储类别:存储类别表示编译系统为变量分配存储空间的方式。不同的存储方式 决定了变量的生存期。存储方式主要有两种:静态存储方式和动态存 储方式。具体有四种存储类别:自动类型(auto)、静态类型 (static)、寄存器类型(register)、外部类型(extern)。 C程序运行时,可使用的内存空间由三部分组成,如下图所示。,返回,7.6 变量的存储类别,7.6.2 变量的四种存储类别,1、auto自动型变量(或自动变量) 在函数中变量定义或函数的形参前面可以加或不加auto关键字用来说明存储类别为自动型。函数中定义的局部变量,如不专门声明存储类别为static型,都是动态分配存储空间的,这类动态分配存储空间的变量均称为自动变量。auto型变量在函数体或复合语句中定义。自动变量在函数调用时系统给它们分配存储空间,在函数调用结束(或复合语句结束)就自动释放这些存储空间。未赋初值的自动变量其值不确定。 2、static静态型变量(或静态变量) (1)静态局部变量:用static说明的局部变量 在函数调用结束后其值不会消失而保留原值,即其占用的存储单元不释放,在下一次调用时为上次调用结束时的值。 (2)静态全局变量:用static说明的全局变量 静态全局变量的特点是只能被所在文件中的函数引用,而不能被其他文件中的函数引用。而全局变量可以被整个程序中的函数引用,即不论函数是否与全局变量在同一个文件中,都可以引用,但在引用该全局变量的文件中需要用关键字extern对它加以声明。,7.6 变量的存储类别,3、extern外部型变量(或外部变量) 全局变量可以被整个程序所有文件中的函数引用,如果在每个文件中都定义一次,单个文件编译时没语法错误,但所有文件连接时,就会产生对同一个全局变量多次定义的连接错误。为避免这种情况,全局变量只需在一个文件中定义,而在其它文件中引用该变量时,只要用extern对此变量加以声明,即声明为外部变量即可。由于在一个程序文件中定义的全局变量其作用域为从其定义开始到文件结束,因此也可用用extern声明全局变量,扩展它在程序文件中的作用域。 4、register寄存器型变量(或寄存器变量) 寄存器变量是C语言所具有的汇编语言特性之一,它存储在CPU的寄存器中,而不像普通变量存储在内存中,因此对寄存器变量的访问比内存变量访问速度要快得多。其用法同auto型变量。通常将使用频率较高的数据存放在寄存器变量中,以提高运行速度,这种变量定义个数有限与计算机硬件有关,TC环境允许同时定义两个寄存器变量,当定义个数超过时编译系统自动超过数目的寄存器变量当作自动变量进行处理。寄存器变量只能用于整型和字符型变量。,返回,7.6 变量的存储类别,7.6.3 各种存储类别变量使用举例,例7.24 自动变量使用示例。程序如下: #include int f(int n) /*形参int n前省略了关键字auto,形参n是自动变量 */ auto int s=0; /*存储类别关键字auto可省略,局部变量s是自动变量*/ s=s+1; return s; void main() int k; for(k=1;k4;k+) printf(“%3d”,f(k); 运行程序后输出结果为: 1 1 1,7.6 变量的存储类别,例7.25 静态局部变量与自动变量的区别示例。 #include “stdio.h“ int ksum(int n) static int x=0;/* x定义为静态局部变量*/ x=x+n; return(x); main() int k; /*定义一个自动变量k*/ for (k=1; k=5; k=k+1) printf(“sum(d)=dn“,k,ksum(k); 若将例7.25中ksum函数改为: int ksum(int n) int x=0;/*去掉static, x为自动变量*/ x=x+n; return(x); 寄存器变量和外部变量使用示例见书本。,运行输出结果为: sum(1)=1 sum(2)=3 sum(3)=6 sum(4)=10 sum(5)=15,修改后运行输出结果: sum(1)=1 sum(2)=2 sum(3)=3 sum(4)=4 sum(5)=5,7.7 函数编写实例,例7.27 编程输出2100之间所有的同构数,要求用自定义函数实现判断同构数。同构数就是指一个数是其平方数的尾部,如25是其平方数625的尾部,则25为同构数。,#include #include int tgs(int x) int w; w=(int)log10(x)+1; if(x*x%(int)pow(10,w)=x) return 1; else return 0; ,main() int i; for(i=2;i=100;i+) if(tgs(i) printf(“%4d“,i); ,7.7 函数编写实例,例7.28 编写一个能求最大公约数的自定义函数gys,该函数返回值为任意两个正整数的最大公约数。(辗转相除法) #include “stdio.h“ main() int d,x; printf(“d=,x=“); scanf(“%d%d“, ,7.7 函数编写实例,例7.29 编写函数实现将输入的十进制整数n转换为十六进制数的功能,并编写主函数调用自定义函数。例如,输入十进制整数79,将输出十六进制4f。 #include “stdio.h“ #include “string.h“ char tran(int x) /*该函数实现将数x转换为十六进制的数码*/ if (x10)return (0+x); else return (A+x-10); void dtoh(int m,char str) int sm,i=0; while(m!=0) sm=m%16; stri=tran(sm); /*在函数dtoh中嵌套调用函数tran*/ m=m/16; i+; stri=0; return ; int main(void) int i=0,k,len,n; char h20; /*将十六进制数以字符串形式存放在数组中 */ printf(“input n:“); scanf(“%d“, ,程序运行结果为:,返回,7.7 函数编写作业分析,作业分析:编写一个求最小公倍数的自定义函数gbs,该函数返回值为任意两个正整数的最小公倍数。,#include int gbs(int x,int y) int g; g=xy?x:y; while(1) if(g%x=0 ,void main() int a,b; int gbs(int x,int y); printf(“enter two numbers:“); scanf(“%d%d“, ,7.7 函数编写作业分析,作业分析:编写函数实现将输入的十六进制整数n转换为十进制数的功能,并编写主函数调用自定义函数。例如,输入十进制整数79,将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2021贵州公务员行测真题及答案解析
- 2024年9月昭通市直机关遴选公务员面试真题附解析
- 信息技术上机试卷(二)
- 二级建造师继续教育考试复习题库及答案指导
- 双重预防体系题库大全含答案王牌题库
- cpa审计考试题型
- 党的知识竞赛题库(含答案)-200单选-报
- 2025年麻醉科主治医师考试真题练习卷
- 对当前金融监管的几点看法
- 2025江西省考面试6月22日面试真题解析
- 集成电路芯片设计企业组织架构详解
- 2025广东深圳市罗山科技园开发运营服务有限公司第二批招聘4人笔试考试参考试题及答案解析
- 学堂在线 人工智能 章节测试答案
- 2025全国硕士研究生政治考试完整真题及答案
- 彼得·蒂尔:硅谷教父的叛逆人生
- 配送员食品安全培训课件
- 高危药品外渗预防及处理
- bz-门式轻钢结构厂房施工组织设计投标方案230
- 2025年违规吃喝谈心谈话记录
- 钢结构焊接工艺评定
- 校园安全教育安排表
评论
0/150
提交评论