第6章其他数据类型.ppt

上传人:sccc 文档编号:5647106 上传时间:2023-08-05 格式:PPT 页数:54 大小:291.51KB
返回 下载 相关 举报
第6章其他数据类型.ppt_第1页
第1页 / 共54页
第6章其他数据类型.ppt_第2页
第2页 / 共54页
第6章其他数据类型.ppt_第3页
第3页 / 共54页
第6章其他数据类型.ppt_第4页
第4页 / 共54页
第6章其他数据类型.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《第6章其他数据类型.ppt》由会员分享,可在线阅读,更多相关《第6章其他数据类型.ppt(54页珍藏版)》请在三一办公上搜索。

1、第6章 其他数据类型,学习目标,结构体的定义与使用结构体与指针共用体的定义与使用枚举类型的定义与使用typedef定义数据类型位运算规则,6.1 结构体,引入:数据的基本类型:整、实、字符。数组是构造类型:每个元素为同一类型,有些问题仅用基本类型和数组来描述是无法实现的?,举例:如学生情况表,这些数据类型虽不相同,但它们却是有机的整体,若将它们分别定义,则难以反映它们之间的内在联系。如何解决呢?用结构体。,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体,又称自定义数据类型结构体类型定义,struct 结构体类型名 类型标识符 成员名;类型标识符 成员名;,成员类型可以是基本型或构

2、造型,struct是关键字,不能省略,合法标识符,可根据情况省略,6.1.1 结构体类型的定义,Struct studentint num;char name20;char sex;int age;float score;char addr30;,结构体类型定义,描述结构的组织形式,不分配内存,以上语句的作用是:定义了一个名为student的结构体类型,它具有以下结构:,6.1.2 结构体变量,(1)结构体类型变量的声明间接法:先声明结构体类型再定义变量名,struct 结构体名类型标识符成员名;类型标识符成员名;struct 结构体名 变量名表列;,直接法:在声明结构体类型的同时定义变量,s

3、truct 结构体名类型标识符成员名;类型标识符成员名;.变量名表列;,struct studentint num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,省去结构体类型名,用无名结构体直接定义变量只能一次。,说明:1.结构体类型与结构体变量概念不同2.结构体可嵌套,sturct date int month;int day;int year;,str

4、uct studentint num;char name20;char sex;struct date birthday;float score;char addr30;student1,student2;,说明:3.结构体成员名与程序中变量名可相同,不会混淆(2)结构体变量的引用:结构体变量.成员如:student1.num=1;strcpy(student1.name,“ZhangHua);student1.sex=M;student1.birthday.year=1980,如果某成员本身又是一个结构体类型,则要用若干个成员运算符,一级一级找到最低一级的成员。成员运算符“.”的结合性为从左

5、到右。如:student1.birthday.year结构体变量的成员可以像普通变量一样进行各种运算。例如:student1.birthday.day+;sum=student1.score+5;,可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如:,struct 结构体类型名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,struct ss int num;char name20;char sex;int age;char addr30;struct ss stu1=112,“Wang Lin”,M,19,“200 Beijing Ro

6、ad”;,(3)结构体变量的初始化,形式二:,struct 结构体类型名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,struct ss int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,结构体类型名ss可以省略,(4)求结构体变量占用内存的大小 求变量或类型说明符占用内存大小可以使用sizeof运算符。sizeof是单目运算符,其功能是求出变量或类型说明符所占的内存空间的字节数。使用的一般形式为:sizeof(变量或类型说明符);,c

7、har str20;struct date int year,month,day;today;struct address char name30,street40,city20;unsigned long int zip;wang;printf(char:%dt,sizeof(char);printf(str:%dt,sizeof(str);printf(date:%dt,sizeof(struct date);printf(wang:%dn,sizeof(wang);,6.1.3 结构体数组,(1)定义结构体数组:三种形式,形式一:struct student int num;char n

8、ame20;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;,(2)结构体数组的初始化,struct int num;char name20;char sex;int age;stu.=.,.,.;,(3)结构体数组元素、成员引用引用方式:结构体数组名下标.成员名,struct student int num;char name20;cha

9、r sex;int age;str3;,stu1.age+;,strcpy(stu0.name,”ZhaoDa”);,#include#include struct person char name20;int count;lead3=Li,0,Zhang,0,Wang,0;void main()int i,j;char leader_name20;for(i=1;i=10;i+)/10张选票 scanf(%s,leader_name);for(j=0;j3;j+)/每张选票与3个候选人姓名对比 if(strcmp(leader_name,leadj.name)=0)leadj.count+;

10、for(i=0;i3;i+)printf(%5s:%dn,leadi.name,leadi.count);,统计选票,例6.3简单的密码加密程序。根据加密表中的对应关系,将输入的文字加密输出,对于表中未出现的字符则不加密,原样输出。,#include struct table char input,output;struct table translate=a,d,b,w,c,k,d,;,e,i,i,a,k,b,;,c;,void main()char ch;int str_long,i;str_long=sizeof(translate)/sizeof(struct table);/*计算加

11、密元素个数*/while(ch=getchar()!=n)for(i=0;translatei.input!=ch,6.2 结构体与指针,6.2.1 指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;,struct student int num;char name20;char sex;int age;stu;struct student*p=,存放结构体变量在内存的起始地址,使用结构体指针变量引用成员:,若有:struct student stu1;struct student*p=,结构体变量名.成员名(*结构体指针名).成员名 结构体指针名-成员名,注意:”.“用于结

12、构体变量访问成员而“-”用于结构体指针变量访问成员。使用中要注意两者的优先级与结合性问题。,p-n 得到p指向的结构体变量中的成员n的值。p-n+得到p指向的结构体变量中的成员n的值,用完该值后使它加1。+p-n 得到p指向的结构体变量中的成员n的值使之加1(先加)。,构造数据类型,也叫联合体几个不同类型的变量共占一段内存(相互覆盖)定义形式,6.3 共用体,union 共用体类型名 类型标识符 成员名;类型标识符 成员名;.;,除去关键字,其形式和结构体定义一致,union data char ch;int i;float f;,union data int i;char ch;float

13、f;a,b;,union data int i;char ch;float f;union data a,b,c,*p,d3;,共用体变量的定义:,由于是共用一段内存,因此:共用体变量任何时刻只有一个成员存在 共用体变量定义分配内存长度是最长成员所占字节数,共用体变量引用,union data int i;char ch;float f;union data a,b,c,*p,d3;,a.i,a.ch,a.fp-i,p-ch,p-f(*p).i,(*p).ch,(*p).fp-i,p-ch,p-fd0.i,d0.ch,d0.f,共用体变量名.成员名(*共用体指针名).成员名共用体指针名-成员名

14、,注意:共用体变量中起作用的成员是最后一次存放的成员共用体变量的地址和它的各成员的地址都是同一地址。不能引用共用体变量,只能引用其成员不能在定义共用体变量时初始化可以用一个共用体变量为另一个变量赋值,union int i;char ch;float f;a;a=1;(),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

15、.f;(),union/定义共用体并说明共用体变量mix long i;int k;char ii;char s4;mix;mix.i=0 x12345678;printf(mix.i=%lxn,mix.i);printf(mix.k=%xn,mix.k);printf(mix.ii=%xn,mix.ii);printf(mix.s0=%xt mix.s1=%xn,mix.s0,mix.s1);printf(mix.s2=%xt mix.s3=%xn,mix.s2,mix.s3);,例6.8分析以下程序的运行结果。,变量的各成员同时存在,任一时刻只有一个成员存在,结构体与共用体区别:存储方式不

16、同联系:两者可相互嵌套,6.4 枚举类型,概念:“枚举”是指将变量的值一一列举出来,变量的取值只限于列举出来的值的范围。定义:enum 枚举类型名取值表;变量定义:enum colourRed,Blue,Yellow,White;enum colour c1,c2;c1,c2为枚举型变量,其值可以取括号中的任意一个。c1=Yellow;()c2=White;()c1=Black;()c2=2;(),说明(1)对枚举元素按常量处理,故称枚举常量。枚举常量是有值的,编译时按定义时的顺序依次置为0,1,2,在上面的定义中,枚举元素的值分别为:Red=0,Blue=1,Yellow=2,White=3

17、。(2)不能对枚举常量赋值,要改变枚举常量的值只能在定义时由程序指定。例如:enum colourRed=10,Blue=0,Yellow,White;则这时Red=10,Blue=0,Yellow=1,White=2。当定义枚举变量enum colour c1,c2;后,若给枚举变量赋值:c1=Red;则枚举变量c1中的值为10c2=White;则枚举变量c2中的值为2。,6.5 用typedef定义类型,功能:用自定义名字为已有数据类型命名形式:typedef type name;,类型定义语句关键字,已有数据类型名,用户定义的类型名,若有:typedef int INTEGER;type

18、def float REAL;则:INTEGER i,j;等价于 int i,j;REAL pai;等价于 float pai;,typedef常用于结构体类型的定义:typedef struct int month;int day;int year;DATE;声明新类型名DATE,它代表上面指定的一个结构体类型。DATE birthday,*p;,类型定义后,与已有类型一样使用,typedef也可用于数组和指针类型的定义:typedef int ARR20;ARR a,b,d;等价于:int a20,b20,d20;typedef int*point;point p1,p2;等价于:int*

19、p1,*p2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不同4.typedef 可以嵌套,typedef struct club char name20;int size;int year;GROUP;typedef GROUP*PG;PG pclub;,GROUP为结构体类型,PG为指向GROUP的指针类型,等价于:struct clubchar name20;int size;int year;*pclub;,6.6 位运算及位字段,位运算符和位运算位运算举例,6.6.1 位运算符和位运算,前面介绍的各种

20、运算都是以字节作为最基本位进行的。但在很多系统程序中常要求在位(bit)一级进行运算或处理。语言提供了位运算的功能,这使得语言也能像汇编语言一样用来编写系统程序。按位与&,按位或|按位异或,按位取反 左移,位运算的对象只能是整型或字符型,不能为浮点型,1、按位与运算符(&):运算规则:0&0=0 1&0=0 0&1=0 1&1=1 只要对应位上的值均为1则该位上的结果值为1 特殊作用:将一个存储单元各位清0取某个数中的某些位。方法:将本数与某个特定数按位与运算即可。,7&11=3 即 0111&1011=0011若要将某字符型数据ch的低4位清0,高4位保持不变,可用算式:0 xf0&ch,2

21、、按位或运算符(|)运算规则:0|0=0 1|0=1 0|1=1 1|1=1只要对应位上的值其中一个为1则该位上的结果值为1特殊作用。常用于将一个数的某些特定位置为1方法:将本数与某个特定数按位或运算即可。,7|11=15 即 0111|1011=1111若要将某字符型数据ch的低4位置1,高4位保持不变,可用算式:0 x0f|ch,3、按位异或运算符()运算规则:00=0 10=1 01=1 11=0只要对应位上的值互不相同则该位上的结果值为1特殊作用。使某些特定的翻转任何数与0异或结果保留原数本身任何数与1异或结果得到与自身相反的数交换两个变量的值不用中间变量。a=ab b=ba a=ab

22、注意给变量赋值的先后顺序。,4、按位异求反运算符()运算规则:0=1 1=0对运算对象按位求反:1变为0;0变为1。注意:运算符比算术运算、关系运算、逻辑运算和其它运算的优先级别都高。,5、左位移运算符():运算规则:a=an 将a中所有位向左移动n位。作用:相当于乘法运算。每左移1位相当于乘以2。高位左边位左移后溢出被舍弃,不起作用。低位补以0。,a=5;a=a3;则a为400000 0101左移3位得到0010 1000即40,6、右位移运算符():运算规则:a=an 将a中所有位向右移动n位。作用:相当于除法运算。每右移一位相当于除以2。注意数的符号问题(即正负的问题)对于无符号数(正数

23、)右移时高位补以0。对于有符号数,高位为0(正数)右移时高位补以0。对于有符号数,高位为1(负数)时:右移时高位补以0,称之为“逻辑位移”。右移时高位补以1,称之为“算术位移”。TC采用“算术位移”,高位补以1。,7、不同长度的数据进行位运算时的规则规则:如果两个不同长度的数据(例如char型和int型)进行位运算,系统将会对二者进行处理:先将两个运算数按右端对齐,再将较短的一个运算数往高位扩充,即无符号数和正整数左侧用0补齐;负数左侧用1补齐,最后按位进行位运算。,8、位运算的复合赋值运算符:a&=b a|=b a=b a=b a=b,6.6.2 位运算举例,例6.11 取一个整数a从右端开

24、始的49位。unsigned a,b,c,d;scanf(%o,将要取的49位移到最右端,即将a右移4位,设置一个低6位全为1,其余全为0的数 0:000000000000:1111111111106:11111000000(06):00000111111,例6.12从键盘上输入一个正整数给整型变量a,按二进制位输出该数。,int a,b,i;printf(input a integer number:);scanf(%d,构造一个最高位为 1、其余各位为0的整数b,依次将a的各位数据放到最高位并与b按位与,根据结果决定输出1或者0,6.7 本章小结及常见错误列举,结构是由若干数据项组合而成的

25、复杂数据对象,这些数据项称为结构的成员。定义一个结构,需要给出各个成员的类型及名称。结构定义仅描述了一个结构的形式。要在程序里使用结构,需要声明结构变量。访问结构成员的操作要用圆点运算符(.),一般形式为:结构变量名.成员名。可以通过指向结构的指针访问结构成员,常用形式为:结构指针变量-成员名。数组元素的类型为结构的数组称为结构数组。,结构体定义允许嵌套,结构体中也可用共用体作为成员,形成结构体和共用体的嵌套。共用体与结构体类似,区别在于共用体各个成员共享同一片内存区域。位运算是语言的一种特殊运算功能,它是以二进制位为单位进行运算的。位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起

26、组成复合赋值符。如&=,|=,=,=,=等。,常见错误,把复杂数据类型名当作变量名。下面的做法是错误的:struct Dateint year,month,day;Date.year=2004;Date.month=l0;Date.day=18;,对结构体变量进行整体赋值。下面做法是错误的:struct Dateint year,month,day;struct Date d;d=2008,10,18;/*2008,10,18是非法表达式*/,直接用结构体或共用体变量来比较大小。结构体和共用体类型数据,不能参加算术运算和关系运算。下面的做法是错误的。struct Date dl,d2;if(dld2)/*错误*/.,在给共用体变量赋初值时,初值会赋给共用体第一个成员。如果初值类型与第一个成员的数据类型不兼容,结果将是不可预料的下面的做法是错误的。union uwordchar ch2;short a;union uword u=2.5;/*错误*/,使用位运算符时应注意:如同表达式a+2不能改变a的值一样,a两边必须都是整型数,否则非法。如a2.0是错误的。不同长度的变量进行位运算时,系统会自动右对齐,而左端的不齐部分,会按最高位进行扩展。,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号