结构体、共用体与枚举.ppt

上传人:小飞机 文档编号:6332279 上传时间:2023-10-17 格式:PPT 页数:90 大小:538.50KB
返回 下载 相关 举报
结构体、共用体与枚举.ppt_第1页
第1页 / 共90页
结构体、共用体与枚举.ppt_第2页
第2页 / 共90页
结构体、共用体与枚举.ppt_第3页
第3页 / 共90页
结构体、共用体与枚举.ppt_第4页
第4页 / 共90页
结构体、共用体与枚举.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《结构体、共用体与枚举.ppt》由会员分享,可在线阅读,更多相关《结构体、共用体与枚举.ppt(90页珍藏版)》请在三一办公上搜索。

1、9,结构体、共用体与枚举,本章导读,用户定义类型结构体、共用体和枚举类型,包括它们的定义、变量的说明和应用。结构体类型:结构体数组和指针、结构体变量和指针作为函数参数、返回结构体类型数据的函数、动态内存分配、链表;类型定义符typedef;了解结构体、共用体和枚举类型数据的特点,熟练掌握结构体类型、变量、数组、指针变量的定义、初始化和成员的引用方法;掌握共用体和枚举类型、变量的定义和引用;掌握用户自定义类型的定义和使用。,9.1结构体,【问题】什么是结构体类型?什么是结构体变量?结构体类型与数组类型有什么区别和联系?,结构体类型的定义,结构体类型的定义形式为:struct 类型名成员项表列;例

2、如包含上图中全部类型数据的结构体类型的定义如下:struct person/*结构体类型名*/char name20;/*以下定义成员项的类型和名字*/int age;char sex;long num;char nation;char address20;long tel;,结构体变量的说明,结构体变量的说明有三种方法:1.用已定义的结构体类型名定义变量。例如:struct person student,worker;/*定义了两个结构体变量student和worker*/用上面的结构体类型还可再定义变量:struct person men,women;,2.在定义结构体类型的同时定义结构体

3、变量。例如:struct person char name20;int age;long tel;student,worker;一般的形式为:struct 类型名 成员项表列 变量名表列;这样定义的结构体类型也还可多次使用,如:struct person men,women;,结构体变量的说明,3.不定义结构体类型名,直接定义结构体变量。一般形式为:struct 成员项表列变量名表列;,结构体变量的说明,9.1.3 结构体变量的初始化,在以上结构体变量的三种定义的同时都可以进行初始化赋值,例如:struct person stud1=Wang Li,18,M,34011,h,12,13 Bej

4、ing Road,2098877,stud2=Yu Ping,19,F,34082,h,12,25 Hefei Road,5531678;注意初始化数据应与类型中的各个成员在位置上一一对应。对于嵌套的结构体类型变量,初始化是对各个基本类型的成员赋初值,例如:struct person student=Wang Li,12,5,1974,M,340201,h,12,13 Bejing Road,2098877;,9.1.4 结构体变量的引用,1.引用结构体成员,在无嵌套的情况下,引用结构体变量成员的形式为:结构体变量名成员名,其中的“.”叫“结构体成员运算符”,这样引用的结构体成员相当于一个普通

5、变量,例如:student.num/*结构体变量student的成员num,相当于一个长整型变量*/student.name/*结构体变量student的成员name,相当于一个字符数组名*/,在有嵌套的情况下,访问的应是结构体的基本成员,因为只有基本成员直接存放数据,且数据是基本类型或上面介绍的数组类型,引用形式为:结构体变量名结构体成员名结构体成员名基本成员名 即从结构体变量开始,用成员运算符“.”逐级向下连接嵌套的成员直到基本成员,不能省略,例如:/*基本成员year,相当于一个整型变量*/,9.1.4 结构体变量的引用,2.结构体变量的赋值、输入和输出,由于结构体各个成员的类型不同,对

6、结构体变量赋值也只能对其成员进行,结构体变量的输入和输出也都只能对其成员进行,3.同一类型的结构体变量可相互赋值,同类型的两个结构体变量之间可以整体赋值(请比较数组之间不能整体赋值),stud1=stud2;,9.1.4 结构体变量的引用,【例9-1】输出结构体数据,#include main()struct person char name20;struct int month;int day;int year;bd;char sex;long num;st=Wang Li,12,15,1974,M,340201;printf(%s,%d,%d,%d,st.name,st.bd.year,s

