Visual C++第04章app_第1页
Visual C++第04章app_第2页
Visual C++第04章app_第3页
Visual C++第04章app_第4页
Visual C++第04章app_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

在结构化程序设计中,函数是将任务进行模块划分的基本单位。,第四章函数,在面向对象的程序设计中,对数据的操作总是封装在函数中,一个函数描述一种操作。不要完全按模块思想讲。也是让学生处于面向对象程序设计的氛围中。这样第5章的教学会顺利一些。,要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量生命期和作用域。,本章还将介绍关于函数重载的概念,介绍递归算法、内联函数、默认参数函数以及多文件组织、编译预处理、工程文件的概念和运行库函数。,第四章函数,41函数的定义与调用,45作用域与存储类型,44函数调用机制,43全局变量和局部变量,42函数的参数传递,返回值及函数原型说明,410编译预处理,49头文件与多文件结构,48C+的系统库函数,47函数的一些高级议题,46函数的递归调用,4.1函数的定义与调用,4.1.1函数概述,4.1.2函数的定义,4.1.3函数的调用,4.1.1函数概述,函数是C+程序的基本组成模块。,通过函数,可以把一个复杂任务分解成为若干个易于解决的小任务。充分体现结构化程序设计由粗到精,逐步细化的设计思想。,组成C+程序的若干函数中,有一个称为main()(Winmain())函数,是程序执行的入口,它可以调用其他函数。而其他一般函数既可以调用也可以被调用。函数之间的调用关系见下图:,4.1.1函数概述,4.1.1函数概述,函数按是否带有参数,分为:无参函数和有参函数,4.1.1结束,函数按其是否系统预定义分为两类:一类是编译系统预定义的,称为库函数或标准函数,如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。这些库函数都按功能分类,集中说明在不同的头文件中。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。另一类是用户自定义函数,用户可以根据需要将某个具有相对独立功能的程序定义为函数。,4.1.2函数的定义,1.无参函数,2.有参函数,1无参函数,定义格式为:数据类型函数名(void)函数体,例:下面函数的功能是打印一个表头voidTableHead()cout*endl;cout*example*endl;cout*=y?x:y);voidmain()floatx,y;coutxy;coutx和y中较大数为max(x,y)endl;,4.2函数的参数传递、返回值及函数原型说明,421函数的参数传递及传值调用,423函数原型说明,422函数返回值,函数调用首先要进行参数传递,参数传递的方向是由实参传递给形参。传递过程是,先计算实参表达式的值,再将该值传递给对应的形参变量。一般情况下,实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼容),即实参的类型可以转化为形参类型。而对应参数的参数名则不要求相同。,4.2.1函数的参数传递及传值调用,按照参数形式的不同,C+有两种调用方式:传值调用和引用调用。顾名思义,传值调用传递的是实参的值,本章主要介绍传值调用。关于引用调用,将在第五章类与对象中介绍。,4.2.1函数的参数传递及传值调用,调用power(4.6,3),函数power(4.6,3),return97.336,主程序后续语句,【例42】说明实参和形参对应关系的示例。#include#includefloatpower(floatx,intn)/求x的n次幂floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;,4.2.1函数的参数传递及传值调用,调用power(a,3),函数power(a,3),return912673,主程序后续语句,【例42】说明实参和形参对应关系的示例。#include#includefloatpower(floatx,intn)/求x的n次幂floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;,4.2.1函数的参数传递及传值调用,调用power(3,4.6),函数power(3,4.6),return81,主程序后续语句,【例42】说明实参和形参对应关系的示例。#include#includefloatpower(floatx,intn)/求x的n次幂floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)bc;area=TriangleArea(a,b,c);if(area=-1)cout(a,b,c)不能构成三角形!endl;elsecout三角形(a,b,c)面积为:areachoice;while(choice=4);switch(choice)case1:account_report();break;case2:engineering_report();break;case3:marketing_report();break;,voidmenu_print()cout”系统功能:”endl;cout”1财务报表”endl;cout”2工程报表”endl;cout”3市场报表”endl;cout”选择业务序号:”;voidaccount_report()/生成财务报表voidengineering_report()/生成工程报表voidmarketing_report()/生成市场报表;,4.2.3函数原型说明,【例44】输出所有满足下列条件的正整数m:10m1000且m、m2、m3均为回文数。,分析:回文指左右对称的序列。如121、353等就是回文数。判断整数是否回文数用函数实现,其思想是将该数各位拆开后反向组成新的整数,如果该整数与原数相等则为回文数。,程序如下:#include#includeboolpalindrome(int);/函数原型,voidmain()cout0);for(intj=0;ji;j+)n=n*10+digitj;return(n=m);,4.2.3函数原型说明,mm*mm*m*m111211331101102011030301111123211367631,运行结果:,4.3全局变量和局部变量,431变量的存储机制与C+的内存布局,432全局变量,433局部变量,4.3.1变量的存储机制与C+的内存布局,操作系统为一个C+程序的运行所分配的内存分为四个区域,如图4.3程序在内存中的区域所示:,(1)代码区(Codearea):存放程序代码,即程序中各个函数的代码块;(2)全局数据区(Dataarea):存放全局数据和静态数据;分配该区时内存全部清零。(3)栈区(Stackarea):存放局部变量,如函数中的变量等;分配栈区时内存不处理。(4)堆区(Heaparea):存放与指针相关的动态数据。分配堆区时内存不处理。参见第七章。,4.3.1变量的存储机制与C+的内存布局,4.3.2全局变量,在所有函数之外定义的变量称为全局变量。,全局变量在编译时建立在全局数据区,在未给出初始化值时系统自动初始化为全0。,全局变量可定义在程序开头,也可定义在中间位置,该全局变量在定义处之后的任何位置都是可以访问的,称为可见的。,请看下例:,4.3.2全局变量,打印200,调用func(),函数func(),200*2=400,打印400,n=100,n=100*2=200,【例45】多个函数使用全局变量的例子。#includeintn=100;voidfunc()n*=2;voidmain()n*=2;coutnendl;func();coutnendl;,4.3.3局部变量,定义在函数内或块内的变量称为局部变量。,程序中使用的绝大多数变量都是局部变量。,局部变量在程序运行到它所在的块时建立在栈中,该块执行完毕局部变量占有的空间即被释放。,局部变量在定义时可加修饰词auto,但通常省略。局部变量在定义时若未初始化,其值为随机数。,4.3.3局部变量,打印main()中的t=3.5,调用fun(),函数fun(),打印fun()中的t=5,打印main()中的t=3.5,t=5,【例49】使用局部变量的例子。#includevoidfun()autointt=5;/fun()中的局部变量,auto可省略coutfun()中的t=tendl;voidmain()floatt=3.5;/main()函数中的局部变量coutmain()中的t=tendl;fun();coutmain()中的t=tb;cout=a)intt;/具有块域t=a;a=b;b=t;/交换a,b的值couta=atb=bb;cout调用前:实参a=a,b=bendl;swap(a,b);/传值cout调用后:实参a=a,b=bendl;voidswap(inta,intb)/a,b作用域为swap()cout调用中endl;cout交换前:形参a=a,b=bendl;intt;t=a;a=b;b=t;/交换swap()中的a,b的值cout交换后:形参a=a,b=bendl;,块作用域,由VC+平台运行,结果如下:输入两整数:35调用前:实参a=3,b=5调用中交换前:形参a=3,b=5交换后:形参a=5,b=3调用后:实参a=3,b=5交换失败,局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见。,块作用域,对于块中嵌套其它块的情况,如果嵌套块中有同名局部变量,服从局部优先原则,即在内层块中屏蔽外层块中的同名变量,换句话说,内层块中局部变量的作用域为内层块;外层块中局部变量的作用域为外层除去包含同名变量的内层块部分。,如果块内定义的局部变量与全局变量同名,块内仍然局部变量优先,但与块作用域不同的是,在块内可以通过域运算符“:”访问同名的全局变量。,200300,内i=500,内j=600,内n=500+600=1100,1100500600,100,200+300=500,500,500200300,外部i=200,外部j=300,【例49】显示同名变量可见性。intn=100;#includevoidmain()inti=200,j=300;coutntitjendl;/内部块inti=500,j=600,n;n=i+j;coutntitjendl;/输出局部变量ncout:nendl;/输出全局变量nn=i+j;/修改全局变量coutntitjendl;,函数原型作用域,函数原型不是定义函数,在作函数原型声明时,其中的形参作用域只在原型声明中,即作用域结束于右括号。正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名可省略。,3文件作用域,文件作用域也称全局作用域。定义在所有函数之外的标识符,具有文件作用域,作用域为从定义处到整个源文件结束。文件中定义的全局变量和函数都具有文件作用域。如果某个文件中说明了具有文件作用域的标识符,该文件又被另一个文件包含,则该标识符的作用域延伸到新的文件中。如cin和cout是在头文件iostream.h中说明的具有文件作用域的标识符,它们的作用域也延伸到嵌入iostream.h的文件中。,存储类型决定了变量的生命期,变量生命期指从获得空间到空间释放之间的时期。,4.5.2变量的存储类型,存储类型的说明符有四个:auto,register,static和extern。前两者称为自动类型,后两者分别为静态和外部类型。,本节重点掌握static和extern这两种类型的使用和区别。具体说,区分局部变量和静态局部变量,全局变量和静态全局变量。,auto:前面提到的局部变量都是自动类型。其空间分配于块始,空间释放于块终,且由系统自动进行。自动变量保存在栈中,且是在程序运行过程中获得和释放空间,未初始化时值为随机数。,4.5.2变量的存储类型,register:为提高程序运行效率,可以将某些变量保存在寄存器中,即说明为寄存器变量,但不提倡使用。,static:静态变量。根据被修饰变量的位置不同,分为局部(内部)静态变量和全局(外部)静态变量。所有静态变量均存放在全局数据区,编译时获得存储空间,未初始化时自动全0,且只初始化一次。,局部静态变量的作用域为块域,但生命期为整个文件。即当块结束时,局部静态变量空间仍然保持,直到整个程序文件结束时该局部静态变量空间才释放,生命期结束。,局部静态变量,【例410】自动变量与局部静态变量的区别。(演示),#includest()staticintt=100;/局部静态变量t+;returnt;at()intt=100;/自动变量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;,4.5.2变量的存储类型,1,2,3,4,5,101,101,101,101,101,4.5.2变量的存储类型,1,2,101,3,4,5,102,103,104,105,#includest()staticintt=100;/局部静态变量t+;returnt;at()intt=100;/自动变量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;,全局静态变量,全局静态变量是指用static修饰的全局变量。有关内容在下节静态存储类型中介绍。,4.5.3外部存储类型与静态存储类型,1.外部存储类型,2.静态存储类型,一个C+程序可以由多个源程序文件组成,编译系统将这若干个文件连接在一起,产生可执行程序。外部存储类型和静态存储类型确定了变量和函数在多文件程序中的联络关系。,1外部存储类型,外部存储类型包括外部变量和外部函数。在由多个源程序文件组成的程序中,如果一个文件要使用另一个文件中定义的全局变量或函数,这些源程序文件之间通过外部类型的变量和函数进行沟通。,在一个文件中定义的全局变量和函数都缺省为外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果要使用这个文件中定义的全局变量和函数,必须在使用前用“extern”作外部声明,外部声明通常放在文件的开头。,变量定义时编译器为其分配存储空间,而变量声明指明该全局变量已在其他地方说明过,编译系统不再分配存储空间,直接使用变量定义时所分配的空间。,函数声明缺省为外部的,因此修饰词extern通常省略。,1外部存储类型,【例4.11】外部存储类型的例子。假定程序包含两个源程序文件Ex4_11_1.cpp和Ex4_11_2.cpp,程序结构如下:/*Ex4_11_1.cpp,由main()组成*/#includevoidfun2();/外部函数声明,等价于externvoidfun2();intn;/全局变量定义voidmain()n=1;fun2();/fun2()定义在文件Ex4_11_2.cpp中coutn=nendl;/*Ex4_11_2.cpp,由fun2()组成*/externintn;/外部变量声明,n定义在文件Ex4_11_1.cpp中voidfun2()/fun2()被文件Ex4_11_1.cpp中的函数调用n=3;运行结果:n=3,2静态存储类型,静态存储类型包括静态全局变量和静态函数。在定义全局变量或函数时加说明符static,就成为静态变量或静态函数。静态存储类型的作用域与外部存储类型相反,一旦定义为静态存储类型,就限制该变量或函数只能在定义它的文件中使用。静态全局变量在编译时分配存储空间,如果定义时不指定初值,则编译系统将其初始化为全0。,一个全局变量和一个静态全局变量在使用上是不同的,其他文件通过外部变量声明可以使用一个全局变量,但却无法使用静态全局变量,静态全局变量只能被定义它的文件所独享。函数与静态函数之间的区别是相同的。,4.5.4生命期与可见性,1.生命期,2.可见性,1生命期,(1)静态生命期,(2)局部生命期,(3)动态生命期,生命期(Lifetime)也叫生存期。生命期与存储区域相关,存储区域分为代码区、静态数据区、栈区和堆区,相应地,生命期分为静态生命期、局部生命期和动态生命期。,(1)静态生命期,静态生命期指的是标识符从程序开始运行时存在,即具有存储空间,到程序运行结束时消亡,即释放存储空间。具有静态生命期的标识符存放在静态数据区,属于静态存储类型,如全局变量、静态全局变量、静态局部变量。具有静态生命期的标识符在未被用户初始化的情况下,系统会自动将其初始化为全0。函数驻留在代码区,也具有静态生命期。所有具有文件作用域的标识符都具有静态生命期。,(2)局部生命期,在函数内部或块中定义的标识符具有局部生命期,其生命期开始于执行到该函数或块的标识符声明处,结束于该函数或块的结束处。具有局部生命期的标识符存放在栈区。具有局部生命期的标识符如果未被初始化,其内容是随机的,不可用。具有局部生命期的标识符必定具有局部作用域;但反之不然,静态局部变量具有局部作用域,但却具有静态生命期。,(3)动态生命期,具有动态生命期的标识符由特定的函数调用或运算来创建和释放,如调用malloc()或用new运算符为变量分配存储空间时,变量的生命期开始,而调用free()或用delete运算符释放空间或程序结束时,变量生命期结束。具有动态生命期的变量存放在堆区。关于new运算和delete运算将在指针一章中介绍。,可见性,可见性从另一个角度说明标识符的有效性,可见性与作用域具有一定的一致性。标识符的作用域包含可见范围,可见范围不会超过作用域。可见性在理解同名标识符的作用域嵌套时十分直观。对于外层块与内层块定义了同名标识符的,在外层作用域中,内层所定义的标识符是不可见的,即外层引用的是外层所定义的标识符;同样,在内层作用域中,外层的标识符将被内层的同名标识符屏蔽,变得不可见,即外层中同名标识符的可见范围为作用域中挖去内层块的范围。图4.6显示下面程序段中变量的作用域与可见性。,可见性,下面的程序段和图示显示作用域与可见性。intm=1;floatx;floatm=3.5;X=5.5;m+;,intm,floatx作用域intm可见floatm不可见x可见,floatm作用域floatm可见intm不可见x可见,4.6函数的递归调用,递归是一种描述问题的方法,或称算法。递归的思想可以简单地描述为“自己调用自己”。例如用如下方法定义阶乘:,可以看出是用阶乘定义阶乘,这种自己定义自己的方法称为递归定义。,在函数调用中,有这样两种情况,一种是在函数A的定义中有调用函数A的语句,即自己调用自己;另一种是函数A的定义中出现调用函数B的语句,而函数B的定义中也出现调用函数A的语句,即相互调用。前者称直接递归,后者称间接递归。本节只介绍直接递归。递归函数必须定义递归终止条件(Stoppingcondition),避免无穷递归(InfiniteRecursion)。递归定义的阶乘算法用函数描述为:fac(intn)if(n=0|n=1)return1;elsereturnn*fac(n-1);只要设计主函数调用阶乘函数,即可实现计算阶乘。,4.6函数的递归调用,【例412】求4!#includeintfac(intn)inty;coutnt;if(n=0|n=1)y=1;elsey=n*fac(n-1);coutyt;returny;voidmain()coutn4!=fac(4)endl;,n=4,cout4;y=4*fac(3);,fac(4)=,cout2;y=2*fac(1);,n=2,cout1;y=1;cout1;return1;,n=1,n=3,cout3;y=3*fac(2);,cout24;return24;,cout6;return6;,coutn;cout原整数:nendl反向数:;backward(n);coutendl;,4.6函数的递归调用,n=247,cout7;backward(24);,n=2,cout2;return;,n=24,cout4;backward(2);,backward(247),return;,return;,coutendl;,求余总是取当前整数的最右一位,所以先输出余数后递归可实现倒序输出。如果先递归后输出余数,则是在回归的过程中输出,实现的就是正序输出。,从以上几例可以看出,递归算法一般不需要借助循环,但通过不断递推和回归的过程实现了其他算法用循环完成的功能。因此,递归的终止条件非常重要,否则将会无休止地递归下去,陷入死循环状态。,【例4.15】在【例3.11】中采用递推法求解Fibonacii数列,本例用递归法求解。本例的递归调用过程参见图4.11。#include#includeintfib(intn)if(n=0)return0;elseif(n=1)return1;elsereturnfib(n-1)+fib(n-2);voidmain()for(inti=0;i=19;i+)/将19改为69,可以看出计算到后面越来越缓慢。if(i%5=0)coutendl;coutsetw(6)fib(i);coutendl;,4.6函数的递归调用,图4.11递归求解斐波那契数列调用树,同其他算法相比,用递归算法编制的程序非常简洁易读,但缺点是增加了内存的开销,在递推的过程中会占用大量栈空间,且连续的调用返回操作占用较多CPU时间。因此是否选择使用递归算法取决于所解决的问题及应用的场合。,4.6函数的递归调用,4.7函数的一些高级议题,471函数重载,472缺省变元,473内联函数,4.7.1函数重载,在C+中,如果需要定义几个功能相似,而参数类型不同的函数,那么这样的几个函数可以使用相同的函数名,这就是函数重载。例如求和函数,对应不同的参数类型,可以定义如下几个重载函数:sum(inta,intb)/不写返回类型,返回整型doublesum(doublea,doubleb)floatsum(floata,floatb,floatc),当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。匹配过程按如下步骤进行:(1)如果有严格匹配的函数,就调用该函数;(2)参数内部转换后如果匹配,调用该函数;(3)通过用户定义的转换寻求匹配。因此在定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。函数重载的好处在于,可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。,4.7.1函数重载,3+5=,调用sum(3,5),函数sum(3,5),return8,2.2+5.6=,调用sum(2.2,5.6),函数doublesum(2.2,5.6),return7.8,3.5+4+8=,调用sum(3.5,4,8),函数floatsum(3.5,4,8),return15.5,结束,8,7.8,15.5,【例416】重载函数的应用。#includesum(inta,intb)returna+b;Doublesum(doublea,doubleb)returna+b;floatsum(floata,floatb,floatc)returna+b+c;voidmain()cout3+5=sum(3,5)endl;cout2.2+5.6=“sum(2.2,5.6)endl;cout3.5+4+8=“sum(3.5,4,8)0;loops-);voidmain()delay(3);cout延时3个时间单位endl;delay();/等同于delay(5)cout延时5个时间单位=0因使用频度很高,说明为内联函数。,4.8C+的系统库函数,C+提供了一个很大的常用函数库,该函数库本身并不是C+语言的组成部分,所有库中的函数用户都可以自己定义,但直接使用库函数能给编程带来很大方便。系统函数库实际上是一系列源程序文件,每个文件中定义了若干常用函数及标识符,具有相同或相似功能的函数和标识符集中放在一个文件中。这些文件均以.h的形式命名,存放在系统目录的include子目录下。例如文件iostream.h中定义了与控制台输入输出和文件输入输出相关对象和成员函数,math.h中定义了大量数学函数,string.h中定义了大量与字符串操作相关的函数。,49头文件与多文件结构,491头文件,考虑标识符在其他文件中的可见性。使用头文件是很有效的方法。如:#include其中的iostream.h是系统定义的一个文件,这种以“.h”命名的文件称为头文件,系统定义的头文件中定义了一些常用的公用标识符和函数,用户只要将头文件包含进自己的文件,就可使头文件中定义的标识符在用户文件中变得可见,也就可以直接使用头文件中定义的标识符和函数。,49头文件与多文件结构,除了系统定义的头文件外,用户还可以自定义头文件。对于具有外部存储类型的标识符,可以在其他任何一个源程序文件中经声明后引用,因此用户完全可以将一些具有外部存储类型的标识符的声明放在一个头文件中。具体地说,头文件中可以包括:用户构造的数据类型(如枚举类型),外部变量,外部函数、常量和内联函数等具有一定通用性或常用的量,而一般性的变量和函数定义不宜放在头文件中。,492多文件结构,在开发较大程序时,通常将其分解为多个源程序文件,每个较小的程序用一个源程序文件建立。程序经过建立、编译、连接,成为一个完整的可执行程序。多文件结构通过工程进行管理,在工程中建立若干用户定义的头文件.h和源程序文件.cpp。头文件中定义用户自定义的数据类型,所有的程序实现则放在不同的源程序文件中。编译时每个源程序文件单独编译,如果源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存放在内存,之后对临时文件进行编译生成目标文件.obj,编译后临时文件撤销。所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。图4.12是一个多文件系统的开发过程。,492多文件结构,编译,预编译,编译,预编译,预编译,编译,图4.6C+程序开发过程,4.10编译预处理,4101宏定义指令,4102文件包含指令,4103条件编译指令,4.10.1宏定义指令#define,1不带参宏定义用来产生与一个字符串对应的常量字符串,格式为:#define宏名常量串预处理后文件中凡出现该字符串处均用其对应的常量串代替。替换过程称为宏替换或宏展开。例如,如果使用指令#definePI3.1415926则程序中可以使用标识符PI,编译预处理后产生一个中间文件,文件中所有PI被替换为3.1415926。宏替换只是字符串和标识符

温馨提示

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

评论

0/150

提交评论