例7.1 引用结构体变量中的成员。
#include <iostream>
usingnamespacestd;
structDate //声明结构体类型Date
{intmonth;
intday;
intyear;
};
structStudent //声明结构体类型Student
{intnum;
charname[20];
charsex;
Date birthday; //声明birthday为Date类型的成员
floatscore;
}student1,student2={10002,"Wang Li",'f',5,23,1982,89.5};
//定义Student 类型的变量student1,student2,并对student2初始化
intmain( )
{ student1=student2; //将student2各成员的值赋予student1的相应成员
cout<<student1.num<<endl; //输出student1中的num成员的值
cout<<student1.name<<endl; //输出student1中的name成员的值
cout<<student1.sex<<endl; //输出student1中的sex成员的值
cout<<student1.birthday.month<<'/'<<student1.birthday.day<<'/'
<<student1.birthday.year<<endl; //输出student1中的birthday各成员的值
cout<<student1.score<<endl;
return0;
}
例7.2 对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。
可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。
程序如下:
#include <iostream>
structPerson //声明结构体类型Person
{ charname[20];
intcount;
};
intmain( )
{ Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
//定义Person类型的数组,内容为3个候选人的姓名和当前的得票数
inti,j;
charleader_name[20]; //leader_name为投票人所选的人的姓名
for(i=0;i<10;i++)
{cin>>leader_name; //先后输入10张票上所写的姓名
for(j=0;j<3;j++) //将票上姓名与3个候选人的姓名比较
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
//如果与某一候选人的姓名相同,就给他加一票
}
cout<<endl;
for(i=0;i<3;i++) //输出3个候选人的姓名与最后得票数
{cout<<leader[i].name<<":"<<leader[i].count<<endl;}
return0;
}
例7.3 指向结构体变量的指针的应用。
#include <iostream>
#include <string>
usingnamespacestd;
intmain( )
{structStudent //声明结构体类型student
{ intnum;
string name;
charsex;
floatscore;
};
Student stu; //定义Student类型的变量stu
Student *p=&stu; //定义p为指向Student类型数据的指针变量并指向stu
stu.num=10301; //对stu中的成员赋值
stu.name="Wang Fun"; //对string变量可以直接赋值
stu.sex='f';
stu.score=89.5;
cot<<stu. num<<" "<<stu.name<<" "<<stu.sex<<" "<<stu.score<<endl;
cout<<(*p)>num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<endl;
return0;
}
例7.4 建立一个如图7.9所示的简单链表,它由3个学生数据的结点组成。输出各结点中的数据。
#define NULL 0
#include <iostream>
structStudent
{ longnum;
floatscore;
structStudent *next;
};
intmain( )
{ 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; //将结点a的起始地址赋给头指针head
a.next=&b; //将结点b的起始地址赋给a结点的next成员
b.next=&c; //将结点c的起始地址赋给b结点的next成员
c.next=NULL; //结点的next成员不存放其他结点地址
p=head; //使p指针指向a结点
do
{cout<<p->num<<" "<<p->score<<endl; //输出p指向的结点的数据
p=p->next; //使p指向下一个结点
} while(p!=NULL); //输出完c结点后p的值为NULL
return0;
}
例7.5 有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在main函数中为各成员赋值,在另一函数print中将它们的值输出。
(1) 用结构体变量作函数参数
#include <iostream>
#include <string>
usingnamespacestd;
structStudent //声明结构体类型Student
{ intnum;
charname[20];
floatscore[3];
};
intmain( )
{ voidprint(Student); //函数声明,形参类型为结构体Student
Student stu; //定义结构体变量
stu.num=12345; //以下5行对结构体变量各成员赋值
stu.name="Li Fung";
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.5;
print(stu); //调用print函数,输出stu各成员的值
return0;
}
voidprint(Student stu)
{cout<<stu.num<<" "<<stu.name<<" "<<stu.score[0]<<" "
<<stu.score[1]<<" "<<stu.score[2]<<endl;
}
(2) 用指向结构体变量的指针作实参
#include <iostream>
#include <string>
usingnamespacestd;
structStudent
{ intnum;
string name; //用string类型定义字符串变量
floatscore[3];
}stu={12345,"Li Fung",67.5,89,78.5}; //定义结构体student变量stu并赋初值
intmain( )
{ voidprint(Student *); //函数声明,形参为指向Student类型数据的指针变量
Student *pt=&stu; //定义基类型为Student的指针变量pt,并指向stu
print(pt); //实参为指向Student类数据的指针变量
return0;
}
voidprint(Student *p) //定义函数,形参p是基类型为Student的指针变量
{ cout<<p->num<<" "<<p->name<<" "<<p->score[0]<<" "
<<p->score[1]<<" "<<p->score[2]<<endl;
}
(3) 用结构体变量的引用作函数参数
#include <iostream>
#include <string>
usingnamespacestd;
structStudent
{ intnum;
string name;
floatscore[3];
}stu={12345,"Li Li",67.5,89,78.5};
intmain( )
{ voidprint(Student &); //函数声明,形参为Student类型变量的引用
print(stu); //实参为结构体Student变量
return0;
}
voidprint(Student &stud) //函数定义,形参为结构体Student变量的引用
{cout<<stud.num<<" "<<stud.name<<" "<<stud.score[0]<<" "
<<stud.score[1]<<" "<<stud.score[2]<<endl;
}
例7.6 开辟空间以存放一个结构体变量。
#include <iostream>
#include <string>
usingnamespacestd;
structStudent //声明结构体类型Student
{ string name;
intnum;
charsex;
};
intmain( )
{ Student *p; //定义指向结构体类型Student的数据的指针变量
p=newStudent; //用new运算符开辟一个存放Student型数据的空间
p->name="Wang Fun"; //向结构体变量的成员赋值
p->num=10123;
p->sex='m';
cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl; //输出各成员的值
deletep; //撤销该空间
return0;
}
例7.7 设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、年级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中,见图7.13。
如果job项为s(学生),则第5项为grade(年级)。即Li是3年级的。如果job项是t(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将class和position放在同一段内存中)。
要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。
程序如下:
#include <iostream>
#include <string>
#include <iomanip> //因为在输出流中使用了控制符setw
usingnamespacestd;
struct
{ intnum;
charname[10];
charsex;
charjob;
unionP //声明共用体类型
{ intgrade; //年级
charposition[10]; //职务
}category; //成员category 为共用体变量
}person[2]; //定义共用体数组person,含两个元素
intmain( )
{ inti;
for(i=0;i<2;i++) //输入两个学生的数据
{cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;
if(person[i].job=='s') cin>>person[i].category.grade; //若是学生则输入年级
elseif(person[i].job=='t') cin>>person[i].category.position;//若是教师则输入职务
}
cout<<endl<<"No. Name sex job grade/position"<<endl;
for(i=0;i<2;i++)
{if(person[i].job=='s')
cout<<person[i].num<<setw(6)<<person[i].name<<" "<<person[i].sex
<<" "<<person[i].job<<setw(10)<<person[i].category.grade<<endl;
else
cout<<person[i].num<<setw(6)<<person[i].name<<" "<<person[i].sex
<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;
}
return0;
}
例7.8 口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。
#include <iostream>
#include <iomanip> //在输出时要用到setw控制符
usingnamespacestd;
intmain( )
{ enumcolor {red,yellow,blue,white,black}; //声明枚举类型color
color pri; //定义color类型的变量pri
inti,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
cout<<setw(3)<<n; //输出当前的n值,字段宽度为3
for(loop=1;loop<=3;loop++) //先后对3个球作处理
{switch(loop) //loop的值先后为1,2,3
{case1: pri=color(i);break; //color(i)是强制类型转换,使pri的值为i
case2: pri=color(j);break; //使pri的值为j
case3: pri=color(k);break; //使pri的值为k
default:break;
}
switch(pri) //判断pri的值,输出相应的“颜色”
{casered: cout<<setw(8)<<"red"; break;
caseyellow: cout<<setw(8)<<"yellow"; break;
caseblue: cout<<setw(8)<<"blue"; break;
casewhite: cout<<setw(8)<<"white"; break;
caseblack: cout<<setw(8)<<"black"; break;
default : break;
}
}
cout<<endl;
}
}
cout<<"total:"<<n<<endl; //输出符合条件的组合的个数
return0;
}