C语言三种循环语句_第1页
C语言三种循环语句_第2页
C语言三种循环语句_第3页
C语言三种循环语句_第4页
C语言三种循环语句_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1、三种基本的循环语句 : for 语句、 while 语句和 do-while 语 句。一、循环语句、for 循环 它的一般形式为 :for(;)语句;初始化总是一个赋值语句,它用来给循环控制变量赋初值; 条件表达式是一个关系表达式,它决定什么时候退出循环; 增量定义循环控制变量每循环一次后按什么方式变化。 这三 个部分之间用 ; 分开。例如 :for(i=1;i10 时,结束循环。.for 循环中语句可以为语句体 ,但要用 和将参加循环 的语句括起来。.for 循环中的初始化、条件表达式和增量都是选择项, 即可以缺省,但 ; 不能缺省。省略了初始化,表示不对循环控制变量赋初值。省略了条件表达式

2、,则不做其它处理时便 成为死循环。省略了增量,则不对循环控制变量进行操作, 这时可在语句体中加入修改循环控制变量的语句。.for 循环可以有多层嵌套。例如:for(;)语句 ;for(i=1;i+=2) 语句 ;for(j=5;) 语句 ;这些 for 循环语句都是正确的。main()int i,j;printf(i jn);for(i=0;i2;i+)for(j=0;j3;j+)printf(%d %dn,i,j);输出结果为 :i j0 00 11 01 11 2用for循环求1+2+ +100的和:main()int sn=0,i; for(i=1;i=100;i+)sn+=i; /*1

3、+2+ +100*/printf(%dn,sn); 从程序可以看出,使用循环语句可以大大简化代码。、while 循环 它的一般形式为 : while( 条件 ) 语句;while 循环表示当条件为真时,便执行语句。直到条件为假 才结束循环。并继续执行循环程序外的后续语句。例如:#include stdio.h main() char c;c=0; /* 初始化 c*/while(c!=n) /* 回车结束循环 */ c=getche(); /* 带回显的从键盘接收字符 */ 上例中, while 循环是以检查 c 是否为回车符开始,因其事 先被初始化为空,所以条件为真,进入循环等待键盘输入字

4、符;一旦输入回车,则 c=n ,条件为假,循环便告结束。 与 for 循环一样, while 循环总是在循环的头部检验条件, 这就意味着循环可能什么也不执行就退出。. 在 while 循环体内也允许空语句。 例如 :while(c=getche()!=n); 这个循环直到键入回车为止。. 可以有多层循环嵌套。. 语句可以是语句体 , 此时必须用 和 括起来。用while 循环求1+2+100的和: main()int sn=0,i=0; while(+i=100)sn+=i; /* 求 1+2+ +100*/printf(%dn,sn);、 do-wh ile 循环 它的一般格式为 :do语句

5、块 ;while( 条件 );这个循环与 while 循环的不同在于 : 它先执行循环中的语句 然后再判断条件是否为真, 如果为真则继续循环; 如果为假, 则终止循环。因此,do-while循环至少要执行一次循环语句。 同样当有许多语句参加循环时,要用和 把它们括起来。用 do-while 循环求 1+2+100 的和:main()int sn=0,i=1;dosn+=i; /* 求 1+2+ +100*/while(+i=100);printf(%dn,sn);从上面三个程序看出,使用 for , while 和 do-while 求解 同样的问题,基本思路都差不多,只是在第一次计算时,注

6、意初值。二、循环控制、 break 语句break 语句通常用在循环语句和开关语句中。当 break 用于 开关语句 switch 中时,可使程序跳出 switch 而执行 switch 以后的语句;如果没有 break 语句,则将成为一个死循环而 无法退出。 break 在 switch 中的用法已在前面介绍开关语句 时的例子中碰到,这里不再举例。当 break 语句用于 do-while 、 for 、 while 循环语句中时, 可使程序终止循环而执行循环后面的语句, 通常 break 语句 总是与 if 语句联在一起。即满足条件时便跳出循环。例如:main()int sn=0,i;fo

7、r(i=1;i :1. break 语句对 if-else的条件语句不起作用2. 在多层循环中,一个例如:break 语句只向外跳一层注意 : main()int i,j;printf(i jn);for(i=0;i2;i+)for(j=0;j3;j+)if(j=2) break; printf(%d %dn,i,j);输出结果为 :i j0 00 11 01 1当 i=0,j=2 时,执行 break 语句,跳出到外层的循环, i 变为 1。、 continue 语句continue 语句的作用是跳过循环本中剩余的语句而强行执 行下一次循环。continue 语句只用在 for 、while

8、 、do-while 等循环体中 , 常 与 if 条件语句一起使用,用来加速循环。例如:main()int sn=0,i;for(i=1;i=100;i+)if(i=51) continue; /* 如果 i 等于 51,则结束本次循环 */sn+=i; /*1+2+50+52+100*/ printf(%dn,sn);从程序中可以看出, continue 语句只是当前的值没有执行, 也就是说当前的值跳过去了,接着执行下次循环。main() int i,j;printf(i jn); for(i=0;i2;i+) for(j=0;j3;j+)if(j=1) continue; printf(

9、%d %dn,i,j); 输出结果为 :i j0 00 2、goto 语句goto 语句是一种无条件转移语句,与BASIC 中的 goto 语句相似。 goto 语句的使用格式为 :goto 标号 ;其中标号是 Turbo C 2.0 中一个有效的标识符,这个标识符 加上一个 : 一起出现在函数内某处,执行 goto 语句后,程序 将跳转到该标号处并执行其后的语句。 标号既然是一个标识 符,也就要满足标识符的命名规则。另外标号必须与 goto 语句同处于一个函数中,但可以不在一个循环层中。通常 goto 语句与 if 条件语句连用,当满足某一条件时,程序跳 到标号处运行。 goto 语句通常不

10、用, 主要因为它将使程序层 次不清,且不易读,但在多层嵌套退出时,用 goto 语句则 比较合理。main()int sn=0,i;for(i=1;i=100;i+)if(i=51) goto loop; /* 如果 i 等于 51,则跳出循环 */sn+=i; /T+2+50*/loop: ; printf(%dn,sn); 可以看出,这儿的 goto 语句和 break 作用很类似。 这儿的 loop: ;printf(%dn,sn); 也可以写成 loop: printf(%dn,sn);main()int sn=0,i;for(i=1;i=100;i+)if(i=51) goto lo

11、op; /* 如果 i 等于 51,则跳出本次循环 */sn+=i; /T+2+50+52+100*/loop: ; printf(%dn,sn); 可以看出这儿的 loop 语句和 continue 的作用类似。 但是某些情况下又必须使用 goto 语句,否则会让程序大大 臃肿。如:main()int i,j,k;printf(i j kn);for(i=0;i2;i+)for(j=0;j3;j+) for(k=0;k3;k+) if(k=2) goto loop; printf(%d %d %dn,i,j,k);loop: ;输出结果为 :i j k0 0 00 0 1语句,应该如果不使用

12、 goto 语句,而使用 break,continue、亠4A这样main() int i,j,k; printf(i jn);for(i=0;i2;i+)for(j=0;j3;j+)for(k=0;k0;i-)if(num1%i=0&num2%i=0) break;printf( 最大公约数为 %dn,i);求 1!+2!+ +n!(n10)main()int n,i;long temp=1,sn=0; /* 从9!以后,所得的值就超过了int范围*/scanf(%d,&n); for(i=1;i=n;i+) temp*=i;sn+=temp; /* 如果没有这一步,求的就是 n!*/pri

13、ntf(%ldn,sn);那么想想,如果求 1!+3!+5!+ +n!应该怎么办?1 整除判断一个整数是不是素数 ( 素数就是只能被本身和 的数)。#include math.hmain()int num,i,flag=0; scanf(%d,&num);for(i=2;iflag=0; /* 标志变量复位 */if(num%i=0)flag=1;break;if(flag=O) printf( 是素数 n);else printf( 不是素数 n);可以说,在所有的 C语言书上,都有判断素数的例题。它的 编程思想是:把一个变量作为标志变量,用来标志是不是素 数;循环体是从2到sqrt(num

14、),因为如果一个数不是素数 的话,一定能分解成num=num1*num2它们中的最小值一定小于sqrt(num),所以循环的时候只要到sqrt(num)就可以了。同时要注意变量复位的问题。二、递归 递归,是函数实现的一个很重要的环节,很多程序中都或多 或少的使用了递归函数。 递归的意思就是函数自己调用自己 本身,或者在自己函数调用的下级函数中调用自己。 递归之所以能实现, 是因为函数的每个执行过程都在栈中有 自己的形参和局部变量的拷贝, 这些拷贝和函数的其他执行 过程毫不相干。 这种机制是当代大多数程序设计语言实现子 程序结构的基础,是使得递归成为可能。假定某个调用函数 调用了一个被调用函数,

15、 再假定被调用函数又反过来调用了 调用函数。这第二个调用就被称为调用函数的递归,因为它 发生在调用函数的当前执行过程运行完毕之前。而且,因为 这个原先的调用函数、 现在的被调用函数在栈中较低的位置 有它独立的一组参数和自变量, 原先的参数和变量将不受影 响,所以递归能正常工作。程序遍历执行这些函数的过程就 被称为递归下降。 程序员需保证递归函数不会随意改变静态变量和全局变量 的值,以避免在递归下降过程中的上层函数出错。程序员还 必须确保有一个终止条件来结束递归下降过程, 并且返回到 顶层。例如这样的程序就是递归:void a(int); main()int num=5; a(num);void

16、 a(int num)if(num=0) return;printf(%d,num);a(-num);在函数 a() 里面又调用了自己,也就是自己调用本身,这样 就是递归。那么有些人可能要想,这不是死循环吗?所以在 递归函数中,一定要有 return 语句,没有 return 语句的递 归函数是死循环。我们分析上面的例子,先调用 a(5) ,然后输出 5,再在函数 中调用本身a,接着回到函数起点,输出 4, ,一直 到调用 a(0) ,这时发现已经满足 if 条件,不在调用而是返 回了,所以这个递归一共进行了 5 次。如果没有这个 return , 肯定是死循环的。 虽然递归不难理解,但是很多

17、在在使用递归函数的时候,问 题多多。这里面一般有两个原因:一是如何往下递归,也就 是不知道怎么取一个变量递归下去; 二是不知道怎么终止递 归,经常弄个死循环出来。下面看几个例子:求1+2+100的和先分析一下。第一递归变量的问题,从题目上看应该取1,2, ,100 这些变量的值作为递归的条件;第二就是如何 终止的问题, 从题目上看应该是当数为 100的时候就不能往 下加了。那么我们试着写一下程序。int add(int);main()int num=1,sn;sn=add(num);printf(%dn,sn);getch();int add(int num)static int sn;sn+

18、=num;if(num=100) return sn;add(+num);分析一下程序:前调用 add(1),然后在子函数中把这个1加到sn上面。接着调用add(2),再把sn加2上来。这样一 直到100,到了 100的时候,先加上来,然后发现满足了if条件,这时返回sn的值,也就是1+2+100的值了。 这里有一个问题一定要注意,就是static int sn;有些人就不明白,为什么要使用 static 类型修饰符,为什 么不使用int sn=0;?如果使用int sn=0;这样的语句,在每次调用函数add()的时候,sn的值都是赋值为0,也就是第 一步虽然加了 1上来,可是第二次调用的时候

19、,sn又回到了 0。我们前面说了, static 能保证本次初始化的值是上次执 行后的值,这样也就保证了前面想加的结果不会丢失。如果 你修改为int sn=0,最后结果一定是最后的 100这个值而不 是 5050。求数列 s(n)=s(n-1)+s(n-2) 的第 n 项。其中 s(1)=s(2)=1可以看出,终止条件一定是s(1)=s (2)=1。递归下降的参数定是n。int a(int);main()int n,s;scanf(%d,&n);s=a(n);printf(%dn,s);getch();int a(int n)if(n3) return 1;return a(n-1)+a(n-

20、2);这个题目主要说明的是, 在函数中, 不一定只有一个 return 语句,可以有很多,但是每次对归的时候只有一个起作用。 题目不难理解,这儿不分析了。 说了这些递归,其实它和函数的调用没有大的区别,主要就 是一个终止条件要选好。 递归函数很多时候都能用循环来处main()int n=20,array20;int i;for(i=0;iN;I+)if(i2) arrayi=1;else arrayi=arrayi-1+arrayi-2;printf(%dn,array19); getch();但是它有一个缺陷,如果想通过键盘来得上面的程序就是实现一模一样的功能的 就是 n 的值不是通过键盘输

21、入来得到。 到n可以这样:main()int n,i;int s1=1,s2=1,tempscanf(%d,&n); for(i=3;i .自左向右! + - + - * & sizeof自右向左* / % 自左向右+ - 自左向右 自左向右 = 自左向右= != 自左向右& 自左向右A自左向右| 自左向右& 自左向右| 自左向右?: 自右向左自右向左= += -= *= /= %= &= A= |= =( 最低 ) , 自左向右精品文档 一个表达式的返回值都可以用来判断真假, 除非没有任何返 回值的 void 型和返回无法判断真假的结构。当表达式的值 不等于 0 时,它就是 “真 ”,否则就

22、是假。一样个表达式可以 包含其他表达式和运算符, 并且基于整个表达式的运算结果 可以得到一个真 / 假的条件值。因此,当一个表达式在程序 中被用于检验其真 / 假的值时,就称为一个条件。一、if 语句 if( 表达式 ) 语句 1;如果表达式的值为非 0,则执行语句 1,否则跳过语句继续 执行下面的语句。如果语句 1 有多于一条语句要执行时 , 必须使用 和 把这 些语句包括在其中 , 此时条件语句形式为 : if( 表达式 ) 语句体 1; 例如: if(x=0) y=x; if(a|b&c) z=a+b;c+=z;二、if-else 语句 除了可以指定在条件为真时执行某些语句外, 还可以在

23、条件 为假时执行另外一段代码。在 C 语句中利用 else 语句来达 到这个目的。if( 表达式 ) 语句 1;else 语句 2;同样,当语句 1或语句 2是多于一个语句时,需要用 把语 句括起来。例如: if(x=0) y=x;else y=-x;三、if-else if-else结构。if( 表达式 1)语句 1;else if( 表达式 2)语句 2;else if( 表达式 3)语句 3;else语句n;这种结构是从上到下逐个对条件进行判断,一旦发现条件满点足就执行与它有关的语句,并跳过其它剩余阶梯;|若没有一个条件满足,则执行最后一个else语句n。最后这个else 常起着缺省条件

24、的作用。同样,如果每一个条件中有多于一 条语句要执行时,必须使用和把这些语句包括在其中。条件语句可以嵌套,这种情况经常碰到,但条件嵌套语句容 易出错,其原因主要是不知道哪个if对应哪个else。例如:if(x20|xv-10) if(yv=100&yx) printf(Good);elseprintf(Bad);对于上述情况,Turbo C2.0 规定:else 语句与最近的一个 if 语句匹配,上例中的 else 与if(yx) 相匹配。为了使else与if(x20|x20|x-10)if(yx) printf(Good);else printf(Bad);下面举几个例子:输入一个数 , 如

25、果大于 0,输出 plus; 如果是负数,输出 negative; 如果正好是 0,则输出 zero 。main()float num; scanf(%f,&f); if(num0) printf(plusn);else if(num=0) y=x;else y=-x;printf(%fn,y); 程序比较简单,这儿就不分析了。其实 Trubo C 2.0 把一些常用的功能都写好了,我们只需要使用就可。例如求绝对值的功能在C的库里面就有。看下面的:#include math.hmain()float x,y;scanf(%f,&x);y=fabs(x); /* 求 x 的绝对值,然后赋值给 y

26、*/ printf(%fn,y);都是求绝这个程序和上面的程序完成的功能是一模一样的, 对值。可以看出,用下面这个方法比上面就要好一些。由于 fabs() 是一个函数,系统自带的,所以在使用它的时候,我 们必须把它所在的库文件 math.h 包含都程序中,即程序最 前面一行。类似的还有求开方 sqrt() ,求指数幂 exp() 等等, 这些与数学方面有关的函数都在 math.h 里面。具体哪些有 哪些没有,在什么库里面,可以查看一些手册。输入x,输出y, x和y满足关系:x-5 y=x; -5=x1 y=2*x+5;1=x=4 y=3*x-2; 程序如下: main() float x,y;

27、 scanf(%f,&x);if(x-5)y=x;else if(-5=x&x1) y=2*x+5;else if(1=x&x4)y=x+6;elsey=3*x-2; printf(%fn,y);这里要说明两点:.-5=x&x1不能写成-5=x1;1=x&x4 也不能写成1=x=y& x=z) printf(%ft,x);if(y=z) printf(%ft%fn,y,z);else printf(%ft%fn,z,y);else if(y=x&y =z)printf(%ft,y);if(x=z) printf(%ft%fn,x,z);else printf(%ft%fn,z,x);print

28、f(%ft,z);if(x=y) printf(%ft%fn,x,y);else printf(%ft%fn,y,x);说明:这是一个典型的if语句嵌套结构,如果不使用括号, 那么if和else的对应关系就乱了。四、switch-case 语句在编写程序时,经常会碰到按不同情况分转的多路问题,这时可用嵌套if -else-if语句来实现,但if-else-if 语句使用不方便,并且容易出错。对这种情况 ,Turbo C2.0提供了一个开关语句。开关语句格式为:switch(变量) case 常量1:语句1或空;case 常量2:语句2或空;case常量n:语句n或空;default:语句n+1

29、或空;执行switch开关语句时,将变量逐个与 case后的常量进行 比较,若与其中一个相等,则执行该常量下的语句,若不与任 何一个常量相等,则执行default后面的语句。switch中变量可以是数值,也可以是字符,但必须是整数。可以省略一些 case和default 。每个case或default后的语句可以是语句体,但不需要使用 和括起来。例如:main()int x,y;scanf(%d,&x);witch(x)case 1:y=x+1;break; /* 退出开关语句 , 遇到 break 才退出 */ case 4:y=2*x+1;break;default:y=x-;break;

30、printf(%dn,y);从上面的例子可以看出,用开关语句编的程序一定可以用 if语句做。那么在什么情况下需要用switch语句呢? 一般在出现比较整的情况下或者能转化成比较整数的情况下使用。看下面的例子:例子:一个学生的成绩分成五等,超过90分的为A ,80-89 的为B,70-79为C,60-69为D,60分以下为E。现在输入一个学生的成绩,输出他的等级。(1).用if语句main()float num;char grade;scanf(%d,&nu m);if(num=90) grade=A;else if(num=80&num=70&num=60&num69) grade=D;els

31、e grade=E;printf(%c,grade);(2). 用 switch 语句 main()int num;char grade; scanf(%d,&num); num/=10; switch(num)case 10:case 9: grade=A;break;case 8: grade=B;break;case 7:grade=C;break;case 6: grade=D;break;default:grade=E; break;printf(%c,grade);说明一点,并不是每个 case 里面有都语句,有时侯里面是 空的,就好象这一题。 switch 语句执行的顺序是从第一

32、 case 判断,如果正确就往下执行,直到 break ;如果不正确,就 执行下一个 case 。所以在这里,当成绩是 100 分时,执行 case 10: 然后往下执行, grade=A;break; 退出。 想想看,这里为什么要用 num/=10; ? 假设当程序中有浮点数时怎么办呢?前面我们说的都是无参数无返回值的函数,实际程序中,我 们经常使用到带参数有返回值的函数。一、函数参数传递1. 形式参数和实际参数 函数的调用值把一些表达式作为参数传递给函数。 函数定义 中的参数是形式参数, 函数的调用者提供给函数的参数叫实 际参数。在函数调用之前,实际参数的值将被拷贝到这些形 式参数中。2.

33、 参数传递 先看一个例子: void a(int); /*注意函数声明的形式 */main()int num;scanf(%d,&num);a(num); /* 注意调用形式 */void a(int num_back) /*注意定义形式 */printf(%dn,num_back);在主函数中,先定义一个变量,然后输入一个值,在a()这个函数中输出。当程序运行a(num);这一步时,把num的值赋值给num_back,在运行程序过程中,把实际参数的值传给形式参数,这就是函数参数的传递。形参和实参可能不只一个,如果多于一个时,函数声明、调 用、定义的形式都要一一对应,不仅个数要对应,参数的数

34、据类型也要对应。void a(int,float);main()int numl;float num2; scanf(%d,&num1); scanf(%f,&num2); a(num1,num2);void a(int num1_back,float num2_back)printf(%d,%fn,num1_back,num2_back);上面的例子中,函数有两个参数,一个是整型,一个是浮点 型,那么在声明、调用、定义的时候,不仅个数要一样,类 型也要对应。如果不对应,有可能使的编译错误,即使没错 误,也有可能让数据传递过程中出现错误。再看一个例子:void a(int);main()int

35、 num;scanf(%d,&num);a(num);void a(int num) printf(%dn,num);看上面的例子,形式参数和实际参数的标识符都是num,程序把实际参数num的值传递给形式参数num。有些人可能就不明白了,既然两个都是num为什么还要传递呢?干脆这样不就行了吗:void a();main()int num;scanf(%d,&num);a();void a()printf(%dn,num);其实不然,这就要涉及到标识符作用域的问题。作用域的意 思就是说,哪些变量在哪些范围内有效。一个标识符在一个 语句块中声明, 那么这个标识符仅在当前和更低的语句块中 可见,在函

36、数外部的其实地方不可见,其他地方同名的标识 符不受影响,后面我们会系统讲解作用域的问题。在这儿你 就要知道两个同名的变量在不同的函数中是互不干扰的。 前面将的都是变量与变量之间的值传递, 其实函数也可以传 递数组之间的值。看下面的例子:void a(int );main()int array5,i;for(i=0;i5;i+) scanf(%d,&arrayi);a(array);void a(int array)int i;for(i=0;i5;i+) printf(%dt,arrayi);printf(n);这就是数组之间的值传递。注意他们的声明和定义形式,和 变量参数传递有什么区别?有了

37、后面的 就表明传递的是 一个数组。其中在定义的时候,也可以写成void a(intarray5); 想想,如果我们写成了 int array4会有什么情 况发生?目前我们只学了数组和变量,以后还会知道指针、结构,到 那是,函数也可以传递它们之间的值。二、函数值的返回其实我们也可以把函数当作一个变量来看,既然是变量,那 一定也可以有类型。还举最前面的例子,现在要求在main() 函数里输入一个整数作为正方形的边长,在子函数里求正方形的面积,然后再在主函数里输出这个面积。我们前面的程序都是在子函数里输出的,现在要求在主函数里输出,这就需要把算好的值返回回来。先看例子:int a(int); /*

38、声明函数 */ main()int num,area;scanf(%d,&num);area=a(num); /* 调用时的形式 */printf(%d,area);int a(int num)int area_back;area_back=num*num;return area_back; /* 返回一个值 */和前面的程序有几点不同:(1). 声明函数类型时,不是 void ,而是 int 。这是由于最后 要求的面积是整型的,所以声明函数的返回值类型是整型。(2).return 语句 它的意思就是返回一个值。在 C 语言中, return 一定是在函数的最后一行。. 调用函数的时候 , 由

39、于函数有一个返回值,所以必须要 用变量接受这个返回值 ( 不是绝对的 ) ,如果我们不用一个变 量接受这个值,函数还照样返回,但是返回的这个值没有使 用。上面的例子运行过程是这样的,先把实参的值传递给形参, 然后在子函数里计算面积得到 area_back ,然后返回这个面 积到主函数,也就是把 area_back 赋值给 area ,最后输出。 前面说了,返回值有时不一定非要用一个变量来接受,我们 可以把上面的程序简化为:int a(int);main()int num;scanf(%d,&num);printf(%d,a(num); /* 函数调用放在这儿 */int a(int num)int area_back;area_back=num*num;return area_back;这样函数

温馨提示

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

评论

0/150

提交评论