C面向对象程序设计谭浩强实用教案

上传人:莉**** 文档编号:78736262 上传时间:2022-04-22 格式:PPT 页数:122 大小:3.94MB
收藏 版权申诉 举报 下载
C面向对象程序设计谭浩强实用教案_第1页
第1页 / 共122页
C面向对象程序设计谭浩强实用教案_第2页
第2页 / 共122页
C面向对象程序设计谭浩强实用教案_第3页
第3页 / 共122页
资源描述:

《C面向对象程序设计谭浩强实用教案》由会员分享,可在线阅读,更多相关《C面向对象程序设计谭浩强实用教案(122页珍藏版)》请在装配图网上搜索。

1、概述(i sh)函数是程序代码的一个自包含(bohn)单元,用于完成某一特定的任务。C+是由函数(hnsh)构成的,函数(hnsh)是C+的基本模块。有的函数完成某一操作;有的函数计算出一个值。通常,一个函数即能完成某一特定操作,又能计算数值。第1页/共121页第一页,共122页。为什么要使用(shyng)函数?1、避免重复(chngf)的编程。2、使程序更加模块化,便于阅读、修改。参数(多个)函数值(唯一)函数体所编写的函数应尽量少与主调函数发生联系,这样便于(biny)移植。第2页/共121页第二页,共122页。说明(shumng):1、一个源程序文件(wnjin)由一个或多个函数组成,编

2、译程序以文件(wnjin)而不是以函数为单位进行编译的。2、一个程序(chngx)可以由多个源文件组成,可以分别编译,统一执行。3、一个程序必须有且只有一个main( )函数,C+从main( )函数开始执行。4、C+语言中,所有函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。5、从使用角度来说,分标准函数和用户自定义函数;从形式来说,分无参函数和有参函数。第3页/共121页第三页,共122页。库函数是C+编译系统已预定义的函数,用户根据需要可以直接使用这类函数。库函数也称为(chn wi)标准函数。为了方便用户进行程序设计,C+把一些常用数学计算函数(如sqrt()

3、、exp()等)、字符串处理函数、标准输入输出函数等,都作为库函数提供给用户,用户可以直接使用系统提供的库函数。库函数有很多个,当用户使用任一库函数时,在程序中必须包含相应的头文件。 如 #include等。第4页/共121页第四页,共122页。用户在设计程序时,可以将完成某一相对独立功能(gngnng)的程序定义为一个函数。用户在程序中,根据应用的需要,由用户自己定义函数,这类函数称为用户自定义的函数。 根据定义函数或调用(dioyng)时是否要给出参数,又可将函数分为:无参函数和有参函数。 第5页/共121页第五页,共122页。函数(hnsh)定义的一般形式一、无参函数(hnsh)主调(z

4、h dio)函数并不将数据传给被调函数。类型说明 函数名(void) 函数体 无参函数主要用于完成某一操作。不传递参数参数(多个)函数值(唯一)函数体第6页/共121页第六页,共122页。void main(void ) printstar ( ); print_message ( ); printstar( );void printstar (void ) cout“* * * * * * * * * * *n”; void print_message (void) couty)? x : y ; return z; void main (void ) int a,b,c; cinab; c

5、=max (a , b) ; cout“The max is” cy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ; cout“The max is” cy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a+b , a*b) ; cout“The max is”cendl; 先计算(j sun),后赋值若a为3,b为5,则实参为8, 15,分别(fnbi)送给形参x,y。第13页/共121页第十三页,共122页。说明(s

6、humng):1、在未出现函数调用时,形参并不占内存(ni cn)的存储单元,只有在函数开始调用时,形参才被分配内存(ni cn)单元。调用结束后,形参所占用的内存(ni cn)单元被释放。2、实参对形参变量的传递是“值传递”,即单向传递。在内存(ni cn)中实参、形参分占不同的单元。3、形参只作用于被调函数,可以在别的函数中使用相同的变量名。5a8b实参xy形参58第14页/共121页第十四页,共122页。void fun(int a, int b) a=a*10; b=b+a; coutatbendl;void main(void) int a=2, b=3; fun(a,b); cou

7、tatbendl;ab23ab23202320 232 3第15页/共121页第十五页,共122页。void fun(int x, int y) x=x*10; y=y+x; coutxtyendl;void main(void) int a=2, b=3; fun(a+b,a*b); coutatby) return x ; else return y; 若函数体内没有return语句,就一直执行到函数体的末尾(mwi),然后返回到主调函数的调用处。先计算(j sun),后返回可以有多个(du )return语句第19页/共121页第十九页,共122页。不带返回值的函数(hnsh)可说明为v

