c语言程序设计6(结构、指针、文件).ppt_第1页
c语言程序设计6(结构、指针、文件).ppt_第2页
c语言程序设计6(结构、指针、文件).ppt_第3页
c语言程序设计6(结构、指针、文件).ppt_第4页
c语言程序设计6(结构、指针、文件).ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 数据的组织结构(二),6.3 文件,6.2 指针类型,6.1 结构体类型,6.4 联合体与枚举类型,6.1 结构体类型,6.1.1 结构体类型的概念,将若干个不同数据类型的变量组合在一起的复合型数据类型,1. 结构体类型的声明,格式:struct 结构体类型名 数据类型 成员1; 数据类型 成员2; . 数据类型n 成员n; ;,组成结构体的每个数据称为该结构体的成员。,例如:用于描述坐标点的结构体类型的声明 struct point_type int x; /*x坐标*/ int y; /*y坐标*/ ;,例如:用于描述日期的结构体类型的声明 struct date_type int

2、 year; /*年*/ int month; /*月*/ int day; /*日*/ ;,结构体名,结构体类型的定义仅仅是定义了一种特定的数据构造类型,它制定了这种构造使用内存的模式。并不引起系统为该结构体分配内存空间。,2 结构体类型变量的定义,先声明结构体类型再定义变量名,结构体类型名 变量名,struct point_type p1, p2;,结构体类型变量的定义会引起系统按照结构体定义时制定的内存模式,为被说明的结构体类型变量分配一定的内存空间。,struct 结构体名 结构体变量名,在声明类型的同时定义变量,例如:struct point_type int x; int y; p

3、1,p2 ;,结构体的成员也可以是另一个结构体的变量(结构体嵌套),struct rectangle_type struct point_type lefttop; /*左上角的坐标*/ struct point_type rightbottom; /*右下角的坐标*/ ;,在C语言中,允许用户为已经存在的数据类型起一个别名,其说明格式为:,格式:typedef 原数据类型 新数据类型名;,用typedef声明新的类型名来代替已有的类型名,typedefint INTEGER; typedeffloatREAL;,指定用INTEGER代表int类型,REAL代表float。 这样,以下两行等价

4、: int i,j; float a,b; INTEGER i,j; REAL a,b;,为结构体类型point_type 起一个别名POINT: typedef struct point_type int x; int y; POINT; 在这里,POINT与struct point_type完全等价,或:typedef struct point_type POINT ;,定义 point_type结构体类型的变量 p1, p2: POINT p1, p2;,3. 结构体变量的初始化,struct 结构体类型名 变量名= 成员值列表 ;,例: struct point_type p = 10

5、, 20;,struct date_type d = 2005, 5, 20;,struct rectangle_type rect = 10, 10, 100, 100 ;,4. 结构体变量的引用,不能把结构体变量作为一个整体参加数据处理,参加各种运算和操作的只能是结构体变量中的各个成员项数据。,结构体成员项的引用方式为: 结构体变量名.成员名,“.” 是成员运算符,访问结构体的成员,例如:p.x , p.y,当出现了结构体的嵌套时,即成员本身是另一个结构体变量时,需用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行操作和运算 如: struct rectangle_t

