C程序设计英文课件:CHAPTE 6 Structures_第1页
C程序设计英文课件:CHAPTE 6 Structures_第2页
C程序设计英文课件:CHAPTE 6 Structures_第3页
C程序设计英文课件:CHAPTE 6 Structures_第4页
C程序设计英文课件:CHAPTE 6 Structures_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、6.1 Basics of Structures6.2 Structures and Functions6.3 Arrays of Structures6.4 Pointers to Structures6.5 Self-referential Structures6.6 Table Lookup6.7 Typedef6.8 Unions6.9 Bits-fieldsemployeenameaddressbirthdaycard number 概述 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型 结构体类型声明struct 结构体名结构体名 类型标识符类型标识符

2、 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;成员类型可以是成员类型可以是基本型或构造型基本型或构造型struct是是关键字关键字,不能省略不能省略合法标识符合法标识符可省可省:无名结构体无名结构体6.1 Basic of structures例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; namenumsexagescoreaddr2字节字节2字节字节20字节字节1字节字节4字节字节30字节字节.结构体类型声明描述结构结构体类型声明描述结构的组织形式

3、的组织形式,不分配内存不分配内存6.1 Basic of structures例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 定义结构体类型变量的方法 先声明结构体类型,再定义变量名 一般形式: struct 结构体名结构体名 类型标识符类型标识符 成员名成员名; 类型标识符类型标识符 成员名成员名; .;struct 结构体名结构体名 变量名表列变量名表列;例例 #define STUDENT struct stud

4、ent STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2; 声明结构体类型的同时定义结构体变量 一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名成员名; 类型标识符类型标识符 成员名成员名; .变量名表列变量名表列;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 直接定义结构体变量 一般形式:

5、struct 类型标识符类型标识符 成员名成员名; 类型标识符类型标识符 成员名成员名; .变量名表列变量名表列;例例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用用无名结构体无名结构体直接直接定义变量定义变量,只能一次只能一次例例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnamebirth

6、daymonthdayyear例例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear说明结构体类型与结构体变量概念不同类型: 不分配内存; 变量: 分配内存类型: 不能赋值、存取、运算; 变量: 可以对结构体中的成员可以单独使用,它的作用与地位相当于普通变量。结构体中成员名与程序中变量名可相同,不会混淆结构体可嵌套,即成员也可以是一个结构体变量 结构体变量的引用 引用规则 结构体变量不能整体引用, 只能引

7、用变量成员 可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用成员成员(分量分量)运算符运算符优先级优先级: 1结合性结合性:从左向右从左向右引用方式: 结构体变量名. 成员名例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例例 struct student int num; char name20; struct

8、date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2). ( )例例 struct student int num; char name20; char sex; int age; float score; char addr

9、30; stu1,stu2; stu2=stu1; ( ) 结构体变量的初始化 形式一:struct 结构体名结构体名 类型标识符类型标识符 成员名成员名; 类型标识符类型标识符 成员名成员名; .;struct 结构体名结构体名 结构体变量结构体变量=初始数据初始数据;例例:struct student int num; char name20; char sex; int age; char addr30; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式二:struct 结构体名结构体名 类型标识符类型标识符

10、成员名成员名; 类型标识符类型标识符 成员名成员名; .结构体变量结构体变量=初始数据初始数据;例例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式三:struct 类型标识符类型标识符 成员名成员名; 类型标识符类型标识符 成员名成员名; .结构体变量结构体变量=初始数据初始数据;例例 struct int num; char name20; char sex; int age; char addr30;

11、stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 结构体数组 定义结构体数组 三种形式:形式一形式一: struct student int num; char name20; char sex; int age;struct student stu2;形式二形式二: struct student int num; char name20; char sex; int age; stu2;形式三形式三: struct int num; char name20; char sex; int age; stu2;numnamesexagenumnamese

12、xagestu0stu125B分行初始化分行初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化时维数可省全部初始化时维数可省 结构体数组初始化例例 struct int num; char name20; char sex; int age; stu =,;例例 struct student int num; char name20; char se

13、x; int age; stu =,; 结构体数组应用举例引用方式: 结构体数组名下标. 成员名 struct student int num; char name20; char sex; int age; str3;stu1.age+;strcpy(,”ZhaoDa”);例例 对侯选人选票的统计程序对侯选人选票的统计程序#include #include struct person char name20; int count;leader3=Li,0,Zhang,0, Wang,0; main() int i,j; char leader_name20; for(i=1