8、oid型。函数的类型(lixng)与函数参数的类型(lixng)没有关系。double blink ( int a, int b)如果函数(hnsh)的类型和return表达式中的类型不一致,则以函数(hnsh)的类型为准。函数(hnsh)的类型决定返回值的类型。对数值型数据,可以自动进行类型转换。 既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。 int max (float a, float b) / 函数值为整型 函数返回值的类型,也是函数的类型第20页/共121页第二十页,共122页。参数(多个)函数值(唯一)函数体int max ( int a,

9、 int b) int z; z=xy?x:y; return z; 如果(rgu)有函数返回值,返回值就是函数值,必须惟一。如果有函数(hnsh)返回值, 函数(hnsh)的类型就是返回值的类型函数体的类型(lixng)、形式参数的类型(lixng)必须在函数的定义中体现出来。第21页/共121页第二十一页,共122页。函数(hnsh)的调用函数调用的一般(ybn)形式函数(hnsh)名(实参列表);形参与实参类型相同,一一对应。 i=2; f (i, +i);函数调用的方式作为语句 printstar( );作为表达式 c=max (a,b);作为另一个函数的参数 coutmax (a,b

10、);实际调用: f (3, 3);第22页/共121页第二十二页,共122页。1) 被调用的函数必须(bx)是已存在的函数2) 如果使用(shyng)库函数,必须用 #include 在一个函数中调用另一函数(即被调用函数)需要(xyo)(xyo)具备哪些条件呢?3) 函数调用遵循先定义、后调用的原则,即被调函数应出现在主调函数之前。第23页/共121页第二十三页,共122页。float max(float x, float y) float z; z=(xy)? x : y ; return z; void main (void) float a,b, c; cinab; c=max (a+