6、ype rect ; rect.lefttop.x , rect.lefttop.y,5. 结构体型变量的基本操作,结构体型变量的输入,scanf(“%d%d%d”, ,结构体型变量的输出,printf(“%d %d %d”, d.year, d.month, d.day);,结构体型变量的赋值,对每个成员赋值: d.year = 2005;,如果一个结构体型变量已经被赋值,并且希望将它的值赋给另外一个类型完全相同的结构体型变量,则可以采用整体赋值的方式。 例: struct date_type d2; d2=d;,6.1.2 学生基本信息的组织方式,学生基本信息的组织和管理是一个十分有代表性

7、的结构体应用实例。为了简化程序的复杂度,减少程序的书写量,在这里,假设学生的基本信息只包括:学号、姓名、出生日期、所属院系、所学专业。,例1:通过键盘输入30名学生的基本信息,并显示输出。然后,再通过键盘输入一个月份和日期,查找并输出本年度在这个给定日期之后过生日的学生信息。,为了表示一名学生的基本信息,应该声明一个包括学号、姓名、出生日期、所属院系、所学专业的结构体类型。 “出生日期”需要用三个数据项才能够表示完整,而“日期”是一个独立的概念,也应该为之声明一个结构体类型。 组织30名学生的信息。30名学生的基本信息属于同一个性质的数据,因此,应该利用一维数组将它们组织在一起。,问题分析,算

8、法描述,程序代码,#include #define NUM 30 typedef struct /* 日期结构 */ int year; int month; int day; DATE; typedef struct /* 学生信息结构 */ int num; char name24; DATE birthday; char department48; char major32; STUDENTIFNO; void inputInfo(STUDENTIFNO ); void outputInfo(STUDENTIFNO ); void searchInfo(STUDENTIFNO , DAT

9、E);,main( ) STUDENTIFNO sNUM; DATE date; inputInfo(s); outputInfo(s); printf(n Enter a date(month,day); scanf(%d%d, ,/* 输出全部学生的信息 */ void outputInfo(STUDENTIFNO s ) int i; printf(n Num Name Dirthday Department Majorn); for (i=0; iNUM; i+) printf(n%4d%14s %4d/%2d/%2d%16s%16s, si.num, , si.birt

10、hday.year, si.birthday.month, si.birthday.day, si.department, si.major); ,void searchInfo(STUDENTIFNO s , DATE date) int i; for (i=0; i date.month) printf(n%4d%16s %2d/%2d, si.num, , si.birthday.month, si.birthday.day); continue; if (si.birthday.month=date.month ,例2:假设通过键盘输入一个含有10个整数的数列。请编写一个

11、程序,将10个整数按照从小到大的顺序重新排列,要求输出排序后的结果以及每个整数在排序前的位置。,6.1.3 结构体类型应用实例,排序是一种基本且应用广泛的操作。在前面的实例中,我们已经看到过排序操作的实现方法。然而,这个题目不仅要求输出排序之后的结果,还要求输出每个数据在排序前的位置。解决这个问题的一种方法是:将原始位置作为每个数据的属性保留起来,并借助于结构类型DATATYPE将每个数值data及位置pos绑定在一起,形成描述每个数据的整体信息。如果在排序过程中,需要交换两个数据的位置,可以将两个数据对应的结构型变量整体相互交换,以便实现每个数据的原始位置信息永远跟随数值一同移动的目的。 在

12、这个程序中,定义了三个函数inputValue( )、outputValue( )和selectSort( ),分别用于完成输入、输出和查找的操作。,问题分析,#include #define NUM 10 /* 数列中包含的数值个数 */ typedef struct int data; /* 整型数值 */ int pos; /* 原始位置 */ DATATYPE; void inputValue(DATATYPE ); void outputValue(DATATYPE ); void selectSort(DATATYPE ,int); main( ) DATATYPE valueNU

13、M; inputValue(value); selectSort(value, NUM); outputValue(value); ,程序代码,/* 通过键盘输入10个整型数值 */ void inputValue(DATATYPE value ) int i; printf(nEnter %d values:,NUM); for (i=0; iNUM; i+) scanf(%d, ,/* 选择排序(n项) */ void selectSort(DATATYPE value , int n) int i, max = 0; DATATYPE temp; if (n2) return; for

14、(i=1; in; i+)/* 求最大项的下标 */ if (valuemax.data valuei.data)/* 按照数据大小计算 */ max = i; if (max!=n-1 ) /* 整体交换两个结构型变量 */ temp = valuen-1; valuen-1 = valuemax; valuemax = temp;/* 将最大项移到最后 */ selectSort(value, n-1); /* 将前n-1项按照同样方法排序 */ ,例3:编写一个程序,模拟发扑克牌的过程。,问题分析 1、每张扑克牌有两个属性:一个是花色;一个是面值,因此,可以定义一个用于描述一张扑克牌的结

15、构类型。 typedef struct int rank; /* 面值 */ int suit; /* 花色 */ CARD; 其中,rank表示扑克牌的面值,它应该是113之间的整数;suit表示扑克牌的花色,它应该是15之间的整数,用14表示花色,用5表示大小王。,为了增加程序的可读性,可以声明下面这样一组宏定义: #define King 5 /* 王 */ #define Spade 4 /* 黑桃 */ #define Hearts 3 /* 红桃 */ #define Diamonds 2 /* 方块 */ #define Club 1 /* 梅花 */ 2、一副扑克牌有54张扑克

16、,它们属于相同的性质,因此可以采用一维数组类型将54张牌的信息组织起来。,算法描述,#include #include #define King 5 /* 王 */ #define Spade 4 /* 黑桃 */ #define Hearts 3 /* 红桃 */ #define Diamonds 2 /* 方块 */ #define Club 1 /* 梅花 */ #define NUM 54 typedef struct int rank; /* 面值 */ int suit; /* 花色 */ CARD; void create(CARD card ); /* 构造扑克牌 */ voi

17、d riffle(CARD card ); /* 洗牌 */ void deal(CARD card ); /* 发牌 */ main( ) CARD cardNUM; create(card); riffle(card); deal(card); ,程序代码,void create(CARD card ) /* 构造扑克牌 */ int i; for (i=0; iNUM; i+) cardi.rank = i%13+1; /* 产生扑克牌的面值 */ cardi.suit = i/13+1; /* 产生扑克牌的花色 */ void riffle(CARD card ) /* 洗牌 */ i

18、nt i, rand1, rand2; CARD temp; for (i=0; i1000; i+) /* 重复1000次 */ rand1 = random(NUM); /* 产生两个随机数 */ rand2 = random(NUM); if (rand1!=rand2) /* 交换两个位置的扑克牌信息 */ temp = cardrand1; cardrand1 = cardrand2; cardrand2 = temp; ,/* 发牌 */ void deal(CARD card ) int i, count; for (i=0; i4; i+) /* 循环4次 */ printf(nn%drd man:n, i+1); for (count=0; countNUM; count+=4) /* 显示花色 */ switch

温馨提示

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

评论

0/150

提交评论