C语言程序设计课件第5章_第1页
C语言程序设计课件第5章_第2页
C语言程序设计课件第5章_第3页
C语言程序设计课件第5章_第4页
C语言程序设计课件第5章_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

返回主目录C语言程序设计(第5章函数)返回主目录C语言程序设计(第5章函数)

本章主要介绍C语言程序函数的基本知识和基本应用。

1.函数与模块化程序设计

2.函数的概述

3.函数的嵌套调用和递归调用

4.变量的作用域和生存期

5.编译预处理本章主要介绍C语言程序函数的基本知识和基本应用一、函数与模块化程序设计1模块化程序设计方法:程序员在设计一个比较复杂的应用程序时,一般采用的方法是将整个程序分解成若干个功能较为单一的、相对独立的程序模块分别实现,然后再将所有的程序模块象搭积木一样装配起来,形成一个完整的程序,这种在程序设计中分而治之的策略称为模块化程序设计方法。优点:主要体现在程序编制方便,易于修改和调试,可由多人共同参与完成,缩短程序的设计时间,并能实现程序模块的标准化、规范化。一、函数与模块化程序设计1模块化程序设计方法:在C语言中,函数是程序的基本组成单位,程序设计人员可以很方便地用函数作为程序模块来实现程序的模块化,一个函数就是一个模块,独立完成一项功能。在C语言中,函数是程序的基本组成单位,程序设采用普通的程序设计方法#include"stdio.h"main(){inta,b,max;printf("输入两个整数:");scanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;printf("max=%d\n",max);}例5-1求两个整数的最大值。采用结构化程序设计方法#include"stdio.h"intfmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}main(){inta,b,max;printf("输入两个整数:");scanf("%d%d",&a,&b);max=fmax(a,b);printf("max=%d\n",max);}采用普通的程序设计方法例5-1求两个整数的最大值。采用结2程序模块设计一般原则①模块相对独立一个模块往往要求完成一个单独的功能,并与其他模块尽量保持一定的独立性,当修改这个模块时,不会引起整个程序的混乱。同时,在模块内部,尽量将数据局部化,便于保证数据在不同模块之间的正常传递。②模块之间关系尽量简单模块之间关系要尽量简单,且不互相干扰,做到模块之间只有在相互调用时才发生数据传递。除此之外,相互之间不直接发生联系。2程序模块设计一般原则①模块相对独立②模块之间关系尽量③模块规模大小要适中程序模块不宜过大,也不要过于复杂,大小要适中。模块过大,容易造成程序功能紊乱,可读性差,不好理解。模块过小,容易造成程序结构复杂,数据传递容易出错。④模块尽量保持通用性模块应尽量规范,保持一定的通用性,这样便于对模块进行修改和维护,快速实现对程序的扩充。③模块规模大小要适中④模块尽量保持通用性一、函数的分类与定义函数可以分为无参函数和有参函数。函数可以分为标准函数和自定义函数。有一个或多个形参无形参由系统提供,可直接使用由用户自己定义使用一、函数的分类与定义函数可以分为无参函数和有参函数。函数二、函数的定义1.无参函数定义的一般形式:函数类型说明符函数名(){函数体}例如:printstar(){printf("**********\n");}二、函数的定义1.无参函数定义的一般形式:例如:2.有参函数定义的一般形式:函数类型说明符函数名(形参表列){函数体}例如:intfmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}2.有参函数定义的一般形式:例如:说明:①C语言规定:函数不允许嵌套定义。函数之间是平行的、相对独立的。一个函数的定义可以放在程序中的任何一个位置,但在一个函数的函数体内,不能再定义另外一个函数。②函数的类型是指函数返回值的类型,可以是整型、实型、字符型、指针类型等等数据类型,如果函数没有返回值,则函数类型为void。③函数名必须符合标识符的命名规则,函数名不能与变量名重名,也不能与关键字同名。④函数体包含两部分:语句声明部分和执行语句部分。⑤空函数——既无参数,又无函数体,其一般形式为:函数类型说明符函数名(){}说明:函数的调用在定义一个函数后,要调用该函数才能执行该函数的功能,否则,该函数在程序中只是一段静态的代码,不起任何作用。1.函数调用的一般形式函数名(实参表列)注意:①实参表列的形式为:实际参数1,[实际参数2,…],实参可以是常量或变量,也可以是各种表达式。②实际参数的个数和类型应该与函数定义时的形式参数的个数和类型一致,并一一对应。例如:c=max(a,b);③调用无参函数时,不能有实参表列。三、函数的调用函数的调用在定义一个函数后,要调用该函数才能2.函数调用的具体方式⑴函数语句把函数调用作为一个语句。其一般形式为:

函数名(实际参数表);该方式常用于调用一个可以忽略返回值或没有返回值的函数。例如程序中的scanf()函数和printf()函数的调用。2.函数调用的具体方式⑵函数表达式函数调用出现在表达式中,这种表达式称为函数表达式。其一般形式为:

