c语言程序设计函数调用课件.ppt

上传人(卖家):晟晟文业 文档编号:4985143 上传时间:2023-01-30 格式:PPT 页数:50 大小:207KB
下载 相关 举报
c语言程序设计函数调用课件.ppt_第1页
第1页 / 共50页
c语言程序设计函数调用课件.ppt_第2页
第2页 / 共50页
c语言程序设计函数调用课件.ppt_第3页
第3页 / 共50页
c语言程序设计函数调用课件.ppt_第4页
第4页 / 共50页
c语言程序设计函数调用课件.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、7.1函数概述函数概述7.2函数参数和返回值函数参数和返回值7.3函数的调用函数的调用7.4数组的作为函数参数数组的作为函数参数7.5变量的定义位置和作用域变量的定义位置和作用域7.6动态存储方式与静态存储方式动态存储方式与静态存储方式7.7函数的存储分类函数的存储分类7.8程序设计举例程序设计举例7.9程序设计题目程序设计题目n nC C语言函数分为两种语言函数分为两种:标准函数和用户自定义的函数。n 标准函数是系统提供的已设计好的函数,可以直接调用,用户自己定义的函数是用户自己编写的用来解决具体问题的函数.n (1)C程序的执行从 main函数开始,调用其他函数后流程回到main函数。n

2、(2)所有函数都是平行的,即在定义函数时,是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。n (3)从用户使用的角度看,函数分两种:n 标准函数,即库函数。这是由系统提供的,用户不用自己定义。n 用户自己定义的函数,以解决用户的专门问题。n (4)从函数的形式看,函数分两类:n 无参函数无参函数:主调函数并不将数据传送给被调用函数。n 有参函数有参函数:在调用函数时,在主调函数和被调用函数之间有参数传递,也就是说,主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。n7.1.2 7.1.2 函数的定义函数的定

3、义 n 1.1.无参函数的定义无参函数的定义n 类型标识符 函数名()n 说明部分 或n 语句 n 说明说明:n 用“类型标识符”指定函数值的类型,即函数带回来的值的类型。C语言默认返回值的类型是整型。n 2.2.有参函数的定义有参函数的定义 类型标识符 函数名(形式参数说明)说明部分 语句n 类型标识符 函数名(形式参数表列)n 形式参数说明 n 说明部分 n 语句n例如:n int max(x,y)n int x,y;/*形式参数说明*/n n int z;/*函数体中的说明部分*/n z=xy?x:y;n return(z);/*z为函数的返回值*/n n 这是一个求x和y二者中大者的函

