




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计基础主讲教师:代祖华C语言程序设计基础主讲教师:代祖华1主要参考书目《C程序设计》(第二版)及配套的程序设计题解与设计指导,谭浩强著,清华大学出版社。《从问题到程序—程序设计与C语言引论》裘宗燕著,机械工业出版社。《程序设计基础》及配套的程序设计题解与设计指导(第二版),吴文虎编著,清华大学出版社。主要参考书目《C程序设计》(第二版)及配套的程序设计题解2第4章函数4.1函数的定义4.2函数的调用4.3变量的作用域与存储特性4.4函数间数据的传递4.5递归函数4.6综合编程举例第4章函数4.1函数的定义4.2函数的调用4.33/*简单函数示例,案例4_1*//*功能:定义一个求较大数的函数并在主函数中调用*/intmax(intn1,intn2) /*定义函数max()*/{return(n1>n2?n1:n2);}main(){intmax(intn1,intn2); /*函数说明*/intnum1,num2,maxnum;printf("inputtwonumbers:\n");scanf(“%d%d”,&num1,&num2);maxnum=max(num1,num2);printf("max=%d\n",maxnum);getch(); /*使程序暂停,按任一键继续*/}
/*简单函数示例,案例4_1*/44.1函数的定义从函数使用的角度来看,C语言的函数可以分为两类:标准库函数和用户自定义函数。本章介绍后者。一.标准库函数与头文件1.TurboC系统提供了400多个标准库函数(参见附录五),按功能可以分为:(1)类型转换函数,(2)字符判别与转换函数,(3)字符串处理函数,(4)标准I/O函数,(5)文件管理函数,(6)数学运算函数等。
它们的执行效率高,用户需要时,可在程序中直接进行调用。4.1函数的定义从函数使用的角度来看,C语言的函数可以分5
C语言库函数所用到的常量、外部变量、函数类型和参数说明,都在相应的头文件(扩展名为.h)中声明,这些文件通常存放在系统目录tc\include。如:2.头文件stdio.h文件:标准输入输出函数所用的常量、结构、宏定义、函数的类型、参数的个数与类型的描述。
(2)math.h文件:与数学函数有关的常量、结构及相应的函数类型和参数描述。
(3)string.h文件:与字符串操作函数有关的常量、结构以及相应的函数类型和参数描述。
C语言库函数所用到的常量、外部变量、函数类型6二.用户自定义函数1.函数分类(从函数的形式看)无参函数有参函数◆函数定义时无参数说明◆调用无参函数一般用来执行指定的一组操作◆主调函数不传送数据给被调函数●函数定义时定义了一个或一个以上的参数●调用时将要处理的数据传送给被调函数二.用户自定义函数1.函数分类(从函数的形式看)无参函数7定义形式二:函数值类型名函数名(形式参数类型及参数说明){数据说明部分语句}定义形式一:函数值类型名函数名(形式参数列表)形式参数说明{数据说明部分语句}2.函数定义形式ANSI风格如:intmax(n1,n2)intn1,n2;如:intmax(intn1,intn2)定义形式二:定义形式一:2.函数定义形式ANSI风格如:83.函数由函数首部与函数体两部分构成。(1)函数首部◆函数首部包括函数值类型、函数名、参数类型及参数说明.
◆函数值类型指定所定义函数返回值的类型,可以是简单数据类型、void类型或构造类型等。■当函数值类型为void时,表示函数无返回值,相当于其它语言的过程。当函数值类型为int时,可省略其类型的说明,建议不使用缺省形式类型说明.◆函数名是函数的标识符,遵循C语言标识符的命名规则,区分大小写。■为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参,处在函数名后的一对圆括号中。要特别注意的是,无论函数是否有形式参数,函数名后的圆括号不可省,并且圆括号之后不能接“;”。3.函数由函数首部与函数体两部分构成。(1)函数首部◆函9◆函数体结束在“}”括号处。(2)函数体◆函数首部之后的花括号“{}”部分为函数体。■函数体内数据说明部分在前,执行语句部分在后。◆函数体中说明的变量是该函数调用时有效的局部变量,执行语句是实际生成命令代码的部分。■函数的功能由函数体内的各个语句的执行来实现。◆空函数定义时无参数,{}内为空被调用时,不执行任何操作就立即返回。例如:voidprint_report(void){}◆函数体结束在“}”括号处。(2)函数体◆函数首部之后的花括104.2函数的调用★在C语言的一般函数体中,可以包含对其它函数的调用,称为函数的嵌套调用,甚至包含对自身的调用,称为函数的递归调用。☆一个函数一旦被定义,就可在程序的其它函数中使用它,这个过程称为函数调用。一.函数的一般调用与声明函数名(实际参数列表)1.函数调用形式函数调用的一般形式:4.2函数的调用★在C语言的一般函数体中,可以包含对其它11◆实际参数简称为实参,参数之间以逗号分隔。■函数调用时,实参与形参应保持个数、次序及类型的一致性,以确保实参与形参之间数据的正确传递。◆实际参数可以是表达式、常量、变量(调用时必须有确定的值或确定的地址)。■形式参数必须为变量。■当实际参数的个数、次序、类型与对应形式参数的个数、次序、类型不一致时,系统并不提示错误,后果却难以预测。2.格式说明◆实际参数简称为实参,参数之间以逗号分隔。■函数调用时,实123.C语言中函数调用的三种形式:语句调用表达式调用函数参数调用在函数调用后加“;”,构成一个语句。调用函数的目的可能是执行一个动作或完成特定的功能。大多数函数的调用形式。被调用函数执行的结果为调用函数提供一个值。调用函数通过表达式接收值。被调函数作为某个函数的一个参数。3.C语言中函数调用的三种形式:语句调用表达式调用函数参数13main()/*主函数中采用函数参数调用形式调用函数max*/{intx,y,z,m;scanf("%d,%d,%d",&x,&y,&z);printf("max=%d\n",max(max(x,y),z));/*内层函数max2的值作为外层函数max2的实参,整个函数max2的值又作函数printf的的实参*/}例函数参数调用形式调用函数max:intmax(intn1,intn2)/*求两个数中较大者*/{inty;y=(n1>n2)?n1:n2;return(y);}main()/*主函数中采用函数参数调用形式调用函数ma144.函数声明(函数说明)◆调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。■函数声明的一般形式如下:类型名函数名(类型1形参1,…,类型n形参n);或类型名函数名(类型1,类型2,…,类型n);或类型名函数名();◆函数声明是以语句形式出现的,因此其后有语句结束标记“;”。■若函数定义放在主调函数之前,遵循先定义后调用原则,函数声明可以省略;若函数值的类型为整型或字符型,函数声明可以省略;若在所有函数定义之前,已说明函数类型,函数声明也可省略。4.函数声明(函数说明)◆调用用户自定义函数时,一般调用函15二.形参、实参与函数调用过程形式参数(简称形参)定义函数使用的参数实际参数(简称实参)调用函数使用的参数◆C语言中,采用函数之间的参数传递方式从实参向形参传递。■C语言函数的参数传递均采用单向值传递方式(或称复制方式)。◆单向值传递方式是指在函数调用时,将实参之值传递给对应的形式参数,使形参具有与实参相同的值。■当实参是变量的地址值、指针常量或指针变量时,实参传递给形参的是地址值,同样是单向值传递方式。二.形参、实参与函数调用过程形式参数定义函数使用的参数实16案例4_2见教材145页例4.2作业:教材173页4.1题1——5。三、函数的嵌套调用C语言允许在调用一个函数过程中又调用另外一个函数。这种调用方式称为嵌套调用。案例4_3见教材147页4.4案例4_2见教材145页例4.2174.3内部变量与外部变量
一、变量的作用域C语言中所有的变量都有自己的作用域。变量说明的位置不同,其作用域也不同,据此将C语言中的变量分为内部变量和外部变量。1、内部变量在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外不能使用这些变量。所以内部变量也称“局部变量”。例如:4.3变量的作用域及存储特性4.3内部变量与外部变量一、变量的作用域4.3变18intf1(inta)/*函数f1*/{intb,c;……} /*a,b,c作用域:仅限于函数f1()中*/intf2(intx)/*函数f2*/{inty,z;……} /*x,y,z作用域:仅限于函数f2()中*/
main(){intm,n;……}/*m,n作用域:仅限于函数main()中*/intf1(inta)/*函数f1*/19关于局部变量的作用域还要说明以下几点:主函数main()中定义的内部变量,只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是并列关系。这一点是与其它语言不同的,应予以注意。形参变量也是内部变量,属于被调函数;实参变量,则是调用函数的内部变量。允许在不同的函数中定义同名变量,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。在复合语句中也可定义变量,其作用域只在复合语句范围内。关于局部变量的作用域还要说明以下几点:20例4-4:voidf1(){intt=2;a*=t;b/=t;}voidmain(){inta,b;printf(”Entera,b:”);scanf(”%d,%d”,&a,&b);f1();/*调用函数f1()*/
printf(”a=%d,b=%d”,a,b);}
编译程序会提示出错:Undefinedsymbol‘a’和Undefinedsymbol‘b’。为什么?例4-4:编译程序会提示出错:212、外部变量在函数外部定义的变量称为外部变量。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本文件结束为止。外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量。例4_5:输入长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积。2、外部变量22
/*功能:利用全局变量计算长方体的体积及三个面的面积*/ints1,s2,s3;intvs(inta,int,b,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);getch();} /*功能:利用全局变量计算长方体的体积及三个面的面积23对于全局变量还有以下几点说明:外部变量可加强函数模块之间的数据联系,但又使这些函数依赖外部变量,因而使得函数的独立性降低。在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。外部变量的作用域是从定义点到本文件结束。如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变量进行说明。外部变量说明的一般形式为:extern数据类型外部变量[,外部变量2……];外部变量的定义和外部变量的说明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的说明,出现在要使用该外部变量的函数内,而且可以出现多次。对于全局变量还有以下几点说明:24作业1、教材176页1、3、42、实验名称:函数实验内容:上机调试和运行习题4中的布置作业、本章例4.43、完成第三章的两份实验报告,并于本周实验课期间上交。(请转告其他同学)作业1、教材176页1、3、425二、变量的存储特性(反映变量的生存期)在C语言中,对变量的存储类型说明有以下四种:自动变量(auto)、寄存器变量(register)、外部变量(extern)、静态变量(static)。自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。存储方式是指变量的存储空间的分配方式,不同存储方式的变量对不同的生命周期。静态存储变量生存期为程序执行的整个过程,在该过程中占有固定的存储空间,也称永久存储。动态存储变量只生存在程序运行的某一段时间内,如函数的形参、函数中定义的自动局部变量,只有当程序进入该函数时才分配存储空间,函数执行完后,变量的存储空间又被释放。二、变量的存储特性(反映变量的生存期)26(一)局部变量的存储方式1.静态存储──静态局部变量(1)定义格式:static数据类型局部变量表;(2)存储特点静态局部变量属于静态存储。在程序执行过程中,即使所在函数调用结束也不释放。换句话说,在程序执行期间,静态局部变量始终存在,但其它函数不能引用它们。定义但不初始化,则自动赋以0(整型和实型)或'\0'(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值!(3)何时使用静态局部变量需要保留函数上一次调用结束时的值。变量只被引用而不改变其值。(一)局部变量的存储方式272.动态存储──自动局部变量(又称自动变量)(1)定义格式:[auto]数据类型变量表; (2)存储特点自动变量属于动态存储方式。在函数中定义的自动变量,只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。在复合语句中定义的自动变量,只在该复合语句中有效;退出复合语句后,也不能再使用,否则将引起错误。定义而不初始化,则其值是不确定的。如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。变量定义缺省存储类型说明,系统自动将其定义为自动存储类型。2.动态存储──自动局部变量(又称自动变量)28自动变量与静态局部变量的存储特性。voidauto_static(void){intvar_auto=0; /*自动变量,每次调用都重新初始化*/staticintvar_static=0;/*静态局部变量,只初始化1次*/printf(“var_auto=%d,var_static=%d\n”,var_auto,var_static);++var_auto;++var_static;}main(){inti;for(i=0;i<5;i++)auto_static();} 自动变量与静态局部变量的存储特性。29程序运行结果:var_auto=0,var_static=0var_auto=0,var_static=1var_auto=0,var_static=2var_auto=0,var_static=3var_auto=0,var_static=4程序运行结果:303.寄存器存储──寄存器变量一般情况下,变量的值都是存储在内存中的。为提高执行效率,C语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器变量。定义格式如下:
register数据类型变量表;(1)只有局部变量才能定义成寄存器变量,即全局变量不行。(2)对寄存器变量的实际处理,随系统而异。例如,微机上TC将寄存器变量实际当作自动变量处理。(3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。3.寄存器存储──寄存器变量31(二)外部变量的存储方式外部变量属于静态存储方式:(1)静态外部变量──只允许被本源文件中的函数引用其定义格式为:static数据类型外部变量表;*(2)非静态外部变量──允许被其它源文件中的函数引用定义时缺省static关键字的外部变量,即为非静态外部变量。其它源文件中的函数,引用非静态外部变量时,需要在引用函数所在的源文件中进行说明:extern数据类型外部变量表;注意:在函数内的extern变量说明,表示引用本源文件中的外部变量!而函数外(通常在文件开头)的extern变量说明,表示引用其它文件中的外部变量。(二)外部变量的存储方式32静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:(1)定义的位置不同。静态局部变量在函数内定义,静态外部变量在函数外定义。(2)作用域不同。静态局部变量作用域仅限于定义它的函数内;虽然生存期为整个源程序,但其它函数是不能使用它的。静态外部变量作用域为定义它的源文件内;生存期为整个源程序,但其它源文件中的函数也是不能使用它的。(3)初始化处理不同。静态局部变量,仅在第1次调用它所在的函数时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上1次调用结束时的值。而静态外部变量是在函数外定义的,其当前值由最近1次给它赋值的操作决定。静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:334.4函数间的数据传递
所谓函数间的数据传递的是指主调函数向被调函数传送数据及被调函数向主调函数返回数据的过程。4.4函数间的数据传递所谓函数间的数据传34函数间数据传递的的三种形式:参数传递return语句全局变量传值方式:传址方式:将被调用函数执行的结果作为函数返回值提供给调用函数。调用函数通过表达式接收值。利用全局变量的全局作用域特性实现数据在函数间的传递实参的值传递给形参变量(单向传递)实参的地址传递给形参变量函数间数据传递的的三种形式:参数传递return语句全局变量35一、传值方式1.特点在函数调用过程中,形参的值如果发生变化,不会改变实参的值。2.例程4_6见教材151例4.5二、传址方式1.特点函数调用过程中,实参与形参对应同一个内存单元,故形参的值如果发生变化,会改变实参的值。2.例程4_7见教材151例4.63.传址方式下定义函数形参时,形参变量须为能接收地址的指针变量或数组。一、传值方式36三、利用全局变量的函数间数据传递1.特点函数欲处理的数据可由全局变量带入函数体内,函数执行的结果也可由全局变量带出函数。2.例程4.8见教材153页例4.73.为提高函数的独立性,程序设计时应避免使用全局变量在函数间传递数据。四、思考1.可用于主调函数向被调函数传递数据的方式有哪些?2.可用于被调函数向主调函数传递数据的方式有哪些?三、利用全局变量的函数间数据传递37五、编程举例例程4.9:有一个一维数组,用于保存10个学生的成绩,请编程计算平均成绩并排序。编程要求:请设计四个函数,分别用于完成数组元素数据的输入(函数名input)、平均成绩的计算(函数名average)、成绩排序(升序,函数名sort)、数组元素的输出(函数名output);main()函数调用以上函数完成题意要求。五、编程举例38floatinput(floatarray[],intn);floataverage(floatarray[],intn);floatsort(floatarray[],intn);floatoutput(floatarray[],intn);main(){floatscore[10],aver;inti;input(score,10);aver=average(score,10);output(score,10);printf("averagescoreis%5.2f\n",aver);sort(score,10);output(score,10);}floatinput(floatarray[],int39作业1.教材174页开始6—10题;2.教材176页编程题8、19作业1.教材174页开始6—10题;40函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。C语言允许函数的递归调用。在递归调用中,调用函数又是被调用函数,执行递归函数将反复调用其自身。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。4.5函数的递归调用函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用41
直接在函数内调用自己为直接递归,通过别的函数调用自己为间接递归。voida()
{......
a();
......
}voida()
{......
b();......
}
voidb()
{......
a();
......
}
递归在解决某些问题中,是一个十分有用的方法。因为有的问题它本身就是递归定义的;此外,它可以使某些看起来不易解决的问题变得容易解决,写出的程序较简短。直接在函数内调用自己为直接递归,通过别的函数42例程4.10:用递归方法求n!
由于n!=n*(n-1)!是递归定义所以求n!(n-1)!
(n-1)!(n-2)!
(n–2)!(n-3)!
……
1!的问题,
根据公式有1!=1。
再反过来依次求出2!,3!……直到最后求出n!。例程4.10:用递归方法求n!由于n!=43/*功能:通过函数的递归调用计算阶乘*/longpower(intn){longf;if(n>1)f=power(n-1)*n;elsef=1;return(f);}/*功能:通过函数的递归调用计算阶乘*/44main(){intn;longy;printf("inputainteagernumber:");scanf("%d",&n);y=power(n);printf("\n%d!=%ld\n",n,y);getch();} 运行结果举例:inputainteagernumber:33!=6运行过程分析main()45例程4.11见158页使用递归解决的问题应满足两个基本条件:(1)递归问题的转化。有些问题不能直接求解或难以求解,但它可以转化为一个递归问题,这个递归问题相对于原问题简单或更接近解决方法。(2)转化的终止条件。原问题到递归问题的转化是有条件的、次数是有限的,不能无限次数地转化下去。这个终止条件也称为边界条件,相当于递推关系中的初始条件。例程4.11见158页46例1见教材165页例4.17例2见教材171页例4.184.6综合编程举例例1见教材165页例4.174.6综合编程举例471.1原始问题来源于印度与世界末日有关的民间传说,大意是:在印度北部佛教圣地的圣庙里,安放着一块黄铜板,板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中的一根针上从下到上放置了64片金片,这就是所谓的汉诺塔(又称梵塔).不论白天和黑夜,都有一个值班的僧侣按照梵天规定的法则,把这些金片在三根针上移来移去.1.1原始问题48梵天的法则是:一次只能移一片,并且要求不管是在哪根针上,小片必须总是在大片的上面.当所有64片金片都从梵天创造世界时所放置的那根针移到另外一根针上时,世界就将在一阵霹雳声中毁灭,梵塔、庙宇和众生都将同归于尽.梵天的法则是:一次只能移一片,并且要求不管是在哪491.2抽象的数学问题将这个传说抽象为数学问题是:有3根针A、B、C.起初A针上有64个盘子,盘子的大小不等,大的在下,小的在上;B、C针上无盘子。要求把这64个盘子从A针移到C针,在移动的过程中可以借助于B针,但有两个限制:(1)每次只允许移动一个盘子;(2)任何时候3根针上都必须保持大盘在下,小盘在上.请编程序显示出移动的步骤.汉诺塔问题已成为组合数学、人工智能、计算机科学以及规划中递归问题的典型例子,并由此产生了各种各样成熟的算法.汉诺塔问题还有图论、二叉树等多种解法。1.2抽象的数学问题50教材176页编程题9、13、17作业教材176页编程题9、13、17作业51C语言程序设计基础主讲教师:代祖华C语言程序设计基础主讲教师:代祖华52主要参考书目《C程序设计》(第二版)及配套的程序设计题解与设计指导,谭浩强著,清华大学出版社。《从问题到程序—程序设计与C语言引论》裘宗燕著,机械工业出版社。《程序设计基础》及配套的程序设计题解与设计指导(第二版),吴文虎编著,清华大学出版社。主要参考书目《C程序设计》(第二版)及配套的程序设计题解53第4章函数4.1函数的定义4.2函数的调用4.3变量的作用域与存储特性4.4函数间数据的传递4.5递归函数4.6综合编程举例第4章函数4.1函数的定义4.2函数的调用4.354/*简单函数示例,案例4_1*//*功能:定义一个求较大数的函数并在主函数中调用*/intmax(intn1,intn2) /*定义函数max()*/{return(n1>n2?n1:n2);}main(){intmax(intn1,intn2); /*函数说明*/intnum1,num2,maxnum;printf("inputtwonumbers:\n");scanf(“%d%d”,&num1,&num2);maxnum=max(num1,num2);printf("max=%d\n",maxnum);getch(); /*使程序暂停,按任一键继续*/}
/*简单函数示例,案例4_1*/554.1函数的定义从函数使用的角度来看,C语言的函数可以分为两类:标准库函数和用户自定义函数。本章介绍后者。一.标准库函数与头文件1.TurboC系统提供了400多个标准库函数(参见附录五),按功能可以分为:(1)类型转换函数,(2)字符判别与转换函数,(3)字符串处理函数,(4)标准I/O函数,(5)文件管理函数,(6)数学运算函数等。
它们的执行效率高,用户需要时,可在程序中直接进行调用。4.1函数的定义从函数使用的角度来看,C语言的函数可以分56
C语言库函数所用到的常量、外部变量、函数类型和参数说明,都在相应的头文件(扩展名为.h)中声明,这些文件通常存放在系统目录tc\include。如:2.头文件stdio.h文件:标准输入输出函数所用的常量、结构、宏定义、函数的类型、参数的个数与类型的描述。
(2)math.h文件:与数学函数有关的常量、结构及相应的函数类型和参数描述。
(3)string.h文件:与字符串操作函数有关的常量、结构以及相应的函数类型和参数描述。
C语言库函数所用到的常量、外部变量、函数类型57二.用户自定义函数1.函数分类(从函数的形式看)无参函数有参函数◆函数定义时无参数说明◆调用无参函数一般用来执行指定的一组操作◆主调函数不传送数据给被调函数●函数定义时定义了一个或一个以上的参数●调用时将要处理的数据传送给被调函数二.用户自定义函数1.函数分类(从函数的形式看)无参函数58定义形式二:函数值类型名函数名(形式参数类型及参数说明){数据说明部分语句}定义形式一:函数值类型名函数名(形式参数列表)形式参数说明{数据说明部分语句}2.函数定义形式ANSI风格如:intmax(n1,n2)intn1,n2;如:intmax(intn1,intn2)定义形式二:定义形式一:2.函数定义形式ANSI风格如:593.函数由函数首部与函数体两部分构成。(1)函数首部◆函数首部包括函数值类型、函数名、参数类型及参数说明.
◆函数值类型指定所定义函数返回值的类型,可以是简单数据类型、void类型或构造类型等。■当函数值类型为void时,表示函数无返回值,相当于其它语言的过程。当函数值类型为int时,可省略其类型的说明,建议不使用缺省形式类型说明.◆函数名是函数的标识符,遵循C语言标识符的命名规则,区分大小写。■为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参,处在函数名后的一对圆括号中。要特别注意的是,无论函数是否有形式参数,函数名后的圆括号不可省,并且圆括号之后不能接“;”。3.函数由函数首部与函数体两部分构成。(1)函数首部◆函60◆函数体结束在“}”括号处。(2)函数体◆函数首部之后的花括号“{}”部分为函数体。■函数体内数据说明部分在前,执行语句部分在后。◆函数体中说明的变量是该函数调用时有效的局部变量,执行语句是实际生成命令代码的部分。■函数的功能由函数体内的各个语句的执行来实现。◆空函数定义时无参数,{}内为空被调用时,不执行任何操作就立即返回。例如:voidprint_report(void){}◆函数体结束在“}”括号处。(2)函数体◆函数首部之后的花括614.2函数的调用★在C语言的一般函数体中,可以包含对其它函数的调用,称为函数的嵌套调用,甚至包含对自身的调用,称为函数的递归调用。☆一个函数一旦被定义,就可在程序的其它函数中使用它,这个过程称为函数调用。一.函数的一般调用与声明函数名(实际参数列表)1.函数调用形式函数调用的一般形式:4.2函数的调用★在C语言的一般函数体中,可以包含对其它62◆实际参数简称为实参,参数之间以逗号分隔。■函数调用时,实参与形参应保持个数、次序及类型的一致性,以确保实参与形参之间数据的正确传递。◆实际参数可以是表达式、常量、变量(调用时必须有确定的值或确定的地址)。■形式参数必须为变量。■当实际参数的个数、次序、类型与对应形式参数的个数、次序、类型不一致时,系统并不提示错误,后果却难以预测。2.格式说明◆实际参数简称为实参,参数之间以逗号分隔。■函数调用时,实633.C语言中函数调用的三种形式:语句调用表达式调用函数参数调用在函数调用后加“;”,构成一个语句。调用函数的目的可能是执行一个动作或完成特定的功能。大多数函数的调用形式。被调用函数执行的结果为调用函数提供一个值。调用函数通过表达式接收值。被调函数作为某个函数的一个参数。3.C语言中函数调用的三种形式:语句调用表达式调用函数参数64main()/*主函数中采用函数参数调用形式调用函数max*/{intx,y,z,m;scanf("%d,%d,%d",&x,&y,&z);printf("max=%d\n",max(max(x,y),z));/*内层函数max2的值作为外层函数max2的实参,整个函数max2的值又作函数printf的的实参*/}例函数参数调用形式调用函数max:intmax(intn1,intn2)/*求两个数中较大者*/{inty;y=(n1>n2)?n1:n2;return(y);}main()/*主函数中采用函数参数调用形式调用函数ma654.函数声明(函数说明)◆调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。■函数声明的一般形式如下:类型名函数名(类型1形参1,…,类型n形参n);或类型名函数名(类型1,类型2,…,类型n);或类型名函数名();◆函数声明是以语句形式出现的,因此其后有语句结束标记“;”。■若函数定义放在主调函数之前,遵循先定义后调用原则,函数声明可以省略;若函数值的类型为整型或字符型,函数声明可以省略;若在所有函数定义之前,已说明函数类型,函数声明也可省略。4.函数声明(函数说明)◆调用用户自定义函数时,一般调用函66二.形参、实参与函数调用过程形式参数(简称形参)定义函数使用的参数实际参数(简称实参)调用函数使用的参数◆C语言中,采用函数之间的参数传递方式从实参向形参传递。■C语言函数的参数传递均采用单向值传递方式(或称复制方式)。◆单向值传递方式是指在函数调用时,将实参之值传递给对应的形式参数,使形参具有与实参相同的值。■当实参是变量的地址值、指针常量或指针变量时,实参传递给形参的是地址值,同样是单向值传递方式。二.形参、实参与函数调用过程形式参数定义函数使用的参数实67案例4_2见教材145页例4.2作业:教材173页4.1题1——5。三、函数的嵌套调用C语言允许在调用一个函数过程中又调用另外一个函数。这种调用方式称为嵌套调用。案例4_3见教材147页4.4案例4_2见教材145页例4.2684.3内部变量与外部变量
一、变量的作用域C语言中所有的变量都有自己的作用域。变量说明的位置不同,其作用域也不同,据此将C语言中的变量分为内部变量和外部变量。1、内部变量在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外不能使用这些变量。所以内部变量也称“局部变量”。例如:4.3变量的作用域及存储特性4.3内部变量与外部变量一、变量的作用域4.3变69intf1(inta)/*函数f1*/{intb,c;……} /*a,b,c作用域:仅限于函数f1()中*/intf2(intx)/*函数f2*/{inty,z;……} /*x,y,z作用域:仅限于函数f2()中*/
main(){intm,n;……}/*m,n作用域:仅限于函数main()中*/intf1(inta)/*函数f1*/70关于局部变量的作用域还要说明以下几点:主函数main()中定义的内部变量,只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是并列关系。这一点是与其它语言不同的,应予以注意。形参变量也是内部变量,属于被调函数;实参变量,则是调用函数的内部变量。允许在不同的函数中定义同名变量,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。在复合语句中也可定义变量,其作用域只在复合语句范围内。关于局部变量的作用域还要说明以下几点:71例4-4:voidf1(){intt=2;a*=t;b/=t;}voidmain(){inta,b;printf(”Entera,b:”);scanf(”%d,%d”,&a,&b);f1();/*调用函数f1()*/
printf(”a=%d,b=%d”,a,b);}
编译程序会提示出错:Undefinedsymbol‘a’和Undefinedsymbol‘b’。为什么?例4-4:编译程序会提示出错:722、外部变量在函数外部定义的变量称为外部变量。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本文件结束为止。外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量。例4_5:输入长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积。2、外部变量73
/*功能:利用全局变量计算长方体的体积及三个面的面积*/ints1,s2,s3;intvs(inta,int,b,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);getch();} /*功能:利用全局变量计算长方体的体积及三个面的面积74对于全局变量还有以下几点说明:外部变量可加强函数模块之间的数据联系,但又使这些函数依赖外部变量,因而使得函数的独立性降低。在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。外部变量的作用域是从定义点到本文件结束。如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变量进行说明。外部变量说明的一般形式为:extern数据类型外部变量[,外部变量2……];外部变量的定义和外部变量的说明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的说明,出现在要使用该外部变量的函数内,而且可以出现多次。对于全局变量还有以下几点说明:75作业1、教材176页1、3、42、实验名称:函数实验内容:上机调试和运行习题4中的布置作业、本章例4.43、完成第三章的两份实验报告,并于本周实验课期间上交。(请转告其他同学)作业1、教材176页1、3、476二、变量的存储特性(反映变量的生存期)在C语言中,对变量的存储类型说明有以下四种:自动变量(auto)、寄存器变量(register)、外部变量(extern)、静态变量(static)。自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。存储方式是指变量的存储空间的分配方式,不同存储方式的变量对不同的生命周期。静态存储变量生存期为程序执行的整个过程,在该过程中占有固定的存储空间,也称永久存储。动态存储变量只生存在程序运行的某一段时间内,如函数的形参、函数中定义的自动局部变量,只有当程序进入该函数时才分配存储空间,函数执行完后,变量的存储空间又被释放。二、变量的存储特性(反映变量的生存期)77(一)局部变量的存储方式1.静态存储──静态局部变量(1)定义格式:static数据类型局部变量表;(2)存储特点静态局部变量属于静态存储。在程序执行过程中,即使所在函数调用结束也不释放。换句话说,在程序执行期间,静态局部变量始终存在,但其它函数不能引用它们。定义但不初始化,则自动赋以0(整型和实型)或'\0'(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值!(3)何时使用静态局部变量需要保留函数上一次调用结束时的值。变量只被引用而不改变其值。(一)局部变量的存储方式782.动态存储──自动局部变量(又称自动变量)(1)定义格式:[auto]数据类型变量表; (2)存储特点自动变量属于动态存储方式。在函数中定义的自动变量,只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。在复合语句中定义的自动变量,只在该复合语句中有效;退出复合语句后,也不能再使用,否则将引起错误。定义而不初始化,则其值是不确定的。如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。变量定义缺省存储类型说明,系统自动将其定义为自动存储类型。2.动态存储──自动局部变量(又称自动变量)79自动变量与静态局部变量的存储特性。voidauto_static(void){intvar_auto=0; /*自动变量,每次调用都重新初始化*/staticintvar_static=0;/*静态局部变量,只初始化1次*/printf(“var_auto=%d,var_static=%d\n”,var_auto,var_static);++var_auto;++var_static;}main(){inti;for(i=0;i<5;i++)auto_static();} 自动变量与静态局部变量的存储特性。80程序运行结果:var_auto=0,var_static=0var_auto=0,var_static=1var_auto=0,var_static=2var_auto=0,var_static=3var_auto=0,var_static=4程序运行结果:813.寄存器存储──寄存器变量一般情况下,变量的值都是存储在内存中的。为提高执行效率,C语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器变量。定义格式如下:
register数据类型变量表;(1)只有局部变量才能定义成寄存器变量,即全局变量不行。(2)对寄存器变量的实际处理,随系统而异。例如,微机上TC将寄存器变量实际当作自动变量处理。(3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。3.寄存器存储──寄存器变量82(二)外部变量的存储方式外部变量属于静态存储方式:(1)静态外部变量──只允许被本源文件中的函数引用其定义格式为:static数据类型外部变量表;*(2)非静态外部变量──允许被其它源文件中的函数引用定义时缺省static关键字的外部变量,即为非静态外部变量。其它源文件中的函数,引用非静态外部变量时,需要在引用函数所在的源文件中进行说明:extern数据类型外部变量表;注意:在函数内的extern变量说明,表示引用本源文件中的外部变量!而函数外(通常在文件开头)的extern变量说明,表示引用其它文件中的外部变量。(二)外部变量的存储方式83静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:(1)定义的位置不同。静态局部变量在函数内定义,静态外部变量在函数外定义。(2)作用域不同。静态局部变量作用域仅限于定义它的函数内;虽然生存期为整个源程序,但其它函数是不能使用它的。静态外部变量作用域为定义它的源文件内;生存期为整个源程序,但其它源文件中的函数也是不能使用它的。(3)初始化处理不同。静态局部变量,仅在第1次调用它所在的函数时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上1次调用结束时的值。而静态外部变量是在函数外定义的,其当前值由最近1次给它赋值的操作决定。静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:844.4函数间的数据传递
所谓函数间的数据传递的是指主调函数向被调函数传送数据及被调函数向主调函数返回数据的过程。4.4函数间的数据传递所谓函数间的数据传85函数间数据传递的的三种形式:参数传递return语句全局变量传值方式:传址方式:将被调用函数执行的结果作为函数返回值提供给调用函数。调用函数通过表达式接收值。利用全局变量的全局作用域特性实现数据在函数间的传递实参的值传递给形参变量(单向传递)实参的地址传递给形参变量函数间数据传递的的三种形式:参数传递return语句全局变量86一、传值方式1.特点在函数调用过程中,形参的值如果发生变化,不会改变实参的值。2.例程4_6见教材151例4.5二、传址方式1.特点函数调用过程中,实参与形参对应同一个内存单元,故形参的值如果发生变化,会改变实参的值。2.例程4_7见教材151例4.63.传址方式下定义函数形参时,形参变量须为能接收地址的指针变量或数组。一、传值方式87三、利用全局变量的函数间数据传递1.特点函数欲处理的数据可由全局变量带入函数体内,函数执行的结果也可由全局变量带出函数。2.例程4.8见教材153页例4.73.为提高函数的独立性,程序设计时应避免使用全局变量在函数间传递数据。四、思考1.可用于主调函数向被调函数传递数据的方式有哪些?2.可用于被调函数向主调函数传递数据的方式有哪些?三、利用全局变量的函数间数据传递88五、编程举例例程4.9:有一个一维数组,用于保存10个学生的成绩,请编程计算平均成绩并排序。编程要求:请设计四个函数,分别用于完成数组元素数据的输入(函数名input)、平均成绩的计算(函数名average)、成绩排序(升序,函数名sort)、数组元素的输出(函数名output);main()函数调用以上函数完成题意要求。五、编程举例89floatinput(floatarray[],intn);floataverage(floatarray[],intn);floatsort(floatarray[],intn);floatoutput(floatarray[],intn);main(){floatscore[10],aver;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第五单元名著导读《昆虫记》教学设计 2023-2024学年统编版语文八年级上册
- 2025年便携式地质雷达合作协议书
- Unit 1 Animal Friends.Section A(1a-1d)教学设计2024-2025学年人教版(2024)英语七年级下册
- Unit 2 My favorite school subject Lesson 8 教学设计 2024-2025学年冀教版八年级英语上册
- 黄山2025年安徽黄山市歙县事业单位招聘141人笔试历年参考题库附带答案详解
- 2024-2025学年新教材高中生物 第1章 发酵工程 第2节 第2课时 微生物的选择培养和计数教学实录 新人教版选择性必修3
- 教学设计“利用三角形全等测距离”教学设计2024-2025学年苏科版数学八年级上册
- 黑龙江省牡丹江市名校协作体2024-2025学年高二下学期3月月考英语试题(原卷版+解析版)
- 陕西省石泉县七年级生物上册 3.2.3 开花和结果教学实录1 (新版)新人教版
- 公司与财务合同标准文本
- 湘教版七年级地理下册第七章第四节欧洲西部课件
- 超星学习通四史教育答案
- 基坑工程土方开挖支护与降水监理实施细则
- 数字信号处理(课件)
- 沉淀理论课件
- 最新高三主题班会:行百里者半九十课件
- 土方回填施工记录表
- 体育调查问卷
- 公司样品标识卡
- 英语人教新起点(一起)四年级下册-Unit 3 Lesson 2 Travel plans教学设计
- SONYα300α350使用手册
评论
0/150
提交评论