第6章 函数与编译预处理_第1页
第6章 函数与编译预处理_第2页
第6章 函数与编译预处理_第3页
第6章 函数与编译预处理_第4页
第6章 函数与编译预处理_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章函数与编译预处理,6.1模块化程序设计与函数6.2函数的定义与调用6.3函数的递归调用6.4变量作用域与存储方式6.5编译预处理6.6函数设计举例,教学目的和基本要求:,要求学生了解模块化程序设计的思想,掌握函数的定义及调用,理解变量的作用域与存储方式的概念,理解编译预处理的概念。,教学重点:,函数的定义及调用、递归调用、变量的作用域。,6.1模块化程序设计与函数,在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题。这样的话,原来问题的解就可以用这些小问题来表示。把复杂任务细分成多个问题的过程,就叫程序的

2、模块化。模块化程序设计是靠设计函数和调用函数实现的。,6.1.1模块与函数,C语言程序由基本语句和函数组成,每个函数可完成相对独立的任务,依一定的规则调用这些函数,就组成了解决某个特定问题的程序。任务、模块与函数的关系:,6.1.2模块设计原则,模块设计应该遵循以下几条主要原则:,模块独立:模块完成独立的功能,与其他模块间的关系简单,各模块可以单独调试。需注意以下几点:每个模块完成一个相对独立的特定子功能模块之间的关系力求简单数据的局部化模块规模适当分解模块要注意层次,6.1.3算法描述简介,算法描述的任务是将解题步骤和方法用一定的形式表示出来,算法描述要清楚准确,严谨且没有二义性,还要可读性

3、好,方便实现仅用自然语言是不够的,一般要借助算法工具来描述算法算法含有两大要素,一是操作,二是控制结构描述算法一般可以用流程图描述控制结构,用类计算机语句或自然语言描述具体操作,例6.2设计算法找出a、b两数中的较大者,并输出。,分析:这个问题分三个步骤。(1)输入两个数;(2)找出其中的大数;(3)输出大数。算法流程图如右图所示。,6.2函数的定义与调用,在C语言中,函数(Function)是一个处理过程,可以进行数值运算、信息处理、控制决策,即一段程序的工作放在函数中进行,函数结束时可以携带或不带处理结果。C语言程序处理过程全部都是以函数形式出现,最简单的程序至少也有一个main函数。函数

4、必须先定义和声明后才能调用。函数有两种:标准库函数:系统提供用户自定义函数:用户自己写,6.2.1标准库函数,C语言有丰富的库函数,这些函数的说明在不同的头文件(*.h)中。,math.h头文件中对sin(x)、cos(x)、exp(x)(求ex)、fabs(x)(求x的绝对值)、log(x)(求log)等数学函数做了声明stdio.h头文件中对scanf()、printf()、gets()、puts()、getchar()、putchar()等标准输入/输出函数做了声明,6.2.2函数的定义,一般形式为:类型名函数名(参数类型说明及列表)局部变量说明语句序列,1.函数的说明部分,函数的说明部

5、分包括函数的类型、函数名、参数表及参数类型的说明。,函数的类型:即函数返回值的类型。说明函数将给调用者提供什么类型的返回值。函数名:又称函数标识符。对自定义函数,其命名遵循C语言标识符的规定参数表:写在函数名后的括号“()”内,参数表由一个或多个变量标识符及类型标识符组成。参数表中的变量也称为形式参数,简称为形参,2.函数体,函数定义的花括号“”里的部分是函数体,包括变量定义,执行语句序列。return语句的一般形式为:return(表达式);,1.函数的声明,自定义函数在调用前应先声明。使系统知道将要用到某个函数及它的类型,以便处理。函数声明应与该函数定义时给出的函数类型与名字、形参的个数、

