📊 C++ 一维数组 - L16 高级概念

深入学习一维数组的各种操作和应用

📚 一维数组深入理解

什么是一维数组?

一维数组是最简单的数组形式,可以理解为"一排格子"或"一条线"上的数据存储。

  • 线性结构:元素按顺序排列成一行
  • 单一维度:只需要一个索引就能定位元素
  • 连续存储:内存中相邻存放
  • 随机访问:可以通过索引直接访问任意元素
💡 形象比喻:
• 一维数组就像一排储物柜,每个柜子有编号(0, 1, 2...)
• 也像火车车厢,每节车厢有座位号
• 还像书架的一层,每本书有位置编号

一维数组的完整声明方式

#include <iostream> using namespace std; int main() { // 方式1:先声明,后赋值 int arr1[5]; arr1[0] = 10; arr1[1] = 20; arr1[2] = 30; arr1[3] = 40; arr1[4] = 50; // 方式2:声明时初始化 int arr2[5] = {10, 20, 30, 40, 50}; // 方式3:部分初始化(未初始化的为0) int arr3[5] = {10, 20}; // {10, 20, 0, 0, 0} // 方式4:自动推断大小 int arr4[] = {10, 20, 30, 40, 50}; // 大小为5 // 方式5:全部初始化为0 int arr5[5] = {0}; // {0, 0, 0, 0, 0} return 0; }

不同数据类型的数组

#include <iostream> using namespace std; int main() { // 整数数组 int ages[5] = {18, 20, 22, 19, 21}; // 浮点数数组 double prices[3] = {9.9, 19.9, 29.9}; // 字符数组 char grades[5] = {'A', 'B', 'C', 'D', 'E'}; // 布尔数组 bool flags[3] = {true, false, true}; // 输出示例 cout << "年龄:"; for (int i = 0; i < 5; i++) { cout << ages[i] << " "; } cout << endl; return 0; }

⚙️ 数组的基本操作

输入数组元素

#include <iostream> using namespace std; int main() { const int N = 5; int scores[N]; // 从键盘输入数组元素 cout << "请输入" << N << "个学生的成绩:" << endl; for (int i = 0; i < N; i++) { cout << "第" << (i + 1) << "个成绩:"; cin >> scores[i]; } // 输出所有成绩 cout << "\n输入的成绩:"; for (int i = 0; i < N; i++) { cout << scores[i] << " "; } cout << endl; return 0; }

数组元素的修改

#include <iostream> using namespace std; int main() { int arr[5] = {10, 20, 30, 40, 50}; cout << "修改前:"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; // 修改特定位置的元素 arr[2] = 99; // 将第3个元素改为99 arr[0] = arr[4]; // 将最后一个元素的值赋给第一个 cout << "修改后:"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; return 0; }

数组的复制

#include <iostream> using namespace std; int main() { int arr1[5] = {1, 2, 3, 4, 5}; int arr2[5]; // ❌ 错误:不能直接用=复制数组 // arr2 = arr1; // 编译错误! // ✅ 正确:逐个元素复制 for (int i = 0; i < 5; i++) { arr2[i] = arr1[i]; } // 验证复制结果 cout << "arr1:"; for (int i = 0; i < 5; i++) { cout << arr1[i] << " "; } cout << endl; cout << "arr2:"; for (int i = 0; i < 5; i++) { cout << arr2[i] << " "; } cout << endl; return 0; }
⚠️ 重要提醒:
• 数组名代表数组的首地址,是常量指针
• 不能用=直接赋值整个数组
• 必须通过循环逐个元素复制
• 或者使用memcpy等库函数
🎮 互动实验:数组操作演示

输入一组数字,体验数组的各种操作

输入数字后点击"演示操作"...

🛠️ 数组的常用算法

查找元素(线性查找)

