语言十一次课_第1页
语言十一次课_第2页
语言十一次课_第3页
语言十一次课_第4页
语言十一次课_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1请将您的手机铃声

设置为震动

2实验讲义

1、阅读程序P573、修改程序P584、程序填空P59作业3函数的概念函数的定义函数的调用函数的嵌套函数的调用复习回顾4

方式:函数调用时才为形参分配单元,并将实参的值复制到形参单元值传递方式形参与实参占用不同的内存单元单方向传递函数的调用方式

特点:5#include<stdio.h>swap(inta,intb){inttemp;temp=a;a=b;b=temp;}main(){intx=7,y=11;

swap(x,y);printf("x=%d,\ty=%d\n",x,y);}例

值传递方式temp11x:y:

调用之前7a:b:711函数调用7117数据交换调用结束6方式:函数调用时,将数据的存储地址传递给形参特点:地址传递形参与实参占用同样的存储单元“双向”传递函数的调用方式7例

地址传递方式sort(inta[],intn){……}main(){…sort(x,10);….}x[0]x[1]x[2]…x[9]x=&x[0]a[0]a[1]a[2]…a[9]a=&a[0]10936852714123456789108函数的嵌套递归调用变量的作用区域变量的存储类别讲授分为两种:嵌套调用和递归调用9函数的嵌套与递归调用C规定:函数定义不可嵌套,

1、函数的嵌套调用但可以嵌套调用函数main()调用函数a结束a函数b函数调用函数b

——函数嵌套调用的示意图

10【例】计算三个数中最大数与最小数的差。#include<stdio.h>intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){return(max(x,y,z)–min(x,y,z));}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数112、函数递归调用定义:函数直接或间接的调用自身叫函数的递归调用f()调f调f2调f1f1()f2()说明intf(intx){inty,z;……z=f(y);…….return(2*z);}intf1(intx){inty,z;……z=f2(y);…….return(2*z);}intf2(intt){inta,c;……c=f1(a);…….return(3+c);}直接递归间接递归C编译系统对递归函数的自调用次数没有限制

每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出12函数的递归调用特点:1.在函数里调用自身;2.在使用递归策略时,必须有一个明

确的递归结束条件,称为递归出口。有一道这样的题目..,求小明大哥多大?小明大哥,比小明二哥大两岁;小明二哥比小明三哥大两岁;小明三哥比小明大2岁。现在小明10岁,他大哥多大?13longfac(intn){longf;if(n==1)f=1;elsef=n*fac(n-1);return(f);}

1(n=1)n!=

n*(n-1)!(n2)例用递归算法计算n!==14main()调用fac(3)打印fac(3)fac(2)3*fac(2)

⑩例函数的递归调用2*fac(1)fac(1)12*13*26#include"stdio.h"longfac(intn){longf;if(n==1)f=1;elsef=n*fac(n-1);return(f);}voidmain(){intn;longy;scanf("%d",&n);y=fac(n);printf("%ld",y);}15如何使用递归计算斐波那契数列?思考

1(n=1)

Fib(n)=1(n=2)

Fib(n)=Fib(n-1)+Fib(n-2)(n3)1,1,2,3,5,8,13…16#include<stdio.h>Fib(intdata){if(data==0||data==1){returndata;}if(data>1){return(Fib(data-1)+Fib(data-2));

}}intmain(){intdata;printf("pleaseinputdata\n");scanf("%d",&data);data=Fib(data);printf("theresultis%d\n",data);}程序设计内容…变量的属性:变量类型?变量的作用域?变量的存储类别17变量的属性变量类型确定变量的存储长度和运算方式int、float、char、double…例

5/2=5/2.0=22.518变量的属性变量类型确定变量的存储长度和运算方式作用区域确定变量能被有效使用的范围全局变量、局部变量19变量的属性变量类型确定变量的存储长度和运算方式作用区域确定变量能被有效使用的范围确定变量能够生存的时间auto、static、register、extern存储类别20变量的属性变量类型确定变量的存储长度和运算方式作用区域确定变量能被有效使用的范围存储类别确定变量能够生存的时间21局部变量floatf1(inta){intb,c;…….}main(){intm,n;…….}a,b,c有效m,n有效变量的作用域定义:在函数内部和{}内定义的变量22变量的作用域说明:各局部变量只在本函数有效#include"stdio.h"intsum(){inta=100;returnx+a;}voidmain(){intx=10;printf("%d",sum());}errorC2065:'x':undeclaredidentifier局部变量定义:在函数内部和{}内定义的变量23变量的作用域形式参数也是局部变量#include"stdio.h"floatf1(inta){intb,c;…….}main(){….}说明:各局部变量只在本函数有效局部变量定义:在函数内部和{}内定义的变量a,b,c有效24变量的作用域各函数中同名变量是不同对象形式参数也是局部变量说明:各局部变量只在本函数有效局部变量定义:在函数内部和{}内定义的变量总之,在花括号内定义的都是局部变量,形参也是25a:xx#include"stdio.h"sub(){inta;a=6;printf("sub:a=%d\n",a);}main(){inta;a=3;

printf("main:a=%d\n",a);sub();printf("main:a=%d\n",a);}运行结果:main:a=3sub:a=6main:a=3例不同函数中的同名变量3a:xx626变量的作用域可在复合语句中定义有效变量各函数中同名变量是不同对象形式参数也是局部变量说明:各局部变量只在本函数有效局部变量定义:在函数内部和{}内定义的变量27#include"stdio.h"#defineN5main(){inti,a[N]={1,2,3,4,5};for(i=0;i<N/2;i++){

