第7章 用函数实现模块化程序设计_第1页
第7章 用函数实现模块化程序设计_第2页
第7章 用函数实现模块化程序设计_第3页
第7章 用函数实现模块化程序设计_第4页
第7章 用函数实现模块化程序设计_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

1、7.1为什么要用函数为什么要用函数 7.2怎样定义函数怎样定义函数7.3调用函数调用函数7.4对被调用函数的声明和函数原型对被调用函数的声明和函数原型7.5函数的嵌套调用函数的嵌套调用 7.6函数的递归调用函数的递归调用7.7数组作为函数参数数组作为函数参数 7.8局部变量和全局变量局部变量和全局变量7.9变量的存储方式和生存期变量的存储方式和生存期7.10 关于变量的声明和定义关于变量的声明和定义7.11 内部函数和外部函数内部函数和外部函数问题:问题:u如果程序的功能比较多,规模比较大,把所有代如果程序的功能比较多,规模比较大,把所有代码都写在码都写在main函数中,就会使主函数变得庞杂、

2、函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难头绪不清,阅读和维护变得困难u有时程序中要多次实现某一功能,就需要多次重有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码复编写实现此功能的程序代码,这使程序冗长,这使程序冗长,不精炼不精炼解决的方法:用解决的方法:用模块化程序设计的思路模块化程序设计的思路u采用采用“组装组装”的办法简化程序设计的过程的办法简化程序设计的过程u事先编好一批实现各种不同功能的函数事先编好一批实现各种不同功能的函数u把它们保存在函数库中把它们保存在函数库中,需要时需要时直接用直接用解决的方法:用解决的方法:用模块化程序设计的思路模块化程序

3、设计的思路u函数就是功能函数就是功能u每一个函数用来实现一个特定的功能每一个函数用来实现一个特定的功能u函数的名字应反映其代表的功能函数的名字应反映其代表的功能在设计一个较大的程序时,往往把它分为若干个在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能个函数实现一个特定的功能程序可由一个主函数和若干个其他函数构成程序可由一个主函数和若干个其他函数构成主函数调用其他函数,其他函数也可以互相调用主函数调用其他函数,其他函数也可以互相调用同一个函数可以被一个或多个函数调用任意多次同一个函数可以被一个或

4、多个函数调用任意多次一个较大的程序可分为若干个程序模块程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序子程序实现模块的功能。子程序由函数来完成。一个程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。同一个函数可以被一个或多个函数调用任意多次。函数间的调用关系函数间的调用关系可以使用库函数可以使用库函数可以使用自己编写的函数可以使用自己编写的函数在程序设计中要善于利用函数,可以减少在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,同时可以方便重复

5、编写程序段的工作量,同时可以方便地实现模块化的程序设计地实现模块化的程序设计例例7.1 输出以下的结果,用函数调用实现。输出以下的结果,用函数调用实现。 * How do you do! *main()PrintStar();PrintMessage();PrintStar();PrintStar()printf(“*n”);PrintMessage()printf(“ Hellon”);PrintStar函数PrintMessage函数main函数主函数两个自定义函数* Hello*7.2.1 为什么要定义函数为什么要定义函数7.2.2 定义函数的方法定义函数的方法C语言要求,在程序中用到的

6、所有函数,语言要求,在程序中用到的所有函数,必须必须“先定义,后使用先定义,后使用”指定指定函数函数名字名字、函数、函数返回值类型返回值类型、函数、函数实现的实现的功能功能以及以及参数的个数与类型参数的个数与类型,将,将这些信息通知编译系统。这些信息通知编译系统。指定函数的名字,以便以后按名调用指定函数的名字,以便以后按名调用指定函数类型,即函数返回值的类型指定函数类型,即函数返回值的类型指定函数参数的名字和类型,以便在调指定函数参数的名字和类型,以便在调用函数时向它们传递数据用函数时向它们传递数据指定函数的功能。这是最重要的,这是指定函数的功能。这是最重要的,这是在函数体中解决的在函数体中解