11、b , a*b) ; cout“The max is”cy)? x : y ; return z; void main (void) float a,b, c; float max (float,float); cinab; c=max (a,b) ; cout“The max is”cendl; 函数(hnsh)原型说明函数(hnsh)定义定义是一个完整的函数单位,而原型说明仅仅(jnjn)是说明函数的返回值及形参的类型。第26页/共121页第二十六页,共122页。void main(void) int i=2, x=5, j=7; void fun(int,int); fun ( j, 6

12、); coutit jt xendl;void fun ( int i, int j) int x=7; coutit jtxendl;2i5x7j676jxi7输出(shch): 7 6 7 2 7 5 第27页/共121页第二十七页,共122页。void main(void ) int x=2,y=3, z=0;void add(int,int,int); cout“(1) x=“x“ y=“y“ z=“zendl; add (x, y, z); cout (“(3) x=“x“ y=“y“ z=“zendl;void add ( int x, int y, int z) z=x+y; x

13、=x*x; y=y*y; cout(“(2) x=“x“ y=“y“ z=“zx; y=f1(x); cout“x=“x“ , y=“y0.00001); return s;void main(void) float x; cinx; cout“s=“fun(x)endl;第32页/共121页第三十二页,共122页。计算100200之间的素数,用函数(hnsh)prime( )判断一个数是否是素数,若是该函数(hnsh)返回1,否则返回0。void main(void) for(int i=100;i=200; i+) if(prime(i)=1) coutit; int prime(int

14、x)for(int i=2;ixy; coutgys(x,y)endl;int gys(int a, int b) int r; if(axyz; coutgys(x,y,z)endl;int gys(int a, int b,int c) int r; if(ac?r:c; for(int i=r-1;i=1;i-) if(a%i=0&b%i=0&c%i=0) break; return i; 第35页/共121页第三十五页,共122页。写一个函数验证哥德巴赫猜想;一个不小于6 6的偶数可以表示(biosh)(biosh)为两个素数之和,如6=3+3, 6=3+3, 8=3+5, 10=3+

15、78=3+5, 10=3+7。在主函数中输入一个不小于6 6的偶数n n,函数中输出以下形式的结果34=3+31 34=3+31 第36页/共121页第三十六页,共122页。函数(hnsh)的嵌套调用C语言中,所有(suyu)函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。int max ( int a, int b) int c; int min ( int a, int b) return ( ab? a : b); int max ( int a, int b) int c; c=min(a,b); return ( ab? a : b); int min (

16、int a, int b) return ( ab? a: b);嵌套定义(dngy)嵌套调用平行定义第37页/共121页第三十七页,共122页。调用(dioyng) b 函数a 函数b 函数main 函数调用 a 函数结束(2)(3)(4)(5)(6)(7)(8)(9)在main函数(hnsh)中调用a函数(hnsh),在a函数(hnsh)中又调用b函数(hnsh)。第38页/共121页第三十八页,共122页。kkkknnkf.321),(int power(int m,int n)/mnint i,product=m;for(i=1;in;i+)product=product*m;retu

17、rn product;int sum_of_power(int k,int n) /nk的累加和int i,sum=0;for(i=1;ikm;coutf(k,m)=sum_of_power(k,m)1int age ( int n ) int c; c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)endl;int age ( int n ) int c; if (n= =1) c=10; else c=age(n-1)+2; return c;必须有递归结束(jish)条件第41页/共121页第四十一页,共122页

18、。int age ( int n ) int c; if (n= =1) c=10; else c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)1float fac (int n) float y; if (n= =0)| (n= =1) y=1; else y=n*fac(n-1); return y;void main (void) float y; int n; coutn ; coutn“!=”fac(n)endl;fac (5)n=5y=5*fac (4)fac (4)n=4y=4*fac (3)fac (

19、3)n=3y=3*fac (2)fac (2)n=2y=2*fac (1)fac (1)n=1y=1return yreturn yy=2return yy=6return yy=24return yy=120第43页/共121页第四十三页,共122页。int sub(int);void main (void) int i=5; coutsub(i)i; f(i);void f(int n )if(n= =0) return; else coutn%10; f(n/10); coutn%10; return; f(1234)coutn%10f(n/10)f (123)coutn%10f(n/1

20、0)f(12)coutn%10f(n/10)f(1)coutn%10f (n/10)f(0)n=0returncoutn%10returncoutn%10returncoutn%10returncoutn%10return4321123443211234输入(shr):1234第45页/共121页第四十五页,共122页。void recur(char c) coutc; if(c5) recur(c+1); cout=10) f(n/10); coutnendl;void main(void) f(12345);112123123412345第47页/共121页第四十七页,共122页。作用域和

21、存储(cn ch)类作用域是指程序中所说明的标识符在哪一个区间内有效,即在哪一个区间内可以使用或引用该标识符。在C+中,作用域共分为五类:块作用域、文件作用域、函数(hnsh)原型作用域、函数(hnsh)作用域和类的作用域。 第48页/共121页第四十八页,共122页。块作用域块作用域我们把用花括号括起来的一部分程序称为我们把用花括号括起来的一部分程序称为(chn wi)一个块。在块内说明的标识符,只能在该块内引用,一个块。在块内说明的标识符,只能在该块内引用,即其作用域在该块内,开始于标识符的说明处,结束即其作用域在该块内,开始于标识符的说明处,结束于块的结尾处。于块的结尾处。 在一个函数(

22、hnsh)内部定义的变量或在一个块中定义的变量称为局部变量。 第49页/共121页第四十九页,共122页。在函数内或复合语句内部(nib)定义的变量,其作用域是从定义的位置起到函数体或复合语句的结束。形参也是局部变量。float f1( int a) int b,c; .float f2( int x, int y) int i, j; .void main(void ) int m, n; .x,y,i,j 有效a,b,c有效m,n有效第50页/共121页第五十页,共122页。主函数main中定义的变量,也只在主函数中有效(yuxio),同样属于局部变量。不同的函数可以使用(shyng)相同

23、名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。void main(void) int x=10; int x=20; coutxendl; coutxendl;2010 x10 x20定义变量(binling)既是在内存中开辟区间第51页/共121页第五十一页,共122页。注意:具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名(tngmng)标识符,即变量名相同,局部更优先。第52页/共121页第五十二页,共122页。void main(void) int a=2, b=3, c=5; coutatbtcendl; int a, b=2; a=b+c; coutatb

24、tcendl; c=a-b; coutatbtcendl; a2b3c5 3 57 2 5ab27-12 3 -1第53页/共121页第五十三页,共122页。void main(void) int a=1,b=2,c=3; +a; c+=+b; int b=4, c; c=b*3; a+=c; cout“first:”atbtcendl; a+=c; cout“second:”atbtcendl; cout“third:”atbtcendl;a=2b=3, c=6b=4c=12a=14a=14,b=4,c=12a=26a=26,b=4,c=12a=26,b=3,c=6第54页/共121页第五十

25、四页,共122页。文件(wnjin)作用域 在函数外定义(dngy)的变量称为全局变量。全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。 其缺省的作用范围是:从定义(dngy)全局变量的位置开始到该源程序文件结束。当在块作用域内的变量与全局变量同名时,局部变量优先。 第55页/共121页第五十五页,共122页。p,q有效int p=1, q=5;float f1( int a) int b,c; .char c1,c2;main( ) int m, n; .a,b,c有效m,n有效c1,c2有效全局变量局部变量全局变量增加了函数间数据联系的渠道,在函数调用时可以(ky)得到多于一

26、个的返回值。第56页/共121页第五十六页,共122页。4int min;int max (int x, int y) int z; min=(xy)? x : y ; return z; void main (void) int a,b,c; cinab; c=max (a , b) ; cout“The max is”cendl; cout“ The min is”minb? a:b; return c;void main(void) int a=8; coutmax(a,b)endl;3a5ba88a5bmax (8,5)输出(shch):8第58页/共121页第五十八页,共122页。i

27、nt x;void cude(void) x=x*x*x ;void main (void) x=5; cude ( ); coutxendl;输出(shch): 125输出(shch): 5int x=5;x为0第59页/共121页第五十九页,共122页。在块作用域内可通过(tnggu)作用域运算符“:”来引用与局部变量同名的全局变量。 #include int i= 100;void main(void) int i , j=50; i=18; /访问局部变量i :i= :i+4; /访问全部(qunb)变量i j= :i+i; /访问全部(qunb)变量i和局部变量j cout”:i=”

28、:in; cout”i=”in; cout”j=”jn;:i=104i=18j=108第60页/共121页第六十页,共122页。函数(hnsh)原型作用域 在函数原型(yunxng)的参数表中说明的标识符所具有的作用域称为函数原型(yunxng)作用域,它从其说明处开始,到函数原型(yunxng)说明的结束处结束。 float tt(int x , float y); /函数tt的原型(yunxng)说明 由于所说明的标识符与该函数的定义及调用无关,所以,可以在函数原型说明中只作参数的类型说明,而省略参量名。 float tt (int , float); 第61页/共121页第六十一页,共1

29、22页。int i=0;int workover(int i) i=(i%i)*(i*i)/(2*i)+4); cout“i=“iendl; return i;int rest (int i) i=i2?5:0; return i;void main(void) int i=5; rest(i/2); cout“i=“iendl; rest(i=i/2); cout“i=“iendl; i= rest(i/2); cout“i=“iendl; workover(i) cout“i=“iendl;i=5i=2i=5i=0i=5第62页/共121页第六十二页,共122页。存储(cn ch)类 外存

30、内存(ni cn)程序(chngx)程序区静态存储区动态存储区存放程序代码存放变量需要区分变量的存储类型第63页/共121页第六十三页,共122页。作用域全局变量局部变量生存期动态存储变量静态存储变量静态存储:在文件运行期间(qjin)有固定的存储空间,直到文件运行结束。动态存储:在程序运行期间根据需要分配存储空间,函数结束后立即释放空间。若一个(y )函数在程序中被调用两次,则每次分配的单元有可能不同。程序区程序区静态存储区静态存储区动态存储区动态存储区全局变量静态(jngti)局部变量动态局部变量第64页/共121页第六十四页,共122页。局部变量的分类(fn li)动态变量(auto):

31、默认(mrn),存储在动态区寄存器变量(register):在cpu内部(nib)存储静态局部变量(static):存储在静态区动态局部变量未被赋值时,其值为随机值。其作用域的函数或复合语句结束时,空间被程序收回。程序执行到静态局部变量时,为其在静态区开辟存储空间,该空间一直被保留,直到程序运行结束。由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为0。第65页/共121页第六十五页,共122页。int fun(int a) int c; static int b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun(x)

32、; coutyendl; y=fun(x+3); coutyendl;x2ya2b3c5455a5只赋一次初值c9599输出(shch):变量b是静态局部变量,在内存一旦开辟空间,就不会(b hu)释放,空间值一直保留第66页/共121页第六十六页,共122页。int f (int a) int b=0; static int c=3; b=b+1; c=c+1; return a+b+c;void main(void) int a=2,i; for (i=0;i3;i+) coutf(a)endl;i=0a=2b=0, b=1c=3, c=4输出(shch):7i=1a=2b=0, b=1c

33、=4, c=5输出(shch):8i=2a=2b=0, b=1c=5, c=6输出(shch):9789只赋一次初值第67页/共121页第六十七页,共122页。int func (int a, int b) static int m=0, i=2; i+=m+1; m=i+a+b; return m; void main(void) int k=4, m=1, p; p=func(k, m); coutpendl; p=func(k, m); coutpendl;func( 4, 1)a=4, b=1m=0, i=2i=3m=3+4+1=8func( 4, 1)a=4, b=1m=8, i=3

34、i=3+8+1=12m=12+4+1=17输出(shch):8,17第68页/共121页第六十八页,共122页。int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; coutq(3)am; c=a*b; couta“*”b“=“cendl; d= power(m); couta“*”m“=“dendl; 文件(wnjin)file2.c中的内容为:extern int a;int power (int n ) int i, y=1; for (i=1; iy

35、)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a+b , a*b) ; cout“The max is”cendl; 第75页/共121页第七十五页,共122页。使用内联函数时应注意以下几点:1、C+中,除在函数体内含有循环,switch分支和复杂嵌套的if语句外,所有的函数均可定义(dngy)为内联函数。2、内联函数也要定义(dngy)在前,调用在后。形参与实参之间的关系与一般的函数相同。3、对于用户指定的内联函数,编译器是否作为内联函数来处理由编译器自行决定。说明内联函数时,只是请求编译器当出现这种函数调用时

