数组

数组

  [注] 使用数组的目的,是为了方便地批量定义变量

  [前言] c语言中提供了数组,可以实现批量地定义相同类型的变量,在我们需要多个相同类型的变量时,可以选择使用数组

  数组分为两类:一维数组,二维数组

 

一、一维数组

  一.[一维数组的定义]

  类型符 数组名[元素个数];

  类型符,可以是int,char,double等等这些基本数据类型,类型符决定了数组中多个变量的类型

  数组名,数组名必须符合标识符的命名规则

  元素个数,表示数组一次性定义的变量的个数(数组中包含的元素个数)

     例如:int array[4];

  二.[一维数组---元素表示]

  int array[4];

  [注] 数组中元素的下标是从0开始的

  array[0]

  三.[一维数组的特点]

  <1>数组中每个元素的类型都相同

  <2>数组中每个元素是由数组名和下标唯一确定的

  <3>数组元素下标从0开始,最大到元素个数减1

  <4>数组元素之间是紧密相连的

  盖住数组名,剩下的部分就是数组的类型

  数组所占总内存空间,是由数组的类型决定的

  四.[一维数组---初始化]

  数组的初始化的目的,是为了让数组中每个元素都有一个确定的值

//完全初始化
int array[4]={1,2,3,4};
//部分初始化
int array[4]={1,2};//编译器会优先取初始化列表中的值给数组前面的元素赋值,那些未显示初始化的元素默认初始化为0
//数组清空
int array[400]={};

  五.[一维数组---赋值]  

//一维数组---赋值
int array[4]={1,2,3,4};
//数组不能整体赋值,只能单个元素单独赋值
array2[0]=10;
array2[1]=array[1];
//通过循环,依次读取数据给数组的每个元素赋值
for (int i=0; i<4; i++)
{
    scanf("%d",&array[i]);
}

  六.[数组下标问题]

  数组元素的下标是从0开始的

  <1>数组下标

    数组定义时,数组的下标表示的是数组中元素的个数

  <2>数组元素的下标

    使用数组元素时,下标表示的是元素在数组中的位置

  <3>数组下标越界问题

    数组下标使用的合法范围为:0~元素个数-1

    数组下标越界可能会导致程序终止

  [注] 在程序运行过程中如果发生以下报错信息,一般都是数组使用越界导致的---Thread 1:signal SIGABRT

  七.[数组排序]

  int array[10]={7,2,6,3,4,9,5,1,8,10};

  [冒泡法]

  思想:<1>数组中待排序数,从左往右,依次取两两相邻的元素进行比较,前一个元素大于后一个元素,就交换这两个元素

      <2>第一趟比较完毕时,所有参与排序元素中最大值放在所有元素的结尾

      <3>重复以上步骤,直到所有元素排序完毕

//外层循环,控制比较的趟数
for (int i=1; i<10; i++)
{
    //内层循环,控制具体某一趟的比较次数
    for (int j=0; j<10-i; j++)
    {
        if (array[j]<array[j+1])
        {
            //交换相邻的两个元素
            //交换的主角是array[j]和array[j+1]
            int temp;
            temp=array[j];
            array[j]=array[j+1];
            array[j+1]=temp;
        }
    }
}
//打印数组中的每个元素
for(int i=0;i<10;i++)
{
    printf("%d ",array[i]);
}

  [选择法]

  思想:<1>取数组中未排序元素中最左边的元素,依次和右边其他元素进行比较,如果前一个比后一个大,交换两个元素

      <2>第一趟比较完毕时,所有参与排序元素中最小元素,放在所有参与排序元素的最左边

      <3>重复以上步骤,直到所有元素排序完毕

//外层循环,控制比较的趟数
for (int i=0; i<9; i++)
{
    //内层循环,控制具体某一趟的比较次数
    for (int j=i+1; j<10; j++)
    {
        if (array[i]>array[j])
        {
            //交换相邻的两个元素
            //交换的主角是array[i]和array[j]
            int temp;
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
        }
    }
}
//打印数组中的每个元素
for(int i=0;i<10;i++)
{
    printf("%d ",array[i]);
}

 

二、二维数组

  一.[二维数组的定义]

  类型符 数组名[元素个数][元素的元素个数];

  例子: int arr[4][4];//这是一个二维数组,这个二维数组具有4个元素,每个元素的类型是int[4] 

  二.[二维数组---元素表示]

   int arr[4][4]; 

  元素:arr[0],arr[1],arr[2],arr[3]

  第一个元素arr[0]

  第二个元素arr[1]

  第三个元素arr[2]

  第四个元素arr[3]

  十.[二维数组---初始化]

//完全初始化
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int array2[3][3] = {{1,2},{4,5,6},{}};
int array3[3][3] = {{},{},{}};
//部分初始化
int array4[3][3] = {{1,2}};

  十一.[其他]

  二维数组赋值

  数组不能整体赋值,只能单个元素单独赋值.

  array4[0] = array3[0];

  二维数组在使用过程中,数组元素下标不能越界访问.

 

三、练习

  1.将一个5元素数组中元素,相邻的两两相加,找出最大的组合;打印出是哪两个元素

int a[5],sum=0,b=0,x=0,y=0;
for (int i=0; i<5; i++)
{
    scanf("%d",&a[i]);
}
for (int i=0; i<4; i++)
{
    sum=a[i]+a[i+1];
    if (sum>b)
    {
        b=sum;
        x=a[i];
        y=a[i+1];
    }
}
printf("%d %d
",x,y);

  2.输入10个数,相邻的两个绝不相同。输出每个递增递减序列,并输出有多少个这种序列

    1 2 3 2 4 5 6 7 6  3

    1 2 3

    3 2

    2 4 5 6 7

    7 6 3

    总共:4

#include <stdio.h>

int main(int argc, const char * argv[])
{
    int a[10],n=1;
    for (int i=0; i<10; i++)
    {
        scanf("%d",&a[i]);
    }
    for (int i=1; i<9; i++)
    {
        if ((a[i-1]-a[i]<0&&a[i]-a[i+1]<0)||(a[i-1]-a[i]>0&&a[i]-a[i+1]>0))
        {
            printf("%d %d ",a[i-1],a[i]);
        }
        else
        {
            printf("%d %d
",a[i-1],a[i]);
            n++;
        }
    }
    printf("
总共:%d
",n);
    return 0;
}
原文地址:https://www.cnblogs.com/firstsky/p/5374921.html