C语言程序设计 课件 单元6 六函数_第1页
C语言程序设计 课件 单元6 六函数_第2页
C语言程序设计 课件 单元6 六函数_第3页
C语言程序设计 课件 单元6 六函数_第4页
C语言程序设计 课件 单元6 六函数_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

单元六

函数-分而治之,相互协作导学【问题】什么是函数?

函数是可以执行固定功能的代码段,它在程序中的作用非常重要,充分体现了模块化设计的思想。函数之间分而治之、相互协作可以实现代码复用,提高程序的可扩展性。关于函数的具体概念,以及如何应用,这是本单元将要学习的内容。函数的定义2函数的调用3函数的递归调用4函数的综合应用目录1函数的定义-函数的概念

在程序中可以执行固定功能的代码段就称为函数。

除此之外我们可以自定义函数,实现特定的功能需求,main函数中根据需求调用函数,这样不仅可以简化程序设计,还可以实现代码的复用。

C语言中,Main函数是程序执行的入口,除了Main函数,还有大量的库函数,这些函数都被赋予了特定的功能,比如printf()、scanf()、putchar()、getchar()函数等,正确应用库函数,可以简化程序代码并提高效率。函数的定义-函数的定义格式

函数由函数头和函数体组成,函数头包括函数的返回值类型、函数名和参数列表三部分,具体定义格式如下:函数返回值类型函数名(参数列表){函数体;}函数的定义-函数的定义格式

(1)函数名:函数名的命名需要符合标识符的命名规则,由字母、数字、下划线组成,并且不能以数字开头。还应该遵循一个开发中默认的原则:见名知义,最好函数的取名能够在一定程度上代表函数实现的功能,这对于后续程序的扩展和应用是有现实意义的。

函数的定义-函数的定义格式

(2)函数的返回值类型:函数返回值的数据类型,可以是单元二中学习的任何数据类型,也可以是某个数据类型的指针,关于指针的概念,将在单元七中讲授。

当函数有返回值类型时,函数体中必须有return语句,用来返回结果,注意返回的结果的数据类型必须与函数头中的返回值类型一致;如果函数没有返回值,返回值类型必须用void修饰。

函数的返回值类型,其实对应着函数的执行是否有输出的结果。

函数的定义-函数的定义格式

(3)参数列表:函数名后面的小括号中,存放的是函数的参数列表,可以为空,也可以有多个参数,多个参数之间以“,”分割。这里的参数称为形式参数,只有变量的声明,调用函数时,需要对应形参,传入实际参数的值,注意形参与实参的数据类型、个数必须完全对应。

参数列表,其实对应着函数的执行是否需要有输入的数据。函数的定义-函数的定义格式

(4)函数体:函数要执行的功能代码放在函数体中。函数的定义-如何定义函数

【例6-1】定义一个函数,打印6个*型。

【解题思路】该函数需要打印6个*型,功能简单明确,没有需要输入给函数的数据,因此没有参数;函数中直接打印图形,没有需要返回的结果,因此函数没有返回值,用void修饰。

(1)无返回值、无参数的函数的定义

【源代码】voidprint(){printf(“******”);}函数的定义-如何定义函数

【例6-2】定义一个函数,实现两个整数的加法运算,函数中打印运算结果。

【解题思路】该函数要求实现两个整数的加法运算,两个整数是未知的,是需要输入给函数的数据,因此,可以将两个整数作为函数的形式参数;函数中要求打印运算结果,因此函数没有输出的结果,也就没有返回值类型,用void修饰。

【源代码】voidsum(inta,intb){printf(“%d+%d=%d”,a,b,a+b);}(2)无返回值、有参数的函数的定义。函数的定义-如何定义函数

【例6-3】定义一个函数,实现圆的周长和面积的运算,函数中打印运算结果,保留两位小数。

【解题思路】该函数要求计算圆的周长和面积,半径是未知的,,因此,可以将半径作为函数的形式参数;函数中要求打印运算结果,因此函数没有输出的结果,也就没有返回值类型,用void修饰。

(2)无返回值、有参数的函数的定义。

