




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
7.1函数概述7.2函数的声明7.3函数定义和函数调用7.4程序举例7.5函数的嵌套调用和递归调用7.6变量的作用域7.7变量的存储类别7.1函数概述模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块。特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之【例7.1】
计算5!+6!+7!并输出结果。#include<stdio.h>main(){ inti,t,num1=5,num2=6,num3=7,sum=0;
for(i=1,t=1;i<=num1;i++) t=t*i; sum=sum+t;
for(i=1,t=1;i<=num2;i++) t=t*i; sum=sum+t; for(i=1,t=1;i<=num3;i++)
t=t*i; sum=sum+t; printf("5!+6!+7!=%d\n",sum);}出现重复#include<stdio.h>intfac(intnum); main(){ intt1,t2,t3,sum=0;
t1=fac(5); t2=fac(6); t3=fac(7); sum=t1+t2+t3; printf("5!+6!+7!=%d\n",sum);}intfac(intnum) /*定义fac函数,num是形参*/{ inti,t; for(i=1,t=1;i<=num;i++) t=t*i; returnt; /*函数的返回值*/}7.2函数的声明函数声明的一般形式如下:类型标识符函数名(类型形参名1,类型形参名2,…);或类型标识符函数名(类型,类型,…);#include<stdio.h>intfac(intnum);/*对函数fac的声明语句*/main(){ ...}7.3函数定义和函数调用函数类型函数名(形参类型说明表){
说明部分 语句部分}函数定义:函数的调用调用形式
函数名(实参表);说明:实参与形参个数相等,类型一致,按顺序一一对应实参表求值顺序,因系统而定#include<stdio.h>intmax(inta,intb);/*函数原型的声明*/intmain(){ intx,y,z; printf("inputtwonumbers:\n"); scanf("%d%d",&x,&y);
z=max(x,y);/*函数的调用语句*/
printf("maxmum=%d",z); return0;}/*以下是函数的定义部分*/intmax(inta,intb){ if(a>b)returna; elsereturnb;}实参形参7.5函数的嵌套调用和递归调用7.5.1嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数例7.7输入两个整数,输出较大值的函数调用过程如下图所示。7.5.2函数的递归调用递归是一种特殊的解决问题的方法。其基本思想是:将要解决的问题分解成比原问题规模小的类似子问题,而解决这个类似子问题时,又可以用到原有问题的解决方法,按照这一原则,逐步递推转化下去,最终将原问题转化成较小且有已知解的子问题。(1)递推阶段:将原问题不断地转化成子问题,逐渐从未知向已知推进,最终到达已知解的问题,递推阶段结束。(2)回归阶段:从已知解的问题出发,按照递推的逆过程,逐一求值回归,最后到达递归的开始处,结束回归阶段,获得问题的解。例如:求5!递推阶段5!=5×4!→4!=4×3!→3!=3×2!→2!=2×1!→1!停止,其中1!=1回归阶段5!=5×4!=120←4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1例:有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大。
age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10用数学公式表述如下:age(n)=10(n=1)age(n-1)+2(n>1)age(5)
c=age(4)+2;
returnc;age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}递归过程跟踪分析:age(4)
c=age(3)+2;
returnc;age(3)
c=age(2)+2;
returnc;age(2)
c=age(1)+2;
returnc;age(1)
c=10
returnc;c=10c=12c=14c=16c=187.6变量的作用域7.6.1局部变量1、定义:在一个函数(或复合语句)内部定义的变量。
2、作用域:本函数(或复合语句)
它只在本函数范围(或复合语句)内有效,也就是说只有在本函数(或复合语句)内才能使用它们,在此函数以外是不能使用这些变量的。floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效3、说明(1)形式参数是局部变量。如f1中形参a,出了f1函数就无效。(2)main中定义的变量只在main中有效,也是局部变量。不能因为在main函数中定义就在整个文件或程序中有效。main函数也不能使用其它函数中定义的变量。例不同函数中同名变量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=43、说明(3)不同函数中的同名变量,占有不同内存单元,因此不会相互影响3、说明(4)复合语句中的变量运行结果:54321例复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}变量temp只在本复合语句中有效,离开该复合语句就无效,释放内存。1、定义:在所有函数外部定义的变量。全局变量可以为本文件中其他函数所共用。2、作用域:从定义变量的位置开始到本源文件结束,及有
extern说明的其它源文件。7.6.2全局变量3、说明:(1)有效范围:从定义或有extern声明的位置开始,直至它所在源程序文件的结束。intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围3、说明:
(2)若外部变量与局部变量同名,则外部变量被屏蔽inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}例外部变量与局部变量运行结果:max=8内存…….main(){inta;a=10;printf(“%d”,a);}编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。7.7变量的存储类别静态变量:存储在静态存储区的变量。在程序运行期间分配固定的存储空间不释放生存期:从程序开始执行到程序结束动态变量:存储在动态区的变量。在程序运行期间根据需要临时分配存储空间,离开即释放生存期:从包含该变量定义的函数开始执行至函数执行结束存储类别:指变量、函数等存储的方式和位置存储器类型:寄存器、静态存储区、动态存储区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等变量的存储类型auto-----自动型register-----寄存器型static------静态型extern-----外部型变量定义格式:[存储类型]数据类型变量表;如:intsum;
autointa,b,c;
registerinti;
staticfloatx,y;auto(自动)变量没有声明为static的局部变量都属于此类。如:函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)。存储特性:存储在动态存储区。调用时自动动态分配存储空间。调用结束后自动释放存储空间。例如:
intf(inta)/*定义f函数,a为形参*/
{autointb,c=3;/*定义b、c为自动变量*/
…
}执行完f后,自动释放a、b、c所占的内存。
autointb,c=3和intb,c=3等价。register(寄存器)变量只有auto变量与形式参数可以作为register变量register变量和auto变量不同之处在于register变量存放在CPU的寄存器中,因此比auto变量存取速度快。通常将频繁使用的变量放在寄存器中,以提高程序执行速度不能对寄存器变量使用取地址运算符&计算机中寄存器的数量是有限的,而且寄存器的数据长度也是有限的。因此register变量不能定义太多,也不能是数据类型太大的变量(long、float、double型)目前register变量定义通常是不必要的,优化的编译系统能够识别使用频繁的变量,并将其放到寄存器中static(静态)变量static变量存放在内存的静态存储区,在整个程序运行期间占用固定的内存单元。可以修饰局部变量和全局变量。系统在编译时为static变量分配空间并赋初值,对未赋值的局部static数值型变量,系统自动给它赋值为0;对未赋值的局部static字符型变量,自动赋值为空字符。因为在编译时赋初值,所以只能赋一次初值且只能在定义时进行。由于变量占用的存储单元不消失,再次调用static局部变量时,static局部变量的值为上次调用结束时的值。注意:static局部变量的生存期是整个程序运行期间,但作用域仍然是定义该变量的函数体(或复合语句)内部。即:静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。static修饰全局变量,将使全局变量作用域局限于本文件内。main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}练习局部静态变量值具有可继承性运行结果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}运行结果:123#include<stdio.h>voidmain(){
intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));
}
intf(inta){autointb=0;
intc=3;
b=b+1;
c=c+1;return(a+b+c);}考察静态局部变量的值。#include<stdio.h>voidmain(){
intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));
}
intf(inta){autointb=0;
staticintc=3;
b=b+1;
c=c+1;return(a+b+c);}结果:7,8,9b、c是自动变量,函数调用结束后,b、c的存储空间释放。再一次调用,b、c重新赋值。c是静态局部变量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮合作合同
- 工程装修合同补充协议
- 合同和协议合同协议书
- 济南护理职业学院《植物学实验》2023-2024学年第二学期期末试卷
- 辽宁城市建设职业技术学院《服装色彩学》2023-2024学年第二学期期末试卷
- 天津师范大学津沽学院《光电子电路设计》2023-2024学年第二学期期末试卷
- 重庆安全技术职业学院《生活适应的设计与教学》2023-2024学年第二学期期末试卷
- 上海健康医学院《中小学数学课程标准与教材研究》2023-2024学年第二学期期末试卷
- 辽源职业技术学院《基础写作(一)》2023-2024学年第二学期期末试卷
- 黄河交通学院《自动化专业技能训练》2023-2024学年第二学期期末试卷
- 2022输变电工程建设安全管理规定
- 备课专业化读书分享课件
- 《爆破作业单位许可证》申请表
- 人教版二年级数学下册教材分析
- 市政道路雨、污水管道工程施工技术课件
- 全册(教学设计)-苏教版劳动六年级下册
- 【浅谈小学英语教学中的德育渗透3800字(论文)】
- 尺寸链的计算表格
- 夏玉米套种辣椒技术
- 2023年江苏省南京市市场监督管理局所属事业单位招聘5人(共500题含答案解析)笔试历年难、易错考点试题含答案附详解
- DB6101T 197-2022 藤蔓类尾菜堆肥技术规程
评论
0/150
提交评论