5 数组

5.1 概述

数组就是一个集合,里面存放了相同类型的数据元素

  • **特点1:**数组中每个数据元素都是相同的数据类型
  • **特点2:**数组是连续的内存位置组成的

5.2 一维数组

5.2.1 一维数组的定义方式:

一维数组有三种定义方式:

  1. 数据类型 数组名[ 数组长度 ]
  2. 数据类型 数组名[ 数组长度 ]={ 值1,值2,…}
  3. 数据类型 数组名[]={ 值1,值2,…}

示例1:

int main()
{
    // 1. `数据类型 数组名[ 数组长度 ]`
    int arr[5];
    arr[0] = 10;
    arr[1] = 20;
    arr[2] = 30;
    arr[3] = 40;
    arr[4] = 50;
    int a = 3;
    cout << arr[3] << endl;//这个访问的是 40 
    cout << arr[ a ] << endl; //数组的下标可以通过变量来索引
    system("pause");
    return(0);  
}

示例2:

int main()
{
    //2.数据类型 数组名[ 数组长度 ]={ 值1,值2,…}
    int arr2[5] = {10,20,30,40,50};
    for (int i = 0; i < 5; i++) // i < 5 中,5表示数组长度
    {
        cout << arr2[i] << endl;
    }
    //若初始没有补齐数据,会用0来填充空余数据
    system("pause");
    return(0);  
}

示例3:

int main()
{
    //3.数据类型 数组名[]={ 值1,值2,…}
    //定义数组时必须要给定初始长度
    int arr3[] = {1,1,4,5,1,4};
    for (int i = 0; i < 6; i++)
    {
        cout << arr3[i]<<endl;
    }
    system("pause");
    return(0);  
}
  • 数组中的数据是从0开始标记(索引)下标
  • 我们可以通过下标来访问数组中的元素

5.2.2 一维数组数组名

用途:

  1. 可以统计整个数组在内存中所占的长度
  2. 可以获取数组在内存中的首地址

对1sizeof(数组名)