【源代码】voidcal(doubler){printf(“圆的半径为:%.2f”,3.14*r*r);printf(“圆的周长为:%.2f”,3.14*2*r);}函数的定义-如何定义函数

【例6-4】定义一个函数,判断一个整数的奇偶,打印出结果。

【解题思路】该函数要求判断整数的奇偶,该整数是未知的,因此,可以将整数作为函数的形式参数;函数中要求打印运算结果,因此没有输出的结果,也就没有返回值类型,用void修饰。(2)无返回值、有参数的函数的定义。

【源代码】voidjudge(inta){ if(a%2==0){ printf("%d是偶数",a); } else{ printf("%d是奇数",a); }}函数的定义-如何定义函数

【例6-5】定义一个函数,实现对一个整数数字的加密,加密规则为:(整数*8+256)/5-整数/2,并将加密结果以整数的形式返回。

【解题思路】函数要求对一个整数进行加密,该整数是未知的,可以将整数作为函数的参数;函数要求将加密运算的结果以整数的形式返回,因此函数有返回值,返回的结果要求是整数,返回值类型确定为整数类型。

(3)有返回值、有参数的函数的定义。

【源代码】intencrypt(intnum){ intresult=(num*8+256)/5-num/2; returnresult;}函数的定义-如何定义函数

【例6-6】定义一个函数,实现对学生成绩等级的判断。小于60分的为’D’;60-70之间的为’C’;70-90之间的为’B’;90分以上的为’A’,并将等级以字符的形式返回。

【解题思路】函数要求根据学生的成绩判断等级,成绩是未知的,可以将成绩作为函数的参数;最后需要将判断得到的等级以字符的形式返回,因此函数有返回值,返回的结果是字符,返回值类型确定为字符类型。(3)有返回值、有参数的函数的定义。函数的定义-如何定义函数

【例6-6】【源代码】charlevelJudge(doublescore){ if(score<60&&score>=0){ return'D'; } elseif(score>=60&&score<70){ return'C'; } elseif(score>=70&&score<90){ return'B'; } elseif(score>=90&&score<=100){ return'A'; } else{ return'N'; }}(3)有返回值、有参数的函数的定义。函数的定义-函数的声明

函数的声明与函数的定义的区别是,函数的声明没有函数体,函数头后面直接“;”结束。具体格式如下:

函数返回值类型函数名(参数列表);

【例6-7】声明一个函数实现两个数的减法。

voidminus(inta,intb);函数的定义-函数的声明

注意:

(1)函数声明的作用是把函数的相关信息告知编译系统,编译程序时,编译系统检查被调用函数是否存在。与变量一样,函数也是需要先声明再使用。

(2)正是因为函数声明的作用,当函数的定义放在调用之前时,可以不进行函数声明;如果函数的定义放在调用之后,最好在调用之前进行声明,否则可能会因为调用函数时找不到函数,发生编译错误。

(3)函数声明中函数头的格式必须与函数定义中保持一致。

(4)函数的声明中,参数列表可以没有变量名,而只有数据类型的声明。

例如上面【6-7】实例中可以写为如下格式;

voidminus(int,int);函数的定义2函数的调用3函数的递归调用4函数的综合应用目录1函数的调用-函数调用格式

函数声明定义完毕,并不能执行功能,只有使用函数,才能发挥函数的作用。使用函数的过程称为函数的调用。调用函数的格式为:

函数名(实际参数列表);函数的调用-函数调用格式

(1)函数如果有形式参数,调用函数需要传入实际参数,也就是形式参数的值,实参与形参必须一一对应。

如果没有形式参数,调用时也为空参。

例如上一个任务中,例【6-1】、【6-2】定义的函数,调用格式为:print();

sum(2,3);

(2)函数如果有返回值类型,说明函数有输出的结果,这个结果可以继续进行其他操作,比如直接打印,或者进行运算等等。

如果没有返回值类型,直接调用即可。函数的调用-函数调用格式函数中调用另一个函数的过程如下图6-1所示。fun1()函数执行过程中,调用fun2()函数,fun2()执行完毕,返回fun1()继续向下执行。函数的调用-函数参数传递

