信奥C++一维数组笔记

📚 C++一维数组笔记

一、什么是数组?🤔

1.1 生活中的数组

想象一下,你有一个带编号的储物柜

  • 柜子编号:1号、2号、3号...直到100号
  • 每个柜子里可以放不同的东西
  • 通过编号可以快速找到对应的柜子

数组就是编程中的"储物柜"!
数组是 C++ 中最常用的数据结构。它用一段连续内存存储相同类型的多个元素,让我们能高效地批量处理数据。

为什么需要数组?

1.2 数组的定义

cpp 复制代码
// 语法格式:类型 数组名[元素个数];
int scores[5];  // 定义一个能存放5个整数的数组

重要概念

  • 数组名:就像储物柜的"名字"(比如scores)
  • 下标:从0开始的编号(0,1,2,3,4)
  • 元素:每个柜子里存放的数据

1.3 数组的"下标"为什么从0开始?

小故事:计算机科学家们发现,从0开始计算位置,在底层实现时更高效。就像我们数楼层,中国从1楼开始,但有些国家从0楼(Ground Floor)开始。


二、数组的基本操作 🛠️

2.1 声明和初始化

cpp 复制代码
// 方法1:声明后逐个赋值
int a[5];
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
a[4] = 50;

// 方法2:声明时直接初始化
int b[5] = {10, 20, 30, 40, 50};

// 方法3:部分初始化(其余自动为0)
int c[5] = {1, 2, 3};  // c[3]=0, c[4]=0

// 方法4:不指定大小(根据初始化值自动确定)
int d[] = {1, 2, 3, 4, 5};  // 自动成为5个元素

2.2 访问数组元素

cpp 复制代码
int arr[3] = {100, 200, 300};

// 通过下标访问
cout << arr[0];  // 输出:100
cout << arr[1];  // 输出:200
cout << arr[2];  // 输出:300

// 修改元素
arr[1] = 250;    // 现在数组为:{100, 250, 300}

2.3 使用循环遍历数组

cpp 复制代码
int scores[5] = {85, 92, 78, 90, 88};

// 正向遍历(从第0个到第4个)
for(int i = 0; i < 5; i++) {
    cout << "第" << i+1 << "个成绩是:" << scores[i] << endl;
}

// 反向遍历(从第4个到第0个)
for(int i = 4; i >= 0; i--) {
    cout << scores[i] << " ";
}

三、数组的常见应用场景 🎯

3.1 求最大值和最小值

cpp 复制代码
int arr[5] = {23, 45, 12, 67, 34};
int max_val = arr[0];  // 假设第一个最大
int min_val = arr[0];  // 假设第一个最小

for(int i = 1; i < 5; i++) {
    if(arr[i] > max_val) max_val = arr[i];
    if(arr[i] < min_val) min_val = arr[i];
}

cout << "最大值:" << max_val << endl;
cout << "最小值:" << min_val << endl;

3.2 求和与平均值

cpp 复制代码
int scores[5] = {85, 92, 78, 90, 88};
int sum = 0;

for(int i = 0; i < 5; i++) {
    sum += scores[i];  // 累加每个成绩
}

double average = (double)sum / 5;
cout << "总分:" << sum << endl;
cout << "平均分:" << average << endl;

3.3 统计特定值的个数

cpp 复制代码
int arr[10] = {1, 2, 3, 2, 4, 2, 5, 2, 6, 7};
int target = 2;
int count = 0;

for(int i = 0; i < 10; i++) {
    if(arr[i] == target) {
        count++;
    }
}

cout << "数字" << target << "出现了" << count << "次" << endl;

四、数组的常见错误 ⚠️

4.1 数组越界(最危险的错误!)

cpp 复制代码
int arr[5] = {1, 2, 3, 4, 5};

// ❌ 错误:下标超出范围
arr[5] = 100;  // 数组只有0-4,没有第5个!

// ✅ 正确写法
arr[4] = 100;  // 修改最后一个元素

记忆口诀:数组下标从0起,最大下标是n-1,越界访问很危险,程序崩溃找bug!

4.2 未初始化就使用

cpp 复制代码
int arr[5];
// ❌ 错误:arr[0]的值不确定(可能是垃圾值)
cout << arr[0];  

// ✅ 正确:先初始化再使用
int arr[5] = {0};  // 全部初始化为0

4.3 忘记数组大小

cpp 复制代码
// ❌ 错误:忘记定义数组大小
int arr[];  // 编译错误!

// ✅ 正确:要么指定大小,要么初始化
int arr[100];
int arr[] = {1, 2, 3};  // 自动确定为3个元素

五、经典例题讲解 📝

例题1:陶陶摘苹果(洛谷P1046)

