当前位置:   article > 正文

[C++基础学习-04]----C++数组详解

[C++基础学习-04]----C++数组详解

前言

        在C++中,数组是一种用来存储相同类型元素的数据结构。一维数组是最简单的数组形式,它由一系列按顺序存储的元素组成。二维数组则是由一维数组构成的数组,可以看作是一堆一维数组堆叠在一起形成的矩阵。

正文

01-数组简介

         一维数组和二维数组是在编程中常用的数据结构,它们具有不同的特点和适用场景。

       1、一维数组

        一维数组是一种线性结构,它由一系列按顺序存储的元素组成;通常用于存储一组相同类型的数据,例如整数、浮点数、字符等;访问速度比较快,通过数组下标即可快速定位和访问特定元素;适用于存储列表、向量、序列等线性数据。

        2、二维数组

        二维数组是一种表格状的结构,它由一维数组组成的数组,用于存储表格数据或矩阵数据;通常用于存储二维结构的数据,例如游戏地图、图像数据、二维表格等;访问方式需要使用两个下标(行和列)来访问元素,适用于表示二维关系的数据;可以看作是一系列一维数组按照特定方式排列组成的数据结构。

        3、作用

        一维数组常用于存储一组相关联的数据,例如存储学生成绩、温度记录、用户ID等。

        二维数组常用于表示二维空间上的数据,例如表示地图、图片、矩阵等。

        一维数组和二维数组在算法实现、数据处理、图形处理、矩阵运算等方面起着重要作用。

        通过合理使用一维数组和二维数组,可以更高效地组织和管理数据,方便进行各种数据处理和分析操作。

02-一维数组定义

         一维数组的定义和具体代码解释如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. //数组 数组中每个数据元素都是相同的数据类型
  6. //三种表示形式
  7. //1、数据类型 数组名[数组长度]
  8. //2、数据类型 数组名[数组长度] = {值1、值2、....}
  9. //3、数据类型 数组名[ ] = {值1、值2、....}
  10. //1、数据类型 数组名[数组长度]
  11. int arr[5];//数组名用arr表示,长度为5个,数组下标从0开始
  12. //给数组中的元素进行赋值
  13. //牢记:数组元素的下标是从0开始索引的
  14. arr[0] = 10;
  15. arr[1] = 20;
  16. arr[2] = 30;
  17. arr[3] = 40;
  18. arr[4] = 50;
  19. //访问数据元素
  20. //cout << arr[0] << endl;
  21. //cout << arr[1] << endl;
  22. //cout << arr[2] << endl;
  23. //cout << arr[3] << endl;
  24. //cout << arr[4] << endl;
  25. //循环方式输出数组中的数据
  26. //for (int i = 0; i < 5; i++)
  27. //{
  28. // cout << arr[i] << endl;
  29. //}
  30. //2、数据类型 数组名[数组长度] = {值1、值2、....}
  31. //如果定义的数组长度为5个,但是后面赋值少于5个,则其余的自动取0
  32. int arr2[5] = { 10,20,30,40,50 };
  33. //for (int j = 0; j < 5; j++)
  34. //{
  35. // cout << arr2[j] << endl;
  36. //}
  37. //3、数据类型 数组名[ ] = {值1、值2、....}
  38. int arr3[] = { 10,20,30,40 };
  39. for (int j = 0; j < 4; j++)
  40. {
  41. cout << arr3[j] << endl;
  42. }
  43. system("pause");
  44. return 0;
  45. }

03-数组名

         数组名的定义和具体代码解释如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. //一维数组名称的用途
  6. //1、可以统计整个数组在内存中的长度
  7. int arr[5] = { 10,20,30,40,50 };
  8. cout << "数组在内存中所占的长度:" << sizeof(arr) << endl;
  9. cout << "第一个数据所占内存为:" << sizeof(arr[0]) << endl;
  10. cout << "数组中元素的个数为:" << sizeof(arr) / sizeof(arr[0]) << endl;
  11. //2、可以查看数组的首地址
  12. cout << "数组的首地址为:"<<(int)arr << endl;//加int,可将十六进制强制转换为十进制
  13. //也可查看第一个数据的首地址
  14. cout << "第一个数据的首地址为:" << (int)&arr[0] << endl;//第一个数据的首地址和数组的首地址是相同的
  15. cout << "第二个数据的首地址为:" << (int)&arr[1]<< endl;
  16. //数组名是一个常量,不可以再进行赋值操作
  17. // 常量不可进行修改,否则会出现表达式不可进行进行修改的左值
  18. //arr = 100;会出现报错
  19. system("pause");
  20. return 0;
  21. }

