C语言详解笔记_第1页
C语言详解笔记_第2页
C语言详解笔记_第3页
C语言详解笔记_第4页
C语言详解笔记_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

C语言详解(ProblemSolvingandProgramDesigninC)笔记摘要前言本书主要讲述两大部分:程序设计思想的介绍和C语言语法。第一章C概述C是一种高级程序设计语言,它是由DennisRitche于1972年在AT&TBell实验室开发出来的,起初是作为在UNIX操作系统下编程的工具而设计的,它的最初使用者就是理解操作系统和底层机器复杂性的程序员。C语言要素预处理指令一般程序包括两部分:预处理指令和主函数。预处理指令(prepeocessordirective)是为C预处理器(preprocessor)提供指令的命令,预处理器的工作是在C程序编译前修改程序文本。常用的指令:#include和#define。每个C实现中都包含了一些实用函数和符号的集合,称之为库。C的ANSI(AmericanNationalStandardInstitute,美国国家标准学会)标准要求在每个C实现中提供特定的标准库。例如:#includevstdio.h>,它使预处理器在编译前将标准头文件的定义插入到程序中°#defineK1.069,将常量宏(constantmacro)K与1.069关联起来,该指令让预处理器在编译开始之前,用1.069代替C程序文本中的每一个K。在执行中C程序不能改变用常量宏定义的数值。主函数每个C程序都有一个主函数,其余行组成了函数体,函数体包含两部分:声明和可执行语句。声明(declaration):程序的一部分,告知编译器程序中的存储单元名称。可执行语句(executablestament):被转换为机器语言指令,并由计算机执行的程序行。Intmain(void){函数体}Int表明函数执行完成时向操作系统返回一个整数值,void表示函数执行前不向操作系统接受数据。保留字保留字(reservedword):C中有特殊含义的字。例如:intvoiddoublereturn0标准标识符标准标识符(standardidentifier)拥有特殊含义的字,但程序员可以重新定义(但不建议重新定义)。用户自己定义的标识符遵从以下原则:标识符只能由字母、数字和下划线组成。标识符不能以数字开头。C保留字不能用作标识符。在C标准库中定义的标识符不能被重新定义。大小写字母C编译器区分大小写。编程风格为用户定义的标识符选择一个有意义的名称,这样标识符在使用时就比较容易理解。如果一个标识符由两个以上的单词组成,那么他们之间用下划线连接。为了避免混淆不适用名称相似的标识符,尤其应该避免选择两个仅有大小写字母区别的标识符,也不要用两个仅有下划线区别的标识符。变量声明和数据类型变量声明变量声明将程序中使用的所有变量名告知编译器,同时告诉编译器,在每个变量中将会存储什么类型的信息以及信息在内存中如何表示。数据类型int型表示的数值范围从-32767到+32767。double型1.23e5表示1.23乘以10的5次幂。char型Char型可以表示数字、字母和专用符号。可执行语句函数中的可执行语句跟在声明之后,他们用于编写算法及其细化的C语句。C编译器将可执行语句翻译为机器语言。当程序运行时,计算机会执行语句的机器语言版本。输入/输出操作和函数输入函数scanf和输出函数printf,printf("格式字符串",输出列表),举个例子:printf(“thatequals%fkilometers.\n",kms),%f是占位符。多个占位符格式字符串可以拥有多个占位符。如果调用printf的输出列表有多个变量,那么格式字符串将包含同样数量的占位符。C以从左到右的顺序对占位符和变量进行匹配。举个例子:printf(”Hi %C%C%C_yourageis%d\n”,letter_1,letter_2,letter_3,age);scanf函数格式:scanf(“%c%d”,&letter-l,&age);在程序执行时,函数将用户在键盘上输入的数据复制到内存中。格式字符串中的占位符对应输入列表中的变量,变量前面有取地址符号&。占位符的顺序必须与变量列表中的变量顺序一致。return(0)语句将控制由程序交给操纵系统。小括号中的0被认为是函数main的执行结果,该值表明执行的程序没有错误。算术表达式运算符/和%当操作数是两个正整数时,/计算除法运算的整数部分;当操作数是double型时,/计算运算的真实值。%取余运算。混合类型赋值语句同时拥有int型和double型操作数的表达式是混合类型表达式,其结果的数据类型是double型。将double型赋给int型时,小数部分会丢失。强制类型转换将希望的数据类型放在表达式前面的括号内,从而转换表达式的类型。要注意整数除法的使用。多个运算符的表达式一元运算符:拥有一个操作数的运算符;二元运算符:需要两个运算符。在程序输出中格式化数值格式化int型%数字d,数字表示输出整数所用的列数。格式化double型%m.nf其中m表示整个域宽的数,包括小数点在内,n是希望的小数位数,以四舍五入的方式舍去。在格式字符串占位符中忽略总的域宽是合法的,例如:格式为%3.2d3.14159=3.14采用%.nf的格式可以消除数据前面的前导空白。交互模式、批处理模式和数据文件交互模式(interactivemode):用户通过输入(键入)数据来响应提示符的一种程序运行模式。批处理模式(batchmode):程序从预先准备好的数据文件中得到数据的一种程序运行模式。第二章函数的自顶向下设计自顶向下设计(top_downdesign):将问题分解为主要的子问题,然后解决子问题以得到最初问题的解决方案。无参函数函数原型Ftypefname(void) ftype表示函数的返回值类型,void为无返回值;fname表示函数名。函数定义写函数体几个不常用的数学函数:Ceil(x):返回不小于x的最小整数 fabs(x):返回double型参数的绝对值Floor(x):返回不大于x的最大整数pow(x,y):返回x的y次幕带输入参数的函数每当执行函数调用语句时,系统就会为该函数分配内存空间作为数据存储空间。包含在函数数据域中的是用于存储形参和任何在函数中声明的局部变量的存储单元。当函数终止时,函数数据域就丢失了,当函数再次被调用时会重新产生新的数据域。第三章选择结构:if语句和switch语句控制结构控制结构:单个指令结合成的具有一个入口点和一个出口点的逻辑单元。逻辑运算符&&:与 ||:或!:非C语言认为任何非零值为true.运算符优先级从高到低:函数调用——>!、+、-、&(一元运算符)——>*/%——>+-——><<=>=>——>==!=——>&&——>||——>=比较字符先比较字符长度,长度相同看第一个字符,第一个字符相同再看第二个;if语句一个选项形式: if(条件)语句;两个选项形式:if(条件)语句;else语句;具有复合语句的if语句也就是由多条执行语句,此时要有大括号;内聚函数:执行单个操纵的函数。使用常量宏来增强程序的可读性和可维护性。if嵌套格式:if(条件1)语句1;elseif(条件2)语句2;elseif(条件n)语句n;else语句;swtich语句格式:swtich(条件表达式){case1:语句1;break;case2:语句12;break;casen:语句nbreak;default:语句n;第四章循环暂跳过第五章模块化编程当函数调用执行时,计算机将在该函数数据区为每一个形式参数分配内存空间,每个实参的值都存储在其对应的形参的内存空间中,并且函数体可以对该值进行操作。存根:不是所有函数都能够在同一时间完成,存根的使用使我们能够调试和测试主程序流程和已经完成的部分。单元测试:对单个函数进行测试。第六章简单数据类型强制类型转换:例如:有int型的dl=4.nl=5,有double型的frac,表达式frac=dl/nl,先计算dl/nl的值为0,然后再将结果转化成double型为0.0,而表达式frac=(double)dl/(double)nl,先将dl转换为4.0,nl转换为5.0再进行计算,结果为0.8。枚举类型:程序员在类型声明中制定列表值的一种数据类型。/*枚举声明的格式如下:*/typedefenum{monday,tuesday,wednesday,thursday,friday,saturday,sunday}day_t;枚举常量Monday表示为整数0,常量Tuesday表示为1等等。注意:只有标识符可以出现在这种类型的值的列表中。注意不要在其他类型中再次使用这些标识符。第七章数组数据结构(datastructure):在同一个名称下存储的相关数据项的组合;数组(array):相同类型数据项的集合;数组声明和引用声明格式:元素类型aname[size];元素类型aname[size]={初始化列表};数组引用:aname[下标],下标可以是int型任意表达式。数组参数形参数组:数组位于子函数的参数列表中当一个没有下标的数组名出现在函数调用的实参列表中时实际存储在函数相应的形参中的是数组元素的起始地。例如:voidfill_array(intlist[],intn,intin_value){},实际调用函数fill_array()时,形参list[]实际存储了实参数组的首地址,所以这样调用函数也是正确的:fill_array(&x[0],10,l),表示给10个元素的数组x的每个元素赋值为1。数组作为输入参数在形参数组声明时加上限定词const用于通知C编译器该数组只是函数的一个输入,函数不能修改该数组。例如:intget_max(constintlist[],intn),表示找到用n个元素数组中的最大元素。返回数组结果例如:voidadd_arrays(constdoublear1[],constdoublear2[],doublearson[],intn){intn;for(i=0;ivn;i++)arsum[i]=ar1[i]+ar[i];},调用函数add_arrays(x,y,x_plus_y,n)仔细观察会发现,调用add_arrays时,在访问输入参数数组x和y,以及访问输出数组x_plus_y之间的表示方法上没有不同。具体地说,不需要在输出数组阐述名前面加上&运算符。前面讨论过,C语言总是将数组元素首地址存储在相应的形参中,以便将整个数组作为阐述传递。由于输出参数arsum在声明时没有带const限定词,因此函数add_arrays会自动拥有存取和改变相应参数组的权限。栈栈是一个只有顶端元素可以被访问的数据结构。出栈(pop):从栈中移走顶端元素。压栈(push),在栈中插入一个新元素。7.3数组搜索与数组排序略第八章字符串8.1字符串基础声明并初始化字符串字符串时作为数组实现的,因此声明字符串变量和声明char型数组一样。例如:charstring_var[20],声明了一个可以容纳0到29个字符长的字符串,其中一位被空字符\0占据,空字符标记字符串结束。8.1.2使用printf和scanf进行输入和输出例如:printf(“***%8s***%3s***\n”,"short”,'strings'),第一个字符串在一个8列字段右对齐显示。第二个字符串比指定的字段宽度长,因此字段被扩展到刚好容纳该字符串而没有填充空白。要想左对齐,在占位符前面加上“-”号。Scanf使用注意,为字符串数组输入数据时,由于本身传递的就是字符串数组的首地址,所以无需加取地址符号。字符串库函数字符串赋值函数strcpy将第二个参数对应的字符串复制到第一个参数。函数strncpy()可以指定赋值字符的个数。其他函数Strcat()将第二个参数追加到第一个参数的末尾。Strcmp()按字母顺序比较s1和s2:如果s1超前s2返回负数(s1中字母在字母顺序表中排在s2的前面),相等返回零,否则返回正数。Strlen()返回字符串的长度较长的字符串:拼接和整行输入8.3.1拼接字符串库函数strcat和strncat将第二个字符串参数的全部或部分添加到第一个字符串参数之后,从而改变第一个参数。字符和字符串注意区分字符'a'和字符串”a”。8.3.3输入一个完整的行函数fgets()接受三个参数一一输出字符串参数、将要存储的最大的字符数和数据源文件指针。函数fgets不会从数据文件中读取超过n-1个字符,并且存储的最终字符总是“\0”。但是,最后一个字符前一个字符不一定是“\n”。字符串比较函数strcmp(strl,str2),比较两个字符串,最从下面两条原则:如果str1,str2前n个字符匹配并且str1[n]和str2[n]是第一对不匹配的字符,如果且str1[n]vstr2[n],那么strl小于str2,函数返回-1,反之返回+1,如果两个字符串各个字符相同,那么返回0.如果str1比str2段,并且str1所有字符与str2的对应字符相同,那么str1vstr2。指针数组声明方法:数据类型*数组名称[数组大小]字符操作C提供了字符输入输出程序作为stdio库的一部分,并且还在库中提供了用于字母分析和转换的扩展函数集合,这个哭通过包含头文#<ctype.h>引用。字符输入输出Stdio库包含了一个名为getchar()的程序,它用于从标准输入源获得下一个字符,该标准输入源和scanf用的输入源一样。Getchar()不接受任何参数并返回输入的字符作为结果。实际上getchar()返回值的类型是into8.6.2字符分析和转换Isalpha()参数是不是字母表中的一个字母Isdigit()参数是不是一个数字Islower()参数是不是一个小写字母Isupper()参数是不是一个大写字母Ispunct()参数是不是一个标点符号Isspace()参数是不是空格、执行或制表符等空白字Tolower()大写字母转换成小写字母Toupper()小写字母转换成大写字母结果为真时返回非零值,结果为假时返回0。递归(recursive)函数调用自身称为递归。结构体和共同体用户自定义结构体类型数据库是存储在计算机内存或硬盘文件中的信息集合,可以细分为记录结构体类型定义语法:typedefstrcut{Type1id_list1;Type2id_list2;Typenin_listn;}struct_type;为了避免混淆,自定义结构体的名字以_t结束。Typedef语句本身不分配内存,为了给结构化的数据对象分配存储空间需要声明变量。分层结构体(hierarchicalstructure):成员是机构体类型的结构体。操作结构化数据对象的单个成员可以通过直接成员选择运算符来引用一个结构体的成员。直接成员选择运算符(directcomponentselectionoperator)为实现对成员的引用,介于结构类型变量和成员之间的句点符号。运算符的优先级与结合性优先级符号运算符名称结合性最咼A[]f().下标、函数调用、成员运算符左++--自加自减的后缀形式左+—!—+&*自加自减的前缀形式、逻辑非、一兀正负、取地址、指针运算符右(类型名)强值类型转换右*/%乘法、除法、取余左+-二元关系运算符加减左<><=>=关系运算符左1r==!=相等性、不等性运算符左&&逻辑与左II逻辑或左最低=+=-=*=/=%=赋值运算符右操作整个结构体整个结构体可以直接进行赋值操作。10.2结构体类型数据作为输入/输出参数当结构体变量作为输入参数传递给一个函数时,结构体所有成员的值均复制给函数相应形参的成员;当这样的变量用作输出参数时,必须使用取地址运算符。例如:Voidprint_planet(planet_tpl){Printf(“%s\n,);Printf(“Equatorialdiameter:%.0fkm\n”,pl.diameter);}也可以定义指向结构体的指针,例如:planet_t*plnp;plnp为指向结构的指针,可以利用(*plnp).成员变量来访问结构体的数据成员。也可以利用间接成员选择运算符->来访问结构体的成员变量,例如:plnp->name返回值为结构体类型的函数C处理结构体的方法和处理简单数据类型的机制非常一致,而与处理数组的方式大大不同。指的是传递参数时直接传递结构体,不用加取地址符。结构体数组数组的组成元素为结构体。声明方式为:结构体名称数组名称[元素个数];注意:结构体数组作为出入参数或者返回值时,传递的还应该是指针。共同体共同体(union):一种数据结构,所有成员共用一块内存,允许把一块内存解释成多种方式。定义方式:typedefunion{变量类型变量名;变量类型变量名;}共同体名称;声明共同体以后,当前只有一个成员变量有效,分配内存空间的大小由共同体中最大的成员决定。第11章文本文件和二进制文件输入\输出文件C可以处理两种文件:文本文件和二进制文件。文本文件是在辅助存储器(例如磁盘)中保存的一个已命名的字符集合。为标记文本文件结束,计算机会在文件的最后一个字符之后放置一个特殊的文件结束符标记为<EOF>。键盘和屏幕作为文本流Stdin:指向键盘输入流的系统文件指针Stdout、stderr:指向屏幕输出流的系统文件指针。转义序列'W换行 ’\t'制表’\f'换页它回车W退格C中的用'\\'表示printf输出占位符 说明%O 将整数转换为八进制输出%X 将整数转换为十六进制输出%e/E 科学技术法表示的小数输出%% 一个%号符号每个占位符都可以与一个数值域宽结合,用于指定该数值显示时所占据的最小列数。如果数值为正,那么要显示的数值在该域中是右对齐;如果数值为负值,那么要显示的数值在该域中是左对齐。文件指针变量将一个非标准的文本文件用于输入和输出之前,必须声明一个文件指针变量,并给它一个值。系统必须在允许存取之前准备好输入或输出的文件。文件指针变量的声明和初始化如下:FILE*infilep;FILE*outfilep;Infilep=fopen(“b:data.txt”,”r”);Outfilep=fopen(“b:results.txt”,”w”);文件指针是FILE结构类型的地址,它包含了存取由fopen打开的文件的必要信息,而且必须存储在FILE*类型的变量中。空指针:值为NULL的指针。11.1.4获取文件指针参数的函数比较标准文件的I/O与用户定义的文件指针的I/O行存取stdin和stdout的函数可以存取任何文本文件的函数1Scanf(“%d",&num);Fscanf(infilep,"%d",&num);2Printf(“Number=%d\n”,num);Fprintf(outfilep,"Number=%d\n",num);3Ch=getchar();Ch=getc(infilep);4Putchar(ch);Putc(ch,outfilep);11.1.5关闭文件当程序不再使用一个文件时,应当通过调用带有文件指针的库函数fclose关闭该文件。二进制文件当使用文本文件存储数据时,程序必须花费相当多的精力将输入文件中的字符流转换为二进制整数、double型的尾数和指数,以及字符串,这是它们在内存中的表示形式。为了将数据存储在一个输出文本文件中,程序还必须在一次地花费时间将内部数据转换为字符流。Sizeof:确定存储某个数据类型所需字节数的运算符。注意:在一台计算机上产生的二进制文件在另一种型号的计算机上几乎是不可读的;使用fwrite产生的二进制文件必须使用fread读取,使用fprintf产生的文本文件必须使用fscanf这样的文本文件输入函数读取。关于文件操作的几点注意:处理文件之前先声明文件指针变量;fscanffprintfgetcputc只用于文本I/O,而函数fread和fwtite只用于二进制文件;使用文件名的唯一文件操作是调用fopen;第十二章大型程序设计使用抽象处理复杂问题过程抽象:主函数由一系列函数调用组成,每个函数分别实现的编程技术。强大的函数库的存在对于降低大型系统的复杂性非常有益。一旦一个函数的目标和参数表明确了,这个函数可以被所有程序员共享,而每个程序员不必关心程序实现的具体细节。数据抽象:通常我们只关心数据对象的类型和在这些数据对象上执行的操作,而不必过多关心数据对象是如何表示和存储在内存当中的。数据抽象是指将数据对象的逻辑视图(存储的内容)与物理视图(信息如何存储)分开。信息隐藏在设计顶层,设计者将重点放在如何使用数据对象和运算符上;在设计的底层,设计者解决实现细节。防止高层模块直接访问底层模块的实现细节的过程称为信息隐藏。可重用代码主要是封装的概念(encapsulate),将数据对象及其运算符作为一个单元进行包装。个人库:头文件使用C语言预处理指令#include使得个人库也称为可利用的库。产生个人库必须先产生头文件——包含关于一个库的所有信息的文本文件,头文件常见内容包括:总结库效用的注释块(就是注释说明);常量宏定义;类型定义(比如说结构体);4.说明每个库函数目的的块注释和如下的函数声明格式:externprototype。个人库:实现文件头文件和实现文件是个人库中两个基本的源文件。头文件描述库函数做什么,而实现文件给出函数如何完成。五种存储类auto存储类形参和函数的局部变量属于auto存储类,在函数调用时自动分配存储空间到栈上,在函数返回时释放存储空间。extern存储类这意味着他们对于连接器是可见的,编译器为了翻译函数调用,需要知道有关函数的重要信息:它的返回类型、它有多少个参数、以及参数的数据类型,语句externprototype的目的就是提供这类信息。该语句不产生extern存储类的函数,它仅仅通知编译器存在这样的函数,并告知编译器连接器去哪里找到它。全局变量全局变量的作用域从变量声明处一直到源文件结束(除非是在函数中将同样的名称声明为形参或局部变量),可由程序中的多个程序访问。static类型在程序执行之前只分配一次存储空间的变量的存储类,知道整个程序终止以前,该空间始终不会被释放。register类型它与auto很接近,并且只能用于局部变量和参数。声明为register是为了通知编译器存储单元将会被频繁使用。该存储类的一个较好的应用场合是作为大型数组下标的变量。函数退出Exit(O):使用数值0调用exit函数表示没有故障,函数执行成功。Exit(1):使用数值1调用exit函数表示是一些故障导致了退出。条件编译由于C语言禁止头文件的重复说明,因此要为头文件设计条件编译,格式为:#if!defined(NAME_H)#defineNAME_H头文件#endif12.7定义带参数的宏定义的形式为:#definemacro_name(parameterlist)macrobody;第十三章动态数据结构是在程序执行时扩展和收缩的结构。节点:动态分配内存的结构,连接在一起形成一个复合结构。13.1指针13.1.1作为函数参数的指针主要是研究了函数输出参数的指针的使用,通过将变量地址传递给函数,就给函数提供了将某个结果存储在该变量中的一种方法。此时,在函数体中操作的不应该是指针而是指针的间接数值即指针指向的变量。13.1.2表示数组和字符串的指针牢牢记住:数组和字符串(实际上也是数组)在作为参数使用时,只能通过传递数组和字符串指针(首地址)来实现,使用没有下标的数组名也可以作为指针使用。13.1.3指向结构体的指针结构体作为输入参数时,可以将整个结构体作为形参;结构体作为输出参数时,必须使用指针来传递。13.2动态内存分配这里介绍指针的另一种应用环境——作为一种访问内存块的方法,该内存块是为了相应一个明确的程序要求而分配的。可以调用C语言的内存分配函数malloc()为变量动态分配空间,返回指向分配块的指针,此时的指针类型为void*型,需要强制转换为所需的数据类型。堆(heap):malloc函数在其中动态分配存储块的内存区域;栈(stack):在其中分配和收回函数数据区的内存区域;使用calloc动态分配数组使用函数calloc可以为任何内部或用户定义类型分配单个内存块。为动态产生一个数组,使用函数calloc,函数有两个参数:所需的数组元素和每个元素的大小。函数返回的也是指针,同样也要对指针进行强制类型转换。举一个例子:Char*string1;Intstr_size;String1=(char*)calloc(str_size,sizeof(char));13.3链表链表(Linkedlist):一个节点序列,其中除了最后一个节点外的每个节点都包含下一个节点的地址。带指针成员的结构体为了建立一个动态链表,需要使用带有指针成员的节点。适合链表节点的类型定义为:Typedefstructnode_s{Charcurrent[3];Intvolts;Structnode_s*linkp;}node_t;Structnode_s和node_t是等效的,由于定义指针时编译器还没有看到node_t,所以要用stuctnode_s。链表节点带指针的结构体定义好以后,可以声明任意多个链表节点:node_s*n1_p,node_s*n_2,node_s*n3_p;再通过赋值语句nl_p->linkp=n2_p;n2_p->linkp=n3_p;来形成类表结构。然而在末端任然有一个未定义的linkp成员,链表在此处需要结束,在C语言中,空表由指针NULL表示,空表指没有结点的表,在C中由指针NULL表示,NULL的值为0。指向第一个结点的指针称为表头,通过表头可以访问链表中每个元素。13.3.3链表的优点可以很容易删除和插入一个结点,插入结点时需要修改插入点前点的指针指向,并将新点的指针指向它后面的结点。删除结点应该改变结点前一点指针的指向。13.4链表运算符遍历链表(traversingalist)从表头开始,顺序处理链表中的每个结点。可以利用递归调用或者是循环实现。用链表表示栈栈:一种数据结构,最后入栈的数据项最先处理。用链表表示队列队列:元素在一端插入,而在另一段移出的数据结构。队列是一种先进先出的数据结构。我们需要跟踪队列的首个结点和最后一个结点,他们分别是队列的前端和末端。这是因为队列中移出结点时需要访问前端,而加入一个结点需要访问末端。另外,我们需要能够找出队列大小,最好不遍历所有表结点。有序表每个元素的位置由其关键成员的值所决定的一个数据结构,关键值构成了一个升序或降序的序列。二叉树几个基本概念:叶子结点(leafnode):没有后继结点的二叉树结点;根结点(rootnode):二叉树中的第一个结点;左子树(leftsubtree):数中根结点的左指针所指向的那部分;右子树(rightsubtree):树中跟几点的右指针所指向的那部分;二叉查找树将数据用一种可以非常有效地实现检索的方法进行存储的树结构。在二叉查找树中存储的每一项都拥有唯一的关键码值。二叉查找树或为空,或其特性为:根结点中的数据项的关键码值大于其左子树中每项的

温馨提示

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

评论

0/150

提交评论