第5章 复杂构造数据类型_第1页
第5章 复杂构造数据类型_第2页
第5章 复杂构造数据类型_第3页
第5章 复杂构造数据类型_第4页
第5章 复杂构造数据类型_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

数据类型回顾基本数据类型整型实型字符型整型数组实型数组字符数组数组---构造数据类型特点:所有元素属于同一种数据类型C语言程序设计图书馆存储一本图书的信息时,需要存储书号、书名、作者、出版社、出版时间、价格等信息,它们属于不全相同的数据类型。num711107116nameThinkinginC++author(美)BruceEckelpress机械工业出版社pubtime2000.1price39.00intnum;//

charnum[20];charname[50];charauthor[30];charpress[30];……?floatprice;这些数据属于不全相同的数据类型,但它们组合在一起表达了一本图书的信息。C语言程序设计学校在记录一名同学的信息时,需要存储学号、姓名、性别、年龄、成绩、家庭地址等信息,它们也属于不全相同的数据类型。num15001name张无忌sexMage19score99.5addrBeiJingintnum;//

charnum[20];charname[30];charsex;intage;floatsore;charaddr[50];这些数据也属于不全相同的数据类型,但它们组合在一起表达了一个同学的信息。C语言程序设计第五章

复杂构造数据类型5.1结构体5.2共用体5.3枚举类型5.4链表☆C语言程序设计5.1结构体在解决实际问题时,有时需要将多个不同类型的数据组合在一起表达一个整体的信息。例如:描述一个学生的完整信息时,有学号、姓名、年龄、成绩、家庭地址等项。numnamesexagescoreaddr15001LiMingM1999.5Beijingintnum;charname[30];charsex;intage;floatscore;charaddr[50];C语言提供了这种数据结构:允许用户将不同类型的数据组合成一个有机的整体,这些数据互相联系;这种数据结构称为结构体(structure)。C语言程序设计结构体类型在使用之前应先定义,然后再定义该类型变量,才能使用。定义一个结构体类型的一般形式:struct结构体名{};类型标识符1成员名1;类型标识符2成员名2;

……

……类型标识符n

成员名n;成员表列(域表)struct{};studentintnum;charname[30];charsex;intage;floatscore;charaddr[50];C语言程序设计1定义结构体类型变量的方法1、先定义结构体类型再定义结构体变量structstudent{

intnum;charname[20];floatscore;};structstudentstu1,stu2;结构体类型名变量表列定义了结构体变量后,系统会为之分配内存单元。结构体变量占有的内存单元等于各成员占有的内存单元之和。sizeof(stu1)=?4+20+4=28┊4B20B4B┊4B20B┊4Bnumnamescorenumnamescorestu1stu2C语言程序设计2、在定义结构体类型的同时定义变量struct

student{

intnum;charname[20];floatscore;}stu1,stu2;3、直接定义结构体类型变量struct{

intnum;charname[20];floatscore;}stu1,stu2;(不出现结构体名)struct{

intnum;charname[20];floatscore;}stu3;则如下赋值:stu2=stu1;√stu3=stu1;×//类型不一致因此不建议使用这种形式定义结构体变量。也不建议使用!C语言程序设计编写程序时使用方法:#include…#define…structstudent //全局结构体类型{

