第七章 自定义数据类型模板
第7章自定义数据类型PPT精选精品文档
} for(i=0;i<3;i++)
cout<<leader[i].name<<leader[i].count<<endl; }
《C++程序设计 》网 络 教 学
count 2 3 5
电子与信息工程系
COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT
例 统计后选人选票(使用string代替数组)
说明
结构体类型与结构体变量概念不同
类型:不分配内存;
变量:分配内存
类型:不能赋值、存取、运算; 变量:可以
结构体可嵌套
例{st例riun结cstttm构rduoa体cnttet成hst;员ud名en与t 程序中变量名可相同,不会混淆
{in结ti构ndta体yn;u类m型; 及变量的作用域与生存期
intcyheaarr;name[20];
全部初始化时维数可省
《C++程序设计 》网 络 教 学
电子与信息工程系
COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT
例 统计后选人选票
#include<iostream> struct person { char name[20];
name Li Zhang
int count; }leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};
strsutrcut csttus}dtsuteudn[et3n]t;stus[tu]=[ {]={1{0100,0“,W“WastnarcngpgLy(Lisntiun”[,”0‘],M.‘nMa’m,’2,e02,}”0,Z, haoDa”); {10110,1“,L“Li Gi Ganang”g,”‘,M‘M’,’1,91}9,, {11101,0“,L“LiuiuYYanan”,”‘,F‘F’,’1,91}9}};;
7 自定义数据类型
注意:结构体数组的引用
Student stu[100];
•stu本身是一个数组,而不是结构体; •判断以下用法是否合法:
stu[0].num++; cout<<; cout<<[0];
错:stu不是 结构体
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
定义结构体类型变量的方法
一、先定义结构体类型再定义变量名 struct student { int num; 注意: char name[20]; 结构体类型只是一种数据 char sex; 类型,不占内存空间,只有 int age; 定义结构体类型变量时才开 float score; 辟内存空间。编译时,仅对 char addr[30]; 变量分配空间,不对类型分 配空间 }; struct student student1, student2; student
struct Person //结构体模板 { char name[20]; int count; };
结构体数组应用举例
//1-用字符数组方式 //定义投票人所选的人的姓名 char leader_name[20]; Person leader[3]={″Li″,0,″Zhang″,0,″Fun″,0};//初始化 for (i=0; i<10; i++) { cin>>leader_name; //输入每张选票上所选的姓名 for (j=0; j<3; j++) if (strcmp(leader_name,leader[ j ].name)==0) leader[ j ].cout++; } struct Person //结构体模板 { char name[20]; int count; };
第七章 自定义数据类型1
第七章自定义数据类型例7.1 引用结构体变量中的成员。
#include <iostream>using namespace std;struct Date //声明结构体类型Date{int month;int day;Int year;};struct Student //声明结构体类型Student{int num;char name[20];char sex;Date birthday; //声明birthday为Date类型的成员float score;}student1,student2={10002,"Wang li",'f',5,23,1982,89.2};//定义Student类型的变量student1,student2,并对student2初始化int main( ){student1=student2;cout<<student1.num<<endl; //输出student1中的num成员的值cout<<<<endl; //输出student1中的name成员的值cout<<student1.sex<<endl;cout<<student1.birthday.month<<'/'<<student1.birthday.day<<'/'<<student1.birthday.year<<endl;cout<<student.score<<endl;return 0;}运行结果如下:10002Wang lif5/23/198298.2例7.2 对候选人得票的统计程序。
设有3个候选人,最终只能有1人当选为领导。
今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。
第07章2 自定义数据类型
3.二叉树层序遍历游标类
二叉树层序遍历的次序是根结点,根结点的左子树结点, 根结点的右子树结点,根结点的左子树结点的左子树结点, 根结点的左子树结点的右子树结点,如此等等,一直到最下 层最右边的结点为止。 二叉树层序遍历游标类的设计如下:
#include "LinQueue.h"
//包含链式队列类
7.5 二叉树的分步遍历
二叉树的遍历有两种情况,一种是一次性遍历;另一种是 分步遍历。分步遍历是指在规定了一棵二叉树的遍历方法后, 每次只访问当前结点的数据域值,然后使当前结点为当前结点 的后继结点,直到到达二叉树的最后一个结点为止。分步遍历 方法提供了对二叉树进行循环遍历操作的工具。
1.二叉树遍历游标类
//前序遍历 //中序遍历 //后序遍历
template <class T> void BiTree<T>::MakeTree(const T item, BiTree<T> &left, BiTree<T> &right) //构造数据域为item左子树为left右子树为right的二叉树 { root = new BiTreeNode<T>(item, left.root, right.root); }
void InOrder(BiTreeNode<T>* &t, void (*Visit)(T item));
void PostOrder(BiTreeNode<T>* &t, void (*Visit)(T item)); public:
BiTree(void):root(NULL){};
~BiTree(void){};
第7章-自定义数据类型
struct student r1, r2; // C++中struct 可省 可省. 中 方法三: 方法三 在方法二中省去 结构体类型名. 结构体类型名 如,
这种方法通常用于一次性定义变量 的场合, 定义完变量后, 的场合 定义完变量后 不再使用该 结构体类型. 结构体类型
定义结构体变量的几点说明 结构体变量所占的内存为全部成员的总和, 且依次连续存放; 结构体变量所占的内存为全部成员的总和 且依次连续存放 如 上例中的变量r1: code 上例中的变量 Name[10] age
第7章 自定义数据类型
注: 表示增加1个存储单位 ① p++表示增加 个存储单位 表示增加 个存储单位; 注意区分下面运算的区别: ② 注意区分下面运算的区别 (p++)->count; (++p)->count; p->count++; ++p->count;
结构体类型数据作函数参数
第7章 自定义数据类型
C/C++提供了结构体(structure)数据类型 可以将一个学生的所 提供了结构体 数据类型, 提供了结构体 数据类型 有信息存放在一个数据项中. 有信息存放在一个数据项中 也有的语言称其为“记录” OOP中进一步扩展为 也有的语言称其为“记录”(Record); 在OOP中进一步扩展为 对象” 结构体属于构造数据类型. “对象”(Object). 结构体属于构造数据类型 结构体类型声明的一般格式 struct <结构体名 结构体名> 结构体名 { 标识符 关键字 成员列表; 成员列表 };
struct student { int code; char name[10]; int score[20]; };
用户自定义数据类型
1.按位与──& .按位与 (1)格式:x&y 格式: 格式 (2)规则:对应位均为 时才为 ,否则为 :3&9=1。 规则: 时才为1,否则为0: 规则 对应位均为1时才为 。 例如, 例如,3&9=1: 0011 : & 1001 ──── 0001=1 (3)主要用途:取(或保留 个数的某 些)位,其余各位置 。 主要用途: 或保留 个数的某(些 位 其余各位置0。 或保留)1个数的某 主要用途 2.按位或──| 2.按位或──| (1)格式:x|y 格式: 格式 (2)规则:对应位均为 时才为 ,否则为 :3|9=11。 规则: 时才为0,否则为1: 规则 对应位均为0时才为 。 例如, 例如,3|9=11: 0011 : | 1001 ──── 1011=11 (3)主要用途:将1个数的某 些)位置 ,其余各位不变。 主要用途: 个数的某(些 位置 位置1,其余各位不变。 主要用途 个数的某
3.按位异或──^ .按位异或 (1)格式:x^y (2)规则:对应位相同时为0,不同时为1: 3^9=10。 (3)主要用途:使1个数的某(些)位翻转(即原 来为1的位变为0,为0的变为1),其余各位不变。 1 0 0 1) 例:交换两个变量的值,不用临时变量 x=x^y; y=x^y; x=x^y;
*/
printf("result=0x%x\n", num & mask); } 程序运行情况: 程序运行情况: Input a integer number:1000 ←┘ result=0x3
[例2] 从键盘上输入 个正整数给 变量 例 从键盘上输入1个正整数给 变量num,按二进制位输出该数。 个正整数给int变量 ,按二进制位输出该数。 #include "stdio.h" main( ) { int num, mask, i; printf("Input a integer number: "); scanf("%d",&num); mask = 1<<15; /*构造 个最高位为 、其余各位为 的整数 屏蔽字 构造1个最高位为 的整数(屏蔽字 构造 个最高位为1、其余各位为0的整数 屏蔽字)*/ printf("%d=" , num); for(i=1; i<=16; i++) { putchar(num&mask ? ’1’ : ‘0’); /*输出最高位的值 /*输出最高位的值(1/0)*/ 输出最高位的值(1/0)*/ num <<= 1; /*将次高位移到最高位上 将次高位移到最高位上*/ 将次高位移到最高位上 if( i%4==0 ) putchar(‘,’); /*四位一组,用逗号分开 四位一组, 四位一组 用逗号分开*/ } printf("\bB\n"); } 程序运行情况: 程序运行情况: Input a integer number:1000 ←┘ 1000=0000,0011,1110,1000B
第7章用户定制数据类型
num; name[20]; sex; age; score; addr[30];
同样的方法可以为建立通信录定制一种 数据类型struct Addr:
truct Addr {
char char char char unsigned int }
name[30]; street[40]; city[20]; provn[20]; zip;
struct{…}(结构体类型) 用户定制类型
union{…}(共用体类型) T[…](数组类型)
构造类型
文件类型
函数类型
结构体(struct):也称集合数据类 型,用于将不同类型的数据组织在一 个名字下。
共用体(union):允许一个存储空间 中存储不同类型的变量。
枚举(enumeration):用一组符号 代替一组整数。
C语言提供有丰富的数据类型:
C 语言 数据类型
基本 数据类型
导出 数据类型
char(字符类型)
整型
short(短整型) int(整型) long(长整型)
float(单精度浮点型)
浮点型 double(双精度浮点型)
long double(长双精度浮点型) void类型
T*(指针类型)
enum(枚举)
• 也可以用以下形式
Struct Studentstdnt3={50203,”LiHong”,’M’,17,79.9,”Shanxi”};
struct Student
{
unsigned int
num;
char
name[20];
char
sex;
unsigned char age;
float
score;
第7章 自定义数据类型
void main ( )
{ weather today ; yesterday . temp = 10.5 ; yesterday . wind = 3.1 ; today = yesterday ; // 结构变量整体赋值 cout << "Temp = " << today . temp << endl ; cout << "Wind = " << today . wind << endl ;
Student st1, st2,*sm ;
定义st1和st2为结构体类型Student的变量,即它们具有Student类 型的结构。 定义sm为结构体类型Student的变量的指针
7.1.2 结构体类型变量 1.结构体类型变量
(1) 声明类型之后声明变量 (2) 声明类型的同时声明变量
struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; } st1, st2,*sm ;
1. 定义结构体数组 和定义结构体变量的方法相仿, 定义结构体数组时只需声明其为 数组即可。
struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; } st1[10]
;
根据下面的定义,能打印出字母M的语句是:
8.1.1 定义结构和访问结构
自定义数据类型
Ø 结构体数组的定义及初始化
u直接定义并初始化 struct Cat { char colour[10]; int weight; float length; }cat_arr[2]={{"white",525,60.4},{"yellow",237,28.9}};
高级程序设计C++
田秀霞
E-Mail:c_plusplus@
结构体变量定义的三种形式
Ø 直接定义法
u直接定义法是指在定义结构体类型的同时定义变量。其一 般形式为:
struct 结构体类型名 { 成员类型1 成员名1; 成员类型2 成员名2; … 成员类型n 成员名n; }变量名1,变量名2,… ,变量名n; struct Cat { char colour[10]; int weight; float length; }cat1,cat2;
Ø 经常需要将多个相关的、不同类型的数据包装成为 一个整体来使用:
u描述一本书的相关信息,其中包括书的书号、书名、出 版社和定价等。 struct是结构体类型关键字 Ø 结构体类型定义 struct 结构体类型名 { 成员类型1 成员名1; 符合标识符命名规则 成员类型2 成员名2; … 成员类型n 成员名n; }; 结构体类型的定义应视为一个完整的语句,因 此,在定义结束后需在结尾添加“ ;”
Ø结构体成员的引用
u结构体变量名.成员名 u“ 是成员运算符,它是所有运算符中优先级最 .” 高的 u如: cat1.weight=525;
Ø若成员本身也是一个结构体,则需要用若干 个成员运算符,一级一级地找到最低级成 员。
uBook book; ubook.pub_date.year=2010; ubook.pub_date.month=11; ubook.pub_date.day=11;
第七章 自定义数据类型模板
第七章用户自定义数据类型7.1 结构体类型7.1.1 结构体的概述一个学生的学号、姓名、性别、年龄、成绩、家庭住址 num name sex age score addr10010 Li Fun M 18 87.5 BeiJing 声明一个新的结构体的类型:struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];};7.1.2 结构体类型变量的定义方法及其初始化1.定义结构体变量的方法(1)先声明结构体的类型再定义变量名Student student1,student2;(2)声明类型的同时定义变量struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];}std1,std2;(3)直接定义结构体类型变量struct{ int num;char name[20];char sex;int age;float score;char addr[30];}std1,std2;(4)成员也可以是一个结构体变量struct Date{ int month;int day;int year;};struct Student{ int num;char name[20];char sex;int age;Date birthday;float score;char addr[30];};2.结构体变量的初始化struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];}student1={10001,"Zhang Xin",'M',19,90.5,"shanghai"}; Student student2={10002,"Wang Li",'F',20,98,"Beijing"};7.1.3 引用结构体变量(1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。
第7章 C++其他自定义数据类型
第7章 C++其他自定义数据类型
结构数组
要定义结构数组,必须先声明一个结构类型,然后 就可以像基本数据类型的数组一样定义结构类型数 组. struct student { int num; char name[20]; float score; }; student stu[30]; 结构数组的每个元素都是该结构类型的变量.
第7章 C++其他自定义数据类型
(2) 使用new操作在堆中给结构指针分配空间 student *p=new student ; 作结构指针访问结构成员的方法: (*p).num p->num 请分析以下几种运算: p->n得到p指向的结构体变量中的成员n的值. . p->n++ 得到p指向的结构体变量中的成员n 的值,用完该值后使它加1. ++p->n 得到p指向的结构体变量中的成员n 的值加1,然后再使用它.
第7章 C++其他自定义数据类型
例:输入10个学生的信息,要求根据其成绩排列名次. #include "iostream.h" struct student { int num; char name[20]; float score; }; void main( ) { student s,stu[10];
第7章 C++其他自定义数据类型
例如: struct student {long num; char name[20]; int age; float score; };
//学号 //姓名 //年龄 //成绩
定义student类型的变量:
student s1; 结构类型的变量所占的存储空间是结构中所 有成员所占空间的总和. 有成员所占空间的总和.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章用户自定义数据类型7.1 结构体类型7.1.1 结构体的概述一个学生的学号、姓名、性别、年龄、成绩、家庭住址 num name sex age score addr10010 Li Fun M 18 87.5 BeiJing 声明一个新的结构体的类型:struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];};7.1.2 结构体类型变量的定义方法及其初始化1.定义结构体变量的方法(1)先声明结构体的类型再定义变量名Student student1,student2;(2)声明类型的同时定义变量struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];}std1,std2;(3)直接定义结构体类型变量struct{ int num;char name[20];char sex;int age;float score;char addr[30];}std1,std2;(4)成员也可以是一个结构体变量struct Date{ int month;int day;int year;};struct Student{ int num;char name[20];char sex;int age;Date birthday;float score;char addr[30];};2.结构体变量的初始化struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];}student1={10001,"Zhang Xin",'M',19,90.5,"shanghai"}; Student student2={10002,"Wang Li",'F',20,98,"Beijing"};7.1.3 引用结构体变量(1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。
student1=student2;(2)可以引用一个结构体变量中的一个成员的值。
student1.num=10010; "."是成员运算符,它的优先级最高。
(3)对于结构体嵌套,要逐级引用。
student1.birthday.month=11;(引用student1中birthday中的month成员)。
(4)不能将一个结构体变量作为一个整体进行输入和输出。
(5)对于结构体变量的成员可以像普通变量一样进行各种运算。
(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
cout<<&student1;cout<<&student1.age;例7.1 引用结构体变量中的成员 P199#include <iostream>using namespace std;struct Date{ int month;int day;int year;};struct Student{ int num;char name[20];char sex;Date birthday;float score;char addr[30];}student1,student2={10002,"Wang Li",'F',5,23,1982,89.5}; void main(){student1=student2;cout<<student1.num<<endl;cout<<<<endl;cout<<student1.sex<<endl;cout<<student1.birthday.month<<'/'<<student1.birthday.day<<'/'<<student1.birthday.year<<endl;cout<<student1.score<<endl;}10002Wang LiF5/23/198289.57.1.4 结构体数组1.定义结构体数组struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];}stu[3];Student x[8];2.结构体数组的初始化Student y[2]={{10101,"Li Lin",'M',18,87.5,"103 Beijing Road"} ,{10102,"Zhang Fun",'M'19,99,"130 Shanghai Road"}};3.结构体数组应用举例例7.2 对候选人得票统计程序.P202#include <iostream>using namespace std;struct Person{char name[20];int count;};void main(){ Person leader[3]={"Li",0,"Zhang",0,"Fun",0};int i,j;char leader_name[20];for(i=0;i<10;i++){cin>>leader_name;for(j=0;j<3;j++)if(strcmp(leader_name,leader[j].name)==0){ leader[j].count++;break;}}for(i=0;i<3;i++)cout<<leader[i].name<<':'<<leader[i].count<<endl; }ZhangLiFunLiZhangLiZhangLiFunWangLi:4Zhang:3Fun:27.1.5 指向结构体变量的指针1.通过指向结构体变量的指针引用结构体变量中的成员例7.3 指向结构体变量的指针的应用 P204#include <iostream>#include <string>using namespace std;void main(){struct Student{int num;string name;char sex;float score;};Student stu;Student *p=&stu;stu.num=10301;="Wang Fun";stu.sex='F';stu.score=89.5;cout<<stu.num<<" "<<<<" "<<stu.sex<<" "<<stu.score<<endl;cout<<(*p).num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<endl;cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->score<<endl;}10301 Wang Fun F 89.510301 Wang Fun F 89.510301 Wang Fun F 89.5" ->"是指向运算符,即指向结构体变量运算符。
请分析以下几种运算:p->np->n++++p->n#include <iostream>#include <string>using namespace std;void main(){struct Student{int num;string name;char sex;float score;};Student stu;Student *p=&stu;stu.num=10301;cout<<p->num<<endl;cout<<p->num++<<endl;cout<<++p->num<<endl;cout<<stu.num<<endl;}103011030110303103032.用结构体变量和指向结构体变量的指针构成链表struct Student{ int num;float score;Student *next;};利用指向自己的指针构成链表。
例7.4 P206#define NULL 0#include <iostream>using namespace std;struct Student{ int num;float score;Student *next;};void main(){Student a,b,c,*head,*p;a.num=31001;a.score=89.5;b.num=31003;b.score=90;c.num=31007;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;while(p!=NULL){ cout<<p->num<<" "<<p->score<<endl;p=p->next;} }31001 89.531003 9031007 857.1.6 结构体类型数据作为函数参数例7.5(1)用结构体变量作函数参数。