36、,作为内联函数的扩展来实现,而不是命令编译器要这样去做。4、正如前面所述,内联函数的实质是采用空间换取时间,即可加速程序的执行,当出现多次调用同一内联函数时,程序本身占用的空间将有所增加。如上例中,内联函数仅调用一次时,并不增加程序占用的存储间。第76页/共121页第七十六页,共122页。具有(jyu)缺省参数值和参数个数可变的函数在C+中定义函数时,允许给参数(cnsh)指定一个缺省的值。在调用函数时,若明确给出了这种实参的值,则使用相应实参的值;若没有给出相应的实参,则使用缺省的值。(举例说明) 第77页/共121页第七十七页,共122页。int fac(int n=2) int t=1;

37、 for(int i=1;i=n;i+) t=t*i; return t;void main(void) cout fac(6) endl;输出(shch):720fac( )输出(shch):2第78页/共121页第七十八页,共122页。int area(int long=4 , int width=2) return long* width;void main(void ) int a=8, b=6; cout area(a,b) endl; cout area(a) endl; cout area( ) endl; 48168第79页/共121页第七十九页,共122页。使用具有缺省参数的

38、函数时,应注意(zh y)以下几点:1.不可以靠左边缺省 2.函数原型说明(shumng)时可以不加变量名 float v(float,float=10,float=20);int area(int long , int width=2)int area(int long =4, int width)3.只能在前面定义一次缺省值,即原型说明时定义了缺省值,后面函数(hnsh)的定义不可有缺省值。错误!第80页/共121页第八十页,共122页。参数(cnsh)个数可变的函数到目前为止,在定义函数时,都明确规定了函数的参数个数及类型。在调用函数时,实参的个数必须与形参相同。在调用具有缺省参数值的函

