c语言第9章结构体
C语言数据结构-第9章 结构体共用体与枚举

"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];
C语言 第九章 结构体数据类型期末测试习题与答案

程序运行后的输出结果是( )。
A.SunDan 20044
B.YangSan 20041
C.SunDan 20042
D.LiSiGuo 20042
参考答案:D
3、以下程序运行的结果是_( )。
#nclude”stdio.h
main()
{
struct date
{
int year , month , day ;
D.struct color
{ int red;
int green;
int blue;
} c l;
参考答案:B
7、有以下程序:
struct stu
{
char[10];
float score[3];
};
main( )
{
struct stu s[3]={{"20021",90,95,85},
{"20022",95,80,75},
} today ;
printf(“%d\n”,sizeof(struct date));
}
A.10
B.6
C.8
D.12
参考答案:D
4、设有如下说明
typedef struct ST
{
long a;
int b;
char c[2];
} NEW;
则下面叙述中正确的是______。
A.ST是一个结构体类型
B.NEW是一个结构体类型
A.typedef struct
{ int red;
int green;
int blue;
} COLOR;
COLOR cl;
B.struct color cl
C语言程序设计 第9章 文件

9.3 文件的顺序读写
❖ 【例9.4】fputs函数和fgets函数的使用。
9.3 文件的顺序读写
❖ 9.3.3 fprintf函数和fscanf函数 ❖ fprintf与fscanf函数为格式读写函数,与printf、scanf类似,fprintf与
fscanf用于从文件中读取指定格式的数据和把指定格式的数据写入文件,这 是按数据格式要求进行文件的输入/输出。其一般形式为: ❖ fscanf(fp,format,args); ❖ fprintf(fp,format,args); ❖ 其中,fp为文件指针,format为格式控制字符串,args为输入或输出的地 址列表。 ❖ 例如,若文件指针fp已指向一个已打开的文件文本,a、b分别为整型变量 ,则以下语句从fp所指向的文件中读入两个整数放入变量a和b中。 ❖ fscanf(fp,”%d%d”,&a,&b); ❖ 又如,若文件指针fp已指向一个已打开的文件文本,x、y分别为整型变量 ,则以下语句将x、y中的数据按%d的格式输出到fp所指向的文件中。 ❖ fprintf(fp,"%d%d",&a,&b);
本章小结
❖ 本章主要介绍了以下内容。 ❖ (1)文件的概念 ❖ 介绍了文件及文件指针的基本概念,以及文件的打开与关闭
函数fopen、fclose等。 ❖ (2)文件的顺序读写 ❖ 主要介绍了从文件中输出字符、字符串,以及将字符、字符
串写入文件的函数。 ❖ (3)随机文件的读写及错误检测 ❖ 主要介绍了随机文件读写的应用,以及文件的出错检测。
❖ 在实际读写文件中,人们常常希望能直接读到某一数据 项而不是按物理位置顺序逐个读下来。这种可以任意指 定读写位置的操作称为文件的随机读写。可以想象,只 要能移动位置指针到所需要的地方,实现文件的定位, 就能实现随机读写。
C语言-结构体定义的几种方式

C语⾔-结构体定义的⼏种⽅式若struct后⾯接的是名字,则其为该结构体的名称。
第⼀种是最基本的结构体定义,其定义了⼀个结构体A。
struct A //第⼀种{int a;};第⼆种则是在定义了⼀个结构体B的同时定义了⼀个结构体B的变量m。
struct B //第⼆种{int b;}m;第三种结构体定义没有给出该结构体的名称,但是定义了⼀个该结构体的变量n,也就是说,若是想要在别处定义该结构体的变量是不⾏的,只有变量n这种在定义结构体的同时定义变量才⾏。
struct//第三种{int c;}n;第四种结构体定义在第⼀种结构定义的基础上加了关键字typedef,此时我们将struct D{int d}看成是⼀个数据类型,但是因为并没有给出别名,直接⽤D定义变量是不⾏的。
如D test;,不能直接这样定义变量test。
但struct D test;可⾏。
typedef struct D //第四种{int d;};第五种结构体定义在第四种结构体定义的基础上加上了别名x,此时像在第四种结构体定义中说得那样,此时的结构体E有别名x,故可以⽤x定义E的结构体变量。
⽤E不能直接定义,需要在前⾯加struct,如struct E test;。
typedef struct E //第五种{int e;}x;第六种结构体定义在第五种的基础上减去了结构体名,但是若是直接使⽤y来定义该结构体类型的变量也是可以的。
如y test;。
(常⽤)typedef struct//第六种{int f;}y;。
C语言各章节单元测试题及答案——结构体与共用体

第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。
A) p=2*(int *)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int));C) p=(int *)malloc(2*2); D) p=(int*)calloc(2,sizeof(int));✧考点:动态存储分配函数。
✧分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void * calloc(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。
malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。
答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。
✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。
A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。
✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。
它应该等于结构体每个成员所占的字节数之和。
m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。
C语言程序设计-杨路明第9章课件

9.3.3 结构体数组的使用
(3) 不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成 员对象进行输入输出。例如:
/*学号*/
char name[20]; /*姓名*/
char sex;
/*性别*/
int age;
/*年龄*/
float score;
/*C成绩*/
char addr[40];
};
注:‘;’不能省
结构体类型定义描述结构 的组织形式,不分配内存
9.1 结构体类型的定义
例如,考虑10门课程成绩, 加上总成绩与平均成绩,可作如下定义:
struct是关键字,不能省略
struct
[结构体类型名] {
成员说明列表: ……….
}
成员类型可以是 基本型或构造型
9.1 结构体类型的定义
实例:定义结构体类型,描述下列数据 (1) 学生情况: 包含学生的学号、 姓名、 性别、 年龄、C语言课程成绩,地址:
struct student
{ int num;
输出stud变量,应该使用如下方式:
应该如何输出stud变量?
printf(″%s,%s,%ld\n″,,stud.addr,stud.num); 输入stud变量的各成员值,则用:
scanf(″%s%s%ld″,,stud.addr,&stud.num);
9.3 结构体类型数组
9.4.2 指向结构体数组元素的指针
C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
第9章 结构体、共用体和枚举类型

9.1 结构体类型与结构体变量 9.2 结构体数组 9.3 向函数传递结构体型数据 9.4 链表 9.5 共用体 9.6 枚举类型 9.7 用户自定义类型
9.1 结构体类型与结构体变量
• 结构体类型的定义
–概述:
• 建立单链表的主要步骤为:
– 生成只含有头结点的空链表; – 然后读取数据信息,生成新结点,将数据存放于新结点中, 插入新结点到单链表中 – 重复第二步,直到输入结束。 根据新结点插入到链表的位置的不同,建立链表的方式, 分为在表尾插入的方法和在表头插入的方法。 •表尾插入: 例9.6 •表头插入: 例9.7
• 共用体变量的定义
–用已定义的共用体类型去定义共用体变量 –定义共用体类型的同时定义变量: –定义无名共用体类型的同时定义变量:
• 共用体变量的引用
–引用方式:共用体变量名.成员名 共用体变量名. 共用体变量名 –说明: 对于共用体变量,只能引用它的成员,而不能引用整个 共用体变量。若共用体的成员是构造类型的,则需要逐级引 用至最低级的成员。 –能通过定义指向共用体的指针变量来引用共用体变量。
在实际应用中,一组相关的数据可能是不同类型的。C语 言提供了包含不同类型成员的类型来定义这样的数据,这 种类型就是结构体类型 结构体类型。 结构体类型
– 定义形式:
struct 结构体名 类型名1 成员名1 {类型名1 成员名1; 类型名2 成员名2 类型名2 成员名2; …… 类型名n 成员名n 类型名n 成员名n; };
• 举例
例9.11 上一页
9.6 枚举类型
• 枚举类型的定义–定义来自式:enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n}; •
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题:若结构体是嵌套定义的,空间如何计算?
struct date
{ int year; int month;
stu1所占空间大小为多少?
int day;
};
struct ST { int ID;
30
char Name[10];
char Sex[4];
struct date TimeOfEnter;
int Score_1; int Score_2;
struct ST { int ID;
char Name[10]; char Sex[4]; int TimeOfEnter; int Score_1; int Score_2; int Score_3; int Score_4; }stu1, stu2;
struct 结构体名 {
成员表列; } 变量名表列;
10
9.1 结构体数据类型
以下程序运行的结果是: #include<stdio.h> main( ) { struct date
{ int year,month,day; } today;
sizeof运算用来 求得一个变量 或数据类型在 内存中占内存 空间的字节数。
printf(“%d\n”,sizeof(struct date));
struct ST stu1, stu2;
数据类型
变量名
一旦定义了结构体类型的变量stu1,stu2,它们就具有了 struct ST类型结构,系统为每个变量分配相应的内存,内
存的大小由声明的结构体决定,即结构体中所有成员 占用内存的总和。
6
9.1 结构体数据类型
struct ST { int ID;
C语言的数据类型
基本类型
整型 实型 (浮点型) 字符型 枚举类型
数据类型
构造类型
数组类型 结构体类型 共用体类型
指针类型
1
第9章 结构体、共用体与枚举
❖9.1 结构体 ❖9.2 共用体
构造数据类型
❖9.3 枚举类型
❖ 9.4用户定义类型
2
9.1 结构体
一、问题的提出 经常会碰到一些表格,例如下面的学生成绩管理表格。
8
9.1 结构体数据类型 (形式三)直接定义结构体变量
struct { int year; int month; int day; } birthday;
struct {
成员表列 } 变量名表列;
用无名结构体直接定义 变量只能一次
9
9.1 结构体数据类型
说明:结构体类型与结构体变量概念不同
– 结构体类型: 不分配内存 – 结构体变量: 分配内存 – 结构体类型: 不能赋值、存取、运算; – 结构体变量: 可以赋值、存取、运算;
struct ST { int ID;
char Name[10]; char Sex[4]; struct date TimeOfEnter; int Score_1; int Score_2; int Score_3; int Score_4; }stu1, stu2;
12
9.1 结构体数据类型
1、对结构体成员的引用方法: 结构体变量名 . 成员名 成员运算符 优先级: 1 结合性:从左向右
如:=“张三” gets(stu1. Name); scanf(“%d%c%d%d”, &stu1.ID, &stu1.Sex, &stu1.Score_1, &stu1.Score_2);
学号 姓名 性别 入学时间 计算机原理 C语言 编译原理 操作系统
1 张三 男 2003
95
98
85
78
2 李四 女 2003
92
90
91
86
••••••
3
9.1 结构体数据类型
二、结构体的声明
结构体——是一个或多个可以是相同数据类型、也可以是
不相同的数据类型的变量集合在一个名称下,便于应用的数据
类型。结构体声明的格式如下:
关键字
struct 结构体名
新的数据 类型名
构成结构体 的成员
{
成员表列
}; ;声明结束,不能省略
4
9.1 结构体数据类型
例如对于前面的学生成绩管理例子中,
可以声明如下结构体:
struct ST
ID
{ int ID; char Name[10]; char Sex[4]; int TimeOfEnter; int Score_1; int Score_2; int Score_3;
Name
Sex
TimeOfEnter
Score_1 Score_2 Score_3 Score_4
int Score_4;
};
…..
…
2字节 10字节 4字节 2字节 8字节
5
9.1 结构体数据类型
注意:此时只是声明了一种新的数据类型,这种数据类型就是 Struct ST,此时并不为其分配空间。
三、定义结构体变量 (形式一) 先声明结构体类型再定义结构体变量
char Name[10]; char Sex[4]; int TimeOfEnter; int Score_1; int Score_2; int Score_3; int Score_4; }; struct ST stu1, stu2;
stu1所占空间大小为多少?
26
7
9.1 结构体数据类型 (形式二)在声明结构体类 Score_4;
}stu1, stu2;
13
9.1 结构体数据类型 四、结构体变量的引用
C语言规定,不能将一个结构体变量作为一个 整体进行输入、输出。
即不可以: printf(“%d%s%d”, stu1); 只能对结构体变量中的成员分别进行引用。
14
9.1 结构体数据类型
stu1.Score_1++;
15
9.1 结构体数据类型 2、结构体嵌套时成员的引用方法:
当结构体成员又属于一个结构体类型,即结构 体嵌套,访问需一级一级到最低级成员。
16
9.1 结构体数据类型
习题:
struct date
struct worker
{ int month;
{ char name[20];
}
6
sizeof(变量名)或sizeof(类型标识符)
11
9.1 结构体数据类型
结构体可嵌套,即结构体成员也可以是结构体。
若表格的形式如下:
入学时间 学号 姓名 性别
年月日
计算机原理
C语言
编译原理
操作系统
则结构体形式如下: struct date {
int year; int month; int day; };