有参数的函数,定义时的参数为形式参数,简称形参。形参只是变量的声明,没有实际的数据,因此不占用内存。调用函数的时候需要对应形参,传入实际的参数,实参可以是常量、变量或者表达式等,但是必须有确定的值,而且形参与实参的数据类型、个数、顺序必须完全一致。

以上所述,对应函数定义的形参,调用时传入实参的过程称为参数的传递。

函数的调用-函数调用的应用

【例6-8】定义一个函数,打印出1到100之间的所有自然数,主函数中调用该函数。

【解题思路】该函数直接打印确定范围内的自然数,不需要输入数据,也没有返回结果,因此,函数的定义没有返回值类型、没有形式参数。主函数直接调用即可。1.没有返回值、没有形参的函数的调用。

【源代码】#include<stdio.h>voidprint(){ inti; for(i=1;i<=100;i++){ printf("%d",i); }}intmain(){ print(); //调用自定义的print()函数return0;}函数的调用-函数调用的应用1.没有返回值、没有形参的函数的调用。

【运行结果】123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100函数的调用-函数调用的应用

【例6-9】定义一个函数,打印出两个小数四则运算的各个结果。主函数中调用该函数。

【解题思路】该函数需要计算两个小数的运算结果,两个小数是未知的,需要输入给函数,作为形式参数;函数直接打印结果,因此没有返回值,也就没有返回值类型。主函数调用时,需要对应形参,传入实参。2.没有返回值、有形参的函数的调用。

函数的调用-函数调用的应用2.没有返回值、有形参的函数的调用。

【源代码】voidcal(doublea,doubleb){ printf("%.2f+%.2f=%.2f\n",a,b,a+b); printf("%.2f-%.2f=%.2f\n",a,b,a-b); printf("%.2f*%.2f=%.2f\n",a,b,a*b); printf("%.2f/%.2f=%.2f\n",a,b,a/b);

}intmain(){//调用自定义函数cal(doublea,doubleb) //注意:实参的顺序、个数、数据类型需要与形参一致//形参是两个double类型的小数,实参也必须是两个double类型的小数 cal(2.8,9.6);return0;}

【运行结果】2.80+9.60=12.402.80-9.60=-6.802.80*9.60=26.882.80/9.60=0.29函数的调用-函数调用的应用

【例6-10】自定义一个函数,实现n行,m列,某种符号的打印,n、m和具体符号未知,主函数中调用。

【解题思路】行、列、符号未知,因此函数需要输入三个数据,有三个形式参数;函数中直接打印,没有返回结果,函数定义没有返回值类型。主函数调用时,传入对应的实参。2.没有返回值、有形参的函数的调用。

函数的调用-函数调用的应用2.没有返回值、有形参的函数的调用。

【源代码】voidpr(inta,intb,charc){ inti,j; for(i=0;i<a;i++){ for(j=0;j<b;j++){

printf("%c",c); } printf("\n"); }}intmain(){//调用自定义函数pr(inta,intb,charc)//注意:实参的顺序、个数、数据类型需要与形参一致

pr(5,3,’$’);return0;}【运行结果】$$$$$$$$$$$$$$$函数的调用-函数调用的应用

【例6-11】自定义一个函数,计算圆的面积,返回结果,主函数中调用,打印面积的值。

【解题思路】该函数要计算圆的面积,需要知道半径的值,半径是未知的,函数需要输入数据,因此半径可以作为函数的形式参数;函数最终返回面积的结果,因此有返回值类型,类型是面积的数据类型。主函数调用时需要传入对应的实参,并且接收函数的结果,进行打印。3.有返回值、有形参的函数的调用。

函数的调用-函数调用的应用3.有返回值、有形参的函数的调用。

【源代码】doublecalArea(intr){ return3.14*r*r;}intmain(){ //调用函数doublecalArea(intr) //传入对应的实参, //形参为一个int类型的整数,实参是一个int类型的整数值 //函数有返回值类型double,需要用一个相同数据类型的double变量接收函数调用的结果 doublere=calArea(2); printf("圆的面积为:%.2f",re);//打印计算结果return0;}

【运行结果】

圆的面积为:12.56函数的调用-函数调用的应用

在一个函数调用另一个函数的过程中又调用另一个函数,这叫做函数的嵌套调用。

例如:自定义两个函数fun1()、fun2(),fun2()中调用fun1(),主函数中调用fun2()。voidfun1(){}voidfun2(){fun1();}intmain(){fun2();}

调用过程如下图6-2所示。4.函数的嵌套调用

图6-2函数嵌套调用的执行过程函数的调用-函数调用的应用

【例6-12】自定义一个函数visit(),遍历数组,打印元素的值;自定义一个函数showArray(),生成一个整型数组,然后调用visit()函数遍历数组。主函数调用showArray()函数。4.函数的嵌套调用

【源代码】#include<stdio.h>voidvisit(inta[]){ inti; for(i=0;i<10;i++){

printf("%d",a[i]);

} }voidshowArray(){ inta[10],i; for(i=0;i<10;i++){

a[i]=i;

}

visit(a);}intmain(){

showArray();return0;}【运行结果】0123456789函数的调用-宏定义函数