变量名=函数表达式;这种方式用于调用带返回值的函数,函数的返回值将参加表达式的运算。例如程序中的max=maxnum(i,j,k);⑵函数表达式⑶函数实参函数作为另一个函数调用的实参出现,这种方式是把该函数的返回值作为实参进行传送,因此,要求该函数必须有返回值。例如:max=fmax(a,fmax(b,c));⑶函数实参四、函数的说明C语言规定:函数调用之前必须对该函数进行定义或说明。函数的定义可以写在程序中的任何位置,但如果被调函数定义在主调函数之后,则在主调函数中必须要对被调函数进行说明,这样在函数调用的时候才能够找到函数原型。函数原型的一般形式是:⑴函数类型说明符函数名(参数类型1,参数类型2,…)例如:intmaxnum(int,int,int);⑵函数类型说明符函数名(参数类型1参数名1,参数类型2参数名2,…)例如:intmaxnum(intx,inty,intz);四、函数的说明C语言规定:函数调用之前必须对该函数进行定义或五、函数的参数在函数调用的过程中,两个函数之间的数据传递是靠参数和返回值来传递的,主调函数利用参数将数据传给被调函数,被调函数的运行结果通过返回值传回给主调函数。#include"stdio.h"main(){intx,y,z;scanf("%d,%d",&x,&y);z=max(x,y);printf("%d",z);}intmax(inta,intb){intc;if(a>b)c=a;elsec=b;returnc;}五、函数的参数在函数调用的过程中,两个函数之间的数据在调用函数时,函数名后面括号中的数据称为实际参数(简称实参)实参与形参的区别在定义函数时函数名后面的括号中的变量称为形式参数(简称形参)。在被调函数中出现在主调函数中出现。变量变量、常量、表达式具体的数值存储数值的空间单向值传递在调用函数时,函数名后面括号中的数据称为实际参数(简称实参)说明:①形参在被调函数中出现,实参在主调函数中出现。②形参是在函数被调用时临时分配存储单元的,一旦调用结束,形参所占的存储单元立即被释放。③实参可以是常量、变量或表达式,但必须是确定的值;形参必须是变量。因为实参是函数在调用刚开始时传递的具体数据,所以必须是确定的值;形参是用来接受数据的,只有在内存中占有存储空间才能存放数据,因此,形参必须是变量。④在定义函数时,必须指定形参类型。形参实际上就是定义的变量,如果不指定变量的类型,将无法分配内存单元。说明:⑤实参传递给形参的实际值必须与函数定义中的形参类型一致。不一致时要在主调函数中对被调函数作说明。⑥调用语句中的实参个数应与被调用函数的形参个数相等,其类型、顺序必须一一对应。⑦实参和形参在内存里占用不同的存储空间,即使同名也不会相互影响。⑧C语言规定:实参对形参的传递是值传递,即单向传递,只能由实参传给形参,而不能由形参传给实参。⑤实参传递给形参的实际值必须与函数定义中的形参类型一致。不六、函数的返回值任何函数都是有值的,如果值是恒定的,可以返回,则有返回值;如果值不恒定,无法返回,则没有返回值。函数的返回值是用return语句来实现的。return语句的格式有两种:

returnr;或return(r);其中r为返回值,且从该函数返回。r可以是常量、变量、表达式,也可以是函数调用。注意:如果函数没有返回值,可以事先说明该函数的类型是void型(即空类型)六、函数的返回值任何函数都是有值的,如果值是恒定的,可以返说明:①函数类型应与返回值的类型保持一致,如果类型不一致,则以函数类型为准。②若函数中无return语句,并不是不带回返回值,只是不带回有用的值,所以若不需要有返回值,则函数类型说明符为void,以明确表示不带回值。③一个函数一次只能返回一个返回值。#include"stdio.h"main(){inta=2,b=3,c;intf(intx,inty);c=f(a,b);printf("f(%d,%d)=%d\n",a,b,c),}intf(intx,inty){intz;z=x>y?x++:y++;returnz;}例5-2说明:#include"stdio.h"intf(int一、函数的嵌套调用

C语言中,函数的定义是相对独立的、平行的,没有隶属关系,函数不能嵌套定义,但可以嵌套调用。即在调用一个函数的过程中,又可以调用另外的函数。一、函数的嵌套调用C语言中,函数的定义是相对main()函数f1()函数f2()函数

①②③④

调用f1()函数调用f2()函数⑤⑨⑧⑦⑥结束返回返回main()intf1(intx,inty)intf2(intm,intn){{{...........................c=f1(a,b);z=f2(m,n);}..................}}main()函数f1()函数例5-3求S=1K+2K+3K+……+nk的值分析:本题可以用三个不同的函数来分别描述。①f1函数计算nk②f2函数求S=1K+2K+3K+……+nk

③main()函数输入、输出初始条件和最后结果。#include"stdio.h"longf1(intn,intk){longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk){longsum=0;inti;for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){intn,k;printf(“inputn,k:");scanf(“%d,%d",&n,&k);printf("%d\n",f2(n,k));}例5-3求S=1K+2K+3K+……+nk的值分析:本二、函数的递归调用