6、类型、次序相一致。,6.2.3函数的调用,函数声明语句的形式为:类型名函数名(参数类型说明列表);,例6.4编写计算x的n次乘方的程序。分析:(1)输入x和n;(2)调用power函数进行乘幂运算;(3)打印运算结果。,2.函数的调用,函数调用分为有参和无参两种。有参函数调用的一般形式为:函数名(实参表达式1,实参表达式2,)无参函数调用的一般形式为:函数名()根据调用方式的不同,函数的调用又分为函数语句调用和表达式调用,3.函数的嵌套调用,在某函数体中调用了另一个函数,则在该函数被调用的过程中将发生另一次函数调用,例6.5编程求组合,分析:根据组合的计算公式知组合函数有m和n两个形参。函数需

7、要3次计算阶乘。如果定义函数fac(k),求k的阶乘,则求组合可以通过调用阶乘函数完成。cfac(m)/(fac(n)*fac(mn),6.2.4参数的传递,有参函数调用的一般形式为:函数名(实参表达式1,实参表达式2,)形式参数作为局部变量被分配内存函数调用中的实际参数把数据传递给形式参数在函数调用时,实参的个数必须与形参相等,而且类型必须一致,例6.6输入两个数,输出其中较大的数。,#includestdio.hvoidmain()inta,b,m;intmax(int,int);scanf(%d,%d,,当调用max函数时,实参a把值传给形参x,实参b把值传给形参y。按顺序传递,与形参名

8、无关。,关于形式参数和实际参数说明:,形式参数是变量,但是函数被调用时才被分配内存。当函数执行完毕,返回时,形式参数占用的内存空间又被释放。实参可以是变量、常量和表达式,但实参必须有确定的值。形参和实参的类型必须一致。对应的实参和形参是两个独立实体,它们之间只有单向的值的传递,即将实参的值传递给形式参数。形参的值在函数中不论怎么改变,都不会影响实参。,例6.7设求最大公约数的程序。,#includestdio.hintdivisor(inta,intb)intr;dora%b;ab;br;while(r!0);returna;,voidmain()inta,b,d;scanf(%d,%d,pr

9、intf(d%d,d);,6.3函数的递归调用,函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别的函数调用自己为间接递归。,voida().a();.,voida().b();.voidb().a();.,递归在解决某些问题中,是一个十分有用的方法。因为其一,有的问题它本身就是递归定义的;其二,它可以使某些看起来不易解决的问题变得容易解决,写出的程序较简短。,例6.8用递归计算n!。,由于n!=n*(n-1)!是递归定义所以求n!(n-1)!(n-1)!(n-2)!(n2)!(n-3)!0!的问题,根据公式有0!=1。再反过来依次求出1!,2!直到最后求出n!。,递归方法求n!

10、,longfac(intn)longf;if(n=0)f=1;elsef=n*fac(n-1);returnf;voidmain()longy;intn;scanf(“%d”,刚开始的时候,这个n是前面输入的需要阶乘的n,所以在这里带入的值是n,而这个函数里又调用了本身,不过参数已经变成了n-1,所以这里再次调用时参数已经变成了n-1注意:上次调用fac(n)还没有完,只是由于遇到了fac(n-1)而执行fac(n-1)去了.,而在调用fac(n-1)时同样遇到了要调用fac(n-2)的问题,于是一层一层的包裹下去,每次调用的时候都会在内部调用一个结构相同但变量不同的函数,直到。,直到调用到f

11、ac(0)时,由于内部if判断,已经不需要再继续调用另一个fac(n-1),而直接有了f=1,fac(0)已经执行完毕,它的返回值被fac(1)中的f=n*fac(n-1)语句赋给了f值,同时返回了f。而这个返回的f又被fac(2)乘上当前的n值以后继续返回f,直到最后的fac(n)都做完了,f的值被返回到了它的调用点:主函数中,这样就是一个递归运算。,例6.9用递归算法求m与n的最大公约数。,if(m%n)=0n是公约数;else求n和m%n的公约数;,intgcd(intm,intn)intg;if(n0)gm;elseggcd(n,m%n)return(g);,求最大公约数的主函数,vo

12、idmain()intm,n;scanf(%d,%d,elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,递归汉诺塔步骤,vo

13、idhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,主函数调用hanoi(n,1,2,3);第一次调用。第一次调用hanoi(n,a,b,c)(第一层)即要把三个金片移到c,n=3,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,

14、c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,由于n1则执行hanoi(n-1,a,c,b)(第二次调用),n=3,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,由于仍然n1则执行hanoi(n-1

15、,a,c,b)(第三次调用),n=2,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,由于n=1则printf(“%d-%d”,a,c);即把金片从a移动到c,n=1,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n

16、-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,第三层执行完毕,返回到第二层,即下去执行printf(“%d-%d”,a,c);把第二个金片摆到第二根针上,n=2,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);s

17、canf(“%d”,执行下一条语句,又调用第三层hanoi(1,3,1,2),n=2,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,n=1,执行结果为32,n=1,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-

18、1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,第二层也执行完了,返回第一层,执行接下来的语句,结果为13。,n=3,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,执行接下来的语句,再次调用第

19、二层hanoi(2,2,1,3),n=3,递归汉诺塔步骤,voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);,main()intn;printf(“inputn:”);scanf(“%d”,6.4变量作用域与存储方式,先看一个例子,错在那里?:voidf1()intt=2;a*=t;b/=t;main()inta,b;printf(“Entera,b:”);scanf(“%d,%d”,编译程序会提示出错:Undefi

20、nedsymbola和Undefinedsymbolb。为什么?,6.4.1变量的作用域即变量的有效范围变量按作用域分为全局变量和局部变量比较:全局变量(外部变量)局部变量(内部变量)定义位置:函数体外函数体内作用域:从定义处到本源从定义处到本函数结束文件结束举例:所有函数体外定义的变量(1)所有在函数体内定义(2)形式参数,注意与局部变量同名的处理局部变量屏蔽全局变量,不同函数中同名局部变量互不干扰,1.局部变量C语言程序是由函数组成的,有且只能有一个main函数。变量定义可以出现在函数内,亦可出现在函数外或者是函数的参数中。,按照变量定义语句出现的位置,可以分为:,局部变量:在函数或复合语

21、句内定义;只在该函数或复合语句中才能使用。形式参数:定义为函数的参数;只在该函数中才能使用。,在函数内部说明的变量或者在复合语句中定义的变量称为局部变量。其作用范围是其所在的函数或复合语句。,定义在函数之外的变量。其作用范围从它被定义的位置起,到所在文件的结束。,2、全局变量,如果在全局变量定义之前的函数想引用该外部变量,则应该在该函数中用关键字extern作“外部变量说明”。,3、外部变量的使用,C语言中,用extern说明一个外部变量,语句格式如下:extern类型说明符外部变量名;,对于全局变量还有以下几点说明:(1)全局变量就是外部变量(2)同一源文件中,允许全局变量和局部变量同名(3

22、)全局变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,因而使得函数的独立性降低,例6.11全局变量的定义和声明。,intvs(intl,intw)/*w是形参,局部变量*/externinth;/*外部变量声明*/intv;vl*w*h;returnv;voidmain()externintw,h;/*外部变量声明*/intl5;printf(v%d,vs(l,w);intl3,w4,h5;/*定义全局变量*/,6.4.2变量的存储方式变量按存在时间分静态变量动态变量,静态存储类型的变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,通常称它们为永久存储。动态存储类型

23、变量只生存在某一段时间内。例如,函数的形参和函数体或分程序中定义的变量,只是在程序进入该函数或分程序时才分配存储空间,当该函数或分程序执行完后,变量对应的存储空间又被撤销了。,1.自动变量,自动变量的类型说明符为auto。自动变量是动态存储方式。自动变量可省去说明符auto。,自动变量具有以下特点:(1)自动变量的作用域仅限于定义该变量的结构内。(2)自动变量属于动态存储方式,只有定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。(3)不同的个体中允许使用同名的变量而不会混淆。,例6.12同名变量的使用。,voidmain()autointa,

24、s100,p100;printf(ninputanumber:n);scanf(%d,,2.静态变量,静态变量的类型说明符是static。一般形式为:static类型名变量名,(1)静态局部变量:在局部变量的说明前再加上static说明符。(2)静态全局变量:在全局变量的说明之前加上static。,3.寄存器变量,寄存器变量用关键字register定义。一般形式为:register类型名变量名,寄存器变量只限于整型、字符型、指针型的局部变量。寄存器变量是动态变量,而且数目有限,一般仅允许说明两个寄存器变量。,例6.14编写程序计算s14916100。,程序编写如下:#includestdio.

25、hvoidmain()registerinti,s0;for(i1;i10;i)si*i;printf(s%d,s);,6.5编译预处理,“编译预处理”是C语言编译系统的一个组成部分。是在编译前由编译系统中的预处理程序对源程序的预处理命令进行加工。,源程序中的预处理命令均以“#”开头,结束不加分号,以区别源程序中的语句,它们可以写在程序中的任何位置,作用域是自出现点到源程序的末尾。预处理命令包括执行宏定义(宏替换)、文件包含和条件编译。,6.5.1宏定义1.无参宏定义#define标识符字符串如:#defineL(x*x2*x+x)/*定义后,可以用L来代替串(x*x2*x+x)宏定义的作用在

26、宏定义之后,该程序中宏名就代表了该字符串。说明(1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,只是一种简单的代换。(2)宏定义不是说明或语句,在行末不加分号。,(3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。(如要终止其作用域可使用#undef命令)(4)用引号括起来的宏名,预处理程序不对其进行宏代换。(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。#definePI3.14159#definePPI*x*x(6)宏名一般用大写字母表示,以便于与变量区别。,2.带参数的宏定义,带参数的宏定义的一般形式为:#define宏名(形参表)字符串

27、如:#defineS(a,b)a*b#definePR(x)printf(s=%fn”,x),对于带参的宏定义有以下问题需要说明:,(1)宏定义中,宏名和形参表之间不能有空格出现。(2)在带参宏定义中,形式参数不同于函数中的形参,带参宏定义中的参数不是变量,只是在宏调用时用实参的符号去代换形参,即只是符号代换。(3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。(4)在宏定义中的形参最好用括号括起来,以避免出错。,6.5.2文件包含1.文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。文件包含允许嵌套。2.#include命令有两种格式。(1)#include(2)#inc

28、lude“文件名”3.两种格式区别使用尖括号表示在包含文件目录中查找(包含目录是由用户在设置环境时设置的),而不在源文件目录查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。,6.5.3条件编译,条件编译有3种形式:(1)#ifdef标识符。程序段1#else程序段2#endif它的功能是,如果标识符也被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。本格式中的#else可以没有。,(2)#ifndef标识符。程序段1#else程序段2#endif,第二种将ifdef改为ifndef,与第一种形式的功能正相反:如果标识符未被#define

29、命令定义过则对程序段1进行编译,否则对程序段2进行编译。,(3)#if常量表达式。程序段1#else程序段2#endif,条件编译的功能是,如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。,6.6函数设计举例,例6.15编写求最小公倍数的程序。分析:正整数a、b的最小公倍数和最大公约数之间有关系,设正整数a、b的最大公约数为d,最小公倍数为c,则c(a*b)/d。,intdivisor(inta,intb)intr;while(ra%b)!0)ab;br;returnb;intmultiple(inta,intb)intd;ddivisor(a,b);return

30、a*b/d;,voidmain()inta,b,c;printf(inputab:);scanf(%d%d,printf(c%d,c);,例6.16计算s1k2k3knk(0k5)。分析:定义函数longpower(inti,intk)返回值为ik。定义函数longf(intn,intk)返回值为1k2k3knk。,longpower(inti,intk)longpower1;intj;for(j1;j0sum=0;,练习,for(n=3;n=1000;n+)s=0;k=n/2+1;for(m=1;mk;m+)if(n%m=0)_;if(s=n)_printf(nThesum=%d,sum);

31、,2。以下程序求10,1000之间能被3或5或8整除的数之和。请将程序补充完整,给出正确程序运行结果,填入相应窗口。#include#include#includemain()_longsum;sum=0;for(i=10;i=1000;i+)if(_)sum+=i;clrscr();printf(%ldn,sum);,3下面程序求3,750之间同构数之和,请将程序补充完整,并给出正确结果,填入相应窗口。同构数是:一自然数平方的末几位与该数相同时,称此数为自构数,例如:55=25,则称5为自同构数。#include#include#includemain()longsum,n,m,s,k;su

32、m=0;for(n=3;n=750;n+)if(n10)k=10;elseif(n100)k=100;elsek=1000;s=n*n;_;,if(s%k=0)_printf(nThesum=%d,sum);,4下面程序是求5,75之间的所有奇数的立方和。请将程序补充完整,并给出正确结果,填入相应窗口。#include#include#includemain()longsum;_sum=0;for(i=5;i=75;i+)if(fmod(i,2)!=0)_clrscr();printf(%ldn,sum);,5下面程序是求1,450之间同时满足除3余2和除5余3条件的数的个数。请将程序补充完整

33、,并给出正确结果,填入相应窗口。#include#include#includemain()intcount;inti;_for(i=1;i=450;i+)if(fmod(i,3)=2,6下面程序是求50,450之间的能被3和5整除的数的平方和。请将程序补充完整,并给出正确结果,填入相应窗口。#include#include#includemain()longsum;_;sum=0;for(i=50;i=450;i+)if(fmod(i,3)=0,7下面的程序是求2,500之间的所有的素数的个数。请将程序补充完整,并给出正确结果,填入相应窗口。#include#include#includei

34、ntprime(intn)intyes,i;if(n=1)return1;yes=1;for(i=2;i=sqrt(n);i+)if(n%i=0)yes=0;break;_,main()intcount=0,i;clrscr();for(i=2;i=500;i+)if(prime(i)_printf(%dn,count);,8下面的程序是求表达式的值:s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+.+(1*2*3*.*n)/(3*5*7*.(2*n+1)请将程序补充完整,并给出当n=20时,程序的运行结果(按四舍五入保留10位小数)。#include#include#

35、includedoublefun(intn)doubles,t;inti;_t=1.0;for(i=1;i=n;i+)t=t*i/(2*i+1);_returns;,main()printf(n%12.10lf,fun(20);,9下面的程序是求如下表达式的值。S=sqrt(ln(1)+ln(2)+ln(3)+ln(n)将程序补充完整,当n=60时,给出程序运行结果(按四舍五入保留6位小数)。#include#include#includedoublefun(intn)_inti;for(i=1;i=n;i+)s+=log(1.0*i);s=sqrt(s);returns;,main()clr

36、scr();printf(_);,改错题:1下面的程序是求500以内的所有的素数之和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果。#include#include#includeintprime(intn)intyes,i;if(n=1)return1;yes=1;for(i=2;i=sqrt(n);i+)if(n%i=0)yes=0;break;return1;,main()intsum=0,i;clrscr();for(i=2;i=500;i+)if(prime(i)sum+=i;printf(%dn,sum);,2下面的程序中,函数fun的功能是:根据形参m,计算下面公式的

37、值。T=1+1/(2*3)+1/(3*4)+1/(m*(m+1)请改正程序中的错误,并运行改正后的程序。当从键盘输入70时,给出程序运行的正确结果(按四舍五入保留6位小数)。#include#includedoublefun(intm)doublet=1.0;inti=2;for(i=2;i=m;i+)t+=1.0/i*(i+1);return;,main()intm;clrscr();printf(n请输入一个整数:);scanf(%d,3下面的程序中,函数fun的功能是:根据形参m,计算下面公式的值。T=1/1!+1/2!+1/3!+1/m!请改正程序中的错误,并运行改正后的程序。当从键盘输入10时,给出程序运行的正确结果(按四舍五入保留10位小数)。#inc

温馨提示

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

评论

0/150

提交评论