7、决的对于对于库函数,程序设计者只需用库函数,程序设计者只需用#include指令把有关的头文件包含到指令把有关的头文件包含到本文件模块中即可本文件模块中即可程序设计者需要在程序中自己定义想用程序设计者需要在程序中自己定义想用的而库函数并没有提供的函数的而库函数并没有提供的函数函数定义的一般形式函数定义的一般形式类型符类型符 函数名函数名(形式参数说明表形式参数说明表)说明部分说明部分语句部分语句部分函数首部函数首部函数体函数体完整的函数定义完整的函数定义无参函数定义无参函数定义空函数定义空函数定义int read() int x;scanf(“%d”,&x);return x; o 例

8、7.2实参和形参void main() int a=15,b=20,c;c=max(a+10,b); printf(“Max=%d”,c);int max(int x,int y) int z;z=xy?x:y;return z; main函数函数max函数函数形参形参实参实参15207.3.1函数调用的形式函数调用的形式7.3.2函数调用时的数据传递函数调用时的数据传递7.3.3函数调用的过程函数调用的过程7.3.4函数的返回值函数的返回值函数调用的一般形式函数名(实参表) 如果是调用无参函数,则实参表可以没有,但括号不能省略。如果实参表包含多个实参,则各参数之间用逗号隔开。实参与形参的个数

9、应相等,类型应一致。实参与形参按顺序对应,一一传递数据。如:p=power(2.5,4);/* ok */q=power(2.5,3.8);/* error */s=power(2.5);/* error */t=power(5,3);/* ok */ 函数调用的方式1函数语句:即把函数调用作为一个语句。如:printStar();printf(“*”); 这时不要求函数带回值,只要求完成一定的操作,通常将函数字义为“void”类型。2函数表达式:函数出现在可以写表达式的地方,此时需要的是函数的值。如:1.形式参数和实际参数形式参数和实际参数u在调用有参函数时,主调函数和被调用函在调用有参函数

10、时,主调函数和被调用函数之间有数据传递关系数之间有数据传递关系u定义函数时函数名后面的变量名称为定义函数时函数名后面的变量名称为“形形式参数式参数”(简称(简称“形参形参”)u主调函数中调用一个函数时,函数名后面主调函数中调用一个函数时,函数名后面参数称为参数称为“实际参数实际参数”(简称(简称“实参实参”)u 实际参数可以是常量、变量或表达式实际参数可以是常量、变量或表达式2. 实参和形参间的数据传递实参和形参间的数据传递u在调用函数过程中,系统会把实参的值传在调用函数过程中,系统会把实参的值传递给被调用函数的形参递给被调用函数的形参u或者说,形参从实参得到一个值或者说,形参从实参得到一个值

11、u该值在函数调用期间有效,可以参加该值在函数调用期间有效,可以参加被调被调函数中的运算函数中的运算 例例7.3 输入两个整数,要求输出其中值较输入两个整数,要求输出其中值较大者。要求用函数来找到大数。大者。要求用函数来找到大数。先编写先编写max函数:函数:int max(int x,int y) int z; z=xy?x:y; return(z); 在在max函数上面函数上面,再编写主函数再编写主函数#include int main() int max(int x,int y); int a,b,c; printf(“two integer numbers: ); scanf(“%d,%

12、d”,&a,&b); c=max(a,b); printf(“max is %dn”,c); 实参可以是常量、变量或表达式实参可以是常量、变量或表达式 c=max(a,b); (main函数)函数)int max(int x, int y) (max函数)函数) int z; z=xy?x:y; return(z); 在定义函数中指定的形参,在未出现函数在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。调用时,它们并不占内存中的存储单元。在发生函数调用时,函数在发生函数调用时,函数max的形参被临的形参被临时分配内存单元。时分配内存单元。2a3bxy23实

13、参实参形参形参调用结束,形参单元被释放调用结束,形参单元被释放实参单元仍保留并维持原值,没有改变实参单元仍保留并维持原值,没有改变如果在执行一个被调用函数时,形参的值如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值发生改变,不会改变主调函数的实参的值2a3bxy23实参实参形参形参通常,在调用一个函数时,都希望被调函数通常,在调用一个函数时,都希望被调函数能返回一个确定的值。这就是函数的返回值。能返回一个确定的值。这就是函数的返回值。函数的返回值是通过返回语句函数的返回值是通过返回语句return实现实现的,返回语句的形式为:的,返回语句的形式为:return; 或 r

14、eturn 表达式;前一种形式,函数返回值是不确定的,这时前一种形式,函数返回值是不确定的,这时调用者一般对返回值不感兴趣,同时将函数调用者一般对返回值不感兴趣,同时将函数说明成说明成void类型。后一种形式,函数要把类型。后一种形式,函数要把“表达式表达式”的值返回给调用者。的值返回给调用者。 在一个函数中调用另一个函数需要具备如在一个函数中调用另一个函数需要具备如下条件:下条件:(1) 被调用函数必须是已经定义的函数(是库被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)函数或用户自己定义的函数)(2) 如果使用库函数,应该在本文件开头如果使用库函数,应该在本文件开头加相加相应

15、的应的#include指令指令(3) 如果使用自己定义的函数,而该函数的位如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该声明置在调用它的函数后面,应该声明对被调函数的声明 void main() int a=10,b=20,c; c=max(a,b); printf(“%dn”,c);int max(int x, int y) return xy?x:y;o怎样使这些信息正确呢?C编译系统假定: 1、函数名:max 2、函数类型:int根据扫描得知: 3、有两个参数 4、每一个参数的类型均为int该函数与已知信息相符。由于类型的变化,使该函数与已知信息不相符。这句有错误!o函数

16、声明有三种格式:n格式1:函数类型 函数名(形参说明表);n格式2:函数类型 函数名(形参类型表);n格式3:函数类型 函数名( );o如:nint max(int x,int y);nint max(int,int);nint max();o例7.4 求最大值函数原型#include float max(float x,float y) return xy?x:y;main()float a=10,b=20,c;c=max(a,b);printf(%fn,c);保存:返回地址当前现场恢复:主调程序现场返回地址main( )调fun( )结束fun()返回图7.1 函数调用的过程o 练习:1.

17、计算n!的数学定义为:请编写函数fact()求n!。2.在上题基础上编写函数求 。m与n通过键盘输入,注意判断m与n的关系。1)!1(101!nnnnnn或)!( !nmnmCnmo 语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。 例例7.5 输入输入4个整数,找出其中最大的数。个整数,找出其中最大的数。用函数的嵌套调用来处理。用函数的嵌套调用来处理。解题思路:解题思路:umain中调用中调用max4函数,找函数,找4个数中最大者个数中最大者umax4中再调用中再调用max2,找两个数中的大者找两个数中的大者umax4中多次调用中多次调用max2

18、,可找,可找4个数中的大个数中的大者,然后把它作为函数值返回者,然后把它作为函数值返回main函数函数umain函数中输出结果函数中输出结果#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函数主函数对对max4 函数声明函数声明输入输入4个整数个整数

19、调用后肯定是调用后肯定是4个数中最大者个数中最大者输出最大者输出最大者int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函数函数对对max2 函数声明函数声明a,b中较大者中较大者a,b,c中较大者中较大者a,b,c,d中最大者中最大者int max2(int a,int b) if(a=b) return a; else return b; 找找a,b中较大者中较大者return(ab?a:b);int ma

20、x4(int a,int b,int c,int d) int max2(int a,int b); ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); #include int main() max=max4(a,b,c,d); 在调用一个函数的过程中又出现直接或间在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的接地调用该函数本身,称为函数的递归调递归调用用。语言的特点之一就在于允许函数的递归语言的特点之一就在于允许函数的递归调用。调用。 例例7.6 有有5个学生坐在一起个学生坐在一起

21、u问第问第5个学生多少岁?他说比第个学生多少岁?他说比第4个学生大个学生大2岁岁u问第问第4个学生岁数,他说比第个学生岁数,他说比第3个学生大个学生大2岁岁u问第问第3个学生,又说比第个学生,又说比第2个学生大个学生大2岁岁u问第问第2个学生,说比第个学生,说比第1个学生大个学生大2岁岁u最后问第最后问第1个学生,他说是个学生,他说是10岁岁u请问第请问第5个学生多大个学生多大 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 a

22、ge(5) =18 回溯阶段回溯阶段 递推阶段递推阶段结束递归的条件结束递归的条件#include int main() int age(int n); printf(NO.5,age:%dn,age(5); return 0; int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); age(5)输出输出age(5)mainc=age(4)+2age函数函数n=5c=age(3)+2age函数函数n=4c=age(1)+2age函数函数n=2c=age(2)+2age函数函数n=3c=10age函数函数n=1age(1

