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

下载本文档

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

文档简介

1、2021-10-24第七章 函数程序 一个程序可以看作是由若干个小的子部分组成。这些子部分中,有的用于获取输入数据,有的用于计算输出数据,有的则用于显示输出数据。每个子部分都可以用函数来实现。 函数也称子程序、例程或过程,可以看做是一段小程序,用于解决某一特定问题的语句块。c是模块化程序设计语言源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nc程序c程序结构&c是函数式语言&必须有且只能有一个名为main的主函数&c程序的执行总是从main函数开始,调用其他函数后流程回到main函数,在main中结束&函数不能嵌套定义,可以嵌套调用 简单的函数main( ) void

2、 printstar( ); void print_message( ); printstar( ); print_message( ); printstar( );void printstar( ) printf(* * * * * * * * * * * * * * * * n);void print_message( ) printf( how do you do! n);* * * * * * * * * * * * * * * * how do you do !* * * * * * * * * * * * * * * *2021-10-24无论把一个程序划分为多少个程序模块,只能有

3、一个main函数。程序总是从main函数开始执行的。在程序运行过程中,由主函数调用其他函数,其他函数也可以互相调用。函数(function)的原意是“功能”。顾名思义,一个函数就是一个功能。在实际应用的程序中,主函数写得很简单,它的作用就是调用各个函数,程序各部分的功能全部都是由各函数实现的。主函数相当于总调度,调动各函数依次实现各项功能。函数可以放在若干个源文件中。2021-10-24 函数的分类函数的分类系统函数(库函数):由c语言函数库提供,用户可以直接使用。使用系统函数必须指定函数所在的包含文件用户函数(自定义函数):是用户根据需要定义的完成某一特定功能的一段程序。使用系统函数的例子#

4、include #include void main() float a,p; printf(“pls input a”); scanf(“%f”,&a); p=sqrt(a); printf(“the sqrt of a is:%f”,p);一定要将下面用到的系统函数所在的库用include加入进来使用系统提供的标准库函数时应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件函数定义的一般形式一般格式合法标识符函数返回值类型缺省int型无返回值void函数体函数类型 函数名(形参类型说明表)说明部分语句部分例 有参函数(现代风格) i

5、nt max(int x,int y) int z; z=xy?x:y; return(z); 例 有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函数 dummy( ) 函数体为空例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 2021-10-24说明函数就像一段小程序,调用一个函数就相当于在调用的这个位置运行这个小程序。如果把函数看作是一个黑盒子,那么形参就是它的输入,return语句返回的值就是他的输出。2021-10-24函数定义

