26.结构数组程序设计基础_第1页
26.结构数组程序设计基础_第2页
26.结构数组程序设计基础_第3页
26.结构数组程序设计基础_第4页
26.结构数组程序设计基础_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计基础(C语言)郁金香技术论坛课程网站: 程序设计基础(C语言)结构体、共用体与枚举类型 31.结构概念C语言允许将一组逻辑上联系的不同类型的数据组织起来作为一个整体使用保证了数据之间的内在联系用同一个名字引用的相关变量的集合提供了将相关信息组合在一起的一种手段语言提供了一种新的称为结构的构造型数据类型概念结构是一组相关的不同类型的数据的集合结构类型为处理复杂的数据提供了便利的手段结构体类型的变量可以拥有不同数据类型的成员是不同数据类型成员的集合4例如:学生成绩表由下面的项目组成: 班级 学号 姓名 操作系统 数据结构 C程序设计 网络工程(字符串) (长整) (字符串) (实型) (实

2、型) (实型) (实型)通讯录有下列数据项组成: 姓名 工作单位 家庭住址 邮编 电话号码 E_mail(字符串) (字符串) (字符串) (长整) (字符串或长整) (字符串)成绩表: struct score char grade20;/*班级*/ long number ; /*学号*/ char name20;/*姓名*/ float os; /*操作系统*/ float datastru; /*数据结构*/ float cprog; /*C语言程序设计*/ float compnet; /*网络工程*/ ;通讯录表: struct addr char name20; /*姓名*/ c

3、har department30;/*部门*/ char f_address50;/*家庭住址*/ long box; /*邮编*/ long phone; /*电话*/ char email20;/*Email*/ ;1.结构概念51.结构概念结构体与数组组成方式都是由若干分量组成的数组是由相同类型的数组元素组成结构的分量可以是不同类型的结构中的分量称为结构的成员访问方式数组中的分量(元素)是通过数组的下标访问结构中的成员是通过成员的名字结构体的成员可以分别引用利用结构体可以组织复杂的紧凑的数据结构如:链表、队列、堆栈和数等62.结构的定义在程序中使用结构之前,必须做的工作定义结构体类型建立

4、一个可用于定义结构类型变量的模型其组成的各个要素称为结构体的成员结构的定义说明了该结构的组成成员,以及每个成员的数据类型变量在计算机中的存在格式定义结构体变量要使用该结构就必须说明结构类型的变量根据结构体类型为所定义的变量分配内存空间提示不同的问题有不同数据成员,即不同描述的结构体类型可以理解为结构体类型根据所针对的问题不同而使得其结构体的成员是不同的可以有任意多的结构体类型描述使得C语言可以解决的问题范围扩大72.结构的定义结构定义的形式说明struct为关键字结构的标识符结构类型名称是所定义的结构的类型标识由用户自己定义 中包围的是组成该结构的成员项每个成员的数据类型既可以是简单的数据类型

5、,也可以是复杂的数据类型整个定义作为一个完整的语句用分号结束提示结构体类型的说明只是列出了该结构的组成情况标志这种类型的结构模式已存在编译系统并没有因此而分配存储空间struct 结构类型名称 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ;82.结构的定义结构定义的形式例当一个成员项是一个结构体时,就形成了结构体的嵌套在数据处理时有时要用到结构体嵌套处理组织复杂的数据集合常见的错误是忘记终止结构定义的“;”例:定义一个日期结构体类型 struct date int year; int mouth; int day;例:定义一个teacher 类型的结构体 struct d

6、ate int year; int mouth; int day; ; strcut teacher char name20 ; struct date birthday; char depart20 ; ;92.结构的定义结构定义的形式提示结构体必须有struct开始结构体的成员可以是基本数据类型,也可以是数组和其它结构类型的变量结构体不能递归定义在结构体类型说明中不能有该结构体变量允许有指向该结构体的指针成员(自引用结构)结构的定义可以在一个函数的内部,也可以在所有函数的外部在函数内部定义的结构,仅在该函数内部有效定义在外部的结构,在所有函数中都可以使用定义结构体类型后可以定义该结构体类型

7、的变量通过变量使用该结构,以对不同变量的成员进行引用102.结构的定义结构体变量定义的形式struct 结构类型名称 结构变量名; 说明说明结构变量的作用类似于说明一个类型变量一样系统为所说明的结构变量按照结构定义时组成分配存储数据的实际内存单元结构变量的成员在内存中占用连续存储区域,所占内存大小为结构中每个成员的长度之和 例:struct date int year; int mouth; int day; ; struct date today,days20,*day;struct 结构类型名 成员1类型标识 成员1名; 成员2类型标识 成员2名; 成员n类型标识 成员n名; ; stru

8、ct 结构体类型名 结构体变量列表;112.结构的定义结构体变量提示在程序中,结构的定义要先于结构变量的说明不能用尚未定义的结构类型对变量进行说明结构的定义和说明可以同时进行被说明的结构变量可直接在结构定义的“ ”后给出例如说明结构变量today可以使用下面的语句 struct date int year, month, day; today;使用sizeof计算一个结构变量占用内存的实际大小使用的一般形式为:sizeof(变量或类型说明符)122.结构的定义结构体变量提示结构体类型与结构体变量是两个不同的概念编译系统不为结构体类型分配内存空间,只为结构体变量分配内存空间内存的大小依据结构体类

9、型的定义(结构体类型的变量占内存长度不定长)结构体中的成员名可以和程序中的其他变量同名,互不影响,也可以与结构变量名相同但应尽量避免在不同的结构中使用相同的结构名虽然允许,但会造成混淆结构体变量的成员(域)可以单独使用(相当于基本变量)成员也可以是指向本结构体类型的指针struct teacher char name20 ; int age; char sex; char depart20 ; struct teacher *next; ; 133.使用结构体结构成员的引用结构作为若干成员的集合是一个整体可对结构整体进行操作可访问结构中的每个成员使用结构中成员的方法结构变量名.成员名称运算符“

10、.”的含义是访问结构中的成员“.”操作的优先级最高结合性为从左到右指针变量名-成员名在结构体指针变量情况下使用运算符“-”143.使用结构体结构成员的引用例对于结构体变量today有效的结构体成员是year,month,daytoday.year,today.mouth,today.day是对结构体变量today的合法引用打印today的成员year printf(“%d” ,today.year);将today的成员 month置为12 today.month=12;struct date int year; int month; int day; today,tomorrow ;153.使

11、用结构体结构成员的引用提示结构的成员可以象一般变量一样参与各种操作和运算进行结构变量的整体操作就有很多限制由于结构中各个成员的逻辑意义不同,类型不同,对结构变量整体的操作的物理意义不是十分明显C语言中能够对结构进行整体操作的运算只有赋值“=”和取地址“&”操作例如: struct date day1=1999,10,12; struct date day2;day2= day1;/*将day1的所有成员值赋值给 day2;*/可以引用结构体成员的地址也可以引用结构体变量的地址主要作用于函数的参数传递(传递结构体的地址)163.使用结构体结构成员的引用提示C语言不允许将两个结构体变量整体比较,只

12、能是逐个成员之间进行比较例如 struct date d1=1994,11,20,d2;d2=d1;d2.day=7;if ( d1.year= =d2.year )&( d1.month= =d2.month ) &( d1.day= =d2.day ) printf(“same day”); else printf(“diffierent day”);17struct date int year; int mouth; int day; struct student int num; char name20; char sex; int age; struct date birthday;

13、 char addr30 ; stud1,stud2;3.使用结构体结构成员的引用提示对于嵌套定义的结构体成员的引用,要逐级找到最后一级的结构体成员,只能对这个成员进行引用用成员运算符“.”自左向右的将内外层连接起来对中间过程所涉及的成员不能引用合法引用一个学生的生日: stud1.birthday.day; stud1.birthday.month; stud1.birthday.year;183.使用结构体结构的初始化在结构说明的同时,可以对每个成员置初值,称为结构的初始化结构初始化的一般形式说明初始化数据的个数与结构成员的个数应相同它们是按成员的先后顺序一一对应赋值的每个初始化数据必须符

