C语言程序设计课件第8章.ppt

上传人:sccc 文档编号:5379246 上传时间:2023-07-01 格式:PPT 页数:58 大小:548.51KB
返回 下载 相关 举报
C语言程序设计课件第8章.ppt_第1页
第1页 / 共58页
C语言程序设计课件第8章.ppt_第2页
第2页 / 共58页
C语言程序设计课件第8章.ppt_第3页
第3页 / 共58页
C语言程序设计课件第8章.ppt_第4页
第4页 / 共58页
C语言程序设计课件第8章.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《C语言程序设计课件第8章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第8章.ppt(58页珍藏版)》请在三一办公上搜索。

1、返回主目录,C语言程序设计,(第8章 结构体与共用体),本章主要介绍结构体和共用体的基本知识,让学生学会利用结构体和共用体编写程序。,1.结构体的概念2.结构体类型数组3.指向结构体类型数据的指针4.结构体类型数据与函数5.链表6.共用体,一、结构体,如果在程序设计时,需要将不同类型的数据组成一个有机整体来引用,此时,用数组是无法完成的,C语言允许用户自己可以定义这种特殊的数据结构,称之为结构体。结构体中可以包含若干个类型不同的数据项。,二、结构体类型的定义,C语言中没有现成的结构体类型,如果用户要使用结构体类型,必须自己定义。结构体类型的一般定义形式如下:struct 结构体类型名类型名1

2、成员名1;类型名2 成员名2;.类型名n 成员名n;,注意:定义结构体类型时,“结构体名”是结构体类型标志,与struct共同组成结构体类型名。,说明:struct student是一个结构体类型名,在使用过程中与系统提供的标准类型(如int、float等)具有同样的地位和作用。一个结构体类型可以包含若干个成员,每个成员的类型可以不一样。一个结构体类型数据在存储时所占的内存单元字节数相当于每个成员所占内存单元字节数的总和。例如:前面定义的struct student结构体类型数据存储时所占内存单元为69字节。,例如:struct studentint number;char name10;ch

3、ar sex;int age;float scroce;char address50;,三、结构体类型变量的定义,结构体类型变量通常采取以下三种形式定义:1.先定义结构体类型,再定义结构体类型变量结构体类型名 结构体变量名;,例如:struct studentint number;char name10;char sex;int age;float scroce;char address50;struct student stud1,stud2;,例如:struct studentint number;char name10;char sex;int age;float scroce;char

4、 address50;stud1,stud2;,2.在定义结构体类型的同时定义变量struct 结构体名类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;,例如:struct int number;char name10;char sex;int age;float scroce;char address50;stud1,stud2;,3.直接定义结构体类型变量struct 类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;,注意:结构体类型和结构体类型变量是两 个不同的概念,使用时,先定义类 型,后定义变量。在程序中只能对结构体类型变量进 行操

5、作。结构体中的成员可以单独使用,相 当于一个普通变量,成员名可以和程 序中的普通变量同名,互不干扰。结构体中的成员可以是一个结构体变 量。,例如:struct dateint month;int day;int year;struct student1int number;char name10;char sex;struct date birthday;float scroce;char address50;stu1,stu2;,四、结构体类型变量的引用和初始化,结构体类型变量一旦被定义后,就可以在程序中使用,与数组相似,在程序中不能直接引用结构体类型变量,也不能对结构体类型变量进行整体输入

6、输出,只能引用其中的各个成员,对其中的各个成员进行输入输出。引用结构体变量成员时,象引用普通变量一样,可以进行各种运算。,引用结构体变量成员的一般形式如下:结构体变量名.成员名,例如:前面定义了结构体类型变量stud1和stud2,可以对变量的各个成员进行各种操作,例如:stud1.number=10001;stud2.number=10002;.printf(%d,另外,在程序中,还可以用指向结构体变量的指针变量来引用结构体变量成员。例如:struct student stud1;struct student*p1=stud1;(*p1).number=10001;.,注意:“-”是指向结构

7、体成员运算符,“.”是结构体成员运算符,它们的结合方式从左到右,优先级别最高。,上述程序段,还可以写成下面的形式:struct student stud1;struct student*p1=stud1;p1-number=10001;.,#include stdio.h#include string.hstruct studentint number;char name10;int age;float score;a;main()a.number=1001;strcpy(a.name,liming);a.age=18;a.score=89.5;printf(%-8d%s%8d%6.1f,a.

8、number,a.name,a.age,a.score);,例8-1 利用结构体变量输出学生信息。,#include stdio.hstruct studentint number;char name10;int age;float score;a=1001,liming,18,89.5;main()printf(%-8d%s%8d%6.1f,a.number,a.name,a.age,a.score);,例8-2 利用结构体变量输出学生信息。,一、结构体数组的定义和引用,结构体数组同普通数组一样,所有元素类型相同,是同一个结构体类型。,要定义一个结构体类型数组,必须先定义结构体类型,定义结构

