305-ArrayStructure(数组和结构) .ppt

上传人:韩长文 文档编号:5034087 上传时间:2020-01-29 格式:PPT 页数:37 大小:493KB
返回 下载 相关 举报
305-ArrayStructure(数组和结构) .ppt_第1页
第1页 / 共37页
305-ArrayStructure(数组和结构) .ppt_第2页
第2页 / 共37页
305-ArrayStructure(数组和结构) .ppt_第3页
第3页 / 共37页
305-ArrayStructure(数组和结构) .ppt_第4页
第4页 / 共37页
305-ArrayStructure(数组和结构) .ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《305-ArrayStructure(数组和结构) .ppt》由会员分享,可在线阅读,更多相关《305-ArrayStructure(数组和结构) .ppt(37页珍藏版)》请在三一文库上搜索。

1、Array & Structure (数组和结构),http:/ Hongfei Yan School of EECS, Peking University 10/22/2008,2,Outline,掌握数组的概念与用法 掌握结构的概念与用法,3,重谈变量,在源程序中,变量是用于存取数据的标识符,具有不同的类型,如:int num;float x,y;double r; 在程序执行过程中,变量是相应存储单元(或一组存储单元)的名字 变量的类型决定 变量占用的存储单元数量 存储单元中二进制数据如何构成变量的值(变量的内容) 变量定义就是建立变量名和存储单元之间的对应关系 变量使用 在等号左边,给

2、变量赋值(存储数据到存储单元) 在“&”表达式中,求得变量的地址(存储单元的地址) 在其他地方,取变量值参与运算(读取存储单元中的数据),4,变量与内存,int main() int m; int n; double dbl; m = 123; n = 321; dbl = m * n; ,5,数组的定义和使用,当我们需要处理100个人甚至更多人的年龄时,在程序中该如何来表示这100个甚至更多的数据? 定义100个变量吗?int x1, x2, x3, , x100; 要是1000个人,10000个人呢?,6,1.数组的定义和使用,什么是数组 如何声明数组 如何给数组赋值 如何遍历与访问数组中

3、的内容 数组的用途 多维数组,7,1.1 什么是数组,数组是一种复合数据类型 数组从整体上定义了一组类型相同的变量 数组中的每个元素都可作为变量使用 数组元素的类型是相同的 数组的元素顺序地存储在连续的内存空间中 当要处理很多类型相同的数据时, 可利用数组以避免在程序中定义大量的变量,8,1.2 数组的声明,数组声明方法如下: 数据类型 变量名数组元素个数= 数组元素初值; 其中“= 数组元素初值”部分可以省略 一些数组声明的例子: int score5; char cards4 = a, 0, r, W; float point2 = 2.56, 23.43; double distance

4、s4 ;,9,数组在内存中的布局,int score5;,char cards4;,10,数组在内存中的布局,float point2;,double distances4 ;,11,数组元素,声明一个数组变量相当于声明一组变量,这组变量中的每一个都可以通过“数组变量名下标”形式来访问。例如:score0, score1, score2 等等。 这组变量在内存中是连续存放的,它们的下标从0开始计数。 在数组中(设N是数组的元素总数) 第一个数组元素的下标是0 最后一个数组元素的下标是N-1,12,1.3 数组元素的赋值与访问,每个数组元素,就是一个变量。 每个数组元素占用的空间大小是由定义数组

5、变量时给定的类型决定的 cards每个元素占1字节(char类型的长度) distance每个元素占8字节(double 类型的长度)。 数组元素的赋值可以在定义时给定初始值,也可以在程序中给数组元素赋值 在给数组元素赋值时,可以把数组元素看作单个变量,例如: score0 = 67; score3 = 89; distance2 = 356.24; cards0 = b; 给数组元素赋值,数据类型必须匹配。 数组元素可以用在任何单个变量可能出现的地方。例如: int score1, scoreN; score1 = score0; scoreN= score3;,13,1.4 数组的遍历,可

