欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    七章节结构体与共用体.ppt

    • 资源ID:3315859       资源大小:449.57KB        全文页数:57页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    七章节结构体与共用体.ppt

    第七章 结构体与共用体,高级语言程序设计,莆田学院现代教育技术中心 2004年3月 制作,莆田学院现代教育技术中心 2004年3月,本章主要内容,本章介绍:如何自己构造数据类型(构造型数据) 结构体 内存分配函数 共用体 枚举类型 类型定义,莆田学院现代教育技术中心 2004年3月,C(C+)数据类型,莆田学院现代教育技术中心 2004年3月,一、结构体,1概述 数 组 是构造类数据,其数组元素必须是同一数据类型的。 结构体 也是构造类数据,但其成员可以是任何类型的。 构造类型使用户可以象处理单个变量一样来处理复杂的数据结构。,诸如学生花名册、通讯录之类的数据,最适合用结构体来处理。因为这类数据具有如下特点: 每个人信息都是一个复合的构造数据,如由姓名、学号、性别、年龄、家庭住址、联系电话等“成员”组成。 不同的人,数据的值不同,但都有共同的成员组成。,莆田学院现代教育技术中心 2004年3月,使用结构体的一般步骤,根据问题的要求定义一个结构体类型 用自己定义的结构体类型定义结构体变量 在程序中使用结构体变量处理问题 比较普通变量的情况: 用系统给定的数据类型定义变量 在程序中使用变量处理问题,莆田学院现代教育技术中心 2004年3月,如何定义结构体类型?,struct 结构体名 类型标识符 成员名; ;,关键字 用户指定,/*struct 结构体名合称“结构类型标识符”*/,/*成员表列*/,/*此处分号不能省略*/,莆田学院现代教育技术中心 2004年3月,一个示例,【例一】 main() struct student int number; char name6; char sex; int age; char address20; ; ,本质上,它定义了一个名为”student”的“结构体类型”(表头)。,莆田学院现代教育技术中心 2004年3月,小结:什么是“结构体类型”?,用户自己定义的构造型数据类型 由若干数据项(成员)组成 同一结构体中的成员可以具有不同的数据类型 注意成员定义与普通变量定义的区别: 成员定义时不为其分配内存 变量定义时为其分配内存,莆田学院现代教育技术中心 2004年3月,结构体类型的特点:,组成结构体的成员本身必须是一种已有定义的数据: 基本类型成员(整型/字符型/实型) 指针类型成员 数组类成员 其他构造类成员(包括已定义的另一种结构体)P262 注意:成员变量,故成员名可与变量名同名 P263 结构体类型可以有千千万万种,表示由若干不同数据项组 成的复合类型。 定义结构体类型时,系统不会为该结构体分配内存(只是定义类型,而非变量声明),莆田学院现代教育技术中心 2004年3月,2、结构体类型变量的定义,定义了以上结构体类型后,struct student 相当于标准数据类型关键字char, int ,float我们可以用它来定义“结构体变量”。 在结构体类型定义后,用 struct 结构体名 复合词定义 struct 结构体名 ; struct 结构体名 变量名1,变量名2, 变量名n; 如:struct student a,b30,*p; a 为struct student类型的变量 b 为struct student类型的数组(每个元素都是一个结构 体变量,都有众成员) p 为指向struct student类型的指针变量,莆田学院现代教育技术中心 2004年3月,还有两种合二为一方法, 在定义结构体类型的同时定义结构体类型变量 struct 结构体名 变量名1,变量名2, 变量名n; 直接定义结构体类型变量 struct 变量名1,变量名2, 变量名n;,实际使用中,还可以使用以下形式: 先定义 #define STU struct student 尔后 STU student1,student2;,莆田学院现代教育技术中心 2004年3月,【例二】定义结构体类型的同时定义结构体类型变量。 main() struct student int number; char name6; char sex; int age; char address20; a,b30,*p; ,【例三】不定义结构体类型,直接定义结构体类型变量。 main() struct int number; char name6; char sex; int age; char address20; a,b30,*p; ,莆田学院现代教育技术中心 2004年3月,其他有关知识,实际使用中,还可以使用以下形式: #define STU struct student STU stu1,stu2; 比较一下两种变量定义方式的异同: int a,b,c; 定义三个整型变量,每个变量占二个字节,可单独赋值。 struct student a,b,c; 定义三个结构体类型变量,每个变量下有若干“成员”。其占用的内存长度等于各成员项长度之和。,莆田学院现代教育技术中心 2004年3月,示例,【例四】 main() struct student int number; char name6; char sex; int age; char address20; ; printf(“%dn “,sizeof(struct student); ,结果: 31,莆田学院现代教育技术中心 2004年3月,示例,【例五】若有以下定义,则正确的赋值语句为 。 struct complex float real; float image; ; struct value int no; struct complex com; val1; A) com.real=1; B) val1.complex.real=1; C) val1.com.real=1; D) val1.real=1;,答案:C)val1.com.real=1,莆田学院现代教育技术中心 2004年3月,3、结构体变量的初始化和赋值,使一个结构体变量获得数据“值”(实际上是给其各个成员赋值)有三种方法: 定义时初始化之 用赋值语句对各成员分别赋值 同类型的结构体变量间相互赋值 如 student1=student2,莆田学院现代教育技术中心 2004年3月,示例: 定义时初始化之,【例六】 main() struct char name15; char class12; long num; stu=“Wenli“,“Computer“,200113; printf(“%sn%sn%ldn“,stu.name,stu.class,stu.num); ,结果:Wenli Computer 1 200113,莆田学院现代教育技术中心 2004年3月,示例: 用赋值语句对各成员分别赋值,【例七】 main() struct char name15; char class12; long num; stu=“Wenli“,“Computer“,200113; stu.name0='1' stu.class2='A' stu.num=1111; printf(“%s,%s,%dn“,stu.name,stu.class,stu.num); ,结果: 1enli,CoAputer,1111,莆田学院现代教育技术中心 2004年3月,示例: 用赋值语句对各成员分别赋值,【例七】 main() struct char name15; char class12; long num; stu=“Wenli“,“Computer 1“,200113; stu.name0='1' stu.class2='A' stu.num=1111; printf(“%s,%s,%dn“,stu.name,stu.class,stu.num); ,结果: 1enli,CoAputer,1111,莆田学院现代教育技术中心 2004年3月,进行所谓“结构体变量赋值”只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。如对结构体变量stu,以下语句是错误的: scanf(“%s,%s,%ld”,stu); printf(“%s,%s,%ld”,stu);,正确编程: main() struct char name15; char class12; long num; stu; scanf(“%s“,stu.name); scanf(“%s“,stu.class); scanf(“%ld“, ,亦可用以下赋值语句: strcpy(stu.name,”wenli”); strcpy(stu.class, “Computer”); stu.num=200113;,为什么啊?,但是如果改为stu.name=”wenli”是错误的。,莆田学院现代教育技术中心 2004年3月,4、结构体变量的引用,只能引用其成员变量 用圆点(成员运算符)优先级最高 如 val1.no+ sum=val1.com.real+val1.com.image 可以将成员变量按普通变量运算方式处理,包括取地址: &val1 (函数间传递用) &val1.no 对多级结构体,只能对最低级的成员进行赋值、存取及运算处理。,莆田学院现代教育技术中心 2004年3月,示例,以下函数getdays( )计算某年某月某日是该年的第几天。如2001年2月5日是该年的第36天。闰年的二月有29天,表达式“(year%4=0&&year%100!=0)|(year%400)=0”值为真,即为闰年,其中year表示年号。,莆田学院现代教育技术中心 2004年3月,示例,#include “stdio.h“ struct datetp unsigned year,month,day; ; unsigned months =0,31,28,31,30,31,30,31,31,30,31,30,31; main() struct datetp d; printf(“请输入年 月 日:“); scanf(“%u%u%u“, ,答案:【1】&d.day 【2】struct datetp 【3】monthsi,莆田学院现代教育技术中心 2004年3月,5、结构体数组,定义 P265 定义结构体后定义 定义结构体时同时定义,定义结构体后定义 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu3;,定义结构体时同时定义 struct student int num; char name20; char sex; int age; float score; char addr30; stu3;,莆田学院现代教育技术中心 2004年3月,5、结构体数组,初始化 P266 一般初始化 省略维数 定义后初始化,一般初始化 struct student int num; char name20; char sex; int age; float score; stu3= 10101,“李宁“,'M',18,87.5, 10102,“张凡“,'M',19,99, 10103,“王敏“,'F',20,78.5 ;,定义后初始化 struct student int num; char name20; char sex; int age; float score; ; struct student stu3= 10101,“李宁“,'M',18,87.5, 10102,“张凡“,'M',19,99, 10103,“王敏“,'F',20,78.5 ;,莆田学院现代教育技术中心 2004年3月,一般初始化示例,main() struct student int num; char name20; char sex; int age; float score; stu3= 10101,“李宁“,'M',18,87.5, 10102,“赵凡“,'M',19,99, 10103,“王敏“,'F',20,78.5 ; int i; clrscr(); for (i=0;i3;i+) printf(“%s,学号%d,成绩:%.2fn“,stui.name,stui.num,stui.score); ,试一试运行结果,这里面的花括号能不能去掉?,莆田学院现代教育技术中心 2004年3月,6、指向结构体类型的指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址。 如 struct student stu; struct student *p; p=,莆田学院现代教育技术中心 2004年3月,如果 struct student stu; struct student *p; p= 则以下三种形式等价: stu.age (结构体变量名.成员名) (*p).age (*指针变量名.成员名) p-age (指针变量名.成员名) 此时: p-age+ 等效于(p-age)+ 先得 到成员值,再使它加1; +p-age 等效于 +(p-age) 先使成员 值加1,再使用之。,莆田学院现代教育技术中心 2004年3月,struct tm int hours,minutes,seconds; main() struct tm time; time.hours=time.minutes=time.seconds=0; clrscr(); printf(“Now, press any key to begin my clock.“); getch(); for(;) update( ,display(struct tm *t) clrscr(); printf(“%d:“,(*t).hours); printf(“%d:“,(*t).minutes); printf(“%dn“,(*t).seconds); delay() long int t; for(t=1;t=11128000;+t); ,运行一下试试 再把例中的 (*t). 部分或全部替换为 t- 结果有什么变化?,莆田学院现代教育技术中心 2004年3月,7、链表,特点: 按需分配内存 不连续存放 有一个“头指针”(head)变量 每个结点中应包括一个指针变量,用它存放下一结点的地址。 最后一个结点的地址部分存放一个“NULL” (空地址)。,莆田学院现代教育技术中心 2004年3月,链表结点定义形式,定义形式: struct student int number; char name6; struct student *next; ;,莆田学院现代教育技术中心 2004年3月,链表操作常用技术语句,p=p-next 在链表结点间顺序移动指针 将p原来所指结点中next的值赋给p,而p-next值即下一结点起始地址,故p=p-next 的作用是使p指向下一结点起始地址。 p2-next=p1 将新结点添加到现在链表中 如果p2是链表中的末结点,p1指新建结点,此句的功能是使p1所指新结点变成链表中的新的末结点。 p2-next=NULL 让p2所在结点成为链表中最后结点,莆田学院现代教育技术中心 2004年3月,示例,若已建立下面的链表结构,指针p指向某单向链表的首结点,如下图所示。 struct node int data; struct node *next; *p; 以下语句能正确输出该链表所有结点的数据成员data的是 。,A) for ( ;p!=NULL;p+) printf(“%7d,”,p-data); B) for ( ;!p;p=p-next) printf(“%7d,”,(*p).data);,C) while (p) printf(“%7d,”,(*p).data); p=p-next; D) while (p!=NULL) printf(“%7d,”, p-data); p+; ,答案:C,莆田学院现代教育技术中心 2004年3月,链表指针p+表示什么?,main() struct stu int num; char *name; int age; st=12,“ABC“,100,*p= ,结果: FFDA FFE0 FFD6 FFEC 6,结论: 若p指向某个结构体变量,则 p+ 的功能是将指针p 移到本结点后的存储单元,而不是本结点的下一个成员处。 所以链表中不能用p+进行结点间的跳转。,莆田学院现代教育技术中心 2004年3月,静态链表的建立 P274 例11.7,#define NULL 0 struct student long num; float score; struct student *next; ; main() struct student a,b,c,*head,*p; a.num=99101;a.score=89.5; b.num=99103;b.score=90; c.num=99107;c.score=85; head= ,注意有关技巧: 结点是如何定义的? 结点是如何建立的? 如何使诸结点形成链表? 最后一个结点如何建立? 如何从一个结点转到下一结点? 如何遍历所有结点?,莆田学院现代教育技术中心 2004年3月,二、内存分配函数,1、“动态内存分配”的概念 使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。 如,为了保证程序的通用性,最大需要建立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储空间被浪费。 此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。 使用动态内存分配技术建立的链表称为“动态链表”。,莆田学院现代教育技术中心 2004年3月,2、动态内存分配函数 P275/P387,以下函数在malloc.h或stdlib.h中定义(n,x为无符号整数,p为指针变量): void *malloc(x) 分配一个长度为x字节的连续空间,分配成功返回起始地址指针,分配失败(内存不足)返回NULL void *calloc(n,x) 分配n个长度为x字节的连续空间(成败结果同上) void *realloc(p,x) 将p所指的已分配空间大小调整为x个字节 void free(p) 将由以上各函数申请的以p为首地址的内存空间全部释放,莆田学院现代教育技术中心 2004年3月,动态内存分配函数使用示例,#include “stdlib.h“ main( ) char *p; p=(char *)malloc(17); if (!p) printf(“内存分配出错“); exit(1); strcpy(p,“This is 16 chars“); /*如果超过16个字符,可能破坏程序其他部分*/ p=(char *)realloc(p,18); if (p=NULL) printf(“内存分配出错“); exit(1); strcat(p,“.“); printf(p); free(p); ,结果:This is 16 chars.,莆田学院现代教育技术中心 2004年3月,动态链表的建立和遍历示例 (后进先出的数据结构,即所谓“栈”),#define NULL 0 struct info int data; struct info *next; ; main() struct info *base,*p; int n; base=NULL;,for(n=0;ndata=n+1; p-next=base; base=p; while (p!=NULL) printf(“%4d“,p-data); p=p-next; ,结果:10 9 8 7 6 5 4 3 2 1,莆田学院现代教育技术中心 2004年3月,动态链表的建立和遍历示例 (以建立P274链表为例),#define NULL 0 struct info long num; int score; struct info *next; ; main() struct info *head,*p1,*p2; int n=1; clrscr();,head=p1=p2=(struct info *)malloc(sizeof(struct info); printf(“请输入第%d个同学的学号和成绩:“,n+); scanf(“%ld,%d“, ,莆田学院现代教育技术中心 2004年3月,对链表的删除操作 参见 P279,struct student *del(struct student *head,long num) struct student *p1,*p2; if (head=NULL) printf(“n空链表!n“); goto end; p1=head; while (num!=p1-num ,莆田学院现代教育技术中心 2004年3月,对链表的插入操作 参见 P282,struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2; p1=head; /*p1指向第一个结点*/ p0=stud; /*p0指向要插入的结点*/ if(head=NULL) /*如为空链表*/ head=p0;p0-next=NULL; else while (p0-nump1-num) ,莆田学院现代教育技术中心 2004年3月,三、共用体(联合体),1、概述 P287 与结构体相似,共用体也是一种用户自己定义的构造型数据,其成员也可以具有不同的数据类型,但共用体将几种不同的数据项存放在同一段内存单元中。所以,每一时刻只能有一个成员存在占用分配给该共用体的内存空间(新进旧出)。该共用体的数据长度等于最长的成员长度。,莆田学院现代教育技术中心 2004年3月,如何定义共用体类型?,union 共用体名 类型标识符 成员名; ;,关键字 用户指定,/*union 共用体名合称“共用类型标识符”*/,/*成员表列*/,/*此处分号不能省略*/,示例 union data int i; char ch; float p; ;,莆田学院现代教育技术中心 2004年3月,3、共用体变量的声明, 用union 共用体名 复合词声明 union 共用体名 ; union 共用体名 变量名1,变量名2, 变量名n; 在定义共用体类型的同时声明 union 共用体名 变量名1,变量名2, 变量名n; 直接声明共用体类型变量 union 变量名1,变量名2, 变量名n;,莆田学院现代教育技术中心 2004年3月,共用体变量的引用,共用体变量的引用与结构体相似 只能引用其成员变量,不能引用共用体变量本身 正确:printf(“%d”,data.i); 错误:printf(“%d”,data); 不能对共用体变量赋值,不能初始化,不能作为 函数参数! 见P289示例 允许两个同类型共用体之间相互赋值。 可通过指针引用。,莆田学院现代教育技术中心 2004年3月,示例,main() union u_type int i; char ch6; long s; ; struct st_type union u_type u; float score3; ; printf(“%dn“,sizeof(struct st_type); ,结果:18,莆田学院现代教育技术中心 2004年3月,示例,main() union example struct int x; int y; in; int a2; e=0,0; e.a0=1; e.a1=2; printf(“%d,%dn“,e.in.x,e.in.y); ,结果:1,2,莆田学院现代教育技术中心 2004年3月,四、枚举类型,1、概述 P291 所谓“枚举”,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 枚举类型也是用户自定义的数据类型,用此种类型声明的变量只能取指定的若干值之一。,莆田学院现代教育技术中心 2004年3月,2、定义枚举类型,一般形式 enum cnred,yellow,blue,while,black; enum daysun,mon,tue,wed,thu,fri,sat; 0 , 1 , 2 , 3, 4, 5 (有值常量) 花括号中间的数据项称“枚举元素”或“枚举常量”,是用户定义的标识符。,莆田学院现代教育技术中心 2004年3月,3、枚举型变量的声明,enum cn a,b,c; enum day x,y,z; 亦可在定义类型时同时声明枚举型变量: enum cnred,yellow,blue,white,black a,b,c; 【注意】枚举元素为有值常量,默认为0,1,2,3 但定义时不能将 enum cnred,yellow,blue,while,black; 写成 enum cn0,1,2,3,4; 也不能对元素直接赋值,如red=3; 应先进行强制类型转换才能赋值。见P292 a=2; a=(enum cn)2 或 x=(enum day)(5-3); 但可在定义时改变其值。,莆田学院现代教育技术中心 2004年3月,示例,一、以下程序的运行结果是什么? main() enum colorred,green=4,blue,white=blue+10; printf(“%d,%d,%dn“,red,blue,white); 二、以下正确的枚举类型定义是 。 A) enum a=“sun”,”mon”,”tue”; B) enum bsun=7,mon=-1,tue; C) enum c 7,1,2;,结果: 0,5,15,答案:B,莆田学院现代教育技术中心 2004年3月,示例,main() enum colorred,green,blue,white; enum color fc; clrscr(); printf(“请输入色号:“); scanf(“%d“, ,莆田学院现代教育技术中心 2004年3月,五、类型定义(typedef),给已有的数据类型加一个新的别名提高程序可读性(但未建立新的数据类型)。 一般形式: typedef 数据类型名 新别名 (已有定义) (习惯用大写) 例 typedef float REAL; REAL a,b,c;,莆田学院现代教育技术中心 2004年3月,用 法,1、简单数据类型 typedef float REAL ; REAL a,b; =float a,b; 2、数组 typedef char STR80; STR s1; =char s180; 3、指针 typedef float *PF; PF p; =float *p; 4、函数 typedef char FCH( ); FCH a; =char a( );,莆田学院现代教育技术中心 2004年3月,用 法,5、结构体/联合体等 typedef union DATE; typedef struct DATE; DATE birthday, *p; 相当于 union birthday, *p; struct birthday, *p;,莆田学院现代教育技术中心 2004年3月,本章编程练习,1、编写一个竞赛用的秒表程序,按S键开始计时,按E键停止计时。 2、编写一个通讯录程序,能动态存储不超过10个同学的个人信息(如姓名、性别、年龄等),并能进行查询。,

    注意事项

    本文(七章节结构体与共用体.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开