C语言程序设计第8章.pptx

上传人:莉*** 文档编号:73649215 上传时间:2023-02-21 格式:PPTX 页数:57 大小:209.70KB
返回 下载 相关 举报
C语言程序设计第8章.pptx_第1页
第1页 / 共57页
C语言程序设计第8章.pptx_第2页
第2页 / 共57页
点击查看更多>>
资源描述

《C语言程序设计第8章.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计第8章.pptx(57页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、一、结构体如果在程序设计时,需要将不同类型的数据组成一个有机整体来引用,此时,用数组是无法完成的,C语言允许用户自己可以定义这种特殊的数据结构,称之为结构体。结构体中可以包含若干个类型不同的数据项。第1页/共57页二、结构体类型的定义C语言中没有现成的结构体类型,如果用户要使用结构体类型,必须自己定义。结构体类型的一般定义形式如下:struct 结构体类型名类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;注意:定义结构体类型时,“结构体名”是结构体类型标志,与struct共同组成结构体类型名。第2页/共57页说明:struct student是一个结构体类型名,在使用过程中与系统

2、提供的标准类型(如int、float等)具有同样的地位和作用。一个结构体类型可以包含若干个成员,每个成员的类型可以不一样。一个结构体类型数据在存储时所占的内存单元字节数相当于每个成员所占内存单元字节数的总和。例如:前面定义的struct student结构体类型数据存储时所占内存单元为69字节。例如:struct studentint number;char name10;char sex;int age;float scroce;char address50;第3页/共57页三、结构体类型变量的定义结构体类型变量通常采取以下三种形式定义:1.先定义结构体类型,再定义结构体类型变量结构体类型名

3、 结构体变量名;例如:struct studentint number;char name10;char sex;int age;float scroce;char address50;struct student stud1,stud2;第4页/共57页例如:struct studentint number;char name10;char sex;int age;float scroce;char address50;stud1,stud2;2.在定义结构体类型的同时定义变量struct 结构体名类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;第5页/共57页例如

4、:struct int number;char name10;char sex;int age;float scroce;char address50;stud1,stud2;3.直接定义结构体类型变量struct 类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;第6页/共57页注意:结构体类型和结构体类型变量是两 个不同的概念,使用时,先定义类 型,后定义变量。在程序中只能对结构体类型变量进 行操作。结构体中的成员可以单独使用,相 当于一个普通变量,成员名可以和程 序中的普通变量同名,互不干扰。结构体中的成员可以是一个结构体变 量。例如:struct dateint

5、 month;int day;int year;struct student1int number;char name10;char sex;struct date birthday;float scroce;char address50;stu1,stu2;第7页/共57页四、结构体类型变量的引用和初始化结构体类型变量一旦被定义后,就可以在程序中使用,与数组相似,在程序中不能直接引用结构体类型变量,也不能对结构体类型变量进行整体输入输出,只能引用其中的各个成员,对其中的各个成员进行输入输出。引用结构体变量成员时,象引用普通变量一样,可以进行各种运算。第8页/共57页引用结构体变量成员的一般形

6、式如下:结构体变量名.成员名例如:前面定义了结构体类型变量stud1和stud2,可以对变量的各个成员进行各种操作,例如:stud1.number=10001;stud2.number=10002;.printf(%d,&d,stud1.number,stud2.number);第9页/共57页另外,在程序中,还可以用指向结构体变量的指针变量来引用结构体变量成员。例如:struct student stud1;struct student*p1=stud1;(*p1).number=10001;.注意:“-”是指向结构体成员运算符,“.”是结构体成员运算符,它们的结合方式从左到右,优先级别最高

7、。上述程序段,还可以写成下面的形式:struct student stud1;struct student*p1=stud1;p1-number=10001;.第10页/共57页#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.number,a.name,a.age,a.score);例8

8、-1 利用结构体变量输出学生信息。第11页/共57页#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 利用结构体变量输出学生信息。第12页/共57页一、结构体数组的定义和引用结构体数组同普通数组一样,所有元素类型相同,是同一个结构体类型。要定义一个结构体类型数组,必须先定义结构体类型,定义结构体类型数组的一般形式如下:struct

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

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+)if(str

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

12、n;i+)printf(Name?n);scanf(%s,studi.name);printf(No?n);scanf(%d,&studi.num);printf(Score1,Score2,Score3?n);scanf(%f,%f,%f,&studi.score0,&studi.score1,&studi.score2);sumi=studi.score0+studi.score1+studi.score2;studi.ave=sumi/3.0;printf(n NAME No.SCORE1 SCORE2 SCORE3 AVEn);printf(-n);for(i=0;i成员名 指向结构体

13、类型变量的指针变量引用注意:“-”是指向结构体成员运算符,“.”是取结构体成员运算符,它们的结合方式从左到右,优先级别最高。在程序中只能将结构体类型变量的地址赋给一个指向结构体类型的指针变量,一个指向结构体类型的指针变量只能指向结构体类型变量,不能指向变量的成员。第21页/共57页例如:struct studentint number;char name10;int age;float score;struct student stud1;.struct student*p1=stud1,*p2=stud1;(*p1).number=10001;(*p2).number=10002;.prin

14、tf(%d,&d,(*p1).number,(*p2).number);printf(%d,&d,p1-number,p2-number);第22页/共57页例 8.8#include stdio.hstruct studentint num;char name20;char sex;float score;main()struct student stu1=1001,Li Ming,M,95.0;struct student*p;p=&stu1;printf(%d,%s,%c,%.1fn,stu1.num,stu1.name,stu1.sex,stu1.score);printf(%d,%s

15、,%c,%.1fn,(*p).num,(*p).name,(*p).sex,(*p).score);printf(%d,%s,%c,%.1fn,p-num,p-name,p-sex,p-score);第23页/共57页在程序中,如果将一个结构体类型数组的地址赋给一个结构体类型的变量,那么该变量就是一个指向结构体类型数组的指针变量。可以利用该指针变量来引用数组元素的各个成员。3、指向结构体类型数组的指针对于指向结构体类型数组的指针变量。其引用的方式和指向普通数组的指针变量的引用相类似。第24页/共57页例 8.9#include stdio.hstruct studentint num;char