7、t.bd.month,st.bd.day);printf(%c,%ldn,st.sex,st.num);,9.1.5 结构体数组,1.结构体数组的定义,有三种方法。(1)先定义结构体类型,用结构体类型名定义结构体数组,如:struct stud_typechar name20;long num;int age;char sex;float score;struct stud_type student50;,9.1.5 结构体数组,(2)定义结构体类型名的同时定义结构体数组,如:struct stud_typestudent50;(3)不定义结构体类型名,直接定义结构体数组,如:structst

8、udent50;,2.结构体数组的初始化,结构体数组的一个元素相当于一个结构体变量,结构体数组初始化即顺序对数组元素初始化。,如:struct stud_type student3=Wang li,80101,18,M,89.5,Zhang Fun,89102,19,M,90.5,Li Ling,89103,20,F,98;,9.1.5 结构体数组,9.1.5 结构体数组,3.结构体数组的引用。,(1)除初始化外,对结构体数组赋常数值、输入和输出、各种运算均是对结构体数组元素的成员(相当于普通变量)进行的。结构体数组元素的成员表示为:结构体数组名下标.成员名在嵌套的情况下为:结构体数组名下标结

9、构体成员名结构体成员名成员名,(2)结构体数组元素可相互赋值例如:student1=student2;对于结构体数组元素内嵌的结构体类型成员,情况也相同。如:student2.birthday=student1.birthday;,(3)其他注意事项也与结构体变量的引用相同,例如:不允许对结构体数组元素或结构体数组元素内嵌的结构体类型成员整体赋(常数)值;不允许对结构体数组元素或结构体数组元素内嵌的结构体类型成员整体进行输入输出等。,9.1.5 结构体数组,9.1.5 结构体数组,在处理结构体问题时经常涉及字符或字符串的输入,这时要注意:scanf()函数用%s输入字符串遇空格即结束,因此输入

10、带空格的字符串可改用gets函数。在输入字符类型数据时往往得到的是空白符(空格、回车等),甚至运行终止,因此常作相应处理,即在适当的地方增加getchar();空输入语句,以消除缓冲区中的空白符。,【例9-2】输入3个学生的信息然后输出。每个学生的信息包括学号、姓名和4门课程的成绩,#include main()struct stu_type long num;char name20;float score4;st3;int i,j;float t;printf(Enter students datas:n);for(i=0;i3;i+)scanf(%ld,【例9-2】,for(j=0;j4;

11、j+)scanf(%f,结构体指针,1.指向结构体变量的指针变量,(1)指向结构体变量的指针和指向结构体变量的指针变量的定义指向结构体变量的指针是结构体变量所占内存单元的首地址,如定义:struct stu_typelong num;char name20;float score4;student,*p;p=p即指向结构体变量的指针变量。,(2)用指向结构体变量的指针变量表示结构体变量的成员如果象上面那样定义了指向结构体变量的指针变量p以后,*p即表示p所指向的结构体变量student,其成员student.num可表示为:(*p).num 或者 p-num第二种表示与第一种表示等价,运算符“

12、-”与“.”优先级相同,具有最高的优先级。,结构体指针,【例9-3】利用结构体指针变量输出结构体数据,/*EX9-3.C*/main()struct stu_typelong num;char name20;float score2;student=20050101,wang,89,77.5,*p;p=,2.结构体数组与结构体指针变量,一维数组的数组名代表数组的首地址,一维结构体数组也一样。可以将一维结构体数组名赋给指向结构体变量的指针变量,该指针变量将指向下标为0的元素,它可以在数组元素之间移动。,【例9-4】用指向结构体变量的指针变量输出结构体数组,/*EX9-4.C*/main()str

13、uct stu_typelong num;char name20;int age;st3=1001,wang,19,1002,li,18,1003,zhang,20,*p;printf(No.tNametAgen);for(p=st;pnum,p-name,p-age);,【例9-5】输出上例中全部学生的name信息,/*EX9-5.C*/main()struct stu_typelong num;char name20;int age;st3=1001,wang,19,1002,li,18,1003,zhang,20,*p,*q;q=(struct stu_type*)st0.name;fo

14、r(p=q;pq+3;p+)printf(%st,p);,结构体与函数,1.结构体变量和结构体变量成员做函数参数,(1)结构体变量成员作为函数的实参由于结构体变量成员存放基本类型数据,因此这种情况同基本类型有值变量做实参,实现值传递。要注意实参与形参类型的一致。,【例9-6】打印学号为20050102学生的年龄,#define N 3void PRINT(int age)printf(Age:%dn,age);main()struct stu_typelong num;char name20;int age;stN=20050101,wang,19,20050102,li,18,2005010

15、3,zhao,20;int i;for(i=0;iN;i+)if(sti.num=20050102)PRINT(sti.age);,(2)结构体变量作为函数参数这种用法的参数形式为:形参:结构体变量;实参:有值结构体变量或结构体数组元素。通过实参将相应的结构体类型数据传给对应的形参,实现传值调用,不同于数组作参数的传址调用!【注意】在结构体类型数据作为函数参数时,为了在虚实结合时保持形参与实参类型的一致,应将结构体类型定义成外部的,即在所有函数之前定义结构体类型。,结构体与函数,【例9-7】打印学号为20050102学生的全部信息,#define N 3struct stu_typelong

16、num;char name20;int age;void PRINT(struct stu_type stu)printf(No.ttNametAgen);printf(%-16ld%st%dn,stu.num,stu.name,stu.age);,【例9-7】,main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zhao,20;int i;for(i=0;iN;i+)if(sti.num=20050102)PRINT(sti);,2.结构体指针作为函数参数,此用法一般用于结构体数组问题。与基本类型一维数组的情况

17、相同,实现传址调用,参数用法如下:形参:结构体数组或结构体指针变量;实参:结构体数组名或取得数组名首地址的结构体指针变量。,【例9-8】同上例,输出全部学生的信息,#define N 3struct stu_typelong num;char name20;int age;void PRINT(struct stu_type*p)int i;printf(No.ttNametAgen);for(i=0;inum,(p+i)-name,(p+i)-age);main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zha

18、o,20;PRINT(st);,3.返回结构体类型数据的函数,函数返回值可以是结构体类型的值,也可以是指向结构体变量(或数组元素)的指针。当函数返回值是结构体类型的值时,称该函数为结构体类型函数;当函数返回值是指向结构体类型存储单元的指针时,称该函数为结构体类型指针函数。,【例9-9】同【例9-7】,打印学号为20050102学生的全部信息,查找用结构体类型函数实现,#define N 3struct stu_typelong num;char name20;int age;struct stu_type fun(struct stu_type st)int i;for(i=0;iN;i+)i

19、f(sti.num=20050102)return(sti);main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zhao,20;struct stu_type stu;stu=fun(st);printf(No.ttNametAgen);printf(%-16ld%st%dn,stu.num,stu.name,stu.age);,动态内存分配与链表,1.动态内存分配和链表的概念(1)固定内存分配与动态内存分配的概念 固定内存分配在C语言程序中用说明语句定义的各种存储类型(自动、静态、寄存器、外部)的变量或数组,

20、均由系统分配存储单元,程序员无法在函数的执行部分干预存储单元的分配和释放。这样的存储分配叫固定内存分配,又叫系统存储分配。动态内存分配C语言允许程序员在函数执行部分的任何地方使用动态存储分配函数(本节2.)开辟或回收存储单元,这样的存储分配叫动态内存分配。动态内存分配使用自由、节约内存。利用动态内存分配建立的链表是一种十分重要的数据结构。,(2)链表的概念,结点组成链表的基本存储单元叫结点,该存储单元存有若干数据和指针,由于存放了不同数据类型的数据,它的数据类型应该是结构体类型。在结点的结构体存储单元中,存放数据的域叫数据域,存放指针的域叫指针域,简单结点的形式如图所示。,结点类型定义的一般形

21、式为:struct 类型名数据域定义;struct 类型名*指针域名;,例如有如下结点类型的定义:struct studentint num;float score;struct student*next;,链表 若有一些结点,每一个结点的指针域存放下一个结点的地址,因此就指向下一个结点,这样就首尾衔接形成一个链状结构,称为链表。用上面的结构体类型建立的有4个结点的链表如图所示。,(2)链表的概念,头结点:指向链表中第一个包含有用数据的结点,本身不包含有用数据,用于对链表的访问。尾结点:不指向其他结点的结点。尾结点的指针域存放的地址为NULL(或0,或0)。,(2)链表的概念,相同点:它们均由

22、同类型的存储单元组成。不同点:数组由固定分配的连续的存储单元组成,定义后存储单元不可增加或减少,对数组元素的访问为随机访问。链表可由不连续的存储单元(结点)组成,结点一般为动态分配存储单元,可随时增、删。只能顺序访问链表中的结点。,链表与数组,建立一个简单链表,c.data=15;c.next=NULL;p=head;while(p!=NULL)printf(%d-,p-data);p=p-next;printf(NULLn);,【例9-11】建立一个简单的链表并输出,struct nodeint data;struct node*next;main()struct node a,b,c,*h

23、ead,*p;head=,2.Turbo C 动态存储分配函数,Turbo C动态存储分配函数有:malloc、calloc、free、realloc,这些函数的定义均包含在头文件stdlib.h中。(1)malloc函数void*malloc(unsigned int size)调用形式为:(类型*)malloc(size),例如:int*pi;float*pf;pi=(int*)malloc(2);pf=(float*)malloc(4);,(2)calloc函数void*calloc(unsigned n,unsigned size)调用形式为:(类型*)calloc(n,size),如

24、:char*ps;ps=(char*)calloc(10,sizeof(char);,2.Turbo C 动态存储分配函数,(3)realloc函数void*realloc(void*ptr,unsigned newsize)调用形式为:(类型*)realloc(ptr,newsize),(4)free函数 void free(void*)调用形式为:free(p);其中指针变量p必须是由malloc、calloc、realloc函数分配存储单元存放首地址的指针变量,该函数的作用是收回由p指向的动态分配的存储单元。该函数无返回值。,2.Turbo C 动态存储分配函数,3.动态存储分配链表的基

25、本操作,由包含一个指针域的结点组成的链表为单向链表。,建立并初始化链表遍历访问链表(包括查找结点、输出结点等)删除链表中的结点在链表中插入结点,(1)建立单向链表建立单向链表的步骤如下:建立头结点(或定义头指针变量);读取数据;生成新结点;将数据存入结点的数据域中;将新结点连接到链表中(将新结点地址赋给上一个结点的指针域)。重复步骤,直到输入结束。,3.动态存储分配链表的基本操作,【例9-15】建立带有头结点的单向链表,当输入-1时结束。,#include struct nodeint data;struct node*next;main()int x;struct node*h,*s,*r;

26、h=(struct node*)malloc(sizeof(struct node);r=h;scanf(%d,s-data=x;r-next=s;r=s;scanf(%d,(2)输出链表,输出链表即顺序访问链表中各结点的数据域,方法是:从头结点开始,不断地读取数据和下移指针变量,直到尾结点为止。,【例9-16】编写单向链表的输出函数。,void print_slist(struct node*h)struct node*p;p=h-next;if(p=NULL)printf(Linklist is null!n);else printf(head);while(p!=NULL)printf(

27、-%d,p-data);p=p-next;printf(-endn);,(3)删除单向链表中的一个结点,删除单向链表中一个结点的方法步骤如下,参见,找到要删除结点的前驱结点;将要删除结点的后继结点的地址赋给要删除结点的前驱结点的指针域;将要删除结点的存储空间释放。,【例9-17】编写函数,在单向链表中删除值为x的结点,/*EX9-17.C*/void delete_node(struct node*h,int x)struct node*p,*q;q=h;p=h-next;/*工作指针初始化,q在前、p在后指向第一个结点*/if(p!=NULL)/*表非空*/while(p!=NULL)/*删

28、除值为x的结点*/,(4)在单向链表的某结点前插入一个结点,在单向链表的某结点前插入一个结点的步骤如下:开辟一个新结点并将数据存入该结点的数据域;找到插入点结点;将新结点插入到链表中:将新结点的地址赋给插入点上一个结点的指针域,并将插入点的地址存入新结点的指针域,【例9-18】,分析:本例结合了查找和插入两种功能,可能遇到三种情况:链表非空,值为x的结点存在,则插在值为x的结点之前;链表非空,值为x的结点不存在,则插在表尾;链表为空,也相当于值为x的结点不存在,则插在表尾。,编写函数,在单向链表中值为x的结点前插入值为y的结点,若值为x的结点不存在,则插在表尾。,【例9-18】,函数编写如下:

29、void insert_node(struct node*h,int x,int y)struct node*s,*p,*q;s=(struct node*)malloc(sizeof(struct node);s-data=y;/*向新结点存入数据*/q=h;p=h-next;/*工作指针初始化,p指向第一个结点*/while(p!=NULL),9.2 共用体,问题:什么是共用体类型?什么是共用体变量?共用体类型与结构体类型有什么区别和联系?,9.2.1 共用体类型的定义共用体类型的定义与结构体类型的定义类似,但所用关键字不同,共用体类型用关键字union定义,具体形式为:union 类型名

30、成员项表列;,union exam int a;float b;char c;,共用体变量的说明,与结构体变量的说明类似,也有三种方式:1先定义共用体类型,再用共用体类型定义共用体变量union 类型名成员表列;union 类型名 变量名表;例如用union exam类型定义共用体变量x、y:union exam x,y;2定义共用体类型名的同时定义共用体变量union 类型名成员表列变量名表;,union exam int a;float b;char c;x,y;,3不定义类型名直接定义共用体变量,union 成员表列变量名表;,定义了共用体变量后,系统为共用体变量开辟一定的存储单元。由于

31、共用体变量先后存放不同类型的成员,系统开辟的共用体变量的存储单元的字节数为最长的成员需要的字节数。例如对上面定义的共用体类型union exam或变量x,表达式sizeof(union exam)和sizeof(x)的值均为4。另外,先后存放各成员的首地址都相同,即共用体变量、共用体变量的所有成员它们的首地址都相同。,9.2.3 共用体变量的引用,1.共用体变量的引用,引用共用体变量的形式以及注意事项均与引用结构体变量相似,其要点如下:(1)一般只能引用共用体变量的成员而不能整体引用共用体变量,尽管它同时只有一个成员有值。共用体变量的一个基本类型成员相当于一个普通变量,可参与该成员所属数据类型

32、的一切运算。例如对上面定义的共用体变量x可以引用的成员有:,x.ax.bx.c,1.共用体变量的引用,(2)与结构体类似,同一类型的共用体变量可相互赋值。例如有赋值语句 x.a=3;共用体变量x有值,则可有下面的赋值语句:y=x;这样y.a的值也为3。(3)在赋值和输入输出方面也与结构体类似,即不允许对共用体变量整体赋(常数)值;共用体的输入和输出也只能对共用体变量的成员进行,不允许直接对共用体变量进行输入和输出,尽管它同时只存有一个成员!,2.共用体的应用,(1)变体记录问题,【例9-19】输入N个人的信息,共同的信息有:姓名、性别,另外,职业(job)为教师(t)则登记其单位(group)

33、,职业为学生(s)则登记其班级(class),最后将信息输出。程序如下:,#define N 2main()struct char name20;char sex;char job;union int class;char group20;category;,personN;int i;printf(Enter%d person informations:n,N);for(i=0;iN;i+)gets(personi.name);scanf(%c,【例9-19】,if(personi.job=s)scanf(%d,【例9-19】,(2)将内存空间的内容拆分成几部分使用,【例9-20】运行下面的

34、程序,分析运行结果。/*EX9-20.C*/main()union data int a;char c2;u;printf(Enter u.a in Hex:n);scanf(%x,9.3 枚举类型,枚举类型的定义枚举类型定义的形式为:enum 类型名标识符序列;例如,定义枚举类型color_name,它由5个枚举值组成:enum color_namered,yellow,blue,white,black;,说 明,(1)enum是定义枚举类型的关键字。(2)枚举值标识符是常量不是变量,系统自动给予它们0,1,2,3值,因此枚举类型是基本数据类型。(3)枚举值只能是一些标识符(字母开头,字母、

35、数字和下划线组合),不能是基本类型常量。虽然它们有值0,1,2,3,但如果这样定义类型 enum color_name0,1,2,3,4;是错误的。(4)可在定义枚举类型时对枚举常量重新定义值,如:enum color_namered=3,yellow,blue,white=8,black;此时yellow为4,blue为5,black为9,即系统自动往后延续。,枚举变量的说明及引用,1.枚举变量的说明可以用定义过的枚举类型来定义枚举变量,形式为:enum 类型名 变量名表;例如定义枚举类型color_name的变量color:enum color_name color;也可以在定义类型的同时

36、定义变量,形式为:enum 类型名标识符序列 变量名表;例如定义枚举类型color_name的变量color:enum color_namered,yellow,blue,white,black color;或者省略类型名直接定义变量,形式为:enum 标识符序列 变量名表;,2.枚举变量的引用,(1)枚举变量定义以后就可以对它赋枚举常量值或者其对应的整数值,例如变量color可以赋5个枚举值之一:color=red;或color=0;color=blue;或color=2;但color=green;或color=10;均不合法,因为green不是枚举值,而10已超过枚举常量对应的内存值。(2

37、)因枚举常量对应整数值,因此枚举变量、常量和常量对应的整数之间可以比较大小,如:if(color=red)printf(red);或if(color=0)printf(red);if(color!=black)printf(The color is not block!);if(colorwhite)printf(It is block.);,2.枚举变量的引用,(3)枚举变量还可以进行+、-等运算。(4)枚举变量不能通过scanf或gets函数输入枚举常量,只能通过赋值取得枚举常量值。但是枚举变量可以通过scanf(%d,由于枚举变量可以作为循环变量,因此可以利用循环和switch语句打印全

38、部的枚举值字符串。,【例9-21】输出全部的枚举值字符串,main()enum red,yellow,blue,white,blackcolor;printf(All enum strings are:n);for(color=red;color=black;color+)switch(color)case red:printf(redn);break;case yellow:printf(yellown);break;case blue:printf(bluen);break;case white:printf(whiten);break;case black:printf(blackn);

39、break;,9.3.3 枚举类型的应用,main()enum daymon=1,tue,wed,thu,fri,sat,sunx;printf(Input a integer:n);scanf(%d,【例9-22】输入星期几的整数,输出“工作日”或“休息日”的信息。,9.4 用户定义类型,1.定义“替代”类型名定义的形式为:typedef 类型名 标识符;注意:“类型名”必须是系统提供的数据类型或用户已定义的数据类型。定义替代类型名的作用是:给已有的类型起个别名标识符,例如:typedef int INTEGER;,2.定义“构造”类型名定义的形式为:typedef 类型名 标识符及“构造”

40、;注意:“类型名”必须是系统提供的数据类型或用户已定义的数据类型。定义构造类型名的作用是:自己定义新“构造”类型名标识符。,举 例,(1)定义字符型指针类型名CHARP typedef char*CHARP;以后可用它来定义指针变量,例如:CHARP p,q;即等价于:char*p,*q;(2)定义具有3个元素的整型数组名NUM typedef int NUM3;以后可用它来定义有三个元素的int型数组,如:NUM a,b,c;就相当于int a3,b3,c3;,(3)定义某结构体类型名STUDENT typedef struct int num;char name10;char sex;fl

41、oat score3;STUDENT;以后可用它来定义该种结构体类型变量、指针变量等,例如:STUDENT stu1,stu2,*st;就定义了该结构体类型的变量和指针变量。,举 例,3.定义新类型名的一般步骤及说明,(1)先按定义变量或数组的方法写出定义;如:char a10;(2)将定义的名字换成新类型名;如:char NAME10;(3)在前面加上typedef;如:typedef char NAME10;(4)然后可以用新类型名定义变量;如:NAME c,d;c、d即是有10个元素的字符数组,9.5 程序举例,【例9-23】有5个学生,每个学生的信息有学号、姓名和三门课的成绩,求每个学

42、生的平均成绩并按平均成绩从大到小对所有学生的信息进行排序然后输出。分析:在定义结构体类型时可以设计一个存放平均成绩的成员,排序交换位置时应将结构体数组元素整体交换,编程如下:,【例9-23】,main()struct student long num;char name10;int score3;float evr;t,st5=1001,wang,67,75,88,1002,li,83,92,95,1003,zhao,56,82,79,1004,han,78,87,79,1005,qian,69,79,81;int i,j;for(i=0;i5;i+)sti.evr=0;,for(j=0;j3

43、;j+)sti.evr+=sti.scorej;sti.evr/=3;for(i=0;i4;i+)for(j=i+1;j5;j+)if(sti.evrstj.evr)t=sti;sti=stj;stj=t;printf(No.Name scor1 scor2 score3 evrn);for(i=0;i5;i+)printf(%ld%8s,sti.num,sti.name);for(j=0;j3;j+)printf(%8d,sti.scorej);printf(%8.1fn,sti.evr);,【例9-23】,【例9-24】,有5个学生,每个学生的信息有学号、姓名和三门课的成绩,输出三门课的总

44、平均分以及所有成绩中最高成绩所对应学生的全部信息。【分析】三门课的总平均分可以定义一个数组,找出最高成绩时应记录是哪个学生才能输出该学生的全部信息,编程如下:,main()struct student long num;char name10;int score3;st5=1001,wang,67,75,88,1002,li,83,92,95,1003,zhao,56,82,79,1004,han,78,87,79,1005,qian,69,79,81;int i,j,max,maxi;float aver3=0;for(j=0;j3;j+)for(i=0;i5;i+)averj+=sti.s

45、corej;averj/=5;,【例9-24】,【例9-24】,max=st0.score0;for(i=0;imax)max=sti.scorej;maxi=i;printf(The averages of courses are:n);for(i=0;i3;i+)printf(%6.1f,averi);printf(n);printf(The informations of the student with maximal score:n);printf(No.Name scor1 scor2 score3n);printf(%ld%8s,stmaxi.num,stmaxi.name);f

46、or(j=0;j3;j+)printf(%8d,stmaxi.scorej);printf(n);,【例9-25】已知单向链表的结点类型为struct node,头指针为head,编写一个释放链表的函数。,【分析】链表由头指针代表,要释放链表可以定义一个工作指针得到头指针,然后头指针和工作指针均不断下移,同时释放结点,编写函数如下:/*EX9-25.C*/void fun(struct node*head)struct node*p;while(head!=NULL)p=head;head=head-next;free(p);,【例9-26】,已知函数bioskey(0)返回用户按键对应的一个

47、16位二进制数,其中若是控制键(含移动光标、组合控制键等)则高8位是该键的扫描码,低8位是0;若是可见字符(含空格)则低8位是字符的ASCII码。利用共用体编程获得用户按键的ASCII码或扫描码。,#include main()union int a;char c2;key;do printf(Please prees a key:);key.a=bioskey(0);printf(%cn,key.a);if(key.c0=0)printf(The scanning code of the key is:%dn,key.c1);else printf(The ASCII of the char

48、acter is:%dn,key.c0);while(key.c0!=q);,【例9-26】,【例9-27】口袋中有红、黄、绿、蓝颜色的球各一些,现从口袋中每次摸出3个球,要求颜色均不同,考虑摸出的顺序,输出所有可能的取法的排列及取法的数量。,main()enum colorred,yellow,green,bluec,x,y,z;int i,n=0;for(x=red;x=blue;x+)for(y=red;y=blue;y+)if(x!=y)/*避开x=y的情况,提高了效率*/for(z=red;z=blue;z+)if(z!=x,【例9-27】,switch(c)case red:pri

49、ntf(“%-8s”,“red”);break;case yellow:printf(“%-8s”,“yellow”);break;case green:printf(“%-8s”,“green”);break;case blue:printf(“%-8s”,“blue”);if(n%2=0)printf(“n”);printf(“n=%dn”,n);,本章小结,本章学习了C语言的用户定义类型,包括结构体、共用体和枚举类型三种,其中结构体和共用体是构造类型,枚举类型是基本数据类型,重点学习了结构体类型。本章还学习了用户定义类型名的方法。现小结如下。1结构体与共用体有很多相似的地方:(1)类型定

50、义的形式相同。通过定义类型说明了结构体或共用体所包含的不同数据类型的的成员项,同时确定了结构体或共用体类型的名称。(2)变量说明的方法相同。都有三种方法说明变量,第一种方法是先定义类型,再说明变量;第二种方法是在定义类型的同时说明变量;第三种方法是利用结构直接说明变量。数组、指针等可与变量同时说明。,本章小结,(3)结构体与共用体的引用方式相同。除了同类型的变量之间可赋值外,均不能对变量整体赋常数值、输入、输出和运算等,都只能通过引用其成员项进行,嵌套结构只能引用其基本成员,如:变量.成员 或 变量.成员.成员基本成员。结构体或共用体的(基本)成员是基本数据类型的,可作为简单变量使用,是数组的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号