39、数时,本质上,实参的个数与形参的个数仍是相同的,由于参数具有缺省值,因此,在调用时可省略。在某些(mu xi)应用中,在定义函数时,并不能确定函数的参数个数,参数的个数在调时才能确定。在C+中允许定义参数个数可变的函数。 第81页/共121页第八十一页,共122页。首先,必须包含(bohn)头文件“stdarg.h”,因为要用到里面的三个库函数 va_start( )、va_arg( )和va_end( )。其次,要说明一个va_list类型的变量(binling)。va_list与int,float类同,它是C+系统预定义的一个数据类型(非float),只有通过这种类型的变量(binling

40、)才能从实际参数表中取出可变有参数。如:va_list ap;ab.ap(va_list)变量(binling)(可变参数)va_start(ap,b):初始化va_arg(ap,int):依次取参数va_end(ap):正确结束第82页/共121页第八十二页,共122页。va_start():有两个参数,va_start(ap,b); b即为可变参数前的最后(zuhu)一个确定的参数。va_arg():有两个(lin )参数,va_arg(ap,int) int即为可变参数的数据类型名。int temp;temp=va_arg(ap,int);va_end():完成收尾(shuwi)工作。v

41、a_end(ap);在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的实参个数。如第一个参数值为总的实际参数的个数。第83页/共121页第八十三页,共122页。使用参数数目(shm)可变的函数时要注意以下几点:1、在定义函数时,固定参数部分必须放在参数表的前面,可变参数在后面,并用省略号“.”表示可变参数。在函数调用时,可以没有可变的参数。2、必须使用函数va_start()来初始化可变参数,为取第一个可变的参数作好准备工作;使用函数va_arg()依次取各个可变的参数值;最后用函数va_end()做好结束工作,以便能正确地返回。3、在调用参数个数可变的函数时,必定有一个参数指

