结构体和共用体.ppt_第1页
结构体和共用体.ppt_第2页
结构体和共用体.ppt_第3页
结构体和共用体.ppt_第4页
结构体和共用体.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8 结构体和共用体,结构体 共用体 枚举类型,结构体变量 结构体和数组 结构体和函数,8.1 结构体,概述 在事务处理中,常需要将一些关系密切但类型不同的 数据项组织在一起,取一个整体名字,形成一个结构 C语言中,称其为结构体(记录) 结构体通常由不同数据类型的数据项(成员)组成, 一个结构体可包含若干成员,每个成员有自己的名字 及数据类型 结构体为处理复杂数据结构提供了有力的手段,也为 函数间传递不同数据类型的数据提供了方便,8.1.1 结构体类型的定义,struct 结构体类型标识符 结构体成员表; ;,简单类型int,float,char,系统预定义,可直接使用,结构体类型由程序员自行定义, 必须先定义再使用,定义的格式为:,struct关键字,称为结构体定义标识符; 结构体类型标识符程序员命名; 大括号中的结构体成员表包含若干成员, 成员形式:,数据类型标识符 成员名;,struct stud_type char name10; /* 姓名 */ int num; /* 学号 */ char sex; /* 性别 */ int age; /* 年龄 */ float score5; /* 成绩 * / char address10; /* 家庭住址 */ ;,对一个学生的描述,其结构体类型定义如下:,说明:,(1) 定义一个结构体类型只是描述了此结构体的组织形式,在 编译时并不为其分配存储空间,即仅描述此数据结构的形 态或模型,不能对结构体类型进行赋值、存取或运算。,(2) 结构体的成员可以是简单变量、数组、指针、结构体等。,(3) 结构体类型定义可以放在函数内部,也可以放在函数外部。 若放在内部,则只在函数内有效; 若放在外部,则从定义点到源文件尾之间的所有函数都有效。,(4) 结构体成员的名字可以同程序中的其它变量同名,二者不 会相混,系统会自动识别它。,8.1.2.结构体变量 1.结构体变量的定义与初始化 1)定义 先定义, 后引用。 结构体变量的定义可以有三种方式:,struct stud_type char name10; int num; char sex; int age; float score5 ; ; struct stud_type student1, student2;,(1) 先定义类型再定义变量,形式:,struct stud_type char name10; int num; char sex; int age; float score5 ; student1, student2;,(2) 在定义类型的同时定义变量,形式:,struct char name10; int num; char sex; int age; float score5 ; student1, student2;,(3) 直接定义结构体变量,形式:,说明:,(1) 在定义结构体类型时,系统并不分配内存空间, 仅当定义结构体变量时,系统才为被定义的每 一变量分配相应的存储单元。,(2) 结构体变量的定义一定要在结构体类型定义之 后或同时进行,对尚未定义的结构体类型,不 能用它来定义结构体变量。,2) 结构体变量的初始化,初始化:对结构体成员变量赋初值, 赋值时应注意按顺序及类型依次为每个结构 体成员指定初始值。,格式:,struct 结构体类型名 结构体变量=初始化值列表;,说明:,(1) 初始化值列表中初始化数据之间用逗号分隔。,(2) 初始化数据的个数一般与成员的个数相同,若 小于成员数,则剩余的成员将被自动初始化为0。,(3) 初始化数据的类型要与相应成员变量的类型一致。 初始化时只能对整个结构体变量进行,不能仅对结 构体类型中的某些成员进行初始化赋值。,例1:定义结构体变量时赋初值,struct date_type int year; int mouth; int day;; struct stud_type char name10; int num; char sex; struct date_type birthday; float score; ; main() struct stud_type s1=“wang“,101,m,1978,10,12,98 ; struct stud_type s2=“liu“,102,m,1980,9,22,88 ; ,例2:,先定义结构体类型,再定义结构体变量。 系统对类型不分配空间,对变量分配空间。 只能对变量赋值、存取或运算。 成员也可以是结构体变量(嵌套定义),2.结构体变量的引用,1)对结构体变量成员的引用,C语言程序中, 不允许对结构变量整体进行输入输出操作和除赋值外的各种运算,只能是对其成员进行此类操作。,引用结构体变量成员的一般形式:,结构体变量名. 成员名,其中“.”是结构体成员运算符, 其优先级别最高, 结合性是自左至右。,如: 对上例定义的结构体变量s1,s2, 可如下操作: scanf(“%s“,); scanf(“%f“,结构体变量名. 成员名,如果是嵌套定义,用若干个成员运算符,一级一级的找到最低的一级成员。,struct date_type int year; int mouth; int day; ; struct stud_type char name10; long num; char sex; struct date_type birthday; float score; s1,s2;,2)对结构体变量整体的引用 对结构变量整体只能做赋值类的操作,(1) 可以相互赋值,相互赋值的两个结构体变量必须是同一个结构体类型; 如:s2.birthday=s1.birthday;,(2) 可作为函数的实参到形参的值传递、或函数返回值。,不允许在赋值语句中以定义初值的形式对结构变量整体赋值。 不允许对结构变量整体输入输出。 如: s2.birthday=1986,10,3; scanf(“%d %d %d“, ,注意:,若有以下定义,则正确的赋值语句为 。 struct complex float real; float image; ; struct value int no; struct complex com; val1; A) com.real=1; B) plex.real=1; C) .real=1; D) val1.real=1;,结构体数组的定义 结构体数组:数组中每个元素都是一个结构体类型数据,8.1.3 结构体数组,定义结构体数组也有三种形式:,struct date_type int year; int mouth; int day; ; struct stud_type char name10; long num; char sex; struct date_type birthday; float score; char address10; s13; struct stud_type s25;,定义了结构体数组s1,s2,分别有3个、5个元素, 每个元素都是struct stud_type类型。,例:,2. 结构体数组的初始化 结构体数组在定义的同时可以初始化; 一般格式:在定义之后紧跟一个用花括号括起来的一组初始数据, 为了增强可读性, 每一个数组元素的初始数据也用花括弧括起来, 以此来区分各个数组元素。,格式:,另一种方式:,3.结构体数组元素的引用 结构体数组元素引用和其它数组元素的引用方法类似,还要遵循引用结构体变量的规则。,数组名下标 /* 引用整个元素 */ 数组名下标. 成员名 /*引用元素的成员*/,如: s31.num=196102;,说明: (1) 可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或赋给同一类型的变量。 s12= s30; (2) 不能把结构体数组元素整体直接进行输入或输出。,一般形式:,例. 用结构体数组存储学生信息,每个学生有姓名、 学号和成绩。从键盘按学号顺序输入N名学生信息, 再按成绩从高到低的顺序输出各学生的全部信息。,#define N 3 struct int num; char name11; int score; t,sN; main() /*输入基本信息*/ /*选择排序成绩*/ /*输出基本信息*/ ,/*选择排序成绩*/ for(i=0;iN-1;i+) k=i; for(j=i+1;jN;j+) if(sk.scoresj.score) k=j; if(k!=i) t=si; si=sk; sk=t; ,/*输入基本信息*/ int i,j,k; printf(“n请输入第一个学生的学号:“); scanf(“%d“, ,/*输出基本信息*/ printf(“按成绩排序输出:n“); for(i=0;iN;i+) printf(“%d %-10s %5dn“,si.num,,si.score);,实际执行结果,8.1.4 结构体和函数,1.结构体成员可以作为函数的实参,而形参 是与成员同类型的变量。 此时传递的是单个成员值,与同类型的变量传递规则相同。,2.返回值为结构体类型的函数,定义返回值为结构体类型函数的一般形式为:,结构体类型名 函数名(形参表),用结构体类型定义的函数可以将被调函数的结构体类型值返回给主调函数,例.main函数中定义一个结构体数组,多次调用 input函数输入各学生的信息,返回值赋给 结构体数组元素,再多次调用print函数输出。,#include “stdio.h“ struct st_type char num7; char name21; char sex; int age; float score; ; main() int i; struct st_type s2; for(i=0;i2;i+) si=input(); for(i=0;i2;i+) print(si); ,struct st_type input() struct st_type s0; printf(“请输入姓名(其中可以包含空格):“); gets(); printf(“请输入学号、性别、年龄、成绩n“); scanf(“%s %c %d %f“,s0.num, ,void print(struct st_type s0) printf(“输出:学号 姓名 性别 年龄 成绩n“); printf(“%11s “, s0.num); printf(“16s“, ); printf(“%4c“, s0.sex); printf(“%8.2fn“, s0.score); ,3.结构体数组作函数参数 例: 从键盘输入5名学生信息,用排序函数sore对学生按成绩降序排序,并输出排行榜。 #define N 5 struct stud_type char name10; int num; int score; ; struct stud_type s5; void sort(struct stud_type stu );,main() int i,j,k; printf(“n请输入 5 个学生的n姓名 学号 成绩 n“); for(i=0;iN;i+) scanf (“%s%d%d“, , ,void sort(struct stud_type stu5) int i,k,j; struct stud_type t; for(i=0;iN-1;i+) k=i; for(j=i+1;jN;j+) if(stuk.scorestuj.score) k=j; if(k!=i) t=stui; stui=stuk; stuk=t; ,实际执行结果,第16周课程安排,周二、周四上午正常上课 周三上机光电1201-03中午13:40-14:10 光电1204-05,7-8节16:30-18:00,作业:P164:7-1,7-2,7-6,7-8 补充题:利用函数调用,求解:,上机任务: 1. 验证第7章作业中的三个编程题。 2.定义一个学生结构体类型(姓名、学号、C语言成绩);输入某个学生的上述信息并输出。 注意:上机时,先做求阶乘的函数实验和结构体实验,再验证7.6和7.8。 保证将结构体上机熟悉。 周四上课时交作业!,8.2 共用体,1.定义形式:,union 类型标识符 成员表列; ,C语言中,允许不同类型的数据使用同一段内存,让不同类型的变量存放在起始地址相同的内存中。,共用体覆盖存储技术,数据类型标识符 成员名,union关键字:共用体定义标识符;类型标识符: 用户命名; 它们共同组成共用体类型名; 成员定义形式:,例: union data int i; char ch; float f; ;,共用体变量所占的内存长度等于最长的成员的长度,2.共用体变量定义与引用 1)共用体变量的定义 和结构体变量的定义相似, 有三种方式,union 共用体名 共用体成员表; 变量表列;,例: union data int i; char ch; float f; a,b,c;,注意:同一共用体变量的各共用体成员共占同一段内存。,2)共用体变量的引用方式,先定义,后引用,不能引用共用体变量,只能引用共用体变量中的成员,3.共用体类型数据的特点,同一个内存段可以用来存放几种不同类型的成员, 但在每一瞬间只能存放其中一种,而不是同时都存放;,共用体变量中起作用的成员是最后一次存放的成员, 在存入一个新的成员后原有的成员就失去作用;,共用体变量的地址和它的成员的地址都是同一地址;,共用体类型可以出现在结构体类型定义中。,共用体变量不能进行初始化,也不能进行整体输入输出。,4.共用体应用举例,例. 通过共用体变量,将一个整数25419的两个字节分别按十六进制和字符方式输出,如图所示。,union int_char int i; char ch2; ; void print(union int_char x) printf(“i=%dni=%Xn“,x.i,x.i); printf(“ch0=%X,ch1=%X n “,x.ch0,x.ch1); printf(“ch0=%c,ch1=%cn“,x.ch0,x.ch1); main() union int_char x; x.i=25419; print(x); ,i=25419 i=634B ch0=4B,ch1=63 ch0=K,ch1=c,25419D=110001101001011B,实际执行结果:,8.3 枚 举 类 型,一般形式:,enum 类型标识符 枚举值名表 ;,花括号中的枚举值形式:,常量标识符1,常量标识符2,常量标识符n,例: enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;,编程时有些数据的取值范围是可枚举的几个值, 如星期几,月份; 可用整数来表示这些取值, 但可读性差, 如程序中出现1, 代表星期一还是一月份?很难区分; 若在程序中使用Mon、Jan, 则非常明确。为提高程序的可读性, 用有意义的标识符来表示取值是非常必要的; C语言称之为枚举类型。,1.定义,定义类型后,可用该类型来定义变量,如: enum weekday workday;,可将枚举类型定义和变量定义合并, 如: enum weekday sun, mon, tue, wed, thu, fri, sat workday;,说明: 各枚举常量不是枚举变量的成员, 而是它可能取的值。枚举常量是常量, 不允许对它进行赋值操作。 C语言的枚举常量是有序的, 每个枚举常量对应一个固定的整数序号, 它取决于在定义时排列的次序, 第一个枚举常量的序号隐含为0, 以后顺序加1,可在枚举类型定义时显式指定枚举常量的序号。,如:enum fruit apple=5, pear, lemon, orange=2, peach t;,显式指定apple的序号为5, pear和lemon的序号分别为6和7, orange的序号为2, peach的序号为3。 不要误认为apple=5是给apple赋初值5,枚举常量与对应序号的类型不同, 它仅表示apple的序号为5。,2.枚举类型的变量,enum weekday d1, d2; /* 定义枚举变量d1和d2 */,注意:一个枚举变量的值只能取该类型定义的几个枚举常量, 可以将枚举常量或枚举变量赋给一个枚举变量,但不能 将一个整数赋给它。,d1=sun; d2=d1;,正确,d1=7;,错误,若想将整数值赋给枚举变量,须作强制类型转换。,d1=(enum weekday)2;,相当于d1=Tue;,enum language English=6, French, Chinese=1, Japanese, Italian ; 则枚举Italian的值为 。 A10 B4 C3 D5,例. 输入一整数,转换为枚举类型,并存入枚 举类型的变量,再显示与之对应的星期值。,注意: 枚举值可以比较大小,规则是按它们的序号比较 枚举值不能直接输入和输出,输入一般通过序号转换,输出一般通过switch语句以字符串方式输出,#include “stdio.h“ main() enum weekSun=7,Mon=1,Tue,Wed,Thu,Fri,Sta; enum week weekday; int i; printf(“input integer:n“); scanf(“%d“, ,用typedef定义类型:,可以用typedef声明新的类型名来代替已有的类型名 格式:,typedef int INTEGER; typedef float REAL;,int i,j; float a,b;,INTEGER i,j; REAL a,b;,typedef struct int month; int day; int year; DATE; DATE birthday;,8.4 Typedef语句,typedef 类型 别名;,例:,typedef int INTEGER; /* 定义别名INTEGER */ struct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论