《c语言与程序设计》第八讲-清华李宛洲_第1页
《c语言与程序设计》第八讲-清华李宛洲_第2页
《c语言与程序设计》第八讲-清华李宛洲_第3页
《c语言与程序设计》第八讲-清华李宛洲_第4页
《c语言与程序设计》第八讲-清华李宛洲_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计基础 2005.9第八讲 函数(二 ) 教学内容l 函数基本概念回顾l 实参是变量与实参是地址的区别l 通过实参地址取得函数返回值l 局部变量与全局变量作用域l 函数与程序结构l 文件结构l 函数调用形式二进制与数据类型变量三要素:名字、地址、字节数输入输出函数数组类型与结构变量逻辑运算if-else结构for()结构C语言生长树程序设计初级阶段while()结构switch()结构功能构件化程序设计基础数据私密化程序大纲化程序风格-函数回顾-函数的基本概念 l 源程序必须有,也只能有一个主函数main;l 程序一定是从main函数开始,最后在 main函数中结束整个程序的运行。

2、l 一个源文件由一个或多个函数组成;l 除去main函数之外,所有函数都是平行的、互相独立的,即在一个函数内只能调用其他函数,不能再定义一个函数(嵌套定义)。l 一个函数可以调用其他函数或其本身,但任何函数均不可调用main函数。int function(int i_p, char ch_a )函数说明、形式参数与实际参数函数说明、形式参数与实际参数l函数的一般形式是类型说明 函数名(参数表)return();l类型说明是C语言中任何一种有效的数据类型关键字,或者是结构类型说明符.函数类型实际上是函数返回值的类型. l函数名是C语言中有效的变量命名。 l参数表可以为空,但必须保留圆括弧。l出现

3、在函数参数表内的参数称之为形式参数,它的作用是说明在调用函数时候,调用程序需要代入函数的参数个数、数据类型.l调用程序在调用函数时候,需要代入函数参数表的参数称之为实际参数。function(i_p, ch_a );函数的三代表:类型、参量、返回值形参的三代表:类型、个数、位置int main()char i,x,s;.主函数存储区域ixs2000200220041000lxs400240044006i4000int search(char *s,char x)char i,l;.函数search()存储区域3000主函数数据区函数search()数据区aabc02004aint search

4、(char *,char );函数形式参数表函数参数表函数调用过程中,主函数变量x的值传递给被调函数变量x函数调用过程中数组s的首地址传递给被调函数变量s形式参数与实际参数的结合形式参数与实际参数的结合什么时候传递变量的值?什么时候传递变量的地址?传递数组地址是为了节省存储空间i=search(s,x);可以理解为调用时,实参向形参赋值x=a;sabc;void example(int x,int y) x=10; y=15;int main(void) int a=2,b=3; example(a,b); cout“a=”a“b=”bendl; return(0);非数组的形参与实参传递特点

5、非数组的形参与实参传递特点在某次运行中分配给主调函数的变量a,b地址同次运行中调用函数example后其内部变量x,y的地址以及传递过来的实参从example返回后变量a,b的地址以及数值不变它们仅是在两个函数之间单向传递数值int main()char i,x,s;.ixs2000200220041000lxa400240044006i4000int search(char *a,char x)char i,l;.3000aabc02004aint search(char *,char );一个接收地址的变量函数调用时,s数组的首地址传递给被调函数内部变量a实参是地址实参是地址i=searc

6、h(s,x);char s10;内存s s2004 2005 2006 2007 2008 2009 2010 20112012 2013s0 s1 s2 s3 s4 s5 s6 s7s8 s9a=s;abc0a a*(a+0)*(a+1)*(a+9)相当于给定了a的首地址操作a就是操作数组bint search(char *s,char); /函数声明,2个形参数:字符型数组,字符int main(void)int i; char s40,x; couts; coutx; i=search(s,x); /实际参数表 if(i0)couti=iendl; else cout没有匹配的字符存在!

7、endl; return(0);int search(char *a,char x) int i,l; l=strlen(a); for (i=0;il;i+)if(x&x=ai)return(i); return(-1);在某次运行中分配给主调函数的变量s,x地址变量a的地址,在这个地址上存储着a的值,就是数组s的地址同次运行中调用函数search后其内部变量a,b的地址以及传递过来的实参void main()char ch_a=a;char ch_b=b;get(&ch_a,&ch_b);ch_ach_b200220041000 xy40044010void get(char *x,cha

8、r *y)3000ac20042002void get(char *,char * );接收地址的变量函数调用时,变量的地址传递给被调函数内部变量通过实参的地址给实参赋值通过实参的地址给实参赋值 get(&ch_a,&ch_b);char ch_a=a,ch_b=c;内存ch_ach_a20022004x=&ch_a;y=&ch_b;ac实参是主调函数内部变量的地址操作x和y就是操作ch_a和ch_b40044010ch_bch_bx xy y20022004*x=x; *y=y;类似scanf(“%c”,&x);scanf()是指向变量的地址xy如何操作地址变量?如何操作地址变量?void

9、f(char *,char *);int main(void) char a,b; f(&a,&b); couta=a;b=bendl; return(0); void f(char *ch_a,char *ch_b) *ch_a=a; *ch_b=A;用间接运算符“*”可以直接给地址变量里的地址单元的内容赋值ch_a和ch_b都是一个地址变量无需return语句也能给主调函数返回变量的值void f(char *ch_a,char *ch_b) scanf(%c,ch_a); fflush(stdin); scanf(%c,ch_b);ch_a代表了什么?char a,b;scanf(“%c

10、”,&a)中,&a是一个地址ch_a是(地址)变量,它的值是变量a的地址,我们称ch_a是指向一个地址为ch_a的值的指针(变量)指针的由来a a2002200440044010b bch_ach_b20022004aA&b&a*ch_a=a*ch_b=A获得地址获得地址操作实参地址得到函数的返回值操作实参地址得到函数的返回值int main(void) int i,j;input(&i,&j);printf(i+j=%dn,add(i,j);return(0);int add(int a,int b) return(a+b);void input(int *m,int *n)printf(输

11、入m和n:n); scanf(%d %d,m,n);实参数是地址 给该地址所代表的存储单元赋值i20002002.j00m40002000n20024002&i&jscanf(%d %d,m,n);*m=10;10*n=20;20函数与程序结构函数与程序结构int main(void) char c020,p020,p120,p220,p320,p420; input(p0,p1,p2,p3,p4); /输入5个单词 bubble(c0,p0,p1,p2,p3,p4);/p0至p4中的最小者赋给c0 coutc00 ? strcpy(c,b):strcpy(c,a);void set(char

12、 c0,char p0,char p1,char p2,char p3,char p4)if(FindMin(c0,p0);else if(FindMin(c0,p1); else if(FindMin(c0,p2);else if(FindMin(c0,p3);else FindMin(c0,p4);int FindMin(char a,char b)if(strcmpi(a,b)=0)strcpy(b,zzzzzzzzzzzz);return(1); return(0); bubble(c0,p0,p1,p2,p3,p4);/p0至p4中的次小者赋给c0 coutc0endl; bubbl

13、e(c0,p0,p1,p2,p3,p4);/p0至p4中的中间者赋给c0 coutc0endl; bubble(c0,p0,p1,p2,p3,p4);/p0至p4中的倒数2者赋给c0 coutc0endl; bubble(c0,p0,p1,p2,p3,p4);/p0至p4中的最大者赋给c0 coutc0endl; return(0); 功能构件,相同的操作函数化,标准使用数据私密,只能通过参数传递改变数据程序大纲化,函数给出算法过程的标题int main(void) char c020,p020,p120,p220,p320,p420; input(p0,p1,p2,p3,p4); /输入5个

14、单词 int i=0; while(i5)bubble(c0,p0,p1,p2,p3,p4);/p0至p4中的最小者赋给c0 coutc0endl;i+;return(0); 标准函数的多次调用方法,或者说算法函数化;程序结构化;这就是程序设计风格与方法全局变量与局部变量的关系全局变量与局部变量的关系 l全局变量也称为外部变量,是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。l全局变量作用域是整个源程序。一个源程序可以有多个文件。l在函数中使用全局变量应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。l但在一个函数之前定义的全局变量,

15、在该函数内使用可不再加以说明。 l在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。 l因为函数的数据存储区域是临时性的。因此,局部变量不能在函数调用之间保存其值。l全局变量在整个项目工作期间都占有固定的存储区域。因此各个函数可以修改或存储全局变量。全局变量的作用域全局变量的作用域 l全局变量也称为外部变量,它是在函数外部定义的变量。l它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。 l一个函数之前定义的全局变量,在该函数内使用不需再加以说明。 void f1(int); void f2(int,int);int ext;/定义一个全局变量in

16、t main(void) int i=1; printf(输入一个整数:); scanf(%d,&ext); f1(i); return(0); void f1(int j) int i=2; f2(j,i);void f2(int k,int j)int i=3;printf(main的i=%d,f1的i=%d,f2的i=%d,ext=%dn,k,j,i,ext);全局变量在所有函数内都有效既然ext作用域在整个程序内有效,是否可以在任意一个函数内改变ext的值?void f2(int k,int j)int i=3;printf(main的i=%d, f1的i=%d,f2的i=%d,ext

17、=%dn,k,j,i,ext); ext=20;printf(main的i=%d,f1的i=%d,f2的i=%d,ext=%dn,k,j,i,ext);在任意一个函数内,可以像使用局部变量一样操作全局变量.主函数 函数a函数b主函数函数a函数b项目1程序项目2程序硬盘空间项目1分配内存项目2分配内存有限的内存主函数主函数变量区函数a函数a变量区函数b函数b变量区它保留程序运行调度的基本信息以及全局变量全局变量存在于项目的常驻内存区全局变量存在于项目的常驻内存区项目1常驻数据区项目2常驻数据区全局变量与各个函数激活期无关,变量一直存储在内存#includeint h=10;void main()

18、int h=20;printf(h=%d,是函数内部的变量n,h);内外变量同名在函数内部有和全局变量同名的变量,仅是函数内部变量有效函数内变量与全局变量同名的时候函数内变量与全局变量同名的时候 extern int vs(int,int);extern void myprint(int);extern int l,w,h; void main(void)int l=5; l=vs(l,w); myprint(l);#include void myprint(int v)printf(v=%dn,v);int vs(int l,int w) extern int h; int v; v=l*w*h; return v;int l=3,w=4,h=5;说明一个外部函数,存在于其它文件之中说明三个外部变量存在于其它文件之中 与普通函数一样的使用这就是程序结构!主函数、功能函数、数据区用不同的文件分开为什么v不是60?内部变量l优先函数调用形式函数调用形式函数调用形式赋值 表达式中 如:c=max(x,y); 执行函数 如:c=1+max(x,y); printf(“Max=%dn”,max(x,y);如:max(x,y);参数值返回形式返回单个变量返回多个变量 用return()语句 用地址。通过参数表得到

温馨提示

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

评论

0/150

提交评论