C语言项目开发教程PPT第6章.ppt
《C语言项目开发教程PPT第6章.ppt》由会员分享,可在线阅读,更多相关《C语言项目开发教程PPT第6章.ppt(177页珍藏版)》请在三一办公上搜索。
1、第6章 C语言的数据类型有基本数据类型和构造数据类型。基本数据类型提供了对单一数据的表达方式,利用数组可以表示由同类型的多个元素构成的复合对象,即把有限个相同类型的数据作为一个变量进行整体操作。但是在实际应用中,存在着很多更为复杂的对象,需要由多种不同类型的属性来描述,例如一个学生的信息包括学生学号、姓名、年龄、成绩等属性,且每一个属性的数据类型不同,这些不同的类型的数据共同构成一个整体学生,而如果每一个属性都用简单的变量来分别表示,则程序会变得比较松散、复杂,数据难以处理。为了解决类似这样的问题,C语言中允许用户自己定义一种数据类型,以整体的形式来描述多个属性,即构造数据类型。,构造数据类型
2、又分为三种:结构体、共用体和枚举。应用这三种复杂数据类型,可以很容易地描述和构造不同的数据结构,并对这些数据进行比较方便的操作。任务6.1 学生成绩排序结构体任务目标了解结构体的概念和使用范围。掌握结构体的声明、变量定义、初始化和引用方法。掌握结构体数组的使用方法。掌握结构体指针的使用方法。掌握结构体作为函数参数时的用法。掌握结构体类型函数的用法。用结构体实现学生成绩排序任务。,6.1.1 结构体1结构体的声明程序的目的是解决客观世界中存在的问题,因此常常需要模拟客观世界中的事物或者概念,如学生。在计算机中是如何表示一个学生或者其他事物的呢?首先要做的是找到这个事物中被关注的信息。比如在学生信
3、息管理系统中,被关注的是学生的学号、姓名、年龄、性别、院系等信息,则在计算机中将这些信息表示出来,即可代表一个学生。但是不同的属性具有不同的数据类型,如学号为整型或者字符型、姓名为字符型、性别为字符型、学院为字符型、成绩为浮点型等,如表6-1所示。,表6-1 学生信息表学号(整型)姓名(字符串)出生日期(整型)性别(字符型,m为男,f为女)院系(字符串)20120601李雷19880423男(0)计算机学院20120602韩梅梅19890512女(1)计算机学院20120603张红19890810女(1)计算机学院在之前的程序中,往往是用多个变量数组来分别表示学生的各个属性,但是这每一个变量之
4、间显示不出关联性,也缺乏概念的整体性。如要查找一个学生的信息,则需要在多个变量数组中查询;要对学生进行排序,就必须对每一个变量数组都进行同样的元素交换。而这些信息也无法用二维数组来存放,因为二维数组中每一个元素的类型和长度都必须相同。那么能否将这些属性作为一个完整的类型存放呢?,C语言中规定了一种新的数据类型,即结构体,来表示类型不同但是可以作为一个整体的逻辑相关的多个变量。结构体(structures)是一种由其他数据类型组合而成的新的数据类型。结构体具有组合的形式,也包含了分析的内涵,是建立在对实际数据对象分析的基础上,利用已有的数据类型重新组建而成的用户自定义数据类型。结构体在使用之前必
5、须对其类型名和数据类型进行声明,也就是声明结构体类型的名称以及构成它的每一个成员的名称和类型。结构体声明的一般形式如下:,struct 结构体名 数据类型 成员1;数据类型 成员2;数据类型 成员n;关键字struct表示定义的类型为结构体类型。在结构体中,可以声明若干个成员,每一个成员都是该结构体的一个组成部分。对每一个成员都要做单独的类型说明,每个成员的数据类型都可以不同。成员列表不可以为空。注意,大括号后面的分号是不可省略的,表明结构体声明的结束。例如,定义一个学生的结构体:,struct studentint no;/学号char name20;/姓名int birthday;/出生日
6、期char sex;/性别char major20;/院系;在C语言中,结构体的声明是可以嵌套的。例如对于学生的出生日期,可以用整型数据来表示,也可以将日期中的年、月、日分开,用结构体来表示,例如:struct data,int year;int month;int day;则此时student结构体可以定义为:struct studentint no;char name20;struct data birthday;char sex;,char major20;其中birthday的类型为结构体data,同时又是结构体student中的一个成员,构成结构体的嵌套声明。一般把结构体的声明放在文
7、件的最前面,也可以放在头文件内。若在函数内部声明一个结构体,在函数外则无法使用这个结构体。一个结构体中的成员是另外一个结构体类型时,必须将使用的结构体的声明放在前面。同一个结构体中的成员是不可以重复的,但是不同结构体的成员可以重复。结构体成员和其他变量可以重名,它们代表不同的含义,互不干扰。2结构体变量的定义,结构体类型是一个数据类型,它和C语言中的其他数据类型int、float、char等类型的作用相同。声明一个结构类型时,实际上只是指明了该数据类型的名称和成员名,是对数据类型的一种抽象的说明,其作用为规定了该类数据类型的性质与该类数据类型所占内存的大小,但此时并不为结构体分配内存空间。通过
8、结构体类型,可以定义结构体类型变量。只有通过定义结构体变量,编译器才会为其分配存储空间,才能存储真正的数据。可以这样理解结构体和结构体变量之间的关系:结构体声明时,相当于设计了一个二维表格,确定这个表格的名称,并规定好这个表格中的每一列的名称和含义,,但只是设计过程;而定义一个结构体变量时,相当于将这个已设计好的二维表格在纸上画出来,并且通过变量的初始化或者赋值等可以向表格中填充数据。结构体变量的定义有3种形式。(1)先声明结构体,再定义结构体变量。例如:struct studentint no;char name20;int birthday;char sex;struct student
9、stu1,stu2;,上述定义中,先声明结构体student,然后定义了两个student类型的变量,分别为stu1和stu2。注意,在struct student作为一个整体,表示一个student的结构体类型时,不能只用student来定义变量。可以定义宏来表示一个结构体类型。例如:#define STU struct studentSTU;STU stu1,stu2;,(2)类型声明的同时定义变量。这种方式在声明结构体类型的同时紧跟着定义该类型的变量,即结构体的声明和结构体变量的定义进行合并,例如:struct studentint no;char name20;int birthday
10、;char sex;stu1,stu2;此时大括号后面没有分号,而是在变量定义后面加分号。,(3)直接定义结构体变量。例如:struct int no;char name20;int birthday;char sex;stu1,stu2;这种定义方式不出现结构体名,而直接给出结构变量。此时对该结构体只能有这一次变量定义,之后不能再定义这个结构体的其他变量和指向该结构体变量的指针。,结构体变量和普通变量类型,也有作用域和存储类型,即也可以为全局变量或者局部变量,可以进行静态存储和动态存储等,并且是由其定义位置的方式决定的。为结构体分配存储空间时,需要根据其每一个成员数据类型分别为每一个成员分配
11、相应的存储空间,分配时按成员定义的顺序进行。一个结构体变量所占用的存储空间是连续的,且这片连续的存储空间的长度和其所有成员所占存储空间长度之和相等。,3结构体变量的初始化和其他变量类似,结构体变量可以在定义的时候进行初始化赋值,其一般形式为:struct 结构体类型名 结构体变量名=初值表;例如:struct dataint year;int month;int day;struct data new_year=2012,0,0;,初始值表中的值应和结构体定义中的成员的名称和类型相符,且结构体变量定义好之后,就不能再对各个成员的值进行整体的赋值了,例如:struct data summer;s
12、ummer=2012,07,20;上述赋值方式是错误的。和数组初始化的性质相同,结构体变量的初始化仅限于外部的和static类型的结构体。即在函数内部如果想对结构体变量进行初始化,则该变量必须定义为static类型,否则将会有错误。结构体变量的初始化不允许对部分成员进行初始化。,4结构体变量的引用除了初始化之外,不能对结构体变量整体进行操作,对结构体变量的赋值、输入、输出和其他操作都是通过引用结构体变量的成员来实现的。结构体成员引用的一般形式为:结构体变量名.成员名其中“.”为成员运算符,和其他操作符相比,其优先级最高。例如:struct data day1;day1.year=2012;da
13、y1.month=12;day1.day=21;,【案例6-1】结构体变量的输出。#include struct dataint year;int month;int day;struct studentint no;char name20;struct data birthday;char sex;,char major20;#define STU struct studentvoid main()STU boy=20120601,LiLei,1988,12,3,m,computer;STU girl=20120602,HanMeimei,1989,8,10,f,computer;print
14、f(student1:n);printf(NO:%d,name:%s,birthday:%d.%d.%d,sex:%c,major:%sn,boy.no,boy.name,boy.birthday.year,boy.birthday.month,boy.birthday.day,boy.sex,boy.major);printf(student2:n);printf(NO:%d,name:%s,birthday:%d.%d.%d,sex:%c,major:%sn,girl.no,girl.name,girl.birthday.year,girl.birthday.month,girl.birt
15、hday.day,girl.sex,girl.major);程序运行结果如下:student1:,NO:20120601,name:LiLei,birthday:1988.12.3,sex:m,major:computerstudent2:NO:20120602,name:HanMeimei,birthday:1989.8.10,sex:f,major:computer注意,student中的成员birthday仍然是一个结构体,要输出其值还需要访问结构体data中的成员。【案例6-2】判定二维平面中的三点能否构成三角形。,#include#include struct pointfloat
16、x;/横坐标float y;/纵坐标;/求两点间距离float length(float x1,float y1,float x2,float y2)float len;len=sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);return len;,void main()struct point p1,p2,p3;float len1,len2,len3;printf(请分别输入三点坐标:n);scanf(%f,%f,if(len1+len2=len3|len2+len3=len1|len1+l,en3=len2)printf(三点不能构成三角形n);else prin
17、tf(三点可以构成三角形n);程序运行结果如下:请分别输入三点坐标:2,00,20,0,三点可以构成三角形6.1.2 结构体数组与指针1结构体数组数组的元素也可以是结构体类型的,因此可以构成结构体数组。结构体数组的每一个元素都是具有相同类型的结构体变量,每一个下标元素都含有结构体类型的所有成员。在表示一个学生的信息时,可以使用一个结构体变量来完成,但是在处理多个学生信息时,则不适合用多个结构体变量来解决。单个的结构体变量的适用范围不大,一般需要建立结构体数组来表示具有相同数据结构的一个群体,如一个班级内的所有学生信息,所,有学生的成绩信息等。结构体数组的定义形式和结构体变量的定义形式类似,只是
18、定义的不是单独变量,需要说明为数组类型即可。结构体数组的一般定义形式为:结构体类型 数组名常量表达式;例如:struct peaplechar name20;int age;char sex;char profession20;struct peaple student10;,也可以在定义结构体的同时定义结构体数组或者直接定义结构体数组,而不给出结构体数组的类型名称。例如:struct peaplechar name20;int age;char sex;char profession20;student10;与普通数组一样,只能对全局和静态的结构体数组初始化,初始化的方法也与普通数组相类似。
19、可以在定义结构体数组的同时进行初始化。例如:,struct student3=lilly,20,f,studentJack,21,m,studentLucy,21,f,student;在对所有元素进行初始化时可以不指定数组的长度,例如:struct student=lilly,20,f,studentJack,21,m,studentLucy,21,f,student;结构体数组的存储和一般数组元素的存储相同,也是按下标连续存储的。,在引用结构数组变量时,先通过下标引用结构体数组中的某一元素,再引用结构体中的某一成员。例如:student2.age=22;【案例6-3】结构体数组的应用。从键盘
20、读取学生的学号、姓名和三门课的成绩信息,计算每一个学生的平均成绩,然后输出所有信息。程序源代码如下:#include#define N 3/学生数目,struct studentint no;char name20;float score3;float average;#define Stu struct studentvoid main()Stu sN;int i,j;float tmp=0;printf(请输入%d个学生的信息:n,N);for(i=0;iN;i+),printf(学生学号:);scanf(%d,printf(学号t姓名t成绩t成绩t成绩t平均成绩n);for(i=0;iN
21、;i+)printf(%dt%s,si.no,si.name);for(j=0;j3;j+)printf(t%.2f,si.scorej);printf(t%.2fn,si.average);程序运行结果如下:,请输入3个学生的信息:学生学号:001学生姓名:Jack学生三门课成绩:89 87 76学生学号:002学生姓名:Lucy学生三门课成绩:98 97 90学生学号:003学生姓名:Kate学生三门课成绩:89 85 90,学号 姓名 成绩1 成绩2 成绩3 平均成绩1 Jack 89.00 87.00 76.00 84.002 Lucy 98.00 97.00 90.00 95.003
22、 Kate 89.00 85.00 90.00 88.002结构体指针当把一个结构体变量的起始地址赋值给一个指针变量时,就称该指针指向这个结构体变量,该指针为结构体类型指针。一个结构体变量的多个成员,必定要占据一段连续的内存。一个结构体类型指针指向这段内存的起始地址,有了结构体指针,就可以通过结构体指针来访问结构体变量或者结构体变量中的成员。结构体类型指针和前面介绍的几种类型的指针在特性和使用方法上完全相同。结构体指针的一般定义形式为:,结构体类型*指针变量名;需要先声明结构体类型,然后才能定义结构体指针。例如:struct product char code5;char name20;flo
23、at price;struct product a,b,*p;上述例子中先定义了一个结构体product,其成员包括商品编号、商品名称和商品价格,然后再定义指向这个结构体类型的指针。,可以对结构体类型指针进行赋值,即把一个结构体变量的首地址赋值给该指针变量,而不能把结构体名赋值给指针变量。例如正确的赋值方法为:*p=,可以通过结构体指针引用结构体中的成员。另外,有两种通过指针引用结构体成员的方法。即对结构体成员的引用方式共有三种。(1)结构体变量名.成员名。例如:apple.price=3.5;(2)(*结构体指针变量).成员名。例如:(*p).price=3.5;注意此时括号不能少。因为“.
24、”的优先级高于“*”,如果没有括号,则等效于“*(p.price)”,则意义完全不同。,(3)结构体指针变量名-成员名。例如:p-price=3.5;【案例6-4】结构体成员的输出。/三种输出方法比较#include struct product char code6;char name20;float price;,void main()struct product apple=FI002,apple,3.5;struct product*p;p=,程序运行结果如下:FI002 apple 3.50FI002 apple 3.50FI002 apple 3.50从上面的案例中可以看出,这三种
25、用于引用结构体成员的方法是完全等效的。对于普通数组,数组名是数组的首地址,可以根据指向数组的指针或指向数组元素的指针对数组元素进行访问。同样,结构体数组或数组元素也可以用指针来访问。指针变量可以指向一个结构体数组,这时指针变量的值为整个结构体数组的首地址;结构体指针也可以指向结构体数组中的一个元素,这时指针变量的值为该结构体数组元素的首地址。如果一个指针变量已经指向一个结构体数组,就不能再使之指向结构体数组中元素的某一成员。例如:,struct pointdouble x;double y;struct point s10,*p;p=s;即定义了一个指针变量p,让其指向一个结构体数组的首地址。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 项目 开发 教程 PPT
链接地址:https://www.31ppt.com/p-6504384.html