C++程序设计课件 设计制作:徐龙琴 2
教学内容:
10.1 结构体 的 概念
10.2 结构体类型变量 的 定义, 初始化 及 使用方法
10.3 结构体与 数组
10.4 结构体 与 指针
10.5 结构体 与 函数
10.6 返回 结构
10.7 用 typedef定义类型
C++程序设计课件 设计制作:徐龙琴 3
?掌握 结构 的 概念 和结构类型的 定义
?掌握 结构变量 的 定义 和 初始化 ;
?掌握 结构成员 的 访问, 结构赋值 的 含义 以及 结构与
指针, 函数 的 关系 。
教学目的:
C++程序设计课件 设计制作:徐龙琴 4
§ 10.1结构体的概念
1 结构体 引入原因:
C++简单的数据类型 只能描述 简单类型的数据。但在实际
应用中,只有将不同类型的数据组合在一起,才能获得有用
信息 。 例如,描述一个学生的基本信息:学号、姓名、性别、
年龄、成绩等。如果将这些信息用彼此独立的变量来描述,
将难以反映它们之间的关系。因此,需要将它们组成一个整
体来描述。 C++语言提供了管理这些数据的类型- 结构体类
型。
C++程序设计课件 设计制作:徐龙琴 5
2 结构体,是 用户自定义的新 数据类型,在结构体中可以 包含
若干个 不同类型 但 相关的变量, 从而 组合起来 反
映某一个信息 。 各个变量一般被称为结构体成员
3 定义 结构体类型的格式为:
struct 结构体名
{ 数据类型 成员名 1;
数据类型 成员名 2;
:
数据类型 成员名 n;
};
?strut:是定义结构体类型的关键字,
不能省略
?结构体名,用户自己命名的标识符
?数据类型,可以是基本数据类型,数
组、指针、结构体类型等
注意,花括号{}内的部分 称为结构体 。
结构体 是由 若干 结构成员组成的 。每个结
构成员有自己的名称和数据类型,若几个
结构成员具有相同的数据类型,可将它们
定义在同一种成员类型之后,各成员名之
间用逗号隔开。 不能在结构题内直接初始
化。结构在定义时不分配内存。
C++程序设计课件 设计制作:徐龙琴 6
例,定义一个职工 worker结构体如下:
struct worker
{ long number;
char name[20];
char sex; //sex是成员名
int age;
float salary;
char address[80];
long phone[20];
}; //注意分号不要省略
C++程序设计课件 设计制作:徐龙琴 7
结构体类型的特点:
结构体类型 是 用户自定义的 类型,与整型、实型相当
由 若干不同的基本数据类型的数据 构成
定义 它时 不分配空间,只有用它 定义变量 时 才分配空间 。
结构成员类型 可以是 任何 合法的 C++类型 ;
允许在定义 结构体类型 中 可以包含 另外一种结构类型的成员
struct birthday{int year;int month;int day;};
struct student
{int num;
char sex;
birthday birth; };
student stu; //定义 student结构体类型的变量 stu
C++程序设计课件 设计制作:徐龙琴 8
§ 10.2 结构体类型变量定义及使用
结构体 只 是 用户自定义 的一种 数据类型,并不为其分配内
存,也就 无法 存储数据, 只有 在程序中 定义了 结构体类型变量
(简称 结构体变量 )之后 才能存储数据 。通常有三种形式来定义
一个结构体类型变量。
1 结构体变量的定义格式:
⑴ 在定义类型的同时定义变量
struct 结构体名
{
成员表列;
} 变量名;
C++程序设计课件 设计制作:徐龙琴 9
例,
struct student
{char num[10];
char name[20];
char sex;
int age;
float score[5];
}st1,st2; //声明 2个结构体变量 st1,st2
C++程序设计课件 设计制作:徐龙琴 10
⑵ 使用无名结构体类型声明结构体变量,
struct //没有结构体名
{
成员表列;
} 变量名;
struct
{char num[10];
char name[20];
char sex;
int age;
float score[5];
}st1,st2; //声明 2个结构体变量 st1,st2
例,
C++程序设计课件 设计制作:徐龙琴 11
⑶ 先定义结构体类型再定义变量名
struct 结构体名
{
成员表列;
};
struct 结构体名 变量名;
struct student
{char num[10];
char name[20];
char sex;
int age;
float score[5]; }
struct student st1,st2; //声明 2个结构体变量
例,
或 结构体名 变量名;
student st1,st2;
C++程序设计课件 设计制作:徐龙琴 12
注意,一个 结构体变量 占用内存 的实际大小,可以利用
sizeof(结构体变量类型 )运算 求出。
#include <iostream.h>
struct st
{
char ch;
int i;
float f;
}st1;
void main( )
{ cout<<sizeof(st1);
}
例:
对于结构体变量 st1在内存中占多少个字节呢? 由前所
学的知识可知它 应占 9个字节 。但在 C++语言中,系统通常为
结构体对象分配整数倍大小的机器字长( 4个字节),所以
st1实际占 12个字节 。此时,ch成员也占 4个字节,但仅第一
个字节被用,后面的 3个字节未用。
C++程序设计课件 设计制作:徐龙琴 13
⒉ 结构体变量的初始化
结构体变量的初始化,是指 在定义结构体变量的同时给结构
体变量赋初值。
初始化的方式有两种,① 用 花括号 { }括起来的若干 成员值 对
结构体变量 初始化 ;
② 用同类型 的结构体 变量 对其 初始化 。
例,struct student
{ char num[10];
char name[20];
char sex;
int age;
float score[3];
};
下面对结构体变量的初始化语句都是正确的。
① struct student st1= {"001","Wangfang",'f',18,{96,86,88}};
② struct student st2=st1;
C++程序设计课件 设计制作:徐龙琴 14
⒊ 结构体变量及其成员的的使用形式
结构体变量 是 不同数据类型的若干数据的集合体。在程
序中使用结构体变量时,一般情况下 不能 把它作为一个整体
参加数据处理,而 参加 各种 运算和操作 的 是 结构体变量的 各
个成员项数据。
符号,,”称为 成员运算符 (也称为 点运算符 ):
其作用是 引用结构体变量中的某个成员。
其 优先级 与下标运算符的优先级相同,是所有运算符优
先级中最高的。
⑴ 使用结构体成员的格式为:
结构体变量, 成员名
C++程序设计课件 设计制作:徐龙琴 15
在定义了结构体变量后, 就 可 以 用 不同的 赋值方法 对结构体
变量 的每个 成员赋值 。
struct student
{ char name[20];
char sex;
int age;
float score[3];
}st1;
strcpy(st1,name,”Zhang San”);
st1.sex=’m’;
st1.age=20;
:
:
例:
引用结构体变量的首地址用,&st1
引用结构体变量成员的地址用,&st1.name;
引用结构体变量成员的第二个字符用,st1.name[1];
C++程序设计课件 设计制作:徐龙琴 16
使用结构体类型变量时注意点:
相同类型 结构体变量 可以相互赋值 。
不能将 一个 结构体变量 作为一个 整体引用,只能对结构体变
量中的各个成员 分别引用 。
对成员变量 可以像普通变量一样进行各种运算
例, cin>>st1;
cout<<st1;
st2.age=st1.age;
sum=st1.age+st2.age;
st2.age++;
cin>>st1.name>>,..;
cout<<st1.name<<...;
C++程序设计课件 设计制作:徐龙琴 17
例, 输入职工的编号、姓名、性别、年龄、出生日期和工资,
然后输出。
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
struct date //定义出生日期结构体类型
{short year;
short month;
short day;};
struct employee //定义职工信息结构体类型
{char num[5];
char name[20];
char sex;
int age;
struct date birthday;
float salary;};
C++程序设计课件 设计制作:徐龙琴 18
void main( )
{ struct employee emply1; //声明结构体变量 emply1
cout<<"input num,name,sex,age,birthday(year,month,day):"<<endl;
cin>>emply1.num>>emply1.name>>emply1.sex>>emply1.age;
cin>>emply1.birthday.year>>emply1.birthday.month;
cin>>emply1.birthday.day>>emply1.salary;
cout<<setw(5)<<"num"<<setw(10)<<"name"<<setw(5)<<"sex";
cout<<setw(5)<<"age"<<setw(13)<<"birthday"<<setw(8)<<"salary"<<endl;
cout<<setw(5)<<emply1.num<<setw(10)<<emply1.name<<setw(5)<<emply1.sex;
cout<<setw(5)<<emply1.age<<setw(8)<<emply1.birthday.year<<'.';
cout<<emply1.birthday.month<<'.'<<emply1.birthday.day;
cout<<setw(8)<<emply1.salary<<endl; }
程序运行的结果为:
input num,name,sex,age,birthday(year,month,day):
006 WangMing m 28 1975 8 26 856.398
num name sex age birthday salary
006 WangMing m 28 1975.8.26 856.39
C++程序设计课件 设计制作:徐龙琴 19
§ 10.3 结构体数组
1 结构体数组的定义,
结构体数组,是指 数组的每个元素是由相同结构体类型变量
组成的。 结构体数组名 表示 该结构体数组的存
储首地址。 结构体数组 适合于处理 由若干具有
相同关系的数据组成的数据集合体。
定义结构体数组的方法 和定义结构体变量的方法相仿,
只需说明其为数组即可。 可以采用三种方法:
C++程序设计课件 设计制作:徐龙琴 20
⑴ 先定义结构体类型,再用它定义结构体数组。
例,struct student
{char name[20];
char sex;
int age;
};
struct student stu[3];
C++程序设计课件 设计制作:徐龙琴 21
⑵ 在定义结构体类型同时定义结构体数组。
例,struct student
{ char name[20];
char sex;
int age;
} stu[3];
⑶ 直接定义结构体数组
例,struct
{ char name[20];
char sex;
int age;
}stu[3];
C++程序设计课件 设计制作:徐龙琴 22
⒉ 结构体数组的初始化,
结构体数组在定义的同时也可以进行初始化,并且 与结构
体变量的初始化 规定 相同,
例,struct student
{char num[5];
char name[20];
int age;
char sex;
float score;
} stu[2] ={ {"001","Wangping",'f',19,84},
{"002","Zhaomin",'m',20,64} };
struct student
{ char num[5];
char name[20];
int age;
char sex;
float score; };
student stu[2] ={ {"001","Wangping",'f',19,84},
{"002","Zhaomin",'m',20,64} };
C++程序设计课件 设计制作:徐龙琴 23
注意,不能把结构体数组元素作为一个整体直接进行输入输出。
如:
cin>>stu[0].num>> stu[0].name;
cin>> stu[0].age>> stu[0].sex>>;
cin>> stu[0].score;
st2.age=st1.age;
st2,score = st1,score +5;
cin>>stu[0];
或
cout<<stu[0];
都是错误的。
只能以单个成员为对象进行输入输出,如:
C++程序设计课件 设计制作:徐龙琴 24
例,已知 5个学生的学号、姓名、性别、年龄和数学成绩,求
这 5个学生数学的平均成绩,并输出不及格学生的名单 及人数。
#include <iostream.h>
#include <iomanip.h>
struct student //定义学生信息结构体类型
{char num[5];
char name[10];
char sex;
int age;
float mathscore;};
void main( )
{struct student st[5]={{"001","Wangping",'f',19,84},
{"002","Zhaomin",'m',20,64},
{"003","Wanghong",'f',18,54},
{"004","Lilei",'m',19,92},
{"005","Liumin",'m',19,75}};
C++程序设计课件 设计制作:徐龙琴 25
int i,k=0;
float average=0;
for(i=0;i<5;i++)
average+=st[i].mathscore;
average/=5;
cout<<"average="<<average<<endl;
cout<<"不及格名单,"<<endl;
cout<<setw(5)<<"num"<<setw(10)<<"name"<<setw(5)<<"sex";
cout<<setw(5)<<"age"<<setw(6)<<"mathscore"<<endl;
for(i=0;i<5;i++)
if(st[i].mathscore<60)
{k++;
cout<<setw(5)<<st[i].num<<setw(10)<<st[i].name<<setw(5)<<st[i].sex;
cout<<setw(5)<<st[i].age<<setw(6)<<st[i].mathscore<<endl;}
cout<<"不及格人数,"<<k<<endl;}
程序运行的结果为:
average=73.8
不及格名单:
num name sex age mathscore
003 Wanghong f 18 54
不及格人数,1
C++程序设计课件 设计制作:徐龙琴 26
§ 10.4 结构体与指针
1 结构体指针,
通常把指向结构体变量的指针 称为 结构体指针,
把指向结构体数组或数组元素的指针 称为 结构体数组指针。
在数组中,每个元素都是个结构体指针,则 称 结构体指针数组 。
① 定义形式为,struct 结构体名 *结构指针名;
② 初始化格式为,结构指针名=结构体变量的初始地址;
③ 用 结构体指针访问结构体成员的方法:
( * 结构体指针),成员名
或,结构体指针 -> 成员名
->,称为 结构体指针运算符,
它在 第一 运算 优先级 中
C++程序设计课件 设计制作:徐龙琴 27
例,struct student
{char name[20];
char sex;
int age;
} stu1,stu2;
struct student *pstu;
pstu= &stu1;
pstu -> name=“Liping”; //等价与 (*pstu).name =“Liping”;
C++程序设计课件 设计制作:徐龙琴 28
例,指向结构体变量的指针的使用。
#include "iostream.h"
#include "string.h"
void main()
{struct student
{long int num;
char name[20];
char sex;
float score;};
student stu1;
student *p;
p=&stu1;
stu1.num=1;
strcpy(stu1.name,"li lin");
stu1.sex='M';
stu1.score=89;
cout<<stu1.num<<"\t"<<stu1.name<<"\t“
<<stu1.sex<<"\t" <<stu1.score<<endl;
cout<<(*p).num<<"\t"<<(*p).name<<"\t“
<<(*p).sex<<"\t" <<(*p).score<<endl;
cout<<p->num<<"\t" << p->name<<"\t“
<< p->sex<<"\t" << p->score<<endl;
}
程序的运行结果:
1 li lin M 89
1 li lin M 89
1 li lin M 89
总结:取结构体成员可以采用以下 3钟方法,
① 结构体变量名,成员名
②( *结构体指针变量名),成员名
③ 结构体指针变量名 ->成员名
C++程序设计课件 设计制作:徐龙琴 29
⒉ 结构体数组指针,
例,struct student
{char name[20];
char sex;
int age;
} stu1[3];
struct student *pstu;
pstu= stu1;
C++程序设计课件 设计制作:徐龙琴 30
例,指向结构体数组的指针的使用。
#include <iostream.h>
struct student
{ int num;
char name [20];
char sex;
int age ;};
student stu[3]={{1,"li lin",'M',18},{2,"sum",'M',19},
{3,"zhao",'M',20}};
void main()
{student *p;
for (p=stu;p<stu+3;p++)
cout<<p->num<<"\t"<<p->name<<"\t"
<<p->sex<<"\t"<<p->age<<endl; }
程序的输出结果为:
1 li lin M 18
2 sum M 19
3 zhao M 20
C++程序设计课件 设计制作:徐龙琴 31
⒊ 结构体指针数组,是指在数组中,若每个元素都是一个结构
体指针的数组。
例,struct student
{char name[20];
char sex;
int age;
} stu1,stu2;
struct student *pstu[2];
pstu[0]=stu1;
C++程序设计课件 设计制作:徐龙琴 32
§ 10.5 结构体与函数
⒈ 用结构体类型的变量作函数的参数 (传值 ):
结构体 既可以作为 函数的参数, 也可以作为 函数的返
回值 。 当结构体被用作函数的参数时, 可以将 结构体 变量
的 值 ( 包含结构体类型中各成员的值 ) 传递给被调函数的
形参 ; 也可以将 指向结构体的指针来作为函数的参数 。 但
要 注意,主调函数的 实参 与 被调函数相应位置上的 形参 必
须是相同的结构体类型 。
C++程序设计课件 设计制作:徐龙琴 33
例,用结构体类型的变量作为函数的参数。
#include "iostream.h"
struct Student
{ int num;
char name [20];
char sex;
int age ;};
void print(Student);
Student stu[3]={{1,"li lin",'M',18},{2,"sum",'M',19},
{3,"zhao",'M',20}};
void main()
{ int i;
for (i=0;i<3;i++)
print(stu[i]);}
void print(Student s)
{ cout<<s.num<<"\t"<<s.name<<"\t "
<<s.sex<<"\t"<<s.age<<"\t"<<endl;}
程序的执行结果是:
1 li lin M 18
2 sum M 19
3 zhao M 20
C++程序设计课件 设计制作:徐龙琴 34
#include "iostream.h"
struct student
{ int num;
char name [20];
char sex;
int age ;};
void print(student);
student stu[3]={{1,"li lin",'M',18},{2,"sum",'M',19},
{3,"zhao",'M',20}};
void main()
{ int i;
for (i=0;i<3;i++)
print(stu[i]);}
void print(student s)
{ cout<<s.num<<"\t"<<s.name<<"\t“
<<s.sex<<"\t"<<s.age<<"\t"<<endl;}
程序的执行结果是:
1 li lin M 18
2 sum M 19
3 zhao M 20
⒉ 用指向结构体的指针作函数的参数(传指针)
void in *);
in &stu[i]);}
t( t t *s)
{cout< s-> \ ->name <"\t "
<<s ->sex< "\t" s->age<<"\t"<<endl;}
C++程序设计课件 设计制作:徐龙琴 35
#include "iostream.h"
struct student
{ int num;
char name [20];
char sex;
int age ;};
void print(student *);
student stu[3]={{1,"li lin",'M',18},{2,"sum",'M',19},
{3,"zhao",'M',20}};
void main()
{ int i;
for (i=0;i<3;i++)
print(&stu[i]);}
void print(student *s)
{cout<<s->num<<"\t"<<s->name<<"\t "
<<s ->sex<<"\t"<<s->age<<"\t"<<endl;}
程序的执行结果是:
1 li lin M 18
2 sum M 19
3 zhao M 20
⒊ 用结构体变量的引用作为函数的参数
void print(student &);
print(stu[i]); }
&s)
{ cout< s.num<<"\t <<s.name<<"\t“
<<s.sex<<"\t"<<s.age<< "\t"<<endl;}
C++程序设计课件 设计制作:徐龙琴 36
§ 10.6 返回结构
1 返回结构类型值的函数的定义格式,
结构体名称 函数名(形参及类型说明)
{ 函数体 }
例,定义一个返回结构体类型的函数, 求所有同学中年龄最大
的同学 。
#include "iostream.h"
struct student
{ int num;
char name [20];
char sex;
int age ; };
student max(student *,int);
C++程序设计课件 设计制作:徐龙琴 37
student stu[3]={{1,"lilin",'M',18},{2,"sum",'M',19},
{3,"zhao",'M',20}};
void main( )
{ student maxold;
maxold=max(stu,3);
cout<<maxold.num<<"\t"<<maxold.name
<<"\t"<<maxold.age<<endl; }
student max(student *s,int n)
{ int i,age1,index;
age1=s->age;
index=0;
for (i=0;i<n;i++)
if (age1<(s+i)->age)
{ index=i;
age1=(s+i)->age; }
return (*(s+index));}
C++程序设计课件 设计制作:徐龙琴 38
⒉ 返回结构的引用,
与返回其它类型引用的函数的定义方法和原理一致,
但注意不要返回一个局部变量的引用就可 。
C++程序设计课件 设计制作:徐龙琴 39
§ 10.7 用 typedef定义类型
C++允许程序员 为数据类型 取, 别名, 或 自定义衍生类型。
该功能是通过关键字 typedef来完成的 。
⒈ typedef定义 的一般 格式:
例如:
typedef int * intptr; //intptr为指向整型的指针类型。
intptr p; //等价于,int * p;
typedef unsigned int uint;
typedef int ARRAY[10];//定义一种有 10个单元的一维 数组类型
ARRAY a,b ; //a,b是数组
typedef 原类型名 新类型名
C++程序设计课件 设计制作:徐龙琴 40
例, typedef struct student
{int num;
char name[10];
int score;
}STUDENT; //为结构体类型 struct student定义新
的名称 STUDENT
STUDENT a,b; // 定义 a,b为 struct student类型,等
价于 struct student a,b;
注意,新类型名 只是 给 已经存在 的数据 类型 增加一个 别名,
并没有创造一个新的数据类型。
C++程序设计课件 设计制作:徐龙琴 41
例, #include <iostream.h>
void main()
{ typedef int ARRAY[10];
ARRAY a,b;
int n;
for (n=0; n<10; n++)
cin>>a[n];
for (n=0; n<10; n++)
cout<<a[n];
}
typedef的 作用,用 typedef定义 数组、指针、结构 等类
型将带来 很 大的 方便,不仅使程序 书
写简单 而且使意义更为明确,因而 增
强了可读性 。
C++程序设计课件 设计制作:徐龙琴 42
§ 程序举例
例,有关结构的定义、结构变量的定义、引用和赋值方式的例子
#include <iostream.h>
const int MAXIMUM_NAME_LENGTH = 50;
typedef char name_string[MAXIMUM_NAME_LENGTH];
//定义最大长度为 50的 name_string 字符串
struct room //定义结构类型 room,包括三个整型成员
{ int number;
int floor;
int capacity;};
struct employee //定义结构类型 employee
{ name_string name;
int age;
double salary;
room location;};
C++程序设计课件 设计制作:徐龙琴 43
void main() //主函数
{ int place;
employee first_employee; //声明一个 employee型结构变量
room room_one,room_two; //声明 room型结构变量
room_one.number = 1; //对 room_one各成员进行赋值
room_one.floor = 0;
room_one.capacity = 6;
room_two.number = 2; //对 room_two各成员进行赋值
room_two.floor = 3;
room_two.capacity = 4;
cout << "Please enter the employee's name,";
cin >> first_employee.name;//输入长度不超过 50的字符串
cout << "Please enter the employee's age,";
cin >> first_employee.age; //输入 first_employee的成员 age
cout << "Please enter the employee's salary,";
cin >> first_employee.salary; //输入 first_employee的成员 salary
C++程序设计课件 设计制作:徐龙琴 44
cout << "Put in room 1 or in room 2? (type '1' or '2'),";
cin >> place; //输入 1或 2,选择 room
if (place == 1)
first_employee.location = room_one;
if (place == 2)
first_employee.location = room_two;
cout << endl << first_employee.name << " is now on floor ";
cout << first_employee.location.floor << "." << endl;
}
程序的执行结果是:
Please enter the employee's name:
li lin
Please enter the employee's age:
20
Please enter the employee's salary,
2000
Put in room 1 or in room 2? (type '1' or '2'):
2
li lin is now on floor 3.