《在C程序中使用结构体.ppt》由会员分享,可在线阅读,更多相关《在C程序中使用结构体.ppt(29页珍藏版)》请在金锄头文库上搜索。
1、结构体徐秋红徐秋红办公地点:办公地点:主楼四层(信息学院)主楼四层(信息学院)411411室室办公电话:办公电话:0100106233651662336516E-mail:主要内容什么是结构体什么是结构体如何定义一个结构体如何定义一个结构体如何声明结构体变量如何声明结构体变量如何引用结构体变量:结构体的输入、如何引用结构体变量:结构体的输入、输出操作、结构体成员操作等输出操作、结构体成员操作等结构体数组结构体数组什么是结构体除数组以外的又一个构造类型除数组以外的又一个构造类型为什么引入结构体的概念为什么引入结构体的概念例如:体检表例如:体检表姓名性别出生日期身高体重年月日(字符串)(字符)(整
2、型)(整型)(整型)(实型)(实型)王利男19898201.8171什么是结构体例如:学生的成绩单例如:学生的成绩单这些表格中数据的特点是什么?这些表格中数据的特点是什么?含义上具有相关性含义上具有相关性表现的形式上不完全相同表现的形式上不完全相同序号序号班级班级学号学号姓名姓名总评总评期末期末平时平时备注备注(整型整型)(字符串字符串)(字符串字符串)(字符串字符串)(实型实型)(实型实型)(实型实型)(字符串字符串)什么是结构体表表格格的数据特点的数据特点:表:表格中格中集合了集合了各各种类型种类型的数据,无法用前面学过的的数据,无法用前面学过的任何单一种类的数据类型来完全描任何单一种类的
3、数据类型来完全描述述因此因此C C语言语言引入引入了了一种能集中不同的一种能集中不同的数据类型于一体的构造类型数据类型于一体的构造类型 -结构体结构体什么是结构体结构体是一个新的构造类型结构体是一个新的构造类型是由编程者根据自己的需求而设计的一种是由编程者根据自己的需求而设计的一种结构形式结构形式(或称为由编程者自己设计的(或称为由编程者自己设计的数据类型数据类型)例如:例如:学号学号姓名姓名英语成绩英语成绩数学成绩数学成绩(字符串字符串)(字符串字符串)(整型整型)(整型整型)通过分析和整理要处理的数据内容,归纳需要哪些数据项,并通过分析和整理要处理的数据内容,归纳需要哪些数据项,并指出每个
4、数据项的表现形式(即它属于哪种数据类型)。指出每个数据项的表现形式(即它属于哪种数据类型)。然后准备定义新的数据类型:结构体然后准备定义新的数据类型:结构体定义结构体定义结构体定义结构体 定义两个内容结构体的名字结构体的内容学号学号姓名姓名英语成绩英语成绩数学成绩数学成绩(字符串字符串)(字符串字符串)(整型整型)(整型整型)struct scorechar num10;char name20;int english;int math;自定义了一个数据类型,自定义了一个数据类型,它的名字为它的名字为score结构体的内容是由多结构体的内容是由多个数据项组成,个数据项组成,每个每个数据项被称为该
5、结构数据项被称为该结构体的体的结构体成员结构体成员定义结构体每个结构体必须先定义,后引用每个结构体必须先定义,后引用定义结构体其实是对定义结构体其实是对结构体内部构成形式进结构体内部构成形式进行描述行描述,即对其成员的声明,包括每个成员,即对其成员的声明,包括每个成员所具有的数据类型的描述。所具有的数据类型的描述。 定义结构体类型的语句格式:定义结构体类型的语句格式:structstruct 结构体类型名结构体类型名 结构体的结构体的成员列表;成员列表; ;struct coordinate double x;double y;对每个成员必须分别声明,无论对每个成员必须分别声明,无论他们是否具
6、有相同的数据类型他们是否具有相同的数据类型通讯录每条记录的描述通讯录每条记录的描述:定义结构体类型姓名工作单位家庭住址邮编固定电话E-mail(字符串)(字符串)(字符串)(整型)(字符串)(字符串)王丽北医三院花园路3号于战海交通大队新源里52号struct addr char name20; char depart30; /* 工作单位工作单位 */ char address30; /* 住址住址 */ int postcode; /* 邮编邮编 */ char phone9; /* 电话号码电话号码 */ char email30; /* E-mail */;声明结构体变量1)1)定义了
7、结构体类型后,再声明结构体类定义了结构体类型后,再声明结构体类型的变量型的变量struct 结构体类型名结构体类型名结构体成员表结构体成员表;struct 结构体结构体类型名类型名结构体变量名;先定义结构体类型先定义结构体类型再声明结构体再声明结构体类型的变量类型的变量声明结构体变量struct singer int s_id; double s1; /* 参赛歌曲得分 */ double s2; /* 知识问答得分 */ double sum; /* 该选手的总得分 */ ;struct singer a1, a2, a3, a4, a5, a6;类型名类型名变量名变量名声明结构体变量2)
8、2) 在定义结构体类型的同时声明结构体变在定义结构体类型的同时声明结构体变量。即将结构体类型的定义和声明结构体量。即将结构体类型的定义和声明结构体变量放在同一个语句中变量放在同一个语句中. .其一般形式如下:其一般形式如下:struct struct 结构体类型名结构体类型名 结构体成员表;结构体成员表; 结构体变量名表;struct singer int s_id; double s1; double s2; double sum; a1,a2,a3,a4,a5,a6; 声明结构体变量3)3)在定义结构体类型时省略结构体类型在定义结构体类型时省略结构体类型名,并直接声明结构体变量。名,并直接
9、声明结构体变量。 一般形式如下:一般形式如下:struct 结构体成员表; 结构体变量名表;即即定义定义的的结构体结构体没有没有结构体类型名。结构体类型名。 如果省略结构体类型名如果省略结构体类型名, , 则称之为则称之为无名结构体无名结构体, , 这种情况常常出现在函这种情况常常出现在函数内部。使用这种结构数内部。使用这种结构体定义形式时,一定是体定义形式时,一定是在定义结构体类型的同在定义结构体类型的同时,就声明结构体变量时,就声明结构体变量struct singer int s_id; double s1; double s2; double sum; a1,a2,a3,a4,a5,a6
10、;结构体的长度结构体类型的长度结构体类型的长度一旦通过结构体类型定义语句定义了一个结构体类型,则这个结构体类型的长度也就被固定下来,.一个一个结构体类型长度结构体类型长度的的计算计算sizeofsizeof( (结构体类型名结构体类型名) )一个一个结构体结构体变量变量长度长度的的计算计算sizeofsizeof( (结构体变量名结构体变量名) )定义结构体类型如 struct singer int s_id; double s1; double s2; stud1;则结构体变量stud1的长度是多少?sizeofsizeof( (数据类型名数据类型名) )返回返回“数据类型名数据类型名”的类
11、型长度。的类型长度。sizeofsizeof( (变量名变量名) )返回返回“结构体变量结构体变量”的长度。的长度。定义结构体类型#include struct singer int s_id; double s1; double s2; stud1stud1;int main(void) printf(nnt 长度: %d %d, sizeof(struct singer); printf(nnt 长度: %d %d, sizeof(stud1); return 0;s_long.c结构体变量的初始化结构体变量初始化的一般形式为:结构体变量初始化的一般形式为:方式方式1:struct 结构体
12、类型名结构体类型名结构体变量名结构体变量名 = 初始化数据初始化数据;方式方式2:struct 结构体类型名结构体类型名结构体成员表;结构体成员表; 结构体变量名结构体变量名 = 初始化数据初始化数据 ;方式方式3:struct 结构体成员表;结构体成员表; 结构体变量名结构体变量名 = 初始化数据初始化数据 ;结构体变量的初始化由于结构体类型变量汇集了各类不同数据类型的成员,由于结构体类型变量汇集了各类不同数据类型的成员,所以结构体类型变量的初始化就略显复杂。所以结构体类型变量的初始化就略显复杂。struct ach /*定义学生结构体类型*/ char name20; /* 学生姓名*/
13、char sex; /* 性别*/ int num; /* 学号*/ float score3; /* 三科考试成绩*/ stu1= Frank, M, 206110, 78.5, 91.5, 95.0 , stu2;结构体变量的引用 C C语言对结构体变量的处理是通过对其语言对结构体变量的处理是通过对其成员成员的引用实现的。的引用实现的。 “. .”被称为被称为成员成员( (分量分量) )运算符运算符它在所有的运算符中优先级最高。它在所有的运算符中优先级最高。引用结构体变量的成员的一般方式为: 结构体变量名.成员名一个整体一个整体结构体变量的引用 从键盘给从键盘给a4a4赋值,然后输出:赋值
14、,然后输出: scanf(%d, scanf(%d, ); ); scanf(%lf%lf, scanf(%lf%lf, );); printf( n %d n, printf( n %d n, );); printf( %f, %f n, printf( %f, %f n, );); printf( %f n, printf( %f n, ););struct singer int s_id; double s1; double s2; double sum; a1, a2 = 113045, 80, 78, 0, a3, a4;&a4.s_id&a4.s1, &a4.s2a4.s_ida4
15、.s1, a4.s2a4.sum=a4.s1+a4.s2给a3赋值:将a2的值赋给a3a3=a2;例如:给变量a1赋值 a1.s_id = 102011; a1.s1 = 88.5; a1.s2 = 89; a1.sum = a1.s1+a1.s2;声明结构体变量例如:例如:struct ach /* 定义学生结构体类型定义学生结构体类型 */char name20; /* 学生姓名学生姓名 */ char sex; /* 性别性别 */ int num; /* 学号学号 */ float score3; /* 三门课程的考试成绩三门课程的考试成绩 */;struct ach stu1=Jon
16、h,M,310,75,96,63, stu2=Lili,F,217,92,87,70; 姓名姓名性别性别学号学号S1S2S3JohnM310759663LiliF217928770类型名类型名声明声明变量名变量名和赋初值和赋初值(stu1.score0+ stu1.score1+ stu1.score2)/3int i;float avg_2, sum=0.0; avg_2= sum/3;求每一位学生求每一位学生的平均成绩的平均成绩avg_1=for( i=0; i3; i+) sum=sum+stu2.scorei;结构体数组struct ach /* 定义学生结构体类型定义学生结构体类型
17、*/char name20; /* 学生姓名学生姓名 */ char sex; /* 性别性别 */ int num; /* 编号编号 */ float score3; /* 三门课程的考试成绩三门课程的考试成绩 */ stu0, stu1 ;struct achchar name20; char sex; int num; float score3; stu2 ;stu2=John,M,310,75 96,63, Lili,F,217,92,78,70 ; printf(n %s, %f , );stu0.name, stu0.score2如果要输出第一位学生的名字和其最后一科的成绩?如何初
18、始化数组?对结构体做一个说明结构体类型是人们制造的一种类型,它结构体类型是人们制造的一种类型,它与其他与其他C的基本类型的特性一样的基本类型的特性一样结构体变量是由结构体声明的变量。它结构体变量是由结构体声明的变量。它与与C的其他基本变量的特性一样的其他基本变量的特性一样结构体的成员是由结构体的成员是由C的其他类型来定义的,的其他类型来定义的,为什么结构体的成员不能由其他已经定为什么结构体的成员不能由其他已经定义的结构体来定义呢?!义的结构体来定义呢?!结构体定义 namesexheightweightsightcommentleftright再来看一张学生体检表:Frank M 1.78 6
19、7.51.0 0.9恐高症Mary F 1.61 58.50.7 0.8青霉素过敏结构体的嵌套 struct sight_table float left; float right; struct case_table char name20; char sex; float height; float weight; struct sight_table sight; char comment30; health2;结构体的嵌套 对嵌套的结构体变量成员的引用:对嵌套的结构体变量成员的引用:strcpy(health0.name, Frank);health0.sex = M;health0.
20、sight.left = 1.2;health0.sight.right = 1.0;printf(%.2f, %.2f n,health0.sight.left, health0.sight.right); health0health0:是结构体数组是结构体数组healthhealth的第的第1 1个元素个元素Frank举例#include struct date int year; int month; int day; ; struct good char name20; char place20; int number; float price; struct date deadlin
21、e; ; 现有库存信息表,包括商品现有库存信息表,包括商品名称、存放地点、库存量、名称、存放地点、库存量、商品单价,入库日期,如商品单价,入库日期,如book,No.3,57000,2book,No.3,57000,20 02.5,2.5,2002009 9,5,1,5,19 9要求用结构体要求用结构体变量变量保存此信保存此信息息,并输出并输出。st_proc.cint main(void) struct good proc;strcpy(proc.name, book);strcpy(proc.place, No.3);proc.price = 202.5;proc.number = 570
22、00;proc.deadline.year = 2009;proc.deadline.month = 5;proc.deadline.day = 19;printf(%s %s %d %.2f %d年%d月%d日n, proc.name, proc.place, proc.number, proc.price, proc.deadline.year, proc.deadline.month, proc.deadline.day); return 0;st_proc.c小结为什么要引用结构体类型,其特点是什为什么要引用结构体类型,其特点是什么?么?如何定义结构体类型?如何定义结构体类型?如何声明结构体变量?如何声明结构体变量?如何声明结构体数组?如何声明结构体数组?如何使用结构体变量?如何使用结构体变量?结构体成员的表示方法和引用方法。结构体成员的表示方法和引用方法。