【情景导入】夏令营住宿管理系统
阿狸带领的"自然探险队"10人来到森林酒店,前台接待员这样安排住宿:
int arr[10]; // 创建名为arr的公寓,10个连续房间(0-9号)
for(int i=0; i<10; i++) {
arr[i] = 1001 + i; // 队员编号1001入住0号房,1010住9号房
}
小花带领的"星空摄影组"12人随后到达:
int a[12] = {2001,2002,2003}; // 部分初始化,剩余房间自动填0
一、数组核心特性(对照表)
酒店管理系统 | C++数组特性 | 示例代码 |
---|---|---|
公寓名称 | 数组标识符 | int camp[5]; |
房间连续编号 | 下标从0开始 | camp[0] = 101; |
统一团队类型 | 相同数据类型 | string names[3]; |
固定房间数 | 静态数组长度 | float scores[10]; |
二、三种入住方式演示
方式1:后入住登记(先声明数组再赋值)
int roomA[3];
roomA[0] = 301; // 301号队员入住0号房
roomA[1] = 302; // 注意下标从0开始!
方式2:全员同时入住(申请数组的同时赋值)
int roomB[4] = {401,402,403,404}; // 完全匹配房间数
方式3:智能分配公寓(C++11特性)
auto roomC[] = {501,502,503}; //根据数组元素个数,自动推断数组大小为3
三、重要注意事项
-
越界访问危险示范
int danger[5] = {1,2,3,4,5};
cout << danger[5]; // 错误!合法下标0-4(类比访问不存在的5号房)
2.整体赋值限制
int err[3];
err = {6,7,8}; // 错误!只能在初始化时使用列表
3.安全遍历示范
int danger[5] = {1,2,3,4,5};
for(int i=0; i<5; i++) {
cout << "房间" << i << ":" << danger[i]<< endl;
}
四、内存本质揭秘
当小花尝试查看公寓位置信息:
cout << a; // 输出类似0x7ffee2dac0,显示内存首地址
这就像酒店总台显示的公寓GPS坐标,而不是房间内的住客信息。
五、常见问题解析
1.输出未入住的房间信息会怎样?
int mystery[3];
cout<<mystery[2];// 会输出随机值,如同未打扫的空房间可能有遗留物品
2.可以中途扩建公寓吗?
int fixed[5] = {1,2,3};
fixed[6] = {1,2,3,4,5,6}// 无法扩容!就像实体公寓不能随意加层
3.如何快速查公寓住客数?
int smart[] = {7,8,9};
int count = sizeof(smart)/sizeof(smart[0]); // 获得3
六、【编程实践】住宿管理系统
#include <iostream>
using namespace std;
int main() {
// 阿狸队伍入住
int ali_team[5] = {100,101,102};
// 小花队伍智能入住
int hua_team[] = {200,201,202,203};
// 安全访问示范
cout << "阿狸住在:" << ali_team[0] << endl;
cout << "小花队第三位:" << hua_team[2] << endl;
// 危险操作警示
// cout << hua_team[4] << endl; // 越界访问!
return 0;
}
七、练习
接下来我们通过一些习题来对数组进行练习:
题目1:天数统计:
最近,阿狸开始研究天气的变化,希望用研究的结果预测未来的天气。 经历千辛万苦,他收集了连续 n天(1≤n≤106 ) 的最高气温数据。现在,他想知道最高气温一直上升的最长连续天数。
输入格式: 第 1 行:一个整数 n 。1≤n≤106
第 2 行:n个空格隔开的整数,表示连续 n 天的最高气温。0≤ 最高气温 ≤109
输出格式: 1 行:一个整数,表示最高气温一直上升的最长连续天数。
输入样例: 10 1 2 3 2 4 5 6 8 5 9
输出样例: 5
参考代码:
int a[1000] = {0};
int lenth = 1, maxlen = 1, n;
cin >> n;
for(int i=0; i<n; i++) cin >> a[i];
for(int j=0; j<n-1; j++) {
if(a[j+1] > a[j]) {
lenth++;
maxlen = max(maxlen, lenth);
} else {
lenth = 1;
}
}
cout << maxlen;
题目2:左侧小值数
阿狸和小花在夏令营中需要统计每个队员的“左侧小值数”。具体规则如下:
- 输入一个整数数组,表示队员的编号(假设编号均为正整数)。
- 对于数组中的每个元素
a[i]
,统计其左侧(即下标<i
)有多少个元素比它小。 - 输出每个元素的左侧小值数,用空格分隔。
输入格式
- 第一行:正整数
n
(1 ≤n
≤ 1000),表示数组长度。 - 第二行:
n
个正整数,表示数组元素(1 ≤ 元素值 ≤ 10^9)。
输出格式
- 一行,包含
n
个整数,表示每个元素的左侧小值数,用空格分隔。
输入输出样例
样例输入
5
5 2 3 4 1
样例输出
0 0 1 2 0
数据范围
1 ≤ n ≤ 1000
1 ≤ a[i] ≤ 10^9
参考代码:
int a[1000], n, sum;
cin >> n;
for(int i=0; i<n; i++) cin >> a[i];
for(int i=0; i<n; i++) {
sum = 0;
for(int j=0; j<i; j++) {
if(a[j] < a[i]) sum++;
}
cout << sum << " ";
}
八、核心总结
-
数组是处理批量同类型数据的高效工具
-
声明时必须明确数组大小(
int arr[10];
) -
下标访问从0开始,严防越界
-
初始化方式决定内存状态:
-
未初始化:随机值
-
部分初始化:剩余补0
-
-
数组名本质是内存首地址