《Fortran介绍》PPT课件.ppt_第1页
《Fortran介绍》PPT课件.ppt_第2页
《Fortran介绍》PPT课件.ppt_第3页
《Fortran介绍》PPT课件.ppt_第4页
《Fortran介绍》PPT课件.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

Fortran90程序设计,编译器简介,4程序单元概念,1Fortran语言的发展,2源程序及其构成,3语言元素,作用:把高级语言翻译成机器码,也就是常常可以看到扩展名为EXE、COM的文件。相同的程序代码可用不同厂商的编译器来编译,所生成的文件也不会完全相同。编译器的好坏主要取决于编译结果。,1.1编译器简介,第一章FORTRAN语言的发展简史,2.1Fortran语言的发展简史,一、FORTRAN含义及其适用范围FORmulaTRANslator公式翻译器科学和工程计算问题的程序设计语言,二、发展简史代表性:1957,1958FORTRAN,1962FORTRAN,1978FORTRAN77,1991.FORTRAN901997.FORTRAN95,FORRAN95不象FORTRAN90在FORTRAN77添加很多内容,只能视为90的修正版,加强了并行运算方面的支持,2.2FORTRA90源程序基本结构,例:见书P15页例题2-12-22-3。1、由若干个程序单元(位)组成:主程序、外部子程序、模块、块数据单元2、主程序结构program程序名称一般省略声明语句部分执行语句部分ENDprogram程序名称3、END,停止运行结束标记,书写格式,Fortran程序代码的编写格式有两种:FreeFormat(自由格式)扩展名:.F90建议所有程序全部改用自由格式来编程FixedFormat(固定格式)本教材不采用扩展名:.F或.FOR,书写格式,FixedFormat(固定格式),书写格式,1.CFIXEDFORMATDEMOPROGRAMMAINWRITE(*,*)HELLOWRITE(*,*)1HELLO100WRITE(*,*)HELLO10STOPEND程序代码命令之间的空格,不会有任何意义。FIXEDFORMAT是为了配合早期使用穿孔卡片输入程序所发明的格式。,FreeFormat(自由格式)基本上允许非常自由的编写格式,它没有规定每一行的第几个字符有什么作用,但要注意:1.!感叹号后面的文本都是注释。2.每行可以编写132个字符。3.行号放在每行程序的最前面。4.一行程序代码的最后如果是符号”分隔一个语句可分行写,读行标记为&(放在尾部),但如为关键字,首尾均加&。最多可有511个续行。例pro&grammain,书写格式,空格:关键字、变量、常量内部不能用空格,但相邻两者之间须用空格语句前标号仅用于标识一个语句,与运行顺序无关。语句有位置规定说明语句必须出现在可执行语句之前,格式说明语句(FORMAT语句)除外。,书写格式,2.3语言元素,Fortran90的语言元素是指在程序设计中所用到的基本成分,例如字符集、常量、变量、记号以及其它的基本结构等。只有了解并掌握了这些基本要素,才可能正确自如地使用该种语言。,2.3.1FORTRAN90字符集:编写Fortran90程序时,所能使用的所有字符及符号。AZ(az)程序中不区分大小写26个在大多数处理系统中允许使用小写字母,除了字符串内的字符外,小写字母等价于相应的大写字母。,0910个空格=+-*/(),:.$22个_(下划线)、!、”、%、&、;、?注意:1、在FOR源程序中,只能使用以上字符2、字符型数据内可以出现任意字符(包括汉字)命名规则:131个字符,由字母、数字、下划线组成,第一个字符为字母全局名:主程序单元、外部过程、数据块、模块,2.3.1FORTRAN90字符集,在Fortran90中,将字母、数字或专用字符的基本有效的序列称为记号,它包括标号、关键字、名字、常数、运算符和定界符。例如:A*SIN(x)+5.3这个表达式包括6个记号,即A、*、SIN、x、+、5.3。注意:在字符串内部,不能随意地添加空格。在记号内部,也不许随意地使用空格。记号与记号之间的空格可以随意地使用。多个空格在语法上与一个空格的作用相同。一个记号与相邻关键字、名字、常数或标号之间,应当用一个或多个空格分开,以避免错误,同时也使结构清晰。,2.3.2记号,常量的定义:常量是程序执行过程中不能变化的量。基本数据类型有五种:整型、实型、复型、字符型和逻辑型前三种属于数值类型,后两种为非数值类型,主要用于文字处理和控制。,2.3.3基本类型常量,Fortran的数据类型,种别参数是由内在询问函数KIND送回的。提供的最小范围是由内在函数Selected_int_kind送回的。表示十进制幂的范围是由内在函数range送回的。缺省种别是指有符号或无符号的整数值。可在数值后用下划线标明种别,没有下划线为缺省种别。缺省种别整数的范围一般取决于所用计算机的字长。说明了种别参数后,提高了程序的可移植性。简而言之,种别即决定数值在计算机中存储的字节数。,整型数据:微机支持3种kind_Value:1,2,4(1)范围:-128127(2)范围:-3276832767(4)-21474836482147483647(-231231-1)Integer默认kind_Value的值为4,1.整型常量(INTEGER)整型常量又叫整数,整数值的集合就是数学整数的子集。,123_2&kind_Value常量也可如此指定,Fortran的数据类型,在FORTRAN90中,也可以表示二进制、八进制、十六进制形式的无符号整数。其形式如下:二进制数:B101101或B”101101”八进制数:O76210十六进制数:Z1FA2,Fortran的数据类型,2.实型常量(REAL)实型常量又叫实数,它具有数学实数的近似值。实数最常见的两种表示形式是:小数形式和指数形式小数形式:由十个数字、小数点及数符组成的数。指数形式:对绝对值相对较小或很大的实数。规格化指数形式:(两种形式)1。数字部分的值小于1,且小数点后的第一位数字非02。数字部分有且仅有一位非零的整数。,Fortran的数据类型,一般分为两种real(4)单精度(默认)real(8)双精度,小数形式:+/-m.n,+/-m.,+/-.n例100.0.55.注:小数点必须有。指数形式:数字部分E指数部分e科学计数法0.876=87610-3876E-3=87.610-287.6E-2=0.087610+10.0876E+1。数字部分,小数形式实数整数,Fortran的数据类型,指数部分:e只能为整数错例:4E5.6数字部分不能丢;例:10-4:E-4(错)1E-4(正确)以标准化形式输出(=1)实数:存储7位有效数字。如:2.300000上溢:overflow下溢:当0处理4.实数种别为8时常量的表示(双精度数)有效位:15位;数字部分De例:0D0,Fortran的数据类型,3.复数(COMPLEX)复型常数又叫复数。具有数学复数的近似值。在科学和工程计算中被广泛用到。复数是实数的有序对,将两个实数中间用逗号分隔,然后再放在一对括号中就构成了一个复数。复数以a+bi的形式来表示数值,复数中的a、b称为实部和虚部。可为实数,也可为整数。Complex(4)(默认)例:Complex(4):bComplex(8)双精度Complex(8):c,d,e常量:符号(实部_kind_Value,虚部_kind_Value)例:f=(1,2.0_8),Fortran的数据类型,复型常量的表示:数学2+3i,一般形式:(实部系数,虚部系数),错例:(1.0/2,3)正例:6i,(0,6)当复数的实部或虚部为变量或表达式进行赋值时,必须使用CMPLX()函数。,FORTRAN90(2,3),Fortran的数据类型,4.字符(CHARACTER)计算机除了存储数字之外,也可以在内存中记录一段文本,字符类型可以记录的东西非常广,从键盘输入的任何东西,不论是数字、文本或任何特殊符号,它都可以记录,只记录一个字母、符号时的数据类型称为“字符”,记录一连串的字符时,就称为“字符串”,记录一个西文字符需要一个字节的存储空间。一个汉字为两个字节的存储空间。kind指明计算机系统支持的字符种类.字符常量:例:ASCII_”abcde”!kind值放在常量前面例:Character(LEN=10,kind=GREEK):Greek_wordlen=10可以直接写为10或缺省长度为1;如只有一个没有命名的参数,一定是长度整数,Fortran的数据类型,字符常量的表示:一串字符或“一串字符”(双引号),空格算一个“算一个起止界不算长度可为0,字符中含改写为abcd,长度:字符的个数,注:区分字符大小写aA空格有效abab,Fortran的数据类型,5.逻辑判断(LOGICAL)逻辑判断只能保存两种逻辑结果,分别为“true”和“false”。LOGICAL(_kind_value)LOGICAL(1)LOGICAL(2)LOGICAL(4)(默认,值存储在第一个字节中)对数据的二进制最低位进行判断,如果为1,则接受为真,否则接受为假。,Fortran的数据类型,2.3.4名字,对于名字有下列要求:1.名字的长度不能超过31个字符2.名字的组成成分可以是字母、数字和下划线3.名字的第一个字符必须是字母4.在名字中不能出现空格提倡使用具有一定含义的名字,提高程序的清晰度和可读性。,1、定义:程序运行过程中值可变化的量2、命名的规则,字母、数字、下划线组成字母开头长度1-31个,错例3A、x-3、3.14、A3$,2.3.5变量,3、变量含义:实际是内存中的一个存储单元,存放变量的值。特性:取之不尽,一冲就跑,总采用当前值参与运算。例:A=2.0ABB=3.0A=A+B5.015.0B=A*B注:A、B必须有确定值,如未定义,值不可预测(有时按0处理),2.0,3.0,4、变量类型:基本类型有五种,同常量I-N规则(隐式说明):在程序变量名中,凡以字母I、J、K、L、M、N六个字母开头的变量为整型变量。implizcitnone可以取消I-N规则。五种变量的类型说明关键字:整型:INTEGER实型:REAL复型:COMPLEX逻辑型:LOGICAL字符型:CHARACTER待说明的变量放在后面,中间用双分隔符:隔开,对于同时说明多个变量,变量之间用逗号分隔。,Fortran90关于变量说明的新功能:1.在变量说明的同时,可以给变量赋初值。INTEGER:I=5,J=126REAL:X=7.2,Z,W=774.22.在说明变量的同时也可说明其种别3.在说明变量的同时,还可说明变量的属性INTEGER,PARAMETER:I=5,J=123REAL,DIMENSION(1:10):A,2.3.6派生数据类型,根据需要而由基本数据类型定义新的数据类型。在一个派生类型中可包含多个基本类型。如:TYPESTUDENT(定义开始)CHARACTER(LEN=20):DEPARTMENTCHARACTER(LEN=10):CLASSCHARACTER(LEN=15):NAMEINTEGER:NUMBER(成员定义)ENDTYPESTUDENT(定义结束),派生类型变量的定义:TYPE(STUDENT):PERSON变量的赋值:PERSON=(”COMPUTER”,”92_2”,”LILIN”,21)成员的表示:PERSON%CLASS=“92_2”PERSON%NAME=“LILIN”,2.3.7基本类型数组,数组是具有相同类型的元素的有序集合。数组在使用之前必须说明。数组的说明:INTEGER,DIMENSION(1:50):X;数组名为X,类型为整型,元素个数为50。INTEGER,DIMENSION(5,3):B;数组名为B,类型为整型,元素个数为5*3个维界:1:50上界:下界缺省下界为1数组中元素的个数称为它的大小,维数称为秩,每维中元素的个数称为维的长度,长度的序列称为形。,数组的引用:通过指定下标值的办法来实现。下标值可为整数或整型表达式。下标值不能越界,个数必须与数组的秩相等。注意:1.允许对数组名进行运算。2.允许对数组片段进行操作。所谓数组片段是指数组中某些连续元素的重新组合。数组片段也是一个数组。,2.3.8字符子串,字符型常量又叫字符串。一个字符串的一部分称为子字符串或字符子串。字符数组:CHARACTER(LEN=1),DIMENSION(80):ROW引用:ROW(I)字符串:CHARACTER(LEN=80):ROW引用:ROW(I:I);ROW(4:7)特殊:ROW(:I)相当于ROW(1:I)ROW(I:)相当于ROW(I:80)ROW(:)相当于ROW(1:80)特定长度字符数组:CHARACTER(LEN=80),DIMENSION(25):ROWC引用:ROWC(I)(J:J),2.3.9数据对象和子对象,由一个名引用的对象:有名标量有名数组由子对象标志符引用的子对象是:数组元素数组片段结构分量子串,2.4程序单元概念,程序单元是FORTRAN语言的基本成分。程序单元可以是主程序、子程序、模块或块数据程序单元。子程序可以是函数子程序或子例行子程序。模块包含的说明是对其它的程序单元形成可访问性。块数据单元用来对有名公用区中的数据对象赋初值。(F90中不提倡使用),2.4.1主程序,主程序是不包含SUBROUTINE、FUNCTION、MODULE或BLOCKDATA语句作为其第一条语句的程序单元。主程序的可执行部分不能包含有RETURN语句或者ENTRY语句。程序名对可执行程序是全局的,而且不得于该可执行程序中的任何其它程序单元名、外部过程名或公用块名相同,也不得于主程序内的任何局部名相同。在主程序的作用范围内的说明不得包含OPTIONAL语句、INTENT语句、PUBLIC语句或它们的等价属性,在主程序内SAVE语句不起作用。主程序内的任何内部过程的定义必须跟在CONTAINS语句之后。,2.3.2子程序,子程序是可以完成某一独立算法或功能的程序单元,但它功能的具体体现要通过主程序(或子程序)的调用来实现。按子程序与主程序的位置关系分为内部过程和外部过程。内部过程可以出现在主程序、外部过程或模块内。,2.4.3模块,模块也是一种在程序单元之外独立编写的程序单元。它有独特的形式,即模块程序单元内没有可执行语句,除了说明语句外,最多包含内部过程。模块的主要作用是供其它程序单元引用。程序单元引用模块,实际是将模块内的全部语句复制到本程序单元。模块的引用采用语句:USE模块1,模块2,,2.4.4块数据程序单元,块数据程序单元对有名公用块内的数据对象提供初值。由于块数据程序单元赖以支持的COMMON语句和DATA语句在F90中已成为过时特性,因此,不提倡使用块数据程序单元。,2004年4月,45/149,GNUCompiler,GNUCompiler自由软件,一般操作系统都自带支持C/C+、Fortran77、Java、COBAL等等许多语言支持大部分硬件平台高性能计算中常用的:C/C+:GCC(GNUC/C+Compiler)Fortran77:G77不支持Fortran90/95不支持OpenMP是最常用的编译器,性能一般(相对于一些针对特定平台优化的编译器)由于缺少对Fortran90/95,限制了其在高性能计算中的使用,2004年4月,46/149,PGICompiler,PGICompiler由Portland公司开发的编译器支持AMDOpteron/Althon处理器、IntelXeon处理器等,在Opteron上同时支持32-bit和64-bit()支持Linux、Windows支持C/C+(pgcc)、Fortran77(pgf77)、Fortran90/95(pgf90)、HPF(HighPerformanceFortran)支持多线程和OpenMP最新版本:10.1需要购买,但可以从网上得到15天试用版本,2004年4月,47/149,IntelCompiler,IntelCompiler由Intel公司针对Intel处理器开发(Xeon、Pentium)支持Linux、Windows支持C/C+(icc:IntelC/C+Compiler)、Fortran77/90/95(ifc:IntelFortranCompiler)支持多线程和OpenMP需要购买,但可以从网上得到30天试用版本,2004年4月,48/149,编译优化,编译优化对于计算密集型程序的性能提高非常帮助优化消耗CPU资源最多的那部分,即计算密集部分一般采用-O2、-O3可以采用SIMD指令集,eg:Intel和AMD处理器的MMX、SSE1、SSE2具体编译优化的选项和编译器以及CPU相关,参见编译器手册对于有些应用程序,过分的优化会导致计算结果错误,2004年4月,49/149,编译优化,在双路IntelXeon平台上,采用SSE2优化和不采用SSE2优化,所获得的HPL性能。在这种情况下,采用SSE2技术得到的性能高出近90,2004年4月,50/149,编译简介,在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件大部分编译器通过后缀来区别输入文件的类别,下面来介绍常用的一些后缀.c:C语言源代码文件.f:Fortran77语言源代码文件.o:编译后的目标文件.a:由目标文件构成的档案库文件.C、.cc、.cxx:C+源代码文件.f90:Fortran90语言源代码文件.h:程序所包含的头文件,2004年4月,51/149,基本的用法,cc/f77/f90optionsfilenames编译器名编译参数编译文件其中options就是编译器所需要的参数,filenames给出相关的文件名称,2004年4月,52/149,常用编译参数,-c:只编译,不连接成为可执行文件,编译器只是由输入的.c/.f等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。-ooutput_filename:确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,就给出预设的可执行文件a.out-g:产生符号调试工具所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。-O2、-O3、-O4:比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。(具体和编译器相关),2004年4月,53/149,常用编译参数,-Idirname:将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况:A)#includeB)#include“myinc.h”其中,A类使用尖括号(),B类使用双引号(“”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。,2004年4月,54/149,常用编译参数,-Ldirname:将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。-lname:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。上面我们简要介绍了编译器最常用的功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。,2004年4月,55/149,GCC应用举例,1.gcchello.c生成a.out2.gccohellohelo.c生成hello3.gccOohellohello.c生成hello4.gccO2ohellohello.c生成hello5.gccchello.c生成hello.ogccohellohello.o生成hello6.gccchello1.c生成hello1.ogccchello2.c生成hello2.ogccohellohello1.ohello2.o生成hello7.gccotesttest1.olmI/home/czn/include,MPI的安装,安装:#tar-xzvfmpich-1.2.6.tar.gz#cdmpich-1.2.6#./configure-with-device=ch_p4-prefix=/usr/local/mpich-1.2.6#make#makeinstall环境变量设置#vi/etc/profile加入下面的行exportMPI_ROOT=/usr/local/mpich-1.2.6exportPATH=$MPI_ROOT/bin:$PATHexportMANPATH=$MPI_ROOT/man:$MANPATH#source/etc/profile,MPI的使用,mpirun的基本格式为:mpirunmpirun-optionsoptions其中mpirun-options,主要选项如下:-np要加载的进程个数,系统读machines.LINUX的内容-p4pg按照p4file文件中的要求加载用户进程-machinefile按照machinesfile文件中的节点名个数加载进程p4file文件该文件的格式为:第一行:第二行:.第n行:其中n为用户要加载进程的个数。结点名可以相同,也可以不同。且用户使用此选项后,-np选项无效。machines.LINUX文件和machinefile文件内容:nodeX:Y.nodeZ:WX-Z:机群节点名(系统名字)比如节点1-20Y、W节点名对应的CPU个数,MPI使用简例,最简单的运行一个MPI应用程序的例子是:#mpirun-np4a.out,#mpirunmachinefilemachinefilea.out#mpirunp4pg./p4filea.out它将在并行机上加载个用户执行程序一般情况下最好用-p4pg选项,p4file文件包含有关进程在哪些节点上运行的信息。如你已登录到节点node1,并用4个节点执行你的并行程序a.out,执行文件的全路径/public/user1/example/a.out,则p4file内容如下:node10/public/user1/example/a.outnode21/public/user1/example/a.outnode31/public/user1/example/a.outnode41/public/user1/example/a.out执行命令为:#mpirun-p4pg./p4filea.out,MPI应用层优化,OMPI/public/openmpi-1.3-pgi/bin/mpirun-np64-mcabtlopenib,self,sm-mcabtl_openib_max_btls20-mcabtl_openib_rd_num128-mcabtl_openib_rd_low75-mcabtl_openib_rd_win50-mcabtl_openib_max_eager_rdma32-mcampool_base_use_mem_hooks1-mcampi_leave_pinned1-machinefile./ma./vasp.pgi.7,MPIforPGI,下载mpich.tar.gz解压tarzxvfmpich.tar.gz进入mpich目录执行:#exportCFLAGS=-fast#exportCXXFLAGS=-fast#exportFFLAGS=-fast#exportF90FLAGS=-fast“#exportLDFLAGS=-fast#exportOPTFLAGS=-fast#exportCC=pgcc#exportCXX=pgCC#exportF90=pgf90#exportFC=pgf77#exportCPP=pgCC-E“#./configure-prefix=/usr/local/mpich-pgi#make#makeinstall,MPIforPGI,设置环境变量#vi/etc/profile加入下面的行exportMPI_ROOT=/usr/local/mpich-pgiexportPATH=$MPI_ROOT/bin:$PATHexportMANPATH=$MPI_ROOT/man:$MANPATH#source/etc/profile,MPIforintelCompiler,将mpich解压后,进入mpich目录执行:#./configure-with-device=ch_p4-prefix=/usr/local/mpich-intelcc=iccfc=ifortc+=icpcf90=ifort#make#makeinstall设置环境变量相关#viprofile添加:exportMPICH_ROOT=/usr/local/mpich-intelexport$PATH=$MPICH_ROOT/bin:$PATHexport$MANPATH=$MPICH_ROOT/man:$MANPATH执行#source/etc/profile即可,一、引子在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:big-edian和little-endian。为了叙述方便,下面先对本文中将要用到的两个术语做简单的定义。1、MSBMSB是MostSignificantBit/Byte的首字母缩写,通常译为最重要的位或者最重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影响最大的那个bit/byte。2、LSBLSB是LeastSignificantBit/Byte的首字母缩写,通常译为最不重要的位或者最不重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影响最小的那个bit/byte。,二、endian的来由,1、Definitionendian:Theorderingofbytesinamulti-bytenumber.定义:在计算机系统体系结构中用来描述在多字节数中各个字节的存储顺序。,三、各种endian1、big-endianAcomputerarchitectureinwhich,withinagivenmulti-bytenumericrepresentation,themostsignificantbytehasthelowestaddress(the

温馨提示

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

评论

0/150

提交评论