如果一个函数的功能可以用一个公式表达式来实现,比如求圆的面积、正方形周长、四则运算等,可以使用带参数的宏定义函数来简化代码。【例6-13】用带参数的宏定义计算圆的面积。【源代码】#include<stdio.h>#definePI3.14#defineS(r)PI*r*rintmain(){ doubler; printf("请输入圆的半径"); scanf("%lf",&r); doubles=S(r); printf("圆的面积为:%.2f",s);return0;}【运行结果】请输入圆的半径2圆的面积为:12.56函数的调用-宏定义函数1.带参数宏定义的格式:#define宏名(形式参数列表)字符串注意:宏名与常量一样,一般用大写字母表示;形式参数列表可以空参也可以由多个参数,多个参数之间用“,”分割;字符串需要使用参数列表中的各个形参。2.带参宏调用的一般形式宏名(实际参数列表);注意:宏调用时,对实参表达式不做任何计算,而是直接用实参原样替代形参,形成新的表达式,然后再进行计算。函数的调用-宏定义函数【例6-14】用带参数的宏定义计算长方形的面积。【源代码】#include<stdio.h>#defineL(a,b)a*bintmain(){ doublea,b; printf("请输入长方形两个边长:"); scanf("%lf%lf",&a,&b); doublel=L(a,b); printf("长方形面积为:%.2f/n",l);

printf("将两个边长各加上2,再次计算长方形面积"); l=L(a+2,b+2); printf("长方形面积为:%.2f/n",l);return0;}【运行结果】请输入长方形两个边长:23长方形面积为:6.00将两个边长各加上2,再次计算长方形面积长方形面积为:10.00函数的调用-宏定义函数

运行结果中,将两个边长各加上2后,计算的面积是错误的。因为宏调用时先原样替换再计算,因此L(a+2,b+2),传参后的表达式由a*b变成a+2*b+2,如果运行时输入两个边长2和3,带入到新的表达式,运算结果为2+2*3+2=10。

想要执行正确的运算,只需要在宏定义的参数处加上小括号即可。

#defineL(a,b)(a)*(b)函数的定义2函数的调用3函数的递归调用4函数的综合应用目录1函数的递归调用-递归函数

一个计算过程,如果每一步的运算都需要用到前一步或前几步的结果,这个过程称为递归过程。用递归过程定义的函数为递归函数。递归函数的调用与普通函数不同,它会直接或者间接地调用自身。

使用递归函数解决问题,首先需要明确递归关系,也就是在什么条件下,如何实现自身的调用;其次就是找出递归结束的条件,即何时停止自身的调用。函数的递归调用-递归函数从计算1-n自然数之和的例子,来学习递归的原理和使用。

定义一个函数求1+2+3+...+n的和,编写程序如下。intsum(intn){ inti,sum=0; for(i=1;i<=n;i++){ sum+=i; } returnsum;}或者直接按照数学公式,计算出总和。intsum(intn){ returnn*(n+1)/2;}函数的递归调用-递归函数换一种思路,1+2+3+...+n=1+2+3+...+(n-1)+n,其实就是前n-1项的和再加上n。sum(n)是计算1+2+3+...+n,那么前n-1项的和就是sum(n-1),因此得出结论sum(n)=sum(n-1)+n,但是这个公式是有应用条件的,也就是只有n>1的时候才成立,当n=1的时候,sum(1)=1。整理一下,求和过程可以描述为:函数的递归调用-递归函数由此,sum()函数的定义为如下形式:intsum(intn){ if(n==1){ return1; } else{ returnsum(n-1)+n; }}

