第七章新10年5月25日.ppt_第1页
第七章新10年5月25日.ppt_第2页
第七章新10年5月25日.ppt_第3页
第七章新10年5月25日.ppt_第4页
第七章新10年5月25日.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章 函数及变量存储类别,本章要求 理解模块化程序设计思想; 掌握函数的定义与调用方法; 掌握C语言的参数传递方式; 掌握变量的作用域和存储方式。 掌握用#define定义无参数宏和带有参数宏定义和调用方法; 掌握#include文件包含的使用方法,理解多个源文件的C程 序的运行 ; 了解条件编译的使用。,第七章 函数及变量存储类别,本章重点 函数的定义与调用 参数传递 变量的作用域和存储方式 带参宏定义和使用方法、文件包含的使用 本章难点 参数传递 变量的作用域和存储方式 带参宏定义和使用方法,函数的概念,函数的概念,函数的概念,函数的概念,函数的概念,函数的概念,函数的定义和声明,函数的

2、定义形式 存储类型标识符 类型标识符 函数名(类型名 形式参数1, ) 说明部分 语句部分 函数定义由函数首部和函数体两部分组成。函数首部即定义一个函数时的第一行,包括存储类型标识符、类型标识符 函数名和由()括起来的参数表; 部分称为函数体,语法上是一个复合语句。,1)存储类型标识符说明函数的存储类型,它规定了函数可被调用的范围。可用于函数存储类型标识符有static和extern,指定为static的函数为静态函数,静态函数只能由和它在同一文件中定义的函数调用;缺省或指定为extern存储类型的函数为外部函数。例如:例7.1中的square() 函数是外部函数。 )类型标识符说明函数返回值

3、的数据类型,可以为任何基本类型、结构体类型,还可以是指针类型,也可以是无返回值类型即空类型(void)。缺省时为int型。 )函数名是一个标识符,一程序中除main()外,其余函数的名字可以任意取。函数名一般不要超过个字符。同一文件中的函数不能同名。 )形式参数可以是0个、一个或多个,表示该函数被调用时所需的一些必要信息,函数定义的说明:,函数定义的说明:,)对于有参函数,形式参数的定义与变量的定义形式相似 )函数体是一组放在一对花括号中的语句 ,一般包括声明部分和执行部分 )在函数中,形式参数可以作为已知的变量,不需要对它赋值就可使用它,它的值是函数调用时由实参传递给形参变量而得到的,函数的

4、定义和声明,函数返回值 C语言通过return语句获得函数返回值的,其格式如下: return 表达式; 或 return(表达式); 表达式的值就是函数的返回值。对于基本类型,表达式的类型和函数的类型不相同时表达式的值自动转换为涵数的类型,对于指针,表达式的类型和函数的类型不相同时,须使用类型强制符将表达式转换为函数的类型;对于结构体,表达式值的类型与函数定义的类型必须相同。 例如,可以将power()函数定义为: double power(int x,int n) int i; long p; return(p); 其中,“return(p)”将表达式p的值作为power()函数的返回值。

5、p自动转换成double类型。,函数的声明(函数原型) 在使用自定义函数时,除了进行函数的定义外,还需要在调用该函数之前对其进行原型声明 函数原型声明和函数定义的区别 函数原型声明的作用是将函数类型告诉编译系统,使程序在编译阶段对调用函数的合法性进行全面的检查,避免函数调用时出现参数的个数或类型不一致的运行错误。 函数定义部分则是函数的实际实现代码 函数原型声明的格式: 存储类型标识符类型符 函数名(形式参数表);,7.2 函数的定义和声明,7.2.3 函数的声明(函数原型) 说明: (1)函数原型声明语句最后的分号不能省略,其作用是表示该语句是进行函数声明而不是函数定义。 (2)在原型声明中