6、举例求两个数之和的函数 int add(int x, int y) int z; z=x+y; return(z); 2021-10-24例:如何实现下列功能0020)(2xxxxxxf2021-10-24分段函数float f(float x) if(xy?x:y; return(z); 例:比较两个数, 并输出大者。main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(max is %d,c); max(int x, int y) int z; z=xy?x:y; return(z);形参实参说明:实参必须有确定的值形参必须指定类

7、型形参与实参类型一致,个数相同形参在函数被调用前不占内存; 函数调用时为形参分配内存;调用结束,内存释放例 计算x的立方#include float cube(float x) return(x*x*x);main() float a, product; printf(please input value of a:); scanf(%f,&a); product=cube(a); printf(”cube of %.4f is %.4fn,a,product);xaproduct1.21.21.728参数传递方式v值传递方式l方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结

8、束,形参单元被释放,实参单元仍保留并维持原值l特点:u形参与实参占用不同的内存单元u单向传递711x:y:调用前:调用结束:711x:y:例 交换两个数#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:temp函数的返回值函数的返回值返回语句v形式: return

9、(表达式); 或 return 表达式; 或 return;v功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数v说明:l函数中可有多个return语句l若无return语句,遇时,自动返回调用函数l若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换lvoid型函数例 无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(max is %dn,c

10、);max(float x, float y) float z; z=xy?x:y; return(z); printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例 函数带回不确定值输出:*10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);编译错误!4 4 函数的调用函数的调用函数调用的一般形式 函数调用的一般形式为: 函数名(实参表);说明:l实参与形参个数相等,类型一致,按顺序一一对应l实参表求值顺序,因系统而定(turbo

11、c 自右向左)函数调用时注意:不定因素 : p=f(i,+i) ; 设:i =2 按自左至右: f(2,3)按自右至左: f(3,3)应避免出现此类运算,改为: j=i; k=+i; p=f(j,k); 或 p=f(k,k) ; 可以明确main() int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例 参数求值顺序main() int i=2,p; p=f(i, +i); printf(%d,p);int f(int

12、a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);运行结果:0运行结果:-1从右向左从左向右j=+i;p=f(j,j);j=i;k=+i;p=f(j,k);2 函数调用的方式v函数语句: 例 printstar(); printf(“hello,world!n”);v函数表达式: 例 m=max(a,b)*2;v函数参数: 例 printf(“%d”,max(a,b); m=max(a,max(b,c);对被调用函数的说明v对被调用函数要求:l必须是已存在的函数l库函数: #include l用户自定义函数:

13、 函数类型说明v函数说明l一般形式: 函数类型 函数名(形参类型 形参名,. ); 或 函数类型 函数名();l作用:告诉编译系统函数类型、参数个数及类型,以便检验l函数定义与函数说明不同l函数说明位置:程序的数据说明部分(函数内或外)l下列情况下,可不作函数说明u若函数返值是char或int型,系统自动按int型处理u被调用函数定义出现在主调函数之前l有些系统(如borland c+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明例 函数说明举例main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a

14、,b); printf(max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函数可不作函数说明(borland c+不行)float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被调函数出现在主调函数之前,不必函数说明main() float add(float,float); /*function declarat

15、ion*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();#include long sum(int a, int b); long factorial(int n);main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1

16、,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); long sum(int a, int b);long factorial(int n);文件包含编译预处理命令函数说明函数定义函数调用函数调用函数返回值形参实参函数的嵌套调用函数的嵌套调用 c规定:函数定义不可嵌套,但可以嵌套调用函数main( )调用函数a结束a函数b函数调用函数b2021-10-24#include void f

17、un1(); void fun2(); void fun3(); void main() fun1(); void fun1() printf(this is begin of function 1n“); fun2(); printf(this is end of function 1n“); void fun2() printf(this is begin of function 2n”); fun3(); printf(this is end of function 2n“); void fun3() printf(this is begin of function 3n“); prin

18、tf(this is end of function 3n”); this is begin of function 1 this is begin of function 2 this is begin of function 3 this is end of function 3 this is end of function 2 this is end of function 1例 求三个数中最大数和最小数的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int

19、z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(max-min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(r1)求第5个人年龄的过程 age(5) age(5) =age(4)+2 =18 a

20、ge(4) age(4) =age(3)+2 =16 age(3) age(3) =age(2)+2 =14 age(2) age(2) =age(1)+2 =12 age(1)=10回推递推 用一个函数来描述递归过程age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c);main( ) printf(%d,age(5);运行结果:18age函数共被调用次只有一次是主函数调用其余次是函数递归调用age(5)输出输出age(5)mainc= age(4)+2c= age(3)+2c= age(2)+2c= age(1)+2c= 1

21、0age函数函数 n=5age函数函数 n=4age函数函数 n=3age函数函数 n=2age函数函数 n=1age(5)=18age(4)=16age(3)=14age(2)=12 age(1)=10age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); main( ) printf(%d,age(5);例 求n的阶乘) 1()!1() 1 , 0(1!nnnnn/*ch7_8.c*/#include int fac(int n) int f; if(n=1) f=1; else f=fac(n-1)+n; return(

22、f);main() int n, y; printf(input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y); 递推法 递归法4!=3!*43!=2!*32!=1!*21!=1回推2!=23!=64!=24递归递归与反向计算 编写一个函数,将一个编写一个函数,将一个整数转换成二进制的形式整数转换成二进制的形式 #includevoid to_binary(unsigned long n);int main(void)unsigned long number;printf(enter a integer (q

23、 to quit):n);while(scanf(%ul,&number)=1)printf(binary equivalent:);to_binary(number);putchar(n);printf(enter a integer (q to quit):n);printf(bye.n);return 0;void to_binary(unsigned long n)unsigned long r;r=n%2;if(n=2)to_binary(n/2);putchar(r ? 1 :0);return;enter a integer (q to quit):8(enter)binary

24、equivalent:1000enter a integer (q to quit):255(enter)binary equivalent:11111111enter a integer (q to quit):1024(enter)binary equivalent:10000000000enter a integer (q to quit):q(enter)bye.2021-10-24“汉诺塔”问题abcabca a柱由小到柱由小到大有大有n n个圆个圆盘,要求盘,要求借助借助b b柱把柱把a a中的圆盘中的圆盘移到移到cc柱。柱。注意:在注意:在任何时侯任何时侯,每根柱,每根柱上下面的

25、上下面的圆盘总比圆盘总比上面的大上面的大。2021-10-24思考abc1 1、可以先把、可以先把a a中的中的n-1n-1个圆盘借助个圆盘借助cc柱柱移到移到b b柱柱2 2、把、把a a中最后乘下中最后乘下的一个圆盘移到的一个圆盘移到cc柱柱3 3、把、把b b中的中的n-1n-1个圆个圆盘借助盘借助a a移到移到cc柱柱abcabc2021-10-24思考abc定义一个函数定义一个函数hanoi (n,a, c,b)。该。该函数的功能是:将函数的功能是:将n个盘子从个盘子从a杆杆上移动到杆上移动到杆c上,中间可以借助上,中间可以借助b 杆。杆。这样移动这样移动n个盘子的工作就可以按个盘子

26、的工作就可以按照以下过程进行:照以下过程进行:1) hanoi(n-1,a, b, c);2) 将一个盘子从将一个盘子从a移动到移动到c上;上;3) hanoi(n-1,b, c , a);abcabc#includevoid move(char getone, char putone) printf(%c-%cn,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) printf(%c-%cn, one, three); else hanoi(n-1,one,three,two); printf(%c-%