14、合与其对应的成员的数据类型例如struct date nextday=2000,12,27 ;struct 结构类型名 结构变量名=成员1的值,成员2的值,19【例】调式程序 struct person char name20 ; int age; char sex; ; void main() struct person a=“liming” ,23,m; struct person b; b=a; b.age=21; b.sex=f ; printf(“%s,%d year old.n” ,,b.age); if (b.sex= = m) printf(“%s is a man

15、.n” ,); else printf(“%s is a woman.n” ,); jgt1.c3.使用结构体20结构体数组 1.结构体数组的定义 结构体数组中的所有元素都具有相同的结构体类型。 三种定义方式:(1)先定义结构体类型再定义结构体数组 struct teacher char name20 ; int age; char sex; char depart20 ; ; struct teacher teach40 ;(2)同时定义结构体类型和结 构体数组 struct teacher char name20 ; int age; char sex; char

16、depart20 ; teach40 ; 所谓结构数组,就是将一个已定义的结构体的结构变量定义为数组变量,对它的定义与定义一个一般的结构变量一样,可以采用直接定义、同时定义或先定义结构再定义变量的方法。21(3)直接定义结构体数组而不 需要定义结构体类型名struct char name20 ; int age; char sex; char depart20 ; teach40 ; 三种方法都实现了一个结构体数组的定义,结构体数组中有40个元素,每个元素的类型为结构体类型struct teacher。可用teach0 、teach1 、teach39表示数组元素。在内存中的存放方式:teac

17、h43个字节name(20)age(2)sex(1)depart(20) teach0 teach1 teach39name(20)age(2)sex(1)depart(20)22结构体数组的引用 对结构体数组的引用就是指对结构体数组元素的引用,由于结构体数组元素相对于结构体变量,因此对结构体变量的引用方法也同样适用与结构体数组元素。 引用形式: 结构体数组名下标.成员名例如:struct char name20 ; int age; char sex; char depart20 ; teach40 ; 则:teach2.age表示teach数组的第3个元素的age成员项。必须带有下标,以表

18、明要访问结构数组中某个元素对应的结构中的成员。23结构体数组元素的赋值ANSI C标准允许将一个结构体数组元素赋值给同一结构体数组的其它元素,或者赋值给同一类型的变量。例如:前面的teach结构体数组定义后,可以进行这样的赋值: teach3=teach0 ;结构体数组的输入输出 不能对结构体数组变量和结构体数组元素作为一个整体直接进行输入输出,只能对数组元素的单个成员进行输入输出。例如:scanf(“%d” ,&teach3.age); printf(“%c” ,teach0.sex);24结构体数组的初始化 C语言规定只能对全局的或静态的结构体数组进行初始化,由于数组中的每个元素都是一个结

19、构体类型,因此要将其成员的值依次放在一对中,以便区分各个元素。例如: struct depart int no; char depname; dp3 =3, “人事处”, 6, “财务处”, 10,“计算中心” ;可以看出:初始化的一般形式: struct 结构名 结构数组名=初始值;初值表内的的作用主要是区别不同数组元素的数据,系统会顺序地按照每对将数据赋给每一个数组元素。有关数组的规定对结构体数组都适用。25【例】有4个学生,每个学生包括考号、成绩、姓名,求出成绩最好 的学生的姓名和成绩。 struct syudent int num; char name10 ; floart score

