第04章 函数与编译预处理.pptx

上传人:s****8 文档编号:68702450 上传时间:2022-12-29 格式:PPTX 页数:121 大小:437.37KB
返回 下载 相关 举报
第04章 函数与编译预处理.pptx_第1页
第1页 / 共121页
第04章 函数与编译预处理.pptx_第2页
第2页 / 共121页
点击查看更多>>
资源描述

《第04章 函数与编译预处理.pptx》由会员分享,可在线阅读,更多相关《第04章 函数与编译预处理.pptx(121页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1第四章 函数与编译预处理2概述函数是程序代码的一个自包含单元,用于完成某一特定的任务。C+是由函数构成的,函数是C+的基本模块。有的函数完成某一操作;有的函数计算出一个值。通常,一个函数即能完成某一特定操作,又能计算数值。3为什么要使用函数?1、避免重复的编程。2、使程序更加模块化,便于阅读、修改。参数(多个)函数值(唯一)函数体所编写的函数应尽量少与主调函数发生联系,这样便于移植。4说明:1、一个源程序文件由一个或多个函数组成,编译程序以文件而不是以函数为单位进行编译的。2、一个程序可以由多个源文件组成,可以分别编译,统一执行。3、一个程序必须有且只有一个main()函数,C+从main(

2、)函数开始执行。4、C+语言中,所有函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。5、从使用角度来说,分标准函数和用户自定义函数;从形式来说,分无参函数和有参函数。5库函数是C+编译系统已预定义的函数,用户根据需要可以直接使用这类函数。库函数也称为标准函数。为了方便用户进行程序设计,C+把一些常用数学计算函数(如sqrt()、exp()等)、字符串处理函数、标准输入输出函数等,都作为库函数提供给用户,用户可以直接使用系统提供的库函数。库函数有很多个,当用户使用任一库函数时,在程序中必须包含相应的头文件。如#include等。6用户在设计程序时,可以将完成某一相对独立

3、功能的程序定义为一个函数。用户在程序中,根据应用的需要,由用户自己定义函数,这类函数称为用户自定义的函数。根据定义函数或调用时是否要给出参数,又可将函数分为:无参函数和有参函数。7函数定义的一般形式一、无参函数主调函数并不将数据传给被调函数。类型说明 函数名(void)函数体 无参函数主要用于完成某一操作。不传递参数参数(多个)函数值(唯一)函数体8void main(void)printstar();print_message();printstar();void printstar(void)cout“*n”;void print_message(void)couty)?x:y;retur

4、n 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);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;先计算,后赋值若a为3,b为5,则实参为8,15,分别送给形参x,y。15说明:1、在未出现函数调用时,形参并不占内存的存储单元,只有在函数开始调用时,形参

5、才被分配内存单元。调用结束后,形参所占用的内存单元被释放。2、实参对形参变量的传递是“值传递”,即单向传递。在内存中实参、形参分占不同的单元。3、形参只作用于被调函数,可以在别的函数中使用相同的变量名。5a8b实参xy形参5816void fun(int a,int b)a=a*10;b=b+a;coutatbendl;void main(void)int a=2,b=3;fun(a,b);coutatbendl;ab23ab23202320 232 317void fun(int x,int y)x=x*10;y=y+x;coutxtyendl;void main(void)int a=2,

6、b=3;fun(a+b,a*b);coutatby)return x;else return y;若函数体内没有return语句,就一直执行到函数体的末尾,然后返回到主调函数的调用处。先计算,后返回可以有多个return语句21不带返回值的函数可说明为void型。函数的类型与函数参数的类型没有关系。double blink(int a,int b)如果函数的类型和return表达式中的类型不一致,则以函数的类型为准。函数的类型决定返回值的类型。对数值型数据,可以自动进行类型转换。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。int max(float a

7、,float b)/函数值为整型 函数返回值的类型,也是函数的类型22参数(多个)函数值(唯一)函数体int max(int a,int b)int z;z=xy?x:y;return z;如果有函数返回值,返回值就是函数值,必须惟一。如果有函数返回值,函数的类型就是返回值的类型函数体的类型、形式参数的类型必须在函数的定义中体现出来。23函数的调用函数调用的一般形式函数名(实参列表);形参与实参类型相同,一一对应。i=2;f(i,+i);函数调用的方式作为语句 printstar();作为表达式 c=max(a,b);作为另一个函数的参数 coutmax(a,b);实际调用:f(3,3);24