#include <iostream> using namespace std; int main() { int arr[7] = {23, 45, 12, 67, 34, 89, 56}; int target = 34; // 要查找的目标值 int foundIndex = -1; // -1表示未找到 // 线性查找:从头到尾逐个比较 for (int i = 0; i < 7; i++) { if (arr[i] == target) { foundIndex = i; break; // 找到后立即退出 } } if (foundIndex != -1) { cout << "找到目标 " << target << ",位置:" << foundIndex << endl; } else { cout << "未找到目标 " << target << endl; } return 0; }

统计元素出现次数

#include <iostream> using namespace std; int main() { int arr[10] = {3, 5, 3, 7, 5, 3, 8, 5, 3, 9}; int target = 3; int count = 0; // 遍历数组,统计目标值出现的次数 for (int i = 0; i < 10; i++) { if (arr[i] == target) { count++; } } cout << target << " 出现了 " << count << " 次" << endl; return 0; }

数组反转

#include <iostream> using namespace std; int main() { int arr[5] = {1, 2, 3, 4, 5}; cout << "反转前:"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; // 反转数组:首尾交换 for (int i = 0; i < 5 / 2; i++) { int temp = arr[i]; arr[i] = arr[4 - i]; arr[4 - i] = temp; } cout << "反转后:"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; return 0; }

排序算法(冒泡排序)

#include <iostream> using namespace std; int main() { int arr[5] = {64, 34, 25, 12, 22}; cout << "排序前:"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; // 冒泡排序:从小到大 for (int i = 0; i < 5 - 1; i++) { for (int j = 0; j < 5 - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // 交换相邻元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } cout << "排序后:"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
💡 冒泡排序原理:
• 比较相邻的两个元素
• 如果顺序错误就交换
• 每一轮把最大的数"冒泡"到最后
• 重复这个过程直到排序完成
🎯 数组算法实验室

选择算法,观察执行过程

输入数字后选择算法...

🚀 数组的高级应用

数组作为函数参数

#include <iostream> using namespace std; // 函数:计算数组的平均值 double calculateAverage(int arr[], int size) { int sum = 0; for (int i = 0; i < size; i++) { sum += arr[i]; } return (double)sum / size; } // 函数:查找数组中的最大值 int findMax(int arr[], int size) { int maxVal = arr[0]; for (int i = 1; i < size; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; } int main() { int scores[5] = {85, 92, 78, 95, 88}; double avg = calculateAverage(scores, 5); int maxScore = findMax(scores, 5); cout << "平均分:" << avg << endl; cout << "最高分:" << maxScore << endl; return 0; }
💡 重要知识点:
• 数组作为参数传递的是地址,不是副本
• 函数内修改数组会影响原数组
• 需要同时传递数组和大小
• 这是C++中处理数组的标准方式

数组的实际应用场景

一维数组在实际编程中有广泛应用:

  • 📊 数据统计:存储和分析大量数据
  • 🎮 游戏开发:存储玩家分数、生命值等
  • 📱 通讯录:存储联系人信息列表
  • 🌡️ 传感器数据:记录温度、湿度等历史数据
  • 💰 财务报表:存储每月的收支数据
  • 🎵 音频处理:存储声音采样数据

性能优化技巧

// 技巧1:提前退出循环 for (int i = 0; i < n; i++) { if (found) break; // 找到后立即退出 } // 技巧2:减少重复计算 int sum = 0; for (int i = 0; i < n; i++) { sum += arr[i]; // 只遍历一次 } double avg = (double)sum / n; // 技巧3:使用常量代替魔法数字 const int MAX_SIZE = 100; int arr[MAX_SIZE];

📝 实战练习

📝 理解测试

以下代码的输出是什么?

#include <iostream> using namespace std; int main() { int arr[5] = {10, 20, 30, 40, 50}; int sum = 0; for (int i = 0; i < 5; i += 2) { sum += arr[i]; } cout << sum << endl; return 0; }
选择答案查看解析...
💻 综合挑战

题目:创建一个程序,实现学生成绩管理系统。功能包括:输入成绩、显示所有成绩、计算平均分、找出最高分和最低分。

输入人数后点击"生成完整代码"...