在这个函数中,出现了returnsum(n-1)+n;该语句实现了对sum函数自身的调用,这就是函数的递归调用,这样定义的sum函数就是一个递归函数。函数的递归调用-递归函数

完整代码描述如下。#include<stdio.h>intsum(intn){ if(n==1){ return1; } else{ returnsum(n-1)+n; }}intmain(){ printf("%d",sum(4));return0;}运行结果:10函数的递归调用-递归函数分析一下函数的执行过程。当n=4时,开始递归调用:sum(4)=sum(3)+4;sum(3)=sum(2)+3;sum(2)=sum(1)+2;sum(1)=1;当n递归到1,计算sum(1)=1,再将上述过程反推回去:sum(2)=sum(1)+2=1+2=3;sum(3)=sum(2)+3=3+3=6;sum(4)=sum(3)+4=6+4=10;函数的递归调用-递归函数递归函数在实际开发中,用来解决某些数学问题非常简单方便。连续的运算,前后结果有关联、有规律可循,都可以使用递归解决。递归的代码比循环简洁,但是效率低于循环。下面通过两个典型的案例,进一步学习递归函数的应用。函数的递归调用-递归函数

【例6-15】计算n!。【解题思路】n!=1*2*3*...n=1*2*3...(n-1)*n,计算前n项的乘积,其实就是计算前n-1项的乘积再乘以n。定义一个函数fac(intn)来计算n!,fac(n)=fac(n-1)*n。但是在n>1的时候才可以应用此公式,当n=1时,fac(1)=1*1=1。函数的递归调用-递归函数

注意,该程序中的运算结果用int类型的变量存储,注意n的范围,当n的值大于31时,1*2*3*...*n的结果将超过int类型的表数范围,程序运行会出现异常。【源代码】#include<stdio.h>intfac(intn){ if(n==1){ return1; } else{ returnfac(n-1)*n; }}intmain(){ printf("%d",fac(4));return0;}【运行结果】:24函数的递归调用-递归函数

【例6-16】一只青蛙一次可以跳上一级台阶,也可以跳上2级,求该青蛙跳上10级的台阶总共有多少种跳法。【解题思路】台阶为1级时,有1种跳法;台阶为2级时,有2种跳法;台阶为3级时,有3种跳法;台阶为4级时,有5种跳法;台阶为5级时,有8种跳法;台阶为6级时,有13种跳法;台阶为7级时,有21种跳法;...总结规律:发现从3级台阶开始,跳法都是前面两种台阶的跳法之和。函数的递归调用-递归函数定义函数cal(intn)函数的递归调用-递归函数【源代码】#include<stdio.h>intjump(intn){ if(n==1){ return1; } elseif(n==2){ return2; } else{ return jump(n-1)+jump(n-2); }}intmain(){ printf("%d",jump(10));return0;}【运行结果】89函数的递归调用-变量的作用域变量是存储数据的基本单位,每个变量都有作用范围,称为变量的作用域。变量的作用域由其定义的位置决定,作用域之外访问变量是无效的。根据作用域的不同,变量可以分为局部变量和全局变量。函数的递归调用-变量的作用域

【例6-18】#include<stdio.h>intmain(){ inta=10; { intb=20; } printf("%d",b); printf("%d",a);return0;}

1.局部变量这个程序的main函数中定义了两个变量a,b,打印输出a和b的值,运行结果报错,原因是虽然两个变量都定义在main函数中,但是b又定义在了一个函数内部的代码块中,在代码块外部无法访问b。因此,局部变量的作用域实质上是距离它最近的一对大括号。只有在这一对大括号中,才可以访问该变量。函数的递归调用-变量的作用域

