您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《C++程序设计实践例题》 > 第3章 第三章

第1节 第一部分

例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;

}