结构体、共用体和枚举类型

上传人:re****.1 文档编号:571393702 上传时间:2024-08-10 格式:PPT 页数:71 大小:439.54KB
返回 下载 相关 举报
结构体、共用体和枚举类型_第1页
第1页 / 共71页
结构体、共用体和枚举类型_第2页
第2页 / 共71页
结构体、共用体和枚举类型_第3页
第3页 / 共71页
结构体、共用体和枚举类型_第4页
第4页 / 共71页
结构体、共用体和枚举类型_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《结构体、共用体和枚举类型》由会员分享,可在线阅读,更多相关《结构体、共用体和枚举类型(71页珍藏版)》请在金锄头文库上搜索。

1、南京航空航天大学信息学院计算机基础教研室 制作(版权所有)第10章 结构体、共用体和枚举类型第10章本章要点v了解结构了解结构v了解关于结构的各种操作了解关于结构的各种操作v理解怎样使用结构操作数据理解怎样使用结构操作数据v理解结构和函数之间的关系、掌握结构作理解结构和函数之间的关系、掌握结构作为参数传递与返回结构的函数方法为参数传递与返回结构的函数方法v理解结构中数组的用法理解结构中数组的用法v理解怎样创建结构数组理解怎样创建结构数组v了解共用体的特点了解共用体的特点v了解枚举类型了解枚举类型第10章问题的提出学号学号 姓名姓名 年龄年龄 性别性别 成绩成绩1 成绩成绩2 平均成绩平均成绩

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每行的数据类型不相同,如何表示此二维数据?每行的数据类型不相同,如何表示此二维数据?如何交换两行值?如何交换两行值? 能否将一行看成一个整体?能否将一行看成一个整体?定义一种类型定义一种类型,把不同的数据作为一个整体来处理,把不同的数据作为一个整体来处理结构体结构体第10章数据类型数组数组 - 有相同类型的数据集合有相同类型的数据集合结构体结构体- 不同类型的数据集合不同类型的数据集合构造数据类型构造数据类型

