C++基础语法6 —— 一维数组

【情景导入】夏令营住宿管理系统

阿狸带领的"自然探险队"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

三、重要注意事项
  1. 越界访问危险示范

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:左侧小值数

阿狸和小花在夏令营中需要统计每个队员的“左侧小值数”。具体规则如下:

  1. 输入一个整数数组,表示队员的编号(假设编号均为正整数)。
  2. 对于数组中的每个元素a[i],统计其左侧(即下标<i)有多少个元素比它小。
  3. 输出每个元素的左侧小值数,用空格分隔。
输入格式
  • 第一行:正整数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 << " ";
}

八、核心总结

  1. 数组是处理批量同类型数据的高效工具

  2. 声明时必须明确数组大小(int arr[10];

  3. 下标访问从0开始,严防越界

  4. 初始化方式决定内存状态:

    • 未初始化:随机值

    • 部分初始化:剩余补0

  5. 数组名本质是内存首地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值