我们可以用 `sizeof(arr)/sizeof(arr[0])来获取内存的长度

对2:cout << arr <<endl;

一般该地址为16进制地址

int main()
{
    //1。查询数组所占内存大小
    int arr[6]={1,1,4,5,1,4};
    cout << "数组大小为"<< sizeof(arr)<<endl;
    cout << "数组长度为"<< sizeof(arr)/sizeof(arr[0])<<endl;
    //2.查看首地址
    cout <<"内存地址"<< arr << endl;//16进制
    cout << (long long)arr <<endl;//强转10进制
    cout << &arr[0]<<endl;//数组中某个元素的内存地址
    cout << (long long)&arr[0] <<endl;//数组中某个元素的10进制内存地址
    //使用 long long 包容16进制精度问题
    cout << &arr[1]<<endl;//第二个元素位置
    cout << (long long)&arr[1] <<endl;//10进制
    //第二个与第一个相差4字节
    //数组名是常量,不能修改赋值
    system("pause");
    return(0);  
}

练习案例1:

  • 在一个数组中记录了5个数据,arr[5] ={10,30,20,70,60}

  • 找出这个数组中最大数

int main()
{
    int arr[5]= {10,30,60,40,20};
    int max = 0; //假设某一最大值
    for (int i = 0; i < 5; i++)//访问数组中的每一个数
    {
        if (arr[i] > arr[max]) //比较假设值和访问值大小
        {
            max = i ; //若大于,则替换假设最大值
        }
    }
    //循环结束时,最大值以确定
    cout << "最大的数是" << arr[max]<<endl; //输出
    
    system("pause");
    return(0);  
}

Note

在上面代码中,for循环内部也可以使用三目运算来找最大值

max = (arr[max] > arr[i] ? max : i ); //使用三目运算符


**练习案例2:**数组元素逆置

  • 声明一个5个元素的数组,并将其逆置
  • 示例 : 原数组 {1,3,4,2,3} 输出{3,2,4,3,1}
  • 输出逆置
int main()
{
    int arr[5] = {1,3,4,2,3};
    for (int i = 0; i < 5; i++)
    {
        cout << arr[4-i] ; 
    }
    cout << endl;
 
    system("pause");
    return(0);  
}
  • 创立逆置数组
int main()
{
    int arr[5] = {1,3,4,2,3};
    int arrt[5];
    int t; //建立逆置变量
    for (int i = 0; i < 5; i++) 
    {
        t = (sizeof(arr)/sizeof(arr[0]))-1-i; //实现逆置变量
        arrt[i] = arr[t]; //实现原数组向逆置数组的赋值
    }
    //逆置数组建立完成,以下为检查
    for (int i2 = 0; i2 < 5; i2++)
    {
        cout << arrt[i2] <<endl;
    }
    
    system("pause");
    return(0);
}
  • 原数组的逆置
int main()
{
    int arr[5] = {1,3,4,2,3};
    int sta = 0;
    int end = sizeof(arr)/sizeof(arr[0])-1;
    int temp = 0;
    //核心
    for ( ; sta < end ; )       //当起始值位置大于末尾值位置时停止
    {
        temp = arr[sta];        //初始值赋值至临时内存
        arr[sta] = arr[end];    //末尾值赋值至初始值
        arr[end] = temp;        //初始值(临时)赋值至末尾值
        sta++;                  //初始值后移一位
        end--;                  //末尾值前移一位
    }
    //数组倒置结束
    for (int i2 = 0; i2 < 5; i2++)
    {
        cout << arr[i2]<<endl;
    }
    
    system("pause");
    return(0);
}

5.2.3 冒泡排序

**作用:**最常用的排序算法,对数组内的元素进行排序

  1. 比较相邻的元素,如果第一个比第二个大,就交换他们
  2. 对每一对相邻元素做同样工作,执行完毕后,找到第一个最大值
  3. 重复以上步骤,每次比较次数-1,直到不需要比较

示例: 将数组{4,2,3,0,5,7,1,3,9}升序排列

int main()
{
    int arr[9] = {4,2,3,0,5,7,1,3,9};
    for (int i = 0; i < (sizeof(arr)/sizeof(arr[0])-1); i++)//排序的总轮数=元素个数-1
    {  
        for (int j = 0; j <(sizeof(arr)/sizeof(arr[0])-1)-i ; j++) //每轮排序的次数 = 元素个数 -1 -当前轮数
        {
            if (arr[j] > arr[j+1] ) //判断相邻的两个数的大小
            {
                //实现交换
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    //输出验证
    for (int i2 = 0; i2 < 9; i2++)
    {
        cout << arr[i2]<<endl;
    }
    
    system("pause");
    return(0);
}
#include<bits/stdc++.h>
using namespace std;
 
int main()
{
	int a,b,t;
    int m =0; 
    int arr[7];
    for (int i = 0; i < 7; i++)
    {
        cin >> a >> b;
        int k =a +b;
        arr[i] = k; //将获得的数据记入数组
    }
     //对数组遍历,找出最大的那个数
    for (int j = 0; j < 7; j++) //假设一个最大值 arr[0],让arr[0]和下一个数比较,若大于,则将m赋值为j
    {
        if (arr[m] < arr[j]) 
        {
            m = j; 
            t = arr[j];
        }
    }
    if ( t > 8)
    {
        cout << m+1 <<endl;
    }
    else
    {
        cout << 0 <<endl;
    }
    
    system("pause");
    return(0);
}

5.3 二维数组

5.3.1 二维数组的定义方式:

  • 数据类型 + 数组名[行数][列数];
  • 数据类型 + 数组名[行数][列数] = {数据1,数据2},{数据3,数据4};[^2]
  • 数据类型 + 数组名[行数][列数] = {数据1,数据2,数据3,数据4};
  • 数据类型 + 数组名[][列数] = {数据1,数据2,数据3,数据4};
  • 第三和第四组会自动区分行列数(即从第一个数据开始计数,记到列数自动换行)

5.3.2 二维数组的赋值方式

  • arr[0][0] = 元素;
  • arr[0][1] = 元素;
  • ……

如何输出一个二维数组?

写一个嵌套循环,外层打印行数,内层打印列数

for (int i = 0;i < count ; i++)
{
    for(int j = 0;j < count ; j++)
    {
        cout << arr[i][j];
    }
    cout << endl;
}

Note

  • 直观表示一个二维数组 :int arr[3][3];
列\行0列1列2列
0行arr[0][0]arr[0][1]arr[0][2]
1行arr[1][0]arr[1][1]arr[1][2]
2行arr[2][0]arr[2][1]arr[2][2]

行列式行列式,先行后列

5.3.3 二维数组数组名

  • 查看二维数组所占内存空间
  • 获取二维数组首地址
  • 具体如下
int main()
{
    int arr[3][3] =
    {
        {1,1,4},
        {5,1,4}
    };
    //1.查看占用内存空间大小
    cout << sizeof(arr) <<endl; // out : 36 (6*6)
    cout << sizeof(arr[0][0]) <<" "<<sizeof(arr[0])<<endl; //out : 4 12(单个元素 第一行)
    //我们可以通过以上数据获得行数与列数
    sizeof(arr)/sizeof(arr[0]); //列数
    sizeof(arr[0])/sizeof(arr[0][0]); //列数
    
    //2.查看首地址
    cout << (long long)arr <<endl;  //out : 6422000
    cout << (long long)arr[0] <<endl; //二维数组地址与arr[0][0]首地址重合
    cout << (long long)arr[1] <<endl; //out : 6422012 差12(3*4)
    cout << (long long)&arr[0][0] <<endl; //二维数组地址与arr[0][0]首地址重合
    cout << (long long)&arr[0][1] <<endl; //out : 6422004 与[0][0]差4
 
    system("pause");
    return(0);
}

5.3.3 二维数组应用案例

考试成绩统计

  • 有三名同学(A,B,C),在一次考试中成绩分别如下,请输出三名同学的总成绩
语文数学英语
A100100100
B9050100
C607080
int main()
{
    
    int arr[3][3] =
    {
        {100,100,100},
        {90,50,100},
        {60,70,80}
    };
    
    for (int i = 0; i < 3; i++)
    {
        int temp = 0;
        for (int j = 0; j < 3; j++)
        {
            temp += arr[i][j];
        }
        cout << temp <<endl;
    }
    
    system("pause");
    return(0);
}

5.3.4 二维数组排序

  • 核心思路:冒泡排序
int main()
{
    int l,m;
    cin >> l >> m;
    int arr[m][2];
    for (size_t i = 0; i < m; i++)
    {
        for (size_t j= 0; j < 2; j++)
        {
          cin >> arr[i][j];
        } 
    }
 
    for (size_t i2 = 0; i2 < m-1; i2++)
    {
        for (size_t j = 0; j < m-i2-1; j++)
        {
            if (arr[j][0] > arr[j+1][0])
            {
                int temp1 = arr[j][0];
                int temp2 = arr[j][1];
                arr[j][0] = arr[j+1][0];
                arr[j][1] = arr[j+1][1];
                arr[j+1][0] = temp1;
                arr[j+1][1] = temp2;
            }
        }
    }
 
    for (size_t i = 0; i < m; i++)
    {
        for (size_t ij = 0; ij < 2; ij++)
        {
            cout << arr[i][ij]<<" ";
        }
        cout <<endl;
    }
       
    
    return 0;
}