大学二级C语言程序设计及同步训练-涂玉芬-课件PPT
收藏
资源目录
压缩包内文档预览:
编号:21836173
类型:共享资源
大小:11.93MB
格式:ZIP
上传时间:2019-09-06
上传人:QQ24****1780
认证信息
个人认证
王**(实名认证)
浙江
IP属地:浙江
25
积分
- 关 键 词:
-
大学
二级
语言程序设计
同步
训练
涂玉芬
课件
ppt
- 资源描述:
-
大学二级C语言程序设计及同步训练-涂玉芬-课件PPT,大学,二级,语言程序设计,同步,训练,涂玉芬,课件,ppt
- 内容简介:
-
第6章 函数结构化程序的模块结构:第6章 函数程序结构 :第6章 函数根据函数的定义者不同,分为如下两大类:(1)标准函数:系统提供的已定义的函数,一般用户都可以调用。如前面学习过的输入输出函数scanf、printf、getchar、putchar等。Turbo C 2.0的部分常用库函数见附录D。(2)用户自定义函数:用户自己编写的用来解决具体问题的函数。第6章 函数根据函数的参数形式,C语言函数又分为如下两种:(1)无参函数: 主调函数并不将数据传送给被调用函数。(2)有参函数: 在调用函数时,在主调函数和被调函数之间有参数传递,也就是说,主调函数可以将数据传送给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。第6章 函数6.1 函数的定义和调用6.1.1 函数定义函数定义的一般形式: 类型标识符 函数名(形式参数表列) 说明部分 执行部分 例:int max(int x,int y) /* 函数首部*/ /*函数体开始*/ int z; /*说明部分*/ if(xy) z=x; /*执行部分*/ else z=y; return(z); /*函数体结束*/第6章 函数6.1 函数的定义和调用6.1.1 函数定义说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。1)函数名前面的类型标识符是指函数返回值的类型,简称函数值类型。函数的返回值由函数中的return语句获得,即return后的表达式的值,可以是简单类型、void类型或构造类型等。当return后的表达式的类型与函数名前面的类型标识符不一致时,以函数名前面的类型标识符为函数值类型(即是将return后的表达式的值转换为函数名前面的类型后作为函数值返回)。如果函数中无return语句,将返回一个不确定值;如希望不返回值,可以定义函数类型为void,当函数值类型为int时,可省略其类型的说明。第6章 函数6.1 函数的定义和调用6.1.1 函数定义说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。2)函数名是函数的标识符,遵循C语言标识符的命名规则,区分大小写。3)函数名后的形式参数表列给出函数的形式参数及其类型说明。形式参数简称形参,形式参数及其类型说明放在函数名后的一对圆括号中,要特别注意的是,无论函数是否有形式参数,函数名后的圆括号不可省,并且圆括号之后不能接“;”。形式参数表列的一般形式如下:形参1类型 形参1,形参2类型 形参2,形参n类型 形参n第6章 函数6.1 函数的定义和调用6.1.1 函数定义说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。(2)函数体:函数说明之后的花括号“ ”括起来的部分,包括说明部分和执行部分。1)声明部分:用来对函数中使用的变量和函数作说明。2)执行部分:由基本语句组成,函数的功能由函数体内的各个语句的执行来实现。第6章 函数6.1 函数的定义和调用6.1.2 函数调用一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。1函数调用的一般形式 函数名(实参表列); 2函数调用语句的执行过程 首先计算每个实参表达式的值,并把此值存入所对应的形参单元中,然后把执行流程转入函数体中,执行函数体中的语句,当执行到函数体的右花括号或return语句时,表示函数体执行完成,这时将返回到调用此函数的语句的下一条语句,继续往下执行。第6章 函数6.1 函数的定义和调用6.1.2 函数调用例:#includeint max(int x,int y) int z; z=xy?x:y; return(z);main() int a,b,c; scanf(%d%d,&a,&b); c=max(a,b); printf(max=%d,c); 程序结果如下:输入:10 20输出:20一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。第6章 函数6.1 函数的定义和调用6.1.2 函数调用一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。3说明(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元;只有发生函数调用时被调用函数中的形参才被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。(2)实参可以是常量、变量或表达式,但必须有确定的值。在调用时将实参的值赋给形参变量。(3)实参与形参的类型应一致。只有字符型和整型可以互相通用。(4)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参变量与形参变量是不同的单元,即使同名,也是不同的单元。形参的值如果发生改变,并不会改变主调函数的实参值。第6章 函数6.1 函数的定义和调用6.1.2 函数调用例:一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。#includeswap(int x,int y) int t; printf (2)a=%d b=%dn,x,y); t=x;x=y;y=t; printf (3)a=%d b=%dn,x,y);main() int x=10,y=20; printf(1)x=%d y=%dn,x,y); swap(x,y); printf (4)x=%d y=%dn,x,y);程序结果如下:(1)x=10 y=20(2)x=10 y=20(3)x=20 y=10(4)x=10 y=20第6章 函数6.1 函数的定义和调用6.1.2 函数调用一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。4函数调用方式函数有以下三种调用方式:(1)函数语句:把函数调用作为一个语句,例如:sort();这时不要求函数带回值,只要求函数完成一定的操作。(2)函数表达式:函数出现在一表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的计算。例如:c=2*max(a,b);(3)函数参数。函数调用作为一个函数的实参。例如:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。第6章 函数6.1 函数的定义和调用6.1.3 函数声明 调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。例:#includemain() int a,b,c; int max(int,int); /*对max函数进行声明*/ scanf(%d%d,&a,&b); c=max(a,b); printf(max=%d,c); int max(int x,int y) int z; z=xy?x:y; return(z); 第6章 函数6.1 函数的定义和调用6.1.3 函数声明函数声明有以下三种形式:(1)类型名 函数名(类型1 形参1,类型2 形参2,类型n 形参n);(2)类型名 函数名(类型1,类型2,类型n);(3)类型名 函数名();其中,形式(2)是最常用的一种声明形式。第6章 函数6.1 函数的定义和调用6.1.3 函数声明对被调用函数的声明,在以下几种情况下可以省略:(1)如果函数值是整型或字符型,可以不进行声明。例:#includemain() int a,b,c; scanf(%d%d,&a,&b); c=max(a,b); printf(max=%d,c);int max(int x,int y) int z; z=xy?x:y; return(z); 第6章 函数6.1 函数的定义和调用6.1.3 函数声明对被调用函数的声明,在以下几种情况下可以省略:(2)如果被调用函数的定义出现在主调函数之前,可以不声明。例:int max(int x,int y) int z; z=xy?x:y; return(z);#includemain() int a,b,c; scanf(%d%d,&a,&b); c=max(a,b); printf(max=%d,c);第6章 函数6.1 函数的定义和调用6.1.3 函数声明对被调用函数的声明,在以下几种情况下可以省略:(3)如果在所有函数定义之前对函数类型进行了声明,则在各个主调函数中不再进行声明。例:int max(int,int);#includemain() int a,b,c; scanf(%d%d,&a,&b); c=max(a,b); printf(max=%d,c); int max(int x,int y) int z; z=xy?x:y; return(z);第6章 函数6.2 函数的嵌套调用和递归调用6.2.1 函数的嵌套调用 所谓函数的嵌套调用是指一个函数调用另一函数的过程中又出现对其他函数的调用。函数嵌套调用的调用结构如图所示:第6章 函数6.2 函数的嵌套调用和递归调用6.2.1 函数的嵌套调用例:fun1(int a,int b) int c; a+=a;b+=b; c=fun2(a,b); return c*c;fun2(int a,int b) int c; c=a*b%3; return c;main() int x=11,y=19; printf(%dn,fun1(x,y);注意:函数的调用可以嵌套,但函数的定义是平行的、相互独立的,不能嵌套定义。第6章 函数6.2 函数的嵌套调用和递归调用6.2.2 函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 其调用结构如图所示。第6章 函数6.2 函数的嵌套调用和递归调用6.2.2 函数的递归调用递归函数的执行包括递推和回归两个过程。例:求 t=n!int f (int n) int t; if(n=1|n=0) t=1; else t=n*f (n-1); return t;main() int n,t; scanf(“%d”,&n); t=f (n); printf(%d!=%dn,n,t); 递推: 回归:第6章 函数6.3 变量的作用域及存储类别6.3.1 局部变量与全局变量1局部变量 局部变量是在一个函数内部定义的变量,它只在本函数范围内有效。例: fun1(int a,int b) int c; a+=a;b+=b; c=fun2(a,b); printf(%d,%dn, a,b); return c; fun2(int a,int b) int x; a+=a; b+=b; int a=1; a=a+b; x=a+b; printf(%d, %d,%dn, a,b,x); return x; main() int x=11,y=19; printf(%dn, fun1(x,y); printf(%d,%dn, x,y);程序运行结果如下:44,76,12022,3812011,19第6章 函数6.3 变量的作用域及存储类别6.3.1 局部变量与全局变量1局部变量说明:(1)主函数main中定义的变量也是局部变量,也只在主函数中有效。(2)形式参数也是局部变量,其他函数不能调用。(3)可以在一个函数内部的复合语句中定义变量,这些变量只在复合语句中有效。(4)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。第6章 函数6.3 变量的作用域及存储类别6.3.1 局部变量与全局变量2全局变量全局变量是在函数之外定义的变量,从定义变量的位置开始到本源文件结束范围内有效。例: int a, b;fun1() int c; a=2;b=3; c=fun2(); printf(%d,%dn, a,b); return c; int x=11,y;fun2() a+=a; b+=b; x=a+b;y=a-b; printf(%d, %d, %d, %dn, a,b,x,y); return x; main() int y=19; printf(%dn,fun1(); printf(%d,%dn, x,y);程序运行结果如下:4,6,10,-24,61010,19第6章 函数6.3 变量的作用域及存储类别6.3.1 局部变量与全局变量2全局变量说明:(1)全局变量可以在函数间传递数据,增加函数间数据联系的渠道。(2)全局变量在程序的整个执行过程中都有效。(3)在同一个源文件中,全局变量与局部变量可以同名,在局部变量的作用范围内,全局变量不起作用。(4)对于全局变量,如果在定义时不进行初始化,则系统将自动赋予其初值,对数值型变量赋0,对字符型赋变量0。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量1动态存储方式和静态存储方式(1)动态存储方式。是指在程序运行期间根据需要动态分配存储空间的方式。(2)静态存储方式。是指在程序运行期间分配固定的存储空间的方式。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量2动态变量 以动态存储方式分配的变量称为动态变量,包括所有函数的形式参数、用auto和register声明的局部变量。动态变量一般定义在函数内部(包括定义在函数首部的形式参数),只有当程序进入该函数时才分配存储空间,函数执行完后,变量的存储空间被释放,再次调用该函数时,系统重新分配新的存储空间。 动态变量在未被赋初值时,其值为不能确定的随机值。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量2动态变量(1)用auto声明的局部变量。用auto声明的局部变量又称动态的局部变量。其声明形式如下: auto 变量类型 变量名;其中,auto是可省略项。例:int fun(int a) auto int b,c=3;int fun(int a) int b,c=3;以上定义的b,c都是动态的局部变量。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量2动态变量(2)用register声明的局部变量。用register声明的局部变量又称寄存器变量。寄存器变量的值放在CPU的寄存器中,使用时直接从寄存器取出参加运算,不必再到内存中去存取。为了提高执行效率,把程序中使用频率高的变量定义为寄存器变量。其声明形式如下: register 变量类型 变量名;例:fun1() register int i; for(i=1;i=1000;i+) 说明:(1)只有局部动态变量和形式参数可以说明为寄存器变量。(2)一个计算机系统中的寄存器的数目是有限的。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量3静态变量 以静态存储方式分配的变量称为静态变量,包括所有的全局变量和用static声明的局部变量。动态变量可以定义在函数外部(如:全局变量),也可以定义在函数内部(如用static声明的局部变量),静态变量在程序执行过程中占有固定的存储空间,只在程序执行结束时释放占用的存储单元。 静态变量在未被赋初值时,其值为0。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量3静态变量(1)用static声明的局部变量。用static声明的局部变量又称静态的局部变量。其声明形式如下: static 变量类型 变量名; 静态局部变量的作用域仍然是变量定义所在的函数,即只有当程序进入该函数时,这些变量才可以使用,离开该函数后就不能使用这些变量了,但不能使用并不代表这些变量不存在,静态局部变量在程序第一次进入定义所在函数时被分配存储空间,函数执行完(所在程序并没有执行完)后,变量的存储空间不释放,再次调用该函数时,变量继续使用所占的存储空间,并保持上次调用所得到的结果。第6章 函数6.3 变量的作用域及存储类别6.3.2 动态变量与静态变量3静态变量(1)用static声明的局部变量。例: int fun(int a) auto int b=0; static c=3; b+;c+; return(a+b+c);main() int a=2; int i; for(i=0;ib?a:b);正确答案:double max(知识点:函数的声明)试题分析:当被调用的函数定义处在函数调用后且不为int类型时,在函数调用前必须对被调用函数进行声明。对函数进行声明有下列三种形式:(1)类型名 函数名(类型1 形参1,类型2 形参2,类型n 形参n);(2)类型名 函数名(类型1,类型2,类型n);(3)类型名 函数名();第6章 函数6.6 典型试题详解4以下程序的输出结果是_。t(int x,int y,int cp,int dp) cp=x*x+y*y; dp=x*x-y*y; main() int a=4,b=3,c=5,d=6; t(a,b,c,d); printf(%d %d n,c,d); 正确答案:5 6(知识点:函数的调用、参数传递)试题分析:当执行t(a,b,c,d);调用函数t时,将实参a、b、c、d的值传递给形参x、y、cp、dp,在函数t中对cp、dp进行计算,改变了形参cp、dp的值,但并没有改变对应实参c、d的值(即形参的值不带回给实参),因此返回后,实参c、d的值不变。第6章 函数6.6 典型试题详解5有以下函数定义: void fun(int n,double x) 若以下选项中的变量都已经正确定义且赋值,则对函数fun的正确调用语句是_。A)fun(int y,double m); B)k=fun(10,12.5); C)fun(x,n); D)void fun(n,x);正确答案:C(知识点:函数的调用)试题分析:当函数类型为void时,函数不返回值,函数调用只能以函数语句的形式出现,因此,选项B显然是不对的。在函数调用时,只须给出函数名和实际参数,不能再给出函数类型和参数类型,所以选项A和选项D都不对。正确的选项是C。第6章 函数6.6 典型试题详解6有以下程序:int f(int n) if(n= =1) return 1; else return f(n-1)+1;main() int i,j=0; for(i=1;i1)主函数中j的值是f(1)与f(2)之和,显然,f(1)=1,f(2)=2,因此,j的值为3。正确答案:B(知识点:函数的递归调用)试题分析:在函数f中有return f(n-1)+1,因此,此函数调用为递归调用。递归函数f的功能可用递归式表示如下:第6章 函数6.6 典
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。