c语言数组的改变.ppt_第1页
c语言数组的改变.ppt_第2页
c语言数组的改变.ppt_第3页
c语言数组的改变.ppt_第4页
c语言数组的改变.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

构造数据类型,内容提示 关键词 结构体 共用体 枚举 位段 自定义类型,从基本数据类型、复合数据类型到抽象数据类型,高级语言设计了基本数据类型:整型、浮点型、字符型等。 基本数据类型并不能方便地解决所有问题。 复合数据类型是基本数据类型迭代派生而来。 典型的代表就是“结构”,数组、指针也可算作此类。,思考一个问题,在程序里表示一个人(姓名、年龄、性别、),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,某学校学生成绩管理表,数组的解决方法,int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/ char studentName3010; char studentSex302; int timeOfEnter30; /*入学时间用int表示*/ int scoreComputer30; /*计算机原理成绩*/ int scoreEnglish30; /*英语课成绩*/,数组的解决方法,int studentId30 = 1,2,3,4,5,6; char studentName3010 = “令狐冲“,“林平之“, “岳灵珊“,“任莹莹“; char studentSex302 = “男“,“男“,“女“,“女“; int timeOfEnter30 = 1999,1999,1999,1999; int scoreComputer30 = 90,78,89,78; int scoreEnglish30 = 83,92,72,95; int scoreMath30 = 72,88,98,87;,数组的解决方法,数据的内存管理方式,分配内存不集中,寻址效率不高 对数组进行赋值时,容易发生错位 结构显得比较零散,不容易管理,数组的解决方法,希望的内存分配图,结构体的解决方法,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex4; /*每个学生的性别*/ int timeOfEnter; /*每个学生的入学时间*/ int scoreComputer;/*每个学生的计算机原理成绩*/ int scoreEnglish; /*每个学生的英语成绩*/ int scoreMath; /*每个学生的数学成绩*/ ;,struct STUDENT是一个数据类型 struct STUDENT students30; students0.studentSex 它们都是变量,一般称为结构的成员变量,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10; /*每个学生的姓名*/ char studentSex4; /*每个学生的性别*/ int timeOfEnter; /*每个学生的入学时间*/ int scoreComputer; /*每个学生的计算机原理成绩*/ int scoreEnglish; /*每个学生的英语成绩*/ int scoreMath; /*每个学生的数学成绩*/ ;,7.1 结构体,结构体类型的定义 结构体是一种构造数据类型,它由若干成员组成。每一个成员既可以是一个基本数据类型也可以是一个构造数据类型。,struct 结构体名 类型1 成员1; 类型2 成员2; 类型n 成员n; ;,结构体类型的定义,struct student char cNum; char cName20; int nAge; char cSex; ;,结构体关键字,结构体名,分号是结束标志,不能省略,结构体的4个成员,7.1 结构体,struct date int nYear; int nMonth; int nDay; ; struct student char cNum; char cName20; struct date dBirthday; ;,struct student char cNum; char cName20; struct date int nYear,nMonth,nDay; dBirthday; ;,7.1.1 结构体嵌套定义,等价,结构体的定义只定义了数据的形式,即声明了一种复杂的数据类型,并未生成任何变量。,7.1.2 结构体变量,(1) 结构体变量的定义 先定义结构体类型,再声明结构体变量。其一般形式为:,struct 结构体名 结构体变量名;,struct student char cNum; char cName20; int nAge; char cSex; ; struct student sStu;,定义结构体类型的同时定义结构体变量。其一般形式为: 如, struct student char cNum; char cName20; int nAge; char cSex; sStu;,struct 结构体名 成员列表 变量列表;,直接定义无结构名的结构体类型变量 如, struct char cNum; char cName20; int nAge; char cSex; sStu;,struct 成员列表 变量列表;,(2) 结构体变量的初始化 以上三种方式声明结构体变量的同时都可以进行初始化。初始化方式为:将所赋初值按顺序放在一对大括号内,下面以第一种定义结构体变量的方式为例来说明初始化问题。 如, struct student char cNum; char cName20; int nAge; char cSex; ; struct student sStu =1,“Zhanghua“,20,M;,注意 (1) 如下初始化形式是非法的。 struct student sStu; sStu=0501,“Zhao lin“,20,M; (2) 所赋初值与各成员数据类型要匹配或兼容。,(3) 结构体变量成员的引用 结构体变量成员的引用形式如下: 结构体变量名.成员名 实心点“.”称为成员运算符。 例如:sStu.cNum sStu.cName,例7-1定义并初始化学生结构体变量,然后输出变量的各成员值。,#include struct student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore; sStu1=“0804101“,“Mr.Zhang“,M,1979,9,1,80,sStu2;,void main() sStu2=sStu1; /*同类型的结构体变量之间进行赋值运算*/ printf (“Number=%sn“,sStu2.pcNum); printf (“Name=%sn“,sStu2.pcName); printf (“Born=%d年“,sStu2.dBirth.nYear); printf (“%d月“,sStu2.dBirth.nMonth); printf (“%d日n“,sStu2.dBirth.nDay); printf (“Sex=%cn“,sStu2.cSex); printf (“Score=%.1fn“,sStu2.fScore); ,7.1.3结构体数组,在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。 如, struct student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore; ; 结构体数组sStu,共有5个元素:sStu0sStu4。 在声明的时候还完成了对数组的初始化工作。,struct student sStu5= “0804101“,“Mr.Zhang“,M,1979,9,1,80, “0804102“,“Mr.Wang“,W,1980,8,1,70, “0804103“,“Mr.Li“,M,1978,7,1,55, “0804104“,“Mr.Zhao“,W,1977,6,1,65, “0804105“,“Mr.Zhou“,M,1981,5,1,45 ;,定义:,struct STUDENT int studentID; char studentName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu5;,结构体数组,struct STUDENT int studentID; char studentName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu4 = 1,“令狐冲“,“男“,1999,12,20,90,83,72,82, 2,“林平之“,“男“,1999,07,06,78,92,88,78, 3,“岳灵珊“,“女“,1999,07,06,89,72,98,66, 4,“任莹莹“,“女“,1999,07,06,78,95,87,90 ;,初始化,结构体数组,例7-2计算5名学生的平均成绩和不及格的人数。,struct student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore; ; struct student sStu5= “0804101“,“Mr.Zhang“,M,1979,9,1,80, “0804103“,“Mr.Li“,M,1978,7,1,55, “0804104“,“Mr.Zhao“,W,1977,6,1,65, “0804105“,“Mr.Zhou“,M,1981,5,1,45 ;,void main() int i,nE=0; float fAvg,fSum=0; for(i=0;i5;i+) fSum+=sStui.fScore; if(sStui.fScore60) nE+=1; printf (“总分:%.2fn“,fSum); fAvg=fSum/5; printf (“平均分:%.2fn不及格人数:%d人n“,fAvg,nE); ,struct类型的特点,一个普通的类型 所以可以定义该类型的变量、数组、指针 它的成员可以是任意类型 基本类型、数组、指针、结构 可以做函数的参数类型和返回值类型 struct类型的变量 可以互相赋值 所以做为函数的参数时,是传值调用 可以& 不可能参与运算 它的成员个个也都是如假包换的变量 面向对象和数据库是struct的思想的发展,上次课我们学到了,从某学校学生成绩管理表引伸出 结构体类型 struct STUDENT char studentName10; /*每个学生的姓名*/ int timeOfEnter; /*每个学生的入学时间*/ int scoreComputer; /*每个学生计算机原理成绩*/ 。 ; struct STUDENT是一个类型 定义可嵌套,29,上次课我们学到了,定义结构体变量 struct STUDENT student1; struct STUDENT char cNum; char cName20; int nAge; char cSex; student1; 初始化 struct student student1 =1,“Zhanghua“,20,M;,30,上次课我们学到了,结构体变量成员的引用 结构体变量名.成员名 实心点“.”称为成员运算符。 例如:sStu.cNum sStu.cName,31,上次课我们学到了,结构体数组 struct student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore; ;,struct student sStu5= “0804101“,“Mr.Zhang“,M,1979,9,1,80, “0804102“,“Mr.Wang“,W,1980,8,1,70, “0804103“,“Mr.Li“,M,1978,7,1,55, “0804104“,“Mr.Zhao“,W,1977,6,1,65, “0804105“,“Mr.Zhou“,M,1981,5,1,45 ;,32,7.1.4结构体指针,结构体指针即结构体变量或数组的首地址,可以通过定义一个结构体指针变量,指向某个结构体变量或数组的首地址。 (1)结构体指针变量的定义有三种形式:,struct student char *pszNum; char *pszName; ; struct student *psStu;,struct student char *pszNum; char *pszName; *psStu;,struct char *pszNum; char *pszName; *psStu;,33,(2) 指向结构体变量,struct point int x; int y; ; struct point pt; /*定义结构体变量*/ struct point *ppt; /*定义结构体指针*/ ppt = /*指向运算符*/ 第二种更常用,34,看下面的例子: void main() struct student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore; *psStu, sStu=“0804101“,“Mr.Zhang“,M,1979,9,1,80; psStu= 结构体指针变量psStu指向了结构体变量sStu的首地址,即通过psStu可以实现操作sStu目的。,输出结果 pcNum=0804101,35,思考一,struct point int x; int y; ; struct rect struct point pt1; struct point pt2; ;,struct rect rt, *rp= 下面表达式哪些合法? rt.pt1.x (*rp).pt1.x rp-pt1.x rt-pt1.x 上面合法的表达式都是等价的吗?,36,(3) 指向结构体数组 struct telephone char cName20; char cPhone10; ; struct telephone tTel3,*ptTel; ptTel=tTel; 由于指针ptTel指向了数组tTel的首地址,则通过ptTel可以实现操作数组tTel元素的目的。,37,例7-5运用结构体指针变量实现例7-3的功能。,例7-3 建立一个电话本。 问题描述:建立一个简单的电话本,每条记录包括姓名和联系电话,共2项。,#define NUM 3 struct telephone char cName20; char cPhone10; ; void main() struct telephone tTelNUM,*ptTel; for(ptTel=tTel;ptTelcName); printf(“input phone:“); gets(ptTel-cPhone); printf(“namettphonen“); for(ptTel=tTel;ptTelcName,ptTel-cPhone); ,7.1.5结构体与函数,结构体变量既可以做函数的参数也可以做函数的返回值。 结构体变量作函数参数传递的是所有成员,因此,实参与形参必须是相同类型的结构体变量。 结构体变量做函数的返回值,返回给主调函数的是所有成员 结构体成员也可以做函数的参数和返回值,这与普通变量做函数的参数和返回值是一样的。,例7-6编写程序求解某一点在平面坐标中关于原点的对称点。,#include struct dot int nX; int nY; ; struct dot SymmetricalDot( struct dot sDot) /*求对称点函数*/ struct dot dSDot; /*定义对称点结构体变量*/ dSDot.nX = -sDot.nX; dSDot.nY = -sDot.nY; return dSDot; /*将对称点返回给主调函数*/ void main() struct dot dPoint; struct dot dSPoint; /*点dPoint的对称点*/ printf(“Please enter a Point:n“); scanf(“%d,%d“, ,7.1.6 位段,想表达人的姓名、出生年、月、日,都定义什么类型的成员变量? struct person char name12; int year; int month; int day; ; 这样有很多的空间浪费,比如month只可能取值1-12,4bits足够,7.1.6 位段,在定义结构体时以位为单位来声明成员所占的内存长度,这样的成员就称为位段或位域。C语言允许声明位段为从18范围内的任意位数。如, struct bitdata unsigned a:2; unsigned b:5; unsigned c:3; unsigned d:2; bX;,现在大家要特别注意,位段a和b共7位,不满一个字节,还剩1位,但紧接其后的位段c却需要3位,这时系统会另外起一个存储单元来存放位段c,依据同样的规律第二个存储单元也会出现3位空闲,如下图所示。,说明: (1) 位段成员的类型必须指定为unsigned 或 int类型。 (2) 一个位段必须存储在一个单元内(unsigned int),不能跨单元。 (3) 不能定义位段数组。,7.1.6 位段,说明: (4) 可以通过增加成员“unsigned:0;”,使某个位段从另一个unsigned int开始存放。 struct bitdata unsigned a:2; unsigned b:3; unsigned :0; unsigned c:3; bX;,7.1.6 位段,说明: (5) 可以为位段定义无名成员。 struct bitdata unsigned a:2; unsigned b:3; unsigned :5; unsigned c:3; bX;,*,无名成员“unsigned :5”表示5个二进制位空闲不用,7.2 共用体,共用体又称联合体,是将不同数据类型组合在一起,这些不同类型的成员在内存中所占用的起始单元是相同的。,7.2.1共用体类型定义,union 共用体名 类型 成员1; 类型 成员2; 类型n 成员n; ;,例如: union unit int nClass; char cOffice10; ;,7.2.1共用体类型定义,union number short x; char ch; float y; ; 基本上和struct一样 x、ch和y处于同样的地址 sizeof(union xxx)取决于占空间最多的那个成员变量,49,7.2.2共用体变量定义,共用体变量的声明和结构变量的定义方式一样,也有三种。,union unit int nClass; char cOffice10; ; union unit uDepart;,union unit int nClass; char cOffice10; uDepart;,union int nClass; char cOffice10; uDepart;,共用体变量的赋值和引用 共用体变量名.成员名,例: union number int x ; float y ; s1, s2 ;,变量s1的存储空间为:,S1.y,S1. x,同一段内存允许有多种类型的成员,某一时刻仅 一个成员起作用。 共用体使用覆盖技术,起作用的是最后一次存放的成员。 如: s1.x=1;s1.y=3.5;s1.y有效 在定义共用体变量时,不能对它进行初始化。 两个共用体变量不能进行比较操作,对共用体变量的有关说明,与结构体的异同: 相同之处:类型说明形式、变量定义方式与结构体相同。 不同之处:结构体变量中各成员有独立的存 储空间。,共用体的特点,同一内存单元在每一瞬时只能存放其中一种类型的成员;并非同时都起作用 起作用的成员是最后一次存放的成员 不能作为函数参数和函数返回值类型,struct person char name20; char sex; int age; union int single; struct char spouseName20; int child; married; struct date divorcedDay; marital; int marryFlag; ;,共用体的应用,#include #define NUM 2 struct info char cName10; int nAge; char cJob; union unit/*共用体*/ int nClass; char cOffice10; uDepa; iPersonInfoNUM;,void main() int i; for(i=0;iNUM;i+) printf(“input Name,Age,Job and Class/Officen“); scanf(“%s%d %c“,iPersonInfoi.cName, ,printf(“NametAgetJobtClass/Officen“); for(i=0;iNUM;i+) printf(“%st“,iPersonInfoi.cName); printf(“%dt“,iPersonInfoi.nAge); printf(“%ct“,iPersonInfoi.cJob); if(iPersonInfoi.cJob=s) printf(“%dn“,iPersonInfoi.uDepa.nClass); else printf(“%sn“,iPersonInfoi.uDepa.cOffice); ,上次课我们学到了,结构体指针:结构体变量或者数组的地址。 三种定义形式: 指向结构体变量:,struct student char *pszNum; char *pszName; ; struct student *psStu;,struct student char *pszNum; char *pszName; *psStu;,struct char *pszNum; char *pszName; *psStu;,59,上次课我们学到了,指向结构体变量: 访问结构体变量的成员 通过pt访问pt的成员 pt.x = 0; /*成员运算符*/ 通过ppt访问pt的成员? (*ppt).x = 0; ppt-x = 0; /*指向运算符*/ 第二种更常用,60,上次课我们学到了,结构体变量既可以做函数的参数也可以做函数的返回值。 结构体变量作函数参数和返回值传递的是所有成员。 结构体成员也可以做函数的参数和返回值,这与普通变量做函数的参数和返回值是一样的。,61,上次课我们学到了,位段 struct bitdata unsigned a:2; unsigned b:5; unsigned c:3; unsigned d:2; bX;,62,上次课我们学到了,共用体 union number short x; char ch; float y; ; x、ch和y处于同样的地址 number的大小取决于最大的成员,63,上次课我们学到了,与结构体的异同: 相同之处:类型说明形式、变量定义方式与结构体相同。 不同之处:结构体变量中各成员有独立的存 储空间,而共用体中所有成员共用同一存储空间。 同一内存单元在每一瞬时只能存放其中一种类型的成员; 不能作为函数参数,64,7.3 枚举,“枚举”就是一一列举的意思,枚举类型就是一一列举出来所有可能用到的数据值,然后据此定义的变量就只能使用列举出来的值,相当于常量。,枚举类型关键字为enum,定义形式如下:,enum 枚举名 元素1, 元素2, , 元素n;,如: enum weeksun,mon,tue,wed,thu,fri,sat; 其中,“sun,mon,tue,wed,thu,fri,sat”这七个枚举元素称为枚举常量,系统把它们当作常量来使用。,枚举变量的定义同样也有三种方式。如: 第一种方式 enum weeksun,mon,tue,wed,thu,fri,sat; enum week workday,weekday; 第二种方式 enum weeksun,mon,tue,wed,thu,fri,satworkday,weekday; 第三种方式 enumsun,mon,tue,wed,thu,fri,satworkday,weekday; 以上定义的枚举变量workday,weekday的值只能是 sun到sat其中之一,不能超出这个范围。,(2) 枚举变量的定义,枚举(Enumeration)常量,enum responseno = -1, yes=3, none=-2,默认时,枚举元素的值依次为0、1、2 枚举元素的值依次自动设置为整数02. 可在定义时指定枚举元素初值以改变标识符取值,enum responseno, yes, none,enum responseno=1, yes, none,enum responseno , yes=5, none,一个被遗忘的角色,从程序来窥其一斑,enum weeks MON, TUE, WED, THU, FRI, SAT, SUN; enum weeks today; enum response no, yes, none; enum response answer; today = TUE; answer = yes; if (answer = yes) printf(“Today is Tuesday.n“); else printf(“Today is NOT Tuesday.n“);,等价于: answer = = 1,7.4 自定义类型,C语言允许用typedef来声明一个新的类型名代替已有的类型名,这些已有的类型名可以是整型、实型、字符型、结构体型等等。声明新类型名的形式为: 其中,“类型名”是已经声明了的合法的类型,而“新类型名”只要是合法的C语言标识符即可。 如, typedef int INTEGER; typedef char CHARACTER;,typedef 类型名 新类型名;,69,注意:,(1) typedef语句并未产生新的类型,只是为某已知类型起了一个外号。 (2) 为了区别起见,新的类型名一般采用大写形式。 (3) 利用typedef也可以为构造数据类型声明一个新名称。 如, typedef struct int iNum; char cName20; float fScore; STUDENT; 这样就可以用STUDENT来定义这种结构体类型的变量或数组 STUDENT stu1,stu2,stu30;,70,这一章我们学习了,两种新的数据类型 结构体和共用体 几种重要的应用 结构体数组 结构体指针 用结构体指针做函数参数,71,感谢观看,/dxbzyzlh02/32997.html /cddxyy/ //lndxbyy//zzjhdxbyy /cccfdxbyy/7682.html htt

温馨提示

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

评论

0/150

提交评论