23、)=10age(2)=12age(3)=14age(4)=16age(5)=1818例例7.7 用递归方法求!。用递归方法求!。#include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%dn,n,y); return 0;int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0 | | n=1) f=1; else f=fac(n-1)

24、*n; return(f); 注意溢出注意溢出fac(5)输出输出fac(5)mainf=fac(4)5fac函数函数n=5f=fac(3)4fac函数函数n=4f=fac(1)2fac函数函数n=2f=fac(2)3fac函数函数n=3f=1fac函数函数n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120 例例7.8 Hanoi(汉诺)塔问题。古代有一(汉诺)塔问题。古代有一个梵塔,塔内有个梵塔,塔内有3个座个座A、B、C,开始时,开始时座上有座上有64个盘子,盘子大小不等,大的个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这在下,

25、小的在上。有一个老和尚想把这64个盘子从座移到座,但规定每次只允个盘子从座移到座,但规定每次只允许移动一个盘,且在移动过程中在许移动一个盘,且在移动过程中在3个座个座上都始终保持大盘在下,小盘在上。在移上都始终保持大盘在下,小盘在上。在移动过程中可以利用动过程中可以利用B座。要求编程序输出座。要求编程序输出移动一盘子的步骤。移动一盘子的步骤。ABCABC将将63个从个从A到到B第第1个和尚的做法个和尚的做法ABC将将63个从个从A到到B第第1个和尚的做法个和尚的做法ABC将将1个从个从A到到C第第1个和尚的做法个和尚的做法ABC将将1个从个从A到到C第第1个和尚的做法个和尚的做法ABC将将63

26、个从个从B到到C第第1个和尚的做法个和尚的做法ABC将将63个从个从B到到C第第1个和尚的做法个和尚的做法ABC将将62个从个从A到到C第第2个和尚的做法个和尚的做法ABC将将62个从个从A到到C第第2个和尚的做法个和尚的做法ABC将将1个从个从A到到B第第2个和尚的做法个和尚的做法ABC将将1个从个从A到到B第第2个和尚的做法个和尚的做法ABC将将62个从个从C到到B第第2个和尚的做法个和尚的做法ABC将将62个从个从C到到B第第2个和尚的做法个和尚的做法第第3个和尚的做法个和尚的做法第第4个和尚的做法个和尚的做法第第5个和尚的做法个和尚的做法第第6个和尚的做法个和尚的做法第第7个和尚的做法

27、个和尚的做法第第63个和尚的做法个和尚的做法第第64个和尚仅做:将个和尚仅做:将1个从个从A移到移到CABC将将3个盘子从个盘子从A移到移到C的全过程的全过程将将2个盘子从个盘子从A移到移到BABC将将3个盘子从个盘子从A移到移到C的全过程的全过程将将2个盘子从个盘子从A移到移到BABC将将3个盘子从个盘子从A移到移到C的全过程的全过程将将1个盘子从个盘子从A移到移到CABC将将3个盘子从个盘子从A移到移到C的全过程的全过程将将1个盘子从个盘子从A移到移到CABC将将3个盘子从个盘子从A移到移到C的全过程的全过程将将2个盘子从个盘子从B移到移到CABC将将3个盘子从个盘子从A移到移到C的全过程

28、的全过程将将2个盘子从个盘子从B移到移到CABC将将2个盘子从个盘子从A移到移到B的过程的过程将将1个盘子从个盘子从A移到移到CABC将将2个盘子从个盘子从A移到移到B的过程的过程将将1个盘子从个盘子从A移到移到CABC将将2个盘子从个盘子从A移到移到B的过程的过程将将1个盘子从个盘子从A移到移到BABC将将2个盘子从个盘子从A移到移到B的过程的过程将将1个盘子从个盘子从A移到移到BABC将将2个盘子从个盘子从A移到移到B的过程的过程将将1个盘子从个盘子从C移到移到BABC将将2个盘子从个盘子从A移到移到B的过程的过程将将1个盘子从个盘子从C移到移到BABC将将2个盘子从个盘子从B移到移到C的