题目描述:陶陶有10个苹果,每个苹果有一定高度。陶陶身高加上板凳高度(30cm),能摘到哪些苹果?

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int apples[10];  // 存储10个苹果的高度
    int height;      // 陶陶的身高
    
    // 输入10个苹果的高度
    for(int i = 0; i < 10; i++) {
        cin >> apples[i];
    }
    
    // 输入陶陶的身高
    cin >> height;
    
    int total_height = height + 30;  // 加上板凳高度
    int count = 0;                   // 能摘到的苹果数
    
    for(int i = 0; i < 10; i++) {
        if(apples[i] <= total_height) {
            count++;
        }
    }
    
    cout << count << endl;
    return 0;
}

例题2:数组元素的查找

题目:在数组中查找某个数,找到输出位置,找不到输出-1

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int arr[10] = {5, 8, 2, 9, 1, 7, 3, 6, 4, 0};
    int target;
    
    cout << "请输入要查找的数字:";
    cin >> target;
    
    int position = -1;  // 初始化为-1表示没找到
    
    for(int i = 0; i < 10; i++) {
        if(arr[i] == target) {
            position = i;  // 记录位置
            break;         // 找到就退出循环
        }
    }
    
    if(position != -1) {
        cout << "找到了!位置是:" << position << endl;
    } else {
        cout << "没找到这个数字" << endl;
    }
    
    return 0;
}

六、数组的进阶技巧 🚀

6.1 数组的"标记"用法

cpp 复制代码
// 统计每个数字出现的次数
int arr[10] = {1, 2, 3, 2, 1, 3, 4, 5, 2, 1};
int count[6] = {0};  // 假设数字范围是1-5

for(int i = 0; i < 10; i++) {
    count[arr[i]]++;  // 对应数字的计数加1
}

// 输出每个数字出现的次数
for(int i = 1; i <= 5; i++) {
    cout << "数字" << i << "出现" << count[i] << "次" << endl;
}

6.2 数组的"翻转"操作

cpp 复制代码
int arr[5] = {1, 2, 3, 4, 5};
int n = 5;

// 翻转数组
for(int i = 0; i < n/2; i++) {
    int temp = arr[i];
    arr[i] = arr[n-1-i];
    arr[n-1-i] = temp;
}

// 输出:5 4 3 2 1
for(int i = 0; i < n; i++) {
    cout << arr[i] << " ";
}

七、课后练习题 📝

基础题(必做)

  1. 数组求和:输入10个数,求它们的和
  2. 找最大值:输入8个数,找出最大值和它的位置
  3. 统计奇偶:输入6个数,统计奇数和偶数的个数

提高题(选做)

  1. 数组去重:输入10个数,去掉重复的数字
  2. 冒泡排序:用数组实现冒泡排序(从小到大)

挑战题(信奥风格)

  1. 校门外的树(洛谷P1047):一条路长L米,有M个区域要移走树,求最后剩下的树的数量

八、学习小贴士 💡

8.1 记忆口诀

复制代码
数组就像储物柜,编号从零开始对
声明类型加中括号,元素个数要写对
下标范围要牢记,0到n-1别越界
循环遍历最常用,for循环来帮忙

8.2 常见问题解答

Q:为什么数组下标从0开始?

A:这是C/C++的传统,计算机内存地址从0开始编号,这样设计更高效。

Q:数组大小可以改变吗?

A:普通数组大小是固定的,不能改变。如果需要动态大小,可以学习vector。

Q:数组可以存不同类型的数据吗?

A:不行,一个数组只能存同一种类型的数据。

8.3 学习建议

  1. 多画图:在纸上画出数组的格子,理解下标和元素的关系
  2. 多调试:用cout输出中间结果,观察数组的变化
  3. 多练习:每天做2-3道数组练习题

九、总结 📌

数组三要素

  1. 类型:所有元素必须是同一类型
  2. 名称:给数组起个有意义的名字
  3. 大小:确定数组能存多少个元素

数组三操作

  1. 存数据:通过下标赋值
  2. 取数据:通过下标读取
  3. 遍历:用循环访问每个元素

数组三注意

  1. 下标从0开始
  2. 不要越界
  3. 使用前要初始化

寄语:数组是编程中最重要的数据结构之一,就像学数学要先学加减乘除一样,学好数组是成为编程高手的第一步!🌟

相关推荐
码上有光1 小时前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
这就是佬们吗1 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
王维同学1 小时前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表
昕光xg1 小时前
Istio笔记04-基于Jaeger的分布式链路追踪
笔记·分布式·istio
code_pgf1 小时前
C++ 工程架构设计规范
c++·机器人
asdzx671 小时前
Python PDF 拆分实战指南:单页拆分与按需页码范围拆分
开发语言·python·pdf
C++ 老炮儿的技术栈2 小时前
基于MFC+原生GDI手动自绘仪表盘控件
c语言·c++·visual studio·控件·工业控制·gdi·自绘
孬甭_2 小时前
C++ vector
开发语言·c++
小肝一下2 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra