c++程序设计教程 第八章 结构体和共用体
合集下载
C语言与程序设计-第8章_结构体与共用体 (1)

}stu[3]={{10010,“Liu Yin”,’M’,20,93.0,“Nanji ng”},{ },{ }};
根据结构体常量的个数确定元素 的个数:
stu[ ]= { {…},{…},{…} };
…};
struct student stu[ ]={{…},{… },{… }}; 25
吉林大学公共计算机教学与研究中心
}a={43090215,“Li Lin”,’M’,“10 Panshi Road”} ; printf(“No.:%ld\nname:%s\nsex:%c\naddress: %s\n”,a.num,,a.sex,a.addr); } 18
吉林大学公共计算机教学与研究中心
第8章 结构体与共用体
, &student1.score); scanf(“%d%s%f”,&student2.num,
, &student2.score);
不能加& 20
吉林大学公共计算机教学与研究中心
printf(第"8T章he结构h体ig与h共e用r体score is:\nC"程序)设; 计
{10106,"Li", 86 },
{10108,“Ling”, 73.5}, 常{1变0量110,“若Fu人n数”变, 为10300 } };
struct student temp;
const int n = 5 ; int i,j,k;
30
29
吉林大学公共计算机教学与研究中心
第8章 结构体与共用体
C程序设计
例8.1 输入两个学生的学号、姓名和成绩,输 出成绩较高学生的学号、姓名和成绩
解题思路:
C语言程序设计教案 结构体与共用体

printf(“No.
name
sex
age\n”);
for(p=stu;p<stu+3;p++)
printf(“%5d%-20s%2c%4d\n”,p->num,p->name,
p->sex,p->age);}
三、用指针处理链表
链表是一种常见的数据结构,是动态地进行存储分配的一种结构。
用数组存放数据时,必须事先定义固定的长度。比如有的班级有
例 对候选人得票的统计程序。设有三个候选人,每次输入一个得 票的候选人的名字,要求最后输出各人得票结果。
程序如下: #include <stdio.h> struct person {char name[20];
int count; }leader[3]={“li”,0,“zhang”,0,“fun”,0}; main() {int i,j;char leader_name[20]; for(i=1;i<=10;i++) {scanf(“%s”, leader_name);
┄ char addr[30]; }; Struct student student[10];
2.结构体数组的初始化 其初始化和数组的初始化相似。 3.结构体数组的应用举例
结构体数组 和数值型数 组不同之处 在于每个数 组元素都是 一个结构体 类型的数据。
定义了一个 student,其 元素为 Struct student 类型 数据,数组中 有 10 个元素。
{ int month;
先声明一个
int day; int year; }
Struct date 类型,然后在 Struct
C语言程序设计 - 结构体和共用体-样本教案

2)通过结构指针引用结构成员变量时,++和--运算对结果的影响:
用以下实例来分析:
struct
{int a;
int *s;
}*p;
第一组引用:对成员变量a的引用
++p->a++(p->a)
说明:成员变量a自增加1.
(++p)->a
说明:指针p先移动一个单位,然后引用对应的成员变量a.
注意: p每移动一个单位要移动多少字节?
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
这种结构类型变量定义的方式与不省略"结构名"的方式相比,不同之处在于:这种格式定义结构变量以后无法再定义此结构类型的其它结构变量,而带有"结构名"的格式则可以.
格式三:使用typedef说明一个结构类型名,再用新类型名定义结构变量.
例:
typedefstruct
{ char name[12];
char sex;
{"Wang wu" , "F",1983, 3, 3,93,83,73,63}
};
有时结构数组长度可以省略,而由初值个数来暗示.
(4)结构变量成员的引用和操作:
1)对结构变量成员的引用和操作:
用以下实例来分析:
struct
{int a;
int *s;
}*p;
第一组引用:对成员变量a的引用
++p->a++(p->a)
说明:成员变量a自增加1.
(++p)->a
说明:指针p先移动一个单位,然后引用对应的成员变量a.
注意: p每移动一个单位要移动多少字节?
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
这种结构类型变量定义的方式与不省略"结构名"的方式相比,不同之处在于:这种格式定义结构变量以后无法再定义此结构类型的其它结构变量,而带有"结构名"的格式则可以.
格式三:使用typedef说明一个结构类型名,再用新类型名定义结构变量.
例:
typedefstruct
{ char name[12];
char sex;
{"Wang wu" , "F",1983, 3, 3,93,83,73,63}
};
有时结构数组长度可以省略,而由初值个数来暗示.
(4)结构变量成员的引用和操作:
1)对结构变量成员的引用和操作:
c语言结构体与共同体

struct date {int month,day,year;};
struct student { int num; char name[20]; char sex; int age; struct date birthday; char addr[30]; }student1,student2;
struct student { long number; char name[20]; char sex; int age; float score; char addr[30];}; struct student stu[3];
结构体数组的物理含义:
表示实体(或记录)的个数。
结构体数组的初始化
4、要点:
方法一: struct student { int number; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2;
方法二: struct student { int number; char name[20]; char sex; int age; float score; char addr[30]; }; struct student student1,student2;
student1
student2 struct student所占存储空间的 大小为:
各成员变量所占存储单元字节数 之和。sizeof(student)
结构体类型变量的引用
一、原则:通过结构体的成员来引用结构体变量。 二、成员的引用方法为:结构体变量名.成员名 三、要点: 1.结构体变量不能整体输入输出,只能对它的成员进行操作。 如:student1.num; 2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符, 逐级找到最底层的成员。 如:student1.birthday.day 3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要 加上“.”运算符。 4.可以引用成员的地址。
C语言程序设计——结构体和共用体(完整版)

printf(“name\tage\tjob\tclass/office\n”); for(i=0;i<PN;i++) {if(body[i].job==„s‟) printf(“%s\t%d\t%3c\t%d\n”,body[i].name, body[i].age,body[i].job,body[i].units.class); else printf(“%s\t%d\t%3c\t%s\n”,body[i].name, body[i].age,body[i].job,body[i].units.office); } }
birthday num name sex age month day year addr
§12.3结构体数组
结构体数组的每一个元素都是具有相同结构类型 的结构体变量。 例:struct student {int num; char name[20]; float score; }stu[3]; 其中,定义了一个结构体数组stu,共有3个元素, 每个元素都具有struct student的结构形式。
§12.6共用体
共用体(也称为联合)也是一种构造的数据类型。 共用体是将不同类型的数据组织在一起共同占用 同一段内存的一种构造数据类型。 例如,在校学生和教师都填写以下表格: 姓名 年龄 职业 单位 其中,职业分两类:教师和学生; 而单位一栏里,学生填写班级编号(整型类型), 教师填写某系某教研室(整型类型) 。
§12.7枚举数据类型
当某些变量仅由有限个数据值组成时,通常用枚 举类型来表示。 所谓枚举是指将变量的值一一列举出来,变量的 值只限于列举出来的值的范围内。如一周只有7天, 一年只有12个月等等。
注意:枚举类型是一种基本数据类型,而不是一 种构造类型。关键字为enum。
C语言程序设计 - 结构体和共用体-样本教案

struct student类型的数据。
1.用指针处理链表
指向结构体类型数据的指针;用指针处理链表
3.结构变量在函数中的应用
在C语言中,允许结构变量的成员,结构变量的整体和结构变量的地址做为实参传递给相应的形参。
(1)向函数传递结构变量的成员
结构变量的成员作实参
结构变量的成员可以是普通变量,数组或指针变量,它们做实参时的情况同以前七,八,九章所讲。
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
35个字节
35个字节
35个字节
指向结构类型的指针变量:
如:struct student *pstd;
系统为该指针变量分配一个存放"地址"的4个字节的内存空间,具体该指针变量指向哪个结构类型变量,通过为该指针变量赋予某结构变量地址值来确定.
如下例:
struct student *pstd1,*pstd2,*pstd3;
pstd1=&std;/*pstd1指向结构变量std的首地址*/
pstd2=pers;/*pstd2指向结构数组pers的首地址*/
pstd3=(struct student*)malloc(size of (struct student));
说明:结构变量名不是指向该结构的地址, 这与数组名的含义不同,
1.用指针处理链表
指向结构体类型数据的指针;用指针处理链表
3.结构变量在函数中的应用
在C语言中,允许结构变量的成员,结构变量的整体和结构变量的地址做为实参传递给相应的形参。
(1)向函数传递结构变量的成员
结构变量的成员作实参
结构变量的成员可以是普通变量,数组或指针变量,它们做实参时的情况同以前七,八,九章所讲。
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
35个字节
35个字节
35个字节
指向结构类型的指针变量:
如:struct student *pstd;
系统为该指针变量分配一个存放"地址"的4个字节的内存空间,具体该指针变量指向哪个结构类型变量,通过为该指针变量赋予某结构变量地址值来确定.
如下例:
struct student *pstd1,*pstd2,*pstd3;
pstd1=&std;/*pstd1指向结构变量std的首地址*/
pstd2=pers;/*pstd2指向结构数组pers的首地址*/
pstd3=(struct student*)malloc(size of (struct student));
说明:结构变量名不是指向该结构的地址, 这与数组名的含义不同,
C语言程序设计实验结构体与共用体

实验8:结构体与共用体一、实验目的1.掌握结构体类型变量的定义和使用;2.掌握共用体的概念与使用。
二、实验内容编写程序,实现如下功能:1.定义结构体变量,用它表示考生的学号、姓名(用英文表示)以及语文、数学、外语成绩。
输入两个考生的信息和各门课成绩并比较(按总分进行高低排序;当总分相同时,依次按语、数、外的顺序排序)。
2.设有一个教师与学生通用的表格,数据项包括:姓名、年龄、职业和单位,其中“职业”一项可分为“教师”和“学生”两类;对“单位”一项,教师填入“系部名称”(用字符类型表示),学生填入“班级编号”(用整型量表示)。
编程输入人员数据,再以表格输出。
三、实验结果记录第1题上机调试后的最终代码及上机调试结果(截图):程序代码运行结果1.总分不同2.总分相同的情况2.1总分完全相同2.2总分相同但语文成绩不同2.3总分相同、语文成绩相同但数学成绩不同第2题上机调试后的最终代码及上机调试结果(截图):程序代码运行结果1.正确输入2.错误输入四、实验小结:经过此次实验,我熟悉掌握了结构体的定义和使用,同时也掌握了共用体的使用。
对于程序1,基本思路是通过结构体定义变量,采用if-else语句嵌套,当总分相同且语文数学成绩均相同时就不必再进行一轮的if语句判断,因为此时两考生的英语成绩一定相同。
对于程序2,在结构体中定义了共用体,可对不同职业进行不同单位的划分。
基本思路是用malloc函数进行动态内存分配,确定要输入的样本数量,再进行数据的输入,在单位数据的输入时需要判断输入对象是学生还是老师,此时要用strcmp函数进行比较判断,输入结束后打印表格,用转义字符\t让表格更加美观,最后通过free进行内存释放。
8章 c语言程序设计 结构体,共用体与枚举类型

当通过指针变量引用结构体成员时,若表达式中含有++,-等运算符时,应根据运算符优先级来确定表达式含义。例: ++ p-> score 相当于++( p-> score),结果使score加1。 (++ p)-> score 则再访问成员score之前,使p加1。 例:struct abc {char a[20]; int *pt; }p; pt是结构体类型中的成员,则表达式*p->pt引用的是pt所 指存储单元; *p->pt++是再引用了pt所指存储单元后,使 指针pt加1;( *p->pt)++使pt所指向的单元的值加1;而 *p ++ ->pt在访问了pt所指存储单元后,p加1。
例:struct std_info {char name[9]; char sex[3]; float score; struct date birthday; }stud,arr[5],*p; p=& stud; (1)若要引用结构体类型变量stud 中score成员项,可写成: stud. score p-> score *(p). score arr[1] .score /*通过结构体变量引用*/ /*通过指针变量引用*/ /*通过指针变量引用*/
2.将一个结构体变量作为一个整体赋给另一具有相同类型的 结构体变量 例:struct {char name[15]; int num; }stud1,stud2={“wangfang”,01}; 执行赋值语句: stud1=stud2; 则stud2中把每个成员的值依次赋给stud1中对应的同名成员。 C不允许把一个结构体变量作为一个整体进行输入和输出。 例: scanf(“%d”,& stud1); printf(“%d”,stud1);都是错误的 结构体变量有多个不同类型的数据项,必须逐个用相应的格 式像普通变量一样输入和输出。 scanf(“%s,%d”, stud1. name ,& stud1.num); 注意name[15]是数组,数组名本身就是地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8
结构体类型声明
例如,可以声明一个描述上述学生基本情况的结构体类型:
struct student
//student是结构体类型名
{ int num;
//学号
char name[20]; //姓名
unsigned int age; //年龄
char sex;
//性别,为'm'(male)或'f'(female)
2020/11/1
第8章 结构体和共用体
7
8.1 结构体
8.1.1 结构体与结构体类型的声明 C++可以允许用户定义一种新的数据类型,把属
于同一事物的若干个相关数据构成一个整体,统一 管理。这种新的数据类型可根据用户的需要具体规 定其组成形式,称为结构体类型。 结构体数据类型声明的形式如下: struct 结构体类型名 { 数据类型 成员1; 数据类型 成员2; …… …… 数据类型 成员n; };
66
78
95
87
90
……
……
令狐冲
男 1999
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任莹莹
女 1999
78 95 87 90
2020/11/1
今天新的内容:构造数据类型
构造数据类型:结构体和共用体 基本数据类型:整型、浮点型、双精度型、字 符型等等,都是基本类型; 构造类型:构造类型是由若干个基本类型或够 构造类型组合而成的,如数组,构造体,联合 体。 今天我们再介绍2种构造数据类型,结构体和 共用体
char name[20]; } a1, a2; 注意,用这种形式声明的结构体类型没有类型名, 不能再去定义新的变量。
12
说明: (1)结构体变量的成员也可以是一个结构体变量。 struct date { int year;
int month; int day; }; struct person { int id; char name[20]; date birthday; }; 结构体person的成员birthday是另一个结构体data的类型。
13
(2)结构体变量可以在定义的时候初始化。
例如: struct student //student是结构体类型名 { int num; //学号
char name[20]; //姓名 unsigned int age; //年龄 char sex; //性别,为'm'(male)或'f'(female) float score[4]; //四门课的成绩 } stu1={111, "LiHong", 18, 'f', 90,80,85,96}, stu2 ; 或当结构体类型声明在前,变量可以直接定义如下: student stu1={111, "LiHong", 18, 'f', 90,80,85,96}; 如果是不完全初始化,余下的成员值为0。
16个字节
score[3]
(2)在声明结构体类型的同时定义变量。 例如: struct student { int num;
char name[20]; unsigned int age; char sex; float score[4]; } stu1, stu2 ;
11
(3)直接定义结构体类型的变量。 例如: struct { int num;
思考一个问题
在程序里表示一个人(姓名、年龄、性别、……), 怎么表示? 想表示多个人呢? 如何用计算机程序实现下述二维表格的管理?
表8-1 某学校学生成绩管理表
学号 姓名 性别 入学时间 计算机原理 英 语
1 令狐冲 男 1999
90
83
2 林平之 男 1999
78
92
3 岳灵珊 女 1999
89
72
float score[4]; //四门课的成绩
};
以上结构体类型声明只是描述了一种数据形式,student是 一个类型名,可以用来定义变量,但这种类型是用户自己定 义的,包括num,name,age等不同类型的数据项(成员)。
9
1.定义结构体类型变量
(1)先声明结构体类型 再定义变量。 struct student { int num;
char name[20]; unsigned int age; char sex; float score[4]; }; student stu1, stu2;
10
num name[0]
4个字节
…… 20个字节
name[19] age
sex score[0]
4个字节
score[1] score[2]
4 任莹莹 女 1999
78
95
数学 72 88 98 87
5 ……
音乐 82 78 66 90
6 ……
2020/11/1
使用数组做为数据结构的解决方法
int studentId[30]; /* 最多可以管理30个学生, 每个 学生的学号用数组的下标表示*/
char studentName[30][10]; char studentSex[30][2]; int timeOfEnter[30]; /*入学时间用int表示*/ int scoreComputer[30];/*计算机原理课的成绩*/ int scoreEnglish[30]; /*英语课的成绩*/ int scoreMath[30]; /*数学课的成绩*/ int scoreMusic[30]; /*音乐课的成绩*/
2020/11/1
数组的解决方法
数据的内存管理方式
1
2 3 4 ……
令狐冲 林平之 岳灵珊 任莹莹
……
男 男 女 女
……
1999 1999 1999 1999 ……
90 分配内存不83集中,寻址效72率不高
82
78 对数组进行赋92初值时,容易8发8 生错位 78
89 结构显得7比2 较零散,不容98易管理
2020/11/1
数组的解决方法
int studentId[30] = {1,2,3,4,5,6}; char studentName[30][10]={{"令狐冲"},{"林平之"},
{"岳灵珊"},{"任莹莹"}}; char studentSex[30][2]={{"男"},{"男"},{"女"},{"女"}}; int timeOfEnter[30] = {1999,1999,1999,1999}; int scoreComputer[30] = {90,78,89,78}; int scoreEnglish[30] = {83,92,72,95}; int scoreMath[30] = {72,88,98,87}; int scoreMusic[30] = {82,78,66,90};
结构体类型声明
例如,可以声明一个描述上述学生基本情况的结构体类型:
struct student
//student是结构体类型名
{ int num;
//学号
char name[20]; //姓名
unsigned int age; //年龄
char sex;
//性别,为'm'(male)或'f'(female)
2020/11/1
第8章 结构体和共用体
7
8.1 结构体
8.1.1 结构体与结构体类型的声明 C++可以允许用户定义一种新的数据类型,把属
于同一事物的若干个相关数据构成一个整体,统一 管理。这种新的数据类型可根据用户的需要具体规 定其组成形式,称为结构体类型。 结构体数据类型声明的形式如下: struct 结构体类型名 { 数据类型 成员1; 数据类型 成员2; …… …… 数据类型 成员n; };
66
78
95
87
90
……
……
令狐冲
男 1999
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任莹莹
女 1999
78 95 87 90
2020/11/1
今天新的内容:构造数据类型
构造数据类型:结构体和共用体 基本数据类型:整型、浮点型、双精度型、字 符型等等,都是基本类型; 构造类型:构造类型是由若干个基本类型或够 构造类型组合而成的,如数组,构造体,联合 体。 今天我们再介绍2种构造数据类型,结构体和 共用体
char name[20]; } a1, a2; 注意,用这种形式声明的结构体类型没有类型名, 不能再去定义新的变量。
12
说明: (1)结构体变量的成员也可以是一个结构体变量。 struct date { int year;
int month; int day; }; struct person { int id; char name[20]; date birthday; }; 结构体person的成员birthday是另一个结构体data的类型。
13
(2)结构体变量可以在定义的时候初始化。
例如: struct student //student是结构体类型名 { int num; //学号
char name[20]; //姓名 unsigned int age; //年龄 char sex; //性别,为'm'(male)或'f'(female) float score[4]; //四门课的成绩 } stu1={111, "LiHong", 18, 'f', 90,80,85,96}, stu2 ; 或当结构体类型声明在前,变量可以直接定义如下: student stu1={111, "LiHong", 18, 'f', 90,80,85,96}; 如果是不完全初始化,余下的成员值为0。
16个字节
score[3]
(2)在声明结构体类型的同时定义变量。 例如: struct student { int num;
char name[20]; unsigned int age; char sex; float score[4]; } stu1, stu2 ;
11
(3)直接定义结构体类型的变量。 例如: struct { int num;
思考一个问题
在程序里表示一个人(姓名、年龄、性别、……), 怎么表示? 想表示多个人呢? 如何用计算机程序实现下述二维表格的管理?
表8-1 某学校学生成绩管理表
学号 姓名 性别 入学时间 计算机原理 英 语
1 令狐冲 男 1999
90
83
2 林平之 男 1999
78
92
3 岳灵珊 女 1999
89
72
float score[4]; //四门课的成绩
};
以上结构体类型声明只是描述了一种数据形式,student是 一个类型名,可以用来定义变量,但这种类型是用户自己定 义的,包括num,name,age等不同类型的数据项(成员)。
9
1.定义结构体类型变量
(1)先声明结构体类型 再定义变量。 struct student { int num;
char name[20]; unsigned int age; char sex; float score[4]; }; student stu1, stu2;
10
num name[0]
4个字节
…… 20个字节
name[19] age
sex score[0]
4个字节
score[1] score[2]
4 任莹莹 女 1999
78
95
数学 72 88 98 87
5 ……
音乐 82 78 66 90
6 ……
2020/11/1
使用数组做为数据结构的解决方法
int studentId[30]; /* 最多可以管理30个学生, 每个 学生的学号用数组的下标表示*/
char studentName[30][10]; char studentSex[30][2]; int timeOfEnter[30]; /*入学时间用int表示*/ int scoreComputer[30];/*计算机原理课的成绩*/ int scoreEnglish[30]; /*英语课的成绩*/ int scoreMath[30]; /*数学课的成绩*/ int scoreMusic[30]; /*音乐课的成绩*/
2020/11/1
数组的解决方法
数据的内存管理方式
1
2 3 4 ……
令狐冲 林平之 岳灵珊 任莹莹
……
男 男 女 女
……
1999 1999 1999 1999 ……
90 分配内存不83集中,寻址效72率不高
82
78 对数组进行赋92初值时,容易8发8 生错位 78
89 结构显得7比2 较零散,不容98易管理
2020/11/1
数组的解决方法
int studentId[30] = {1,2,3,4,5,6}; char studentName[30][10]={{"令狐冲"},{"林平之"},
{"岳灵珊"},{"任莹莹"}}; char studentSex[30][2]={{"男"},{"男"},{"女"},{"女"}}; int timeOfEnter[30] = {1999,1999,1999,1999}; int scoreComputer[30] = {90,78,89,78}; int scoreEnglish[30] = {83,92,72,95}; int scoreMath[30] = {72,88,98,87}; int scoreMusic[30] = {82,78,66,90};