20、 ; stud4=1,“ny” ,89, 2,“tz” ,91, 3,“lm” ,75,4,“sn” ,89 ; main() float max;int i,k; max=stud0.score; k=0; for (i=1;i=4;i+) if (max” ,用于连接指针变量与其指向的结构体成员。如: ( *pt ).age可写成pt -age的形式。结构体变量名.成员名(*结构体类型指针).成员名结构体类型指针-成员名例如:teach.age(*pt).agept-age下面三种引用方式是等价的。 与普通指针变量一样,给结构指针变量赋值时,也应赋予同类型的结构变量的地址值,而不是某种基类

21、型的数据值。并当地址类型不同时需要使用强制类型转换。30pt只能指向一个结构体变量,如:pt=&teach;而不能指向结构体变 量的一个成员。如:pt=&teach.age;是非法的。虽然&teach.age也 有地址,但这个地址存放的数据类型为整型数据而非结构体类型数据。pt只能指向一个结构体数组的一个元素(相当于变量),然后用-指 向运算符取其成员的值,而不能直接指向一个数组元素的成员。-运算符的优先级最高。例如:struct int numb; char *name; *p;则有表达式: +p-numb:表示numb的值增加1。而不是p指针向下移动。 等价于+(p-numb)。 (+p)

22、-numb:表示p指针增加操作后,再访问其成员numb。 (p+)-numb:先对numb操作,再对指针p加1。31同理: *p-name:是取 name所指向的值; *p-name+:先取name所指向的值,在将name加1。 (*p-name)+:是将name所指向的值加1。 *p+-name:先取name所指向的值,再将指针p加1。例题:对结构体变量的使用。输入一个结构体变量成员并输出。 #include struct data int day,month,year; ; struct stud char name20; long num; struct data birthday; ;

23、程序中使用结构体类型指针引用结构体类型变量的成员,需要通过C语言提供的库函数 malloc()来为指针分配安全的地址。函数sizeof()返回值是计算给定数据类型所占内存的字节数。指针所指向各个成员的形式为: studptr-name, studptr-num, studptr-birthday.32 main() struct stud *studptr; studptr=malloc(sizeof(struct stud); printf(“input name,number,year,month,day:n”); scanf(“%s”,studptr-name); scanf(“%ld”

24、,&studptr-num); scanf(“%d%d%d”,&studptr- birthday.year, &studptr- birthday.month, &studptr-birthday.day); printf(“noutput name,number,birthday:n”); printf(“%20s%10ld%10d/%d/%d”, studptr-name,studptr-num, studptr-birthday.year, studptr-birthday.month, studptr-birthday.day); jgt3.c33指向结构体数组的指针的应用定义结构体

25、类型的指针指向数组元素指向数组名但在使用时要加以区分例如:对上例定义成结构体数组以及指向结构体类型的指针。 struct stu student40,*studptr; 当 studptr=student时,指针studptr指向了结构体数组student。对数组元素的引用方法有三种:地址法: student+i和studptr +i 均表示数组第i个元素的地址,数组元素各成员的引用形式为: ( student+i )-name、 ( student+i )-num和 ( studptr +i ) -name、 ( studptr +i ) -num等。 student+i和p+i 与&stu

26、denti的意义相同.34 常见错误在结构指针运算符和之间插入空格试图只用成员名引用结构的成员。(必须给出结构名)在用指针和结构成员运算符引用结构成员时没有() 就是说*是一种语法错误。指针的数组表示法 当指针studptr指向了数组student, studptri表示数组的第i个元素。其效果与student i相同。对数组成员的引用描述为: 、 studptri.num等。指针法 若studptr指向某个元素,则studptr +就是指向其后续元素.35【例】利用指向结构体的指针编制一程序,实现输入三个学生的学号、 数学期中和期末成绩,然后计算平均成绩

27、并输出成绩表。 #include struct student int num;int mid;int end;int aver;s3 ; main() int i; struct student *p; for (p=s;pnum),&(p-mid), &(p-end); p-aver=(p-mid+p-end)/2; for (p=s;pnum,p-mid, p-end,p-aver); 36结构体与函数 注意 结构变量作为参数传递时,其实参与形参的结构类型必须一致,传递时其实参只需指定其结构变量名即可。当实参为数组时,其形参可以定义为同类型结构的结构数组或结构指针。与普通变量一样,结构变

28、量在函数内部定义时为局部的,其值只在本函数范围内有效,不会影响其它函数 将结构传递给函数的方式有三种传递单个成员传递整个结构传递指向结构的指针传递结构变量的地址可以实现结构的传址调用。 在早期的C语言中,不允许将结构变量作为函数的参数传递,只有在较高版本的C语言中才支持这种传递。与结构变量一样,结构数组作为函数参数传递也只在C的高版本中才支持。37 #define FORMAT “%dn%sn%6.2fn” struct student int num; char name20; float score; ; main() void print (); struct student stud;

29、 stud.num=1001; strcopy(,”michell”); stud.score=90.9; print(&stud); void print(p) struct student *p; printf(FORMAT,p-num,p-name,p-score); printf(“n”); 在调用print时, &stud做实参,将stud的地址传递给函数的形参p,这时p指向了结构变量 stud的成员值。38【例】设有下面的定义, struct aa int i;char c;t; struct ccint m,struct aa *n; struct cc w,*p=&w;要建立右图的结构应如何操作?(用指针实现) 0 p w m n1A i c t

温馨提示

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

评论

0/150

提交评论