中职c语言技能教程第10章课件_第1页
中职c语言技能教程第10章课件_第2页
中职c语言技能教程第10章课件_第3页
中职c语言技能教程第10章课件_第4页
中职c语言技能教程第10章课件_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、(中职)c语言技能教程第10章ppt课件第10章 类型 DIY结构体和共用体第10章10.1技能1:在程序中使用结构体类型10.2技能2:在程序中使用共用体类型 【概要】 在程序设计中,把一些关系密切而数据类型不同的数据组织在一起,并为其命名一个名字,这类数据称为结构体。共用体是一种类似于结构体的构造型数据类型,它准许不同类型和不同长度的数据共享同一块存储空间。 它们都是“构造”而成的数据类型,在说明和使用之前必须先定义,也就是类型 DIY。第10章 类型 DIY结构体和共用体10.1 技能110.1.1 结构体(即“结构”)的概念 在日常生活中,常会遇到一些需要填写的登记表,如住宿表、成绩表

2、、通讯地址等。在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、E - mail等项目。这些表中集合了各种数据,无法用前面学过的任一种数据类型完全描述,因此C引入一种能集中不同数据类型于一体的数据类型结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。 结构体:是将若干个类型相同或不同的数据组合成一个有机的集合。“结构体”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体既是一种“构造”而成的数据类型,那

3、么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。10.1.2 结构体类型的定义【引例】 住宿表、成绩表、通讯地址表用C提供的结构体类型描述如下: 成绩表: struct score char grade20; /* 班级*/ long number; /* 学号*/ char name20; /*姓名*/ float os; /*操作系统*/ float datastru; /* 数据结构*/ float compnet; /* 计算机网络*/ ; 这一系列对不同登记表的数据结构的描述类型称为结构体类型。由于不同的问题有不同的数据成员,也就是说有不同描述

4、的结构体类型。也可以理解为结构体类型根据所针对的问题其成员是不同的,可以有任意多的结构体类型描述。【知识点】1. 定义结构体类型的一般格式为: struct 结构体名类型 结构成员名类型 结构成员名;【知识点】2.结构体名:由用户命名,是类型的标识符而不是变量 名。也可以省略结构体名。 3. 结构体成员:构成结构体的每一个类型变量称为结构体成员。 它象数组的元素一样, 但数组中元素是以下标来访问的, 而结构 体是按变量名字来访问成员的。4. 结构体成员名的命名规则与变量相同,并且允许与变量或其他结构体中的成员重名。5. 结构体成员可以是简单类型、数组、指针或已说明过的结构体等。6. 大括号外边

5、的分号不可省略。【典型例题】例10.1 定义一个反映学生基本情况的的结构类型,用以存储学生的学号、姓名、性别、成绩。struct stuint num; char name20;char sex; float score; ;10.1.3 结构体变量的定义、初始化和引用一、 结构体类型变量的定义结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共有三种形式。 【知识点】定义结构体变量的三种方法。1. 先定义结构体类型,再定义结构体变量。2. 在定义结构体类型的同时定义结构体变量。3. 直接定义结构体变量。

6、【典型例题】例10.2 结构体变量的定义方法。 (1)先定义结构体类型,再定义结构体类型变量:struct stu /*定义结构体类型*/int num;char name20;char sex;float score;struct stu b1,b2;/*定义结构体变量*/【典型例题】例10.2 结构体变量的定义方法。 (2)定义结构体类型同时定义结构体类型变量:struct stuint num;char name20;char sex;float score;b1,b2; /*b1,b2为结构体变量*/定义stu为结构体类型的同时定义了两个结构体变量b1,b2。【典型例题】例10.2 结

7、构体变量的定义方法。(3)直接定义结构体类型变量:structint num;char name20;char sex;float score;b1,b2; 该法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。第(3)种方法与第(2)种方法的区别在于第三种方法中省去了结构体名,直接给出结构体变量。三种方法中说明的b1,b2变量都具相同的结构。说明了b1,b2变量为stu类型后,即可向这两个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。(4)成员也可以又是一个结构体类型,即构成了嵌套的结构。如: struct dateint mont