27、cn, one, three); hanoi(n-1,two,one,three); main() int m; printf(input the number of disks:); scanf(%d,&m); printf(the steps to moving %3d disks:n,m); hanoi(m,a,b,c);abc5.4.5 递归的优缺点递归的优缺点使用递归的优点是为某些编程问题提供了最简单的解决方使用递归的优点是为某些编程问题提供了最简单的解决方法,最大的缺点是一些递归算法会很快耗尽计算机的内存法,最大的缺点是一些递归算法会很快耗尽计算机的内存资源。资源。 long fi

28、bonacci(int n)if(n2)return fibonacci(n-1)+ fibonacci(n-2);else return 1;创建的变量过多创建的变量过多耗尽内存资源耗尽内存资源5.5 头文件的使用头文件的使用例:为一连锁饭店开发一个管理程序。该连锁饭店共有四家旅例:为一连锁饭店开发一个管理程序。该连锁饭店共有四家旅馆,每个旅馆的收费标准不同,但一个特定旅馆的所有房间的馆,每个旅馆的收费标准不同,但一个特定旅馆的所有房间的收费一样。预定时间超过一天的客户,第二天的收费是第一天收费一样。预定时间超过一天的客户,第二天的收费是第一天的的95%,第三天是第二天的,第三天是第二天的9

29、5%,依此类推。程序要求对于指,依此类推。程序要求对于指定的旅馆和住宿天数计算费用,并且实现一个菜单可以反复进定的旅馆和住宿天数计算费用,并且实现一个菜单可以反复进行数据输入。行数据输入。#include#includehotal.h int main(void)int days;double hotal_rate;int code;声明函数声明函数while(code=menu()!=quit)switch(code)case 1:hotal_rate=hotal1; break;case 2:hotal_rate=hotal2; break;case 3:hotal_rate=hotal3

30、; break;case 4:hotal_rate=hotal4; break;days=getdays();showprice(hotal_rate,days);printf(thank you and goodbye.n);return 0;#include#includehotal.h int menu(void)int code,status;printf(n%s%sn,stars,stars);printf(enter the number of desired hotal:n);printf(1.alexander 2.richardn);printf(3.victoria 4.k