3、: 由简单数据类型(由简单数据类型(int、float、 char)组合而组合而成的(有机整体)数据类型。成的(有机整体)数据类型。基本类型基本类型 : 整型整型 、实型、实型 、字符型、字符型.第10章主要内容v结构体类型的定义结构体类型的定义v结构体类型的变量和结构体类型的变量和结构体类型结构体类型数组数组v共用共用体体v枚举类型枚举类型第10章结构体类型的定义定义了一种新的数据类型定义了一种新的数据类型 struct 结构体名或结构体名结构体名或结构体名struct 结构体名结构体名 类型标识符类型标识符 成员名成员名1 类型标识符类型标识符 成员名成员名2 . 类型标识符类型标识符 成

4、员名成员名n ;可为简单类型可为简单类型也可为构造类型也可为构造类型关键字关键字不能少不能少成员列表第10章例v以学生档案为例,假设包括如下数据项以学生档案为例,假设包括如下数据项 学号(学号(num):):整型整型 姓名(姓名(name):):字符串字符串 性别(性别(sex):):字符型字符型 出生日期(出生日期(birthday):):date结构体结构体 四门课成绩(四门课成绩(sc):):一维实型数组一维实型数组第10章例依此格式定义上例依此格式定义上例struct date int year ,month ,day;struct student int num; char name

5、12; char sex; date birthday; float sc4; ;如如struct date 没事先说明可没事先说明可写成:写成:struct student int num ; char name12; char sex; struct int year; int month; int day; birthday; float sc4;第10章例例例1 1:一组相关变量:一组相关变量 定义结构体类型定义结构体类型新数据类型新数据类型结构体成员结构体成员 int month ; int day ; int year ;struct date int year ; int mon

6、th ; int day ; ;char name30; struct wagefloat salary ; char name30; float salary ; ;不同数据类型的成员不同数据类型的成员例例2 2:一组相关变量:一组相关变量 定义结构体类型定义结构体类型第10章说明 (1) (1) 结构体类型是一种构造数据类型结构体类型是一种构造数据类型,它与,它与int, char,float等系统定义的基本数据类型具有同等地位,等系统定义的基本数据类型具有同等地位,是由用户自行定义的。是由用户自行定义的。(2) (2) 结构体类型不结构体类型不分配任何存储空间。分配任何存储空间。相应结构

7、体类型的相应结构体类型的变量、数组及动态开辟的变量、数组及动态开辟的存储单元存储单元占存储空间。占存储空间。构造的数据类型可以用来定义变量构造的数据类型可以用来定义变量第10章结构体类型的变量和数组的定义方法先定义结构体类型,再单独进行定义先定义结构体类型,再单独进行定义在定义类型的同时定义结构体变量在定义类型的同时定义结构体变量在定义一个无名结构体类型的同时,直接进行定义在定义一个无名结构体类型的同时,直接进行定义第10章方法一先声明结构体类型再定义结构体变量先声明结构体类型再定义结构体变量struct 结构体名结构体名 成员列表成员列表;struct 结构体名结构体名 变量名列表;变量名列

8、表;或或结构体名结构体名 变量名列表变量名列表第10章例struct student int num; char name12; char sex; date birthday ; float sc4; ;struct student std,pers3;或或student std,pers3;std:结构体变量结构体变量pers:结构体数组,结构体数组,(三个元素均为结构体类型变量)(三个元素均为结构体类型变量)第10章变量std的结构num name sex year month day sc0 sc1 sc2 sc3birthday 注意:各成员按顺序排列注意:各成员按顺序排列第10章方

9、法二在声明类型的同时定义结构体变量在声明类型的同时定义结构体变量struct student int num; char name12; char sex; struct date birthday ; float sc4; std,pers3;struct 结构体名结构体名 成员列表成员列表 变量名列表;变量名列表;第10章struct int num; char name12; char sex; date birthday ; float sc4; std,pers3;方法三直接定义结构体变量直接定义结构体变量struct 成员列表成员列表 变量名列表;变量名列表;无结构体名无结构体名第

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

11、 name12; char sex; date birthday ; float sc4;std=10101,LiMing,M,1962,5,10,88,76,85.5,90;注意:注意:一一对应赋初值,一一对应赋初值,不允许跳跃赋值。不允许跳跃赋值。可只给前面的成员赋值可只给前面的成员赋值第10章给结构体数组赋初值v数组中的每个元素是一个结构体类型的数据,数组中的每个元素是一个结构体类型的数据,因此将此成员的值依次放在一对花括号中因此将此成员的值依次放在一对花括号中例:例:struct bookcard char num5; float money; bk3=NO.1,35.5,NO.2,2

12、5.0, NO.3,66.7;第10章给二维结构体数组赋初值例struct char ch; int i; float x; arr23=a,1,3e10,a,2,4e10,a,3,5e10,b,1,6e5,b,2,7e5,b,3, 8e5;第10章结构体类型变量及其成员的引用v两种方式两种方式F引用成员引用成员M结构体变量名结构体变量名.成员名成员名F引用整体引用整体struct t int i, j; char name10;t t1=12, 48, LiLi, t2;t2=t1;其中其中“t2=t1;”等同于:等同于:t2.i=t1.i; t2.j=t1.j;strcpy(t2.name

13、, t1.name);结构体变量的成员可以像普结构体变量的成员可以像普通变量一样进行各种运算,通变量一样进行各种运算,如如stud1.num+、stud1.sex=stud2.sex;结构体变量不能进行整体输入输出 第10章 优先级:优先级: 1 结合性:结合性: 左左 例:有定义:例:有定义: struct date 对变量对变量today作成员选择运算:作成员选择运算: int year ; today. year int型型 int month ; today. month int型型 int day; today. day int型型 today ; 成员选择运算的结果是得到了该结构变

14、量的某个成成员选择运算的结果是得到了该结构变量的某个成员员,其数据类型是定义该结构体类型时成员列表中定,其数据类型是定义该结构体类型时成员列表中定义的类型。义的类型。成员运算符“.”第10章例struct data int month; int day; int year;struct student char name20; char sex; data birthday; int sc4; std,arr5;(1)引用)引用sex std.sex(通过结构体变量引用)通过结构体变量引用)引用引用arr0中的中的sex: arr0.sex不能写作不能写作 arr.sex第10章例struct

