C++程序设计课程介绍-第8章 数据封装—结构体.ppt_第1页
C++程序设计课程介绍-第8章 数据封装—结构体.ppt_第2页
C++程序设计课程介绍-第8章 数据封装—结构体.ppt_第3页
C++程序设计课程介绍-第8章 数据封装—结构体.ppt_第4页
C++程序设计课程介绍-第8章 数据封装—结构体.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

第8章 数据封装结构体,结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表,结构体的概念,打印学生成绩单 ,格式如下:,如何在程序中表示这组学生信息?,可选方案,用二维的数组来表示 该方案不可行,因为这些信息有不同的类型 每一列用一个一维数组来表示,这种方法称为并联数组。 要保证每位学生信息的完整性和正确性很难,为什么要使用记录,当我们考虑怎么逻辑地组织数据时,应该将一个人的所有信息项放在一起,即保持相关性。,我 们 希 望 的 结 构,记录 在c+中称为结构体,结构体类型作用,结构体类型允许程序员把一些分量聚合成一个整体,用一个变量表示。 一个结构体的各个分量都有名字,把这些分量称为成员(member)。 由于结构体的成员可以是各种类型的,程序员能创建适合于问题的数据聚合。,结构体的使用,定义一个新的结构体类型 定义新类型的变量 访问结构体变量,第8章 数据封装结构体,结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表,结构体类型的定义,定义结构体类型中包括哪些分量 格式: struct 结构体类型名 字段声明; ;,如: struct studentt char no10; char name10; int chinese; int math; int english; ;,注意,字段名可与程序中的变量名相同 在不同的结构体中可以有相同的字段名 结构体成员的类型可以是任意类型,当然也可以是结构体类型,struct datet int month; int day; int year; ; struct studentt . datet birthday; ;,第8章 数据封装结构体,结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表,结构体类型的变量,结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间,结构体变量的定义,结构体变量的定义和普通的变量定义一样。如定义了结构体类型studentt,就可以定义结构体变量: studentt student1; 一旦定义了一个结构体类型的变量,系统在分配内存时就会分配一块连续的空间,依次存放它的每一个分量。这块空间总的名字就是结构体变量的名字。内部还有各自的名字,结构体变量的初始化,studentt student1= “00001”,“张三” ,87,90,77;,定义结构体类型的同时定义变量,struct 结构体类型名 字段声明; 结构体变量;,struct 字段声明; 结构体变量;,区别:前者可以继续用结构体类型名定义变量,结构体类型的变量,结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间,结构体变量的访问,成员的表示:,结构变量名.成员名,如: ,如结构中还有结构,则一级一级用”.”分开 ,如,如:student1.birthday.year,对结构体类型变量的引用一般为引用他的成员,结构变量的赋值,结构体是一个统称。每个结构体类型在使用前都要先定义自己有哪些分量。系统事先无法知道如何处理他。 因此,结构体变量的赋值通常是通过对它的每一个成员的赋值而实现。如:输入student1的内容可用: cin student1.no student1.chinese student1.math student1.english student1.birthday.year student1.birthday.month student1.birthday.day; 同类型的结构变量之间可以相互赋值,如 student1 = student2; 将student2的成员对应赋给student1的成员,结构变量的输出,结构体变量的输出通常是通过输出它的每一个成员而实现。如:输出student1的内容可用: cout student1.no student1.chinese student1.math student1.english student1.birthday.year student1.birthday.month student1.birthday.day;,结构体类型的变量,结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间,指向记录的指针,直接定义指针变量 studentt *sp; 也可以在定义结构体类型的同时定义指向结构体的指针,struct 结构体类型名 字段声明; *结构体指针;,通过指针操作记录,给结构体指针赋值,如: sp = 结构体指针的引用:,(*指针).成员 如:(*sp).name,指针-成员 如:sp-name,student1.成员, -是所有运算符中优先级最高的,通常程序员习惯使用第二种方法,结构体类型的变量,结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间,动态分配结构体的空间,指向结构体指针的另一种用法是存储动态申请到的内存的首地址。用法和申请普通的动态变量一样。如: studentt *sp; sp = new studentt;,第8章 数据封装结构体,结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表,结构体数组,用于描述个体的集合 定义格式: studentt studentarraysize;,结构体数组的引用,引用数组的某一成员的成员 studenta 数组成员之间相互赋值 studentarray4 = studentarray2 结构数组的初始化 studentt studentarray5 = “00001”, 张三“, 80, 90,98 , , , ;,统计候选人得票。设有三个候选人,每次输入一个 得票的候选人名字,要求最后输出各人得票结果。,struct persont int id; int count; leader3= 0, 0, 1, 0, 2, 0;,int main() int i, j, inputid; for (i=1; i inputid; if (inputid 2) cout “废票”;continue; leaderinputid.count += 1; cout endl; for (i=0; i3; +i) cout leaderi.id “ “ leaderi.count); return 0; ,例:输出通讯录,#include #include using namespace std; struct persont char name10; char sex; char addr30; int phonenum; ; const int max = 100;,int main() persont pmax; int i, num = 0; cout ; if (0= ) break; cin pnum.sex pnum.addr pnum.phonenum; +num; ,cout “ name “ “ sextt“ “addrttt“ “phonenumn“; cout setiosflags(ios:left); for (i=0; inum; +i) cout setw(10) pi.sex t setw(30) pi.addr t pi.phonenum endl; return 0; ,指针与结构体数组,与普通的指针一样,指向结构体的指针也能够用来指向一个结构体数组。此时,对指针加1就是加了该结构体的大小。,第8章 数据封装结构体,结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表,结构体作为参数传递,尽管结构体和数组一样也有许多分量组成,但结构体的传递和普通内置类型是一样的。它是将实际参数中的每个分量复制到形式参数的每个分量中。,结构体的传递,void printperson(persont p),指向结构体的指针作为参数,因为结构体是值传递,当希望把函数内部对结构体的修改返回给主调函数时,可以用指针传递或引用传递 由于结构体一般占用的内存量都比较大,值传递既浪费空间又浪费时间。因此可用指针传递或引用传递 指针传递形式比较繁琐,所以c+通常用引用传递 引用传递的问题是函数中可以修改实际参数,要控制函数中不能修改实际参数,可以加const限定,指向结构体的指针作为参数,和普通的指针传递一样,函数中可以通过指针访问主调函数的记录 减少函数调用时的数据传递量,void printperson(persont ,结构体传递的实例,设计一函数,打印学生信息,设计一:值传递,void printstudent(studentt s) cout s.no t t s.chinese t s.math t s.english endl; 缺点:浪费时间空间,设计二:指针传递或引用传递,void printstudent(studentt *s) cout no name chinese math english endl; void printstudent(studentt 缺点:不安全,设计三:c+的常规做法,void printstudent(const studentt 特点:节约内存,提高函数调用速度,可靠,返回结构体类型的函数,一个函数返回一个结构体。如: persont getpersondata(void) persont person; . return(person); 返回的是一个结构体的复制。 在主调函数中必须有这样的程序段: main() persont p1,p2; p1=getpersondata();,返回结构体引用的函数,函数返回一个结构体的引用。如: persont 函数中返回的结构体不能是局部变量,第8章 数据封装结构体,结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表,单链表,链表的概念 链表的存储 链表的操作 链表的应用 循环链表,单链表,头结点,只指出后继关系的链表,双链表,循环链表,同时存储前趋和后继,单链表,链表的概念 链表的存储 链表的操作 链表的应用 循环链表,单链表的存储,struct linkrec datatype data; linkrec *next; ,单链表,链表的概念 链表的存储 链表的操作 链表的应用 循环链表,单链表操作插入,申请空间 输入数据放入申请到的空间 链入p后,在结点p后插入一个结点,tmp = new listnode; / 创建一个新节点 tmp-data = x; / 把x放入新节点的数据成员中 tmp-next = p-next; / 把新节点和p的下一成员相连 p-next = tmp; /把p和新节点连接起来,单链表操作删除,把结点p后的结点删除,delptr=p-next; p-next=delptr-next; delete delptr;,单链表操作-建立,定义头指针:linkrec *head; 建立头结点 申请空间 设为头结点,head,单链表操作-建立(续),逐个从键盘输入数据,存入链表 接受输入 申请空间 输入数据放入申请到的空间 链入链表尾 置链表结束标志,a,b,c,d,head = new linkrec; rear = head; cin in_data; while (输入未结束) p = new linkrec; p-data = in_data; rear-next = p; rear = p; cin in_data; rear-next = null;,单链表操作输出,p = head-next; while ( p != null) cout data; p = p-next; ,创建并访问一个带头结点的、存储整型数据的单链表,数据从键盘输入,0为输入结束标志。,#include using namespace std; struct linkrec int data; linkrec *next; ;,int main() int x; /存放输入的值 linkrec *head, *p, *rear; head = rear = new linkrec; while (true) /创建链表的其他结点 cin x; if (x = 0) break; p = new linkrec; p-data = x; rear-next = p; rear = p; rear-next = null; /设置rear为表尾,其后没有结点了 /读链表 cout next; while (p != null) cout data next; cout endl; return 0; ,单链表,链表的概念 链表的存储 链表的操作 链表的应用 循环链表,链表的应用,合并二个有序链表,1,struct lk int data; struct lk *next; struct lk *merge(a,b) struct lk *a, *b; struct lk *c, *p; if (a-data data) c=a; a=a-next; else c=b;b=

温馨提示

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

评论

0/150

提交评论