版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、共 50 页 第 1 页第十章C语言程序设计结构体与共用体共 50 页 第 2 页本章要点 掌握结构类型数据的定义和引用; 了解共用体类型数据的定义和引用。共 50 页 第 3 页10.1 结构体类型 如果将这些属性分别定义为互相独立的简单变量,则难以反映相互间的内在联系(同一个学生的属性) 可采用结构体数据结构描述上述信息,将不同类型的数据组合成一个有机的整体,这些数据是相互联系的。问题:结构是逻辑上相互联系的一组分量的集合。结构中的分量可以是不同类型的数据,结构中的分量称为结构的成员一个学生有学号/姓名/性别/年龄/地址等属性在使用结构之前,首先要对结构的组成进行描述,称为结构的定义。结构
2、定义说明了该结构的组成成员,以及每个成员的类型。共 50 页 第 4 页10.1.1 结构体类型的定义例:struct student int num; char name20; char sex; int age; char addr30;;定义一个结构体类型的一般形式为:struct 结构体类型名 成员表列 ;对各成员都要进行类型说明;成员名定名规则与变量名同。共 50 页 第 5 页10.1.2 结构体变量的定义方法一:先定义结构体类型再定义变量名struct student int num; char name20; char sex; int age; char addr30;;st
3、ruct student student1, student2;定义studet1和sudent2为struct student类型变量不能只指定一个变量为“struct型”而不指定结构体名共 50 页 第 6 页方法二:在定义类型的同时定义变量,如:struct student int num; char name20; char sex; int age; char addr30;student1, student2;一般形式:struct 结构体名 成员表列 变量名表列;共 50 页 第 7 页方法三:直接定义结构类型变量。其一般形式是:struct 成员表列 变量名表列;此时,不出现结
4、构体名共 50 页 第 8 页几点说明:1. 类型与变量是不同概念,不要混淆;2. 结构体中的成员,可以单独使用,其作用与地位相当于普通变量;3. 结构体成员也可以是一个结构体变量;形成结构类型嵌套。struct date int month; int day; int year; ;struct student int num; char name20; int age; struct date birthday;student1,student2;4. 成员名可以与程序中的变量名相同,二者不代表同一对象。5. C只对变量分配单元,不对类型分配存储单元。共 50 页 第 9 页可用符号常量代
5、表一个结构体类型,如:#define STUDENT struct studentSTUDENT int num; char name20; char sex; int age; char addr30;这样,可直接用STUDENT定义变量,如:STUDENT student1, student2;此时,不必再写关键字struct共 50 页 第 10 页10.1.3 结构体变量的引用规则:不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出 引用形式为:结构体变量名.成员名printf(“”,student1);printf(“ %d”, student1.num); 输
6、出 10010错!正确!2 . 若成员本身又属于一个结构体类型,只能对最低级的成员进行赋值、存取以及运算。 如:student1.birthday.year共 50 页 第 11 页(接上)3. 对成员变量可以象普通变量一样进行各种运算,如: sumage=student1.age+student2.age;4. 可以引用成员的地址,也可以引用结构体变量的地址,如 scanf(“%d”,&student1.num); printf(“%o”,&student1); scanf(“%d,%s,%c,%d,%s”,&student1);错!输入student1.num的值输出student1的首地
7、址共 50 页 第 12 页 10.1.4 结构体变量的初始化 struct student long int num; char name20; char sex; char addr20;a=9801,”Wang hong”,W,”2 Linggong Road”;main( )printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,,a.sex,a.addr);运行结果为:No.:9801name:Wang hongsex:Waddress:2 Linggong Road共 50 页 第 13 页10.2 结构体数组 在结构体中使用
8、数组类型作为结构的一个成员; 用结构体类型作为数组元素的基类型构成数组。结构与数组的关系例:struct student int xh; char xm14; char xb; float sx; xscj96;96个元素都具有结构数据类型共 50 页 第 14 页结构体数组是一个数组,数组中的每一个元素都是结构类型。说明结构数组的方法:先定义一个结构,再用结构类型说明一个数组变量。例:为记录100个人的基本情况,说明一个有100个元素的数组。数组的基类型为结构. struct person char name 30; char sex; struct date birthday man100
9、;man就是有100个元素的结构数组,数组的每个元素为 person 型。10.2.1结构体数组的定义共 50 页 第 15 页例如:struct student int num; char name20; char sex; int age; char addr30; struct student stu3;struct student int num; stu3;或struct int num; stu3;一般形式:struct 结构体类型名 元素个数 ;struct 结构体类型名 结构体数组名;共 50 页 第 16 页10.2.2 结构体数组的引用访问结构体数组中的具体元素,必须遵守数
10、组使用的规定按下标进行访问。要访问结构体数组中某个具体元素下的成员,又要遵守有关访问结构成员的规定 使用“.”访问运算符和成员名共 50 页 第 17 页strcpy ( , Fangjin” );man3.sex = M;man3.birthday.year = 1963;man3.birthday.month = 9;man3.birthday.day = 13;例如:要将数组man中的3号元素赋值为:Fangjin, M, 1963, 9, 13,使用下列语句:为数组中一个元素的一个成员赋值共 50 页 第 18 页结构数组存放在连续的内存区域中,所占内存大小为结构类型
11、的大小乘以数组元素的数量。(以标准C为例)struct person man100: sizeof(struct person) *100 字节,TC系统=370字节301222301222301222.nsymdnsymdnsymdman0man1man99 将“Fangjin”改为“Fangjun”: 5 = u;/*为数组中元素的数组成员中的一个字符赋值*/共 50 页 第 19 页10.2.3 结构体数组的初始化struct student int num; char name20; char sex; int age; char addr30; stu3=111,”
12、Li”,M,18,”Dalian”,;也可采用:struct student int num; ; struct student stu=,;结构体数组的初始化的一般形式是在定义数组后面加上:=初值表列;共 50 页 第 20 页例10-1: 编写一个30名学生信息状况的示意性检索程序,每名学生的信息包括:xh(学号)、xb(性别)、cj(成绩)、xm(姓名)。要求:(1)输入30名学生信息;(2)输出男同学中成绩大于90的学生的xm、xb、cj。 共 50 页 第 21 页#include struct student int xh; char xb; int cj; char xm20;
13、;main() struct student stu30; int i; for(i=0;i30;i+) scanf(%d%c%d,&stui.xh,&stui.xb,&stui.cj); gets(stui.xm); for(i=0;i=90) printf(%s,%c,%dn,stui.xm,stui.xb,stui.cj);共 50 页 第 22 页例10-2:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include “stdio.h”#include “string.h”struct person char name10; int count;lead
14、er3=“Li”,0,”zhang”,0,”Liu”,0;main( ) int i, j; char leader_name10; for( i=1;i=100;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i”进行操作。结构指针-成员名“-”运算符优先级最高(15级),从左至右结合。 如: p-成员名分析以下运算:p-n 得到p指向的结构体变量中的成员n的值p-n+ 得到p指向的结构体变量中的成员n的值用完后使它加1; 相当
15、于:(p-n)+ +p-n 得到p指向的结构体变量中的成员n的值 使其先加1;相当于:+(p-n) 常用方法共 50 页 第 25 页例如:main( )struct studentlong int num; char name20; char sex;struct student stu_1;struct student *p;p=&stu_1;stu.num=9901;strcpy(stu_1.name,”Li Min”);stu_1.sex=W;printf(“No.:%ldnname%snsex:%cn”,stu_1.num,stu_1.name,stu_1.sex);printf(“
16、nNo.:%ldnname%snsex:%cn”,(*p).num,(*p).name,(*p).sex);共 50 页 第 26 页阅读程序:main() struct student int num; int age; ; struct student stu3=1000,20,2000,19,3000,23; struct student *p; p=stu; printf(“%dn”,p-num+); printf(“%dn”,+p-num); printf(“%dn”,(*p+).num); printf(“%dn”,(*+p).num);输出结果:共 50 页 第 27 页例: p
17、rintf(%d, man1.birthday.year); 传递结构成员的值 scanf(%d, &man1.birthday.year); 传递结构成员的地址 gets ( ); 传递结构成员的地址10.4 结构体类型数据在函数间的传递 结构体与函数的关系 向函数中传递结构的成员;在函数之间传递整个结构;将结构作为整体,在函数之间传递;向函数传递结构的地址(指针)。在函数中传递结构成员的方法与传递简单变量的方法相同:在函数之间传递成员的值;在函数之间传递成员的地址。共 50 页 第 28 页#include “stdio.h”struct student int num
18、; char name20; float score3;stu=20701,”lili”,67.5,88,79.6; void print(struct student p) printf(“%d %s %5.1f %5.1f %5.1fn”, p.num,,p.score0, p.score1,p.score2); main() print(stu);例:用结构体变量作参数。共 50 页 第 29 页#include “stdio.h”struct student int num; char name20; float score3;stu=20701,”lili”,67.5,8
19、8,79.6; void print(struct student *p) printf(“%d %s %5.1f %5.1f %5.1fn”,p-num,p-name,p-score0,p-score1,p-score2); main() print (&stu); 例:用指向结构体变量的指针作参数。共 50 页 第 30 页 10.4 共用体10.4.1 共用体的概念共用体:使几个不同的变量占用同一段内存的结构,称为“共用体”类型的结构。“共用体”类型变量的定义形式为:union 共用体名 成员表列 变量表列;例如:union dataint i; char ch; float f;a,b
20、,c;或union dataint i;char ch;float f;union data a,b,c;或union int i;char ch;float f; a,b,c;直接定义先定义类型共 50 页 第 31 页注意:共用体类型变量与结构体类型变量的区别:结构体类型变量所占内存长度是各成员占的内存长度之和。共用体类型变量所占内存长度等于最长的成员的长度。成员分量之间是相互联系的,所进行的操作相互依赖。共 50 页 第 32 页10.4.2 共用体变量的引用方式注意:只能引用共用体变量中的成员,不能引用共用体变量本身。如:可以引用 a .i(引用共用体变量中的整型变量i) a .ch(
21、引用共用体变量中的字符变量ch) a .f(引用共用体变量中的实型变量f)不能只引用共用体变量,如: printf(“%d”,a);错!共 50 页 第 33 页阅读程序 #include union pp short int i; char ch2; a; main() a.ch0=1; a.ch1=3; printf(“%dn”,a.i); printf(“%on”,a.i); a的内存存储情况如下:a.ia.ch1a.ch00 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1输出结果:769 1401低字段高字段(1401)8共 50 页 第 34 页10.4.3 共用体类型数
22、据的特点1.每一瞬时只有一个成员起作用 ;2.共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的各成员的地址都是同一地址;4.不能对共用体变量名赋值,也不能通过引用变量名来得到成员的值,不能在定义共用体变量时对它初始化。5.不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可使用指向共用体变量的指针;6.共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。而结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。共 50 页 第 35 页 10.5 枚举类型若一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变
23、量的值只限于列举出来的值的范围内。定义方法:先定义枚举类型 enum weekday sun, mon, tue, wed, thu, fri, sat;再用此类型定义变量,如:enum weekday workday, week_end;或直接定义枚举变量。如:enum weekday sun, mon, tue, wed, thu, fri, sat workday,week_end;共 50 页 第 36 页说明:枚举元素为常量,不是变量,故不能对它们赋值枚举常量有值。如上面定义中,sun 、 mon 、 tue sat的值依次为0、1、27也可改变枚举元素的值,在定义时指出,如: en
24、um weekdaysun=7,mon=1,tue,wed,thu,fri,sat;枚举值可用来作判断比较,如: if(workday=mon) if(workdaysun)一个整数不能直接赋值给一个枚举变量,应先进行强制类型转换才能赋值,如: workday=(enum weekday)2; (相当于将序号为2的枚举元素值赋给workday , 即:workday=tue;共 50 页 第 37 页10.6 用typedef定义数据类型10.6.1 自定义类型 标准类型(如int、char、long、double等)系统已经定义好的类型,用户可以直接使用,无须再进行定义。 用户自定义类型:用
25、户根据自己的实际要求,将已有的类型重新命名为一个新的简单类型。除结构和联合等类型之外,还可以用类型说明语句typedef定义新的类型来代替已有的类型。共 50 页 第 38 页例 typedef int INTEGER; typedef float REAL;在具有上述typedef语句的程序中,下列语句是等价的: int i,j; float pai; 等价于 INTEGER i, j; REAL pai; 10.6.2 typedef语句的一般形式typedef 已定义的类型 新的类型共 50 页 第 39 页例 typedef struct node int data; struct *
26、link; JD定义了一个新的结构体类型JD,它代表结构体struct node .以后可以使用JD来定义变量: JD *s; 定义指向结点类型的指针s共 50 页 第 40 页综合练习:折半查找(二分法查找)思想:先确定待查找记录所在的范围,然后逐步缩小范围,直到找到或确认找不到该记录为止。前提:必须在具有顺序存储结构的有序表中进行。分三种情况:1)若中间项的值等于x,则说明已查到。2)若x小于中间项的值,则在线性表的前半部分查找;3)若x大于中间项的值,则在线性表的后半部分查找。特点:比顺序查找方法效率高。共 50 页 第 41 页查找23的过程如下图:mid=(low+high)/2(
27、8, 14, 23, 37, 46, 55, 68, 79, 91 )( 8, 14, 23, 37, 46, 55, 68, 79, 91 )lowhighmid( 8, 14, 23, 37, 46, 55, 68, 79, 91 )lowhigh=mid-1mid( 8, 14, 23, 37, 46, 55, 68, 79, 91 )low=mid+1highmid共 50 页 第 42 页typedef struct int num; char name10; float score;Student;main() int j,num; Student s4=10,Li,98,40,W
28、ang,88,55,Zhang,89,60,Lin,95; scanf(%d,&num); j=search(s,num,4); if(j!=-1)printf(Name=%s,Score=%f,,sj.score); else printf(No Number);int search(Student s,int key, int n)/*折半查找*/ int low,high,mid; low=1;high=n; while(low=high) mid=(low+high)/2; if(smid-1.num=key) return (mid-1); else if(keynum
29、1,&p1-score); head=NULL; while(p1-num!=0) n=n+1; if(n=1) head=p1; else p2-link=p1; p2=p1; p1=(stu *)malloc(sizeof(stu); scanf(%d,%f,&p1-num,&p1-score); p2-link=NULL; return(head); 共 50 页 第 47 页 遍历就是逐一的访问链表中的每个结点。设线性链表头指针为h,设指针变量p指向不同的结点。沿着链头开始向后查找结点中学号为x的结点,若找到,则返回该结点在链表中的位置,否则返回空地址。NODE *lbcz (NODE *L, int x) NODE *p; p=L-link ; /* p先指向第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广东省高中学业水平考试综合测评卷(二)政治试题(含解析)
- 《四川省地下水生态环境保护规划(2023-2025年)》
- 2024年07月湖南长沙银行暑期实习生招考笔试历年参考题库附带答案详解
- 2024年深圳市福田区慢性病防治院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2024年湖北省长坂坡医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 奥特曼玩具公司培训内容
- 2024年刑法知识竞赛题库及答案(共80题)
- 高中信息技术粤教版必修说课稿-5.2.1 使用数据库应用系统001
- 高中信息技术人教中图版(2019)必修2 3.4信息获取与控制 说课稿
- 制作简易太阳能热水器(说课稿)-2024-2025学年科学五年级上册人教鄂教版
- 广东省潮州市2023-2024学年高二上学期期末考试 数学 含解析
- 2024年度技术咨询合同:某科技公司与某政府机构关于技术咨询服务的协议(2024版)2篇
- 医疗科研配色
- 2024年保安员资格考试题目及答案(共60题)
- 期末复习基础卷(试题)-2024-2025学年一年级上册数学人教版
- 2024年放射科应急预案演练(大全)
- 胡颓子育苗技术规程-地方标准修订说明
- 2023年机械员之机械员专业管理实务题库及参考答案(a卷)
- 《论语》中的人生智慧与自我管理学习通超星期末考试答案章节答案2024年
- 2024年金融理财-金融理财师(AFP)考试近5年真题附答案
- 2022版义务教育物理课程标准
评论
0/150
提交评论