制作程世杰哈理工计算中心.ppt

上传人:小飞机 文档编号:4849182 上传时间:2023-05-19 格式:PPT 页数:51 大小:944.50KB
返回 下载 相关 举报
制作程世杰哈理工计算中心.ppt_第1页
第1页 / 共51页
制作程世杰哈理工计算中心.ppt_第2页
第2页 / 共51页
制作程世杰哈理工计算中心.ppt_第3页
第3页 / 共51页
制作程世杰哈理工计算中心.ppt_第4页
第4页 / 共51页
制作程世杰哈理工计算中心.ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《制作程世杰哈理工计算中心.ppt》由会员分享,可在线阅读,更多相关《制作程世杰哈理工计算中心.ppt(51页珍藏版)》请在三一办公上搜索。

1、,制作:程世杰哈理工 计算中心,结 构 体,共 用 体,枚举类型,C,结构体的定义及引用结构体数组结构体与指针用指针处理链表共用体的概念枚举类型用typedef定义类型,重 点,结构体,难 点,结构体类型链 表,结 构 体,如一个学生的信息:学号、姓名、性别、年龄、成绩、地址等,int num;,char name20;,char sex;,int age;,float score;,char addr30;,语言提供了这种数据结构:允许用户将不同类型的数据组合成一个有机的整体,这些数据互相联系;这种数据结构称为结构体(structure)。,一.定义一个结构体类型:,struct 结构体类型

2、标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;,;,成员表列,struct student int num;char name20;char sex;int age;float score;char addr30;,;,每个成员也叫结构体中的一个域,定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。,struct date/*日期结构类型:由年、月、日三项组成*/int year;int month;int day;,struct date int year,month,day;;,struct score/*成绩结构类型:共4项组成*/char no7;

3、int score1;int score2;int score3;,定义一个结构体m,含三个不同类型的成员,struct m int x;float y;char z;,;,二.定义结构体变量,struct student int num;char name20;float score;;,struct student y;,struct 结构体类型标识符变量名列表;,int x;,结构体变量定义的三种方法,、先定义结构体类型再定义变量名,struct student int num;char name20;float score;;,struct student stu1,stu2;,结构体

4、类型名,结构体变量名,stu1,stu2,在定义了结构体变量后,系统会为之分配内存单元。,sizeof(stu1)=,2+,20+,4,=26,、在定义结构体类型的同时定义变量,struct 结构体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名列表;,struct student int num;char name20;float score;stu1,stu2;,、直接定义结构体类型变量,struct 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名列表;,(可省略结构体类型名),struct int num;char name2

5、0;float score;stu1,stu2;,三.结构体变量的引用,结构体变量名.成员名,“.”成员运算符,在所有的运算符中优先级最高。,struct student int num;char name20;float score;stu1,stu2;,stu1.num=10001;,stu1.score=95.5;,stu1.name,=Li Ming;,strcpy(stu1.name,Li Ming);,struct m int x;float y;char z;t;,t.x=12;,t.y=12.5;,t.z=f;,printf(“%d,%f,%c”,t.x,t.y,t.z);,2