14、;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count);namecountLiZhangWang000Example :建立同学录#includestdio.h#define NUM 3main() struct mem char name20; char phone11; ; struct mem manNUM; int i; fo

15、r(i=0;i成员名成员名 互相等价互相等价 结构体变量名结构体变量名. 成员名成员名指向运算符指向运算符优先级优先级: 1结合方向:从左向右结合方向:从左向右#include #include main() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn

16、, (*p).num,p-name,stu_1.sex,p-score); 指向结构体数组的指针例例 指向结构体数组的指针指向结构体数组的指针#include /*c10_3.c*/struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu;pnum, p-name,p-sex,p-age);pnumnamesexagestu0stu1stu2

17、pp 用结构体变量和指向结构体的指针作函数参数 用结构体变量的成员作参数-值传递 用指向结构体变量或数组的指针作参数-地址传递 用结构体变量作参数-多值传递,效率低#include /*c10_4.c*/struct data int a, b, c; ;main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg

18、); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n);例例 用结构体变量作函数参数

19、用结构体变量作函数参数copyarga :27b: 3c :30(main)arga :27b: 3c :30(main)(func)parma :27b: 3c :30arga :27b: 3c :30(main)arga :27b: 3c :30(main)(func)parma :18b: 5c :90#include /*c10_5.c*/struct data int a, b, c; ;main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(

20、arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(&arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm) printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(Process.n); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(

21、parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(Return.n);例例 用结构体指针变量作函数参数用结构体指针变量作函数参数arg(main)a :27b: 3c :30(func)parm*a :18b: 5c :90Example:Somebody fishes for three days and then sleeps for two days since 1/1/2000,could you tell us he would fish or sleep in someday?struct date int y

22、ear; int month; int day; ;int days(struct date day) static int day_tab213= 0,31,28,31,30,31,30,31,31,30,31,30,31 0,31,28,31,30,31,30,31,31,30,31,30,31;int i,lp;lp=day.year%4=0&day.year%100!=0|day.year%400=0;for(i=1;iday.month; i+) day.day+=day_tablpi;Return(day.day); main() struct date today,ter

23、m; int yd,year,day; scanf(“%d%d%d”,&today.year,&today.month,&today.day); term.month=12; term.day=31;for(yd=0,year=2000;year0&daynum,p-score); p=p-next; while(p!=null);6.5 Self-referential StructuresStructure of Table Lookup nodestruct student int num;float score;struct student *next;

24、#define LEN sizeof(struct student);6.6 Table Lookup#include void *malloc(size) 在内存的动态存储区域中分配一个长度为在内存的动态存储区域中分配一个长度为size的连续空的连续空间。返回值为该区域的起始地址,如果没有成功执行,间。返回值为该区域的起始地址,如果没有成功执行,则返回则返回0#include void *calloc(n,size)在内存的动态存储区域中分配在内存的动态存储区域中分配n个长度为个长度为size的连续空的连续空间。返回值为该区域的起始地址,如果没有成功执行,间。返回值为该区域的起始地址,如果没

25、有成功执行,则返回则返回0#include void free(*ptr) 释放由释放由ptr指向的内存区域指向的内存区域6.6 Table Lookup建立链表:建立链表:从无到有的建立一个链表,输入各个节点的数据,并建立起从无到有的建立一个链表,输入各个节点的数据,并建立起前后链表的关系。前后链表的关系。默认:学号从小到大排列。默认:学号从小到大排列。 学生的学号不为零,因此当出现学生的学号不为零,因此当出现0学号时视为链表结束学号时视为链表结束6.6 Table Lookup1、设head、p1、p2三个student类型的指针2、创建一个新的节点空间,p1、p2均指向该节点3、读入数据

26、给p1所指向的节点4、如果p1-num不为零,而且输入的是第一个节点的时候, 令head=p1;5、再创建新的节点,使p1指向它,并输入数据6、如果p1-num!=0则将p1赋给p2-next。7、接着使得p2=p1;既p2指向刚建立的节点8、对于新的节点重复5-8的过程9、如果新输入的节点num=0,则不再循环,此节点不联入链 表,并p2-next=NULL,表示链表结束。6.6 Table Lookup6.6 Table Lookup#include #include #define NULL 0#define LEN sizeof(struct student)struct studen

27、t long num; float score; struct student *next;int n;main() struct student *head; head=creat();struct student *creat(void) struct student *head; struct student *p1,*p2; n=0; head=NULL; p1=p2=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); while(p1-num!=0) n=n+1; if(n=1) head=p1