16、*name;char sex;float score;boy5=101,Zhou ping,M,45,102,Zhang ping,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);第25页/共57页注意:ps是指向结构体类型数据的指针变量,只能将数组的地址或某个数组元素的地址赋给ps,不能将数组元素的成员或成员的地址赋给

17、ps,否则,程序将会出错。例如:ps=boy;/*正确*/ps=&boy0;/*正确*/ps=boy0.num;/*错误*/ps=&boy0.num;/*错误*/第26页/共57页1、结构体类型数据与函数 结构体类型变量的成员作函数参数 在函数调用时,可以将结构体类型变量各成员的值作函数的实参进行数据传递。其用法和用普通变量作函数实参是一样的,属于“值传递”方式。注意:在调用函数时,应注意实参与形参的类型保持一致。第27页/共57页main()struct student a;.f(a.score);.#include stdio.hstruct studentint num;char nam

18、e20;char sex;float score;void f(float x).例如:第28页/共57页C语言(ANSI C)允许使用结构体变量作实参进行数据传递,将主调函数中结构体变量所占用内存单元的内容全部顺序传递给形参。这是一种“值传递”方式,要求形参也必须是同类型的结构体变量。结构体类型变量作函数参数第29页/共57页例 8.10 有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求分别编写两个不同的函数输出学生的学号、姓名和3门课的成绩及总成绩。#include stdio.h#include string.h#define FORMAT%5d%9s%8.1f%8.1f%