42、明可变参数的个数或总的实参个数。第84页/共121页第八十四页,共122页。函数(hnsh)的重载所谓函数的重载是指完成(wn chng)不同功能的函数可以具有相同的函数名。 C+的编译器是根据函数的实参来确定应该(ynggi)调用哪一个函数的。 int fun(int a, int b) return a+b; int fun (int a) return a*a; void main(void) coutfun(3,5)endl; coutfun(5)endl;825第85页/共121页第八十五页,共122页。 1、定义的重载函数必须具有不同的参数个数,或不同的参数类型(lixng)。只有

43、这样编译系统才有可能根据不同的参数去调用不同的重载函数。2、仅返回值不同时,不能定义(dngy)为重载函数。即仅函数的类型不同,不能定义(dngy)为重载函数 int fun(int a, int b) return a+b; float fun (int a,int b) return (float) a*a; void main(void) coutfun(3,5)endl; coutfun(3,5)x;coutsin(x)endl;coutsin(x,x)endl;coutsin(x,10)endl;sin(x,x)sin(x,10)不同(b tn)的参数类型第87页/共121页第八十七

44、页,共122页。int add(int a,int b,int c)return a+b+c; int add(int a,int b)return a+b; void main(void)cout3+5=add(3,5)endl;cout3+5+8=add(3,5,8)endl;不同(b tn)的参数个数第88页/共121页第八十八页,共122页。高级语言编译(biny)过程源程序(文本文件)*.CPP目标(mbio)文件(二进制文件)*.OBJ可执行文件(wnjin)(二进制文件(wnjin))*.EXE库文件(各种函数)编译连接编译预处理C语言提供的编译预处理的功能有以下三种:宏定义文件

45、包含条件编译编译预处理 第89页/共121页第八十九页,共122页。宏定义(dngy)不带参数(cnsh)的宏定义用一个指定的标识符(即名字)来代表一个字符串,以后凡在程序中碰到这个标识符的地方(dfng)都用字符串来代替。这个标识符称为宏名,编译前的替代过程称为“宏展开”。# define 标识符 字符串第90页/共121页第九十页,共122页。#define PRICE 30 void main(void) int num, total; /*定义(dngy)变量*/ num=10; /*变量赋值*/ total=num*PRICE; couttotal=“totalendl;编译(bin

46、y)前用30替代编译程序将宏定义的内容认为是字符串,没有(mi yu)任何实际的物理意义。第91页/共121页第九十一页,共122页。1、宏展开只是一个(y )简单的“物理”替换,不做语法检查,不是一个(y )语句,其后不加分号“;”注意(zh y):2、#define命令出现在函数的外面,其有效范围为定义(dngy)处至本源文件结束。可以用# undef命令终止宏定义(dngy)的作用域。#define G 9.8void main(void ).# undef Gint max(int a,int b). 第92页/共121页第九十二页,共122页。3、对程序中用双引号括起来的字符串内容(

47、nirng),即使与宏名相同,也不进行置换。4、在进行宏定义中,可以用已定义的宏名,进行层层(cn cn)置换。第93页/共121页第九十三页,共122页。# define R 3.0# define PI 3.1415926# define L 2*PI*R# define S PI*R*Rvoid main(void) cout“L=“L“ S=”Sxy; area=S(x, y); /* area=x*y; */形式参数实际(shj)参数宏定义(dngy)宏调用定义的宏实参代入后还原第95页/共121页第九十五页,共122页。按#define命令行中指定(zhdng)的字符串从左至右进行