8、h;int day;int year;struct int num;char name20;char sex;struct date birthday;float score;b1,b2;首先定义一个结构类型date,由month(月)、day(日)、year(年) 三个成员组成。 在定义并说明变量 b1 和 b2 时,其中的成员birthday被说明为date结构类型。成员名可与程序中其它变量同名,互不干扰。结构变量成员的表示方法在程序中使用结构变量时,往往不把它作为一个整体来使用。二、 结构体类型变量的赋值(初始化) 结构体变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。 上述对

9、结构体类型变量的三种定义形式均可在定义时初始化。【引例】 结构体类型变量的初始化。struct stu / *定义学生结构体类型* /char name20; / * 学生姓名* /char sex; / * 性别* /long num; / *学号* /float score3; / * 三科考试成绩* /;struct stu student=wang li,f,050641,88.5,87.4,85;结构体类型变量完成初始化后,即各成员的值分别为: = wang li、student.sex = f、student.num = 050641、student.sc

10、o re0 = 88.5、student.score1 = 87.4、student.score2 = 85。【知识点】与数组的初始化类似,结构体变量只能对外部和静态结构体变量初始化。初始化数据之间要用“,”逗号隔开,不进行初始化的成员项要用“,”逗号跳过。【典型例题】struct stu / *定义学生结构体类型* /char name20; / * 学生姓名* /char sex; / * 性别* /long num; / *学号* /float score3; / * 三科考试成绩* /;struct stu student=wang li,f, ,88.5,87.4,85;/*学号不进

11、行初始化用逗号跳过*/例10.3 定义结构体变量并给成员赋值。在变量定义之后,如果再想将数据装入变量,只能采用给各成员赋值的办法,延用初始化时的作法是错误的:struct stu student;student=wang li,f,050641,88.5,87.4,85;/*错误的用法*/对上述的结构体类型变量成员输入采用的一般形式:student.num =long atol(temp); /* 转换为长整型*/for( i = 0; i 结构体成员 其中“-”是两个符号“-”和“”的组合, 好象一个箭头指向结构体成员。例如要给上面定义的结构体中name和age赋值, 可以用下面语句: st

12、rcpy(student-name,Lu ying); student-age=19; 实际上, student-name就是(*student).name的缩写形式。 10.1.6 读懂含有结构体变量的程序【典型例题】例10.5 给结构体变量赋值并输出其值。main( ) struct stu int num; char *name; char sex; float score; b1,b2;b1.num=102;=Zhang ping;printf(input sex and scoren);scanf(%c %f,&b1.sex,&b1.score);b2=b1; prin

13、tf(Number=%dnName=%sn,b2.num,);printf(Sex=%cnScore=%fn,b2.sex,b2.score);程序分析:本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf函数动态地输入sex和score成员值,然后把b1的所有成员的值整体赋予b2,最后分别输出b2 的各个成员值。本例说明了结构体变量的赋值、输入和输出的方法。对于结构体变量的初始化,如果结构体变量是全局变量或为静态变量,则可对它作初始化赋值;对局部或自动结构变量不能作初始化赋值。 例10.6 定义一个结构体变量, 其中每个成员都从键盘接收数

14、据, 然后对结构体中的浮点数求和, 并显示运算结果。 请注意这个例子中不同结构体成员的访问。 #include main() struct /*定义一个结构体变量*/ char name8; int age; char sex2; float wage1, wage2, wage3, wage4, wage5; a; float wage; char c=Y; while(c=Y|c=y) /*判断是否继续循环*/ printf(nName:); scanf(%s,&); /*输入姓名*/ printf(nAge:); scanf(%d, &a.age); /*输入年龄*/ pri

15、ntf(nSex:); scanf(%s, &a.sex); printf(Wage1:); scanf(%f, &a.wage1); /*输入工资*/ printf(Wage2:); scanf(%f, &a.wage2); printf(Wage3:); scanf(%f, &a.wage3); printf(Wage4:); scan scanf(%f, &a.wage4); printf(Wage5:); scanf(%f, &a.wage5); wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5; pr printf(The sum of wag

16、e is %6.2fn, wage);/*显示结果*/ while(1) printf(Continue?); c=getche(); if(c=Y|c=y|c=N|c=n) break; 10.2 技能2:在程序中使用共用体类型10.2.1 共用体的定义【引例】 如果在一个函数的三个不同的程序段中分别使用了整型变量i、字符变量ch和单精度变量f, 可以将它们定义为同一类型变量data,此时给三个成员一共分配四个内存单元 。成员ch占用一个内存单元;成员i占用两个内存单元;成员f占用四个内存单元。data 变量中的三个成员,虽说各占的字节数不同,但都放在由同一个地址开始的内存单元中,几个变量互

17、相覆盖。这种使几个不同的变量共占用同一段内存的结构,即另一种数据类型的结构共用体。共用体也是一种新的数据类型, 共用体类型说明和共用体变量定义与结构体十分相似。【知识点】1共用体:将不同名称、不同类型的一组数据组织为一个整体,共享同一存储单元,该单元的实际大小由其中的最长类型的数据确定。共用体也叫联合体。2共用体的定义形式:union 共用体名 数据类型 成员名; 数据类型 成员名; . 共用体变量名; 3 共用体表示几个变量共用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量。 4. 共用体和结构体有下列区别: (1) 结构体和共用体都是由多个不同的数据类型成员组成, 但在任何

18、同一时刻, 共用体中只存放了一个被选中的成员, 而结构体的所有成员都存在。 (2) 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。 下例表示说明一个共用体data: union data int i; char ch; float f; 10.2.2 共用体变量的引用用已说明的共用体可定义共用体变量。 union data lgc; 例如:用上面说明的共用体data定义一个名为lgc的共用体变量, 可写成:在共用体变量lgc中, 整型量i和字符ch单精度f共用同一内存位置。 又如:union ata int a ; floa

19、t b; double c; char d; obj;该形式定义了一个共用体数据类型union ata,定义了共用体数据类型变量obj。【典型例题】例10.7 共用体类型与结构体类型实际占用存储空间比较。union data /*共用体*/ int a;float b;double c;char d;mm;struct stud /*结构体*/ int a;float b;double c;char d;main( )struct stud student;printf(%d,%d,sizeof(struct stud),sizeof(union data);运行结果如下: 15,8程序的输出

20、说明结构体类型所占的内存空间为其各成员所占存储空间之和(2+4+8+1=15)。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间(8)。使用时,根据需要使用其中的某一个成员。方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。当一个共用体被说明时, 编译程序自动地产生一个变量,其长度为共用体中最大的变量长度。 例10.8 共用体变量成员的引用情况。 main() union /*定义一个共用体*/ int i; /*共同体的成员i*/struct /*在共用体中定义一个结构体*/ char first; /*结构体成员first*/char seco

21、nd; /*结构体成员second*/half; /*结构体变量half*/number; /*共同体变量number*/number.i=0 x4241; /*共用体成员赋值*/ printf(%c%cn, number.half.first, number.half.second); number.half.first=d; /*共用体中结构体成员赋值*/ number.half.second=e; printf(%xn, number.i); getch(); 输出结果为:DE 6564 从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和s

22、econd赋字符后, 这两个 字符的ASCII码也将作为i 的低8位和高8位。共用体访问其成员的方法与结构体相同。若定义共用体类型为:union data /*共用体*/ int a; float b; double c; char d;mm;其成员引用为:mm.a,mm.b,mm.c,mm.d。【点拨】1不能同时引用共用体的成员。在某一时刻,只能使用其中之一。2共用体变量也可以定义成数组或指针,但定义为指针时, 也要用“-”符号, 此时共用体访问成员可表示成: 共用体名-成员名 3共用体可以出现在结构体内, 它的成员也可以是结构体。 例如: 若要访问结构体变量y1中共用体x的成员i,可以写成: y1.x.i; 若要访问结构体变量y2中共用体x的字符串指针ch的第一个字符可写成: *y2.x.ch; 若写成“y2.x.*ch;”是错误的。struct int age; char *addr; uni

温馨提示

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

评论

0/150

提交评论