资源描述
Outline掌握数组的概念与用法掌握结构的概念与用法1重谈变量在源程序中,变量是用于存取数据的标识符,具有不同的类型,如:int num;float x,y;double r;在程序执行过程中,变量是相应存储单元(或一组存储单元)的名字变量的类型决定变量占用的存储单元数量存储单元中二进制数据如何构成变量的值(变量的内容)变量定义就是建立变量名和存储单元之间的对应关系变量使用在等号左边,给变量赋值(存储数据到存储单元)在“&”表达式中,求得变量的地址(存储单元的地址)在其他地方,取变量值参与运算(读取存储单元中的数据)2变量与内存int main()int m;int n;double dbl;m=123;n=321;dbl=m*n;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0 xFAC2AB2Cm0 xFAC2AB20dbl011110110000000000000000000000000100000100000001000000000000000000000000000000000000000000000000011000000100011111100011010000000 xFAC2AB28n3数组的定义和使用当我们需要处理100个人甚至更多人的年龄时,在程序中该如何来表示这100个甚至更多的数据?定义100个变量吗?int x1,x2,x3,x100;要是1000个人,10000个人呢?41.数组的定义和使用什么是数组如何声明数组如何给数组赋值如何遍历与访问数组中的内容数组的用途多维数组51.1 什么是数组数组是一种复合数据类型数组从整体上定义了一组类型相同的变量数组中的每个元素都可作为变量使用数组元素的类型是相同的数组的元素顺序地存储在连续的内存空间中当要处理很多类型相同的数据时,可利用数组以避免在程序中定义大量的变量61.2 数组的声明数组声明方法如下:数据类型 变量名 数组元素个数=数组元素初值;其中“=数组元素初值”部分可以省略一些数组声明的例子:int score5;char cards4=a,0,r,W;float point2=2.56,23.43;double distances4;7数组在内存中的布局主存储器score00score10000score2score3score4主存储器cards0a0rWcards1cards2cards3int score5;char cards4;8数组在内存中的布局float point2;double distances4;9数组元素声明一个数组变量相当于声明一组变量,这组变量中的每一个都可以通过“数组变数组变量名量名 下标下标”形式来访问。例如:score0,score1,score2 等等。这组变量在内存中是连续存放的,它们的下标从0开始计数。在数组中(设N是数组的元素总数)第一个数组元素的下标是0最后一个数组元素的下标是N-1101.3 数组元素的赋值与访问每个数组元素,就是一个变量。每个数组元素占用的空间大小是由定义数组变量时给定的类型决定的cards每个元素占1字节(char类型的长度)distance每个元素占8字节(double 类型的长度)。数组元素的赋值可以在定义时给定初始值,也可以在程序中给数组元素赋值在给数组元素赋值时,可以把数组元素看作单个变量,例如:score0=67;score3=89;distance2=356.24;cards0=b;给数组元素赋值,数据类型必须匹配。数组元素可以用在任何单个变量可能出现的地方。例如:int score1,scoreN;score1=score0;scoreN=score3;111.4 数组的遍历可以用一个循环语句给数组的所有元素赋值,或顺序访问它的每个元素。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+;121.5 数组的用途当程序要处理一组类型相同、含义类似的数据时应该使用数组.例如:过年了,村里要庆祝一下。村长对村里的128个村民说:做一个游戏,让每个人把出生年+月+日得到一个数。如:1968年10月28日=1968+10+28=2019。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元。如果有人报上来的数字与M相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。现在让我们来写一段程序算算都有哪些人得到了奖金?得到多少?13问题求解声明一个数组存放所有村民上报的数据声明一个数组存放获奖者的编号(幸运者数组)声明一个整数存放获奖者人数村民顺序报上数字,其相应的编号就是存放其数据的数组元素下标:0,1,2,报上数字与幸运数相等,则记录编号到幸运者数组中获奖者人数加1最后,打印出获奖者编号和获得的奖金数额14#include using namespace std;const int LUCKY_M=2019;/幸运数字幸运数字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)luckyPeoplenLucky=i;/假设村民从假设村民从0 0开始编号开始编号 nLucky+;for(int i=0;inLucky;i+)/输出获奖者编号及所获奖金数额输出获奖者编号及所获奖金数额 cout luckyPeoplei LUCKY_M/nLucky endl;15数组使用中的注意事项数组必须初始化(或赋值)后方可使用在C+中可用type aryN=0形式给ary赋初值0数组元素下标范围从0到N-1,避免访问越界整个数组占用字节数可用“sizeof(数组变量)”获得声明数组时尽量用常量指明数组长度数组长度与数组占用字节数是两个不同的概念数组长度是数组中包含的元素的个数数组占用字节数是数组在内存中占用的存储单元数161.6 多维数组二维数组的声明:数组的数组类型类型 变量名变量名 数组行数数组行数数组列数数组列数=初初值列表值列表,初值列表初值列表二维数组的例子:intmatrix1010=0;intn2323=1,2,3,2,4,6;double scoresSTUDENT_NUMCOURSE_NUM;其他多维数组可以此类推17多维数组在内存中的布局主存储器n2300123246n2301n2302n2312n2310n2311n230n231n2318多维数组应用举例1计算全年级180名学生每个学生8门课的平均成绩和每门课全年级平均成绩求解过程定义一个1808的二维数组记录各门课成绩录入每个人各门课成绩计算每名学生的平均成绩并打印出来计算每门课程的平均成绩并打印出来19学生学生 课程课程0 01 12 2.0 0838361614141.1 1888896966868.2 2676781817070.3 3777767677373.4 4808067678383.5 5838383837373.6 6767678786262.7 7717149497272.8 8949462627272.9 9757581816767.1010404079797878.1111616178787474.1212898993936565.1313868677777272.1414797976767373.求学生的平均分求课程平均分20#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;iSTUDENT_NUM;i+)/录入学生成绩:录入学生成绩:这是一个二重循环这是一个二重循环 for(int j=0;j scoresij;/读入每门课成绩读入每门课成绩 for(int i=0;iSTUDENT_NUM;i+)/计算学生平均成绩计算学生平均成绩 float sum=0;/总成绩总成绩 for(int j=0;jCOURSE_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;21多维数组应用举例课后思考题:(POJ 2713)在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用0表示。其它肿瘤内和肿瘤外的点都用255 表示。现在要求你编写一个程序,计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点)。已知肿瘤的边缘平行于图像的边缘。222.结构的定义和使用通常,我们需要将多个不同类型、但相互之间有着内在联系的数据组合成一个有机的整体,对这个整体进行各种操作。比如,一个学生的学号、姓名、性别、年龄、各门功课的成绩等数据,这些数据都与一个学生相关联。如果将这些数据定义为各独立的简单变量:Number、Name、Sex、Age、Course1、Course2、这样就难以反映它们之间的内在联系。应该把它们组织成一个组合项,在一个组合项中包含若干各类型不同(当然也可以相同)的数据项。这个组合项就是结构结构。232.结构的声明和使用结构类型及其声明结构类型变量及其访问结构类型的应用结构分量的类型结构的内存布局、大小与对齐242.1 结构类型及其声明把多个紧密关联的变量顺序组织在一起,定义成一个新的复合类型结构类型声明一个结构类型struct结构类型名 类型1 1 分量名1;1;类型2 2 分量名2;2;.;结构分量的类型可以相同,也可不同同一个结构内的分量名不可相同不同结构内的分量名可以重用struct point float x;float y;252.2 结构类型变量的声明定义新结构只是定义了一个新类型系统并不为这个新类型分配内存空间系统只会为该类型的变量按结构的定义分配空间。结构类型变量定义的两种形式:用已定义的结构定义变量,例如:struct point point1;struct point point1;struct point point2;struct point point2;定义结构的同时定义结构类型的变量,例如:struct roof struct roof float x,y;float x,y;int p;int p;roof1,roof2;roof1,roof2;262.3 结构类型变量的访问结构类型变量的值由其各个分量构成对分量的访问一般通过变量名.分量名完成结构赋值及访问的例子:float dx,dy;struct 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;27示例:用结构求解救援过程在图的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。图中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本营出发,以速度50米/分钟时向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船1分钟,船原路返回,达到大本营,每人下船0.5分钟。假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50,给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。并输出所有屋顶的坐标和人数。2829#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;/屋顶数屋顶数 printf(Please input roof_num:);scanf(%d,&roof_num);float x,y;int p;for(int i=0;iroof_num;i+)/用循环输入每一个屋顶的位置及人数用循环输入每一个屋顶的位置及人数scanf(%f%f%d,&x,&y,&p);roofsi.x=x;roofsi.y=y;roofsi.p=p;double totalTime=0;/救援总时间救援总时间for(int i=0;iroof_num;i+)/用循环处理每一个屋顶,计算救援时间用循环处理每一个屋顶,计算救援时间x=roofsi.x;y=roofsi.y;p=roofsi.p;totalTime+=2*sqrt(x*x+y*y)/SPEED;/计算从大本营到屋顶的双程航行时间计算从大本营到屋顶的双程航行时间totalTime+=p*(UP+DOWN);/计算被求人员上船和下船所耗费的总时间计算被求人员上船和下船所耗费的总时间printf(Total Time is:%.2lfn,totalTime);/打印出救援总时间打印出救援总时间for(int i=0;iroof_num;i+)/依次打印出各屋顶的位置及人数依次打印出各屋顶的位置及人数printf(Roof ID:%d%.2f%.2f%dn,i+1,roofsi.x,roofsi.y,roofsi.p);302.3 结构应用示例学生成绩统计定义一个结构,包含学生的所有信息。struct student int number;char name8;char sex;int age;float course8;struct student class1160;312.4 复合类型的结构分量结构分量的类型可以是任何类型结构类型分量struct point float x,y;struct roof struct point location;int p;roof1;(roof1.location).x数组类型分量struct city struct point int x,y;location;char name32;分量的类型不能是未定义的结构类型不能定义两个同名的结构类型(在同一作用域内)322.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.x1020100200*sq1.p1.ysq1.p2.xsq1.p2.y33结构的大小结构的大小并不完全决定于分量struct char_frequency char c;int frequency;sizeof(strcut char_frequency)通常为通常为8,而非而非5这是编译器在编译时的一个特殊要求这是编译器在编译时的一个特殊要求34结构使用中的注意事项结构名不能相重、结构内分量名也不能相重结构占用内存字节数不等同于分量占用字节总数只把真正相互紧密关联的分量定义在同一个结构中结构分量可以是任何数据类型,但不能是未定义的类型结构也可用作数组的元素类型(结构数组)struct roof float x,y;int p;roofs100;数组也可作为结构的分量类型使用结构变量时首先要对分量进行初始化或赋值35小结回顾了变量与存储单元间的关系介绍了数组的定义与用法通过数组可定义大量类型相同的变量数组元素通过“变量变量 下标下标”形式访问数组的大小(数组元素的个数)是预先确定的,即数组定义中数组个数必须是整数常量介绍了结构的定义与用法结构把一组紧密相关的变量组织成一个整体结构的分量通过变量变量.分量分量形式访问36
展开阅读全文