![算法训练营:海量图解+竞赛刷题(入门篇)](https://wfqqreader-1252317822.image.myqcloud.com/cover/621/39479621/b_39479621.jpg)
1.9 巧用数组——好玩贪吃蛇
在程序设计中,数组可以存储一组具有相同数据类型的数据。
1. 一维数组
1)静态定义
一维数组的静态定义如下图所示。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/041-1.jpg?sign=1739152663-31ULqAGRyP5efS65kxSe1l4KjiCDbaYN-0-34feaf8d2b06c406655c0ae3502abbd0)
常量表达式必须是整型常量,不能是变量,这个数值必须是已知的数值。
• 可以在定义时,对数组初始化。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/041-2.jpg?sign=1739152663-ONGhpERoN3GNszk0tHGTUXkSpi6qPsOq-0-d1d7b95479c2d01e378294b0125ec3f0)
• 定义并初始化时可以不指定长度。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/041-3.jpg?sign=1739152663-tDt9XeA4si77rGCq6ELOFufQRxbC98pl-0-7856293d2b3f3d72d7def7bf463b8743)
• 在非定义时不可以整体赋值。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/041-4.jpg?sign=1739152663-RdrF8PDoYXJTFucTFpj6O7Ki6csM0ES8-0-ebb5589f1c14e403937d9369f82f6cc5)
• 不可以在数组变量之间赋值。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/041-5.jpg?sign=1739152663-1bCtGnEqzzzgPkmU1OpLZK4mwqGrjInG-0-190e3b17e3b09cec7a8e5985282f70cf)
• 系统不会检查下标是否有效。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/041-6.jpg?sign=1739152663-uSZqzfdzMYSIXgwjMGQYx17XX7LyDj5M-0-9eff7dbedbb6ff021c705155de9227e9)
• 应该将特别大的数组定义在main()函数外,如果将其定义在main()函数内,就会异常退出。
训练1-36:定义一些一维数组,并赋值、运算、输出。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/042-1.jpg?sign=1739152663-vxKVJ0eLItLeBOCwtSXJ2nsT22NYIoIJ-0-36b07207662a6310bdf310b3d37a7b62)
训练1-37:输入一些整数,并将其逆序输出。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/042-2.jpg?sign=1739152663-cmn9DmcOFpebuz9cjJ3ND79Wv10y3LhT-0-790064ca430fbd880f35846924bdf41e)
训练1-38:现在有n盏灯,编号为1~n,开始时所有的灯都是关的,编号为1的人走过来,把编号是1的倍数的灯开关按下(开的关上,关的打开),编号为2的人把编号是2的倍数的灯开关按下,编号为3的人又把编号是3的倍数的灯开关按下……直到第k个人为止。
给定n和k(0<n,k≤1000),输出哪几盏灯是开着的。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/042-3.jpg?sign=1739152663-DwxKo9hzthZb6GOWy0EoSTKZYR5vq4VF-0-2c759b8894b14aaa80a26b74e3440912)
训练1-39:输入n个学生的成绩(整数)并将其存入数组中,求其总成绩和平均成绩(浮点数)。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/043-2.jpg?sign=1739152663-QHdPWYYkBfODM9ObhivOlxstruUcFEiP-0-a188f389450c50ff6458354bc6affc4f)
训练1-40:输入n个学生的成绩并将其存入数组中,求其最低分和最高分。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/044-2.jpg?sign=1739152663-DMbh56gauJLVsz3t3c1WGRYMUJwfzOQd-0-5a07462b484f112a76084d4d8d79ab7d)
2)动态定义
在程序运行过程中动态分配空间定义数组。一维数组的动态定义如下图所示。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/044-3.jpg?sign=1739152663-R1Om96CcIed3LRNqLjnkM9k4oKYbvxth-0-6664326fdb8f8ea9a6d7ba55fbde63ee)
使用new分配的数组,在使用完毕后需要使用delete释放内存空间。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/044-4.jpg?sign=1739152663-FMc2k4BSz6U6qlyRXKESH9KnMG7Uu69H-0-22c59f16a7e94d435f8efd5e49aa7aa8)
注意:
• 不要使用delete释放不是new分配的内存;
• 不要使用delete释放同一个内存块两次;
• 使用new为一个实体分配内存,需要使用delete释放内存空间;
• 使用new为一个数组分配内存,需要使用delete[]释放内存空间;
• 对空指针使用delete是安全的。
训练1-41:输入n个学生的成绩并将其存入动态数组a[]中,统计不及格的人数。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/045-1.jpg?sign=1739152663-yE3Tap9M4oOXgILcF2h9qtK57gL4M87V-0-5b7c22463547533f421ff15d57892799)
2. 二维数组
1)静态定义
二维数组的静态定义如下图所示。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/045-2.jpg?sign=1739152663-SDWhXPpkujIpFS0v6KCyI6L2BCNdxhjn-0-948349c3000815a21aa087e6f778dc80)
常量表达式必须是整型常量,不能是变量,该数值必须是已知的数值。
• 可以在定义时,对数组初始化。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/046-1.jpg?sign=1739152663-lzpApOJtYyNdFkn6xEt22LTEamWq4RhG-0-9623ffe0fea5f9b4310ba2e0d0cbef33)
• 将二维数组作为参数时,可以省略第1维的长度,但必须指定第2维的长度。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/046-2.jpg?sign=1739152663-CDqM8v9hy6aAZsEepJXqjVXfDjRfNwmo-0-bd74d97c51edb749bf8c949b3fb509fb)
2)动态定义
一个m行n列的二维数组相当于m个长度为n的一维数组。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/046-3.jpg?sign=1739152663-Vir6BL9IP5FpgxozbvJoxoZCEsTh7uaE-0-ea2bf3a9e04998e34c38408c9bdfb44d)
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/046-4.jpg?sign=1739152663-dIeTAaJchB2Eb0RyfpwH2YMGqrhiy4lj-0-999211750523f52c3982f9824f183284)
训练1-42:蛇形填数,输入一个整数n,按照蛇形填写n×n的矩阵。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/046-5.jpg?sign=1739152663-otxnzV37fcENVe659xb51YrB6CjECG8S-0-60f0733882290c75693eecb06fc4abf9)
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/046-6.jpg?sign=1739152663-nvSAe0rXeOEUu39NiyxIC3zjldySHsmG-0-bc50c94bb5cc2bf92eb0eb82462986c2)
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/047-1.jpg?sign=1739152663-fFF6WYHDcOglGYha0QvJejYjZ6PMEMtK-0-270b1355d73e0cde2288a84154f37cf4)