【例6-19】#include<stdio.h>intmain(){inta=10;{inta=20;printf("代码段中的变量a的值为%d\n",a);} printf("main函数中的变量a的值为%d\n",a);return0;}【运行结果】代码段中的变量a的值为20main函数中的变量a的值为10

1.局部变量main函数中定义了一个变量a,赋值10,该变量的作用域是整个main函数。函数中有一个代码段,代码段中又定义了一个变量a,赋值20,该变量的作用域是距离它最近的大括号,也就是这一个代码段。在各自的范围打印输出了各自的值。这说明,不同作用域的变量可以重名。函数的递归调用-变量的作用域

【例6-20】#include<stdio.h>voidfun(inta){ printf("%d",a);}intmain(){fun(5);return0;}自定义函数fun(inta),有一个形式参数,该参数也是局部变量,作用域是整个fun()函数。

1.局部变量函数的递归调用-变量的作用域总结:①定义在函数中的变量是局部变量,作用域为距离它最近的一对大括号。②不同作用域的变量可以重名。③自定义函数中的形式参数也是局部变量,作用域为整个函数。

1.局部变量函数的递归调用-变量的作用域在所有函数外面定义的变量称为全局变量,它属于整个源程序,作用域为定义的位置开始到源程序结束。【例6-21】#include<stdio.h>inta=10;//全局变量aintmain(){ printf("变量a的值为%d\n",a);return0;}【运行结果】变量a的值为102.全局变量函数的递归调用-变量的作用域

【例6-22】#include<stdio.h>inta=10; //全局变量aintmain(){ inta=20; //局部变量a printf("变量a的值为%d\n",a);return0;}【运行结果】变量a的值为20说明:当全局变量与局部变量重名时,局部变量的值会覆盖全局变量。2.全局变量函数的递归调用-变量的作用域C语言中,可以用static关键字修饰局部变量和全局变量,称为静态变量。静态变量在编译时分配存储空间,若不进行初始化,默认初始值为1。静态局部变量的作用域与普通变量相同,都是距离它定义最近的一对大括号。但是存储周期不同,静态局部变量的值具有继承性,定义静态局部变量的函数被多次调用时,该变量的初值是上次调用函数结束时变量的值。3.static关键字函数的递归调用-变量的作用域【例6-23】#include<stdio.h>voidfunc(){ staticintnum1=0; intnum2=0; printf("num1=%d,num2=%d\n",++num1,++num2);}intmain(){ func(); func(); func();return0;}【运行结果】num1=1,num2=1num1=2,num2=1num1=3,num2=13.static关键字函数的定义2函数的调用3函数的递归调用4函数的综合应用目录1函数的综合应用

【例6-24】自定义函数实现如下功能:(1)用户输入n个数字,计算n个数字的总和(2)返回计算结果主函数中调用该函数,运行实现功能。【解题思路】要求用户输入n个数字,n是未知的,可以作为函数的输入,抽取为形式参数。函数中将计算结果返回,因此函数有返回值类型。函数的综合应用【源代码】#include<stdio.h>doublesum1(intn){ doublesum=0;//定义总和 inti;//循环次数 doublenum;//定义变量存储输入的数字 for(i=0;i<n;i++){//循环输入数字 scanf("%lf",&num); sum+=num;//每次输入数字加到总和sum中 } returnsum;//返回sum的值}intmain(){ printf("%.2f",sum1(3));

return0;}函数的综合应用

【例6-25】计算班级学生的C语言程序设计课程考试成绩的平均分。

【解题思路】首先需要确定班级人数,可以将班级人数作为函数的形式参数,也可以在函数中使用scanf()函数,让用户输入班级人数,我们采用第二种方式。班级人数输入之后,就确定了输入学生成绩的次数,每输入一个成绩,就加到总成绩中,循环结束,总成绩确定,最后计算平均成绩,返回结果。函数的综合应用【源代码】#include<stdio.h>doubleavgScore(){ printf("请输入班级人数:"); intnum;//定义变量存储班级人数 scanf("%d",&num); printf("请输入成绩:\n"); doublescore,sum=0,avg;//定义变量存储学生成绩、总成绩、平均分 inti=0; while(i<num)

温馨提示

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

评论

0/150

提交评论