Presentation is loading. Please wait.

Presentation is loading. Please wait.

目 录  第 1 章 C++ 概述  第 2 章 数据类型、运算符和表达式  第 3 章 简单的输入 / 输出  第 4 章 C++ 的流程控制  第 5 章 函数  第 6 章 编译预处理  第 7 章 数组  第 8 章 结构体、共同体和枚举类型  第 9 章 指针和引用  第.

Similar presentations


Presentation on theme: "目 录  第 1 章 C++ 概述  第 2 章 数据类型、运算符和表达式  第 3 章 简单的输入 / 输出  第 4 章 C++ 的流程控制  第 5 章 函数  第 6 章 编译预处理  第 7 章 数组  第 8 章 结构体、共同体和枚举类型  第 9 章 指针和引用  第."— Presentation transcript:

1 目 录  第 1 章 C++ 概述  第 2 章 数据类型、运算符和表达式  第 3 章 简单的输入 / 输出  第 4 章 C++ 的流程控制  第 5 章 函数  第 6 章 编译预处理  第 7 章 数组  第 8 章 结构体、共同体和枚举类型  第 9 章 指针和引用  第 10 章 类和对象  第 11 章 类和对象的其他特性  第 12 章 继承和派生  第 13 章 多态性  第 14 章 输入 / 输出流  第 15 章 模板  第一部分 面向过程的程序设计  第二部分 面向对象的程序设计

2 第 8 章 结构体、共用体和枚举类型

3 本章要点  了解结构  了解关于结构的各种操作  理解怎样使用结构操作数据  理解结构和函数之间的关系、掌握结构作 为参数传递与返回结构的函数方法  理解结构中数组的用法  理解怎样创建结构数组  了解共用体的特点  了解枚举类型

4 问题的提出 学号 姓名 年龄 性别 成绩 1 成绩 2 平均成绩 1 AA 19 M 80 90 90 2 BB 18 F 78 70 73 3 CC 17 M 81 75 79 4 DD 18 F 80 60 75 5 EE 19 M 76 83 83 每行的数据类型不相同,如何表示此二维数据? 如何交换两行值? 能否将一行看成一个整体? 定义一种类型,把不同的数据作为一个整体来处理 —— 结构体

5 数据类型 数组 ------ 有相同类型的数据集合 结构体 ------ 不同类型的数据集合 构造数据类型 : 由简单数据类型( int 、 float 、 char )组合而 成的(有机整体)数据类型。 基本类型 : 整型 、实型 、字符型.......

6 主要内容  结构体类型的定义 结构体类型的定义  结构体类型的变量和结构体类型数组 结构体类型的变量和结构体类型数组  共用体 共用体  枚举类型 枚举类型

7 结构体类型的定义 定义了一种新的数据类型 struct 结构体名或结构体名 struct 结构体名 { 类型标识符 成员名 1 类型标识符 成员名 2..................................... 类型标识符 成员名 n } ; 可为简单类型 也可为构造类型 关键字 不能少 成员 列表

8 例  以学生档案为例,假设包括如下数据项 学号( num ):整型 姓名( name ):字符串 性别( sex ):字符型 出生日期( birthday ): date 结构体 四门课成绩( sc ):一维实型数组

9 例 依此格式定义上例 struct date {int year,month,day;}; struct student {int num; char name[12]; char sex; date birthday; float sc[4]; }; 如 struct date 没事先说明可 写成: struct student {int num ; char name[12]; char sex; struct {int year; int month; int day; }birthday; float sc[4]; };

10 例 例 1 :一组相关变量 定义结构体类型 新数据类型 结构体成员 int month ; int day ; int year ; struct date { int year ; int month ; int day ; }; char name[30]; struct wage float salary ; { char name[30]; float salary ; }; 不同数据类型的成员 例 2 :一组相关变量 定义结构体类型

11 说明 (1) 结构体类型是一种构造数据类型,它与 int, char,float 等系统定义的基本数据类型具有同等地位, 是由用户自行定义的。 (2) 结构体类型不分配任何存储空间。 相应结构体类型的变量、数组及动态开辟的 存储单元占存储空间。 构造的数据类型可以用来定义变量