6、,形式参数名可以省略。 如:double power(int, int ); 和 double power(int x, int n); 和 double power(int a, int n); 都是等价的。power()函数是double类型的,它有两个int参数。声明给出的参数名x、n被编译忽略,因为参数的存储空间是在函数衩调用时进行的。 对于无参数表的函数,声明时参数表应指定为void。 (3)如果被调用函数的定义出现在调用函数之前,可以不对被调用函数进行原型声明。 (4)如果被调用函数已在所有函数定义之前进行了原型声明,则在各个调用函数中不必再对该函数进行原型声明 ()标准库函数的原

7、型在系统提供的相应头文件中,因此,程序中调用标准库函数时,只需用#include预处理控制包含所需的头文件,而不需要写函数声明。,函数的定义和声明,函数的声明(函数原型) 说明: (1)函数原型声明语句最后的分号不能省略,其作用是表示该语句是进行函数声明而不是函数定义。 (2)在原型声明中,形式参数名可以省略。 如:double power(int, int ); 和 double power(int x, int n); 和 double power(int a, int n); 都是等价的。power()函数是double类型的,它有两个int参数。声明给出的参数名x、n被编译忽略,因为参

8、数的存储空间是在函数衩调用时进行的。 对于无参数表的函数,声明时参数表应指定为void。 (3)如果被调用函数的定义出现在调用函数之前,可以不对被调用函数进行原型声明。 (4)如果被调用函数已在所有函数定义之前进行了原型声明,则在各个调用函数中不必再对该函数进行原型声明 ()标准库函数的原型在系统提供的相应头文件中,因此,程序中调用标准库函数时,只需用#include预处理控制包含所需的头文件,而不需要写函数声明。,函数的定义和声明,函数的说明,函数说明的形式 函数返回值的类型名 函数名(类型名 形式参数名1,类型名形参数名 ); 简单地说就是在函数的首部加上一个“;”。因为函数的声明是语句,

9、因此后面的“;”必不可少。 double area(double a ,double b); /*函数声明*/ main() double x=1.2,y=2.4,z; z=area(x,y);/*函数调用*/ printf(“area=%lf”,z); double area(double a ,double b)/*函数定义*/ double s; s=a*b; return s; ,函数的说明,函数说明的形式 函数在说明时的形参名可以和定义时的形参名不同 函数返回值的类型名 函数名(类型名 参数名1,类型名 参数名2 ); 如上例中就完全可以把函数声明为 double area(doub

10、le m,double n ); /*函数声明*/ main() double x=1.2,y=2.4,z; z=area(x,y);/*函数调用*/ printf(“area=%lf”,z); double area(double a ,double b)/*函数定义*/ double s; s=a*b; return s; ,函数的说明,函数说明的形式 函数在说明时甚至可以省略不写形参名,只有类型名 函数返回值的类型名 函数名(类型名 ,类型名 ); 如上例中就完全可以把函数声明为 double area(double ,double ); /*函数声明*/ main() double x

11、=1.2,y=2.4,z; z=area(x,y);/*函数调用*/ printf(“area=%lf”,z); double area(double a ,double b)/*函数定义*/ double s; s=a*b; return s; ,函数的说明,函数说明的形式 函数在说明也可以与普通变量一起出现在同一个类型定义语句中, 类型名变量名1,变量名2, 函数名(类型名 ,类型名 ); 如上例中就完全可以把函数声明为 main() double x=1.2,y=2.4,z, area(double ,double );/*变量定义、函数声明*/ z=area(x,y); /*函数调用*

12、/ printf(“area=%lf”,z); double area(double a ,double b) /*函数定义*/ double s; s=a*b; return s; ,函数的定义与调用,函数的定义与调用,函数的参数,函数的参数,函数的参数传递,数据只能从实参单向传到形参,即实参的值不能通过函数改变。 到目前为止,函数最多只能返回一个函数值。,void swap(int x, int y) int t; t=x; x=y; y=t; printf(%d %d ,x ,y); main( ) int a= 3,b=4; swap(a,b); printf(%d %d ,a,b);

13、 ,程序输出结果: 4 3 3 4,形式参数(形参),实际参数(实参),单向值传递,函数的参数传递,【例】以下程序的输出结果是,例:形参与实参的数值传递。 程序代码如下: #include void swap(int a,int b); /*声明函数原型*/ void main() int x,y; x=10; y=20; printf(Before swapping:x=%d y=%dn,x,y); swap(x,y); /*调用函数*/ printf(After swapping:x=%d y=%dn,x,y); void swap(int a,int b) /*定义函数*/ int t;

14、 t=a; a=b; b=t; ,形参和实参的数值传递,程序输出如下: Before swapping:x=10 y=20 After swapping:x=10 y=20,形参和实参的数值传递,s(int r) return 3.14*r*r; main( ) int r,area; scanf(%d, ,自动转换为int型,思考: 若要得到单精度实型的圆面积,程序应如何修改,程序运行情况如下: 2 12,?,例 参数的返回值,7.4 指针与函数,例函数的嵌套调用,main( ) int n=3; printf (%dn,sub1(n); ,sub1(int n) int i,a=0; fo

15、r (i=n; i0; i-) a+=sub2(i); return a ; ,sub2(int n) return n+1; ,程序输出结果: 9,递归调用过程,例 用递归方法求Fibonacci数列。,#include double fib(int n) if (n=1|n=2) return 1; return fib(n-1)+fib(n-2); void main( ) int n; printf(“n=”); scanf(“%d, ,历年真题,2009年3月 (33)有以下程序 #include int fun(int x,int y) if(x=y) return(x); els

16、e returen(x+y)/2) main() int a=4,b=5,c=6; printf(“%dn”,fun(2*a,fun(b,c) 程序运行后的输出结果是 A)3 B)6 C)8 D)12,答案:B,历年真题,2009年3月 (12)请将以下程序中的函数声明语句补充完整 #include int【12】 ; main( ) int x,y,(*p)(); p=max; printf(“%dn”,(*p)(x,y); int max(int a,int b) return (ab/a:b);,答案: max(int a,int b),历年真题,2008年9月 (22)下面的函数调用语

17、句中func函数的实参个数是 func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8); A)3 B) 4 C)5 D)8,答案: A,2008年9月 (25)以下叙述中错误的是 A) 用户定义的函数中可以没有return语句 B)用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值 C)用户定义的函数中若没有return语句,则应当定义函数为void类型 D)函数的return语句中可以没有表达式,答案: B,void sub(int a,int b) int c; a=a+b; b=b+a; c=b-a; printf(sub:ta=%d b=

18、 %d c= %dn,a,b,c); ,main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(main:ta=%d b= %d c= %dn,a,b,c); ,“分程序”或“程序块”,程序输出结果: main: a=1 b= 1 c= 1 sub: a=2 b= 3 c= 1 main: a=1 b= 1 c

19、= 1 comp: a=2 b= 2 c= 1 main: a=1 b= 1 c= 1,int a = 5; void f(int x, int y) int b,c; b=a+x; c=a-y; printf(%dt%dt%dn,a,b,c); ,程序输出结果: 5 11 -2 5 6 7 9 8 7 9 8 10 9 8 10 5 6 10,全局变量,变量的存储类别,变量的生存期与变量的存储分类,变量的生存期:变量在内存中占据存储空间的时间。,思考:1. 何时为变量分配内存单元? 2. 将变量分配在内存的什么区域? 3. 变量占据内存的时间(生存期)?,动态存储变量,静态存储变量,变量的存

20、储类别,变量的属性,数据类型: 决定为变量分配内存单元的长度, 数据的存放形式, 数的范围。,存储类别: 决定了变量的生存期, 给它分配在哪个存储区。,变量定义语句的一般形式,存储类别 数据类型 变量名1, , 变量名n ;,auto(自动的) register(寄存器的)static(静态的) extern(外部的),1自动变量(auto类别) 局部变量可以定义为自动变量。, 内存分配 调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。 变量的初值 定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数被调用时执行一次赋值操作。 生存期 在

21、函数或分程序执行期间。 作用域 自动变量所在的函数内或分程序内。,自动变量,2静态变量(static类别),除形参外,局部变量和全局变量都可以定义为静态变量。, 内存分配 编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。 静态变量的初值 若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值 。 生存期 整个程序的执行期间。 作用域 局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。,静态变量,3.外部变量(extern类别),在函数外定义的变量若没有用 static说明,则是

22、外部变量。外部变量只能隐式定义为extern类别,不能显式定义。, 内存分配 编译时,将其分配在静态存储区,程序运行结束释放该单元。 变量的初值 若定义变量时未赋初值,在编译时,系统自动赋初值为0。 生存期 整个程序的执行期间。 作用域 从定义处开始到本源文件结束。 此外,还可以用extern进行声明,以使其作用域扩大到该程序的其它文件中。,外部变量,外部变量声明的一般格式,extern 数据类型 变量名1,变量名n; 或 extern 变量名1,变量名n;,注意: 外部变量声明用关键字extern,而外部变量的定义不能用extern,只能隐式定义。 定义外部变量时,系统要给变量分配存储空间,

23、而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。,int p=1,q=5; float f1(int a) extern char c1,c2; char c1,c2; char f2(int x,int y) main( ) ,思考:在f1函数中声明c1、c2的作用是什么?如何修改程序使所有函数都可以使用外部变量而又不需要声明?,例7.11 在一个文件内声明外部变量。,4.寄存器变量(register类别),只有函数内定义的变量或形参可以定义为寄存器变量。寄存器变量的值保存在CPU的寄存器中。 受寄存器长度的限制,寄存器变量只

24、能是char、int和指针类型的变量。,例7.13 寄存器变量的使用。 main( ) long int sum=0; register int i; for (i=1; i=1000; i+) sum+=i; printf(sum=%ldn ,sum); ,程序输出结果: sum=500500,说明:计算机的寄存器是有限的,为确保寄存器用于最需要的地方,应将使用最频繁的值说明为寄存器存储类型。,归纳变量的分类,1按照变量的作用域对变量分类 局部变量 全局变量 2按照变量的生存期对变量分类 静态存储变量 包括:局部静态变量和全局静态变量 动态存储变量 包括:自动变量,7.7 编译预处理,在C语

25、言源程序中以“#”号开头的预处理命令都放在函数之外,一般都放在源文件的前面,它们称为预处理部分。 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。 预处理是语言的一个重要功能,由预处理程序负责完成。 对源文件进行编译时,系统将自动引用预处理程序对源程序中预处理部分作处理,处理完再自动进入对源程序的编译。 语言提供了多种预处理功能,主要有宏定义、文件包含、条件编译。,7.7.1 宏定义,预处理命令#define用来建立符号常量(用符号表示的常量)和宏(用符号定义的操作)。 语言源程序中用一个标识符来表示一个字符串, 称为宏。 被定义为“宏”的标识符称为“宏名”。 在编译

26、预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,称为“宏代换”或“宏展开”。 宏定义是由源程序中的宏定义命令完成的。 宏代换是由预处理程序自动完成的。 语言中,“宏”分为有参数和无参数两种。,例7-14 通过键盘输入100个实数,将其中大于它们平均值的数打印输出。 (使用无参宏定义) #define NUM 100 void main() int i;float xNUM,ave=0; for(i=0;iave) printf(%f ,xi); ,1.无参宏定义,1.无参宏定义,一般形式: #define 标识符 字符串 第一部分为#define命令本身。第二部分为自定义的宏