在函数的调用过程中,允许直接或间接地调用函数自身,这种调用称为递归调用。函数直接自己调用自己,为直接递归。函数间接自己调用自己,为间接递归。二、函数的递归调用在函数的调用过程中,允许直接或间接地调用例5-3求整数n!#include"stdio.h"longfact(intn);main(){inti;longfac;printf("i=");scanf("%d",&i);fac=fact(i);printf("%d的阶乘等于%ld\n",i,fac);}longfact(intn){longf;if(n<=0)f=1;elsef=n*fact(n-1);returnf;}例5-3求整数n!#include"stdio.h"例5-4已知某数列为K(n)的定义如下,求该数列的第六项K(6)。1n=1K(n)=K(n-1)*2n为偶数K(n-1)*3n为奇数main(){inti;floatj;printf("inputthenumber:");scanf("%d",&i);if(i<=0)printf("n<=0,dataerror!\n");else{j=k(i);printf("K(%d)=%1.0f\n",i,j);}}#include"stdio.h"floatk(intn){floatm;if(n==1)m=1.0;elseif(n%2==0)m=k(n-1)*2;elsem=k(n-1)*3;returnm;}例5-4已知某数列为K(n)的定义如下,求该数列的第六项例5-5有5个人坐在一起,问第5个人几岁,他说比第4个人大3岁,第4个人说比第3个人大3岁,第3个人说比第2个人大3岁,第2个人说比第1个人大3岁,第1个人说自己18岁。编程求第5个人几岁?#include"Stdio.h"intage(intx){inty;if(x==1)y=18;elsey=age(x-1)+3;returny;}main(){printf("%d",age(5));getch();}例5-5有5个人坐在一起,问第5个人几岁,他说比第4个例5-6求下面函数的值。1(n=0)p(n,x)=x(n=1)((2*x-1)*p(n-1,x)*x-(n-1)*p(n-2,x))/n(n>1)例5-6求下面函数的值。#include"Stdio.h"floatp(intn,intx){floatpp;if(n==0)pp=1;elseif(n==1)pp=x;elsepp=((2*x-1)*p(n-1,x)*x-(n-1)*p(n-1,x))/n;returnpp;}main(){floatf;intn,x;printf("inputthen,x:");scanf("%d,%d",&n,&x);f=p(n,x);printf("%f",f);}#include"Stdio.h"一、变量的作用域和生存期

变量的作用域变量的生存期变量在程序中影响范围变量在程序中起作用的时间长期性暂时性全局变量局部变量一、变量的作用域和生存期变量的作用域变量的生存期变量在程序局部变量①变量只能在当前函数或当前复合语句中有效。②形式参数是局部变量。③可以在复合语句中定义局部变量。④局部变量可以同名,互不干扰。全局变量①在整个程序中有效有效。②全局变量可以和局部变量同名,互不干扰,全局变量之间不能同名。③在同一个程序中,如果全局变量与局部变量同名,在局部变量的作用范围内,全局变量暂时不起作用,被屏蔽。④通常情况,建议尽量少使用全局变量局部变量①变量只能在当前函数或全局变量①在整个程序中有效#include"stdio.h"inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;returnc;}main(){inta=8;printf("%d",max(a,b));}#include"stdio.h"二、变量的存贮类别数据的动态存贮方式和静态存贮方式程序区动态存贮区静态存贮区存放程序指令存放暂时性数据(局部变量)存放数据长期性(全局变量)二、变量的存贮类别数据的动态存贮方式和静态存贮方式程序区动态在C语言中变量的存贮类别有四种自动型变量外部型变量静态型变量寄存器型变量说明:auto作用域:局部生存期:暂时存贮区:动态区说明:extern作用域:全局生存期:长期存贮区:静态区说明:static作用域:局部或全局生存期:长期存贮区:静态区说明:register作用域:局部生存期:暂时存贮区:寄存器在C语言中变量的存贮类别有四种自动型变量外部型变量静态型变量自动型变量auto♥出现范围:出现在函数内部。♥判别方法:①定义在函数内部并且缺省存储类别说明②直接auto显式说明♥作用域:定义该变量的函数或复合语句。♥生存期:定义该变量的函数或复合语句被执行期间,是局部。

♥存贮区域:动态存贮区注意:①自动变量一般省略auto,函数中的大多数变量都是自动变量。②形参和复合语句里定义的变量也是自动变量。③自动变量一旦被说明,则只能在说明该变量的函数或复合语句中出现才有效,离开了上述区域则无效。④生存期只限于相应函数被调用时,若变量是定义在复合语句内,则其生存期为该复合语句被执行的期间。自动型变量auto例5-7#include"stdio.h"main(){inta=1;f(a);f(a);}intf(inta)

