第4章.ppt

大学VISUAL C++程序设计-王永国-课件PPT

收藏

资源目录
跳过导航链接。
压缩包内文档预览:(预览前20页/共73页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:21836328    类型:共享资源    大小:4.17MB    格式:ZIP    上传时间:2019-09-06 上传人:QQ24****1780 IP属地:浙江
25
积分
关 键 词:
大学VISUAL C++程序设计-王永国-课件PPT 大学 visual C++ 程序设计 王永国 课件 ppt
资源描述:
大学VISUAL C++程序设计-王永国-课件PPT,大学VISUAL,C++程序设计-王永国-课件PPT,大学,visual,C++,程序设计,王永国,课件,ppt
内容简介:
第4章 数组、指针与字符串,4.1 数组的基本概念 4.2 一维数组 4.3 二维数组 4.4 字符数组 4.5 指针和数组 4.6 结构体与链表 4.7 常用算法,4.1 数组的基本概念,【问题】从键盘接收10个数,求平均数并输出小于平均数的数,分析:从键盘接收10个数,求平均数很简单,可以采用简单变量和循环结构相结合的方法,程序段如下: float aver=0; for (i=0;iai; aver+=ai; aver=aver/10; / 求10个数的平均数 但是输出小于平均数的数就比较麻烦了,因为从键盘接收的10个数在求和以后没有保存起来,等再比较比平均数小的数就无法实现。若要输出小于平均数的数,必须再重复输入这10个数。这样带来两个问题: (1)输入数据的工作量成倍增加; (2)若本次输入的数与上次不同,则输出的结果不正确。,在程序设计中,我们常把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类型数据元素的集合称为数组。数组属于构造类型,在计算机中,一个数组在内存中占用一片连续的存储空间,在程序中用数组名来标识这一数组,而下标指明数组中各元素的序号,用下标变量来标识数组的每个元素。根据下标的个数不同可以把数组分为一维、二维和多维的,本章重点介绍一维和二维数组。 数组在使用前必须先定义(数组名、类型、大小、维数),后使用。,正确: const int s=10; int as; float f5;,错误: int s=10; int as; float b3.4,下标从0开始 数组名是常量,表示数组在内存中的首地址。 数组长度应该为整型常量表达式,不能是变量。 如:,4.2.1 一维数组的定义、存储和初始化 1. 定义形式 数据类型 数组名整型常量表达式; 如: int s5;,4.2 一维数组,2. 数组的初始化,花括号,错误: int a10; a=1,3,5,7,9; /数组名是个地址常量,不能被赋值。 int a10; a10=1,3,5,7,9; /a10不是数组中的元素,不能用花括号为一个元素赋多个值。 int c3=1,2, 3,4; /常量个数超过数组定义的长度。,2) 给部分元素赋初值。 如:int a10=1,3,5,7,9; 花括号内列出的值赋给了前面的若干个元素,其余元素系统自动赋0 。,1) 给所有元素赋初值。 如:int a5=0,2,4,6,8; 或 int a =0,2,4,6,8;,4.2.2 数组元素的引用和基本操作,1数组元素的引用 形式:数组名下标 相当于一个普通变量 如有: int a10=1,2,3,4,5,6,7,8,9,10,b10,i(2); 则: a3=a0+ai; couta2+i; coutaa3; couta10; /数组下标越界 couta; /对数组一般不能作为一个整体进行操作 b=a;,2基本操作,假设有定义:int aN; N是已定义过的符号常量。 (1) 数组元素的输入 for(j=0; jaj;,(2)通过随机函数rand()产生0100的N个数据 for ( i = 0; iN;i+) /rand()函数产生032727之间的整数 ai=int(rand()%101);,(3) 数组元素的求和 sum=0; for(j=0; jmax)max=aj;,(5) 求最大元素下标 imax=0; /imax代表最大元素下标 for (j=1;jaimax)imax=j;,(6) 将最大元素放于某一特定位置(如放在最前头) imax=0; for(j=1;jaimax)imax=j; if(imax!=0) t=a0;a0=aimax;aimax=t;,4.2.3 数组排序,排序是将一组数按递增或递减的次序排列,如按学生的成绩、球赛积分等排序。常用的算法有:,选择法 () 冒泡法 () 插入法 快速排序法 .,1. 选择法排序 基本思想: (1) 从n个数的序列中选出最小的数(递增), 与第1个数交换位置; (2) 除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;3) 重复(1)n-1遍,最后构成递增序列。,【例4.2】对存放在数组中的6个数,用选择法按递增排序。,下标 : 0 15 1 25 2 35 3 45 4 5,for( i= 0;i5;i+) min= i; for(j=i+1;j6;j+) if(ajamin)min= j; if(i!=min) temp=ai; ai= amin; amin=temp; ,2. 冒泡法排序,for(i=0;iaj ) temp=aj-1; aj-1=aj; aj=temp; ,思考:当数据未交换,说明数组已有序 ,如何结束排序?,(1)从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较比较完毕,最大的数存放在aN-1中; (2)然后对a0到aN-2的N-1个数进行同(1)的操作,次最大数放入aN-2元素内,完成第二趟排序;依次类推,进行N-1趟排序后,所有数均有序。 【例4.3】用冒泡排序法实现例4.2,基本思想总结:,4.3 二维数组,以“先行后列”的规则连续存放:,序号=当前行号*每行列数+当前列号,4.3.1 二维数组的定义和初始化 1. 数组的定义 形式:数据类型 数组名常量表达式1常量表达式2; 如:float a23;,(1)按在内存排列顺序对所有元素赋初值。 int a23=1,2,3,4,5,6; 或 int a3=1,2,3,4,5,6; (2)按行给所有元素赋初值,每一行的数据放于一个花括号内。 int a23=1,2,3,4,5,6; (3)按行给部分元素赋初值,在静态存贮类型static中省略的元素初值此时自动为0。 static int b34=1,2,0,3,4,0,0,5; 对应的数组b为:,2. 数组的初始化,(4)按行赋初值也可省略第一维的长度。 static int c 3=1, ,2; 对应的数组c为:,4.3.2 二维数组的基本操作,1. 数组的输入、输出 【例4.4】输入两个矩阵A、B的值,求C=A+B 。,分析:A、B矩阵相加,其实质是将两矩阵的对应元素相加。相加的条件是有相同的行、列数。,#include “iostream.h“ #include “iomanip.h“ void main() int a23,b23,c23,i,j; for ( i = 0; iaij; for ( i = 0; ibij; for ( i = 0; i2; i+) /A+B矩阵,每个对应元素相加 for( j =0; j3; j+) cij=aij+bij; for ( i = 0; i2; i+) for( j=0; j3; j+) coutsetw(4)cij; coutendl; ,程序:,2. 求二维数组中最大(或最小)元素及下标,max=a00; imax=0; jmax=0; for ( i = 0; imax) max=aij; imax=i; jmax=j;,【例4.5】对33方阵,求最大元素及下标。 与一维数组求最大值的方式相同,但要用双重循环来实现。,3. 矩阵转置,for ( i = 0; i3; i+) for( j=0; ji; j+) t=aij; aij=aji; aji=t; ,将矩阵以主对角线为轴线,将元素的行和列位置调换。 【例4.6】对33方阵转置,4. 矩阵相乘,设矩阵A、B为:,则矩阵C为:,即矩阵C的第i行第j列元素可通过下边公式求得:,c00元素的实现: s=0; for(k=0;k3;k+)s+=a0k*bk0; c00=s;,程序: #include “iostream.h“ #define M 2 #define N 3 #define P 4 void main() int aMN=3,5,7,4,6,8,bNP=1,4,7,10,2,5,8,11,3,6,9,12; int cMP,i, j, k, s; for(i=0; iM; i+) for(j=0; jP; j+) s=0; / 求一个元素的值 for(k=0; kN; k+) s+=aik*bkj; cij = s; for(i=0;iM;i+) for(j=0;jP;j+) coutcij“ “; coutendl; ,4.4 字符数组,字符串是由一对双引号作定界符的若干个有效字符组成的字符序列。存储时自动在最后加入结束标志符0 。例如对字符串常量: “ab123“,系统自动添加 0 结束标志符,处理字符串的方法有: 字符数组、CString(string)类和字符指针。,1. 字符数组,如: char s6; char s126;,字符数组,若干个字符,字符串,2.字符数组的初始化,(1) 逐个字符赋初值 char s10=I, , a, m, ,f, i, n, e; /s不是字符串 (2) 用字符串为字符数组初始化 char s10 = “I am fine“; char s10 = “I am fine“; s是字符串, 0 系统自动添加,(3) 字符串数组初始化 对二维数组以字符串形式初始化。 char a48=“FOXPRO“, “FORTRAN“, “BASIC“, “C/C+“;,注意:对于二维字符数组,用两个下标表示数组中的一个字符。,注意不要出现下面的错误:,char s10=“This is a book“; char s10; s = “I am fine“; char s10; s = I, , a, m, , f, i, n, e;,3. 字符数组的输入/输出 (1)逐个数组元素的输入/输出,char s110; for (i = 0; is1i; /s1中是字符,不是字符串,注意:输入时各输入项之间不需加空格分隔,(2)字符串整体的输入/输出,char s110,s225; 输入: cins1; gets(s1); for( int i=0; i2;i+) gets(s2i); s1、s2中是字符串, 0自动添加,注意: 使用cins1;语句,字符串中不能有空格。 函数gets()和puts()是对字符串整体输入/输出 ,应加#include “stdio.h“命令。 gets(字符数组名或字符指针变量名); puts(字符数组名或字符指针变量名);,输出: cout s1; puts(s1); for( i=0; i2;i+) puts(s2i);,#include “stdio.h“ #include “iostream.h“ void main( ) int i; char c5 = C, h, i, n, a; char b = “China“; for ( i = 0; i5; i+) /不能用puts(c),也不能用coutc; cout ci; puts(b); /或 coutb; for (i=0; bi!=0; i+) /正确的,但不主张用这种方法 cout bi; ,【例4.8】字符串的输入/输出,有关字符与字符串操作的区别详见P88表1.4.2。,4. 字符串处理函数,设:char str210=“aaa“,str110;,strcpy(str1,str2); str1= “bb“; str1=str2;,使用下面函数时,应加#include “string.h“命令。 1) strlen(str) 功能:求str所指向的字符串长度。不包括字符串结束标志0。 说明:str可为字符串常量、字符数组名或字符指针。 2) strlwr(str) 功能:将字符串中的大写字母转换成小写字母。 说明:str为字符字符串常量、数组名或字符指针。 3) strupr(str) 功能:将字符串中的小写字母转换成大写字母。 说明:str为字符字符串常量、数组名或字符指针。 4) strcpy(str1,str2) 功能:将str2所指的字符串复制到str1中。 说明:str1和str2为字符数组名或字符指针,str2还可以是字符串常量。str1要有足够大的空 间。,5) strcat(str1,str2) 功能:将str2字符串内容连接到str1字符串内容的后面 说明:str1要有足够大的空间。 例如: char s120 = “abcd“; coutstrcat(s1, “kkk“)endl; /s1中的内容变为abcdkkk 6) strcmp(str1,str2) 功能:比较字符串str1和str2的大小。 说明:从左至右逐个字符进行比较ASCII码值,直到出现不相同字符或遇到0为止。 str1 小于 str2 返回 -1 str1 等于 str2 返回 0 str1 大于 str2 返回 1,strcmp(“ABCD“,“BD“); / 结果为:-1,#include “stdio.h“ #include “string.h“ void main( ) char s80; while(1) gets(s); if(strcmp(s,“pass“) puts(“Invalid password.n“); else break; puts(“passn“); ,【例4.9】字符串处理函数示例,4.5 指针和数组, &x就是变量的地址,4.5.1 指针 1. 基本概念 每个变量在内存中存放都要占用一定的空间,变量占用的内存空间的第一个字节的编号就是变量的地址,将存放地址的变量称为指针变量。,取内容* *(地址) 表示根据地址取内容 如上图所示, *( p就是一个指针,存放x的地址。,1001,4,p,x,p指向x, *p就是x,值为4。 出现x的地方可以用*p代替,出现 *p的地方可以用x代替。,2.定义及初始化 定义:,例如: int *p; float *q; 初始化: 在定义的同时赋初值,称为指针变量的初始化。 例如:float d =1.5, *p= /注意不能写做*p=&d,数据类型 *标识符;,&d,1.5,p,d,假定有定义:int *p, a; p=NULL; 指针的值为NULL(0) 表示不指向任何对象。 p=,3.运算 赋值运算,算术运算 p+n (或p-n): p+n:指向后面的第个元素。 p-n:指向前面的第个元素。 p+n的值为:p的值n*sizeof(p指向的类型),如,有定义: int a,*p= 假设a的地址为1000,则: p的值为:1000 p+3的值为:1000+3*sizeof(int)=1000+3*4=1012,*p+ *(p+) *p p+ (*p)+ *p (*p)+,自增(+)和自减(-) p+、 +p、 p-、 -p 自增或自减后p指向前一个或后一个元素,指针相减 两个类型相同的指针可以相减,结果为这两个地址差之间能够存放的数据个数(数据类型为指针所指的类型)。 如,有定义:int *p1, *p2; 假设p1指向1000,p2指向1008,则p2-p1的值为: (1008-1000)/sizeof(int)=2,1. new运算符 用于向系统申请动态存储空间,并把首地址作为运算结果。形式为:,指针=new 数据类型; 指针=new 数据类型(初值);,或,2. delete运算符 用于释放用new申请的动态存储空间,形式为:,delete 指针; delete 指针;,或,无需指明数组长度,只能释放由new 申请的动态变量,4.5.2 动态存储空间,例:,int a=3,*p=,【例2-3 】指针运算示例 #include void main() int *p=new int; *p=3; cout*pendl; coutpendl; delete p; cout*pendl; ,数组的地址是制是指数组存放的起始地址,以数组名表示。 设有定义: int a6=10,20,30,40,50,60,*p=a; 下面介绍引用数组元素的三种方式。 1.下标方式 形式: 数组名下标 2. 地址方式 形式: *(地址) 3. 指针方式 形式: *指针变量名,假设有定义: float a10, *p = a; 则如下的等价关系成立: (1) p a &a0 (2) p+i a+i &ai (3) *(p+i) *(a+i) ai 指针可以作数组名用 即:pi ai,4.5.3 指针和一维数组,设有:int a10,*p; 则: p = a; for(i = 0; iai;,等价于: p = a; for (i=0; i*p+;,p = a; for (i = 0; i*p;,p = a; for (i = 0; i*(p+i); /*(p+i)pi,思考:第三种方法与其它二种区别何在?,p,使用指针来引用数组元素速度快,但直观性、安全性要差些!,分析下列程序:,#include void main( ) int a10, i, *p; p = a; for (i = 0; i*p+; for (i = 0; i10; i+,p+) cout*p; ,思考:数组元素能否正确输出?,注意: p与a的区别: p是地址变量,而a是地址常量。 p+ 、p- 、p=p+2 a+、a=a+2 *p+ 与 (*p)+区别 *p+的+运算符作用于指针变量 (*p)+的+运算符作用于指针变量所指对象 设有定义:int a6=10,20,30,40,50,60,*p=a+2;,cout*p+; /输出30 cout*p; /输出40,cout(*p)+; /输出30 cout*p; /输出31,+级别高于*,数组名a可以解释为指向int类型的二级指针常量;a可以看成是由两个元素a0、a1构成的一维数组, a0可以看成是由a00、a01、a02 3个整型变量组成的一维数组,可将a0解释为指向int类型的一级指针常量; a1具有a0相同的性质。,设有定义: int a23;,4.5.4 指针和二维数组,指针方式引用二维数组元素的两种方式: 1. 指针变量引用数组元素,设有定义: int a23,*p=a0; /&a00 通过p指针显示二维数组的各元素:,for(i=0;i6;p+,i+) cout*p“ “; if(i%3=0)coutendl; ,注意:二级指针地址不能赋值给一级指针变量,如:int a23,*p=a; C语言不太严格可以,2. 指针数组引用数组元素,指针数组的形式: 数据类型 *标识符整型常量表达式;,即:数组中每个元素是指针。,设有定义:int a23,*p2 =a0,a1;,要引用aij元素,可用指针数组表示如下: *(pi+j) 或 *(*(p+i)+j),注意:指针数组名p与二维数组名a都是二级指针的概念,区别在于:ai是地址常量,pi是地址变量。,4.5.5 指针和字符串,可通过字符指针来访问字符数组,二者的区别:,【例4.15】输入一串字符存储在字符数组中,用指针方式逐一显示字符,并求其长度。,#include “iostream.h“ #include “stdio.h“ void main() char s80,*p; gets(s); p=s; /p指向数组的第一个元素 cout“输出每个字符:“; while(*p!=0) cout*p+“ “; /指针下移,直到p指向字符串结束符 cout“n 字符串长度 : “p-sendl; ,字符指针数组常用于处理若干字符串。 设有定义: char *book=“Fortran90“,“C/C+“,“Delphi“,“Visual Basic“;,按字符串的实际长度存储,以0表示每个字符串的结束。 采用交换指针值的方法改变指针的指向。,字符指针数组排序前,字符指针数组排序后,【例4.16】对4个字符串,按字典顺序将它们排序输出。,#include “iostream.h“ #include “string.h“ void main() char * book=“Fortran90“,“C/C+“,“Delphi“,“Visual Basic“,*p; int i,j,k; for(i=0;i0) k=j; if(i!=k) p=booki;booki=bookk; bookk=p; for(i=0;i4;i+) coutbookiendl; ,注意元素的比较,程序:,说明结 构类型 的关键字,结构体和数组一样,是一种构造的数据类型。但数组要求各元素数据类型都相同,而结构体变量的各分量的数据类型可以不同。C+中的类就是从C语言中的结构体概念演变而来 。,1. 结构类型说明形式,struct 结构类型标识符 结构成员1; 结构成员2; 结构成员n; ;,类型可任意,4.6 结构体与链表,4.6.1 结构体,struct date int month; int day; int year; ;,struct man char name15; char sex; int age; date birthday; ;,如:说明一个结构类型date,含三个整型数据成员:,在此基础上,又可说明另一个结构类型man,struct man结构类型,2. 结构变量定义,先说明结构类型再定义结构变量,struct man man1, man2;,无类型名变量,struct man char name15; char sex; int age; struct date birthday; man1, man2;,struct char name15; char sex; int age; struct date birthday; man1, man2;,在说明结构数据类型的同时定义结构变量,省略结构标识符直接定义结构类型变量,3. 结构体变量的引用,形式:,结构变量名.成员名 或 (*指向结构的指针).成员名 或 指向结构的指针-成员名,通过指向结构的指针引用结构变量成员,成员访问运算符 优先级最高的 四个运算符之一,括号不能少,假设有定义: man m,*p= 则可如下引用结构成员,strcpy (, “Fang Min“); p-birthday.month = 8;,#include #include struct person char name10; /姓名 bool sex; /性别 int age; /年龄 float pay; /工资 a10; void main() int n, i,k; person x; coutn; cout“从键盘输入具有person结构的“n“个记录:“endl;,【例】用结构体数组保存数据,for(i=0; cink; if (k=1) x.sex=true; else x.sex=false; /1为男,非1为女 cinx.agex.pay ; ai=x; /结构赋值 cout“显示具有person结构的“n“个记录:“endl; for(i=0;in;i+) ; if (ai.sex=true) cout“man“ ; else cout“woman“ ; coutai.age ai.payendl; ,4.6.2 链表,1. 线性链表概念 在结构体成员中有一种特殊类型,它除了包含一般的数据域外,还包含一个指向自身结构的指针域。这种类型的对象又称为结点,每个结点的指针域用来指向下一个结点,由此形成一个链表。,例如: struct item int data; /结点值域 struct item *next; /结点指针域 ;,2. 线性链表,用链指针链在一起的自引用结构的线性集合。 例:,在一个链表中,指向第一个结点的指针称为表头指针,第一个结点又称为表头结点,每个结点的指针域所指向的结点称为该结点的后继结点,而该结点又称为后继结点的前驱结点,链表中的第一个结点无前驱结点,最后一个结点(又称为表尾结点)无后继结点。,head,head,head,单向链表(以正向链表为例),双向链表,循环链表(以单向循环链表为例),建立一个简单的链表,静态链表,head,2000H,2400H,NULL,tail,#include “iostream.h“ #include “iomanip.h“ struct stud long num; double score; struct stud *next; void main() struct stud a,b,c,*head,*p; a.num=9901;a.score=90.8; b.num=9902;b.score=89.5; c.num=9903;c.score=76.0; head= ,2000H,2400H,2600H,2600H,该方法虽能实现简单链表结构,但事先必须定义确定个数的结构体变量,缺乏灵活性,要想增加一个结点,必须修改程序,不能动态地进行存储分配。,对链表的主要操作有以下几种:,建立或生成一个链表 查找链表元素 插入一个链表新表元素 插表头将每一新元素固定插入至当前已生成 链表的表头位置 插表尾将每一新元素固定插入至当前已生成 链表的表尾位置 有序表将每一新元素插入至链表中适当位置 (表头、表中或表尾),以保持链表的有序性 删除一个链表元素 遍历链表,输出(显示、打印)各表元素有关信息。,3. 线性链表生成与遍历,【例】键入简化的学生数据,把它们组成线性链表,并输出各学生信息。要求每一新表元素都插入至已生成链 表的表头位置。编写程序实现之。 分析: 第一阶段:生成 依次键入学号(假设互不相同),创建新的表元素,并插入至表头位置。遇结束标志(-1)即止,此时已生成所需链表。 第二阶段:遍历 从表头开始,“顺藤摸瓜”遍历所有表元素并输出各表元素中的有关信息学号,直至表尾。 程序要点:设置两个指针变量:head和temp。,#include #include struct item int xh; item *next; ; void main( ) item *head=NULL,*temp; /初始表头为NULL int stno; coutstno;,while(stno!=-1) temp=new item; temp-xh=stno; temp-next=head; /初始表尾为NULL /以后实现表元素的连接 head=temp; /更新表头 cinstno; coutxh; temp=temp-next; coutendl; ,(设输入2 5 4 1 -1),head=NULL;,temp= new item; temp-xh=stno;,temp-next=head; /表尾初始化为NULL,head=temp; / 更新表头,temp= new item; temp-xh=stno;,temp-next=head; / 实现表元素的连接,head=temp; / 更新表头,请输入学号,-1 停止:2 5 4 1 -1 输出为: 1 4 5 2,运行示例:,执行完第一阶段后所生成的线性链表及指针变量位置:,思考:如要求每一新表元素都插入至已生成链表的表尾位置
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:大学VISUAL C++程序设计-王永国-课件PPT
链接地址:https://www.renrendoc.com/p-21836328.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!