第64课 统计校服
统计校服(数组、数组长度、数组越界)
新学期到了,需要给同学们定制新的校服。校服一共分为3个尺码:M码对应的身高为155~165(含155,不含165)厘米,L码对应的身高为165~175(含165,不含175)厘米,XL码对应的身高为175~185(含175,不含185)厘米。现已将同学们的身高统计上来了,需要知道M码、L码、XL码校服各需要多少套?
如果有校服尺码范围外的身高就打印出来。
题目分析
假设需要M码校服m套,L码l套,XL码xl套。
将学生们的身高用数组存放,再逐一匹配校服尺码,统计出每个尺码各需要多少套。

运行程序:
145.5和188.8没有匹配的尺码,需定制校服M码2套,L码3套,XL码3套。
(1)int m=0,l=0,xl=0:声明3个变量,分别用于记录每个尺码衣服的数量。
(2)float height[10]={155.6,166.8,165.5,158.9,175.8,175,182.3,170.8,1 73.5,178.8}:声明一个浮点型数组height,用于存储班级同学的身高。
划重点
数组可以看作一个集合,里面存放了相同类型的数据元素。
数组有3个特点:
①这些数据存放的位置是一块连续的内存空间。
②数组中每个元素都是相同的数据类型。
③数组中的元素通过下标访问arr[下标](数组的下标是从0开始的)。
定义一维数组的3种方式:
①数据类型数组名[数组长度]→int arr[6]。
②数据类型数组名[数组长度]={值1,值2,…}→float arr[3]={12.6,65.8,98.8}。
③数据类型数组名[]={值1,值2,…}→char arr[]={'a','b','c','d'}。
敲黑板
当数组初始化值的数量小于数组长度时,未初始化的元素将会默认初始化为0。
int arr[10]={0}→将数组中的所有元素初始化为0。
int arr[10]={1}→将数组中的第一个元素arr[0]初始化为1,其他默认初始化为0。
int arr[10]={1,2,3}→将数组中的前三个元素依次初始化为1,2,3,其他默认初始化为0。
(3)通过循环取出数组中的每一个值。
每一个i对应一个数组下标,从0循环到数组长度-1,刚好将数组元素全部取出。
(4)height[i]>=155 && height[i]<165:将取出元素与尺码比对,如果满足M码则m++,这样就统计出了M码的数量。

提出思考
有什么办法可以直接提取到数组长度呢?
比如这样定义的数组char arr[]={'a','b','c','d','d','d','d','d','d','d','d','d'},难道需要手动数吗?当然不用。

运行程序:
划重点
sizeof(arr)→sizeof(数组名)(字节单位,不是元素个数)。
使用sizeof获取的数组大小是以字节为单位的,int类型占据4字节。

运行程序:
3个数字,每个数组单元占4字节→3×4=12。
那么要想获取到元素个数,可以先通过sizeof获取到整个数组的大小(以字节为单位),再除以单个元素的大小(也以字节为单位),就能得到数组的元素个数。

运行程序:
说到数组长度,就一定要提到一个词语—数组越界,千万要注意哟!如果数组长度为10,那么第11个元素是不存在的,请千万不要超出了
数组的长度。
巩固练习
(1)下面哪个语句用于遍历myArray数组,并输出每个元素的值?()
A.for(int i=0; i<myArray.length(); i++){cout<<myArray[i]<<"";}
B.for(int i=1; i<=sizeof(myArray); i++){cout<<myArray[i]<<"";}
C.for(int i=0; i<sizeof(myArray)/sizeof(myArray[0]); i++){cout<
D.for(int i=1; i<myArray.length(); i++){cout<<myArray[i]<<"";}
(2)C++中的数组允许存储不同类型的数据?()√()×
(3)编写程序输入若干个1~99的数字,将其中含有2的数字组成一个新的数组,并输出。
示例:先输入数字的个数,再输入这些数字。
输入:
输出: