制作程世杰哈理工计算中心.ppt_第1页
制作程世杰哈理工计算中心.ppt_第2页
制作程世杰哈理工计算中心.ppt_第3页
制作程世杰哈理工计算中心.ppt_第4页
制作程世杰哈理工计算中心.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

,制作:程世杰 哈理工 计算中心,结 构 体,共 用 体,枚举类型,C,结构体的定义及引用 结构体数组 结构体与指针 用指针处理链表 共用体的概念 枚举类型 用typedef定义类型,重 点,结构体,难 点,结构体类型 链 表,结 构 体,如一个学生的信息:学号、姓名、性别、年龄、成绩、地址等,int num;,char name20;,char sex;,int age;,float score;,char addr30;,语言提供了这种数据结构:允许用户将不同类型的数据组合成一个有机的整体,这些数据互相联系;这种数据结构称为结构体(structure)。,一. 定义一个结构体类型:,struct 结构体类型标识符 类型标识符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; 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;,结构体类型名,结构体变量名,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 name20; float score; stu1, stu2;,三. 结构体变量的引用,结构体变量名.成员名,“.” 成员运算符,在所有的运算符中优先级最高。,struct student int num; char name20; float score; stu1, stu2;,stu1.num=10001;,stu1.score=95.5;,,=“Li Ming“;,strcpy(, “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、不能将一个结构体变量作为一个整体进行输入输出;,printf(“%d%s%f“, stu1);,scanf(“%d%s%f“, ,只能对结构体中的各个成员分别进行输入输出,printf(“%d%s%f“, stu1.num, , stu1.score);,scanf(“%d“, ,gets();,1、区分类型与变量:,a、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;,b、在编译时,对类型不分配内存空间,只对变量分配空间。,说 明:,3、只有在对结构体变量赋值或作为函数参数时才可以对一个结构体变量进行整体操作;(赋值时要求具有相同结构),stu2=stu1;,stu2.num=stu1.num; strcpy(, ); 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、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员。只能对最低一级的成员进行赋值、存取或运算;,stu1.birthday.year=2002;,struct date int year; int month; int day; ;,struct date int year; int month; int day; ;,struct student int num; char name20; char sex; struct date birthday; char addr30; ;,sizeof(struct student)=?,59,6 成员也可以是指向本结构体类型的指针变量,struct stu_info int num; char name20; float score; 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(,”Wang”); sex=M; strcpy(stu.addr,”123 road Ha”);,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; 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 num; 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, 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.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(, “wang zhi gang”);,0-=32;,5-=32;,9-=32;,strcpy(,);,#include “stdio.h” struct cmplx int x; int y; cnum2=1,3,2,7; main( ) printf(“%dn”,cnum0.y*cnum1.x); ,cnum0.x=1 cnum0.y=3,cnum1.x=2 cnum1.y=7,6,结构体与指针,结构体变量的指针就是该变量所占据的内存段的起始地址。,指向结构体变量的指针变量,1、指向结构体变量指针的定义:,struct student int num; char name20; float score; ;,struct student stu, *p;,p=,p中存放着结构体变量stu在内存中的首地址,注意:不能用指向结构体变量的指针指向该结构体变量的某个成员。,p=,int *ip; ip=,、stu.num、、stu.score,、(*p).num、(*p).name、(*p).score,、p-num、p-name、p-score,2、访问结构体成员变量的三种方法:,3、说明:,、“- ”为指向运算符,是优先级最高的运算符;,、成员运算符“.”的优先级高于指针运算符“*”,因此采用 “(*p).成员名” 形式时,括号不能省略;,、注意以下几种运算:,p-num,得到p指向的结构体变量中的成员num的值,p-num+,得到p指向的结构体变量中的成员num的值,用完后该值加1,+p-num,使p指向的结构体变量中的成员num的值加1,#include main() 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);,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指向的结构体变量中的成员num的值加1,(p+)-num,先得到p-num的值,然后使p自加1,指向stu1,p-nunm+,使p指向的结构体变量中的成员num的值加1,、若p已定义为指向结构体类型的数据,则p只能指向相应类型的变量或数组元素,不能指向数组元素中的某一成员;,#include struct 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(“%dn”,+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);,程序中固定不变。语言中不允许定义,动态存储分配,为有效地利用内存资源提供了手段。,数组的长度是预先定义好的,在整个,动态数组。,实际的编程中,往往会发生这种情况,,即所需的内存空间取决于实际输入的数,据,而无法预先确定。对于这种问题,用,数组的办法很难解决。为了解决上述问题,,语言提供了一些内存管理函数,这些,内存管理函数可以按需要动态地分配内存,空间,也可把不再使用的空间回收待用,,常用的内存管理函数,调用形式: (类型说明符*) malloc(size) 功能:在内存的动态存储区中分配一块长度为“size“字节的连续区域。函数的返回值为该区域的首地址。,pc=(char *)malloc(100);,分配内存空间函数 calloc,调用形式: (类型说明符*)calloc(n,size),分配内存空间函数 malloc,功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。 (类型说明符*)用于强制类型转换。,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(“Number=%dnName=%sn“,ps-num,ps-name); printf(“Sex=%cnScore=%fn“,ps-sex,ps-score); free(ps); ,申请内存空间,使用内存空间,释放内存空间,sizeof(struct stu)=?,Number=102 Name=xiaoxiao Sex=M Score=62.5,链表的概念,问题的引出,链式结构,关键词:数组、n个元素、连续内存空间,数据结构中一种标记,相邻结点间连接方式,链表,具有表头和表尾的链接结构,1110,head,1110,1460,1200,1680,表头,表尾,例如,一个存放学生学号和成绩的结点为以下结构: struct 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;,建立一个单向动态链表,struct 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、先定义共用体类型标识符,再定义变量,union 共用体类型标识符 类型标识符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、共用体与结构体的定义形式相似,但含义不同:,结构体变量所占的内存长度等于各成员所占的内存长度之和。(每个成员分别占有自己的内存),共用体变量所占的内存长度等于最长的成员的长度。(每个成员分别占有自己的内存),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、共用体类型数据的特点:,、同一内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种;,也就是说,每一瞬时只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。,、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用;,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=1, a, 1.5;,a=1;,m=a;,、不能把共用体变量作为函数参数,也不能让函数带回共用体变量,但可以使用指向共用体变量的指针;,、共用体作为一种数据类型,可以在定义其它数据类型中使用。可以将结构体变量的某一成员定义为共用体类型,也可以定义共用体数组。,例:设有若干人员的数据,其中有学生和教师。学生的数据包括:姓名、学号、性别、职业、班级。教师的数据包括:姓名、教师号、性别、职业、职务。现要求把它们放在同一表格中。,int num;,char name20;,char sex;,char job;,union int class; char position10; category;,struct 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 #include struct un int i; char name20; float score; ,main() struct un u; u.i=12; strcpy(, “ZZ”); u.score=89.5 printf( “%d,%s,%fn”, u.i,,u.score); ,union,union,12,ZZ,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, , 枚举元素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、枚举元素作为常量,它们是有值的。语言编译时按定义时的顺序使它们的值为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 weekday)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=Thursday; 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声明新的类型名来代替已有的类型名。,typedef int INTEGER,i

温馨提示

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

最新文档

评论

0/150

提交评论