2013考研应用心理硕士真题总体分析及复习指导_第1页
2013考研应用心理硕士真题总体分析及复习指导_第2页
2013考研应用心理硕士真题总体分析及复习指导_第3页
2013考研应用心理硕士真题总体分析及复习指导_第4页
2013考研应用心理硕士真题总体分析及复习指导_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第八章函数,8.1概述,C程序结构:,一个C源程序由若干函数构成。必须有且只能有一个名为main的主函数。C程序的执行总是从main函数开始,在main中结束。函数不能嵌套定义,可以嵌套调用。,从用户角度:标准函数(库函数):由系统提供。用户自定义函数。从函数形式:无参函数。有参函数。,函数分类:,8.2函数定义的一般形式,函数类型函数名(有类型说明的参数表)说明部分语句部分,函数返回值类型,合法标识符,参数间用逗号分隔,函数体,三种函数形式:,例:有参函数intmax(intx,inty)intz;z=xy?x:y;return(z);,例:无参函数voidprintstar()printf(“*n”);,例:空函数dummy(),有参函数,无参函数,空函数,8.3函数参数和函数的值,形式参数和实际参数,定义函数时,函数名后面括号中的参数称为“形式参数”(简称形参);在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称实参)。,关于形参与实参的说明:形参必须指定类型。实参必须有确定的值。形参与实参类型一致,个数相同。若形参与实参类型不一致,自动按形参类型转换(函数调用转换)。形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放。,/*计算x的立方*/#includefloatcube(floatx)return(x*x*x);voidmain()floata,product;printf(Pleaseinputvalueofa:);scanf(%f,x,1.2,函数的返回值,通过函数调用使主调函数得到一个确定的值,这就是函数的返回值。函数的返回值是通过函数中的return语句获得的。,return语句的一般形式:return(表达式);或:return表达式;,return语句的作用是:将流程从当前函数返回主调函数。撤销调用函数时为各参数和变量分配的内存空间。向主调函数返回顶多一个值。,例:#includeintmax(intx,inty)return(xy?x:y);voidmain()inta,b,c;intmax(intx,inty);scanf(%d%d,说明:一个函数体中可以有多个返回语句,但每次只能通过一个return语句执行返回操作。无返回值的函数是void类型的函数,return语句可省略。函数中return后面(表达式)的值应该与函数定义时的类型一致,否则,以函数类型为准。,例:无返回值的函数voidswap(intx,inty)inttemp;temp=x;x=y;y=temp;,8.4函数的调用,函数调用的一般形式为:函数名(实参表列);,常量、变量、表达式或地址,函数调用的作用:通过实参向形参传递数据。为形式参数及函数中声明的变量分配存储空间。暂时中断现行(主调)函数,将流程转向被调函数的入口处,开始执行被调函数。,函数调用的三种方式:函数语句:max(a,b);函数表达式:c=max(a,b);作为另一个函数的实参:m=max(a,max(b,c);,函数声明,调用函数之前,应该对其进行说明,称为:函数声明(通知编译系统函数的类型、参数个数及类型,以便检验)。,函数声明的一般形式为:函数类型函数名(形参表);,如:floatfun(floatn,floatm,ints);,说明:当被调函数定义在主调函数之后时,必须在函数调用之前给出函数声明。当被调函数定义在主调函数之前时,无须在函数调用之前给出函数声明。函数说明位置在程序的数据说明部分(定义部分)。(形参表)中可只给出参数类型,不写参数名。调用库函数不加说明,但要使用#include。,如:floatfun(float,float,int);,8.5函数的嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数。即允许在一个函数中调用另一个函数。,例:求三个数中最大数和最小数的差值。,#includeintmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intdif(intx,inty,intz)returnmax(x,y,z)-min(x,y,z);voidmain()inta,b,c,d;scanf(%d%d%d,8.6函数的递归调用,定义:函数直接或间接的调用自身叫函数的递归调用。,直接调用:,间接调用:,使用递归调用的关键在于:找到递归结束条件。构造一个适当的递归调用语句。,例:求n的阶乘。,#includeintfac(intn)intf;if(n0)printf(n0,dataerror!);elseif(n=0|n=1)f=1;elsef=fac(n-1)*n;return(f);voidmain()intn,y;printf(Inputaintegernumber:);scanf(%d,实现递归分为以下两个阶段:“递推”(调用)阶段。“回归”(回代)阶段。如:n=3时,这两个阶段见下图:,键入三个整数,用函数求出其中最大的数。有10个有序数存放在一个数组中,输入一个数,用折半法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。要求用函数查找!,作业,参数传递方式,值传递(单个变量或数组元素作参数),方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值。,特点:1.形参与实参占用不同的内存单元。2.单向传递。只能由实参传给形参;不能由形参传给实参。,8.7数组作为函数的参数,/*交换两个数*/#includevoidswap(inta,intb)inttemp;temp=a;a=b;b=temp;voidmain()intx=7,y=11;printf(%d,%dn,x,y);swap(x,y);printf(%d,%dn,x,y);,地址传递(数组名作参数),方式:如果形参是数组,通常实参应是数组名。因为数组名代表的是数组首元素的地址,所以此时实参向形参传递的是地址。,特点:形参数组与实参数组占用相同的内存单元。双向传递。即能由实参传给形参;又能由形参传给实参。形参数组与实参数组类型应一致。在函数定义和函数声明时,数组长度可以省略。,如:intaver(inta,intsize);,/*交换两个数*/#includevoidswap(intxc)inttemp;temp=xc0;xc0=xc1;xc1=temp;voidmain()intsc2=7,11;printf(%d,%dn,sc0,sc1);swap(sc);printf(%d,%dn,sc0,sc1);,例1:输入10个学生的成绩,用函数求平均成绩。,#includefloataverage(intstu10,intn);voidmain()intscore10,i;floatav;printf(Input10scores:n);for(i=0;i10;i+)scanf(%d,floataverage(intstu10,intn)inti;floatav,total=0;for(i=0;in;i+)total+=stui;av=total/n;returnav;,实参用数组名,形参用数组定义,intstu,例2:用选择法对数组中10个数由小到大排序。,#includevoidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;,voidmain()inta10,i;for(i=0;i10;i+)scanf(%d,9,49,i=0,例2:用选择法对数组中10个数由小到大排序。,#includevoidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;,voidmain()inta10,i;for(i=0;i10;i+)scanf(%d,13,68,i=1,8.58.6仔细阅读第八章8.7节内容8.9,作业,8.8局部变量和全局变量,局部变量(内部变量),在函数内部定义的变量是内部变量或称局部变量。,局部变量的作用域:只在定义它的函数内有效,此函数外不能使用。,注意:主函数中定义的变量也是局部变量。形式参数是局部变量。不同的函数、并列的分程序中,可以使用同名变量互不干扰。若嵌套的分程序中有同名变量,则在内层变量的作用域内,外层的同名变量被“屏蔽”。,全局变量(外部变量),在函数外定义的变量是外部变量或称全局变量。,全局变量的作用域:从定义变量的位置开始到该源文件结束。可为其后的所有函数共用。,!若全局变量与局部变量同名,则全局变量被屏蔽。,8.9变量的存储类别,变量的生存期:变量值存在的时间。,变量的作用域:变量的作用范围。,变量的定义格式:存储类型数据类型变量名;,变量的四种存储类型:auto-自动变量register-寄存器变量static-静态变量extern-外部变量,变量的存储方式:静态存储:程序运行期间分配固定存储空间。动态存储:程序运行期间根据需要动态分配存储空间。,例:autointa;externintsum;registerinti;staticfloatx;,基本概念,自动变量(auto),自动变量的定义形式:auto数据类型变量名;,关键字auto可以省略。前面用过的变量都是auto变量。,如:autointa;可写为:inta;,在函数内、分程序内定义的变量以及函数的形式参数,未经特殊声明都是auto变量。,动态存储。在调用函数时系统为它们分配存储空间,函数调用结束时自动释放存储空间。,自动变量是局部变量。作用域仅限于定义它的函数或分程序内。,静态变量(static),静态变量可分为内部静态变量和外部静态变量。这里仅讨论内部静态变量(静态局部变量)。,静态局部变量的定义形式:static数据类型变量名;,静态存储,在程序运行期间不释放存储单元。,在编译时赋初值,且只赋初值一次。以后每次函数调用时都保留上次调用结束时的值。,如未初始化静态局部变量,编译系统自动为其赋初值0或“0”。,静态局部变量依然是局部变量。,长期占用内存,降低程序的可读性,尽量少用。,#includevoidmain()intf(int);/*函数声明*/inti,a=2;for(i=0;i3;i+)printf(%d,f(a);intf(inta)intb=0;staticintc=3;/*定义静态局部变量*/b+;c+;return(a+b+c);,输出:789,用extern声明全局变量,为了使全局变量的作用域扩展到它的定义之前,可使用全局变量声明。,全局变量的声明形式:extern数据类型全局变量名;,可省略!,全局变量定义与全局变量声明的差别:,尽量少用全局变量,因为:全局变量在程序全部执行过程中占用存储单元。降低函数的通用性、可靠性、清晰性,容易出错。,次数:只能1次可声明多次,位置:所有函数之外函数内或函数外,分配内存:分配、可初始化不分配、不可初始化,寄存器变量

温馨提示

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

评论

0/150

提交评论