9、体类型数组的一般形式如下:struct 结构体名 数组名常量表达式;,例如:struct student a3;,同普通数组相似,在程序中不能整体引用结构体数组,也不能引用结构体数组元素,只能引用结构体数组元素的成员。例如:a1.number=10001;a2.number=10002;,二、结构体数组初始化和应用,例如:struct sst int num;char name10;int age;struct sst a3=1001,zhangsan,18,1002,lisi,19,1003,wangwu,20;.,结构体数组初始化与普通数组初始化相似,可以先定义结构体类型,再定义结构体数组

10、并初始化。,例8-3 某班级学生进行学生干部选举,候选人有张三、李四、王五三位同学,全班共有学生40名,编写一个程序统计候选人的得票数。,#include string.h#include stdio.hstruct numchar name10;int number;main()struct num a3=zhangsan,0,lisi,0,wangwu,0;int i,j;char inputname20;printf(please input the list of candidate:n);for(i=0;i40;i+)scanf(%s,inputname);for(j=0;j3;j+

11、)if(strcmp(inputname,aj.name)=0)aj.number+;printf(n);for(i=0;i3;i+)printf(%10s:%2dn,ai.name,ai.number);,C语言规定:在程序中不能直接对结构体类型数组元素进行输入输出,只能对结构体类型数组元素的成员进行输入输出。结构体类型数组元素的成员的输入与输出与普通数组元素的输入与输出类似,通常利用循环语句来完成。,三、结构体类型数组的输入与输出,main()int n,i,sumSIZE;printf(How many students?n);scanf(%d,例 8.4 利用结构体数组输入并输出一个班

12、学生信息。,#include stdio.h#define SIZE 100struct studentchar name10;int num;float score3;float ave;studSIZE;,1、指向结构体类型数据的指针,以个结构体类型变量的指针就是该结构体类型变量所占据的内存单元的起始地址。在C语言程序中,可以设置一个指针变量,用来指向一个结构体类型的数据。,2、指向结构体类型变量的指针变量,在程序中,如果设置了一个指针变量来专门存放一种结构体类型变量的地址,则该变量就是指向这种结构体类型数据的指针变量,该变量的值就是存放某个结构体类型数据的内存单元的起始地址。,例如:st

13、ruct studentint number;char name10;int age;float score;/*定义结构体类型*/.struct student*p;/*定义指向结构体类型变量的指针变量*/.,指向结构体类型数据的指针变量一般说明形式如下:struct 结构体类型名 变量名;,利用指向结构体类型的指针变量引用结构体变量成员的一般形式如下:(*指针变量名).成员名或 指针变量名-成员名,指向结构体类型变量的指针变量引用,注意:“-”是指向结构体成员运算符,“.”是取结构体成员运算符,它们的结合方式从左到右,优先级别最高。在程序中只能将结构体类型变量的地址赋给一个指向结构体类型的

14、指针变量,一个指向结构体类型的指针变量只能指向结构体类型变量,不能指向变量的成员。,例如:struct studentint number;char name10;int age;float score;struct student stud1;.struct student*p1=stud1,*p2=stud1;(*p1).number=10001;(*p2).number=10002;.printf(%d,例 8.8#include stdio.hstruct studentint num;char name20;char sex;float score;main()struct stud

15、ent stu1=1001,Li Ming,M,95.0;struct student*p;p=,在程序中,如果将一个结构体类型数组的地址赋给一个结构体类型的变量,那么该变量就是一个指向结构体类型数组的指针变量。可以利用该指针变量来引用数组元素的各个成员。,3、指向结构体类型数组的指针,对于指向结构体类型数组的指针变量。其引用的方式和指向普通数组的指针变量的引用相类似。,例 8.9#include stdio.hstruct studentint num;char*name;char sex;float score;boy5=101,Zhou ping,M,45,102,Zhang ping,

16、M,62.5,103,Liu fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;main()struct student*ps;printf(No.tNametttSextScoretn);for(ps=boy;psnum,ps-name,ps-sex,ps-score);,注意:ps是指向结构体类型数据的指针变量,只能将数组的地址或某个数组元素的地址赋给ps,不能将数组元素的成员或成员的地址赋给ps,否则,程序将会出错。例如:ps=boy;/*正确*/ps=/*错误*/,1、结构体类型数据与函数,结构体类型变量的成员作函数参数,在函数调用时

17、,可以将结构体类型变量各成员的值作函数的实参进行数据传递。其用法和用普通变量作函数实参是一样的,属于“值传递”方式。,注意:在调用函数时,应注意实参与形参的类型保持一致。,main()struct student a;.f(a.score);.,#include stdio.hstruct studentint num;char name20;char sex;float score;,void f(float x).,例如:,C语言(ANSI C)允许使用结构体变量作实参进行数据传递,将主调函数中结构体变量所占用内存单元的内容全部顺序传递给形参。这是一种“值传递”方式,要求形参也必须是同类型

18、的结构体变量。,结构体类型变量作函数参数,例 8.10 有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求分别编写两个不同的函数输出学生的学号、姓名和3门课的成绩及总成绩。,#include stdio.h#include string.h#define FORMAT%5d%9s%8.1f%8.1f%8.1fstruct student int num;char name20;float score3;,void pri1(struct student stt)printf(num name score1 score2 score3 sumscoren);printf(FORMAT

19、,stt.num,stt.name,stt.score0,stt.score1,stt.score2);void pri2(float xx)float sum;sum=xx0+xx1+xx2;printf(%9.1f,sum);main()struct student stu=1001,LiMing,67.5,89.0,78.6;pri1(stu);pri2(stu.score);,指向结构体类型变量的指针作为函数参数,在程序中,如果用指向结构体变量的指针作函数的实参,可以将结构体变量的地址传给形参,使实参和形参共同指向同一段存储单元,得到函数的返回值。,例8.11 有一个结构体变量stu,

20、内含学生学号、姓名和3门课的成绩,利用函数编程按升序输出学生的成绩。#include stdio.h#include string.h#define FORMAT%5d%9s%8.1f%8.1f%8.1f#define N 3struct student int num;char name20;float scoreN;,void pri(struct student*stt)int i,j;float t;for(i=0;iscorejstt-scorej+1)t=stt-scorej;stt-scorej=stt-scorej+1;stt-scorej+1=t;main()struct s

21、tudent stu=1001,LiMing,67.5,89.0,78.6;struct student*p=,结构体类型数组作为函数参数,在程序中也可以使用结构体类型数组作函数的参数,将该结构体类型数组的地址传给形参。,例8.12 有一个结构体类型数组student,内含几个学生学号、姓名、性别和成绩。要求编程计算这组学生的平均成绩,并统计不及格的人数。#include stdio.h#define N 5struct stuint num;char*name;char sex;float score;,void ave(struct stu*ps)int c=0,i;float ave,s

22、=0;for(i=0;iscore;if(ps-score60)c+=1;ave=s/N;printf(average=%.1fncount=%dn,ave,c);main()struct stu studentN=101,Li ping,M,45.0,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87.0,105,Wang ming,M,58.0;ave(student);,指向结构体类型数组的指针作为函数参数,在程序中,可以用指向结构体类型数组的指针作函数参数,将该结构体类型数组的地址传给形参。,例8.12中程序的mai

23、n函数可以改写为下面程序代码。,main()struct stu studentN=101,Li ping,M,45.0,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87.0,105,Wang ming,M,58.0;struct stu*p=student;ave(p);,函数的返回值可以是某种类型的数据,也可以是指向某种类型数据的指针。C语言允许函数调用时,返回结构体类型指针值。,返回值为结构体类型的函数,其函数原型如下:struct 结构体类型名*函数名(参数表列);,例 8.14 在一组的学生信息中查找某个学生的信

24、息。如果找到,输出该学生信息,否则输出没有找到。,#include stdio.h#define SIZE 100#define N 6#define FORMAT%-11s%3d%8d%8d%8dnstruct student char name30;int num;int score3;/*定义结构体类型*/,struct student*search(struct student*p,int*kk char nam30;struct student*pp;printf(input the name of the student you want to look forn);scanf(%

25、s,nam);for(pp=p;ppname,nam)=0)*kk=1;break;return pp;,void print(struct student*stu)printf(n NAME No.SCORE1 SCORE2 SCORE3n);printf(-n);printf(FORMAT,stu-name,stu-num,stu-score0,stu-score1,stu-score2);,main()int kk=0;struct student*result;struct student studN=zhangsan,1001,75,80,68,lisi,1002,66,90,82,

