收藏 分销(赏)

第7部分自定义数据类型.ppt

上传人:精*** 文档编号:12805538 上传时间:2025-12-08 格式:PPT 页数:74 大小:847.54KB 下载积分:16 金币
下载 相关 举报
第7部分自定义数据类型.ppt_第1页
第1页 / 共74页
第7部分自定义数据类型.ppt_第2页
第2页 / 共74页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版副标题样式,第7章 自定义数据类型,7.1,结构体类型,7.2 共用体,7.3 枚举类型,7.4 用,typedef,声明类型,C+,提供了许多种基本的数据类型(如,int、float、double、char,等)供用户使用。但是由于程序需要处理的问题往往比较复杂,而且呈多样化,已有的数据类型显得不能满足使用要求。因此,C+,允许用户根据需要自己声明一些类型,例如第5章介绍的数组就是用户自己声明的数据类型。此外,用户可以自己声明的类型还有结构体(,structure),类型、共用体(,union),类型、枚举(,enumeration),类型、类(,class),类型等,这些统称为用户自定义类型(,user-defined type,UDT)。,本章介绍结构体类型、共用体类型和枚举类型,第8章将介绍类类型。,有时需要将不同类型的数据组合成一个有机的整体,以供用户方便地使用。这些组合在一个整体中的数据是互相联系的。例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,都是这个学生的属性。见图7.1。,图7.1,7.1 结构体类型,7.1.1 结构体概述,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。和,C+,允许用户自己指定这样一种数据类型,它称为结构体。它相当于其他高级语言中的记录(,record)。,例如,可以通过下面的声明来建立如图7.1所示的数据类型。,struct Student /,声明一个结构体类型,Student,int num;/,包括一个整型变量,num,char name20;/,包括一个字符数组,name,,可以容纳20个字符,char sex;/,包括一个字符变量,sex,int age;/,包括一个整型变量,age,float score;/,包括一个单精度型变量,char addr30;/,包括一个字符数组,addr,,可以容纳30个字符,;/最后有一个分号,这样,程序设计者就声明了一个新的结构体类型,Student(struct,是声明结构体类型时所必须使用的关键字,不能省略),它向编译系统声明:这是一种结构体类型,它包括,num,name,sex,age,score,addr,等不同类型的数据项。应当说明,Student,是一个类型名,它和系统提供的标准类型(如,int、char、float、double,等)一样,都可以用来定义变量,只不过结构体类型需要事先由用户自己声明而已。,声明一个结构体类型的一般形式为,struct,结构体类型名,成员表列;,前面只是指定了一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。,1.定义结构体类型变量的方法,可以采取以下3种方法定义结构体类型的变量。,(1)先声明结构体类型再定义变量名,如上面已定义了一个结构体类型,Student,,可以用它来定义结构体变量。如,Student student1,student2;,7.1.2 结构体类型变量的定义方法及其初始化,以上定义了,student1,和,student2,为结构体类型,Student,的变量,即它们具有,Student,类型的结构。如图7.2所示。,图7.2,在定义了结构体变量后,系统会为之分配内存单元。例如,student1,和,student2,在内存中各占63个字节(4+20+1+4+4+30=63)。,(2)在声明类型的同时定义变量,例如:,struct Student /,声明结构体类型,Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,student1,student2;/,定义两个结构体类型,Student,的变量,student1,student2,这种形式的定义的一般形式为,struct,结构体名,成员表列,变量名表列;,(3)直接定义结构体类型变量,其一般形式为,struct /,注意没有结构体类型名,成员表列,变量名表列;,这种方法虽然合法,但很少使用。提倡先定义类型后定义变量的第(1)种方法。在程序比较简单,结构体类型只在本文件中使用的情况下,也可以用第(2)种方法。,关于结构体类型,有几点要说明:,(1)不要误认为凡是结构体类型都有相同的结构。实际上,每一种结构体类型都有自己的结构,可以定义出许多种具体的结构体类型。,(2)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。在编译时,是不会为类型分配空间的,只为变量分配空间。,(3)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。关于对成员的引用方法见7.3节。,(4)成员也可以是一个结构体变量。,如,struct Date /,声明一个结构体类型,Date,int month;,int day;,int year;,;,struct Student /,声明一个结构体类型,Student,int num;,char name20;,char sex;,int age;,Date birthday;/Date,是结构体类型,,birthday,是,Date,类型的成员,char addr30;,student1,student2;/,定义,student1,和,student2,为结构体类型,Student,的变量,Student,的结构见图7.3所示。,图7.3,(5)结构体中的成员名可以与程序中的变量名相同,但二者没有关系。例如,程序中可以另定义一个整型变量,num,它与,student,中的,num,是两回事,互不影响。,2.结构体变量的初始化,和其他类型变量一样,对结构体变量可以在定义时指定初始值。如,struct Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,student1=10001,Zhang Xin,M,19,90.5,Shanghai;,这样,变量,student1,中的数据如图7.2中所示。,也可以采取声明类型与定义变量分开的形式,在定义变量时进行初始化:,Student student2=10002,Wang Li,F,20,98,Beijing;,/Student,是已声明的结构体类型,在定义了结构体变量以后,当然可以引用这个变量。,(1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。如上面的,student1,和,student2,都是,student,类型的变量,可以这样赋值:,student1=student2;,(2),可以引用一个结构体变量中的一个成员的值。例如,,student1.num,表示结构体变量,student1,中的成员的值,如果,student1,的值如图7.2所示,则,student1.num,的值为10001。,引用结构体变量中成员的一般方式为,结构体变量名.成员名,7.1.3 结构体变量的引用,例如可以这样对变量的成员赋值:,student1.num=10010;,(3),如果成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。例如,对上面定义的结构体变量,student1,可以这样访问各成员:,student1.num (,引用结构体变量,student1,中的,num,成员),如果想引用,student1,变量中的,birthday,成员中的,month,成员,不能写成,student1.month,,必须逐级引用,即,student1.birthday.month (,引用结构体变量,student1,中的,birthday,成员中的,month,成员),(4)不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义,student1,和,student2,为结构体变量,并且它们已有值。不能企图这样输出结构体变量中的各成员的值:,coutstudent1;,只能对结构体变量中的各个成员分别进行输入和输出。,(5)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算种类)。例如,student2.scorestudent1.score;,sumstudent1.scorestudent2.score;,student1.age+;,+student1.age;,由于“.”运算符的优先级最高,因此,student1.age+,相当于(,student1.age)+。+,是对,student1.age,进行自加运算,而不是先对,age,进行自加运算。,(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如,cout /,输出,student1,的首地址,cout /,输出,student1.age,的地址,结构体变量的地址主要用作函数参数,将结构体变量的地址传递给形参。,例7.1 引用结构体变量中的成员。,#,include,using namespace std;,struct Date /,声明结构体类型,Date,int month;,int day;,int year;,;,struct Student /,声明结构体类型,Student,int num;,char name20;,char sex;,Date birthday;/,声明,birthday,为,Date,类型的成员,float score;,student1,student2=10002,Wang Li,f,5,23,1982,89.5;,/,定义,Student,类型的变量,student1,student2,,并对,student2,初始化,int main(),student1=student2;/,将,student2,各成员的值赋予,student1,的相应成员,coutstudent1.numendl;/,输出,student1,中的,num,成员的值,coutstudent1.nameendl;/,输出,student1,中的,name,成员的值,coutstudent1.sexendl;/,输出,student1,中的,sex,成员的值,coutstudent1.birthday.month/student1.birthday.day/,student1.birthday.yearendl;/,输出,student1,中的,birthday,各成员的值,coutstudent1.scoreendl;,return 0;,运行结果如下:,10002,Wang Li,f,5/23/1982,89.5,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。,7.1.4 结构体数组,1.定义结构体数组,和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如,struct Student /,声明结构体类型,Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,Student stu3;/,定义,Student,类型的数组,stu,也可以直接定义一个结构体数组,如,struct Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu3;,或,struct,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu3;,见图7.4。数组各元素在内存中连续存放,见图7.5示意。,图7.图7.5,2.结构体数组的初始化,与其他类型的数组一样,对结构体数组可以初始化。如,struct Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,sty3=10101,Li Lin,M,18,87.5,103 Beijing Road,10102,Zhang Fun,M,19,99,130 Shanghai Road,10104,Wang Min,F,20,78.5,1010,Zhongshan Road;,定义数组,stu,时,也可以不指定元素个数,即写成以下形式:,stu=,;,编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。一个结构体常量应包括结构体中全部成员的值。,当然,数组的初始化也可以用以下形式:,Student stu=,;/,已事先声明了结构体类型,Student,由上可以看到,结构体数组初始化的一般形式是在所定义的数组名的后面加上,=初值表列;,3.结构体数组应用举例,下面举一个简单的例子来说明结构体数组的定义和引用。,例7.2 对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。,可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。,程序如下:,#,include,struct Person /,声明结构体类型,Person,char name20;,int count;,;,int main(),Person leader3=Li,0,Zhang,0,Fun,0;,/,定义,Person,类型的数组,内容为3个候选人的姓名和当前的得票数,int i,j;,char leader_name20;/leader_name,为投票人所选的人的姓名,for(i=0;ileader_name;/,先后输入10张票上所写的姓名,for(j=0;j3;j+)/,将票上姓名与3个候选人的姓名比较,if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;,/,如果与某一候选人的姓名相同,就给他加一票,coutendl;,for(i=0;i3;i+)/,输出3个候选人的姓名与最后得票数,coutleaderi.name:leaderi.countendl;,return 0;,运行情况如下:,Zhang,(,每次输入一个候选人的姓名),Li,Fun,Li,Zhang,Li,Zhang,Li,Fun,Wang,Li:4 (,输出3个候选人的姓名与最后得票数),Zhang:3,Fun:2,程序定义一个全局的结构体数组,leader,它有3个元素,每一元素包含两个成员,即,name(,姓名)和,count(,得票数)。在定义数组时使之初始化,使3位候选人的票数都先置零。见图7.6。,图7.6,在这个例子中,也可以不用字符数组而用,string,方法的字符串变量来存放姓名数据,程序可修改如下:,#,include,#include,using namespace std;,struct Person,string name;/,成员,name,为字符串变量,int count;,;,int main(),Person leader3=Li,0,Zhang,0,Fun,0;,int i,j;,string leader_name;/leader_name,为字符串变量,for(i=0;ileader_name;,for(j=0;j3;j+),if(leader_name=leaderj.name)leaderj.count+;/,用“=”进行比较,coutendl;,for(i=0;i3;i+),coutleaderi.name:leaderi.countendl;,return 0;,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。,1.通过指向结构体变量的指针引用结构体变量中的成员,下面通过一个简单例子来说明指向结构体变量的指针变量的应用。,7.1.5 指向结构体变量的指针,例7.3 指向结构体变量的指针的应用。,#,include,#include,using namespace std;,int main(),struct Student /,声明结构体类型,student,int num;,string name;,char sex;,float score;,;,Student stu;/,定义,Student,类型的变量,stu,Student*p=/,定义,p,为指向,Student,类型数据的指针变量并指向,stu,stu.num=10301;/,对,stu,中的成员赋值,stu.name=Wang Fun;/,对,string,变量可以直接赋值,stu.sex=f;,stu.score=89.5;,cotstu.num stu.name stu.sex stu.scoreendl;,coutnum(*p).name(*p).sex(*p).score,例如,p-num,表示指针,p,当前指向的结构体变量中的成员,num。p-num,和(*,p).num,等价。同样,,p-name,等价于(*,p).name。,也就是说,以下3种形式等价:,结构体变量.成员名。如,stu.num。,(*p).,成员名。如(*,p).num。,p-,成员名。如,p-num。“-”,称为指向运算符。,请分析以下几种运算:,p-n,得到,p,指向的结构体变量中的成员,n,的值。,p-n+,得到,p,指向的结构体变量中的成员,n,的值,用完该值后使它加1。,+,p-n,得到,p,指向的结构体变量中的成员,n,的值,并使之加1,然后再使用它。,2.用结构体变量和指向结构体变量的指针构成链表,链表是一种常见的重要的数据结构。图7.8表示最简单的一种链表(单向链表)的结构。,图7.8,链表有一个“头指针”变量,图中以,head,表示,它存放一个地址。该地址指向一个元素。链表中的每一个元素称为“结点”,每个结点都应包括两个部分:一是用户需要用的实际数据,二是下一个结点的地址。,可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。,可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。例如,可以设计这样一个结构体类型:,struct Student,int num;,float score;,Student*next;/next,指向,Student,结构体变量,;,其中成员,num,和,score,是用户需要用到的数据,相当于图7.8结点中的,A,B,C,D。next,是指针类型的成员,它指向,Student,类型数据(就是,next,所在的结构体类型)。用这种方法就可以建立链表。见图7.9。,图7.9,图中每一个结点都属于,Student,类型,在它的成员,next,中存放下一个结点的地址,程序设计者不必知道各结点的具体地址,只要保证能将下一个结点的地址放到前一结点的成员,next,中即可。,下面通过一个例子来说明如何建立和输出一个简单链表。,例7.4 建立一个如图7.9所示的简单链表,它由3个学生数据的结点组成。输出各结点中的数据。,#,define NULL 0,#include,struct Student,long num;,float score;,struct Student*next;,;,int main(),Student a,b,c,*head,*p;,a.num=31001;a.score=89.5;/,对结点,a,的,num,和,score,成员赋值,b.num=31003;b.score=90;/,对结点,b,的,num,和,score,成员赋值,c.num=31007;c.score=85;/,对结点,c,的,num,和,score,成员赋值,head=/,将结点,a,的起始地址赋给头指针,head,a.next=/,将结点,b,的起始地址赋给,a,结点的,next,成员,b.next=/,将结点,c,的起始地址赋给,b,结点的,next,成员,c.next=NULL;/,结点的,next,成员不存放其他结点地址,p=head;/,使,p,指针指向,a,结点,do,coutnumscorenext;/,使,p,指向下一个结点,while(p!=NULL);/,输出完,c,结点后,p,的值为,NULL,return 0;,请读者考虑:各个结点是怎样构成链表的。,p,起什么作用?,本例是比较简单的,所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。对各结点既可以通过上一个结点的,next,指针去访问,也可以直接通过结构体变量名,a,b,c,去访问。,动态链表则是指各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一个结点,才能根据它提供的下一结点的地址找到下一个结点。只有提供第一个结点的地址,即头指针,head,,才能访问整个链表。如同一条铁链一样,一环扣一环,中间是不能断开的。建立动态链表,要用到下面7.1.7小节介绍的动态分配内存的运算符,new,和动态撤销内存的运算符,delete。,将一个结构体变量中的数据传递给另一个函数,有下列3种方法:,(1)用结构体变量名作参数。一般较少用这种方法。,(2)用指向结构体变量的指针作实参,将结构体变量的地址传给形参。,(3)用结构体变量的引用变量作函数参数。,下面通过一个简单的例子来说明,并对它们进行比较。,例7.5 有一个结构体变量,stu,,内含学生学号、姓名和3门课的成绩。要求在,main,函数中为各成员赋值,在另一函数,print,中将它们的值输出。,7.1.6 结构体类型数据作为函数参数,(1)用结构体变量作函数参数,#,include,#include,using namespace std;,struct Student /,声明结构体类型,Student,int num;,char name20;,float score3;,;,int main(),void print(Student);/,函数声明,形参类型为结构体,Student,Student stu;/,定义结构体变量,stu.num=12345;/,以下5行对结构体变量各成员赋值,stu.name=Li Fung;,stu.score0=67.5;,stu.score1=89;,stu.score2=78.5;,print(stu);/,调用,print,函数,输出,stu,各成员的值,return 0;,void print(Student stu),coutstu.num stu.name stu.score0,stu.score1 stu.score2endl;,运行结果为,12345,Li Fung 67.5 89 78.5,(2),用指向结构体变量的指针作实参,在上面程序的基础上稍作修改即可。,#,include,#include,using namespace std;,struct Student,int num;,string name;/,用,string,类型定义字符串变量,float score3;,stu=12345,Li Fung,67.5,89,78.5;/,定义结构体,student,变量,stu,并赋初值,int main(),void print(Student*);/,函数声明,形参为指向,Student,类型数据的指针变量,Student*pt=/,定义基类型为,Student,的指针变量,pt,,并指向,stu,print(pt);/,实参为指向,Student,类数据的指针变量,return 0;,void print(Student*p)/,定义函数,形参,p,是基类型为,Student,的指针变量,coutnumnamescore0,score1score2endl;,调用,print,函数时,实参指针变量,pt,将,stu,的起始地址传送给形参,p(p,也是基类型为,student,的指针变量)。这样形参,p,也就指向,stu,,见图7.10。在,print,函数中输出所指向的结构体变量的各个成员值,它们也就是,stu,的成员值。,在,main,函数中也可以不定义指针变量,pt,,而在调用,print,函数时以&,stu,作为实参,把,stu,的起始地址传给实参,p。,图7.10,(3),用结构体变量的引用作函数参数,#,include,#include,using namespace std;,struct Student,int num;,string name;,float score3;,stu=12345,Li Li,67.5,89,78.5;,int main(),void print(Student /,函数声明,形参为,Student,类型变量的引用,print(stu);/,实参为结构体,Student,变量,return 0;,void print(Student&stud)/,函数定义,形参为结构体,Student,变量的引用,coutstud.num stud.name stud.score0,stud.score1 stud.score2name=Wang Fun;/,向结构体变量的成员赋值,p-num=10123;,p-sex=m;,coutnamenumsexendl;/,输出各成员的值,delete p;/,撤销该空间,return 0;,运行结果为,Wang Fun,10123,m,图7.11,在动态分配/撤销空间时,往往将这两个运算符和结构体结合使用,是很有效的。,可以看到:要访问用,new,所开辟的结构体空间,无法直接通过变量名进行,只能通过指针,p,进行访问。如果要建立一个动态链表,必须从第一个结点开始,逐个地开辟结点并输入各结点数据,通过指针建立起前后相链的关系。,有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中(见图7.12)。,图7.12,7.2 共用体,7.2.1 共用体的概念,以上3个变量在内存中占的字节数不同,但都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为共用体(,union),类型的结构(有些书译为联合)。,声明共用体类型的一般形式为,union,共用体类型名,成员表列,;,定义共用体变量的一般形式为,共用体类型名 共用体变量名;,当然也可在声明共用体类型的同时定义共用体变量,也可没有共用体类型名而直接定义共用体变量。,例如,可以看到,“共用体”与“结构体”的定义形式相似。但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。,union data,int i;,char ch;,double d;,a,b,c;,(,有共用体类型名),union,int i;,char ch;,double d;,a,b,c;,(,无共用体类型名),不能引用共用体变量,而只能引用共用体变量中的成员。例如,下面的引用方式是正确的:,a.i(,引用共用体变量中的整型成员,i),a.ch(,引用共用体变量中的字符型成员,ch),a.f(,引用共用体变量中的双精度型成员,d),不能只引用共用体变量,例如,couta;,是错误的,应该写成,couta.i;,或,couta.ch;,等。,7.2.2 对共用体变量的访问方式,(1)使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意:在每一瞬时只能存放其中一种,而不是同时存放几种。,(2)能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。,(3)共用体变量的地址和它的各成员的地址都是同一地址。,(4)不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。,7.2.3 共用体类型数据的特点,例7.7 设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、年级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中,见图7.13。,图7.13,如果,job,项为,s(,学生),则第5项为,grade(,年级)。即,Li,是3年级的。如果,job,项是,t(,教师),则第5项为,position(,职务)。,Wang,是,prof(,教授)。显然对第5项可以用共用体来处理(将,class,和,position,放在同一段内存中)。,要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。,程序如下:,#,include,#include,#include /,因为在输出流中使用了控制符,setw,using namespace std;,struct,int num;,char name10;,char sex;,char job;,union P /,声明共用体类型,int grade;/,年级,char position10;/,职务,category;/,成员,category,为共用体变量,person2;/,定义共用体数组,person,,含两个元素,int main(),int i;,for(i=0;ipersoni.numpersoni.namepersoni.sexpersoni.job;,if(personi.job=s)cinpersoni.category.grade;/,若是学生则输入年级,else if(personi.job=t)cinpersoni.category.position;/,若是教师则输入职务,coutendlNo.Name sex job grade/positionendl;,for(i=0;i2;i+),if(personi.job=s),coutpersoni.numsetw(6)personi.name personi.sex,personi.jobsetw(10)personi.category.gradeendl;,else,coutpersoni.numsetw(6)personi.name personi.sex,personi.jobsetw(10)personi.category.positionendl;,return 0;,运行情况如下:,101,Li fs 3,(,注意在输入的字母,f,和,s,之间无空格),102,Wang mt prof,(,注意在输入的字母,m,和,t,之间无空格),No.Namesexjobgrade/position,101 Li f s 3,102 Wang m t prof,为了使输出结果上下对齐,在,cout,语句中用了,setw,控制符和插入空格。往往需要试验多次。,如果一个变量只有几种可能的值,可以定义为枚举(,enumeration),类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。,声明枚举类型用,enum,开头。例如,enum weekdaysun,mon,tue,wed,thu,fri,sat;,上面声明了一个枚举类型,weekday,,花括号中,sun,mon,sat,等称为枚举元素或枚举常量。表示这个类型的变量的值只能是以上7个值之一。它们是用户自己定义的标识符。,声明枚举类型的一般形式为,7.3 枚举类型,enum,枚举类型名 枚举常量表列;,在声明了枚举类型之后,可以用它来定义变量。如,weekday workday,week_end;,这样,,workday,和,week_end,被定义为枚举类型,weekday,的变量。,在,C,语言中,枚举类型名包括关键字,enum,,以上的定义可以写为,enum weekday,workday,week_end;,在,C+,中允许不写,enum,,一般也不写,enum,,但保留了,C,的用法。,根据以上对枚举类型,weekday,的声明,枚举变量的值只能是,sun,到,sat,之一。例如,workday=mon;,week_end=sun;,是正确的。也可以直接定义枚举变量,如,enumsun,mon,tue,wed,thu,fri,sat workday,week_end;,这些标识符并不自动地代表什么含义。,说明:,(1)对枚举元素按常量处理,故称枚举常量。,(2)枚举元素作为常量,它们是有值的,,C+,编译按定义时的顺序对它们赋值为0,1,2,3,。也可以在声明枚举类型时另行指定枚举元素的值。,(3)枚举值可以用来做判断比较。,(4)一个整数不能直接赋给一个枚举变量。,例7.8 口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。,#,include,#include /,在输出时要用到,setw,控制符,using namespace std;,int main(),enum color red,yellow,blue,white,black;/,声明枚举类型,color,color pri;/,定义,color,类型的变量,pri,int i,j,k,n=0,loop;/n,是累计不同颜色的组合数,for(i=red;i=black;i+)/,当,i,为某一颜色时,for(j=red;j=black;j+)/,当,j,为某一颜色时,if(i!=j)/,若前两个球的颜色不同,for(k=red;k=black;k+)/,只有前两个球的颜色不同,才需要检查第3个球的颜色,if(k!=i)&(k!=j)/3,个球的颜色都不同,n=n+1;/,使累计值,n,加1,coutsetw(3)n;/,输出当前的,n,值,字段宽度为3,for(loop=1;loop=3;loop+)/,先后对3个球作处理,switch(loop)/loop,的值先后为1,2,3,case 1:pri=color(i);break;/color(i),是强制类型转换,使,pri,的值为,i,case 2:pri=color(j);break;/,使,pri,的值为,j,case 3:pri=color(k);break;/,使,pri,的值为,k,default:break;,switch(pri)/,判断,pri,的值,输出相应的“颜色”,case red:coutsetw(8)red;break;,case yellow:coutsetw(8)yellow;break;,case blue:coutsetw(8)blue;break;,case white:coutsetw(8)white;break;,case black:coutsetw(8)black;break;,default :break;,coutendl;,couttotal:nendl;/,输出符合条件的组合的个数,return 0;,运行结果如下:,1,red
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服