48、置换宏名,字符串中的形参以相应的实参代替,字符串中的非形参字符保持不变。#define S(a, b) a*barea=S(3,2)3*2机械地将实参代入宏定义(dngy)的形参形式S(a,b)等同于 a*bS(3,2)等同于 3*2第96页/共121页第九十六页,共122页。#define PI 3.1415926#define S(r) PI*r*rvoid main(void) float a, area, b; a=3.6; b=4.0; area=S(a); cout“r=“a“narea=”areaendl;S(r)PI*r*rS(a)PI*a*aPI*a*a编译(biny)前机械

49、替换,实参形参一一对应第97页/共121页第九十七页,共122页。#define PI 3.1415926#define S(r) PI*r*rvoid main(void) float a, area, b; a=1; b=2; area=S(a+b); cout“r=“a“narea=”areaendl;S(r)PI*r*rS(a+b)PI*a+b*a+b编译(biny)前机械替换,实参形参一一对应宏展开时实参不运算(yn sun),不作语法检查#define S(r) PI*(r)*(r)S(a+b)PI*(a+b)*(a+b)错误(cuw)第98页/共121页第九十八页,共122页。定

50、义宏时在宏名与带参数的括弧(kuh)间不能有空格。#define S_ (r) P*r*r 带参数(cnsh)的宏与函数调用的区别相同(xin tn):有实参、形参,代入调用。不同之处:1、函数调用先求表达式的值,然后代入形参,而宏只是机械替换。2、函数调用时形参、实参进行类型定义,而宏不需要,只是作为字符串替代。3、函数调用是在运行程序时进行的,其目标代码短,但程序执行时间长。而宏调用是在编译之前完成的,运行时已将代码替换进程序中,目标代码长,执行时间稍快。一般用宏表示实时的、短小的表达式。第99页/共121页第九十九页,共122页。#define A 3#define B(a) (A+1)

51、*a)执行(zhxng) x=3*(A+B(7); 后, x的值为:93#define neg(x) (-x)+1)int neg( int x)return x+1; void main(void) int y; y=neg(1); cout“y=“yendl;y=0编译前机械(jxi)替换,实参形参一一对应(-1)+1)第100页/共121页第一百页,共122页。文件(wnjin)包含一个源文件可以将另外一个源文件的全部内容包含进来,即将(jjing)另外的文件包含到本文件之中。# include “文件名”file1.cppBA#include “file2.cpp”ABfile1.cp

52、pfile2.cpp第101页/共121页第一百零一页,共122页。注意(zh y):1、文件名是C的源文件名,是文本文件,后缀名可以(ky)任选。*.cpp *.h2、一个#include语句只能指定一个被包含(bohn)文件。3、文件名用双引号或尖括号括起来。4、包含后所有源文件编译为一个可执行文件。第102页/共121页第一百零二页,共122页。条件(tiojin)编译C语言允许有选择地对程序(chngx)的某一部分进行编译。也就是对一部分源程序(chngx)指定编译条件。源程序可以将部分源程序不转换为机器码第103页/共121页第一百零三页,共122页。条件(tiojin)编译有以下几

53、种形式:1、 # ifdef 标识符 程序段1 # else 程序段2 # end if当标识符已被定义过(用#define定义),则对程序段1进行编译(biny),否则编译(biny)程序段2.# define DEBUG.# ifdef DEBUG coutxtyendl;# endif标识符第104页/共121页第一百零四页,共122页。2、 # ifndef 标识符 程序段1 # else 程序段2 # endif与形式1相反,当标识符没有被定义过(用#define定义),则对程序段1进行编译,否则(fuz)编译程序段2。# define DEBUG.# ifndef DEBUG co

54、utxtyendl;# endif调试(dio sh)完后加#define DEBUG,则不输出调试(dio sh)信息。第105页/共121页第一百零五页,共122页。3、 # if 表达式 程序段1 # else 程序段2 # endif当表达式为真(非零),编译程序(bin y chn x)段1,表达式为零,编译程序(bin y chn x)段2。# define DEBUG 1.# if DEBUG coutxtyendl;# endif调试完后改为(i wi) #define DEBUG 0,则不输出调试信息。采用(ciyng)条件编译后,可以使机器代码程序缩短。第106页/共121

55、页第一百零六页,共122页。以下程序的运行(ynxng)结果是:#define DEBUGvoid main(void) int a=14, b=15, c; c=a/b; # ifdef DEBUG cout“a=“octa“ b=“bendl; # endif cout“c=“deccx1; /从键盘输入x0 do x0=x1; x1=x0-(x0*x0-a)/(2*x0) ; / while (fabs(x1-x0)=1e-6) ;cout”x=”x1endl;)0 x(f)0 x(f0 x1x旧值算本次(bn c)循环的新值上一循环的新值成为(chngwi)本次循环的旧值第112页/共

56、121页第一百一十二页,共122页。2、弦截法f(x)xyx1、在x轴上取两点x1和x2, 要确保(qubo)x1与x2之间有且只有方程唯一的解。x1x2f(x1)f(x2)2、x1与x2分别(fnbi)与f(x)相交于y1=f(x1)、y2=f(x2)。3、做直线(zhxin)通过y1、y2与x轴交于x0点。x0 x2x04、若|f(x0)|满足给定的精度,则x0即是方程的解,否则,若f(x0)*f(x1)0,则方程的解应在x2与x0之间,令x1=x0,继续做2 ,直至满足精度为止。) 1x(f)2x(f) 1x(f*2x)2x(f*1x0 x第113页/共121页第一百一十三页,共122页

57、。用两分法求方程(fngchng)的根。 x3-5x2+16x-80=0) 1x(f)2x(f) 1x(f*2x)2x(f*1x0 x#include float f (float x)return x*x*x-5*x*x+16*x-80;float xpoint(float x1,float x2) float x0; x0=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return x0;void main(void ) float x1,x2, x0, f0, f1, f2; do coutx1x2; f1=f(x1); f2=f(x2); while (f1*f20

58、); do x0=xpoint(x1,x2); f0=f(x0); if (f0*f1) 0) x1=x0;f1=f0; else x2=x0; f2=f0; while (fabs(f0)=0.0001); cout”x=” x0endl;输入(shr)x,输出f(x)输入(shr)x1,x2,输出x0判断输入是否合法第114页/共121页第一百一十四页,共122页。3、两分法f(x)xyx1、在x轴上取两点x1和x2, 要确保x1与x2之间有且只有方程(fngchng)唯一的解。x1x22、求出x1,x2的中点(zhn din)x0。x0 x2x03、若|f(x0)|满足给定的精度,则x0