intnum;charname[20];floatscore;};intmain(){

structstudent

stu1,stu2;//局部变量……}intfun(…){

structstudentstu3;//正确…}C语言程序设计4、说明

①、类型与变量是不同的概念,不要混淆:只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;在编译时,对类型不分配内存空间,只对变量分配空间。

②、结构体变量可以嵌套定义;structdate{intyear;

intmonth;

intday;};structstudent{intnum;charname[20];

structdatebirth;charaddr[30];};sizeof(structstudent)=?4+20+12+30=66形式一:先定义类型,再定义变量C语言程序设计structstudent{

intnum;charname[20];

structdate{

intyear;

intmonth;

intday;}birth;charaddr[30];};structstudent{

intnum;charname[20];

struct{

intyear,month,day;}birth;charaddr[30];};问题:如何定义本章开头表示图书出版年月(不含日)的时期类型?形式二:定义类型时定义变量形式三:直接定义变量C语言程序设计③、成员也可以是指向本结构体类型的指针变量。structstudent{intnum;charname[20];floatscore;

structstudent

*next;};structstudentstu1,stu2,stu3,stu4;stu115001Li87.0stu215002Wang92.5stu315003Zhang90.0stu415004Zhao99.5&stu2&stu3&stu4NULL链表C语言程序设计2结构体变量的引用1、引用形式:结构体变量名.成员名成员运算符,优先级为1structstudent{

intnum;charname[20];floatscore;};structstudentstu1,stu2;stu1.num=10001;strcpy(stu1.name,"LiMing");stu1.score=95;C语言程序设计2、不能将一个结构体变量作为一个整体进行输入输出;printf("%d%s%f",stu1);×scanf("%d%s%f",&stu1);×只能对结构体中的各个成员分别进行输入输出。scanf("%d",&stu1.num);gets();printf("%d,%s,%f\n",stu1.num,,stu1.score);structdate{

intyear;

intmonth;

intday;};structstudent{intnum;charname[20];charsex;

structdatebirth;charaddr[30];}stu;stu.birth.year=2002;scanf("%d",&stu.birth.day);printf("%d\n",stu.num);printf("%s\n",);C语言程序设计例1定义一个结构体student,成员包括学号、姓名和成绩,请输入并输出该学生的信息。分析:如何定义结构体student?结构体类型定义在何处?(函数内还是函数外?若放在函数外,是放在所有函数之前还是函数之间或最后?)

①放在函数内外都可以,但一般放在函数外面,类似全局变量与局部变量;放在函数内则其它函数不可以使用

②放在所有函数之前,预处理命令之后,则所有函数都可以使用如何输入和输出学生信息?定义相应的结构体变量,操作该变量的成员如何输入输出结构体变量?逐个输入输出其成员EG501.CC语言程序设计#include<stdio.h>structstudent{intnum;charname[20];floatscore;};intmain(){return0;}structstudents;printf("num:");scanf("%d",&s.num);printf("name:");scanf("%s",);printf("score:");scanf("%f",&s.score);printf("num:%d\n",s.num);printf("name:%s\n",);printf("score:%g\n",s.score);printf("num:");scanf("%d",&s.num);getchar();printf("name:");gets();说明:在使用gets函数前使用getchar函数,把上次的回车符读走EG501.Cscanf("%d%s%f",&s.num,,&s.score);printf("%d,%s,%f\n",s.num,,s.score);C语言程序设计3、相同类型的结构体变量可以进行整体赋值stu2.num=stu1.num;strcpy(,);stu2.score=stu1.score;stu2=stu1;因此,结构体变量可以作为函数的参数。函数定义:voidfun(structstudentstu

){……}函数调用:fun(stu1);C语言程序设计例2在例1中,请编写函数print输出学生的信息。intmain(){

structstudents;…

printf("num:%d\n",s.num);

printf("name:%s\n",);

printf("score:%g\n",s.score);return0;}函数定义:voidfun(structstudentstu){……}函数调用:fun(stu1);____print(_____________){}structstudentstuvoidprintf("num:%d\n",stu.num);printf("name:%s\n",);printf("score:%g\n",stu.score);print(s);EG502.CC语言程序设计3结构体变量的初始化在定义结构体变量的同时,对结构体变量赋初值。structstudent{intnum;charname[20];floatscore;}stu1={15001,"宋红",89.5};structstudentstu2={15001,"宋红",89.5};structstudentstu3;stu3={15001,"宋红",89.5};这是赋值,错误!C不允许这样做C语言程序设计4结构体数组结构体数组即基类型是结构体的数组,数组中的每个元素都是结构体变量。定义结构体数组1、先定义结构体类型,再定义结构体数组struct