04-一维数组案例

         一维数组的案例,三只小猪称体重具体代码解释如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. //五只小猪比较体重
  6. //1、五只小猪的体重放入一个数组中
  7. int arr[5] = { 300,350,200,400,250 };
  8. //2、先假设一个最大值
  9. int max = 0;
  10. int max_pig = 0;
  11. for (int i = 0; i < 5;i++)
  12. {
  13. //cout << arr[i] << endl;
  14. if (arr[i] > max_pig)
  15. {
  16. max_pig = arr[i];
  17. }
  18. //cout << max_pig << endl; 如果在里面输出的话,不会跳出for循环,前面四个值也会进行输出,并且,不会比较250
  19. }
  20. cout << max_pig << endl;
  21. // for (int i = 0; i < 5; i++)
  22. // {
  23. // if (arr[i] > max)
  24. // //如果访问的数组中的元素比我认定的还要大,更新最大值,这是一个简单的算法
  25. // {
  26. // max = arr[i];
  27. // }
  28. // }
  29. // //要在循环之外输出最大值
  30. // cout<<max<<endl;
  31. system("pause");
  32. return 0;
  33. }

05-一维数组之元素互换位置

         具体代码和解释如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // 数组逆置
  6. // 1、创建数组
  7. int arr[5] = { 1,2,3,4,5 };
  8. cout << "数组逆置前的顺序: "<<endl;
  9. for (int i = 0; i < 5;i++)
  10. {
  11. cout << arr[i] << endl;
  12. }
  13. // 2、数组逆置开始
  14. // 2.1 首先记录起始下表
  15. // 2.2 记录结束下表位置
  16. // 2.3 起始下表和结束下表的元素进行互换
  17. // 2.4 起始位置++,结束位置--
  18. // 2.5 循环执行2.1操作,直到起始位置>=结束位置
  19. int start = 0; // 这里应该记录下表,而不应该直接记录数值
  20. // int temp = arr[start]; //这里就代表了将数组arr的第一个值存在了temp里
  21. int end = sizeof(arr) / sizeof(arr[0]) - 1; // 这里使用sizeof计算出了数组的总长度,然后将下表赋给end
  22. // 做一个while循环操作
  23. while(start<end)
  24. {
  25. // 实现元素互换
  26. int temp = arr[start];
  27. arr[start] = arr[end];
  28. arr[end] = temp;
  29. // 实现下表更新
  30. start++;
  31. end--;
  32. }
  33. // 打印输出互换之后的数据
  34. cout << "数组逆置后的顺序:" << endl;
  35. for (int j = 0; j < 5;j++)
  36. {
  37. cout << arr[j] << endl;
  38. }
  39. system("pause");
  40. return 0;
  41. }

06-数组案例之冒泡排序

         具体代码和解释以及运行结果如下:

  1. #include <iostream>
  2. using namespace std;
  3. void HeadAdjust(int Array[], int k, int len) {
  4. int temp = Array[k];// 最好别用哨兵的方法,直接找一个变量存储
  5. //这里一开始让i=根节点的左孩子位置,进入循环
  6. for (int i = 2 * k; i <= len; i *= 2) {
  7. //下面的这个循环就是在做一个元素下坠的操作,首先判断左孩子(i)是否小于右孩子11
  8. //若是小于,则i++,此时i指向右孩子,若是大于,不满足,继续指向左孩子
  9. if (i < len && Array[i] < Array[i + 1]) { i++; }
  10. //这里如果节点大于左孩子或者右孩子,其实这里就比较了一个,因为左孩子和右孩子的比较
  11. //在上一步条件语句中已经执行,这里比较之后,如果满足,证明节点值大,直接退出循环即可
  12. if (temp >= Array[i]) { break; }
  13. //若是不满足,则将孩子与节点位置互换,并且同时k向前移动,占据i的位置
  14. //这里如果还没有结束,可以继续循环,此时k又变成了下一个节点,继续上述步骤
  15. else { Array[k] = Array[i]; k = i; }
  16. }
  17. //当i > len时,全部执行完毕,退出循环,此时再将在哨兵位置保存的值赋给Array[k]
  18. Array[k] = temp;
  19. }
  20. void swap(int &a, int &b) {
  21. int temp = a;
  22. a = b;
  23. b = temp;
  24. }
  25. void Heapsort(int Array[], int len) {
  26. for (int i = len / 2 - 1; i >= 0; i--) {
  27. HeadAdjust(Array, i, len);
  28. }
  29. //用1en-1是因为对数组来说是从0下标开始计数
  30. for (int i = len - 1; i > 0; i--) {
  31. swap(Array[i],Array[0]);
  32. //如果不封装,直接交换也可以
  33. // int temp = Array[i];
  34. // Array[i] = Array[0];
  35. // Array[0] = temp;
  36. HeadAdjust(Array, 0, i - 1);
  37. }
  38. }
  39. int main()
  40. {
  41. int arr[9] = { 4,2,8,0,5,7,1,9,3 };
  42. int len = sizeof(arr) / sizeof(arr[0]);
  43. cout << "排序前数据:" << endl;
  44. for (int i = 0; i < len;i++)
  45. {
  46. cout << arr[i] << " ";
  47. }
  48. cout << endl;
  49. Heapsort(arr, len);
  50. // 排序后结果
  51. cout << "排序后数据:" << endl;
  52. for (int i = 0; i < len; i++)
  53. {
  54. cout << arr[i] << " ";
  55. }
  56. cout << endl;
  57. system("pause");
  58. return 0;
  59. }