15、 data int month; int day; int year;struct student char name20; char sex; data birthday; int sc4; std,arr5 ;(2)引用引用sc中的元素,如中的元素,如sc1std.sc1(通过结构体变量引用)通过结构体变量引用)不能写成不能写成std.scC+语言不允许对数组语言不允许对数组整体访问(字符串除外整体访问(字符串除外)第10章例struct data int month; int day; int year;struct student char name20; char sex; data

16、 birthday; int sc4; std,arr5 ;(3)成员为字符串)成员为字符串如如name std.name(通过结构体变量引用)通过结构体变量引用)arr0.name第10章例struct data int month; int day; int year;struct student char name20; char sex; data birthday; int sc4; std,arr5 ;(4)内嵌结构体成员的引用内嵌结构体成员的引用逐层使用成员名定位逐层使用成员名定位引用引用std中的出生年份中的出生年份std.birthday.year只可引用最只可引用最低一级成

17、员低一级成员第10章例例std.name是字符串,可以对它进行对任何是字符串,可以对它进行对任何字符串允许的操作,包括输入输出。字符串允许的操作,包括输入输出。对结构体变量中的每个成员,可对它进行同类对结构体变量中的每个成员,可对它进行同类变量所允许的任何操作。变量所允许的任何操作。对结构体变量中的成员进行操作第10章例struct data int month; int day; int year;struct student char name20; char sex; data birthday; int sc4; std,pers5 ;(1)对)对name的操作的操作cinstd.na

18、me;或或cin.getline(std.name,80);(2)对)对sex的操作的操作cinstd.sex;for(i=0;ipersi.sex;std.sex= M; 注意:注意:不能写成不能写成std.name=Li Ming第10章struct data int month; int day; int year;struct student char name20; char sex; data birthday; int sc4; std,pers5;例(3)对)对birthday中中year的操作的操作cinstd.birthday.year;std.birthday.year=

19、1962;第10章结构体数组struct student int num;char name20;char sex;int age;float score;char addr30; stud4 = 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; 第10章内存存储情况stud0stud

20、1. 23901Zang LiF1978.535 Shanghai Road23902Wang FangF1992101 Taiping Road.第10章结构体数组的应用问题:问题:建立一个学生档案的结构体数组,输入并输出学生的信息。建立一个学生档案的结构体数组,输入并输出学生的信息。#include /li0802_2.cpp 输入输出学生信息输入输出学生信息#include struct studentchar num16;char name20;float score;student Input(student stud)coutstud.numstud.namestud.score;

21、return stud;第10章结构体数组的应用void Output(student stud) coutsetw(10)stud.numsetw(10)stud.name setw(10)stud.scoreendl;void main( ) student studs3;for (int i=0;i3;i+)studsi=Input(studsi);coutsetw(10)学号学号setw(10)姓名姓名setw(20)程序设计成程序设计成绩绩 endl;for(i=0;i3;i+)Output(studsi);coutendl;传值调用传值调用演示演示第10章引用调用#include

22、/输入输出学生信息输入输出学生信息#include struct studentchar num16;char name20;float score;void Input(student& stud)coutstud.numstud.namestud.score;第10章引用调用void Output(student& stud) coutsetw(10)stud.numsetw(10)stud.name setw(10)stud.scoreendl;void main( ) student studs3;for (int i=0;i3;i+)Input(studsi);coutsetw(10

23、)学号学号setw(10)姓名姓名setw(20)程序设计成程序设计成绩绩 endl;for(i=0;i3;i+)Output(studsi);coutendl;第10章求若干学生的平均成绩struct stud int num; char name20; int age; char sex; int score; ;#include float average(stud studs, int n)float aver=0;for(int i=0; in; i+) aver += studsi.score; aver /= n;return aver;void main(void)stud s

24、tuds4= 020110101, Wu, 19, M, 80,; float aver ; aver=average(studs, 4); cout 平均成绩为平均成绩为: aver name; (*p).id 等效于等效于p-id; (*p).salary 等效于等效于p-salary.第10章在使用指针访问成员时,通常使用箭头操作符在使用指针访问成员时,通常使用箭头操作符“-”。例如:下面程序中,定义了结构指针,通过结构指针访问结构例如:下面程序中,定义了结构指针,通过结构指针访问结构成员。成员。#include #include strut person char name20; un