student{

intnum;charname[20];floatscore;};structstudentstu[30];C语言程序设计2、定义结构体类型的同时定义结构体数组struct

student{

intnum;charname[20];floatscore;}stu[30];3、直接定义结构体数组struct{

intnum;charname[20];floatscore;}stu[30];(不建议采用)(不建议采用)C语言程序设计结构体数组的初始化struct

student{

intnum;charname[20];floatscore;};structstudent

stu[]={{10101,"LiMing",95},{10102,"LiuXia",89},{10103,"WangMin",98}};/*给全部数组元素赋初值时,可以省略数组大小*/C语言程序设计5结构体与指针结构体变量的指针就是该变量所占据的内存段的起始地址。1、指向结构体变量指针的定义:struct

student{intnum;charname[20];floatscore;};structstudentstu,*p;p=&stu;注意:不能用指向结构体变量的指针指向该结构体变量(其它类型)的某个成员。p=&stu.num;int*ip;ip=&stu.num;//正确C语言程序设计2、访问结构体成员变量的三种方法:①、stu.num、stu.name、stu.score②、(*p).num、(*p).name、(*p).score3、说明:①、成员运算符"."的优先级高于指针运算符"*",因此采用"(*p).成员名"形式时,括号不能省略;③、p->num、p->name、p->score②、"->"为指向运算符,是优先级最高的运算符。EG508.CC语言程序设计#include<stdio.h>structstudent{intnum;charname[20];floatscore;};intmain(){

structstudentstu={95101,"LiMing",89.5},*p=&stu;return0;}

printf("No.:%d\nName:%s\nScore:%g\n\n",stu.num,

stu.name,stu.score);

printf("No.:%d\nName:%s\nScore:%g\n\n",(*p).num,

(*p).name,(*p).score);

printf("No.:%d\nName:%s\nScore:%g\n\n",p->num,

p->name,p->score);EG508.CC语言程序设计5.2共用体所谓“共用体(union)”是指使几个不同的变量共占同一段内存的数据类型。2001200220032004chifcharch;shortinti;//2Bfloatf;EG510.C把变量ch、变量i、变量f放在同一个地址开始的内存单元中。即使几个不同的变量共占同一段内存空间。C语言程序设计1共用体变量的定义1、先定义共用体类型标识符,再定义变量union

共用体类型标识符{

类型标识符1成员名1;类型标识符2成员名2;

……

……

类型标识符n

成员名n;};uniondata{

inti;charch;floatf;};union共用体类型标识符

变量名表;uniondataa,b,c;C语言程序设计2、直接定义共用体变量union

共用体类型标识符{

类型标识符1成员名1;类型标识符2成员名2;

……

……

类型标识符n

成员名n;}变量名表;uniondata{inti;charch;floatf;}a,b,c;union{inti;charch;floatf;}a,b,c;3、共用体与结构体的定义形式相似,但含义不同:结构体变量所占的内存长度等于各成员所占的内存长度之和。(每个成员分别占有自己的内存)共用体变量所占的内存长度等于最长的成员的长度。(每个成员占用相同的内存)sizeof(uniondata)=4C语言程序设计1、引用形式为:共用体变量名.成员名uniondata{inti;charch;floatf;}a,b,c;a.i引用共用体变量a中的整型变量ia.ch引用共用体变量a中的字符变量cha.f引用共用体变量a中的实型变量f2、注意:

不能直接引用共用体变量,而只能引用共用体变量的成员printf("%d",a);printf("%d",a.i);printf("%d",a.ch);3、共用体类型数据的特点:①、同一内存段可以用来存放几种不同类型的成员,但在某一时刻只能存放其中一种,而不是同时存放几种;2共用体变量的引用C语言程序设计5.3枚举类型所谓“枚举”是指将变量的所有取值一一列举出来,变量的

温馨提示

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

评论

0/150

提交评论