28、; else p2-next=p1; p2=p1; p1=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); p2-next=NULL; return(head);强制类型转换p2p1删除节点删除节点6.6 Table Lookup struct student *del(struct student *head, long num) struct student *p1,*p2; if(head=NULL) printf(“n list null!n”); return (head); p1=head;

29、 while(num!=p1-num&p1-next!=NULL)p2=p1;p1=p1-next; /*搜索节点搜索节点*/ if(num=p1-num) /*找到节点找到节点*/ if (p1=head) head=p1-next; else p2-next=p1-next; printf(“delete: %ldn”,num); n-; else printf(“%ld not been found!n”,num); return(head);/*如果如果p1指向头节点,指向头节点,则把第二个节点赋给则把第二个节点赋给head; 否则将下一个否则将下一个节点的地址赋给前一节点的地

30、址赋给前一个节点。个节点。*/6.6 Table LookupP2P1P2P0P0P1添加节点添加节点6.6 Table Lookup struct student *insert(struct student *head, struct student *stud) struct student *p0, *p1,*p2; p1=head; p0=stud; if(head=NULL) head=p0; p0-next=NULL; /*原来是空表原来是空表*/ else while(p0-nump1-num)&(p1-next!=NULL) p2=p1; p1=p1-next; /*

31、搜索位置搜索位置*/ if(p0-numnum) if(head=p1) head=p0; /*插入到原头节点之前插入到原头节点之前*/ else p2-next=p0; p0-next=p1; /*插入插入p2节点之后节点之后*/ else p1-next=p0;p0-next=NULL; /*插入到最后节点的后面插入到最后节点的后面*/ n+; return(head);6.6 Table Lookup1)有5个学生,建立一个链表,每个结点包括学生的:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点包含的年龄等于此年龄,就将此结点删去。homework 6.7 用typedef定义类

32、型 功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name; define typedef预编译时处理预编译时处理 编译时处理编译时处理简单字符置换简单字符置换 为已有类型命名为已有类型命名 例例 typedef int INTEGER;类型定义语句关键字类型定义语句关键字已有数据类型名已有数据类型名用户定义的类型名用户定义的类型名例例 typedef float REAL;类型定义后类型定义后,与已有类型一样使用与已有类型一样使用例例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 说明: typed

33、ef 没有创造新数据类型 typedef 是定义类型,不能定义变量 typedef 与 define 不同typedef char *STRING; /* 定义定义STRING为字符指针类型为字符指针类型*/STRING p,lineptrMAXLINES; typedef int ARR100; /* 定义定义ARR为整型数组类型为整型数组类型*/ARR n; 6.7 Typedef6.8 Unions 1 共用体的概念 构造数据类型,也叫联合体 用途:使几个不同类型变量共占一段内存(相互覆盖) 共用体类型声明 声明形式:union 共用体名共用体名 类型标识符类型标识符 成员名成员名; 类

34、型标识符类型标识符 成员名成员名; .;例例 union data int i; char ch; float f; ;fchi类型声明类型声明不分配内存不分配内存形式形式二二: union data int i; char ch; float f; a,b;形式形式一一: union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三形式三: union int i; char ch; float f; a,b,c; 共用体变量的定义共用体共用体变量定义变量定义分配内存分配内存,长度长度=最长成员最长成员所占字节数所占字节数共

35、用体共用体变量任何时刻变量任何时刻只有只有一个成员一个成员存在存在iichchffab例例 union int i; char ch; float f; a; a=1; ( ) union data int i; char ch; float f;union data a,b,c,*p,d3; a.i a.ch a.f p-i p-ch p-f (*p).i (*p).ch (*p).fd0.i d0.ch d0.f 2 共用体变量的引用方式 引用方式: 引用规则 不能引用共用体变量,只能引用其成员 共用体变量中起作用的成员是最后一次存放的成员 不能在定义共用体变量时初始化 可以用一个共用体变

36、量为另一个变量赋值共用体变量名共用体变量名.成员名成员名共用体指针名共用体指针名-成员名成员名 互相等价互相等价 (*共用体指针名共用体指针名).成员名成员名例例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); ( 编译通过,运行结果不对编译通过,运行结果不对) 例例 union int i; char ch; float f; a=1,a,1.5; ( ) 例例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; ( ) x=a.f; ( )例例 将一个整数按字节输出将一个整数按字节输出01100001 01000001低字节低字节高字节高字节0100000101100001ch0ch1运行结果:运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a#include main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on

温馨提示

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

评论

0/150

提交评论