intt;t=a[i];a[i]=a[N-i-1];a[N-i-1]=t;

}for(i=0;i<N;i++)printf("%d\n",a[i]);}例复合语句中定义的变量t有效28下面程序最后是否能打印出t的值?#include"stdio.h"#defineN5main(){inti,a[N]={1,2,3,4,5};for(i=0;i<N/2;i++)

{

intt;t=a[i];a[i]=a[N-i-1];a[N-i-1]=t;

}

printf("%d\n",t);}errorC2065:'t':undeclaredidentifier思考29下面程序最后是否能打印出t的值?#include"stdio.h"#defineN5main(){inti,a[N]={1,2,3,4,5},t=100;for(i=0;i<N/2;i++){intt;t=a[i];a[i]=a[N-i-1];a[N-i-1]=t; }for(i=0;i<N;i++)printf("%d\n",a[i]);printf("%d",t);}思考3031变量的作用域定义:在函数外部定义的变量全局变量#include"stdio.h"inta=3,b=5;max(intx,inty){return(x>y?x:y);}voidmain(){printf("%d",max(a,b));}局部变量定义:在函数内部定义的变量ab有效32作用范围从定义起到文件尾定义:在函数外部定义的变量全局变量变量的作用域说明:#include"stdio.h"intp=1;floatf1(inta){intb,c;

…….}intm=3;main(){…….}p有效m有效33作用范围从定义起到文件尾变量的作用域与局部变量同名时被屏蔽定义:在函数外部定义的变量全局变量说明:34#include"stdio.h"inta=3,b=5;max(intx,inty){intc;c=x>y?x:y;return(c);}main(){inta=8;

printf("%d",max(a,b));}例全局变量与局部变量同名被屏蔽835作用范围从定义起到文件尾变量的作用域与局部变量同名时被屏蔽定义:在函数外部定义的变量全局变量说明:3)未初始化初值为'\0'#include"stdio.h"intc;main(){

printf("%d",c);}036作用范围从定义起到文件尾变量的作用域与局部变量同名时被屏蔽定义:在函数外部定义的变量全局变量说明:3)未初始化初值为‘\0’

4)能够加强函数间数据联系37#include"stdio.h"intx[2]={1,2};voidswap(){intt;t=x[0];x[0]=x[1];x[1]=t;}voidmain(){swap();printf("x[0]=%d,",x[0]);printf("x[1]=%d",x[1]);}例全局变量的优点x[0]x[1]有效38作用范围从定义起到文件尾变量的作用域与局部变量同名时被屏蔽定义:在函数外部定义的变量全局变量说明:3)未初始化初值为"0"

或'\0'4)能够加强函数间数据联系降低程序清晰性,容易出错3940变量的存储类别动态存储程序运行时根据需要动态分配存储空间静态存储程序运行时占据固定的存储空间不释放程序区静态存储区动态存储区形式参数、自动变量全局变量、静态变量41变量的存储类别自动存储#include"stdio.h"voidmain(){autointa,b;a=3;b=5;}定义:auto

类型名局部变量名;inta,b;42说明:函数内定义的局部变量为自动变量变量的存储类别max(intx,inty){intc;c=x>y?x:y;return(c);}自动存储定义:auto

类型名局部变量名;43变量的存储类别变量存储单元随函数的调用而取得#include"stdio.h"max(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){inta=3,b=5,c;c=max(a,b);printf("%d",c);}说明:函数内定义的局部变量为自动变量自动存储定义:auto

类型名局部变量名;max(intx,intyintz44变量的存储类别若变量未被赋值,则其初值不确定#include"stdio.h"voidmain(){intc;printf("%d",c);}变量存储单元随函数的调用而取得说明:函数内定义的局部变量为自动变量自动存储定义:auto

类型名局部变量名;45变量的存储类别寄存器存储定义:register

类型名局部变量名;fun(){registerinti;for(i=1;i<=100;i++)printf("%d",i*i);}46变量的存储类别变量存储单元分配在CPU寄存器中说明:只能定义有限数目的寄存器变量适用于同一变量频繁出现的地方局部静态变量不能定义为寄存器变量寄存器存储定义:register

类型名局部变量名;47变量的存储类别静态存储定义:static

类型名局部变量名;说明:程序执行时静态内部变量始终存在#include"stdio.h"add(){staticintz=0;z++;return(z);}voidmain(){intc;c=add();printf("%d",c);}48变量的存储类别变量仅仅在程序编译时被赋值一次静态存储定义:static

类型名局部变量名;说明:程序执行时静态内部变量始终存在49#include"stdio.h"voidinc(){intx=0;x++;printf("%d",x);}voidmain(){inc();inc();inc();}#include"stdio.h"voidinc(){staticintx=0;x++;printf("%d",x);}voidmain(){inc();inc();inc();}例动态与静态局部变量的区别11112350变量的存储类别变量不初始化自动赋以"0"

或'\0'#include"stdio.h"voidmain(){staticintc;printf("%d",c);}变量仅仅在程序编译时被赋值一次静态存储定义:static

类型名局部变量名;说明:程序执行时静态内部变量始终存在51变量的存储类别定义:extern

类型名全局变量名;说明:变量可被同程序中前面的函数引用#include"stdio.h"voidgx(){externintx;printf("2:x=%d\n",x);}intx;main(){printf("1:x=%d\n",x);x=100;gx();}

温馨提示

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

评论

0/150

提交评论