C语言基础——数组



一. 一维数组的定义与引用:
#include <stdio.h>
int main( void )
{
    int a[10]; // 数组的定义,就是变量的声明再加一个中括号,里面有一个确定的整数常数
              // 上面的整数常数就表示这个数组共有多少个可用的元素,10就是有10个,99就是99个
    int n;
    for(n=0; n<10; n++)// a[0]=0,a[1]=1,a[2]=2,..........
    {
        a[n]=n; // 数组的引用,也是像普通变量一样地使用,只是中括号号内可以换成任何整数表达式
    }

    for(n=0; n<10; n++) // 输出各元素的值
    {
        printf("%d,", a[n]);
    }
    return 0;
}

特别注意:
int a[10]; 这是声明了10个元素的数组,下标从0-9共10个。
这样声明时千万不要写类似a[10]=1;这样的语句,否则无法预料会发生什么后果

数组的意义:如果你需要多个连续相关的变量的时候你还会int a1,a2,a3,a4,......;这样写代码么?

#include <stdio.h>
int main( void ) // 10个数中找出最大值
{
    int a[10];
    int n;
    int nMax; // 这个变量记录最大值
    printf("输入10个数,中间用空行或者空格分隔:");
    for(n=0; n<10; n++) // 用循环输入10个数
    {
        scanf("%d", &a[n]);// 引用
    }

    nMax = a[0];        // 假设下标为0的最大
    for(n=1; n<10; n++) // 然后从下标为1的元素开始找
    {
        if(a[n]>nMax)  // 如果有更大的数
        {
            nMax = a[n];// 就记录下这个数
        }
    }

    printf("最大的数是%d\n", nMax);
    return 0;
}


二. 一维数组应用——选择排序:
#include <stdio.h>
int main( void ) // 选择排序
{
    int a[10];
    int n;
    printf("输入10个数,中间用空行或者空格分隔:");
    for(n=0; n<10; n++) // 用循环输入10个数
    {
        scanf("%d", &a[n]);// 引用
    }

    for(n=0; n<10; n++)// 从下标为0的元素开始
    {
        int nMin = n;
        for(int k=n+1; k<10; k++)// 从下标为n的后面找出比a[n]要小的元素
        {
            if(a[nMin]>a[k])// 如果找到了
            {
                nMin = k;  // 记录下那个元素的下标
            }
        }//这个循环结束以后a[n]里就是从a[n]到a[10]里最小的,就是把10个数里找出最小的放到最前
        if(nMin != n)  // 如果nMin和n不相等就交换
        {
            int t=a[n]; //交换,这里的交换要借助第三个变量
            a[n]=a[k];  //不能直接写a[n]=a[k];a[k]=a[n];
            a[k]=t;    //你想想这是为什么
        }
    }//最小的放a[0],次小的放a[1],第三小的放a[2],等等,最后就完成排序,从小到大

    for(n=0; n<10; n++) // 用循环输入10个数
    {
        printf("%d", a[n]);// 输出排序结果
    }
    return 0;
}

简单的来说,选择排序就是找出一个序列里的最小的数,放到最边上
然后对剩下的数也照样处理,剩下的数中找出的必然是次小的数。余此类推。

4 5 6 1 9 7 2 8 3 0  找最小的放最左边得到:
0 5 6 1 9 7 2 8 3 4  已经确定最小的不动,从第二个数开始找最小的做一样操作:
0 1 6 5 9 7 2 8 3 4  下同:
0 1 2 5 9 7 6 8 3 4
0 1 2 3 9 7 6 8 5 4
0 1 2 3 4 7 6 8 5 9



三. 多维数组的定义与引用:
#include <stdio.h>
int main( void )
{
    int a[5][3]; // 二维数组的定义,就是一维数组的声明再加一个中括号,多维也雷同
    int m,n;
    for(m=0; m<5; n++)// n维数组一般要用n层循环来赋初值,输出的时候也同样
    {
        for(n=0; n<3; n++)
        {
            a[m][n] = m+n;
        }
    }
    for(m=0; m<5; n++) // 输出各元素的值
    {
        for(n=0; n<3; n++)
        {
            printf("%d ", a[m][n]);
        }
        printf("\n");
    }
    return 0;
}



四. 字符数组:
字符数组就是常说的字符串,其实和一维整数数组几乎一样,只是保存的内容是字符,就是类型不一样
#include <stdio.h>
int main( void )
{
    char s[100]; // 字符数组的定义,就是类型名字不一样
    int n;
    scanf("%s", s);// 字符串的输入与普通的整数类型不同的地方,数组名字前面不需要加&
    //或者可以使用 gets(s); 不同点是scanf遇到空格就截断,gets是得到一个独立的行,包括空格

    printf("%s\n", s);// 输出也发生相应变化,%s标志专用于字符串输出

    for(n=0; a[n] != '\0'; n++) // 用自己的循环输出,串的结尾必须要有一个'\0'字符表示结束
    {                          // 同时'\0'字符也作为循环结束的标志
        printf("%c", a[n]);// 单字符输出,只输出a[n]所表示的字符
    }
    printf("\n");
    return 0;
}