6、以用一个循环语句给数组的所有元素赋值,或顺序访问它的每个元素。 int student100; int odd=0, even=0; for (int i=0; i studenti; for (int i=0; i100;i+) studenti = i+1; if (studenti % 2) = 0) even+; else odd+; ,14,1.5 数组的用途,当程序要处理一组类型相同、含义类似的数据时应该使用数组. 例如: 过年了,村里要庆祝一下。村长对村里的128个村民说:做一个游戏,让每个人把出生年+月+日得到一个数。如:1968年10月28日= 1968 + 10 + 28

7、= 2006。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元。如果有人报上来的数字与M相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。现在让我们来写一段程序算算都有哪些人得到了奖金?得到多少?,15,问题求解,声明一个数组存放所有村民上报的数据 声明一个数组存放获奖者的编号(幸运者数组) 声明一个整数存放获奖者人数 村民顺序报上数字,其相应的编号就是存放其数据的数组元素下标:0,1,2, 报上数字与幸运数相等,则 记录编号到幸运者数组中 获奖者人数加1 最后,打印出获奖者编号和获得的奖金数额,16,#include usin

8、g namespace std; const int LUCKY_M = 2006; /幸运数字 const int POPULATION = 128; /村民人数 int main( ) int peoplePOPULATION; /记录所有村民上报的年、月、日相加之和 int luckyPeoplePOPULATION;/幸运者数组,记录获奖者编号 int nLucky=0; /获奖者人数 for (int i=0; i peoplei; /读入村民报的数字,数组下标就是村民的编号 for (int i=0; iPOPULATION; i+) if (peoplei = LUCKY_M)

9、luckyPeoplenLucky = i; /假设村民从0开始编号 nLucky+; for (int i=0; inLucky; i+) /输出获奖者编号及所获奖金数额 cout luckyPeoplei “ “ LUCKY_M / nLucky endl; ,17,数组使用中的注意事项,数组必须初始化(或赋值)后方可使用 在C+中可用type aryN = 0形式给ary赋初值0 数组元素下标范围从0到N-1,避免访问越界 整个数组占用字节数可用“sizeof(数组变量)”获得 声明数组时尽量用常量指明数组长度 数组长度与数组占用字节数是两个不同的概念 数组长度是数组中包含的元素的个数

10、数组占用字节数是数组在内存中占用的存储单元数,18,1.6 多维数组,二维数组的声明:数组的数组 类型 变量名数组行数数组列数=初值列表,初值列表 二维数组的例子: intmatrix1010 = 0; intn2323 = 1,2,3,2,4,6; double scoresSTUDENT_NUMCOURSE_NUM; 其他多维数组可以此类推,19,多维数组在内存中的布局,20,多维数组应用举例1,计算全年级180名学生每个学生8门课的平均成绩和每门课全年级平均成绩 求解过程 定义一个1808的二维数组记录各门课成绩 录入每个人各门课成绩 计算每名学生的平均成绩并打印出来 计算每门课程的平均

11、成绩并打印出来,21,求学生的平均分,求课程平均分,22,#include #include using namespace std; const int STUDENT_NUM = 180; /学生人数 const int COURSE_NUM = 8; /课程门数 int main( ) float scoresSTUDENT_NUMCOURSE_NUM; /原始成绩 for (int i=0; i scoresij; /读入每门课成绩 for (int i=0; iSTUDENT_NUM; i+) /计算学生平均成绩 float sum = 0; /总成绩 for (int j=0; j

12、COURSE_NUM; j+) sum+= scoresij; cout “Student“ i “: “ fixed setprecision(3) sum/COURSE_NUM endl; for (int j=0; jCOURSE_NUM; j+) /计算课程平均成绩 float sum = 0; /总成绩 for (int i=0; iSTUDENT_NUM; i+) sum += scoresij; cout “Course“ j “ : “ fixed setprecision(3) sum/STUDENT_NUM endl; ,23,多维数组应用举例,课后思考题:(POJ 271

13、3) 在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用0表示。其它肿瘤内和肿瘤外的点都用255 表示。现在要求你编写一个程序,计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点)。已知肿瘤的边缘平行于图像的边缘。,24,2. 结构的定义和使用,通常,我们需要将多个不同类型、但相互之间有着内在联系的数据组合成一个有机的整体,对这个整体进行各种操作。比如, 一个学生的学号、姓名、性别、年龄、各门功课的成绩等数据,这些数据都与一个学生相关联。 如果将这些数据定义为各独立的简单变量:Number、Name、Sex、Age、Course1、Course2、 这样就难以反映它

