




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四次课程安排时间课次授课标题上课时长(分钟)上午第一课时函数定义的一般形式20函数的返回值15库函数15第二课时函数调用的一般格式15函数的数据传递35第三课时函数的递归调用30函数的声明20下午第四课时指针的定义15指针的赋值20二级指针15第五课时指针的运算30指针的移动20第六课时函数间地址值的传递50课后布置习题作业第五章课后习题:P34选择题1-5,8-12,填空题1,2,3,4(这四个题目在上机考题中经常出现)第六章课后习题:P41选择题7-18第五章 函数l 本章考点考点考核几率分值函数的定义与返回值80%13库函数60%12函数调用及形参与实参之间的数据传递(难点)100%24函数的声明60%01l 教学内容一、 函数的定义1. 函数的定义 功能单一且独立的程序模块,用于完成特定的任务并根据需要返回一个确定的值。例如:新视野的二级C语言培训,大家可以把它想象为一个函数,它完成的一个特定任务就是通过二级C语言考试,返回一个证书。函数是C语言程序的基本单位,就如同人体的基本单位是细胞一样。在C语言程序中有且仅有一个main函数。2. 函数定义的一般形式:返回值类型函数名(类型1形参名1 , 类型2 形参名2) 说明部分 语句部分(1) 返回值类型,包括:整型(int),实型(float、double),字符型(char)、空型(void)(2) 函数名,和数组名一样必须符合标识符的命名规则,表示一个函数的名字(3) 小括号里面的内容叫做形参,形参可以有一个或多个,当有多个形参中间必须用逗号分隔,并且不能省略形参的类型名。同时小括号里面可以没有任何的形参。(4) 大括号里面的部分叫做函数体(5) 函数不能嵌套定义,一个函数里面不能有其它函数的定义(6) 函数举例:1) 无形参的函数:int fun( )int a,b,c;a=10;b=20;c=a+b;return c;其中int fun( )这个整体叫做函数首部,包括:函数返回类型,函数名和形参1、 该函数的返回类型为int,就如同我们培训二级C语言,就要返回一个C语言证书;2、 该函数的名字叫做fun,当然可以去其它的名字,例如:liudehua,但是刘德华就不可以,它不符合标识符的命名规则;3、 该函数的形参为空,表示没有任何的参数,但是()不能省;可以把它想象为函数的身体,而函数的首部就是函数的头。1、 函数体必须用 作为定界,从“”开始,到“”结束2、 函数体有一条或多条语句组成,因此函数的基本单位是语句2) 有一个形参的函数一个形参double f(int n) return 0.0;3) 有多个形参的函数: double f1(int n,double x,char ch) return 1.0;4) 形参类型出错:多个形参不能共用一个类型,习题中形参a,b,c共用了一个整型int,在C语言中不允许的,必须给每个形参指定合法的类型名int f3(int a,b,c) int f3(int a,double b,char c) 3. 函数的返回值(1) 返回int型的函数:函数必须返回一个整型表达式 int fun() return 整型表达式int fun(int a,int b) return a+b;(2) 返回double型的函数:函数必须返回一个实型表达式double fun( ) return 实型表达式double fun(double x) return 1.0/x;(3) 返回char类型的函数:函数必须返回一个字符型表达式char fun( ) return 字符型表达式char fun(char ch)if(ch=a&chb) printf(“%d”,a);elseprintf(“%d”,b);4. 库函数:(1) include命令行,一般格式为:#include 或 #include 头文件名.h(2) 注意事项1) include命令行必须以“#”符号开头。2) 系统提供了的头文件以.h作为文件的后缀。3) include命令行是C语言的预处理命令,所以不用在语句的结尾加“;”。例如,在程序中要引用数学函数,则在程序开头要加上:#include math.h(3) 库函数的调用形式 函数名(实参);(4) 例如,若有代数式|nx+ex|(其中e仅代表自然对数的底数,不是变量),则表示该代数式的C语言表达式是:sqrt(fabs(pow(n,x)+exp(x)。解析:在C语言中,计算平方根应使用sqrt()函数,计算n的x次方应使用pow()函数(第1个参数是n,第2个参数是x);计算自然数e的x次方应使用exp()函数,计算绝对值使用fabs()函数。本题的代数式首先应计算nx和ex,根据前面介绍应该分别为pow(n,x)和exp(x),然后计算它们的和pow(n,x)+exp(x),接着是这个和的绝对值fabs(pow(n,x)+exp(x),最后对这个绝对值开平方,所以最终结果应是sqrt(fabs(pow(n,x)+exp(x)。(5) 重点讲解课本P78例2二、 函数调用及数据传递(两者必须紧密结合)1、 函数调用的形式:函数名(实参)2、 有返回值的函数调用int fun( ) return 0;main()int a;a=fun();/*调用fun函数,将函数返回的值赋值给变量a*/if(a= =0) printf(“函数返回值为0”);3、 无返回值的函数调用void fun( )int a,b,c;a=10;b=20;c=a+b;main() int c=0; fun();/*调用fun函数,因为函数无返回值,因此只能以单独一条语句的形式存在*/ if(c= =30) printf(“函数返回值为30”);4、 重点讲解课本P78例1,必须给学员分析清楚A,B,C,D为什么不对?5、 函数的数据传递:(1) 实参将自身的值传递给形参,换句话说实参将自身的值赋值给形参。(2) 实参和形参的名字可以相同或是不同,不影响程序执行(3) 形参的改变不能改变实参6、 实参和形参名字不同时的数据传递,举例:课本P81例1void swap(int x,int y) int t; t=x;x=y;y=t; printf(%d %d,x,y);main() int a=3,b=4; swap(a,b);/*调用函数*/ printf(“%d %d”,a,b);分析:程序从上往下执行,遇到函数调用时“先执行被调用的函数,再往后执行”1) main函数调用swap函数,swap(a,b);程序执行到此处时,先执行被调用的函数。其中a和b叫做实参,函数调用时实参将自身的值传递给对应的形参;2) 形参x的值通过实参传递过来,因此x的值为3,同理y的值为43) 执行swap函数:t=x;x=y;y=t;t=3,x=4,y=3(注意:x和y通过t已经进行了交换,t=x;x=y; y=t;一定要记住是做什么的)4) 执行swap函数:printf(%d %d,x,y);结果为:4 35) 执行完swap函数后,继续执行main函数中调用语句后面的语句6) 执行main函数中的语句:printf(“%d %d”,a,b);结果为:3 4,记住:形参x和y值的改变是不会影响实参a和b7) 整个程序的结果为:4 33 47、 实参和形参名字相同是的数据传递void swap(int x,int y) 形参x 形参y int t; t=x;x=y;y=t; printf(%d %d,x,y);main() 实参x 实参y int x=3,y=4; swap(x,y);/*调用函数*/ printf(“%d %d”,x,y);?分析:实参x、y和形参x、y是不一样的,大家记住,实参只在调用函数中有效,形参只在被调用函数中有效。 实参和形参虽然有相同的外形,但不是同一个变量。1) main函数调用swap函数,swap(x,y);程序执行到此处时,先执行被调用的函数。其中x和y叫做实参,函数调用时实参将自身的值传递给对应的形参;2) 形参x的值通过实参传递过来,因此x的值为3,同理y的值为43) 执行swap函数:t=x;x=y;y=t;t=3,x=4,y=3(注意:x和y通过t已经进行了交换,t=x;x=y; y=t;一定要记住是做什么的)4) 执行swap函数:printf(%d %d,x,y);结果为:4 35) 执行完swap函数后,继续执行main函数中调用语句后面的语句6) 执行main函数中的语句:printf(“%d %d”,x,y);结果为:3 4,记住:形参x和y值的改变是不会影响实参x和y7) 整个程序的结果为:4 33 48、 讲解课本P78例3,考查:形参随着实参的改变而改变,函数fun的功能是计算x2+2x+6随着实参x的不同就可以计算出不同的结果。9、 讲解课本P82习题1,注意分析的过程10、 讲解习题册中P34第6、711、 函数的递归调用(重点),以课本P82习题2为例 viod fun(int x) if(x/20) fun(x/2); printf(“%d ”,x);main()fun(3);printf(“n”);调用fun(3):fun(3);printf(“n”);形参x的值为:3,x/2为真if(x/20) fun(x/2);printf(“%d ”,x);形参x的值为:1,x/2为假if(x/20) fun(x/2);printf(“%d ”,x);main函数fun(3)fun(1)分析:(1) 函数从main函数开始执行,当执行fun(3)时调用fun函数,printf(“n”);d等待执行;(2) 执行fun(3),将实参3传递给形参x,则x的值为3,判断:x/20为真,则执行fun(x/2)fun(1),则调用函数fun(1),printf(“%d ”,x);等待执行;(3) 执行fun(1),将实参1传递给形参x,则x的值为1,判断:x/20为假,则不执行fun(x/2),执行printf(“%d ”,x);输出:1 ,这样fun(1)执行完毕,返回上一层继续执行;(4) 调用fun(1)执行完毕,则执行fun(3)中的输出语句:printf(“%d ”,x);输出3,这样fun(3)执行完毕,返回上一层继续执行(5) 调用fun(3)执行完毕,则执行main函数中的输出语句:printf(“n”);输出一个换行,这样main函数执行完毕,整个函数执行完12、 函数的递归调用(重点),以习题P37习题20为例int f(int x) int y; if(x=0|x=1) return(3); y=x*x-f(x-2); return y;main() int z;z=f(3);printf(“%dn”,x);调用f(3):z=f(3);printf(“%dn”,z);形参x的值为:3,x=0|x=1为假,不执行return(3),执行:y=x*x-f(x-2);return y;形参x的值为:1,x=0|x=1为真,则执行return(3),遇到return则不再执行以后的语句。main函数f(3)fun(1) 分析:(1) 函数从main函数开始执行,当执行z=f(3)时调用f函数,printf(“%dn”,z);等待执行;(2) 执行f(3),将实参3传递给形参x,则x的值为3,判断:x=0|x=1为假,不执行return(3),执行y=x*x-f(x-2)y=3*3-f(1),则调用函数f(1),return y;等待执行;(3) 执行f(1),将实参1传递给形参x,则x的值为1,判断:x=0|x=1为真,则执行return(3),遇到return则不再执行以后的语句。 这样f(1)执行完毕,返回上一层继续执行;(4) 调用f(1)执行完毕,则执行f(3)中的语句:y=3*3-f(1) y=3*3-3y=6,继续执行return y,将6返回。这样f(3)执行完毕,返回上一层继续执行(5) 调用f(3)执行完毕,则执行main函数中的输出语句:z=f(3)z=6,继续执行printf(“%dn”,z);输出:6,这样main函数执行完毕,整个函数执行完毕三、 函数声明 以课本P79函数area和main函数为例进行讲解1. 函数声明的形式返回值类型函数名(类型1形参名1, 类型2形参名2,);即在函数的首部加上分号。对area函数的声明为:double area(double a, double b);2. 函数声明的注意事项(1) 可省略形参名,不可省略形参的类型。对area函数的声明为:double area(double ,double );但是不能写为:double area(a,b);(2) 声明时的参数名可与定义时的形参名相同,也可不同。 对area函数的声明为:double area(double x,double y);或double area(double b,double a);(3) 声明时不能省略函数的返回类型和最后的分号。例如对area函数的声明:area(double a,double b)是错误的。(4) 重点讲解课本P80例4,习题3,这两个题必须让学员掌握3. 函数的两种使用方式(1) 先定义,后调用。(2) 先声明,后调用,最后定义。void fun( )/*函数定义*/ .main()fun();/*函数调用*/.void fun();/*函数声明*/main() fun();/*函数调用*/ .viod fun()/*函数定义*/ 第六章 指针l 本章考点考点考核几率分值变量的地址和指针(难点)60%24指针变量的定义、赋值和运算等操作(难点)100%48函数之间地址值的传递(难点)70%25l 教学内容一、 指针的定义1. 地址的概念:int a=10,b=20;在计算机中的存储形式地址值变量100010a100110021003100420b100510061007地址就如同日常生活中的房间号,值就是房间里面的东西,变量就是东西的名称。上面图中描述了计算机内存中存放了两个变量,其中a变量占用了4个存储单元1000-1003,里面存放的值为10,变量a的地址为所占存储单元的第一个字节的地址,为1000;b变量占用了4个存储单元1004-1007,里面存放的值为20,变量b的地址为所占存储单元的第一个字节的地址,为1004;2. 指针的定义形式(1) 变量的定义形式:类型名 变量名1,变量名2,;EG: int a,b,c; double x,y,z;(2) 指针的定义形式:类型名 *变量名1,*变量名2,;EG:1) 定义整型类型的指针:int *p,*q;说明:定义了两个整型类型的指针p和q,p和q叫做指针变量,简称指针。2) 定义实型类型的指针:float *p; double *q;3) 定义字符类型的指针:char *p,*q;二、 指针的赋值1. 指针的用途指针是用于存储地址的特殊变量,话句话说指针就是地址,地址也就是指针;2. 指针的赋值(1) 将变量的地址赋值给指针指针=&变量名注意:1) 指针类型和被赋值的变量类型必须一致2) 变量名前面必须加取地址符号(&)EG:int a=10;int *p;p=&a;int a=10,b=20;int *p,*q;p=&a,q=&b;3) “指针=变量”的形式是错误的EG:int a=10;int *p;p=a;int a=10,b=20;int *p,*q;p=a,q=b;说明:赋值号左右两边的类型必须一致才可以进行赋值运算,否则将出错。指针只能被赋值为地址,p=a或q=b的形式是错误,将一个变量直接赋值给一个指针是错误的!(笔试考试中经常考这个知识点!)(2) 将指针赋值给指针int a=10;int *p,*q;p=&a;q=p;/*q指向了p指针指向变量的值*/int a=10;int *p,*q,*r;p=&a;q=p;r=q;讲解课本P87习题1,2,33. 指针在内存中的表现形式EG1:int a=10;int *p;p=&a;地址值变量100010a10041000p10081012说明:程序中定义了两个变量:一个为整型变量a,并且为a赋值为10;另一个是整型指针,将指针指向了变量了变量a(p=&a)。通过右边的地址图,可以清晰的看出变量a的地址为1000,变量a的值为10,指针p的地址为1004,指针p的值为变量a的地址1000。注意:指针只能存储地址EG2:int a=10,b=20;int *p,*q;p=&a;q=&b;地址值变量100010a100420b10081000p10121004q说明:程序中定义了两个整型变量a和b,定义了两个指针变量p和q,a被赋值为10,b被赋值为20,指针p存储的是变量a的地址,指针q存储的是变量b的地址。通过右边的地址图可以清晰的看到变量之间的关系!EG3:int a=10;int *p,*q,*r;p=&a;q=p;r=q;地址值变量100010a10041000p10081000q10121000r说明:程序中定义了一个整型变量a,并为变量a赋值为10,定义了3个指针变量,其中p指向了变量a,存储的是变量a的地址,q=p将p的值赋值给指针q,因为p的值为变量a的地址1000,因此q被赋值为1000;r=q将q的值赋值给指针r,因此r的值为1000,通过地址图可以清晰看到变量之间的关系。4. 给指针变量赋值为“空值”1) NULL的代码值为0,必须在程序前面写预定义行#inlcude “stdio.h”,下面三个表达式是等价的。 int *p;p=NULL;int *p;p=0;int *p;p=0;2) 不能通过一个空指针访问一个存储单元。int a=10,*p;p=NULL;p=&a;左边的程序中p=&a是错误的,因为在给指针p赋值变量a地址之前先给变量p赋值为NULL,表示指针为空,“不能通过一个空指针访问一个存储单元”,因此出错!三、 二级指针1、二级指针的定义形式 类型名 *指针 EG1: int *p;EG2: float *q;2、二级指针的赋值(1) 二级指针又叫做指向指针的指针,存放的是指针的地址EG:int a=10;int *p;int *q;p=&a;/*指针p指向了变量a*/q=&p;/*二级指针q指向了指针p,存放的是p的地址*/int a=10;int *p;int *q;p=&a;q=p;/*左右两边类型不一致,所以 出现错误*/(2) 二级指针间可以进行同级赋值int a=10;int *p;int *q,*r;p=&a;/*指针p指向了变量a*/q=&p;/*二级指针q指向了指针p,存放的是p的地址*/r=q;/*将二级指针q的值赋值给二级指针r*/3、二级指针的表现形式int a=10;int *p;int *q;p=&a;q=&p;地址值变量100010a10041000p10081004qint a=10;int *p;int *q,*r;p=&a;q=&p;r=q;地址值变量100010a10041000p10081004q10121004r四、 指针的运算1. 间接访问运算符:*2. 含义:*p表示访问p所指向变量的值。(p为指针变量)int a=10;int *p;p=&a;int a=10,b=20;int *p,*q;p=&a,q=&b;*p表现形式:先找到p的值1000,1000为地址,通过地址找到该地址存储的值10,因此*p的为10地址值变量100010a10041000p地址值变量100010a100420b10081000p10121004q*p:p存储的地址为1000,通过1000找到该地址存储的值为10,因此*p为10*q:存储的地址为1004,通过1004找到该地址存储的值为20,因此*q为203. 间接访问运算符(*)必须出现在运算对象的左边,运算对象可以是地址或存放了地址的指针变量。p=&a指针指向了变量a,*p等价于*(&a)或是*&a4. 重点讲解课本P89例1main()int a=7,b=8,*p,*q,*r;p=&a,q=&b;r=p;p=q;q=r;printf(“%d,%d,%d,%dn”,*p,*q,a,b);地址值变量10007a10048b10081000p10121004q1016r地址值变量10007a10048b10081004p10121000q10161000r执行r=p地址值变量10007a10048b10081000p10121004q10161000r执行:p=q;q=r;说明:从地址图变化中可以很快得到结果:a为10,b为8,*p为8,*q为7五、 指针的移动1、指针的移动移动指针就是通过赋值运算,使指针变量加上或减去一个整数,使指针变量指向相邻的存储单元。指针每移动一次则移动一个存储单元。2、指针比较pq:p所指单元在q之后;pq:p所指单元在q之前。此处可结合教材P90的图例,再引入如下的图例来讲解。a0a1a2a3a41122334455pq上图中,指针p指向存储单元a0,指针q指向存储单元a2,这时运算表达式q-p值为2,如果执行p+;则指针p向后移动一个存储单元指向存储单元a1,q=q+2;则将指针q向后移动2个存储单元指向存储单元a4。如下图:a0a1a2a3a41122334455pq六、 函数间地址值的传递1. 传值调用与传址调用,函数调用过程中的参数传递: (1) 传值:前面学习的普通变量作实参的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025二手车评估鉴定与交易中介服务合同
- 2025年度专业保洁公司用工合同样本
- 2025版上海个人商铺租赁合同(含装修费)
- 2025版太阳能电池板市场推广与销售代理合同
- 2025瓷砖铺设劳务合同范本专业适用于文化场馆地面铺设
- 2025版城市穿梭电动单车租赁服务合同范本
- 2025年泰州二手房买卖合同+附赠车位使用权协议
- 2025年趸购电及配套服务合同
- 2025年度城市轨道交通建设人工劳务分包合同模板
- 诺亚家具专业知识培训课件
- 《涡街流量计交流会》课件
- QC/T 1206.1-2024电动汽车动力蓄电池热管理系统第1部分:通用要求
- 国企内部控制审计服务方案
- 宁德时代笔试题库
- 骨干教师专业成长规划
- 广医三院产房个案护理分享
- 工程人员驻场服务方案
- 中小学校保安服务方案(技术方案)
- 直播供货协议合同范本
- DB3411∕T 0039-2024 废包装桶回收再利用技术规范
- 2024年二次离婚起诉状范文
评论
0/150
提交评论