8、1)被调用的函数必须是已存在的函数2)如果使用库函数,必须用#include 在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?3)函数调用遵循先定义、后调用的原则,即被调函数应出现在主调函数之前。25float max(float x,float y)float z;z=(xy)?x:y;return z;void main(void)float a,b,c;cinab;c=max(a+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=m

9、ax(a,b);cout“The max is”cendl;函数原型说明函数定义定义是一个完整的函数单位,而原型说明仅仅是说明函数的返回值及形参的类型。28void main(void)int i=2,x=5,j=7;void fun(int,int);fun(j,6);coutit jt xendl;void fun(int i,int j)int x=7;coutit jtxendl;2i5x7j676jxi7输出:7 6 7 2 7 5 29void main(void)int x=2,y=3,z=0;void add(int,int,int);cout“(1)x=“x“y=“y“z=“

10、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=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;34计算100200之间的素数,用函数prime()判断一个数是否是素数,若是该函数返回1,否则返回0。void main(void)for(int i=100;i=200;i+)if(prim

11、e(i)=1)coutit;int prime(int 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;37写一个函数验证哥德巴赫猜想;一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5,10=3+7。在主函数中输入一个不小于6的偶数n,函数中输出以下形式的

12、结果34=3+31 38函数的嵌套调用C语言中,所有函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。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(int a,int b)return (ab?a:b);嵌套定义嵌套调用平行定义39调用 b 函数a 函数b 函数main 函数调用 a 函数结束(2)(3)(4)(5)(6)(7)(8)(9)在main函数中调用a函数,在a函数

13、中又调用b函数。40int power(int m,int n)/mnint i,product=m;for(i=1;in;i+)product=product*m;return 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

14、=10;else c=age(n-1)+2;return c;必须有递归结束条件43int 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

15、)fac(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=12045int 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/10)f(12)coutn%10f(n/10)f(1)coutn%1

16、0f(n/10)f(0)n=0returncoutn%10returncoutn%10returncoutn%10returncoutn%10return4321123443211234输入:123447void recur(char c)coutc;if(c5)recur(c+1);cout=10)f(n/10);coutnendl;void main(void)f(12345);11212312341234549作用域和存储类作用域是指程序中所说明的标识符在哪一个区间内有效,即在哪一个区间内可以使用或引用该标识符。在C+中,作用域共分为五类:块作用域、文件作用域、函数原型作用域、函数作用域

17、和类的作用域。50块作用域我们把用花括号括起来的一部分程序称为一个块。在块内说明的标识符,只能在该块内引用,即其作用域在该块内,开始于标识符的说明处,结束于块的结尾处。在一个函数内部定义的变量或在一个块中定义的变量称为局部变量。51在函数内或复合语句内部定义的变量,其作用域是从定义的位置起到函数体或复合语句的结束。形参也是局部变量。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有效52主函数main中定义的变量,也只在主函数中有效,同样属于局部变

18、量。不同的函数可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。void main(void)int x=10;int x=20;coutxendl;coutxendl;2010 x10 x20定义变量既是在内存中开辟区间53注意:具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名标识符,即变量名相同,局部更优先。54void main(void)int a=2,b=3,c=5;coutatbtcendl;int a,b=2;a=b+c;coutatbtcendl;c=a-b;coutatbtcendl;a2b3c52 3 57 2 5ab27-12 3 -15

19、5void 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=656文件作用域 在函数外定义的变量称为全局变量。全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。其缺省的作用范围是:从定义全局变量的位置开始到该源程序文件结束。当在块作用域内的变量与全局变量同

20、名时,局部变量优先。57p,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有效全局变量局部变量全局变量增加了函数间数据联系的渠道,在函数调用时可以得到多于一个的返回值。584int 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;

21、void main(void)int a=8;coutmax(a,b)endl;3a5ba88a5bmax(8,5)输出:860int x;void cude(void)x=x*x*x;void main(void)x=5;cude();coutxendl;输出:125输出:5int x=5;x为061在块作用域内可通过作用域运算符“:”来引用与局部变量同名的全局变量。#include int i=100;void main(void)int i,j=50;i=18;/访问局部变量i :i=:i+4;/访问全部变量i j=:i+i;/访问全部变量i和局部变量j cout”:i=”:in;cou

22、t”i=”in;cout”j=”jn;:i=104i=18j=10862函数原型作用域 在函数原型的参数表中说明的标识符所具有的作用域称为函数原型作用域,它从其说明处开始,到函数原型说明的结束处结束。float tt(int x,float y);/函数tt的原型说明 由于所说明的标识符与该函数的定义及调用无关,所以,可以在函数原型说明中只作参数的类型说明,而省略参量名。float tt(int,float);63int i=0;int workover(int i)i=(i%i)*(i*i)/(2*i)+4);cout“i=“iendl;return i;int rest(int i)i=i

23、2?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=564存储类 外存内存程序程序区静态存储区动态存储区存放程序代码存放变量需要区分变量的存储类型65作用域全局变量局部变量生存期动态存储变量静态存储变量静态存储:在文件运行期间有固定的存储空间,直到文件运行结束。动态存储:在程序运行期间根据需要分配存储空间,函数结束后立即释放空间。若一个函数在程

24、序中被调用两次,则每次分配的单元有可能不同。程序区程序区静态存储区静态存储区动态存储区动态存储区全局变量静态局部变量动态局部变量66局部变量的分类动态变量(auto):默认,存储在动态区寄存器变量(register):在cpu内部存储静态局部变量(static):存储在静态区动态局部变量未被赋值时,其值为随机值。其作用域的函数或复合语句结束时,空间被程序收回。程序执行到静态局部变量时,为其在静态区开辟存储空间,该空间一直被保留,直到程序运行结束。由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为0。67int fun(int a)int c;static int b=3;c=a

25、+b+;return c;void main(void)int x=2,y;y=fun(x);coutyendl;y=fun(x+3);coutyendl;x2ya2b3c5455a5只赋一次初值c9599输出:变量b是静态局部变量,在内存一旦开辟空间,就不会释放,空间值一直保留68int 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输出:7i=1a=2b=0,b=1c=4,c=5输出

26、:8i=2a=2b=0,b=1c=5,c=6输出:9789只赋一次初值69int 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=3i=3+8+1=12m=12+4+1=17输出:8,1770int q(int x)int y=1;static int z=1;z+=

27、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;文件file2.c中的内容为:extern int a;int power(int n)int i,y=1;for(i=1;iy)?x:y;return z;void main(void)int a,b,c;cinab;c=max(a+b,a*b);cout“The max is”cendl;77使用内联函数时应注意以下几点:1、C+中,除在函数体内含有循环,swit

28、ch分支和复杂嵌套的if语句外,所有的函数均可定义为内联函数。2、内联函数也要定义在前,调用在后。形参与实参之间的关系与一般的函数相同。3、对于用户指定的内联函数,编译器是否作为内联函数来处理由编译器自行决定。说明内联函数时,只是请求编译器当出现这种函数调用时,作为内联函数的扩展来实现,而不是命令编译器要这样去做。4、正如前面所述,内联函数的实质是采用空间换取时间,即可加速程序的执行,当出现多次调用同一内联函数时,程序本身占用的空间将有所增加。如上例中,内联函数仅调用一次时,并不增加程序占用的存储间。78具有缺省参数值和参数个数可变的函数在C+中定义函数时,允许给参数指定一个缺省的值。在调用函

29、数时,若明确给出了这种实参的值,则使用相应实参的值;若没有给出相应的实参,则使用缺省的值。(举例说明)79int fac(int n=2)int t=1;for(int i=1;i=n;i+)t=t*i;return t;void main(void)cout fac(6)endl;输出:720fac()输出:280int 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;4816881使用具有缺

30、省参数的函数时,应注意以下几点:1.不可以靠左边缺省 2.函数原型说明时可以不加变量名 float v(float,float=10,float=20);int area(int long,int width=2)int area(int long=4,int width)3.只能在前面定义一次缺省值,即原型说明时定义了缺省值,后面函数的定义不可有缺省值。错误!82参数个数可变的函数到目前为止,在定义函数时,都明确规定了函数的参数个数及类型。在调用函数时,实参的个数必须与形参相同。在调用具有缺省参数值的函数时,本质上,实参的个数与形参的个数仍是相同的,由于参数具有缺省值,因此,在调用时可省略。

31、在某些应用中,在定义函数时,并不能确定函数的参数个数,参数的个数在调时才能确定。在C+中允许定义参数个数可变的函数。83首先,必须包含头文件“stdarg.h”,因为要用到里面的三个库函数 va_start()、va_arg()和va_end()。其次,要说明一个va_list类型的变量。va_list与int,float类同,它是C+系统预定义的一个数据类型(非float),只有通过这种类型的变量才能从实际参数表中取出可变有参数。如:va_list ap;ab.ap(va_list)变量(可变参数)va_start(ap,b):初始化va_arg(ap,int):依次取参数va_end(ap

32、):正确结束84va_start():有两个参数,va_start(ap,b);b即为可变参数前的最后一个确定的参数。va_arg():有两个参数,va_arg(ap,int)int即为可变参数的数据类型名。int temp;temp=va_arg(ap,int);va_end():完成收尾工作。va_end(ap);在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的实参个数。如第一个参数值为总的实际参数的个数。85使用参数数目可变的函数时要注意以下几点:1、在定义函数时,固定参数部分必须放在参数表的前面,可变参数在后面,并用省略号“.”表示可变参数。在函数调用时,可以没有可变

33、的参数。2、必须使用函数va_start()来初始化可变参数,为取第一个可变的参数作好准备工作;使用函数va_arg()依次取各个可变的参数值;最后用函数va_end()做好结束工作,以便能正确地返回。3、在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的实参个数。86函数的重载所谓函数的重载是指完成不同功能的函数可以具有相同的函数名。C+的编译器是根据函数的实参来确定应该调用哪一个函数的。int fun(int a,int b)return a+b;int fun(int a)return a*a;void main(void)coutfun(3,5)endl;coutfun

34、(5)endl;82587 1、定义的重载函数必须具有不同的参数个数,或不同的参数类型。只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。2、仅返回值不同时,不能定义为重载函数。即仅函数的类型不同,不能定义为重载函数 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)不同

35、的参数类型89int 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;不同的参数个数90高级语言编译过程源程序(文本文件)*.CPP目标文件(二进制文件)*.OBJ可执行文件(二进制文件)*.EXE库文件(各种函数)编译连接编译预处理C语言提供的编译预处理的功能有以下三种:宏定义文件包含条件编译编译预处理 91宏定义不带参数的宏定义用一个指定的标识符(即名字)来代表一个字符串,以后凡在程序中

36、碰到这个标识符的地方都用字符串来代替。这个标识符称为宏名,编译前的替代过程称为“宏展开”。#define 标识符 字符串92#define PRICE 30 void main(void)int num,total;/*定义变量*/num=10;/*变量赋值*/total=num*PRICE;couttotal=“totalendl;编译前用30替代编译程序将宏定义的内容认为是字符串,没有任何实际的物理意义。931、宏展开只是一个简单的“物理”替换,不做语法检查,不是一个语句,其后不加分号“;”注意:2、#define命令出现在函数的外面,其有效范围为定义处至本源文件结束。可以用#undef命

37、令终止宏定义的作用域。#define G 9.8void main(void).#undef Gint max(int a,int b).943、对程序中用双引号括起来的字符串内容,即使与宏名相同,也不进行置换。4、在进行宏定义中,可以用已定义的宏名,进行层层置换。95#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;*/形式参数实际参数宏定义宏调用定义的宏实参代入后还原97按#define命令行中指定的字

38、符串从左至右进行置换宏名,字符串中的形参以相应的实参代替,字符串中的非形参字符保持不变。#define S(a,b)a*barea=S(3,2)3*2机械地将实参代入宏定义的形参形式S(a,b)等同于 a*bS(3,2)等同于 3*298#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编译前机械替换,实参形参一一对应99#define PI 3.1415926#

39、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编译前机械替换,实参形参一一对应宏展开时实参不运算,不作语法检查#define S(r)PI*(r)*(r)S(a+b)PI*(a+b)*(a+b)错误100定义宏时在宏名与带参数的括弧间不能有空格。#define S_(r)P*r*r 带参数的宏与函数调用的区别相同:有实参、形参,代入调用。不同之处:1、函数调用先求表达式的值,然后代入形参,而宏只是机械替换

40、。2、函数调用时形参、实参进行类型定义,而宏不需要,只是作为字符串替代。3、函数调用是在运行程序时进行的,其目标代码短,但程序执行时间长。而宏调用是在编译之前完成的,运行时已将代码替换进程序中,目标代码长,执行时间稍快。一般用宏表示实时的、短小的表达式。101#define A 3#define B(a)(A+1)*a)执行 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编译前机械替换,实参形参一一对应(-1)+1

41、)102文件包含一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。#include “文件名”file1.cppBA#include“file2.cpp”ABfile1.cppfile2.cpp103注意:1、文件名是C的源文件名,是文本文件,后缀名可以任选。*.cpp*.h2、一个#include语句只能指定一个被包含文件。3、文件名用双引号或尖括号括起来。4、包含后所有源文件编译为一个可执行文件。104条件编译C语言允许有选择地对程序的某一部分进行编译。也就是对一部分源程序指定编译条件。源程序可以将部分源程序不转换为机器码105条件编译有以下几种形式:1、#

42、ifdef 标识符 程序段1#else 程序段2#end if当标识符已被定义过(用#define定义),则对程序段1进行编译,否则编译程序段2.#define DEBUG.#ifdef DEBUG coutxtyendl;#endif标识符1062、#ifndef 标识符 程序段1#else 程序段2#endif与形式1相反,当标识符没有被定义过(用#define定义),则对程序段1进行编译,否则编译程序段2。#define DEBUG.#ifndef DEBUG coutxtyendl;#endif调试完后加#define DEBUG,则不输出调试信息。1073、#if 表达式 程序段1#

43、else 程序段2#endif当表达式为真(非零),编译程序段1,表达式为零,编译程序段2。#define DEBUG 1.#if DEBUG coutxtyendl;#endif调试完后改为#define DEBUG 0,则不输出调试信息。采用条件编译后,可以使机器代码程序缩短。108以下程序的运行结果是:#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*x

44、0);/while(fabs(x1-x0)=1e-6);cout”x=”x1endl;旧值算本次循环的新值上一循环的新值成为本次循环的旧值1142、弦截法f(x)xyx1、在x轴上取两点x1和x2,要确保x1与x2之间有且只有方程唯一的解。x1x2f(x1)f(x2)2、x1与x2分别与f(x)相交于y1=f(x1)、y2=f(x2)。3、做直线通过y1、y2与x轴交于x0点。x0 x2x04、若|f(x0)|满足给定的精度,则x0即是方程的解,否则,若f(x0)*f(x1)0,则方程的解应在x2与x0之间,令x1=x0,继续做2,直至满足精度为止。115用两分法求方程的根。x3-5x2+16

45、x-80=0#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);do x0=xpoint(x1,x2);f0=f(x0);if(f0*f1)0)x1=x0;f1=f0;else x2=x0;f2=f0;while

46、(fabs(f0)=0.0001);cout”x=”x0endl;输入x,输出f(x)输入x1,x2,输出x0判断输入是否合法1163、两分法f(x)xyx1、在x轴上取两点x1和x2,要确保x1与x2之间有且只有方程唯一的解。x1x22、求出x1,x2的中点x0。x0 x2x03、若|f(x0)|满足给定的精度,则x0即是方程的解,否则,若f(x0)*f(x1)0,则方程的解应在x2与x0之间,令x1=x0,继续做2,直至满足精度为止。x0=(x1+x2)/2117用两分法求方程的根。x3-5x2+16x-80=0#include float f(float x)return x*x*x-5

47、*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);do 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;输入x,输出f(x)判断输入是否合法x0=(x1+x2)/2求x1与x2的中点118int q(int x)int y=1;static int z=1;z+=z+y+;return x+z;void

48、main(void)coutq(1)t;coutq(2)t;coutq(3)eps;n+)s+=t;t=n*t/(2*n+1);return _;main()double x;coutx;cout“=“=10)f(n/10);coutnendl;void main(void)f(12345);112123123412345121void 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;break;cin.get(s);coutendl;输入:2347545455555657

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com