{intb;

b=a++;printf("%2d",b);}/*a是局部变量,作用域为main函数内*//*a、b都是局部变量,作用域为f函数内,生存期在调用f函数时*/例5-7/*a是局部变量,作用域为main函数内*//*a例5-8#include"stdio.h"main(){inta=3;

{inta=2;printf("%2d",a++);}

{inta=0;printf("%2d",a++);}printf("%2d",a++);}例5-8外部型变量extern♥出现范围:可以出现在程序中的任何说明部分。♥判别方法:①在函数外部定义,并且缺省extern的变量②用extern显式说明的变量。♥作用域:从定义该变量的位置起直到本文件结束。♥生存期:整个程序的执行期。♥存贮区域:静态存贮区域注意:①外部型变量长驻数据的静态存贮区。②外部变量在编译时创建,它只能初始化一次,如果在定义时没有初始化,系统默认值为0。③外部变量能被同名的内部变量所屏蔽。外部型变量extern例5-9#include"stdio.h"inta,b;main(){a=1;fun();fun();}intfun(){b=a++;printf("%5d",b);}例5-10#include"stdio.h"inta,b;main(){a=1;fun(a);fun(a);}intfun(inta){b=a++;printf("%5d",b);}例5-9例5-10静态变量static静态变量分成静态局部变量和静态全局变量。静态局部变量出现范围:出现在函数内部。判别方法:用static说明的、定义在函数内部的变量。作用域:定义该变量的函数。生存期:整个程序的执行期。静态全局变量出现范围:可以出现在程序的任何说明部分。判别方法:用static说明的、定义在函数外部的变量。作用域:从定义该变量的位置直至本源文件结束。生存期:整个程序的执行期。在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用,则可以使用静态全局变量。静态变量static静态局部变量静态全局变量注意:①静态局部变量的作用域在定义该变量的函数内,生存期是整个程序的执行期。要改变该变量的值,必须在函数内部完成,相对于外部变量而言,静态变量更安全,起到了信息屏蔽的作用,因此,静态变量的应用比较广泛。②静态变量初始化语句只在第一次调用该函数时才执行,以后每次调用该函数就不再执行初始化语句。③静态变量只能初始化一次,如果没有初始化,则编译自动赋初值0注意:②静态变量初始化语句只在第一次调用该函数时才执行,例5-11#include"stdio.h"intfun(inta){intb=0;staticintc=3;b++;c++;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf("%5d",fun(a));getch();}例5-12#include"stdio.h"intfun(intn){staticintf=1;f=f*n;returnf;}main(){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fun(i));getch();}例5-11例5-12寄存器变量register♥出现范围:出现在函数内部。♥判别方法:用register声明的、在函数内部的变量。♥作用域:在定义该变量的函数内。♥生存期:定义该变量的函数被调用的期间。♥存贮区域:寄存器变量不是存放在内存里,而是存放在CPU的寄存器里,它的特点是存取速度快,如果变量存取很频繁,比如循环变量,则可以定义成寄存器变量以提高程序的执行速度。注意:①只有自动变量和形参可以作为寄存器变量。②静态变量和外部变量不能定义为寄存器变量。寄存器变量register例5-13#include"stdio.h"intsum(intn){registerinti;ints=0;for(i=1;i<=n;i++)s+=i;returns;}main(){intn;scanf("%d",&n);printf("sum=%d\n",sum(n));}例5-13在编写程序时可以利用C语言的预处理功能对程序进行编译处理。C语言提供的预处理功能主要有:宏定义、文件包含、条件编译。一、编译预处理利用预处理命令define来定义符号常量。将一个源文件的内容完全插入到另外一个源文件中去进行编译链接,生成一个新的可执行程序。有条件地选择程序的某部分源代码进行编译,生成相应目标文件。在编写程序时可以利用C语言的预处理功能对程序进行编译处理。一不带参数的宏定义的一般形式为:#define标识符字符串例如:#definePI3.141592671.不带参数的宏定义注意:①宏名可以用大写字母书写,也可以用小写字母书写。②宏定义是用宏名代替一个字符串,这里只是做一个简单的置换,不进行数据检查③宏定义不是语句,后面不能加分号(;)④宏定义通常出现在函数的外部。⑤宏定义与变量定义不同,宏定义只作字符替换,不分配存储空间。不带参数的宏定义的一般形式为:1.不带参数的宏定义注意:例-14#include"stdio.h"#definex5#defineyx+1#definezy*x/2.0main(){inta;a=y;printf("%f,%d",z,--a);}例-14⑴带参数宏定义的一般形式为:#define宏名(形参表列)字符串2.带参数的宏定义⑵带参数宏调用的一般形式为:宏名(实数表列)例如:#defineL(x)x*x+3*x+2Y=L(5)前一个为宏定义,用字符串x*x+3*x+2代替L(x),即L(x)的值为x*x+3*x+2的值。后一个为宏调用,y=L(5)的值为*5+3*5+2。⑴带参数宏定义的一般形式为:2.带参数的宏定义⑵带参数宏调例5-15include"stdio.h"#defineMAX(x,y)x>y?x:ymain(){intx,y,z;scanf("%d,%d",&x,&y);z=MAX(x,y);printf("%d",z);}例5-15注意:①宏名和形参表列之间不能有空格出现。②形参应为变量,实参可以是常量、也可以是具体表达式。为了避免出错,通常用括号将宏定义中形参括起来。例如:①#definefun(x)y*y如果y=fun(x+1);经过宏替换后,y的值为x+1*x+1。②#definefun(x)(y)*(y)如果y=fun(x+1);经过宏替换后,y的值为(x+1)*(x+1)。可以看出:上面两种情况下的y值明显不同。注意:3.文件包含处理文件包含的一般形式如下:#include"文件名"例如:#include"file1.h“就是将源文件file1.h的全部内容包含到当前文件中来,形成一个新的源文件,这样便于编译链接。如果在程序中使用了标准库函数,应在程序的开头用#include将其头文件包含进来,否则,编译链接时将会出现错误。C语言程序允许文件包含嵌套。3.文件包含处理文件包含的一般形式如下:例如:#inclu普通函数设计方法#include"stdio.h"intfmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}main(){inta,b,c,max;printf("输入三个整数:");scanf("%d%d%d",&a,&b,&c);max=fmax(a,fmax(b,c));printf("max=%d\n",max);}h901.c#include"stdio.h"intfmin(intx,inty){intz;if(x>y)z=y;elsez=x;returnz;}main(){inta,b,c,min;printf("输入三个整数:");scanf("%d%d%d",&a,&b,&c);min=fmin(a,fmin(b,c));printf("max=%d\n",min);}h902.c普通函数设计方法#include"stdio.h"h901文件包含处理设计方法intfmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}intfmin(intx,inty){intz;if(x>y)z=y;elsez=x;returnz;}801.h文件包含处理设计方法intfmax(intx,inty801.c#include"stdio.h"#include"801.h“main(){inta,b,c,max,min;printf("输入三个整数:");scanf("%d%d%d",&a,&b,&c);max=fmax(a,fmax(b,c));printf("max=%d\n",max);}#include"stdio.h"#include"801.h"main(){inta,b,c,max,min;printf("输入三个整数:");scanf("%d%d%d",&a,&b,&c);min=fmin(a,fmin(b,c));printf("min=%d\n",min);}802.c801.c#include"stdio.h"#includ返回主目录C语言程序设计(第5章函数)返回主目录C语言程序设计(第5章函数)

本章主要介绍C语言程序函数的基本知识和基本应用。

1.函数与模块化程序设计

2.函数的概述

3.函数的嵌套调用和递归调用

4.变量的作用域和生存期

5.编译预处理本章主要介绍C语言程序函数的基本知识和基本应用一、函数与模块化程序设计1模块化程序设计方法:程序员在设计一个比较复杂的应用程序时,一般采用的方法是将整个程序分解成若干个功能较为单一的、相对独立的程序模块分别实现,然后再将所有的程序模块象搭积木一样装配起来,形成一个完整的程序,这种在程序设计中分而治之的策略称为模块化程序设计方法。优点:主要体现在程序编制方便,易于修改和调试,可由多人共同参与完成,缩短程序的设计时间,并能实现程序模块的标准化、规范化。一、函数与模块化程序设计1模块化程序设计方法:在C语言中,函数是程序的基本组成单位,程序设计人员可以很方便地用函数作为程序模块来实现程序的模块化,一个函数就是一个模块,独立完成一项功能。在C语言中,函数是程序的基本组成单位,程序设采用普通的程序设计方法#include"stdio.h"main(){inta,b,max;printf("输入两个整数:");scanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;printf("max=%d\n",max);}例5-1求两个整数的最大值。采用结构化程序设计方法#include"stdio.h"intfmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}main(){inta,b,max;printf("输入两个整数:");scanf("%d%d",&a,&b);max=fmax(a,b);printf("max=%d\n",max);}采用普通的程序设计方法例5-1求两个整数的最大值。采用结2程序模块设计一般原则①模块相对独立一个模块往往要求完成一个单独的功能,并与其他模块尽量保持一定的独立性,当修改这个模块时,不会引起整个程序的混乱。同时,在模块内部,尽量将数据局部化,便于保证数据在不同模块之间的正常传递。②模块之间关系尽量简单模块之间关系要尽量简单,且不互相干扰,做到模块之间只有在相互调用时才发生数据传递。除此之外,相互之间不直接发生联系。2程序模块设计一般原则①模块相对独立②模块之间关系尽量③模块规模大小要适中程序模块不宜过大,也不要过于复杂,大小要适中。模块过大,容易造成程序功能紊乱,可读性差,不好理解。模块过小,容易造成程序结构复杂,数据传递容易出错。④模块尽量保持通用性模块应尽量规范,保持一定的通用性,这样便于对模块进行修改和维护,快速实现对程序的扩充。③模块规模大小要适中④模块尽量保持通用性一、函数的分类与定义函数可以分为无参函数和有参函数。函数可以分为标准函数和自定义函数。有一个或多个形参无形参由系统提供,可直接使用由用户自己定义使用一、函数的分类与定义函数可以分为无参函数和有参函数。函数二、函数的定义1.无参函数定义的一般形式:函数类型说明符函数名(){函数体}例如:printstar(){printf("**********\n");}二、函数的定义1.无参函数定义的一般形式:例如:2.有参函数定义的一般形式:函数类型说明符函数名(形参表列){函数体}例如:intfmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}2.有参函数定义的一般形式:例如:说明:①C语言规定:函数不允许嵌套定义。函数之间是平行的、相对独立的。一个函数的定义可以放在程序中的任何一个位置,但在一个函数的函数体内,不能再定义另外一个函数。②函数的类型是指函数返回值的类型,可以是整型、实型、字符型、指针类型等等数据类型,如果函数没有返回值,则函数类型为void。③函数名必须符合标识符的命名规则,函数名不能与变量名重名,也不能与关键字同名。④函数体包含两部分:语句声明部分和执行语句部分。⑤空函数——既无参数,又无函数体,其一般形式为:函数类型说明符函数名(){}说明:函数的调用在定义一个函数后,要调用该函数才能执行该函数的功能,否则,该函数在程序中只是一段静态的代码,不起任何作用。1.函数调用的一般形式函数名(实参表列)注意:①实参表列的形式为:实际参数1,[实际参数2,…],实参可以是常量或变量,也可以是各种表达式。②实际参数的个数和类型应该与函数定义时的形式参数的个数和类型一致,并一一对应。例如:c=max(a,b);③调用无参函数时,不能有实参表列。三、函数的调用函数的调用在定义一个函数后,要调用该函数才能2.函数调用的具体方式⑴函数语句把函数调用作为一个语句。其一般形式为:

函数名(实际参数表);该方式常用于调用一个可以忽略返回值或没有返回值的函数。例如程序中的scanf()函数和printf()函数的调用。2.函数调用的具体方式⑵函数表达式函数调用出现在表达式中,这种表达式称为函数表达式。其一般形式为:

变量名=函数表达式;这种方式用于调用带返回值的函数,函数的返回值将参加表达式的运算。例如程序中的max=maxnum(i,j,k);⑵函数表达式⑶函数实参函数作为另一个函数调用的实参出现,这种方式是把该函数的返回值作为实参进行传送,因此,要求该函数必须有返回值。例如:max=fmax(a,fmax(b,c));⑶函数实参四、函数的说明C语言规定:函数调用之前必须对该函数进行定义或说明。函数的定义可以写在程序中的任何位置,但如果被调函数定义在主调函数之后,则在主调函数中必须要对被调函数进行说明,这样在函数调用的时候才能够找到函数原型。函数原型的一般形式是:⑴函数类型说明符函数名(参数类型1,参数类型2,…)例如:intmaxnum(int,int,int);⑵函数类型说明符函数名(参数类型1参数名1,参数类型2参数名2,…)例如:intmaxnum(intx,inty,intz);四、函数的说明C语言规定:函数调用之前必须对该函数进行定义或五、函数的参数在函数调用的过程中,两个函数之间的数据传递是靠参数和返回值来传递的,主调函数利用参数将数据传给被调函数,被调函数的运行结果通过返回值传回给主调函数。#include"stdio.h"main(){intx,y,z;scanf("%d,%d",&x,&y);z=max(x,y);printf("%d",z);}intmax(inta,intb){intc;if(a>b)c=a;elsec=b;returnc;}五、函数的参数在函数调用的过程中,两个函数之间的数据在调用函数时,函数名后面括号中的数据称为实际参数(简称实参)实参与形参的区别在定义函数时函数名后面的括号中的变量称为形式参数(简称形参)。在被调函数中出现在主调函数中出现。变量变量、常量、表达式具体的数值存储数值的空间单向值传递在调用函数时,函数名后面括号中的数据称为实际参数(简称实参)说明:①形参在被调函数中出现,实参在主调函数中出现。②形参是在函数被调用时临时分配存储单元的,一旦调用结束,形参所占的存储单元立即被释放。③实参可以是常量、变量或表达式,但必须是确定的值;形参必须是变量。因为实参是函数在调用刚开始时传递的具体数据,所以必须是确定的值;形参是用来接受数据的,只有在内存中占有存储空间才能存放数据,因此,形参必须是变量。④在定义函数时,必须指定形参类型。形参实际上就是定义的变量,如果不指定变量的类型,将无法分配内存单元。说明:⑤实参传递给形参的实际值必须与函数定义中的形参类型一致。不一致时要在主调函数中对被调函数作说明。⑥调用语句中的实参个数应与被调用函数的形参个数相等,其类型、顺序必须一一对应。⑦实参和形参在内存里占用不同的存储空间,即使同名也不会相互影响。⑧C语言规定:实参对形参的传递是值传递,即单向传递,只能由实参传给形参,而不能由形参传给实参。⑤实参传递给形参的实际值必须与函数定义中的形参类型一致。不六、函数的返回值任何函数都是有值的,如果值是恒定的,可以返回,则有返回值;如果值不恒定,无法返回,则没有返回值。函数的返回值是用return语句来实现的。return语句的格式有两种:

returnr;或return(r);其中r为返回值,且从该函数返回。r可以是常量、变量、表达式,也可以是函数调用。注意:如果函数没有返回值,可以事先说明该函数的类型是void型(即空类型)六、函数的返回值任何函数都是有值的,如果值是恒定的,可以返说明:①函数类型应与返回值的类型保持一致,如果类型不一致,则以函数类型为准。②若函数中无return语句,并不是不带回返回值,只是不带回有用的值,所以若不需要有返回值,则函数类型说明符为void,以明确表示不带回值。③一个函数一次只能返回一个返回值。#include"stdio.h"main(){inta=2,b=3,c;intf(intx,inty);c=f(a,b);printf("f(%d,%d)=%d\n",a,b,c),}intf(intx,inty){intz;z=x>y?x++:y++;returnz;}例5-2说明:#include"stdio.h"intf(int一、函数的嵌套调用

C语言中,函数的定义是相对独立的、平行的,没有隶属关系,函数不能嵌套定义,但可以嵌套调用。即在调用一个函数的过程中,又可以调用另外的函数。一、函数的嵌套调用C语言中,函数的定义是相对main()函数f1()函数f2()函数

①②③④

调用f1()函数调用f2()函数⑤⑨⑧⑦⑥结束返回返回main()intf1(intx,inty)intf2(intm,intn){{{...........................c=f1(a,b);z=f2(m,n);}..................}}main()函数f1()函数例5-3求S=1K+2K+3K+……+nk的值分析:本题可以用三个不同的函数来分别描述。①f1函数计算nk②f2函数求S=1K+2K+3K+……+nk

③main()函数输入、输出初始条件和最后结果。#include"stdio.h"longf1(intn,intk){longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk){longsum=0;inti;for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){intn,k;printf(“inputn,k:");scanf(“%d,%d",&n,&k);printf("%d\n",f2(n,k));}例5-3求S=1K+2K+3K+……+nk的值分析:本二、函数的递归调用

在函数的调用过程中,允许直接或间接地调用函数自身,这种调用称为递归调用。函数直接自己调用自己,为直接递归。函数间接自己调用自己,为间接递归。二、函数的递归调用在函数的调用过程中,允许直接或间接地调用例5-3求整数n!#include"stdio.h"longfact(intn);main(){inti;longfac;printf("i=");scanf("%d",&i);fac=fact(i);printf("%d的阶乘等于%ld\n",i,fac);}longfact(intn){longf;if(n<=0)f=1;elsef=n*fact(n-1);returnf;}例5-3求整数n!#include"stdio.h"例5-4已知某数列为K(n)的定义如下,求该数列的第六项K(6)。1n=1K(n)=K(n-1)*2n为偶数K(n-1)*3n为奇数main(){inti;floatj;printf("inputthenumber:");scanf("%d",&i);if(i<=0)printf("n<=0,dataerror!\n");else{j=k(i);printf("K(%d)=%1.0f\n",i,j);}}#include"stdio.h"floatk(intn){floatm;if(n==1)m=1.0;elseif(n%2==0)m=k(n-1)*2;elsem=k(n-1)*3;returnm;}例5-4已知某数列为K(n)的定义如下,求该数列的第六项例5-5有5个人坐在一起,问第5个人几岁,他说比第4个人大3岁,第4个人说比第3个人大3岁,第3个人说比第2个人大3岁,第2个人说比第1个人大3岁,第1个人说自己18岁。编程求第5个人几岁?#include"Stdio.h"intage(intx){inty;if(x==1)y=18;elsey=age(x-1)+3;returny;}main(){printf("%d",age(5));getch();}例5-5有5个人坐在一起,问第5个人几岁,他说比第4个例5-6求下面函数的值。1(n=0)p(n,x)=x(n=1)((2*x-1)*p(n-1,x)*x-(n-1)*p(n-2,x))/n(n>1)例5-6求下面函数的值。#include"Stdio.h"floatp(intn,intx){floatpp;if(n==0)pp=1;elseif(n==1)pp=x;elsepp=((2*x-1)*p(n-1,x)*x-(n-1)*p(n-1,x))/n;returnpp;}main(){floatf;intn,x;printf("inputthen,x:");scanf("%d,%d",&n,&x);f=p(n,x);printf("%f",f);}#include"Stdio.h"一、变量的作用域和生存期

变量的作用域变量的生存期变量在程序中影响范围变量在程序中起作用的时间长期性暂时性全局变量局部变量一、变量的作用域和生存期变量的作用域变量的生存期变量在程序局部变量①变量只能在当前函数或当前复合语句中有效。②形式参数是局部变量。③可以在复合语句中定义局部变量。④局部变量可以同名,互不干扰。全局变量①在整个程序中有效有效。②全局变量可以和局部变量同名,互不干扰,全局变量之间不能同名。③在同一个程序中,如果全局变量与局部变量同名,在局部变量的作用范围内,全局变量暂时不起作用,被屏蔽。④通常情况,建议尽量少使用全局变量局部变量①变量只能在当前函数或全局变量①在整个程序中有效#include"stdio.h"inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;returnc;}main(){inta=8;printf("%d",max(a,b));}#include"stdio.h"二、变量的存贮类别数据的动态存贮方式和静态存贮方式程序区动态存贮区静态存贮区存放程序指令存放暂时性数据(局部变量)存放数据长期性(全局变量)二、变量的存贮类别数据的动态存贮方式和静态存贮方式程序区动态在C语言中变量的存贮类别有四种自动型变量外部型变量静态型变量寄存器型变量说明:auto作用域:局部生存期:暂时存贮区:动态区说明:extern作用域:全局生存期:长期存贮区:静态区说明:static作用域:局部或全局生存期:长期存贮区:静态区说明:register作用域:局部生存期:暂时存贮区:寄存器在C语言中变量的存贮类别有四种自动型变量外部型变量静态型变量自动型变量auto♥出现范围:出现在函数内部。♥判别方法:①定义在函数内部并且缺省存储类别说明②直接auto显式说明♥作用域:定义该变量的函数或复合语句。♥生存期:定义该变量的函数或复合语句被执行期间,是局部。

♥存贮区域:动态存贮区注意:①自动变量一般省略auto,函数中的大多数变量都是自动变量。②形参和复合语句里定义的变量也是自动变量。③自动变量一旦被说明,则只能在说明该变量的函数或复合语句中出现才有效,离开了上述区域则无效。④生存期只限于相应函数被调用时,若变量是定义在复合语句内,则其生存期为该复合语句被执行的期间。自动型变量auto例5-7#include"stdio.h"main(){inta=1;f(a);f(a);}intf(inta)

{intb;

b=a++;printf("%2d",b);}/*a是局部变量,作用域为main函数内*//*a、b都是局部变量,作用域为f函数内,生存期在调用f函数时*/例5-7/*a是局部变量,作用域为main函数内*//*a例5-8#include"stdio.h"main(){inta=3;

{inta=2;printf("%2d",a++);}

{inta=0;printf("%2d",a++);}printf("%2d",a++);}例5-8外部型变量extern♥出现范围:可以出现在程序中的任何说明部分。♥判别方法:①在函数外部定义,并且缺省extern的变量②用extern显式说明的变量。♥作用域:从定义该变量的位置起直到本文件结束。♥生存期:整个程序的执行期。♥存贮区域:静态存贮区域注意:①外部型变量长驻数据的静态存贮区。②外部变量在编译时创建,它只能初始化一次,如果在定义时没有初始化,系统默认值为0。③外部变量能被同名的内部变量所屏蔽。外部型变量extern例5-9#include"stdio.h"inta,b;main(){a=1;fun();fun();}intfun(){b=a++;printf("%5d",b);}例5-10#include"stdio.h"inta,b;main(){a=1;fun(a);fun(a);}intfun(inta){b=a++;printf("%5d",b);}例5-9例5-10静态变量static静态变量分成静态局部变量和静态全局变量。静态局部变量出现范围:出现在函数内部。判别方法:用static说明的、定义在函数内部的变量。作用域:定义该变量的函数。生存期:整个程序的执行期。静态全局变量出现范围:可以出现在程序的任何说明部分。判别方法:用static说明的、定义在函数外部的变量。作用域:从定义该变量的位置直至本源文件结束。生存期:整个程序的执行期。在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用,则可以使用静态全局变量。静态变量static静态局部变量静态全局变量注意:①静态局部变量的作用域在定义该变量的函数内,生存期是整个程序的执行期。要改变该变量的值,必须在函数内部完成,相对于外部变量而言,静态变量更安全,起到了信息屏蔽的作用,因此,静态变量的应用比较广泛。②静态变量初始化语句只在第一次调用该函数时才执行,以后每次调用该函数就不再执行初始化语句。③静态变量只能初始化一次,如果没有初始化,则编译自动赋初值0注意:②静态变量初始化语句只在第一次调用该函数时才执行,例5-11#include"stdio.h"intfun(inta){intb=0;staticintc=3;b++;c++;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf("%5d",fun(a));getch();}例5-12#include"stdio.h"intfun(intn){staticintf=1;f=f*n;returnf;}main(){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fun(i));getch();}例5-11例5-12寄存器变量register♥出现范围:出现在函数内部。♥判别方法:用register声明的、在函数内部的变量。♥作用域:在定义该变量的函数内。♥生存期:定义该变量的函数被调用的期间。♥存贮区域:寄存器变量不是存放在内存里,而是存放在CPU的寄存器里,它的特点是存取速度快,如果变量存取很频繁,比如循环变量,则可以定

温馨提示

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

评论

0/150

提交评论