欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第11章结构体与共用体.ppt

    • 资源ID:5893461       资源大小:319.04KB        全文页数:57页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第11章结构体与共用体.ppt

    第11章 结构体与共用体,概述定义结构体类型变量的方法结构体类型变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表共用体枚举类型用typedef定义类型,1.概述,除数组外,前面介绍的数据类型都是简单类型:整型、实型、字符型数组是构造类型,但其所有的元素具有相同的数据类型。本章将介绍另外一种构造类型:结构体,它的特点是内含的数据元素成员可以具有不同的数据类型。,例如:struct student unsigned int No;char name32;unsigned short age;float score;char address64;,“记录”结构体包含不同数据类型的“数据项”数据元素,每个记录作为整体进行考虑。,1.概述,声明结构体类型的形式:struct 结构体名称 成员列表;声明后的结构体类型就可以同其它的数据类型一样用来定义变量等。结构体中的成员可以是一个简单的基本类型,也可以是复杂的构造类型。类型与变量是不同的概念,这里只是定义了类型,尚未定义变量,因此未分配内存空间。,struct University char name32;struct School school50;,例如:struct School char name32;int num_staff;int type;,2.定义结构体类型变量的方法,先声明结构体类型再定义变量名在声明类型的同时定义变量直接定义结构体类型变量,不出现结构体名,struct student unsigned int No;char name32;unsigned short age;float score;char address64;struct student stu1,stu2;struct student*stu3;,struct student unsigned int No;char name32;unsigned short age;float score;char address64;stu1,stu2,*stu3;,struct unsigned int No;char name32;unsigned short age;float score;char address64;stu1,stu2,*stu3;,2.定义结构体类型变量的方法,说明:类型与变量是不同概念;结构体成员可以单独使用;成员也可以是结构体变量;成员名称可以与程序中的其它变量名称相同,是两个不同的对象。,sizeof(int)4sizeof(struct student)?结构体中所有成员占用字节的和。,sizeof(struct student)106,2.定义结构体类型变量的方法,说明:类型与变量是不同概念;结构体成员可以单独使用;成员也可以是结构体变量;成员名称可以与程序中的其它变量名称相同,是两个不同的对象。,struct student unsigned int No;char name32;unsigned short age;float score;struct data birthday;stu1,stu2;,struct data int month;int day;int year;,3.结构体变量的引用,结构体变量中成员的引用:结构体变量名.成员名结构体指针变量中成员的引用:结构体指针变量名-成员名不能将结构体变量作为一个整体进行输入/输出。只能对结构体变量中的各个成员分别进行输入和输出;如果成员本身又是结构体类型,则要用若干个成员运算符,一级一级找到最低一级的成员。只能对最低级的成员进行运算;stu1.No stu1.birthday.month结构体变量中的成员可以同其它变量一样进行运算;strcpy(stu1.name,“LiNa”);stu1.age+;可以引用结构体变量中成员的地址,结构体变量的地址;scanf(“%d”,/输出stu1的首地址,用做函数参数,3.结构体变量的引用,struct stu int num;char*name;char sex;float score;,main()struct stu boy1,boy2;boy1.num=102;boy1.name=Zhang ping;printf(input sex and scoren);scanf(%c%f,4.结构体变量的初始化,struct stu/*定义结构*/int num;char*name;char sex;float score;main()struct stu boy2,boy1=102,Zhang ping,M,78.5;boy2=boy1;printf(Number=%dnName=%sn,boy2.num,boy2.name);printf(Sex=%cnScore=%fn,boy2.sex,boy2.score);,5.结构体数组,定义:struct stu int num;char*name;char sex;float score;boy3;struct stu girl10;,定义:struct int num;char*name;char sex;float score;boy3;,5.结构体数组,结构体数组的存储形态:,各个数组元素连续存放,5.结构体数组,初始化:struct stu int num;char*name;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;,可不写,struct stu int num;char*name;char sex;float score;struct stu boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;,=初值列表,5.结构体数组,【例】计算学生的总平均成绩 和统计大于90分的人数。struct stu int num;char*name;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,86;,main()int i,c=0;float ave,s=0;for(i=0;i90)c+=1;printf(s=%fn,s);ave=s/5;printf(average=%fn“,ave);printf(“count=%dn,c);,5.结构体数组,【例】建立同学通讯录#include#define NUM 3struct mem char name20;char phone10;,main()struct mem manNUM;int i;for(i=0;iNUM;i+)printf(input name:n);gets(mani.name);printf(input phone:n);gets(mani.phone);printf(nametttphonenn);for(i=0;iNUM;i+)printf(%sttt%sn,mani.name,mani.phone);,5.结构体数组,main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;printf(n);for(i=0;i3;i+)printf(%s:%dn,leaderi.name,leaderi.count);,【例】对候选人得票的统计程序#include#include#include struct person char name20;int count;leader3=Li,0,Zhang,0,Fun,0;,6.指向结构体类型数据的指针,指向结构体变量的指针;指向结构体数组的指针;结构体变量和结构体指针变量作函数参数。,【例】struct stu int num;char*name;char sex;float score;boy,*pboy;struct stu*pstu;pboy=,结构体指针变量说明的一般形式为:struct 结构体名*结构体指针变量名结构体指针必须先赋值才能使用 pboy=有了结构体指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为:(*结构指针变量).成员名 或为:结构指针变量-成员名,6.指向结构体类型数据的指针,指向结构体变量的指针;指向结构体数组的指针;结构体变量和结构体指针变量作函数参数。,struct stu int num;char*name,sex;float score;boy1=102,李平,M,78.5,*pstu;main()pstu=,注意:pstu-numpstu-num+(pstu-num)+pstu-num+(pstu-num),6.指向结构体类型数据的指针,指向结构体数组的指针;结构体变量和结构体指针变量作函数参数。,struct stu int num;char*name,sex;float score;boy5=101,Zhou ping,M,45,102,Zhang ping,M,62.5,103,Liou fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;,main()struct stu*ps;printf(NotNametttSextScoretn);for(ps=boy;psnum,ps-name,ps-sex,ps-score);,ps=boy;=boy0ps+1=boy1ps+4=boy4(+ps)-num?(ps+)-num?二者区别,101,“Li ping”,M,45,102,“Zhang ping”,M,62.5,103,“Liou fang”,boy0,boy1,boy2,p,p+1,pstu是指向结构的指针,若要指向 某个成员,必须强制类型转换pstu=(struct stu*)boy1.name;printf(Name=%sn,pstu);Name=Zhang ping,6.指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,用结构体变量的成员作参数与普通变量相同,值传递;用结构体变量作参数效率低,一般不用,值传递,将结构体变量所占内存单元的内容全部顺序传递给行参,行参也占内存单元,若行参值发生变化,实参不变。c.用结构体变量(或数组)的指针作参数效率高。,【例】计算一组学生的平均成绩和大于90分人数。用结构指针变量作函数参数编程。struct stu int num;char*name,sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;,6.指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,void ave(struct stu*ps);main()struct stu*ps=boy;ave(ps);,void ave(struct stu*ps)int c=0,i;float ave,s=0;for(i=0;iscore;if(ps-score 90)c+=1;printf(s=%fn,s);ave=s/5;printf(average=%fncount=%dn,ave,c);,6.指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,#include#include#include#define FORMAT%dn%sn%fn%fn%fnstruct student int num;char name20;float score3;,main()void print(struct student);struct student stu;stu.num=12345;strcpy(stu.name,LiLi);stu.score0=75;stu.score1=89;stu.score2=93;print(stu);void print(struct student stu)printf(FORMAT,stu.num,stu.name,stu.score0,stu.score1,stu.score2);printf(n);,6.指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,#include#define FORMAT%dn%sn%fn%fn%fnstruct student int num;char name20;float score3;stu=12345,Li Li,75,89,93;main()void print(struct student*);print(,7.用指针处理链表,链表概述;简单链表;建立动态链表;输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,数组的缺陷:需要事先按照问题规模的最大可能确定数组大小。容易造成空间浪费当问题规模远远小于给定值时,扩展性差问题规模超过最大可能改变值后,需要重新修改;插入、删除数据元素需要大量的数据元素移动;解决办法:采用动态链表方法,需要多少个元素申请多少个。通过指针建立元素之间的联系。,7.用指针处理链表,链表概述;简单链表;建立动态链表;输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,链表的特点:一个头指针变量,指向头结点;每个结点包含两部分内容:元素值和指向后继结点的指针;最后结点无后继,其指针为空;结点在内存中可以不连续存放;结点的查找需要从头指针开始,顺链一个一个查找;查找失败的条件是到达最后结点,且该结点不满足查找条件;插入、删除只需要修改指针,不需要元素移动;容易扩展。,7.用指针处理链表,链表概述;简单链表;建立动态链表;输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,链表的实现:采用结构体类型数据实现。结点结构:struct Node char name32;float score;struct Node*next;链表运算:创建、遍历、查询、插入、删除、销毁等。,7.用指针处理链表,简单链表;建立动态链表;输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,简单链表:静态链表,通过结构体变量或数组实现。,struct Node char*name;float score;struct Node*next;main()struct Node a,b,c,*head,*p;a.name=“LiPing”;a.score=100.0;b.name=“LiuHai”,b.score=80.0;c.name=“FengYun”,c.score=75.0;,head=,7.用指针处理链表,建立动态链表;输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,动态链表:通过结构体指针变量实现,结点是动态申请的。,#define Len sizeof(struct student)struct student char name32;float score;struct student*next;/*创建动态链表*/struct student*create()struct student*head,*p1,*p2;,7.用指针处理链表,建立动态链表;输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,/*申请头结点*/p1=(struct student*)malloc(Len);scanf(“%s”,p1-name);scanf(“%f”,/返回空指针,else head=p1;p2=p1;do/*申请新结点*/p1=(struct student*)malloc(Len);scanf(“%s”,p1-name);scanf(“%f”,/返回头指针,7.用指针处理链表,输出、查询链表;对链表的删除操作;对链表的插入操作;对链表的综合操作。,遍历链表:从头结点开始,顺链一个一个结点访问,直到尾结点结束。,void print(struct student*head)struct student*p;p=head;while(p)printf(“%s:%fn”,p-name,p-score);p=p-next;,struct student*find(struct student*head,char*name)struct student*p;p=head;while(p,7.用指针处理链表,对链表的删除操作;对链表的插入操作;对链表的综合操作。,从链表中删除一个结点:首先找到该结点,然后删除该结点,删除后保证链路不断。根据要删结点的位置,三种情况:,head,head,head,删除头结点,删除中间结点,删除尾结点,7.用指针处理链表,对链表的删除操作;对链表的插入操作;对链表的综合操作。,struct student*delete(struct student*head,char*name)struct student*p,*ppre;p=head;while(p,/*头结点*/else if(p=head)head=p-next;free(p);return head;/*中间结点*/else ppre-next=p-next;free(p);return head;,7.用指针处理链表,对链表的插入操作;对链表的综合操作。,在链表中插入一个结点:首先找到插入位置,然后修改前一个结点和新结点的指针完成插入。,#include#include#includestruct student char name32;float score;struct student*next;#define Len sizeof(struct student)/*创建动态链表*/struct student*create()struct student*head,*p1,*p2;/*申请头结点*/p1=(struct student*)malloc(Len);scanf(%s,p1-name);scanf(%f,/返回头指针,struct student*delet(struct student*head,char*name)struct student*p,*ppre;p=head;while(p,建立 删除 打印,7.用指针处理链表,对链表的插入操作;对链表的综合操作。,struct student*insert(struct student*head,char*name,float score)struct student*p,*ppre,*pnew;/*生成新结点*/pnew=(struct student)malloc(Len);strcpy(pnew-name,name);pnew-score=score;pnew-next=NULL;p=head;while(p,/*插入到尾结点后*/if(!p)ppre-next=pnew;return head;/*插入到头结点前*/else if(p=head)head=pnew;pnew-next=p;return head;/*插入到中间位置(P前)*/else ppre-next=pnew;pnew-next=p;return head;,7.用指针处理链表,对链表的插入操作;对链表的综合操作。,插入到结点后struct student*insert(struct student*head,char*name,float score)struct student*p,*pre,*pnex,*pnew;/*生成新结点*/pnew=(struct student)malloc(Len);strcpy(pnew-name,name);pnew-score=score;pnew-next=NULL;p=head;while(p,/*插入到尾结点后*/if(!p)ppre-next=pnew;return head;/*插入到头结点前*/*else if(p=head)head=pnew;pnew-next=p;return head;*/*插入到中间位置(P后)*/else pnex=p-next;p-next=pnew;pnew-next=pnex;return head;,7.用指针处理链表,对链表的综合操作。,链表的建立;链表的打印;给定信息,进行查询;插入新结点;删除一个结点;销毁链表;,销毁链表:将所有结点释放掉。,void destroy(struct student*head)struct student*p;while(head)p=head;head=head-next;free(p);,main()struct student*head,*p;head=create();print(head);p=find(head,“LiPing”);printf(“name:%s-score:%fn”,p-name,p-score);head=insert(head,“MaLi”,100.0);head=delete(head,“LiPing”);print(head);destroy(head);,两个表的链接struct student*link1(struct student*head1,struct student*head2)struct student*p;/是否存在空表 if(!head1)return head2;if(!head2)return head1;/把表2连接到表1后面 p=head1;while(p-next)p=p-next;p-next=head2;return head1;,head1,head2,struct student*inverse(struct student*head)struct student*p,*ppre;p=head-next;head-next=NULL;while(p)ppre=p;p=p-next;ppre-next=head;head=ppre;return head;,将链表按逆序生成新链表,head,#includestruct student long num;/学号 struct student*next;struct student*link(struct student*head1,struct student*head2)struct student*p,*p1,*p2,*head;/p1用来指向链1中待处理的结点,/p2用来指向链2中待处理的结点,p用来指向已形成的新链最后一个结点。/是否存在空表 if(!head1)return head2;if(!head2)return head1;/表1和表2合并为一个新的有序表 p1=head1;p2=head2;if(head1-num num)head=head1;p=head1;p1=p1-next;else head=head2;p=head2;p2=p2-next;while(p1,main()struct student st14,st24,*head;st10.num=3;st10.next=,思考题:两个有序表合并为一个新的有序表,struct student*link(struct student*head1,struct student*head2)struct student*p,*p1,*p2,*head;/p1用来指向链1中待处理的结点,/p2用来指向链2中待处理的结点,p用来指向已形成的新链最后一个结点。/是否存在空表 if(!head1)return head2;if(!head2)return head1;/表1和表2合并为一个新的有序表 p1=head1;p2=head2;if(head1-num num)head=head1;p=head1;p1=p1-next;else head=head2;p=head2;p2=p2-next;while(p1,main()11.9 int i;struct person*pre,*cur,*head;head=(struct person*)malloc(sizeof(struct person);head-number=1;pre=head;for(i=2;inumber=i;if(i=13)pre-next=cur;cur-next=head;else pre-next=cur;pre=cur;pre=head;cur=head;for(i=1;inext;cur=pre-next;pre-next=cur-next;pre=cur-next;printf(%d,cur-number);free(cur);cur=pre;printf(n%d,cur-number);,#include#includestruct person int number;int*next;,8.共用体联合,共用体的概念共用体变量的引用共用体类型数据特点,不同变量共享同一段内存单元的结构。其一般形式为:union 共用体名 成员列表 变量列表;例如:union data int a;float b;char c;ud1,ud2;,8.共用体联合,共用体变量的引用共用体类型数据特点,只有先定义共用体变量后才能引用;共用体变量的引用是通过其成员引用的,不能直接引用共用体变量本身。,union data ud20;/定义共用体数组union data*pud;/定义共用体类型 指针变量union data*pud20;/定义共用体类型指针数组,ud1=ud2,8.共用体联合,共用体类型数据特点,同一内存段可以用来存放不同的变量,但某一瞬间只能存放其中一个;共用体变量中起作用的成员是最后一次存放的成员,存放一个成员后原来的成员就失去作用;共用体变量的地址与其成员的地址相同;不能对共用体变量初始化;不能直接引用共用体变量;共用体变量不能作函数参数,但可以使用共用体变量的指针作函数参数,并且函数的返回值不能是共用体类型。&ud1.a,&ud1,&ud1.c,&ud1.b相同,ud1.a=1;ud1.c=a;ud1.b=100.0;,union data ud1=1,2.0,a;ud1=1;m=a;,#include struct char name10;char job;union int Class;char position10;category;person2;,例:有若干人员的数据(设只有2人),有学生和教师。学生的数据有:姓名、职业、班级;教师的数据有:姓名、职业、职务。要求输入人员的数据后输出。,main()int n,i;for(i=0;i2;i+)scanf(%s%c,personi.name,9.枚举类型,C语言提供的另一种用户自定义类型称为“枚举”(enumeration)所谓“枚举”就是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内;枚举是用标识符表示的整数常量的集合,用关键字enum定义。例如:/定义枚举类型enum month JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEV;enum bool TRUE,FALSE;enum Days SUN,MON,TUE,WED,THU,FRI,SAT;/定义枚举变量enum month mt;enum bool ok;enum Days aday,day30,*pday;,9.枚举类型,说明:C编译中,对枚举元素按常量处理,故又称为枚举常量;aday=SUN;/ok,only in.c file SUN=1;/error printf(“%d”,SUN);/ok枚举元素作为常量,它们是有值的,C编译器按定义时的顺序使它们的值为0,1,2,enum Days SUN,MON,TUE,WED,THU,FRI,SAT;enum Days SUN=7,MON,TUE,WED,THU,FRI,SAT;/SUN=7以后的枚举元素顺序加1 enum Days SUN=7,MON=1,TUE,WED,THU,FRI,SAT;/MON=1以后的枚举元素顺序加1scanf(“%d”,/*正确*/,9.枚举类型,例 学生 教师#include struct char name10;enum s,t job;union int Class;char position10;category;person2;,main()int n,i;for(i=0;i2;i+)scanf(%s%d,personi.name,例:口袋中有红、黄、蓝、白、黑五种颜色球若干,若从口袋中取出3个球,问得到3中不同色的球的可能取法,打印出每种组合的3中颜色。,for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i),#include main()enum color red,yellow,blue,white,black;enum color i,j,k,pri;int n,loop;n=0;,#include main()enum color red=4,yellow=1,blue,white,black;enum color i,j,k,pri;int n,loop;printf(%d,red);printf(%d,yellow);printf(%d,blue);printf(%d,white);printf(%d,black);scanf(%d,switch(i)case red:printf(%s,red);break;case yellow:printf(%s,yellow);break;case blue:printf(%s,blue);break;case white:printf(%s,white);break;/case black:printf(%s,black);break;/syrax 4 already used case 6:printf(%s,“sssn);break;default:printf(ddd);输入7,进入default,若输入6,可打印sss,10.用typedef定义类型,C的数据类型:各种基本数据类型;指针类型;自定义类型,包括结构、联合、枚举;空类型(void);使用关键字typedef可用来建立已定义好的数据类型的别名。例如:/定义类型 typedef int INTEGER;typedef float REAL;typedef int COUNT;,typedef struct int month;int day;int year;DATE;,typedef union int x;double f;NUMBER;,typedef enum red,green,blue COLOR;,10.用typedef定义类型,/定义变量INTEGER a;/okREAL f;/okCOUNT nCount;/okDATE birthday;/ok,不要写成struct DATE birth;NUMBER num1;/ok,不要写成union NUMBER num1;COLOR col/ok,不要写成enum COLOR color;/复杂例子typedef int NUM100;NUM n;/n为整型数组变量typedef char*STRING;STRING p,s10;/p为字符指针变量,s为指针数组typedef int(*FPOINTER)();FPOINTER f1,f2/f1,f2为函数类型的指针变量,声明新类型名的方法、按定义变量的方法写出定义体,如int i10;2、将变量名换成新类型名int COUNT10;3、在最前面加typedef。typedef int COUNT10;、然后用新类型名去定义变量。COUNT i;,10.用typedef定义类型,说明:用typedef可以定义各种类型名,但不能用来定义变量;int a100,b100,c100;等价于typedef int NUM100;NUM a,b,c;用typedef只是对已经存在的类型增加一个类型名称,而没有创造新的类型;typedef和#define的区别:typedef int COUNT;#define COUNT int;一般常用typedef定义一些数据类型,把它们放在头文件中,需要的时候用#include命令把它们包含进来;使用typedef有利程序的通用和移植。,小结,结构体类型 动态链表共用体类型枚举类型typedef定义类型,作业,书面作业:(11.29)11.2,11.4(三)9.2 9.4(四)上机练习处理一批数据,(数量可能较多),在运行时输入数据量,将这些数据录入后,排序,输出。输入某个数据,查找是否存在。在上题的基础上修改为:有若干学生,每位学生有学号、姓名、成绩,输入这些学生信息,按成绩高低排序后,将所有学生信息按排序后的顺序输出。,书面作业(12.1)11.8(假设a,b均为有序链表,将两个链表合并为一个有序链表,写出合并函数即可)11.9(三)9.10 9.6(四)上机练习:有N名学生(运行时输入N),每位学生有学号、成绩,无序,要求:1、建立链表,并遍历链表打印各位学生的学号和成绩。2、将链表变为成绩由小到大的有序链表,并遍历链表打印排序后各位学生的学号和成绩。,

    注意事项

    本文(第11章结构体与共用体.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开