12 结构体类型的变量和数组的定义方法 先定义结构体类型,再单独进行定义 在定义类型的同时定义结构体变量 在定义一个无名结构体类型的同时,直接进行定义

13 方法一 先声明结构体类型再定义结构体变量 struct 结构体名 { 成员列表 } ; struct 结构体名 变量名列表; 或 结构体名 变量名列表

14 例 struct student { int num; char name[12]; char sex; date birthday ; float sc[4]; } ; struct student std,pers[3]; 或 student std,pers[3]; std :结构体变量 pers :结构体数组, (三个元素均为结构体类型变量)

15 变量 std 的结构 num name sex year month day sc[0] sc[1] sc[2] sc[3] birthday 注意:各成员按顺序排列

16 方法二 在声明类型的同时定义结构体变量 struct student { int num; char name[12]; char sex; struct date birthday ; float sc[4]; } std,pers[3]; struct 结构体名 { 成员列表 } 变量名列表;

17 struct { int num; char name[12]; char sex; date birthday ; float sc[4]; } std,pers[3]; 方法三 直接定义结构体变量 struct { 成员列表 } 变量名列表; 无结构体名

18 结构体类型的几点说明  结构体中的成员可以象变量一样使用。  成员名可以与程序中的变量同名  结构体中的成员也可为结构体变量  类型与变量是完全不同的概念。 先定义结构类型,再定义变量为该类型 。 类型:不可赋值、存贮、运算;系统不分配空间。 变量:可赋值、存贮、运算;系统要分配空间。

19 结构体类型变量初值 struct student { int num; char name[12]; char sex; date birthday ; float sc[4]; }std={10101,"LiMing",'M',1962,5,10,88,76,8 5.5,90}; 注意: 一一对应赋初值, 不允许跳跃赋值。 可只给前面的成员赋值

20 给结构体数组赋初值  数组中的每个元素是一个结构体类型的数据, 因此将此成员的值依次放在一对花括号中 例: struct bookcard {char num[5]; float money; }bk[3]={{"NO.1",35.5},{"NO.2",25.0}, {"NO.3",66.7}};

21 给二维结构体数组赋初值例 struct {char ch; int i; float x; }arr[2][3]={{{'a',1,3e10},{'a',2,4e10},{'a',3,5e10}},{{'b',1,6e5},{'b',2,7e5},{'b',3, 8e5}}};

22 结构体类型变量及其成员的引用  两种方式  引用成员  结构体变量名. 成员名  引用整体 struct t { int i, j; char name[10]; }; t t1={12, 48, "LiLi"}, t2; t2=t1; 其中 “ t2=t1; ” 等同于: t2.i=t1.i; t2.j=t1.j; strcpy(t2.name, t1.name); 结构体变量的成员可以像普 通变量一样进行各种运算, 如 stud1.num++ 、 stud1.sex=stud2.sex; 结构体变量不能 进行整体输入输出

23 优先级: 1 结合性: 左 例:有定义: struct date 对变量 today 作成员选择运算: { int year ; today. year int 型 int month ; today. month int 型 int day; today. day int 型 }today ; 成员选择运算的结果是得到了该结构变量的某个成 员,其数据类型是定义该结构体类型时成员列表中定 义的类型。 成员运算符 “.”

24 例 struct data { int month; int day; int year; }; struct student { char name[20]; char sex; data birthday; int sc[4] ; } std , arr[5] ; ( 1 )引用 sex std.sex (通过结构体变量引用) 引用 arr[0] 中的 sex : arr[0].sex 不能写作 arr.sex

25 例 struct data { int month; int day; int year; }; struct student { char name[20]; char sex; data birthday; int sc[4] ; } std , arr[5] ; ( 2 )引用 sc 中的元素,如 sc[1] std.sc[1] (通过结构体变量引用) 不能写成 std.sc C++ 语言不允许对数组 整体访问(字符串除外)

26 例 struct data { int month; int day; int year; }; struct student { char name[20]; char sex; data birthday; int sc[4] ; } std , arr[5] ; ( 3 )成员为字符串 如 name std.name (通过结构体变量引用) arr[0].name

27 例 struct data { int month; int day; int year; }; struct student { char name[20]; char sex; data birthday; int sc[4] ; } std , arr[5] ; ( 4 )内嵌结构体成员的引用 逐层使用成员名定位 引用 std 中的出生年份 std.birthday.year 只可引用最 低一级成员

28 例 std.name 是字符串,可以对它进行对任何 字符串允许的操作,包括输入输出。 对结构体变量中的每个成员,可对它进行同类 变量所允许的任何操作。 对结构体变量中的成员进行操作

29 例 struct data { int month; int day; int year; }; struct student { char name[20]; char sex; data birthday; int sc[4] ; } std , pers[5] ; ( 1 )对 name 的操作 cin>>std.name; 或 cin.getline(std.name,80); ( 2 )对 sex 的操作 ① cin>>std.sex; ② for(i=0;i<3;i++) cin>>pers[i].sex; ③ std.sex= 'M'; 注意: 不能写成 std.name="Li Ming"

30 struct data { int month; int day; int year; }; struct student { char name[20]; char sex; data birthday; int sc[4] ; } std , pers[5] ; 例 ( 3 )对 birthday 中 year 的操作 ① cin>>std.birthday.year; ② std.birthday.year=1962;

31 结构体数组 struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; } stud[4] = { {23901, "Zang Li", 'F', 19, 78.5, "35 Shanghai Road"}, {23902, "Wang Fang", 'F', 19, 92, "101 Taiping Road"}, {23905, "Zhao Qiang", 'M', 20, 87, "56 Ninghai Road"}, {23908, "Li Hai", 'M', 19, 95, "48 Jiankang Road"}};

32 内存存储情况 stud[0] stud[1]. 23901 "Zang Li" 'F' 19 78.5 "35 Shanghai Road" 23902 "Wang Fang" 'F' 19 92 "101 Taiping Road".

33 结构体数组的应用 P162 例 8.2 问题:建立一个学生档案的结构体数组,输入并输出学生的信息。 #include //li0802_2.cpp 输入输出学生信息 #include struct student { char num[16]; char name[20]; float score; }; student Input(student stud) { cout<<" 请输入学号、姓名和程序设计成绩 :"; cin>>stud.num>>stud.name>>stud.score; return stud; }

34 结构体数组的应用 P162 例 8.2 void Output(student stud) { cout<<setw(10)<<stud.num<<setw(10)<<stud.name <<setw(10)<<stud.score<<endl; } void main( ) {student studs[3]; for (int i=0;i<3;i++) studs[i]=Input(studs[i]); cout<<setw(10)<<" 学号 "<<setw(10)<<" 姓名 "<<setw(20)<<" 程 序设计成绩 "<<endl; for(i=0;i<3;i++) Output(studs[i]); cout<<endl; } 传值调用 演示

35 引用调用 #include //li0802_3.cpp 输入输出学生 信息 #include struct student { char num[16]; char name[20]; float score; }; void Input(student& stud) { cout<<" 请输入学号、姓名和程序设计成绩 :"; cin>>stud.num>>stud.name>>stud.score; }

36 引用调用 void Output(student& stud) { cout<<setw(10)<<stud.num<<setw(10)<<stud.name <<setw(10)<<stud.score<<endl; } void main( ) {student studs[3]; for (int i=0;i<3;i++) Input(studs[i]); cout<<setw(10)<<" 学号 "<<setw(10)<<" 姓名 "<<setw(20)<<" 程 序设计成绩 "<<endl; for(i=0;i<3;i++) Output(studs[i]); cout<<endl; }

37 求若干学生的平均成绩 struct stud {int num; char name[20]; int age; char sex; int score; }; #include //li0803.cpp float average(stud studs[], int n) { float aver=0; for(int i=0; i<n; i++) aver += studs[i].score; aver /= n; return aver; } void main(void) {stud studs[4]={ {020110101, "Wu", 19, 'M', 80}, ……}; float aver ; aver=average(studs, 4); cout << " 平均成绩为 : "<< aver << endl; }