14、们之间的内在联系。 应该把它们组织成一个组合项,在一个组合项中包含若干各类型不同(当然也可以相同)的数据项。这个组合项就是结构。,25,2. 结构的声明和使用,结构类型及其声明 结构类型变量及其访问 结构类型的应用 结构分量的类型 结构的内存布局、大小与对齐,26,2.1 结构类型及其声明,把多个紧密关联的变量顺序组织在一起,定义成一个新的复合类型结构类型 声明一个结构类型 struct结构类型名 类型1 分量名1; 类型2 分量名2; ; 结构分量的类型可以相同,也可不同 同一个结构内的分量名不可相同 不同结构内的分量名可以重用,struct point float x; float y;

15、;,27,2.2 结构类型变量的声明,定义新结构只是定义了一个新类型 系统并不为这个新类型分配内存空间 系统只会为该类型的变量按结构的定义分配空间。 结构类型变量定义的两种形式: 用已定义的结构定义变量,例如: struct point point1; struct point point2; 定义结构的同时定义结构类型的变量,例如: struct roof float x, y; int p; roof1, roof2;,28,2.3 结构类型变量的访问,结构类型变量的值由其各个分量构成 对分量的访问一般通过“变量名.分量名“完成 结构赋值及访问的例子: float dx, dy; stru

16、ct point float x, y; p1, p2, points2; p1.x = p1.y = 3.5f; p2.x = p2.y = 1.5f; dx= p1.x - p2.x; dy= p1.y - p2.y; points0 = p1; /结构变量本身可以作为一个整体来访问 points1 = p2;,29,示例:用结构求解救援过程,在图的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。图中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本营出发,以速度50米/分钟时向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船1分钟,船原路返回,达到

17、大本营,每人下船0.5分钟。假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50,给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。并输出所有屋顶的坐标和人数。,30,31,#include #include const int NUM = 50; const float SPEED = 50.0; const float UP = 1.0; const float DOWN = 0.5; int main() struct roof float x, y; / 屋顶坐标 int p; / 屋顶上的人数 roofsNUM; int roof_num; / 屋顶

18、数 printf(“Please input roof_num:“); scanf(“%d“, ,32,2.3 结构应用示例 学生成绩统计,定义一个结构,包含学生的所有信息。 struct student int number; char name8; char sex; int age; float course8; ; struct student class1160;,33,2.4 复合类型的结构分量,结构分量的类型可以是任何类型 结构类型分量 struct point float x, y; ; struct roof struct point location; int p; roo

19、f1; (roof1.location).x 数组类型分量 struct city struct point int x, y; location; char name32; ; 分量的类型不能是未定义的结构类型 不能定义两个同名的结构类型(在同一作用域内),34,2.5 结构的内存布局,结构分量在内存中顺序存放 struct square struct point int x, y; p1, p2; sq1; sq1.p1.x = 10; sq1.p1.y = 20; sq1.p2.x = 100; sq1.p2.y = 200;,sq1.p1.x,sq1.p1.y,sq1.p2.x,sq1

20、.p2.y,35,结构的大小,结构的大小并不完全决定于分量 struct char_frequency char c; int frequency; ; sizeof(strcut char_frequency)通常为8,而非5 这是编译器在编译时的一个特殊要求,36,结构使用中的注意事项,结构名不能相重、结构内分量名也不能相重 结构占用内存字节数不等同于分量占用字节总数 只把真正相互紧密关联的分量定义在同一个结构中 结构分量可以是任何数据类型,但不能是未定义的类型 结构也可用作数组的元素类型(结构数组) struct roof float x, y; int p; roofs100; 数组也可作为结构的分量类型 使用结构变量时首先要对分量进行初始化或赋值,37,小结,回顾了变量与存储单元间的关系 介绍了数组的定义与用法 通过数组可定义大量类型相同的变量 数组元素通过“变量下标”形式访问 数组的大小(数组元素的个数)是预先确定的,即数组定义中数组个数必须是整数常量 介绍了结构的定义与用法 结构把一组紧密相关的变量组织成一个整体 结构的分量通过“变量.分量“形式访问,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1