4、数,x 和 y为形式参数,由主调函数的实际参数把参数值传递给被调用函数中的形式参数x和y。n7.2.1 7.2.1 函数参数函数参数n 在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。在定义函数时,函数名后面括号中变量名称为“形式参数”,简称“形参”。在调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参”。n(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时函数 max 中的形参才被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。n(2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求

5、它们有确定的值。在调用时将实参的值赋给形参变量。n (3)在定义的函数中,必须指定形参的类型。n (4)实参与形参的类型应一致。只有字符型与整型可以互相通用。n (5)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。n7.2.2 7.2.2 函数的返回值函数的返回值n 函数的返回值是由return语句传递的。n 格式格式:return(表达式);n 或 return表达式;n 功能功能:用return语句从函数退出,返回到调用它的程序中.该语句有两重作用:n (1)从函数中退出,返回到调用它的程序中。n

6、 (2)向调用程序返回一个值。n n7.3.1 7.3.1 函数调用的一般形式函数调用的一般形式 n格式格式:函数名(实参表列);n 函数调用语句的执行过程:首先计算每个实参表达式的值,并把此值存入所对应的形参单元中,然后把执行流程转入函数体中,执行函数体中的语句,函数体执行完之后,将返回到调用此函数的程序中的下一条语句,继续去执行。n 当执行到函数体的右花括号或return语句时,表示函数体执行完成,这时将返回到主调程序中。n n7.3.2 7.3.2 对被调用函数的说明对被调用函数的说明n 在一个函数中调用另一个被调函数,需要具备的条件:n (1)首先被调函数必须是已经存在的函数(库函数或

7、用户自定义函数)。n (2)如果使用库函数,一般还应在本文件开头用#include命令将调用有关库函数时所需用的信息包含到本文件中来。n 输入输出库函数:#include 使用系统定义的标准输入输出函数。n 数学库函数:#include math.h使用系统定义的标准数学运算函数。n (3)如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用函数的返回值的类型作说明。n 这种类型说明的一般形式为:n 类型标识符 被调函数函数名();n 对被调用函数的说明,在以下几种情况下可以省略:n (1)如果函数的值(函数的返回值)是整型或字符型,

8、可以不进行说明,系统对它们自动按整型说明。n (2)如果被调用函数的定义出现在主调函数之前,可以不进行说明,因为编译系统已经先知道了已定义的函数类型,会自动处理。n (3)如果在所有函数定义之前,对函数类型进行了说明,则在各个主调函数中不再进行说明。n 7.3.4 7.3.4 函数的嵌套调用函数的嵌套调用nC 语言的函数定义都是互相平行、独立的,可以嵌套调用函数即在调用一个函数的过程中,又调用另一个函数.n7.3.5 7.3.5 函数的递归调用函数的递归调用n 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C 语言的特点之一就在于允许函数递归调用。例如:n int

9、 f(x)n int x;n int y,z;n n z=f(y);n n return(2*z);n n7.4.1 7.4.1 数组元素做函数实参数组元素做函数实参n 由于实参可以是表达式,数组元素又可以是表达式的组成部分,因此数组元素可以作为函数的实参,与变量作实参一样,是单向传递,即“值传送”。只能将数组元素的值传递给被调函数的形参,不能带回变化的值。这种方式适合部分数组元素传递和元素较小的数组传递。n n 运行结果:形参值为:2 3 4n 实参值为:1 2 3n7.4.2 7.4.2 用数组名做函数的实参与形参用数组名做函数的实参与形参n 例7.1 有一个一维数组s,存放10个学生成绩

10、,求平均成绩.n float average(a)/*数组名a作形参*/n float a10;n n int i;n float v,sum=a0;n for(i=1;i10;i+)n sum=sum+ai;n v=sum/10;n return(v);n n main()n n float s10,v;n int i;n printf(input10s:n);n for(i=0;i10;i+)n scanf(%f,&si);n printf(n);n v=average(s);/*数组名s作实参*/n printf(average is%5.2f,v);n n 运行结果:n input10

11、s:n 100 56 78 98.5 76 87 99 67.5 75 97 n average is 83.40 n 说明说明:n (1)用数组名做函数参数,应该在主调函数和被调函数中分别定义数组。n (2)实参数组与形参数组类型应一致。n (3)实参数组和形参数组大小可以一致也可以不一致,C 编译时对形参数组大小不作检查,只是将实参数组的首地址传给形参数组。若要求形参数组得到实参数组全部的元素值,则应当指定形参数组与实参数组大小一致。n 也可以不指定形参数组大小,在定义数组名后面跟一个空的方括弧,为了在被调函数中处理数组元素的需要,可以另设参数,说明传递数组元素的个数。n 例7.2 n f

12、loat average(a,n)n /*a为形参数组名,n用于说明数组元素个数*/n float a;n int n;n n int i;n float v,sum=a0;n for(i=1;i0)n n int b=40;n n n n n b 的作用域仅在其定义的分程序之内,即进入分程序时建立b变量,结束分程序时立即撤消。b的作用域x、a的作用域n7.5.2 7.5.2 全局变量全局变量n 全局变量又称做外部变量,是在函数外部定义的变量。其有效范围是从变量定义的位置开始到本源文件结束止。n 若在同一个源文件中,局部变量与全局变量同名,则在局部变量的作用范围内,全局变量被屏蔽,不起作用。n

13、 在函数体外进行的函数说明也使该函数具有全局的性质。n int a=1,b=5;n float f1(x)n int x;n n int c,d;n n char c1,c2;n char f2(x,y)n int x,y;n n int i,j;n n main()n n int m,n;n 全局变量c1、c2作用域全局变量a、b作用域n a、b、c1、c2都是全局变量,但它们的作用范围不同。在main函数和函数f2中可以使用全局变量a、b、c1、c2,但在函数f1中,只能使用全局变量a、b,而不能使用c1和c2。n 说明说明:n (1)全局变量的作用:增加函数间数据联系的渠道。由于同一文件

14、中的所有函数都能引用全局变量的值,因此,如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。n 对于全局变量,如果在定义时不进行初始化,则系统将自动赋予其初值,对数值型赋0,对于字符型赋空0。n n (2)使用全局变量会增加程序的内存开销,因为全局变量在程序的整个执行过程中都有效,即一直占用着内存单元,而不是像局部变量那样,在进入其所在函数时才开辟存储单元,退出函数时便将其释放。使用全局变量,还会降低函数通用性,而且会降低程序的清晰度。建议不要无限制

15、地使用全局变量。n (3)在定义全局变量时,最理想的定义位置是在源文件的开头处,这样,在整个文件中的所有函数均可使用该变量。如果将一全局变量定义在源程序文件的中间,则其前面的函数不能使用该变量。如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作“外部变量说明”。表示该变量在函数的外部定义,在函数内部可以使用它们。见例7.10.n 例7.3 求两个数的最大值。n int max(x,y)n int x,y;n n int z;n z=xy?x:y;n return(z);n n main()n n extern int a,b;/*外部变量说明*/n printf(m

16、ax=%dn,max(a,b);n n int a=10,b=120;/*外部变量定义*/n 运行结果:n max=120n 由于外部变量定义在main函数之后,因此在main函数引用外部变量a和b之前,应该用extern进行外部变量说明,说明a、b是外部变量。如果不作 extern说明,编译时出错,系统不会认为a、b是已定义的外部变量。一般的做法是外部变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern说明。n 外部变量的定义与外部变量的说明并不是一回事。外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的说明可以有多次,它的位置在函数之内。n

17、(4)如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。n 例7.4 求两个数的最大值。n int a=3,b=5;/*a、b为外部变量*/a、b的作用范围 n max(a,b)n int a,b;/*a、b为局部变量*/n n int c;n c=ab?a:b;n return(c);n n main()n n int a=10;/*a为局部变量*/n printf(max=%dn,max(a,b);n n 运行结果:n max=10形参a、b作用范围 局部变量a作用范围 全局变量b作用范围n 第一行定义了外部变量a、b,并使之初始化。第二行开始定义函

18、数max,a、b是形参,形参也是局部变量。函数max中的a、b不是外部变量a、b,它们的值是由实参传给形参的,外部变量a、b在max函数范围内不起作用。最后4行是main函数,定义了一个局部变量a,因此全局变量a在main函数范围内不起作用,而全局变量b在此范围内有效。因此printf函数中的 max(a,b)相当于max(10,5),程序运行后得到结果为10。n7.6.1 7.6.1 变量的存储类别变量的存储类别n 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。n 从变量值存在时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。n 1.1.静态存储方式静态存储方式

19、n 是指在程序运行期间分配固定的存储空间的方式。n 2.2.动态存储方式动态存储方式n 是指在程序运行期间根据需要进行动态的分配存储空间的方式。n 供用户使用的存储空间可分为三部分:n (1)程序区;n (2)静态存储区;n (3)动态存储区。n 数据分别存放在静态存储区和动态存储区中。全局变量存放在静态存储区中。在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地分配和释放。n 局部变量存放在动态存储区中,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的。n 在动态存储区中存放以下数据

20、:n 函数形参变量。在调用函数时,给形参变量分配存储空间.n 局部变量。未加static说明的局部变量,即自动变量。n 函数调用时的现场保护和返回地址等。n 对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时,释放这些空间。程序运行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,分配给此函数中局部变量的存储空间地址可能是不同的。如果一个程序包含了若干个函数,每个函数中的局部变量的生存期并不等于整个程序的执行周期,它只是程序执行周期的一部分。根据函数调用的需要,动态分配和释放存储空间。n 在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。存储方法分为两大

21、类:静态存储类和动态存储类。n 具体包括4种:自动(auto);静态(static);寄存器(regnister);外部(extern)。n7.6.2 7.6.2 局部变量的存储方式局部变量的存储方式 n 1.1.自动存储类别自动存储类别n 函数中的局部变量,如不为static存储类别都是动态分配存储空间的,存储在动态存储区中,分配和释放存储空间的工作由编译系统自动处理,因此这类局部变量称为自动变量。自动变量用关键字auto作存储类型说明。例如:当局部变量未指明存储类别时,被定义为auto存储类别。n int f(a)/*定义函数*/n int a;/*定义a为形参*/n n auto int

22、 b,c=9;/*定义b、c为自动变量*/n n n b、c是自动变量,c=9,执行完f函数后自动释放其所占的存储单元。n auto也可以省略不写,则隐含确定为“自动存储类别”,它属于动态存储类别。n auto int b,c=9;与int b,c=9;是等价的。n 2.2.静态存储类别静态存储类别n 存储分类符static既可用于说明全局变量,也可用于说明局部变量。当其作用于局部变量时,该变量称为局部静态变量;其作用于全局变量时,该变量称为外部静态变量。n (1 1)局部静态变量)局部静态变量n 在函数体内用static说明的变量称为静态局部变量。在程序运行期间,它占据一个永久性的存储单元,

23、在退出函数后,值仍旧保留。静态变量是在编译时赋初值,因此在程序执行期间,一旦存储单元中的值改变,就不会再执行赋初值语句。未赋初值的变量,C编译程序将其置为0。形参不允许说明为静态存储类别。n 例7.6 n main()n n f1();n f1();n f1();n n 运行结果:n x=1 f1()int x=0;x=x+1;printf(x=%dn,x);n x=1 n x=1 n 若把int x=0;改为:static int x=0;n 运行结果如下:n x=1 n x=2 n x=3n 从程序可以看出,自动变量在函数每次被调用时,都进行初始化。而静态变量只在编译阶段初始化一次。在上例

24、中,前一种情况 x是自动变量,f1()函数每次被调用时,x 都初始n化,因此,输出结果始终是1。后一种情况x是局部静态变量,f1()函数第一次被调用时,x 为0,退出时为1。第二次调用时,x的值是1,仍然存在,因此,输出时x值为2,同样,第三n次调用时,x的值为3。n (2 2)外部静态变量)外部静态变量n 当定义一全局变量时,若将其指定为static类,则说明该全局变量只在本源程序文件中使用,其他的源程序文件不能引用该全局变量。这种外部静态变量主要用于同一程序分别由多人编写完成时的情况,避免不同编程者定义出相同名字的全局变量。n 对于全局变量,不管是否加static说明,均属于静态存储变量。

25、使用static只是为了限制其引用范围。n 3.3.寄存器存储类别寄存器存储类别n 为了提高程序的执行效率,C语言允许将局部变量的值放在CPU的通用寄存器中,这种变量称为寄存器变量。寄存器变量用关键字register说明。例如,函数体中的变量说明:n register int a,b;n 定义了两个寄存器变量a、b,函数运行时将尽可能把a、b的值放在寄存器中。n 在计算机中,从内存“存取”数据要比直接从寄存器中“存取”数据慢,所以对一些使用特别频繁的变量,可通过register将其定义成寄存器变量,使程序直接从寄存器中“存取”数据,以提高程序的效率。n 由于计算机的寄存器数目有限,并且不同的计

26、算机系统允许使用寄存器的个数不同,所以不宜定义太多的寄存器变量,只有将少量变化频繁的变量定义成寄存器变量,如循环控制变量等。当一函数内定义的寄存器变量的个数超过系统所允许使用的寄存器数时,系统将自动将其作为一般局部变量处理,即仍使用内存单元存放其值,并不提高执行速度。n 说明说明:n (1)只有局部自动变量和形式参数可说明为寄存器变量。n (2)一个计算机系统中的寄存器的数目是有限的。n (3)不同系统对register的处理不同。n (4)局部静态变量不能定义为寄存器变量,不能写成:n register static a,b,c;n7.6.3 7.6.3 全局变量的存储方式全局变量的存储方式

27、 n 全局变量可以使用extern和static存储类别。当未对全局n变量指定存储类别时,隐含为extern类别。n 1.1.外部存储类别外部存储类别n 当在一个文件中要引用另一个文件中的全局变量或在全局变量之前要引用它时,可用extern说明。相当于扩大全局变量的作用域。n 例7.7 n f1.c程序文件n main()n n int power();n extern int a;n int b=3,c,d,m;n printf(a,m=?n);n scanf(%d,%d,&a,&m);n c=a*b;n printf(%d%d=%dn,a,b,c);n d=power(m);n print

28、f(%d%d=%dn,a,m,d);n n int a;n f2.c程序文件n extern int a;n power(n)n int n;n n int i,y=1;n for(i=1;i=n;i+)n y*=a;n return(y);n n 程序文件 f1中的最后一行为对全局变量a的定义,main函数在其作用域之外,所以在main函数中对其进行了外部说明,而在文件f2中的第一行也是对a进行说明。n 由于全局变量在整个程序的运行过程中“永久性”地占用固定的存储单元,所以它存放在静态数据区中,属于静态存储变量.n 2.2.静态存储类别静态存储类别n 由static说明的全局变量称为静态全局

29、变量,它只能由本文件引用,即使在其他文件中用extern说明也不能使用,相当于限制了全局变量作用域的扩展。n7.6.4 7.6.4 存储类别小结存储类别小结n 对一个数据的定义,需要指定两种属性:数据类型和存储类别,分别用两个关键字进行定义,如:n static int a;(静态内部变量或静态外部变量)n auto char c;(自动变量,在函数内定义)n register int d;(寄存器变量,在函数内定义)n extern int b;(定义外部变量)n 从不同角度做以下归纳。n (1)从作用范围角度分:有局部变量和全局变量。它们采取的存储类别如下:n 自动变量,即动态局部变量(离

30、开函数,值就消失)n 静态局部变量(离开函数,值仍然保留)n 寄存器变量(离开函数,值就消失)n (形式参数可以定义为自动变量或寄存器变量)局部变量n 静态外部变量(只限本文件引用)n 外部变量(即非静态的外部变量,允许其他文件引用)n (2)从变量存在的时间来区分,有动态存储和静态存储两种类型。n 自动变量(本函数内有效)n 寄存器变量(本函数内有效)n 形式参数(本函数内有效)n 静态局部变量(函数内有效)n 静态外部变量(本文件内有效)n 外部变量(其他文件可引用)n (3)从变量值存放的位置来区分:n 静态局部变量n 静态外部变量(函数外部静态变量)n 外部变量(可为其他文件引用)全局

31、变量动态存储静态存储内存中静态存储区n 内存中动态存储区内存中动态存储区:自动变量和形式参数n CPUCPU中的寄存器中的寄存器:寄存器变量n7.6.5 7.6.5 内部函数和外部函数内部函数和外部函数n 1.1.内部函数内部函数n 内部函数又称静态函数。定义时被说明成static类别,静态函数只局限于所在文件,其他文件不能调用。n 2.2.外部函数外部函数n 定义时被说明成extern类别的函数为外部函数。函数的隐含类别为extern类别,外部函数可以被其他文件调用。n7.7.1 7.7.1 内部函数内部函数n 当定义一个函数时,若在函数返回值的类型前加上static时,则称此函数为“静态”

32、函数。n 格式格式 static类型标识符函数名(形参表)n 静态函数的特征只限于本文件中的其他函数调用,所以又称作“内部”函数。使用内部函数,可以避免不同文件因函数同名而引起混乱。通常把只能由同一文件使用的内部函数和外部变量放在一个文件中,在它们前面加上static使之局部化,其他文件不能引用。n 例7.8 n file1.c(文件1)n main()n n int a,b;n extern void swap()n scanf(%d%d,&a,&b);n if(ab)swap(a,b);n printf(%d,%dn,a,b);n n file2.c(文件2)n static void s

33、wap(x,y)n int x,y;n n int t;n t=x;x=y;y=t;n n file2.c中的函数 swap是内部函数,只能被file2.c中的其他函数调用。在file1.c的 main函数中,虽然用extern说明了swap是外部函数,但这是徒劳的。连接时会产生出错信息。n7.7.2 7.7.2 外部函数外部函数n 在定义函数时,如果在函数名和函数类型的前面加上关键字extern,则表示此函数是外部函数,可供其他文件调用。n 格式格式 extern类型标识符函数名(形参表)n C语言规定,如果在定义函数时省略extern,则隐含为外部函数。n 通常,当函数调用语句与被调函数不

34、在同一文件,且函数的返回值为非整型时,应在调用语句所在函数的说明部分用extern说明所调用函数。n 例7.9 n file1.c(文件1)n extern float add();n main()n n float a,b;n scanf(%f%f,&a,&b);n printf(a=%fnb=%fntotal=%fn,a,b,add n (a,b);n n .n /*file1.c的尾部*/n file2.c(文件2)n float add(x,y)n float x,y;n return(x+y);n 在文件file1.c的main函数中要调用 add函数,而add函数在file2.c中

35、。因此在main函数的前面用extern float add()来说明,这时,函数add的作用域扩展到file1.c文件的末尾。n 例7.10 输出1到5的阶乘值。n#include n int fac(int n)n n if(n1)n f=n*fac(n-1)n else n f=1;n return(f);n n main()n n int i;n for(i=1;i=5;i+)n printf(%d!=%dn,i,fac(i);n n 运行结果为 n 1!=1 n 2!=2 n 3!=6 n 4!=24 n 5!=120 n n 题7.1 编写程序,求s=s1+s2+s3+s4 的值,n 其中:s1=1+1/2+1/3+1/50n s2=1+1/2+1/3+1/100 n s3=1+1/2+1.3+1/150 n s4=1+1/2+1/3+1/200n 此题目可以首先编一函数,用于求1+1/2+1/3+1/n的值,然后通过函数调用求s的值。n题7.2 利用选择排序法,对数组a中的10个整数按从小到大的顺序排列,并将排序结果显示出来。n 选择排序法的基本思想是:先将a0到a9中的最小数与a0对换;再将a1到a 9中的最小数与a1对换;依此类推,直到排序完成为止。谢谢

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(c语言程序设计函数调用课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|