




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/C+C/C+程序设计程序设计 8.1 函 数 C程序是结构化很强的程序,将程序按功能自上 向下分解,一个函数实现一个功能模块。 1.一个C程序可以由若干个源文件组成。 2.一个源文件可以由若干个函数组成。 3.在组成C程序的所有函数中,有且仅有一个主函 数main( ),位置任意(在哪个源文件中都可以 ),但程序的运行总是从主函数开始。 4.组成C程序的各个函数均彼此平行,独立定义, 可以嵌套调用。 函数的类型可按不同的方法分类如下: 从用户的角度 标准函数(库函数) 用户定义函数 从函数的任务 完成某种运算 实现某种处理(并无计算返回值) 从函数的形式 有参函数 无参函数 8.1.1 函数的定义 1、一般函数 格式:类型 函数名(形参表) 声明语句 执行语句 2、空函数:无内容等待添加。有时候需要这 样 8.1.2 函数的参数与返回值 函数的参数 形参与实参 编译时,系统不为形参分配存储空间,函数 调用时,临时分配,调用结束,空间释放。 实参在主调函数内部定义,可以是常量,变 量或表达式,但必须有值,调用被调函数时 ,将其值传给形参。 函数调用与返回 函数调用分两种形式: 1、无返回值(或不关心返回值) 2、有返回值。 3、返回语句return 1 格式:return 表达式 ; 2 功能:将表达式的值带回主调函数。 3 说明:如果没有返回值,可以不写表达式 , 语句为return ,或不写语句。 函数调用格式: 函数名(实参表) 主调函数使用被调函数时,通常得到一个结果(一 个值),称为函数的返回值。 8.1.3 函数的声明 格式:类型 函数名(参数表) 对变量应先定义,再使用;对函数,主调 函数使用被调函数之前,要对被调函数做 声明。 参数传递 相当于赋值。 值传递 地址传递 例子 1、任意从键盘输入一个三位整数,要求 正确地分离出它的个位、十位和百位数, 并分别在屏幕上输出。 2、比较两个数的大小。 3、将百分制转化为五级制。 4、输入一个年份进行判断是否闰年。 5、计算1+2+3+100的值。 6、计算任意输入整数的阶乘。 7、求1!+2!+10!的值。 8、求1到100以内的素数。 例子 9、用*打印一个等腰三角形。 10、在一维数组中找出值最小的元素,并 将其值与第1个元素的值对调。 11、将一维数组由小到大排序。 12、将两个已知整数进行交换。 8.1.4 递归调用 函数的嵌套: 1. 被调函数在调用过程中,调用其他函数称 为函数的嵌套调用。 2. 函数可以嵌套调用,不允许嵌套定义。 函数的递归: 自己调用自己。 阶乘 汉诺塔 汉诺塔问题 据说在约十九世纪末欧洲的商店中出售一种智力玩 具,在一块铜板上有三根杆,最左边的杆上自上而 下、由小到大顺序串着由 64 个圆盘构成的塔。 游戏的目的是将最左边杆上的圆盘,借助最右边 的杆,全部移到中间的杆上,条件是一次仅能 移动一个盘,且不允许大盘放在小盘的上面。 6464 片片 初始杆初始杆中间杆中间杆目的杆目的杆 1 1 n n 18,446,744,073,709,551,61518,446,744,073,709,551,615次次 18441844亿亿次。每次亿亿次。每次1 1微秒,需要微秒,需要6060万年万年 步骤 第一步:将问题简化。假设 A杆 上只有 2 个圆 盘,即汉诺塔有 2 层,N2。移动过程如下: 移动方法: 1. 将上面小片移到C杆上。 2. 将下面的大片由A杆移到B杆上。 3. 将C杆上的小片移到B杆上。 第二步,对于一个有 N(N1)个圆盘的汉诺塔 ,将N个圆盘分为两部分:上面的N-1个圆盘和 最下面的N号圆盘。将“上面的N-1个圆盘”看成 一个整体。 第三步,为解决 N 个圆盘的汉诺塔,可按如下 方式进行操作: A杆C C杆杆B杆 将 A杆上面的 N-1 个盘子,借助B杆,移到C杆上; 将 A杆 上剩下的 N号 盘子移到 B杆上; 将 C杆 上的 N-1个 盘子,借助A杆,移到B杆上 汉诺塔算法 把第一步中化简问题的条件作为递归结束条件,将第三 步分析得到的算法作为递归算法。 定义函数 movedisc( n,fromneedle,toneedle,usingneedle) 。将 fromneedle 杆上的 N 个圆盘,借助 usingneedle 杆,移动到 toneedle 杆上。 移动N个圆盘的递归算法描述如下: movedisc ( n,fromneedle,toneedle,usingneedle ) if ( n=1 ) 将 n 号圆盘从 fromneedle 上移到 toneedle上; else movedisc ( n-1,fromneedle,usingneedle,toneedle ) 将 n 号圆盘从 fromneedle 上移到 toneedle上; movedisc ( n-1,usingneedle,toneedle,fromneedle ) 8.1.5 外部函数与内部函数 内部函数:函数仅被本文件内其他函数调 用 外部函数:函数允许其他文件中的函数调 用 8.2 8.2 变量变量的的作用域和作用域和存储类型存储类型 8.2.1 变量的作用域 变量是定义在一个函数内,还是定义在函 数之外,是被一个函数所使用,还是被文 件中多个函数所使用,或被若干个文件( 整个程序)中的所有函数所使用,变量的 值是否允许被其他函数修改。 掌握要点:变量如何定义。 在什么范围内有效。 变量的值能保留多久。 C程序的层次结构 C程序 源文件1 源文件2 源文件3 . 源文件n 预处理命令 函数1 函数2 . 函数n 局部变量 1.在功能函数(或复合语句)内定义。 2.在定义它的函数(或复合语句)内有效。 3.只有当函数被调用时,才有值,函数调用 结束,值不被保留。 4.对其他函数不可见(即不可访问)。 5. 注意:形参为局部变量。 注意:不同函数中的局部变量可以重名 局部变量举例 void f( ) int x=1; int x=2; int x=3; printf(“*%dn”,x); printf(“*%dn”,x); printf(“*%dn”,x); 全局变量 程序的编译单位是源文件(*.cpp),一个源 文件可以包含一个或若干函数,函数内定 义的变量是局部变量,函数外定义的变量 就是外部变量,可为文件内所有函数所共 享。 1.函数外定义。 2.有效范围:从定义开始到本文件结束。 3.所有的函数可以访问,变量值在一个函 数内发生变化,会影响到其它函数-值保 留 。 全局变量说明 (1)全局变量是在编译时分配存储空间 ,自始至终占存储单元。 (2)如果在定义之前使用某全局变量, 用extern说明。 (3) 全局变量的初始化只能有一次,是 在定义时进行。 (4) 同一个源文件中,局部变量与全局 变量同名,在局部变量起作用的范围内, 全局变量不起作用。(局部隐藏全局) 例子1 extern int a; main( ) int I; for(I=1;I=5;I+) +a; printf(”%dn”,a); s ( ) ; int a=10; void s ( ) int a=100; +a; printf(“%dn”, a); 11 101 12 101 13 101 14 101 15 101 例子2 int x=500; main( ) int x=300; f( ); ff( ); printf(“x=%dn”,x); void f ( ) x+=100; printf(“x=%dn”,x); void ff ( ) int x=10; printf(“x=%dn”,x); 8.2.2 变量的存储类型 一、动态与静态变量 变量的作用范围-作用域(可见性)。 变量值保留的期限-生存期。 作用域与生存期 作用域:定义该变量的函数。 生存期:函数调用期间(函数调用时才有 值,调用结束,值消失)。 变量的存储属性 1. 1. 自动自动变量变量 autoauto 凡不定义存储属性的均为自动变量 int a; 等价于 auto int a; float b;等价于 auto float b; 外部变量外部变量 externextern 在函数之外定义的变量,如果在函数内定义 ,需写extern 。 外部变量定义后,分配固定的存储空间。 所有函数都可使用,函数调用结束,值保留 作用域,生存期均为整个程序。 3. 3. 静态变量静态变量 staticstatic (1)静态局部变量 main( ) int i; for(i=1;i=5;i+) f( i ); void f(int j) static int a=100; auto k=1; +k; printf( “%d+%d+%d=%dn”,a,k,j,a+k+j); a+=10; (2) 静态全局变量 运行结果: 100+2+1=103 110+2+2=114 120+2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论