C++高级语言程序设计第四章.ppt
C+高级语言程序设计,第4章 数组及其他自定义类型北京邮电大学信息与通信工程学院,2023/9/30,北京邮电大学信息与通信工程学院,1,第4章 数组及其他自定义类型,4.1 数组数组基本概念、数组初始化、访问数组元素、字符型数组、多维数组4.2 枚举类型枚举类型的定义、枚举型变量的定义及使用4.3 结构类型结构类型的定义、结构变量的定义及初始化、结构变量的使用4.4 联合类型联合类型的定义、联合型变量的定义及使用,2023/9/30,北京邮电大学信息与通信工程学院,-2-,4.1 数组,数组是具有一定顺序关系的若干相同类型变量的集合,组成数组的变量称为该数组的元素。数组属于构造类型。数组是实际编程中经常使用的一种数据结构。,2023/9/30,北京邮电大学信息与通信工程学院,-3-,4.1.1 数组定义及初始化,1.一维数组的定义一维数组定义的语法形式 类型标识符 数组名常量表达式;说明 类型标识符:任何合法的类型标识符,用于说明数组元素的类型;数组名:程序员对该数组的命名,数组的命名规则同变量命名;方括号及常量表达式:用于说明该数组中元素的个数。,2023/9/30,北京邮电大学信息与通信工程学院,-4-,4.1.1 数组定义及初始化,例:10级119班30名同学“C+程序设计”课程的成绩 int Cscore30;实验,测得一组电阻R随温度T变化的值 float Ri30;short Tc30;,2023/9/30,北京邮电大学信息与通信工程学院,-5-,4.1.1 数组定义及初始化,一维数组在内存中存储映射 int score 5;,2023/9/30,北京邮电大学信息与通信工程学院,-6-,4.1.1 数组定义及初始化,注意定义一个数组,系统为这个数组保留一定数量的连续内存单元,数组元素依次占用这一连续内存空间,这段内存空间起始地址的外部标识就是数组名;数组名是一个地址常量,禁止给数组名赋值;数组各元素用数组名及下标(或称索引值)来标识,score0,score1,score4分别表示数组的第15个元素;C语言和C+语言中,元素的下标从0开始计,数组元素的最大下标比元素个数少1,数组score最大下标对应的元素是score4,而不是score5(访问越界);,2023/9/30,北京邮电大学信息与通信工程学院,-7-,4.1.1 数组定义及初始化,注意数组名表示数组在内存中的起始地址,可以将元素的下标理解为元素存放位置相对于数组名的偏移量,第i个元素scorei的起始地址相对于数组的起始地址偏移了i个int型变量所占空间;每个元素可以视为一个同类型的变量,如scorei可以视为一个整型变量;数组的每个元素占用空间大小与同类型变量占用的内存大小一样;数组占用的内存空间是其全部元素所占空间的总和,如果数组有N个元素,它所占的字节数可以通过以下方式得到:sizeof(数组名)或 N*sizeof(数组类型)。,2023/9/30,北京邮电大学信息与通信工程学院,-8-,4.1.1 数组定义及初始化,2.数组初始化在定义数组时,直接给出赋给数组元素的值,称为数组初始化。数组初始化语法形式 类型标识符 数组名常量表达式=以逗号隔开的初始化值;,2023/9/30,北京邮电大学信息与通信工程学院,-9-,4.1.1 数组定义及初始化,例:定义并初始化整型数组score5的语句为:int score5=80,70,90,95,60;初始化列表中的数据依次赋给元素score0、score1、score2、score3、score4。注意不要丢掉语句最后的分号。,2023/9/30,北京邮电大学信息与通信工程学院,-10-,4.1.1 数组定义及初始化,注意初始化数组时,给定的初始化数值不能比数组元素多,但可以比数组元素少;如果少,初始化列表中的初始值将从下标0开始依次分配给各元素,后面没有得到初始值的元素被初始化为0。double d10=1.0,2.0;如果使用初始化列表,则表内至少包含一个初始值,否则编译将出现错误。如果没有初始化列表,即只定义不做初始化,一般在函数内部定义的自动局部数组,其各元素的值是随机值,使用时需要重新给数组元素赋值。,2023/9/30,北京邮电大学信息与通信工程学院,-11-,4.1.1 数组定义及初始化,如果在初始化列表中给定数组元素的全部值,可以省略中括号中元素个数常量表示式。上述score数组的初始化也可以写成:int score=80,70,90,95,60;此时,编译器自动计算出数组元素的个数为5,给score数组分配能够存放5个int型数据的连续空间。思考题:如何将一个在某函数内部定义的自动局部数组的所有元素都初始化为0?最简单的方法是什么?,2023/9/30,北京邮电大学信息与通信工程学院,-12-,4.1.1 数组定义及初始化,例4-1 定义各种基本类型的数组并初始化,利用debug调试方式观察数组各元素得到的值、数组占用的空间、数组元素占用的空间。,2023/9/30,北京邮电大学信息与通信工程学院,-13-,2023/9/30,北京邮电大学信息与通信工程学院,-14-,/例4-1数组的定义、初始化,查看数组的大小#include using namespace std;void main()const int N=5;char chArrayN;short int shArrayN=1,2,3,4,5;int iArrayN=10;float fArray=3.1f,4.1f,5.0f;double dArrayN=3.14,6.28;int k;,2023/9/30,北京邮电大学信息与通信工程学院,-15-,for(k=0;kN;k+)coutchArrayk,;coutendl;for(k=0;kN;k+)coutshArrayk,;coutendl;for(k=0;kN;k+)coutiArrayk,;coutendl;for(k=0;k3;k+)coutfArrayk,;coutendl;for(k=0;kN;k+)coutdArrayk,;coutendl;,运行结果:?1,2,3,4,5,10,0,0,0,0,3.1,4.1,5,3.14,6.28,0,0,0,说明符号常量N,用于说明数组的大小;使用符号常量说明数组的大小便于程序修改,如果想让数组的大小为100,只需修改N的值即可,其他语句不需要修改;在多文件结构中,可将一些符号常量的定义放在头文件中,更利于工程的维护和修改。,4.1.2 访问数组元素,数组元素是用下标来区分的,指定要访问的数组元素的语法形式为:数组名下标表达式 下标表达式:可以是常量、变量或表达式,其值大于或等于0,小于数组的大小。例:const int N=8;float angleN;for(int k=0;kN;k+)anglek=3.14f/N*k;/给元素赋值,写操作 coutanglek,;/读取元素值,2023/9/30,北京邮电大学信息与通信工程学院,-16-,4.1.2 访问数组元素,例4-2 将正弦函数的一个周期2分为N等份,定义数组分别存储自变量值和函数值,并显示数组元素的值。,2023/9/30,北京邮电大学信息与通信工程学院,-17-,2023/9/30,北京邮电大学信息与通信工程学院,-18-,/例4-2用数组存储和显示正弦函数一周期内的值#include#include#include using namespace std;void main()const int N=8;double xN;/自变量值 double yN;/函数值 const double PI2=3.14159*2;double delta=PI2/N;coutsetw(8)弧度setw(12)sin(x)endl;for(int k=0;kN;k+)xk=k*delta;yk=sin(xk);coutsetw(10)xk,ykendl;,运行结果:弧度 sin(x)0,0 0.785397,0.707106 1.57079,1 2.35619,0.707108 3.14159,2.65359e-006 3.92699,-0.707104 4.71238,-1 5.49778,-0.70711,4.1.2 访问数组元素,访问数组元素时需要注意(1)数组元素的下标表达式的结果必须为0或正整数。(2)数组元素的下标值不得超过数组声明时所限定的上下界。数组元素下标的下界是0,上界是相应维数大小减1。例:int a10;/a数组可使用的有效下标为09float f50;/f数组可使用的有效下标为049,2023/9/30,北京邮电大学信息与通信工程学院,-19-,4.1.2 访问数组元素,访问数组元素时需要注意(3)越界访问问题如果访问数组元素时,使用的下标不是有效范围内的值,会造成“越界访问”错误。由于编译器在编译程序时不会检查这种错误,所以编辑人员要特别小心,尽可能杜绝这类错误发生。使用面向对象程序设计技术的读者可以定义下标不能越界的数组,也就是C+中的vector类,相关内容可参见附录。,2023/9/30,北京邮电大学信息与通信工程学院,-20-,4.1.3 字符数组,char型的数组称为字符数组,通常用来存储字符串。定义并且初始化字符数组:char chArray=hello world!;,2023/9/30,北京邮电大学信息与通信工程学院,-21-,4.1.3 字符数组,1初始化字符数组两种方法:(1)用双引号内的字符串初始化字符数组例:char array10=hello;可以省略大括号,简化为:char array10=hello;用这种方法初始化时,系统自动在数组最后一个元素后面补0(结束符)。,2023/9/30,北京邮电大学信息与通信工程学院,-22-,4.1.3 字符数组,(2)用字符常量来初始化字符数组例:char array10=h,e,l,l,o,0;该方法将初始值一一列举在初始化列表中,这种方法通常用于输入不容易在键盘上生成的不可见字符。下面的代码中初始化值包含两个制表符。char array10=a,t,b,t,0;注意,此种方式下,编程者要自己添加字符串结束符(0),同时不要忘记为最后的0留出空间。,2023/9/30,北京邮电大学信息与通信工程学院,-23-,4.1.3 字符数组,2字符数组的输入和输出字符数组的输入是给数组各元素赋值的过程在循环中通过cin一个一个地输入通过cin整串输入调用I/O流类的成员函数输入,例如使用getline()函数输入一行字符。char buffer80;for(int k=0;kbufferk;cinbuffer;cin.getline(buffer,80,n);,2023/9/30,北京邮电大学信息与通信工程学院,-24-,4.1.3 字符数组,2字符数组的输入和输出字符数组的输出逐元素输出通过数组名输出。例如,下面的语句输出字符数组buffer中的字符串:coutbuffer;例4-3 从键盘输入一行或多行字符串,用字符数组存储,并统计所输入的字符串中26个字母出现的次数。,2023/9/30,北京邮电大学信息与通信工程学院,-25-,2023/9/30,北京邮电大学信息与通信工程学院,-26-,/例4-3输入26个英文字符的分布统计#include using namespace std;void main()/数组及变量定义;const int N=80;char bufferN;int k=0;const int NUM=26;int countsNUM=0;char lettersNUM;int i=0;,2023/9/30,北京邮电大学信息与通信工程学院,-27-,do/循环输入每一行字符 coutenter a string:n;cin.getline(buffer,N,n);/获得一行输入字符串 k=0;/对于输入的每一行字符,统计字符出现的次数 while(bufferk!=0)i=tolower(bufferk)-a;countsi+;k+;/countstolower(bufferk+)-a+;/用此行可代替前三句 while(buffer0!=0);,2023/9/30,北京邮电大学信息与通信工程学院,-28-,cout0)coutlettersi:countsiendl;,思考题:如何统计一个txt文件中各种字符出现的次数?,2023/9/30,北京邮电大学信息与通信工程学院,-29-,4.1.4 多维数组,1多维数组的定义定义多维数组语法形式如下。二维数组类型标识符 数组名标识符常量表达式1常量表达式2;三维数组类型标识符 数组名标识符常量表达式1常量表达式2常量表达式3;n维数组类型标识符 数组名标识符常量表达式1常量表达式n;,2023/9/30,北京邮电大学信息与通信工程学院,-30-,4.1.4 多维数组,例:bool seat106;/座位 unsigned char image256128;/256行128列图像 float matrix33;/三元一次线性方程组的系数矩阵 char table58;/课表二维数组元素的下标从左至右称为行、列。char book2003240;/书三维数组元素的下标由左至右可称为页、行、列或层、行、列。,2023/9/30,北京邮电大学信息与通信工程学院,-31-,4.1.4 多维数组,在定义多维数组时,需要注意首先要根据所要表示的对象内容,选择合适的数据类型(数组的类型,也就是数组元素的类型);其次确定数组的维数,即几维数组(有几维就有几对中括号);最后确定每一维的大小(中括号内)。特别强调:数组每一维的大小必须用常量表达式声明,否则,编译会出错。这也是C和C+数组的一大缺陷:数组的使用不够灵活。,2023/9/30,北京邮电大学信息与通信工程学院,-32-,4.1.4 多维数组,2多维数组在内存中的映像例:int d15;int d223;int d3232;,2023/9/30,北京邮电大学信息与通信工程学院,-33-,4.1.4 多维数组,2多维数组在内存中的映像一维数组在内存中从数组名所代表的起始地址开始,按下标次序存储;数组d1的第i个元素在内存中的起始位置相对于数组名所代表的地址偏移了i个int型变量空间大小。,2023/9/30,北京邮电大学信息与通信工程学院,-34-,4.1.4 多维数组,2多维数组在内存中的映像二维数组在内存中从数组名所代表的起始地址开始,按行优先依次存储;数组d2的第i行第j列元素在内存中的起始位置相对于数组起始地址偏移了 行号列数+列号个int型变量空间大小。例如,元素d2ij的起始地址计算:&d200+(i 3+j),2023/9/30,北京邮电大学信息与通信工程学院,-35-,4.1.4 多维数组,2多维数组在内存中的映像三维数组在内存中从数组名所代表的起始地址开始,按页、行、列依次存储,即按使数组元素最右边的下标值最快地变化来存储。数组d3的第k页第i行第j列元素在内存中的起始位置相对于数组起始地址偏移了页号(行数列数)+行号列数+列号 个int型变量空间大小。例如,元素d3kij的起始地址为:&d3000+(k32+i2+j)。,2023/9/30,北京邮电大学信息与通信工程学院,-36-,4.1.4 多维数组,3初始化多维数组提供数组元素的全部初始值提供部分元素的初始值这些初始化值位于大括号内,构成初始值列表,多维数组初始化时需要使用嵌套的括号。int a24=4,3,2,1,1,2,3,4;double d34=l.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0;,2023/9/30,北京邮电大学信息与通信工程学院,-37-,4.1.4 多维数组,3初始化多维数组可以省略内层的括号,只要程序好读即可。例如用换行的方式:int a24=4,3,2,1,1,2,3,4;double d34=l.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0;,2023/9/30,北京邮电大学信息与通信工程学院,-38-,4.1.4 多维数组,3初始化多维数组 多维数组的初始化,也可以只给出部分值;例:int a24=4,3;则只有a00、a01分别得到初始值4和3,其余各元素的值为0。可利用此特性将一些用做计数器的多维数组初始化为0。例:定义并初始化二维整型计数器counts:int counts512256=0;这是将多维数组元素置0的最简便方法之一。,2023/9/30,北京邮电大学信息与通信工程学院,-39-,4.1.4 多维数组,4访问多维数组的元素访问多维数组的元素时,只要指定要访问的数组元素的具体下标值即可,语法形式为:数组名下标表达式1下标表达式n 其中,下标表达式的个数同数组维数,“下标表达式i”(1in)可以用常量、变量或表达式,其值大于或等于0,小于数组对应维的大小,即 0下标表达式i的值第i维的大小,2023/9/30,北京邮电大学信息与通信工程学院,-40-,4.1.4 多维数组,例:const int M=8,N=4;char matrixMN;for(int i=0;imatrixij;/给元素赋值,写操作,2023/9/30,北京邮电大学信息与通信工程学院,-41-,4.1.4 多维数组,例4-5 编程实现矩阵转置功能,矩阵行数为M,列数为N,用二维数组表示矩阵。,2023/9/30,北京邮电大学信息与通信工程学院,-42-,2023/9/30,北京邮电大学信息与通信工程学院,-43-,/例4-5矩阵转置#include#include#include using namespace std;void main()const int M=5;const int N=6;int matrixMN;/矩阵 int tMatrixNM;/转置矩阵 srand(unsigned int)time(NULL);int i,j;,2023/9/30,北京邮电大学信息与通信工程学院,-44-,coutmatrix:endl;for(i=0;iM;i+)/生成矩阵 for(j=0;jN;j+)matrixij=rand()%100;/给数组元素赋值 coutsetw(4)matrixij;coutendl;,2023/9/30,北京邮电大学信息与通信工程学院,-45-,couttranspose of matrix:endl;for(i=0;iN;i+)/得到转置矩阵 for(j=0;jM;j+)tMatrixij=matrixji;/给数组元素赋值 coutsetw(4)tMatrixij;coutendl;,4.1.5 数组应用举例,例4-6 40个学生用110的分数评价学生食堂的质量(1表示很差,10表示很好),将40个分数放在整型数组中,并汇总调查结果。,2023/9/30,北京邮电大学信息与通信工程学院,-46-,2023/9/30,北京邮电大学信息与通信工程学院,-47-,/例4-6 汇总评分结果#include#include using namespace std;void main()const int cStuNum=40;/学生人数 const int cScoreNum=11;/分数个数 int scorecStuNum=1,2,6,4,8,5,9,7,8,10,1,6,3,8,6,10,3,8,2,6,6,5,6,8,7,7,5,5,6,7,4,6,8,10,3,1,2,7,9,6;/全部分数 int countscScoreNum=0;/分数统计计数器,初始化为0,2023/9/30,北京邮电大学信息与通信工程学院,-48-,int k;for(int k=0;kcStuNum;k+)/统计分数 counts score k+;coutscoresetw(10)countsendl;for(k=1;kcScoreNum;k+)/输出结果 coutsetw(6)ksetw(10)countskendl;,4.1.5 数组应用举例,例4-7 编程实现计算两个N阶方阵乘积矩阵的功能,矩阵元素为整形,N=5。,2023/9/30,北京邮电大学信息与通信工程学院,-49-,2023/9/30,北京邮电大学信息与通信工程学院,-50-,/例4-7求两个N阶方阵乘积矩阵#include#include#include using namespace std;void main()const int N=5;int aNN,bNN;/两个相乘的矩阵 int cNN=0;/乘积矩阵 int i,j,k;srand(unsigned int)time(NULL);/生成矩阵a和b for(i=0;iN;i+)/行循环 for(j=0;jN;j+)/列循环 aij=rand()%100;bij=rand()%100;,2023/9/30,北京邮电大学信息与通信工程学院,-51-,/显示矩阵a,再显示矩阵b coutmatrix a:endl;for(i=0;iN;i+)for(j=0;jN;j+)coutsetw(5)aij;coutendl;coutmatrix b:endl;for(i=0;iN;i+)for(j=0;jN;j+)coutsetw(5)bij;coutendl;,2023/9/30,北京邮电大学信息与通信工程学院,-52-,/计算乘积矩阵c,并显示 for(i=0;iN;i+)for(j=0;jN;j+)for(k=0;kN;k+)/求c的一个元素 cij+=aik*bkj;coutmatrix c:endl;for(i=0;iN;i+)for(j=0;jN;j+)coutsetw(10)cij;coutendl;,4.1.5 数组应用举例,例4-8 给定二维数组,编程计算元素的均值和方差。,2023/9/30,北京邮电大学信息与通信工程学院,-53-,2023/9/30,北京邮电大学信息与通信工程学院,-54-,/例4-8计算一组数据的均值和方差#include#include#include using namespace std;void main()const int ROWS=20;const int COLS=10;int matrixROWSCOLS=0;int row,col;srand(unsigned)time(NULL);for(row=0;rowROWS;row+)/生成数据 for(col=0;colCOLS;col+)matrixrowcol=rand()%100;coutsetw(4)matrixrowcol,;coutendl;,2023/9/30,北京邮电大学信息与通信工程学院,-55-,/统计均值 float mean(0),var(0);for(row=0;row0)mean/=size;else mean=0;,2023/9/30,北京邮电大学信息与通信工程学院,-56-,/统计方差 for(row=0;row0)var/=size;else var=0;/显示统计结果 coutmean=mean;stdvar=varendl;,4.2 枚 举 类 型,C+语言不仅有丰富的基本数据类型,而且允许用户自己定义数据类型。枚举、结构、联合都属于自定义类型,2023/9/30,北京邮电大学信息与通信工程学院,-57-,2023/9/30,北京邮电大学信息与通信工程学院,-58-,4.2.1 枚举类型定义,枚举型数据类型(简称枚举类型)有些问题中所处理数据的取值可以一一列举出来例:一周七天:星期日、星期1、星期2、星期3、星期4、星期5、星期6定义一种数据类型,一一列举这种数据类型的变量的可能值,称为枚举类型,声明形式为:enum 枚举类型名枚举元素列表;可以使用这种自定义数据类型来定义变量。,4.2.2 枚举变量定义及使用,例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;weekday day;/定义一个weekday类型的变量:变量day的取值范围:类型定义时,表里列举出来的七种标识符,把这些标识符看作符号常量。例如:day=sat;枚举常量在机器内部仍然是用整型数来存取定义某个枚举类型的变量时,分配几个字节的内存空间呢?,2023/9/30,北京邮电大学信息与通信工程学院,-59-,自定义的数据类型,枚举元素或枚举常量,2023/9/30,北京邮电大学信息与通信工程学院,-60-,使用枚举类型注意:enum weekdaysun,mon,tue,wed,thu,fri,sat;在类型定义之后,对枚举元素按常量处理,不能对它们赋值。sat=6;枚举元素具有默认值,它们依次为:0,1,2,。也可以在类型声明时另行指定枚举元素的值。enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat,4.2.2 枚举变量定义及使用,2023/9/30,北京邮电大学信息与通信工程学院,-61-,使用枚举类型注意:枚举值可以进行关系运算。整数值不能直接赋给枚举变量;如需要将整数值赋给枚举变量,应进行强制类型转换.例:int x=2;weekday day;day=x;?day=(weekday)x;?,4.2.2 枚举变量定义及使用,2023/9/30,北京邮电大学信息与通信工程学院,-62-,例4-9,读入1-7之间的一个数代表今天,输出明天是星期几。,#include using namespace std;enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;void main()coutn;weekday today=(weekday)n;weekday tomorrow=(weekday)(today+1)%7);tomorrow=0?sun:tomorrow;switch(tomorrow)case sun:coutTomorrow is Sunday.endl;break;case mon:coutTomorrow is Monday.endl;break;,case tue:coutTomorrow is Tuesday.endl;break;case wed:coutTomorrow is Wednesday.endl;break;case thu:coutTomorrow is Thursday.endl;break;case fri:coutTomorrow is Friday.endl;break;case sat:coutTomorrow is Saturday.endl;break;default:coutinput error!endl;,2023/9/30,北京邮电大学信息与通信工程学院,-65-,例:,口袋中有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出3个不同颜色的球,问有多少种取法。,分析:由于球只能是五种颜色之一,故可用枚举类型表示球的颜色。设取出的球为i、j、k,根据题意,i、j、k分别可以有五种取值,且ijk。可以用穷举法,逐个检验每一种可能的组合,从中找出符合要求的组合并输出。,#includeenum colorred,yellow,blue,white,black;void main()enum color print;int n,loop,i,j,k;char c;n=0;for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)/前两个球不同 for(k=red;k=black;k+),if(k!=i),switch(print)case red:coutred;break;case yellow:coutyellow;break;case blue:coutblue;break;case white:coutwhite;break;case black:coutblack;break;default:break;/end of for loop coutendl;/end of if/end of if couttotal:nendl;,4.3 结 构 类 型,结构类型 把现实生活中意义密切相关的一组数据组合成一个整体,即由各种数据类型(可以是基本数据类型或已声明的自定义数据类型)的数据组成一个集合,称为结构类型。例如,一个学生的学号、姓名、年龄、成绩等,虽然分别属于不同的数据类型,但它们之间是密切相关的,因为每一组信息属于一个人。,2023/9/30,北京邮电大学信息与通信工程学院,-69-,2023/9/30,北京邮电大学电信工程学院计算机技术中心,-70-,结构类型的定义结构的声明形式:struct 结构类型名 数据类型标识符1 成员名1;数据类型标识符2 成员名2;数据类型标识符n 成员名n;;,4.3.1 结构类型的定义和初始化,struct student long num;/学号 char name20;/姓名 char sex;/性别 int age;/年龄 float score;/成绩 char addr30;/住址;/必须以分号结束结构的定义,2023/9/30,北京邮电大学信息与通信工程学院,-71-,2结构成员的访问定义结构类型的变量:结构类型名 结构变量名;例:定义student类型的变量:student s1;,4.3.1 结构类型的定义和初始化,2023/9/30,北京邮电大学电信工程学院计算机技术中心,-72-,结构类型的变量所占的存储空间是结构中所有成员所占空间的总和 例 sizeof(student)=sizeof(long)+20*sizeof(char)+sizeof(char)+sizeof(int)+sizeof(float)+30*sizeof(char)sizeof(s1)=sizeof(student),结构类型的变量所占的存储空间,考虑到对齐的要求,系统会将占空间不是4的倍数的成员空间调整为4的倍数:将成员sex调整为4字节,将成员addr调整为32字节,总共占用68字节。,2023/9/30,北京邮电大学信息与通信工程学院,-73-,结构成员的访问:结构变量名.成员名例:student s1;s1.num=1;couts1.numendl;couts1.nameendl;,如同使用一个变量,如同使用一个数组,访问结构成员,2023/9/30,北京邮电大学信息与通信工程学院,-74-,3结构变量的初始化定义结构变量时直接初始化 student s2=20041118,”Li Li”,18,90;分别给各个成员赋值 student s1;s1.num=20041118;strcpy(s1.name,“Li Li”);,4.3.1 结构类型的定义和初始化,例4-10 结构类型的声明,变量的定义和初始化#include#include using namespace std;struct student/声明新的数据类型 long num;/学号 char name20;/姓名 char sex;/性别 int age;/年龄stu=20041118,Li Li,F,18;void main()coutsetw(8)stu.numsetw(10)stu.name setw(3)stu.sexsetw(3)stu.ageendl;运行结果:20041118 Li Li F 18,2023/9/30,北京邮电大学信息与通信工程学院,-76-,结构体可以由不同数据类型的成员构成,这些成员可能是基本数据类型,也可能是自定义的数据类型,例如已声明的另一个结构类型。例4-11 访问带有结构体类型成员的结构体变量。,2023/9/30,北京邮电大学信息与通信工程学院,-77-,/例4-11结构体定义的嵌套#include using namespace std;struct dateint year;int month;int day;,struct Weather date today;double temp;/温度 double wind;/风力,2023/9/30,北京邮电大学电信工程学院计算机技术中心,-78-,void main()Weather today_weather=2004,11,30,10.0,3.1;couttoday_weather.today.year年 today_weather.today.month月 today_weather.today.day日的天气是:;cout 温度:today_weather.temp;cout 度,风力:today_weather.wind 级 endl;运行结果:2004年11月30日的天气是:温度:10度,风力:3.1级,2023/9/30,北京邮电大学信息与通信工程学院,-79-,4结构的赋值运算属于同一结构类型的各个变量之间可以相互赋值。这一点和数组不同,C+规定,不能直接进行数组名的赋值,因为数组名是一个常量,而结构类型的变量可以赋值。不同结构的变量不允许相互赋值。即使这两个变量可能具有同样的成员。,4.3.1 结构类型的定义和初始化,2023/9/30,北京邮电大学信息与通信工程学院,-80-,例:struct student int num;char name20;s1=1,”zhang”,s2=2.”zhao”;student si;si=s1;,例:struct person int ID;char name20;p1=1,”zhang”,p2=2.”zhao”;person pi;pi=p1;,pi=s1;/?si=p1;/?,2023/9/30,北京邮电大学信息与通信工程学院,-81-,结构类型的一些复杂的用法包括:结构数组结构指针用结构传递函数参数用结构作为函数的返回值类型,4.3.2 结构数组,2023/9/30,北京邮电大学信息与通信工程学院,-82-,结构数组 格式:结构名 数组名常量表达式;结构数组的元素 结构数组的每个元素都是该结构类型的变量。,4.3.2 结构数组,例:struct student char name15;int num;int score;,student s30;for(i=0;isi.name;cinsi.num;cinsi.score;,2023/9/30,北京邮电大学电信工程学院计算机技术中心,-83-,#include using namespace std;struct Employee char name20;unsigned long id;float salary;,例4-12 公司有六个员工,把他们按工资由低到高排序。,Employee allone6=zhang,12345,3390.0,wang,13916,4490.0,zhou,27519,3110.0,meng,42876,6230.0,yang,23987,4000.0,chen,12335,5110.0;,2023/9/30,北京邮电大学信息与通信工程学院,-84-,void main()Employee temp;for(int i=1;i allonej+1.salary)temp=allonej;/结构变量的交换 allonej=allonej+1;allonej+1=temp;for(int k=0;k6;k+)/输出 cout allonek.name allonek.id allonek.salaryendl;,运行结果:zhou 27519 3110 zhang 12345 3390 yang 23987 4000 wang 13916 4490 chen 12335 5110 meng 42876 6230,4.4 联 合 类 型,有时需要使几个不同类型的变