27、名。宏的名字中不允许有空格,遵循C语言变量的命名规则。第三部分(#define行的其余部分)称为替换文本。 预处理器在处理过程中发现程序中的宏实例后,会用它的等价替换文本代替宏。从宏变成最终替换文本的过程为“宏展开”或“宏代换”。 如例7-14的程序被预处理之后,程序中所有的NUM已经由预处理器替换成了100。从这里可以看出给符号常量取有意义的名字能提高程序的可读性和可维护性。,例7-15 输入一个圆的半径,输出该圆的周长。 #define PI 3.14 #define C 2*PI*r/*PI是已定义的宏名*/ void main() double r; printf(Enter The

28、Radiusn); scanf(%lf, ,1.无参宏定义,C语言允许宏定义嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理器进行层层代换。 本例的宏定义用“C”替换表达式“2*PI*r”,因此宏不仅可以代替常量,宏还可以表示任何字符串,甚至是整个表达式。 如果本例中没有“double r;”这个定义,则程序编译时会出现变量未定义的语法错误。因此,我们还要注意若替换字符串中含有其他字符,一般需要在程序中定义,否则编译时会出现标识符(变量)未定义的错误。这样做的原因在于预处理器不能理解C语言,预处理时不检查语法,不分配内存空间,仅作简单字符串置换。源程序只有在进行编译时才作语法

29、检查。,1.无参宏定义,例7-16 分析下列程序是否有错。 #define X 10 #define Y 20; void main() int sum; sum=X+Y printf(X+Y=%d,sum); ,程序运行结果: X+Y=30,1.无参宏定义,本例中语句“sum=X+Y”后面没有分号结尾,但是程序并没有编译出错。原因在于这条语句在预处理过程中已经被展开成“sum=10+20;”是符合C语法的。注意,宏定义不是语句,不必在末尾加上分号。若加了分号,则分号也是作为替换字符串的一部分。 宏名在源程序中若用引号括起来,则预处理器不对其作宏代换。所以本例的运行结果是“X+Y=30”,而不

30、是“10+20=30”,原因在于printf输出语句中虽然X和Y都是宏名,但是它们被引号括起来,所以不被宏展开,而是原样输出。,1.无参宏定义,例7-17 #define PI 3.14 #define ADDPI (PI+1) #define TWO_ADDPI (2*ADDPI),如有以下语句: x=TWO_ADDPI/2 ;,把x=TWO_ADDPI/2替换为x=(2*ADDPI)/2 ;,把x=(2*ADDPI)/2 替换为x=(2*(PI+1)/2;,把x=(2*(PI+1)/2 替换为x=(2*(3.14+1)/2;,1.无参宏定义,例7-18 #define PI 3.14 #d

31、efine ADDPI PI+1 #define TWO_ADDPI 2*ADDPI,如有以下语句: x=TWO_ADDPI/2 ;,把x=TWO_ADDPI/2替换为x=2*ADDPI/2 ;,把x=2*ADDPI/2 替换为x=2*PI+1/2;,把x=2*PI+1/2 替换为x=2*3.14+1/2;,1.无参宏定义,1. 无参宏定义,使用无参数宏定义还有以下几点说明:,宏名一般习惯用大写字母表示,以与变量名区别。但这并非规定,也可用小写字母。 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。 宏定义是用宏名代替一个字符串,也就是作简单的置换,不作语法检查。 宏定义不是

32、C语句,不必在行末加分号,如果加了分呈则会连分号一起进行置换。,1. 无参宏定义,(5) #define命令写在文件的开头,函数之前,作为文件的一部分,在文件范围内有效。 (6)可以用#undef终止宏定义的作用域。例如: #define MIN 500 宏名MIN的有效范围 #undef MIN /*此处取消了MIN的定义*/ (7)在进行宏定义时,可以引用已定义的宏名,并层层替换。如例7-15。 (8) 对程序中用双引号括起来的字符,即使与宏名相同,也不进行替换。 (9)宏定义的替换文本通常在同一行中,如果替换文本超过一行,必须在该行的最后加上反斜杠“”,反斜杠表示替换文本继续到下一行。,

33、无参数宏用于定义符号来代替常量,C语言还允许用符号来定义操作。通过使用参数,可以创建外形和作用都与函数相似的类函数宏。,例7-19 用定义带参数宏来改写例7-15的程序。 #define PI 3.14 #define C(r) 2*PI*r/*PI是已定义的宏名*/ void main() double radius,perimeter; printf(Enter The Radiusn); scanf(%lf, ,2. 带参宏定义,本例宏定义括号内的r称为形式参数,将宏调用时出现的变量名radius称为实际参数,形参和实参可以不止一个。 带参数宏定义的一般形式为: #define 宏名(形

34、参表)替换文本 带参宏调用的一般形式为: 宏名(实参表) 带参宏定义的宏展开步骤可以归纳为下面两步: 自左向右依次将替换文本中形参字符用相应位置上的实参字符来替换; 在程序中出现宏调用的位置进行宏展开,这一步与无参宏定义的宏代换相同。,2. 带参宏定义,说明:,(1)对带参的宏展开只是将语句中的宏名后面的括号内的实参字符串代替#define命令行中的形参。 (2)在宏定义时,在宏名与带参的括号之间不应加空格,否则将空格以后的字符串都作为代替字符串的一部分。 (3)定义宏时最好用括号括起来。如:#define square(n) n*n, 调用时s=square(a+1),则变成了s=a+1*a

35、+1,与预期效果不同。,2. 带参宏定义,2 带参数的宏定义,【例7-21】分析下面程序运行后的输出结果。 #define MUL(a,b) (a)*(b) main( ) printf(%dn, MUL(10-5,5+1)/2); ,分两次替换: MUL(10-5,5+1) 用(a)*(b) 替换。 用10-5替换a,用5+1替换b 。 printf语句被展开为: printf(%dn,(10-5)*(5+1)/2);,程序输出结果:15,2 带参数的宏定义,【例7.22】分析下面程序运行后的输出结果。 #define MA(x) x*(x-1) main( ) int a=1,b=2; p

36、rintf(%dn, MA(1+a+b); ,分两次替换: MA(1+a+b) 用x*(x-1) 替换。 用1+a+b替换x。 printf语句被展开为: printf(%dn, 1+a+b*(1+a+b-1);,特别注意: 由于替换文本中的x没有用括号括起,因此,1+a+b也不能用括号括起。,程序输出结果:8,7.7.2 文件包含命令 #include,所谓“文件包含”,是指一个原文件可以将另外一个原文件的所有内容包含进来。其使用格式为: #include “文件名” 或:#include 例如,在前面我们已多次用此命令包含过库函数的头文件: #include “stdio.h” /* 包含

37、标准输入输出头文件*/ #include “math.h” /* 包含数学函数头文件*/ #include “string.h” /* 包含字符串处理函数头文件*/ 预处理器发现#include命令后,就会寻找后跟的文件名,并把这个文件的内容替换源代码文件中的这一行#include命令,从而把指定的文件和当前的源程序文件连成一个源文件,再对合并后的文件进行编译。,例7-23 修改例7-15求圆周长的程序成为两个文件。 文件一:文件名为mydef.h;文件内容如下: #define PI 3.14 #define C(r) 2*PI*r 文件二:文件名为perimeter.c;文件内容如下: #

38、include #include mydef.h void main() double radius,perimeter; printf(Enter The Radiusn); scanf(%lf, ,此处宏展开为 perimeter=2*3.14*radius;,7.7.2 文件包含命令 #include,例7.24 下面程序由两个源程序文件14.h和14.c组成,程序编译运行后的结果是。 14.H的源程序为: #define N 10 #define f2(x) (x*N) 14.C的源程序为: #include #define M 8 #define f(x) (x)*M) #include “14.h” main() int i,j; i=f(1+1);j=f2(1+1); printf(“%d %dn,i,j); ,f(1+1)展开为: (1+1)*8),f2(1+1)展开为: (1+1*10),7.7.2

温馨提示

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

评论

0/150

提交评论