31、ings hotaln);printf(5.quitn);printf(%s%sn,stars,stars);while(status=scanf(%d,&code)!=1|(code5)if(status!=1)scanf(%*s); printf(enter an integer from 1 to 5,please.n);return code;声明函数声明函数跳过一个字符跳过一个字符int getdays(void)int days;printf(how many days are you needed? );while(scanf(%d,&days)!=1)scanf(%*s); p

32、rintf(please enter an integer.n);return days;void showprice(double rate,int days)int n;double total=0.0;double factor=1.0;for(n=1;nbi, ai=bi,aik,认为数组ab 若nk,认为数组ab 若n=k,认为数组a=b#include main() int a10,b10,i,n=0,m=0,k=0; printf(enter array a:n); for(i=0;i10;i+)scanf(%d,&ai); printf(enter array b:n); fo

33、r(i=0;i10;i+)scanf(%d,&bi); for(i=0;iy) flag=1; else if(xy) flag=-1; else flag=0; return(flag);2.数组名作为参数#includeint fun2( int x,int size);main() int a3=123,456,789; int ave=fun2(a , 3); printf(average=%dn“,ave;int fun2( int x , int size ) int sum,aver,i; for(sum=0,i=0 ; isize; i+) sum+=xi; aver=sum/

34、size; return aver;数组形参数组形参用来传递数用来传递数组的长度组的长度数组实参数组实参注意:注意:必须传递两个参数:必须传递两个参数:数组:数组:实际传递的实际传递的是该数组的地址是该数组的地址数组长度。数组长度。2.数组名作为参数总结:该种传递方式是地址传递,形参数组名是地址变量,该种方式实现传递整个数组,对数组形参的修改可以影响到数组实参。在主调函数与被调函数分别定义数组,且类型应一致形参数组大小(多维数组第一维)可不指定必须将数组和数组的长度同时当作函数的参数进行传递例 求学生的平均成绩 #include float average(int stu10, int n);

35、 void main() int score10, i; float av; printf(input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(score,10); printf(average is:%.2f, av); float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; 实参用数组名形参用数组定义, int stu .210

36、9score562312.88stu例 数组元素与 数组名 作函数参数比较12a调用前a0a112a调用a0a112xy21xy交换12a返回#include void swap2(int x,int y) int z; z=x; x=y; y=z;main() int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值传递12a调用前12ax调用21ax交换21a返回#include void swap2(int x) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a); printf(a

37、0=%dna1=%dn,a0,a1);地址传递例 数组元素与 数组名 作函数参数比较例: 用简单选择法对10个数排序排序过程:(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上。(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序。(3)重复上述过程,共经过n-1趟排序后,排序结束。例 数组排序-简单选择排序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(arr

38、ayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例 数组排序-简单选择排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;

39、jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);kjjkjkjjjjj0123456789a9685732499927137688arraykk1368i=10123456789a9132732495768768899arrayi=8例 数组排序-简单选择排序void sort(int array

40、,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; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);例 求二维数组中最大元素值1 3 5 72 4 6 815 17 34 12ijmax=11 3 5 72 4 6 815 17 34 12ij

41、max=31 3 5 72 4 6 815 17 34 12ijmax=5j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=34int max_value ( int array34 ) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);main() int a34=1,3,5,7, 2,4,6,8,15,17,34,12; printf(ma

42、x value is %dn,max_value(a);多维形参数组第一维维数多维形参数组第一维维数可省略可省略,第二维必须相同第二维必须相同 int array4例 求二维数组中各行元素之和get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0;for(j=0;jcol;j+) resulti+=xij; main() int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col);

43、 for(i=0;irow;i+) printf(the sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult18127.9 变量的存储方式和生存期局部变量和全局变量局部变量和全局变量概述v变量是对程序中数据的存储空间的抽象内存.main() int a; a=10; printf(“%d”,a);编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作v变量的属性l数据类型:变量所持有的数据的性质(操作属性)l存储属性u存储器类型:寄存器、静态存储区、动态存储区u生存期:变量在某一时刻存在-静态变量与动态变量u作用域:

44、变量在某区域内有效-局部变量与全局变量v变量的存储类型lauto -自动型lregister-寄存器型lstatic -静态型lextern -外部型v变量定义格式: 存储类型 数据类型 变量表;如: int sum; auto int a,b,c; register int i; static float x,y;局部变量v局部变量-内部变量l定义:在函数内定义,只在本函数内有效l说明:umain中定义的变量只在main中有效u不同函数中同名变量,占不同内存单元u形参属于局部变量u可定义在复合语句中有效的变量u局部变量可用存储类型:auto register static (默认为auto)

45、float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效例 不同函数中同名变量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例 复合语句中变量#define n 5main() int i; int an=1,2,3,4,5; f

46、or(i=0;in/2;i+) int temp;temp=ai;ai=an-i-1;an-i-1=temp; for(i=0;in;i+) printf(%d ,ai);运行结果:5 4 3 2 1例 复合语句中变量#define n 5main() int i; int an=1,2,3,4,5; for(i=0;in/2;i+) int temp;temp=ai;ai=an-i-1;an-i-1=temp; for(i=0;il若全局变量与局部变量同名,则外部变量被屏蔽l全局变量可用存储类型:缺省 或 staticfloat max,min;float average(float arr

47、ay, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayiy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;运行结果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8; int a=3,b=5;max(int a, int b) int c; c=ab?a:b; return(c);main() int a=8; printf(max=%

温馨提示

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

评论

0/150

提交评论