59、即是方程(fngchng)的解,否则,若f(x0)*f(x1)0,则方程(fngchng)的解应在x2与x0之间,令x1=x0,继续做2 ,直至满足精度为止。x0=(x1+x2)/2第115页/共121页第一百一十五页,共122页。用两分法求方程(fngchng)的根。 x3-5x2+16x-80=0#include float f (float x)return x*x*x-5*x*x+16*x-80;void main(void ) float x1,x2, x0, f0, f1, f2; do coutx1x2; f1=f(x1); f2=f(x2); while (f1*f20); d

60、o x0=(x1+x2)/2; f0=f(x0); if (f0*f1) 0) x1=x0;f1=f0; else x2=x0;f2=f0; while (fabs(f0)=0.0001); cout”x=” x0endl;输入(shr)x,输出f(x)判断输入是否(sh fu)合法x0=(x1+x2)/2求x1与x2的中点第116页/共121页第一百一十六页,共122页。int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; coutq(3)eps; n+)

61、 s+=t; t=n*t/(2*n+1); return _ ;main( ) double x; coutx; cout “=“=10) f(n/10); coutnendl;void main(void) f(12345);112123123412345第119页/共121页第一百一十九页,共122页。void main(void) char s; cin.get(s); while(s!=n) switch(s-2) case 0: case 1: couts+4; case 2: couts+4;break; case 3: couts+3; default: couts+2; bre

62、ak; cin.get(s); coutendl; 输入(shr):2347545455555657第120页/共121页第一百二十页,共122页。谢谢您的观看(gunkn)!第121页/共121页第一百二十一页,共122页。NoImage内容(nirng)总结概述。函数可以嵌套调用,不可嵌套定义。2、实参对形参变量的传递是“值传递”,即单向传递。return语句可以是一个表达式,函数先计算(j sun)表达式后再返回值。 t=t/x。r=rc。product=product*m。void cude(void)。:i=104。t=t*i。这个标识符称为宏名,编译前的替代过程称为“宏展开”。x3-5x2+16x-80=0。将后一项除以前一项,找规律。谢谢您的观看第一百二十二页,共122页。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!