26、wangwu,1003,77,86,64,liuli,1005,66,70,72,zhouqi,1006,79,96,74,shunba,1007,76,79,92;result=search(stud,一、链表,链表是一种常见的、重要的、特殊的数据结构,是动态进行存储分配的一种结构。在C语言程序中,常用链表来代替结构体数组,节约内存资源。,1.链表,在结构体变量中,如果定义最后一个成员为下一个结构体变量的指针时,就形成一种链表关系,,链表中的结构体变量称为“结点”,很明显,链表有一个“头指针”,图中用head表示,还有一个“表尾”,图中用NULL表示。每个结点都包含两个部分:用户所需的数据和

27、下一个结点的地址。链表中的所有元素在内存中不是连续存放的,要找到某一元素,必须先找到上一个元素,根据上一元素提供的地址才能找到下一个元素,如果不知道“头指针”的值,整个链表无法访问。,有关链表的操作,除了建立链表以外,还有删除结点、插入结点和链表的输出操作,其相应操作详见206页215页。,一、共用体的概念,在程序中,为了节省内存资源,经常将几个类型不同的数据存放到同一段内存单元中,要保证这些数据正确存取,只能在某一具体时间段内存放其中的一个数据。这种使几个不同类型的数据共同占用同一段内存的结构,称为“共用体”类型结构。,二、共用体类型的定义,共用体类型的一般形式如下:union 共用体名类型

28、名1 成员名1;类型名2 成员名2;.类型名n 成员名n;,例如:union datachar name10;int age;float score;,注意:一个共用体类型包含若干个成员,每个成员的类型不一样。共用体类型中的所有成员共同占用同一段存储空间,在存储时所占的内存单元字节数等于其中最长的成员所占内存单元字节数。,三、共用体类型变量的定义,共用体类型变量的定义,通常采取以下三种形式:1.先定义共用体类型,再定义共用体类型变量定义形式为:共用体类型名 共用体变量名;例如:union data char name10;int age;float score;union data stt1,

29、stt2;上述定义中,stt1,stt2为union data类型变量,存储时,各占10字节内存单元。,2.在定义共用体类型的同时定义变量定义形式为:union 共用体名类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;,例如:union datachar name10;int age;float score;stt1,stt2;,3.直接定义共用体类型变量定义形式为:union 类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;,例如:union char name10;int age;float score;stt1,stt2,四、共用体类型

30、变量的引用,在C语言程序中只能引用共用体变量的成员,不能直接引用共用体变量。引用共用体变量成员一般形式如下:变量名.成员名例如:stt1.age=18;,注意:共用体是在同一个内存段中存放几种不同类型的成员,但在某一个具体的瞬间,只能存放其中的一个成员,即每一瞬间只有一个成员起作用,不是所有的成员都同时起作用。共用体变量中起作用的成员是最后一次存放的成员,前面存放的成员被后面存放的成员所覆盖。共用体变量的地址与其各成员的地址是同一个地址。即&stt1、&stt1.age、&stt1.score和&stt1.name是同一个值。不能直接对共用体变量赋值,也不能直接引用共用体变.量,更不能对共用体

31、变量进行初始化。共用体变量不能作为函数的参数,函数的返回值不能为 共用体变量。共用体类型可以用于结构体类型定义中,也可以定义共 用体类型数组。结构体类型也可以出现在共用体类型定 义中,另外,数组可以作为共用体的成员。可以使用指向共用体变量的指针变量。,一、用typedef定义数据类型,C语言允许用户直接使用系统提供的标准数据类型(如int、char、float、double、1ong等)和用户根据编程需要所声明的构造类型(如结构体类型、共用体类型、指针类型、枚举类型等),还允许用户用typedef声明新的类型名来代替已有的类型名。,定义数据类型的一般形式如下:typedef 已有的类型名 新的

32、类型名;例如:typedef int INTEGER;typedef float REAL;,定义函数类型例如:typedef float FUN();FUN fx;等价于float fx();,定义数组类型例如:typedef float NUM100;NUM a;等价于float a100;,定义指针类型例如:typedef float*POINT;POINT p;等价于float*p;,定义结构体类型例如:struct dataint month;int day;int year;typedef struct data DATADATE birthday;,等价于struct dataint month;int day;int year;struct data birthday;,说明:用typedef可以声明各种数据类型,但不能用来定义变量。用typedef只能对已经存在的数据类型增加一个类型名,不能创造出新的数据类型。当不同源文件中用到同一类型数据(如结构体、共用体等数据类型)时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。使用typedef定义数据类型有利于程序的通用与移植。,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号