25、signed long id; float salary;第10章void main( ) person pr1; person *p; p=&pr1; strcpy(p-name, “Wang ming”); p-id=12345678; p-salary=4800.0; coutname“ ”p-id“ ”salaryendl;结果为:结果为:Wang ming 12345678 4800.0第10章 如果一个数组的元素是同一种结构类型的变量,那么这种如果一个数组的元素是同一种结构类型的变量,那么这种数组称为结构数组。数组称为结构数组。 要定义一个结构数组,必须先定义一个结构类型,然后再要

26、定义一个结构数组,必须先定义一个结构类型,然后再定义具有这种结构类型的一个数组。定义具有这种结构类型的一个数组。 例如,定义一个包含例如,定义一个包含100个元素的个元素的person 结构数组:结构数组: struct person char name20; unsigned long id; float salary; ; person allone100;10.3 结构与数组结构与数组第10章 数组中每个元素是一个完整的结构变量,它包含数组中每个元素是一个完整的结构变量,它包含name、id、salary三个成员分量。三个成员分量。 allone0 访问第一个数组元素;访问第一个数组元素

27、; allone99访问最后一个数组元素。访问最后一个数组元素。例如:下面程序对一个例如:下面程序对一个person 结构数组中的元素进行结构数组中的元素进行“冒泡法冒泡法”排序,工资高的排在后面。排序,工资高的排在后面。#include struct person char name20; unsigned long id; float salary;第10章person allone6=“jone”,12345,3390.0, “david”,13916,4490.5, “marit”,27519,3110.0, “jasen”,42876,6230.5, “peter”,23987,40

28、00.2, “yoke”,12335,5110.0;void main( ) person temp; for(int i=1; i6;i+) /排序轮次数排序轮次数 for(int j=0;jallonej+1.salary) /工资高的后移工资高的后移 temp=allonej; allonej=allonej+1; alonej+1=temp; 第10章 for(int k=0;k6;k+) coutallonek.name“ ” allonek.id“ ” allonek.salaryendl;运行结果为:运行结果为:marit 27519 3110.0jone 12345 3390.

29、0peter 23987 4000.2david 13916 4490.5yoke 12335 5110.0jasen 42876 6230.5第10章 结构变量也可以作为实参数进行函数调用。可以采用传值、结构变量也可以作为实参数进行函数调用。可以采用传值、传址、传引用的三种方式传递参数。传址、传引用的三种方式传递参数。一、传递结构变量值一、传递结构变量值 因为传递的是实参结构变量中拷贝的数值,所以实参结构因为传递的是实参结构变量中拷贝的数值,所以实参结构变量的数值不会因为函数的调用而被修改。变量的数值不会因为函数的调用而被修改。例如:下面是一个传值调用的例子例如:下面是一个传值调用的例子#i

30、nclude struct person char name20; unsiged long id; float saslary;10.4 传递结构参数传递结构参数第10章void print(person pr) coutpr.name“ ”pr.id“ ”pr.salary endl;person allone4=“jone”,12345,3390.0, “david”,13916,4490.5, “marit”,27519,3110.0, “yoke”,12335,5110.0;void main( ) for(int i=0;i4;i+) print(allonei); /实参数为结构

31、数组元素实参数为结构数组元素 结果为:结果为: jone 12345 3390.0 david 13916 4490.5 marit 27519 3110.0 yoke 12335 5110.0第10章二、传递结构变量的引用二、传递结构变量的引用 结构变量也可以按引用方式传递,此时仅把实参的地址传结构变量也可以按引用方式传递,此时仅把实参的地址传给形参。由于传递的是地址,可以实现由形参直接修改实参的给形参。由于传递的是地址,可以实现由形参直接修改实参的作用。作用。 引用传递没有传递值的拷贝数据过程,节省了传送时间和引用传递没有传递值的拷贝数据过程,节省了传送时间和所需的存储空间,传递效率提高。

32、所需的存储空间,传递效率提高。第10章 例如,将前面的程序改为用引用传递结构变量,只需在例如,将前面的程序改为用引用传递结构变量,只需在print( )函数定义时,将形参说明为引用。其函数调用方式与传递方函数定义时,将形参说明为引用。其函数调用方式与传递方式相同。式相同。void print(person& pr) coutpr.name“ ”pr.id“ ”pr.salary endl;三、传递结构变量的地址三、传递结构变量的地址 传递结构变量地址与传递引用的功能类似,都能实现双向传递结构变量地址与传递引用的功能类似,都能实现双向传递。若将前面程序改为传递结构变量的地址,只需定义传递。若将前