29、过程的过程ABC将将2个盘子从个盘子从B移到移到C的过程的过程ABC将将2个盘子从个盘子从B移到移到C的过程的过程ABC将将2个盘子从个盘子从B移到移到C的过程的过程由上面的分析可知:将由上面的分析可知:将n个盘子从个盘子从A座移座移到到C座可以分解为以下座可以分解为以下3个步骤:个步骤:(1) 将将A上上n-1个盘借助个盘借助C座先移到座先移到B座上座上(2) 把把A座上剩下的一个盘移到座上剩下的一个盘移到C座上座上(3) 将将n-1个盘从个盘从B座借助于座移到座借助于座移到C座上座上#include int main() void hanoi(int n,char one, char tw

30、o,char three); int m; printf(“the number of diskes:); scanf(%d,&m); printf(move %d diskes:n,m); hanoi(m,A,B,C);void hanoi(int n,char one,char two, char three) void move(char x,char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(ch

31、ar x,char y) printf(%c-%cn,x,y); 7.7.1数组元素作函数实参数组元素作函数实参7.7.2数组名作函数参数数组名作函数参数7.7.3多维数组名作函数参数多维数组名作函数参数 例例7.8 输入输入10个数,要求输出其中值个数,要求输出其中值最大的元素和该数是第几个数。最大的元素和该数是第几个数。#include int main() int max(int x,int y); int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for

32、(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“largest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y) return(xy?x:y); 除了可以用数组元素作为函数参数外,除了可以用数组元素作为函数参数外,还可以用数组名作函数参数还可以用数组名作函数参数(包括实参包括实参和形参和形参)用数组元素作实参时,向形参变量传用数组元素作实参时,向形参变量传递的是数组元素的值递的是数组元素的值用数组名作函数实参时,向形参用数组名作函数实参时,向形参 传递传递的是数组首元素的

33、地址的是数组首元素的地址 例例7.9 有一个一维数组有一个一维数组score,内放,内放10个学生成绩,求平均成绩。个学生成绩,求平均成绩。#include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 定义实参数组定义实参数组float averag

34、e(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver);定义形参数组定义形参数组相当于相当于score0相当于相当于scorei 例例7.10用选择法对数组中用选择法对数组中10个整数按由个整数按由小到大排序。小到大排序。a0 a1 a2 a3 a4 3 6 1 9 4 1 6 3 9 4 1 3 6 9 4 1 3 4 9 6 1 3 4 6 9小到大排序小到大排序#include int main() void sort(int arra

35、y,int n); int a10,i; printf(enter array:n); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(The sorted array:n); for(i=0;i10;i+) printf(%d ,ai); printf(n); return 0; void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; arrayk=arrayi; ar

36、rayi=t; 在在sortisort9中,中,最小数与最小数与sorti对换对换 例例7.11 有一个的矩阵,求所有有一个的矩阵,求所有元素中的最大值。元素中的最大值。#include int main() int max_value(int array4); int a34=1,3,5,7,2,4,6,8, 15,17,34,12; printf(“Max value is %dn”, max_value(a); return 0;可以省略可以省略不能省略不能省略要与要与形参数组第形参数组第二二维大小维大小相同相同int max_value(int array4) int i,j,max;

37、 max = array00; for (i=0;i3;i+) for(j=0;jmax) max = arrayij; return (max);要与实参要与实参数组第数组第二二维大小维大小相同相同7.8.1 局部变量局部变量7.8.2 全局变量全局变量定义变量可能有三种情况:定义变量可能有三种情况:u在函数的开头定义在函数的开头定义u在函数内的复合语句内定义在函数内的复合语句内定义u在函数的外部定义在函数的外部定义SOUTHWEST UNIVERSITY OF SCIENCE AND TECHNOLOGYchar ch;double fun2(char c) float b;ch=c;int x;main() int m,n; 在函数内部说明的变量是局部变量。作用域:自说明位置起至函数结束止。在函数外部说明的变量是全局部变量。作用域:自说明位置起至文件结束止。SOUTHWEST UNIVERSITY OF SCIENCE AND TECHNOLOGYo 在定义一个变量时,除了指定其数据类型外,还可以指定其存储类别。o C语言中用四个关键字来表示存储类别:n auto 自动的n register寄存器的n static 静态的n extern 外部的 SOUTHWEST UNIVERSITY OF SCIENCE AND TECHNOL

温馨提示

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

评论

0/150

提交评论