07-二维数组定义

         具体代码和解释如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // 二维数组定义方式
  6. /*
  7. 1. 数据类型 数组名[ 行数 ][ 列数 ];
  8. 2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
  9. 3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
  10. 4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
  11. 建议:以上4种定义方式,利用==第二种更加直观,提高代码的可读性
  12. */
  13. //1. 数据类型 数组名[ 行数 ][ 列数 ];
  14. int arr[2][3];
  15. // 赋值
  16. arr[0][0] = 25; //第0行第1列的数据为25
  17. arr[0][1] = 26;
  18. arr[0][2] = 27;
  19. arr[1][0] = 28;
  20. arr[1][1] = 29;
  21. arr[1][2] = 30;
  22. // 使用嵌套循环进行打印数组
  23. // 外层循环打印行数,内层循环打印列数
  24. // for (int i = 0; i < 2; i++)
  25. // {
  26. // for (int j = 0; j < 3;j++)
  27. // {
  28. // cout << arr[i][j] << endl;
  29. // }
  30. // }
  31. //2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } }; 推荐
  32. int arr2[2][3] = { {1,2,3},{4,5,6} }; // 这样显示更加直观
  33. for (int i = 0; i < 2; i++)
  34. {
  35. for (int j = 0; j < 3; j++)
  36. {
  37. cout << arr2[i][j] << " ";
  38. }
  39. cout << endl;
  40. }
  41. //方式3
  42. //数据类型 数组名[行数][列数] = { 数据1,数据2 ,数据3,数据4 };
  43. int arr3[2][3] = { 1,2,3,4,5,6 };
  44. //方式4
  45. //数据类型 数组名[][列数] = { 数据1,数据2 ,数据3,数据4 };
  46. int arr4[][3] = { 1,2,3,4,5,6 };
  47. system("pause");
  48. return 0;
  49. }

08-二维数组之数组名

         具体代码和解释如下:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // 二维数组名称的用途
  6. // 1、可以查看占用内存空间大小
  7. int arr[2][3] =
  8. {
  9. {1,2,3},
  10. {4,5,5}
  11. };
  12. cout << "二维数组占用内存空间:" << sizeof(arr) << endl; // 24 6*4
  13. cout << "二维数组第一行所占内存:" << sizeof(arr[0]) << endl;
  14. cout << "二维数组第一个元素所占内存:" << sizeof(arr[0][0]) << endl;
  15. // 通过总的二维数组所占内存空间,以及每一行所占内存空间,可以计算得到该数组共有多少行
  16. cout << "二维数组的总行数:" << sizeof(arr) / sizeof(arr[0]) << endl;
  17. // 通过总的二维数组每一行所占内存空间,以及每个元素所占内存空间,可以计算得到该数组每一行有多少个元素
  18. cout << "二维数组每一行元素个数或者可以说有多少列:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
  19. // 2、二位数组的首地址
  20. cout << "二维数组的首地址为:" << (int)arr << endl;
  21. cout << "二维数组第一行的首地址为:" << (int)arr[0] << endl;
  22. // 当访问具体元素的地址时,一定不要忘记加上取地址的符号
  23. cout << "二维数组第一个元素的首地址为:" << (int)&arr[0][0] << endl;
  24. cout << "二维数组第二行的首地址为:" << (int)arr[1] << endl;
  25. system("pause");
  26. return 0;
  27. }

09-二维数组案例成绩统计

         具体代码和解释如下:

  1. #include <iostream>
  2. using namespace std;
  3. #include <string>
  4. int main()
  5. {
  6. // 二维数组的案例-考试成绩统计
  7. int scores[3][3] =
  8. {
  9. { 100,100,100 },
  10. { 90, 50, 100 },
  11. { 60, 70, 80}
  12. };
  13. string names[3] = { "张三","李四","王五" }; //这相当于又定义了一个名字的一维数组
  14. // 2、统计每个学生分数总分
  15. for (int i = 0; i < 3;i++)
  16. {
  17. int sum = 0;
  18. for (int j = 0; j < 3;j++ )
  19. {
  20. sum += scores[i][j];
  21. // cout << num << " ";
  22. }
  23. cout<< names[i] <<"的总分为:"<<sum<<endl;
  24. }
  25. system("pause");
  26. return 0;
  27. }

总结

         一维数组是一列元素的集合,而二维数组是由多行多列元素组成的矩阵。在C++中,使用数组可以方便地存储和处理大量数据,同时可以通过下标访问数组元素来实现对数组的操作和处理。一维数组和二维数组是编程中常用的数据结构,它们具有各自的特点和适用场景,可以帮助程序员有效地处理各种类型的数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/536382
推荐阅读
相关标签
  

闽ICP备14008679号