38 结构体变量所占字节数 结果均为 2 sizeof(float) sizeof(x) 结果均为 4 sizeof(struct stud) sizeof(stud) sizeof(stud1) 结果均为 33 实际运行输出 36(4 的倍数 ) struct stud { int num; /* 学号 */ char name[20];/* 姓名 */ int age; /* 年龄 */ char sex; /* 性别 */ int score; /* 成绩 */ }; 例 short i ; float x; struct stud stud1; sizeof(short) sizeof(i) 用 sizeof( 类型标识 / 变量名 )

39 共用体的定义及应用  问题的提出:表格 “ 学生班级 / 教师职务 ” name num sex job Li 1011 F S 501 Zhou 2085 M T prof Class Position struct people { char name[10]; int num; char sex; char job; union { int class; char position[20]; } category; }; Class 和 Position 的使用是互斥的,可分成两列, 为节省空间,合并成一列。

40 共用体变量的定义 不同数据类型的一组变量使用同一组内存单元。 union data { char c; float f; int i ; } ; union data a,b,c; 或 data a,b,c; union data { char c; float f; int i ; }a,b,c; union { char c; float f; int i ; }a,b,c; 共用体变量的定义同结构体一样有三种形式: 关键字共用体名 共用体类型

41 使用共用体变量 引用成员 a.i // 引用共用体变量中的整型变量 i a.c // 引用共用体变量中的字符变量 c a.f // 引用共用体变量中的实型变量 f 引用整体 a.i=2; b=a; // 引用整体 union {short int i; char c; float f; }a, b, c;

42 共用体类型的特点 f i c 起始地址 相同 特点:三个成员共享存储单元, 即三个成员起始地址相等 (部分存储单元共用) 同一时刻,只能有一个成员有效!!! 图 c 占 1 个字节 i 占 2 个字节 f 占 4 个字节 (1) 采用内存覆盖技术,使不同 数据类型的各个成员变量共用 同一存储区。 (2) 共用体变量所占内存长度为 其最长成员的长度。 sizeof(union data) = sizeof(a) = sizeof(b) ==> 4 ( 3 )结构体和共用体可以互相 嵌套。 ( 4 )作为一种数据类型, 共用 体变量也可以作为函数的参数 及返回值。

43 枚举类型  有时需将一个变量的取值范围限定在某个集合内  如 一周内天数:周一、周二、周三、周四、周五、周六、 周日  三基色:红、绿、兰  可将其定义成枚举类型  枚举 -- 将变量的取值范围列举出来 enum weekday { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; 用户取名 枚举常量 enum basic_color { Red, Green, Blue }; 0 1 2 3 4 5 6 类型标识符为: enum weekday 或 weekday

44 枚举类型变量的定义 enum weekday { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; weekday day1, day2  意义:变量 day1, day2 的值只能取上述括号中的 值 如: day1 = Sun; day2 = Wed;

45 特点  不能对枚举常量赋值 如 Sun=7 ×  枚举常量有默认值,为 0 , 1 , 2 ,......  在定义时,可以改变枚举常量的值(通常周日是一周的 第七天)  enum weekday { Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat };  Tue 以后的枚举常量虽然没有显式赋值,但它们已有 值

46 特点  不能直接通过键盘输入枚举变量的值,  可以输出枚举常量和变量的值,实际上输出的是序号。 enum weekday { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; weekday day1, day2; cin >> day2; // 此行错 cout << Sun << '\t' << Sat << endl; day1 = Tue; cout << day1 << '\n'; 输出? 062062

47 取球 - 穷举法 P169 例 8.6  演示 li0806.cpp


Download ppt "目 录  第 1 章 C++ 概述  第 2 章 数据类型、运算符和表达式  第 3 章 简单的输入 / 输出  第 4 章 C++ 的流程控制  第 5 章 函数  第 6 章 编译预处理  第 7 章 数组  第 8 章 结构体、共同体和枚举类型  第 9 章 指针和引用  第."

Similar presentations


Ads by Google