19、8.1fstruct student int num;char name20;float score3;第30页/共57页void pri1(struct student stt)printf(num name score1 score2 score3 sumscoren);printf(FORMAT,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,LiMi

20、ng,67.5,89.0,78.6;pri1(stu);pri2(stu.score);第31页/共57页 指向结构体类型变量的指针作为函数参数在程序中,如果用指向结构体变量的指针作函数的实参,可以将结构体变量的地址传给形参,使实参和形参共同指向同一段存储单元,得到函数的返回值。第32页/共57页例8.11 有一个结构体变量stu,内含学生学号、姓名和3门课的成绩,利用函数编程按升序输出学生的成绩。#include stdio.h#include string.h#define FORMAT%5d%9s%8.1f%8.1f%8.1f#define N 3struct student int n

21、um;char name20;float scoreN;第33页/共57页void pri(struct student*stt)int i,j;float t;for(i=0;iN;i+)for(j=0;jscorejstt-scorej+1)t=stt-scorej;stt-scorej=stt-scorej+1;stt-scorej+1=t;main()struct student stu=1001,LiMing,67.5,89.0,78.6;struct student*p=&stu;pri(p);printf(FORMAT,stu.num,stu.name,stu.score0,st

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

23、f(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);第36页/共57页 指向结构体类型数组的指针作为函数参数在程序中,可以用指向结构体类型数组的指针作函数参数,将该结构体类型数组的地址传给形参。例8.12中程序的main函数可以改写为下面程序

24、代码。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);第37页/共57页函数的返回值可以是某种类型的数据,也可以是指向某种类型数据的指针。C语言允许函数调用时,返回结构体类型指针值。返回值为结构体类型的函数其函数原型如下:struct 结构体类型名*函数名(参数表列);第38页/共57页例 8.14 在一组的学生信息中查找某个学生的

25、信息。如果找到,输出该学生信息,否则输出没有找到。#include stdio.h#define SIZE 100#define N 6#define FORMAT%-11s%3d%8d%8d%8dnstruct student char name30;int num;int score3;/*定义结构体类型*/第39页/共57页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)

26、;scanf(%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);第40页/共57页main()int kk=0;struct student*result;struct student studN=zhangsan,1001,75,80,68,lisi

27、,1002,66,90,82,wangwu,1003,77,86,64,liuli,1005,66,70,72,zhouqi,1006,79,96,74,shunba,1007,76,79,92 ;result=search(stud,&kk);if(kk0)print(result);else printf(Not found!);第41页/共57页一、链表 链表是一种常见的、重要的、特殊的数据结构,是动态进行存储分配的一种结构。在C语言程序中,常用链表来代替结构体数组,节约内存资源。1.链表第42页/共57页在结构体变量中,如果定义最后一个成员为下一个结构体变量的指针时,就形成一种链表关系

28、,&st1st1st10ZhangM18&st2WangF17&st3LiuM17NULLst2head链表中的结构体变量称为“结点”,很明显,链表有一个“头指针”,图中用head表示,还有一个“表尾”,图中用NULL表示。每个结点都包含两个部分:用户所需的数据和下一个结点的地址。链表中的所有元素在内存中不是连续存放的,要找到某一元素,必须先找到上一个元素,根据上一元素提供的地址才能找到下一个元素,如果不知道“头指针”的值,整个链表无法访问。第43页/共57页有关链表的操作,除了建立链表以外,还有删除结点、插入结点和链表的输出操作,其相应操作详见206页215页。第44页/共57页一、共用体的

29、概念 在程序中,为了节省内存资源,经常将几个类型不同的数据存放到同一段内存单元中,要保证这些数据正确存取,只能在某一具体时间段内存放其中的一个数据。这种使几个不同类型的数据共同占用同一段内存的结构,称为“共用体”类型结构。第45页/共57页二、共用体类型的定义 共用体类型的一般形式如下:union 共用体名类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;例如:union datachar name10;int age;float score;注意:一个共用体类型包含若干个成员,每个成员的类型不一样。共用体类型中的所有成员共同占用同一段存储空间,在存储时所占的内存单元字节数等于其中

30、最长的成员所占内存单元字节数。第46页/共57页三、共用体类型变量的定义 共用体类型变量的定义,通常采取以下三种形式:1.先定义共用体类型,再定义共用体类型变量定义形式为:共用体类型名 共用体变量名;例如:union data char name10;int age;float score;union data stt1,stt2;上述定义中,stt1,stt2为union data类型变量,存储时,各占10字节内存单元。第47页/共57页2.在定义共用体类型的同时定义变量定义形式为:union 共用体名类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;例如:union

31、 datachar name10;int age;float score;stt1,stt2;第48页/共57页3.直接定义共用体类型变量定义形式为:union 类型名1 成员名1;类型名2 成员名2;.类型名n 成员名n;变量名表列;例如:union char name10;int age;float score;stt1,stt2第49页/共57页四、共用体类型变量的引用 在C语言程序中只能引用共用体变量的成员,不能直接引用共用体变量。引用共用体变量成员一般形式如下:变量名.成员名例如:stt1.age=18;第50页/共57页注意:共用体是在同一个内存段中存放几种不同类型的成员,但在某一

32、个具体的瞬间,只能存放其中的一个成员,即每一瞬间只有一个成员起作用,不是所有的成员都同时起作用。共用体变量中起作用的成员是最后一次存放的成员,前面存放的成员被后面存放的成员所覆盖。共用体变量的地址与其各成员的地址是同一个地址。即&stt1、&stt1.age、&stt1.score和&stt1.name是同一个值。不能直接对共用体变量赋值,也不能直接引用共用体变.量,更不能对共用体变量进行初始化。共用体变量不能作为函数的参数,函数的返回值不能为 共用体变量。共用体类型可以用于结构体类型定义中,也可以定义共 用体类型数组。结构体类型也可以出现在共用体类型定 义中,另外,数组可以作为共用体的成员。

33、可以使用指向共用体变量的指针变量。第51页/共57页一、用typedef定义数据类型C语言允许用户直接使用系统提供的标准数据类型(如int、char、float、double、1ong等)和用户根据编程需要所声明的构造类型(如结构体类型、共用体类型、指针类型、枚举类型等),还允许用户用typedef声明新的类型名来代替已有的类型名。第52页/共57页定义数据类型的一般形式如下:typedef 已有的类型名 新的类型名;例如:typedef int INTEGER;typedef float REAL;第53页/共57页 定义函数类型例如:typedef float FUN();FUN fx;等

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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com