6、、不能将一个结构体变量作为一个整体进行输入输出;,printf(%d%s%f,stu1);,scanf(%d%s%f,只能对结构体中的各个成员分别进行输入输出,printf(%d%s%f,stu1.num,stu1.name,stu1.score);,scanf(%d,gets(stu1.name);,1、区分类型与变量:,a、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;,b、在编译时,对类型不分配内存空间,只对变量分配空间。,说 明:,3、只有在对结构体变量赋值或作为函数参数时才可以对一个结构体变量进行整体操作;(赋值时要求具有相同结构),stu2=stu1;,stu2.n

7、um=stu1.num;strcpy(stu2.name,stu1.name);stu2.score=stu1.score;,void fun(struct student px),fun(stu1);,4、对成员变量可以像普通变量一样进行各种运算,sum=stu1.score+stu2.score;,stu1.age+;,结构体变量,struct std_info char no7;char name9;char sex;struct date birthday;stu1;,结构体类型的嵌套定义,5、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员。只能

8、对最低一级的成员进行赋值、存取或运算;,stu1.birthday.year=2002;,struct date int year;int month;int day;,struct date int year;int month;int day;,struct studentint num;char name20;char sex;struct date birthday;char addr30;,sizeof(struct student)=?,59,6 成员也可以是指向本结构体类型的指针变量,struct stu_info int num;char name20;float score;

9、struct stu_info*next;,sizeof(struct stu_info)=?,28,7、在定义结构体变量的同时,可以进行初始化。,struct student int num;char name20;char sex;char addr30;stu=15001,“Wang,M,123 Road harbin;,struct student int num;char name20;char sex;char addr30;stu;,stu.num=15001;strcpy(stu.name,”Wang”);sex=M;strcpy(stu.addr,”123 road Ha”)

10、;,struct date int month;int day;int year;struct date tt;,B.#define DATE struct date DATE int month;int day;int year;tt;,C.struct int month;int day;int year;tt;,D.struct date int month;int day;int year;tt;,结构体的定义,哪个不正确?,struct m int x;int y;float z;char p;test;,struct menu char a;int b;long c;float d

11、;mu=k,12,906,2.5;,mu.b,mu.a,mu.d,9,struct m fac;,1,2,结构体数组,数组的每个元素都是结构体类型的数据,它们分别包含各个成员项。,1、先定义结构体类型,再定义结构体数组,struct student int num;float score;,struct student stu30;,2、定义结构体类型的同时定义结构体数组,struct student int num;float score;stu30;,3、直接定义结构体数组,struct int num;float score;stu30;,形式一:struct student int n

12、um;char name20;char sex;int age;struct student stu2;,形式二:struct student int num;char name20;char sex;int age;stu2;,结构体数组的初始化,一般形式:,struct 结构体类型标识符类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;结构体数组=数组元素0的各个初值,数组元素1的各个初值,;,例:,struct student int num;char name20;float score;stu3=10101,Li Ming,88,10102,Zhang Jin,92,

13、10103,Wang Lin,98.5;,说明:,1、初始化时,数组元素的个数可以不指定,系统会根据初值的结构体常量的个数来确定数组元素的个数;,struct student int num;char name20;float score;stu=10101,Li Ming,88,10102,Zhang Jin,92,10103,Wang Lin,98.5;,2、数组中各个元素的初值用大括号、括起来,同一数组元素的各个成员变量的初值用逗号分隔。,或:,struct student stu=10101,Li Ming,88,10102,Zhang Jin,92,10103,Wang Lin,98

14、.5;,结构体数组应用举例,若有如下定义:,struct aa long num;char name20;,struct bb int age;struct aa first;stu2;,要给stu1输入18、990001、“wang zhi gang,写出所用到的语句;,、要把w、z、g变成大写,如何实现?,、如何将stu1中的名字复制到stu0中的相应位置上?,stu1.age=18;,stu1.first.num=990001;,strcpy(stu1.first.name,“wang zhi gang”);,stu1.first.name0-=32;,stu1.first.name5-

15、=32;,stu1.first.name9-=32;,strcpy(stu0.first.name,stu1.first.name);,#include“stdio.h”struct cmplx int x;int y;cnum2=1,3,2,7;main()printf(“%dn”,cnum0.y*cnum1.x);,cnum0.x=1cnum0.y=3,cnum1.x=2cnum1.y=7,6,结构体与指针,结构体变量的指针就是该变量所占据的内存段的起始地址。,指向结构体变量的指针变量,1、指向结构体变量指针的定义:,struct student int num;char name20;f

16、loat score;,struct student stu,*p;,p=,p中存放着结构体变量stu在内存中的首地址,注意:不能用指向结构体变量的指针指向该结构体变量的某个成员。,p=,int*ip;ip=,、stu.num、stu.name、stu.score,、(*p).num、(*p).name、(*p).score,、p-num、p-name、p-score,2、访问结构体成员变量的三种方法:,3、说明:,、“-”为指向运算符,是优先级最高的运算符;,、成员运算符“.”的优先级高于指针运算符“*”,因此采用“(*p).成员名”形式时,括号不能省略;,、注意以下几种运算:,p-num,

17、得到p指向的结构体变量中的成员num的值,p-num+,得到p指向的结构体变量中的成员num的值,用完后该值加1,+p-num,使p指向的结构体变量中的成员num的值加1,#includemain()struct student long num;char name20;char sex;float score;struct student stu_1;struct student*p;p=,printf(“%ld,%sn”,p-num,p-name);,printf(“%ld,%sn”,(*p).num,(*p).name);,printf(“%c,%.2fn”,p-sex,p-score)

18、;,printf(“%c,%.2fn”,(*p).sex,(*p).score);,指向结构体数组的指针,指向结构体变量的指针变量,可以指向结构体变量,也可以指向同类型的结构体数组的元素。,struct student int num;char name30;float score;stu30,*p;,p=stu;,p=,p=,p只能指向一个struct student类型的数据(某个元素的的起始地址),不能指向一个成员变量。,注意,、若p的初值为stu,p+1后指向下一元素的起始地址;,(+p)-num,先使p自加1,然后得到它指向元素的num成员值,+p-num,使p指向的结构体变量中的成

19、员num的值加1,(p+)-num,先得到p-num的值,然后使p自加1,指向stu1,p-nunm+,使p指向的结构体变量中的成员num的值加1,、若p已定义为指向结构体类型的数据,则p只能指向相应类型的变量或数组元素,不能指向数组元素中的某一成员;,#includestruct s int x,*y;*p;int d5=10,20,30,40,50;struct s array5=100,d0,d1,d2,d3,d4,array0,array1,array2,array3,array4,printf(“%dn”,(+p)-x);,printf(“%dn”,p-x+);,printf(“%d

20、n”,+p-x);,printf(“%dn”,*(*p).y);,printf(“%dn”,*p-y);,printf(“%dn”,+(*p-y);,printf(“%dn”,+*p-y);,printf(“%dn”,*+p-y);,100,100,10,10,101,200,200,21,22,30,main()p=array;printf(“%dn”,p-x);printf(“%dn”,(*p).x);,程序中固定不变。语言中不允许定义,动态存储分配,为有效地利用内存资源提供了手段。,数组的长度是预先定义好的,在整个,动态数组。,实际的编程中,往往会发生这种情况,,即所需的内存空间取决于实

21、际输入的数,据,而无法预先确定。对于这种问题,用,数组的办法很难解决。为了解决上述问题,,语言提供了一些内存管理函数,这些,内存管理函数可以按需要动态地分配内存,空间,也可把不再使用的空间回收待用,,常用的内存管理函数,调用形式:(类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为size字节的连续区域。函数的返回值为该区域的首地址。,pc=(char*)malloc(100);,分配内存空间函数 calloc,调用形式:(类型说明符*)calloc(n,size),分配内存空间函数 malloc,功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函

22、数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。,ps=(struct stu*)calloc(2,sizeof(struct stu);,释放内存空间函数free,调用形式:free(void*ptr);,free(pc);,分配一块区域,输入一个学生数据main()struct stu int num;char*name;char sex;float score;*ps;ps=(struct stu*)malloc(sizeof(struct stu);ps-num=102;ps-name=“Xiao xiao;ps-sex=M;ps-score=62.5;printf(Nu

23、mber=%dnName=%sn,ps-num,ps-name);printf(Sex=%cnScore=%fn,ps-sex,ps-score);free(ps);,申请内存空间,使用内存空间,释放内存空间,sizeof(struct stu)=?,Number=102Name=xiaoxiaoSex=MScore=62.5,链表的概念,问题的引出,链式结构,关键词:数组、n个元素、连续内存空间,数据结构中一种标记,相邻结点间连接方式,链表,具有表头和表尾的链接结构,1110,head,1110,1460,1200,1680,表头,表尾,例如,一个存放学生学号和成绩的结点为以下结构:stru

24、ct stu int num;int score;struct stu*next;,前两个成员项组成数据域,后一个成员项next构成指针域,它是一个指向stu类型结构的指针变量。,链表的基本操作:1.建立链表;2.结构的查找与输出;3.插入一个结点;4.删除一个结点;,head,p1,p2,head,p1,p2,p1,p2,head,p1,p2,head,#define NULL 0#define LEN sizeof(struct student)struct student long num;int score;struct student*next;int n;,建立一个单向动态链表,s

25、truct student*creat(void)struct student*head;struct student*p1,*p2;n=0;head=NULL;p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%d”,程序演示,共用体的概念,有时候需要将几种不同类型的变量存放到同一段内存单元中。,可以把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。即使几个不同的变量共占同一段内存空间。,所谓“共用体(union)”是指使几个不同的变量共占同一段内存的数据类型。,共用体的定义,1、先定义共用体类型标识符,再定义变量,unio

26、n 共用体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;,union 共用体类型标识符 变量名表;,union data int i;char ch;float f;,union data a,b,c;,2、直接定义共用体变量,union 共用体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名表;,union data int i;char ch;float f;a,b,c;,union int i;char ch;float f;a,b,c;,3、共用体与结构体的定义形式相似,但含义不同:,结构体变量所占的内存长度等于各成员

27、所占的内存长度之和。(每个成员分别占有自己的内存),共用体变量所占的内存长度等于最长的成员的长度。(每个成员分别占有自己的内存),sizeof(union data)=,4,共用体变量的引用,1、引用形式为:,共用体变量名.成员名,union data int i;char ch;float f;a,b,c;,a.i,引用共用体变量a中的整型变量i,a.ch,引用共用体变量a中的字符变量ch,a.f,引用共用体变量a中的实型变量f,2、注意:不能直接引用共用体变量,而只能引用共用体变量的成员,printf(%d,a);,printf(%d,a.i);,printf(%d,a.ch);,3、共用

28、体类型数据的特点:,、同一内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种;,也就是说,每一瞬时只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。,、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用;,a.i=1;,a.ch=a;,a.f=1.5;,、共用体变量的地址和它的各成员的地址是同一地址;,&a,&a.i,&a.ch,&a.f都是同一地址,、不能对共用体变量名赋值;也不能企图引用变量名来得到成员的值;不能在定义共用体变量时进行初始化;,union int i;char ch;float f;a=

29、1,a,1.5;,a=1;,m=a;,、不能把共用体变量作为函数参数,也不能让函数带回共用体变量,但可以使用指向共用体变量的指针;,、共用体作为一种数据类型,可以在定义其它数据类型中使用。可以将结构体变量的某一成员定义为共用体类型,也可以定义共用体数组。,例:设有若干人员的数据,其中有学生和教师。学生的数据包括:姓名、学号、性别、职业、班级。教师的数据包括:姓名、教师号、性别、职业、职务。现要求把它们放在同一表格中。,int num;,char name20;,char sex;,char job;,union int class;char position10;category;,struc

30、t person int num;char name20;char sex;char job;union int class;char position10;category;per30;,scanf(%c,if(peri.job=s)scanf(%d,#include#includestruct un int i;char name20;float score;,main()struct un u;u.i=12;strcpy(u.name,“ZZ”);u.score=89.5 printf(“%d,%s,%fn”,u.i,u.name,u.score);,union,union,12,ZZ,

31、89.500000,0,89.500000,枚举类型,枚举类型的定义,所谓“枚举”是指将变量的所有取值一一列举出来,变量的值只限于列举出来的值的范围内。,枚举类型变量的定义:,1、先定义枚举类型标识符,再定义变量,enum 枚举类型标识符枚举元素1,枚举元素2,枚举元素n;,enum 枚举类型标识符 变量列表;,enum personMan,Woman;,enum person x;,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;,enum weekday workday,weekend;,2、直接定义枚举变量,enum 枚举类型标识符枚举元素1,枚举元素2,

32、枚举元素n变量列表;,enum personMan,Womanx;,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat workday,weekend;,enum BOOLFALSE,TRUE;,3、说明:,Sun、Mon、Sat等称为枚举元素或枚举常量,它们是用户自定义标识符。这些标识符并不自动的代表什么含义,用什么标识符代表什么含义,完全由程序员决定,并在程序中作相应的处理。,枚举变量的引用,1、在编译时,对枚举元素按常量处理,故称枚举常量。它们不是常量,不能对它们赋值。,Sun=0;,TRUE=1;,2、枚举元素作为常量,它们是有值的。语言编译时按定义时的顺序

33、使它们的值为0、1、2、,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Satworkday;,workday=Mon;,printf(%d,workday);,3、可以在定义时改变枚举元素的值,enum weekdaySun=7,Mon=1,Tue,Wed,Thu,Fri,Satworkday;,enum weekdaySun=7,Mon,Tue,Wed=0,Thu,Fri,Sat;,4、枚举值可以用来做判断比较,if(workday=Mon),if(workdaySun),5、一个整数不能直接赋给一个枚举变量,workday=2;,workday=(enum we

34、ekday)2;,workday=(enum weekday)(x-y);,例:从键盘输入06的任意整数,0表示星期日,16分别表示星期一到星期六,要求编写程序输出对应的英文名称。,enum weekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturdayweek;,scanf(%d,switch(i)case 0:week=Sunday;break;case 1:week=Monday;break;case 2:week=Tuesday;break;case 3:week=Wednesday;break;case 4:week=T

35、hursday;break;case 5:week=Friday;break;case 6:week=Saturday;break;,switch(week)case Sunday:break;case Monday:break;case Tuesday:break;case Wednesday:break;case Thursday:break;case Friday:break;case Saturday:break;,类型标识符的自定义,1、除了可以直接使用提供的标准类型名(int、char、float等)和自己定义的数据类型(结构体、共用体、指针、枚举类型)外,还可以用typedef声

36、明新的类型名来代替已有的类型名。,typedef int INTEGER,int i,*p;,INTEGER i,*p;,typedef float REAL,float x,y;,REAL x,y;,2、定义类型标识符的方法:,、按定义变量的方式写出定义体:,float x;,、将变量名换成新的类型标识符:,REAL x;,、在最前面加typedef:,typedef REAL x;,3、例:,、定义含有10 个元素的整型数组:,、先按照定义数组的形式书写:int a10;,、将变量名a换成自己指定的类型名:int ARRAY10;,、在前面加上typedef:typedef int ARR

37、AY10;,int a10,b10;,ARRAY a,b;,、定义字符指针类型:,、char*p;,、char*STRING;,、typedef char*STRING;,STRING p,ps10;,、声明结构体类型:,struct int num;char name20;float score;stu;,struct int num;char name20;float score;STUDENT;,typedef struct int num;char name20;float score;STUDENT;,STUDENT stu30,*p;,4、说明:,、自定义类型标识符可以是任意合法的

38、标识符,习惯上常把用typedef定义的标识符用大写字母表示,以便与系统提供的标准类型标识符相区别;,、用typedef只能为已经存在的数据类型标识符另起一个新名,而不能创造一种新的数据类型;,typedef int ARRAY10;,、typedef与#define有相似之处:,typedef int INTEGER,#define INTEGER int,作用都是用INTEGER代表int。,#define是在编译之前进行处理的,只做简单的字符替换。,typedef是在编译时处理的,实际上并不是做简单的字符替换。,如:typedef int ARRAY10,并不是用“ARRAY10”去代替

39、int,而是采用如同定义变量的方法那样来声明一个类型。,、当不同的文件中涌到同一类型数据时(结构体、共用体等),常用typedef声明一些数据类型,把它们单独放在一个文件中,需要用时用#include命令把它们包含进来;,、使用typedef有利于程序的通用和移植;,typedef int INTEGER,typedef long INTEGER,1、编写函数ReadInfo读入10名职工的编号(整型)、姓名(字符串)、联系电话(字符串)放在结构体数组work中;编写函数WriteInfo输出这10名职工的记录;在主函数中分别调用上述两个函数,实现程序的功能。,本章作业,2、设李红、王建、赵明三名同学某学年考了8门课,要求分别统计出这3名同学该学年的总成绩,并按8门课总成绩的高低排序输出。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号