33、面程序改为传递结构变量的地址,只需定义print( )函数时,将形参说明为指向结构变量的指针,函数调用时传递函数时,将形参说明为指向结构变量的指针,函数调用时传递实参结构变量的地址。实参结构变量的地址。第10章 返回值为结构类型的函数称为结构函数。返回值为结构类型的函数称为结构函数。一、返回结构变量一、返回结构变量 一个函数可以返回一个结构变量。在一个函数可以返回一个结构变量。在main( )中,调用结构中,调用结构函数的返回值必须赋于具有相同结构类型的变量。函数的返回值必须赋于具有相同结构类型的变量。例如:例如:#include struct person char name20; unsi

34、gned long id; float salary;10.5 结构函数结构函数第10章person getperson( ) /定义返回结构变量的函数定义返回结构变量的函数 person temp; couttemp.name; couttemp.idtemp.salary; return temp; /返回结构变量返回结构变量tempvoid print(person& p) coutp.name“ ”p.id“ ”p.salaryendl;第10章void main( ) person employee3; for(int i=0;i3;i+) employeei=getperson(

35、); /返回值赋给同类型的结构变量返回值赋给同类型的结构变量 print(employeei); 结果:结果:Please enter a name for one person:maritPlease enter ones ID number and his salary:27519 3110.0marit 27519 3110.0第10章 如果将上例中的如果将上例中的getperson( )函数改为引用传递,则可提高函数改为引用传递,则可提高程序运行效率,省去函数返回值赋以同类型结构变量的操作。程序运行效率,省去函数返回值赋以同类型结构变量的操作。改写后的程序如下:改写后的程序如下:#in

36、clude struct person char name20; unsigned long id; float salary;void getperson(person& p) /形参形参定义为结构变量引用定义为结构变量引用 coutp.name; coutp.idp.salary;第10章void print(person& p) coutp.name“ ”p.id“ ”p.salaryendl;void main( ) person employee3; for(int i=0;i 4 (3)结构体和共用体可以互相)结构体和共用体可以互相嵌套。嵌套。(4)作为一种数据类型,)作为一种数据

37、类型, 共用共用体变量也可以作为函数的参数体变量也可以作为函数的参数及返回值。及返回值。第10章枚举类型v有时需将一个变量的有时需将一个变量的取值范围取值范围限定在某个集合内限定在某个集合内如如 一周内天数:周一、周二、周三、周四、周五、周六、一周内天数:周一、周二、周三、周四、周五、周六、周日周日三基色:红、绿、兰三基色:红、绿、兰v可将其定义成枚举类型可将其定义成枚举类型v枚举枚举 - 将变量的取值范围列举出来将变量的取值范围列举出来 enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; 用户取名用户取名 枚举常量枚举常量 enum basic_

38、color Red, Green, Blue ;0 1 2 3 4 5 6类型标识符为:类型标识符为:enum weekday 或或 weekday第10章枚举类型变量的定义enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ;weekday day1, day2v意义:意义:变量变量 day1, day2 的值只能取上述括号中的的值只能取上述括号中的值值 如:如:day1 = Sun; day2 = Wed; 第10章特点v不能对枚举常量赋值不能对枚举常量赋值 如如 Sun=7 v枚举常量有默认值,为枚举常量有默认值,为 0,1,2,.v在定义时,可

39、以改变枚举常量的值(通常周日是一周的在定义时,可以改变枚举常量的值(通常周日是一周的第七天)第七天)v enum weekday Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat ;v Tue 以后的枚举常量虽然没有显式赋值,但它们已有以后的枚举常量虽然没有显式赋值,但它们已有值值第10章特点v 不能直接通过键盘输入枚举变量的值,不能直接通过键盘输入枚举变量的值,v 可以输出枚举常量和变量的值,实际上输出的是序号。可以输出枚举常量和变量的值,实际上输出的是序号。 enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; weekday day1, day2; cin day2; / 此行错此行错 cout Sun t Sat endl; day1 = Tue; cout day1 n;输出?062

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号