Linux C学习第六天(数组)

//一维数组:
#include<stdio.h>
int main(int argc, char *argv[])
{
    /*  ******************************************************* *
    *  啥是数组
    *       int a[4];
    *  怎么用
    *  定义
    *  初始化
    *  赋值与引用
    *  遍历
    *  数组名含义
    *  排序
    *       冒泡
    *       选择
    *   字符数组与字符串
    *   ******************************************************* */

    /*  定义*************************************************** */
    //<存储类型>    <数据类型>  变量名;
    //<存储类型>    <元素数据类型>   数组名[元素个数] //数组的类型实际是由 元素数据类型 + [元素个数]组成
        //int a[5];
    //数组名符合标识符定义
    //数据类型用来说明元素的类型,数组的类型由元素类型+元素个数
    //数组元素的个数 定义时必须是常量或常量表达式

    //int i = 5;
    //i++;
    //int b[i]; //数组的大小在编译的时候确定,而变量在运行时才有值,

    #define   N  5
    int aa[N];
    


    int a[5];  //a实际可以看成 int [5]; 类型
    char a0[5];

    /*  初始化  
    *  定义的同时对变量或数组元素赋值 ************************* */
    int b[5 ] = {1, 3, 5, 7, 9, }; //全部初始化
    int bb[10] = {1, 3, 5, 7, }; //部分初始化,没有初始化的部分自动清0
    char bc[10] = {1, 65, 'B'}; // 部分初始化,没有初始化的部分自动清零(二进制0,即'\0')
    int bd[6] = {1, 3, 0, 0, 9, 11,};
    int bf[] = {1, 3,  9, 11};
    int be[100] = {
        [0] = 1,
        [1] = 3,
        [98] = 1,
        [99] = 3,
    }; //指定元素初始化,没有初始化的部分自动清零


    /*  赋值与引用  
     *  对数组的元素赋值求和取值  
    *   不可以对数组整体赋值,如果在初始化时没有值,后面只能通过单个赋值的方法进行赋值
    *   ********************************************************* */
    int  c[6];
    c[0] = 1;
    c[4] = 9, c[5] = 11; //对元素赋值,不会影响其他元素
    //c[6]  = 13; //数组不做越界检查,对于越界的元素访问可能造成不可以预知错误,越界可以读,尽量不要写
    int i;
    i = 0;
    c[i] = 9;
    scanf("%d", &c[0]);

    for (i=0; i<6; i++)
    {
        scanf("%d", &c[i]);  //int a0;  scanf("%d", &a0)
        printf("%d\n", c[i]);
    }

    int ca[6];  //[]数组定义固定格式
    ca[2] = 5;  //引用变量时, []是变址运算符 a[i] == *(a+i) == *(i+a) == i[a];
    2[ca] = 5;
    i = 3;
    ca[i] = 6;
    i[ca] = 6;

    /*  遍历  *************************************************** */
    int d[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
    for (i=0; i<10;  i++)
    {
        printf("%d\n", d[i]);
        printf("%d\n", d[9-i]);
    }

    for (i=9; i>=0; i--)
    {
        printf("%d\n", d[i]);
    }

    /*  数组名含义  *************************************************************************** *
     *  #define   N   5
     *  int a[N];
     *      1.代表整个数组:&a, sizeof(a)
     *          &a 得到整个数组的地址
     *          sizeof(a) 得到整个数组的字节大小 //20
     *
     *      2.代表数组第一个元素的地址 即 a==&a[0],是一个地址常量,不可以自加,不可以对数组名赋值
     *          sizeof(a+0); // 4, 此时代表地址,不代表整个数组,地址是4个字节
     *          a++; //error
     *          a = {1, 3, 5, 7, 9}; //不可以对数组名赋值,数组名是地址常量
     *          a[5] = {1, 3, 5, 7, 9,};//a[5]是元素,且还是个越界的元素,同样不是对整个数组赋值
     *  ***************************************************************************************** */ 
    int arr[5] = {1, 2, 3, 4, 5, };
    arr[0] = 2, arr[1] = 4, arr[2] = 6, arr[3] = 8, arr[4] = 10;
    return 0;

}

//最大值:
//V0.
#include<stdio.h>
#define  N   10
int main(int argc, char *argv[])
{
    int a[N] = {1, 3, 5, 9, 10, 222, 4, 6, 8, 7};
    int i;
    int max;

    max = a[0]; //假设 a[0]最大
    for (i=0; i<N; i++)
    {
        if (a[i]> max)
        {
            max = a[i];
        }
    }
    printf("max=%d\n", max);
}
//V1.
#include<stdio.h>
#define  N   10
int main(int argc, char *argv[])
{
    int a[N] = {1, 3, 5, 9, 10, 2, 4, 6, 8, 7};
    int i;
    int t;

    t = 0; //假设第一个是最小值
    for (i=0; i<N; i++)
    {
        if (a[t] < a[i])
        {
            t = i;
        }
    }
    printf("微臣已经找打最小值下标是:%d==>%d\n", t, a[t]);
    return 0;
}
//V2.
#include<stdio.h>
#define  N   10
int main(int argc, char *argv[])
{
    int a[N] = {7, 3, 5, 9, 10, 2, 4, 1, 8, 6};
    int i;

    for (i=0; i<N; i++)
    {
        if (a[i]> a[0])
        {
            int t;
            t = a[i];
            a[i] = a[0];
            a[0] = t;
        }
    }
    printf("%d\n", a[0]);
}
//V3.
#include<stdio.h>
#define  N  10
int main(int argc, char *argv[])
{
    int a[N] = {1, 5, 3, 9, 6, 7, 10, 2, 4, 8,};
    int j;

    for (j=0; N-1; j++)
    {
        if (a[j] > a[j+1])
        {
            int t;
            t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
        }
    }
    printf("%d\n", a[9]);
return 0;
}
//V4.
#include<stdio.h>
#define  N  10
int main(int argc, char *argv[])
{
    int a[10] = {1, 5, 3, 9, 6, 7, 10, 2, 4, 8,};
    int i;
    for (i=1; i<N; i++)
    {
        if (a[i-1]>a[i])
        {
            int t;
            t = a[i-1];
            a[i-1] = a[i];
            a[i] = t;
        }   
    }
    printf("%d\n", a[9]);
    return 0;
}
//冒泡排序:
//V1.
#include<stdio.h>
#define    N  10
/*  -->基本冒泡思想 */
int main(int argc, char *argv[])
{
    int a[N] = {5, 1, 3, 9, 10, 2, 4, 6, 8, 7};

    int i, j;

    for (i=0; i<N-1; i++) //内层循环每执行一次,就会排序好一个数,N个数,排序N-1次就够了,最后一个一定是最小值
    {
        for (j=0; j<N-1; j++) //两两比较,大的值放后面, N个数,比较N-1次, (i=0;j<N-1)正好N-1次
        {
            if(a[j] > a[j+1])
            {
                int t;
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }

    for (i=0; i<N; i++)
    {
        printf("%3d", a[i]);
    }
    printf("\n");
}
//V2.
#include<stdio.h>
#define    N  10
/* 优化冒泡排序 */
int main(int argc, char *argv[])
{
    int a[N] = {5, 8, 3, 9, 10, 6, 2, 4, 1, 7};

    int i, j;

    for (i=0; i<N-1; i++) //内层循环每执行一次,就会排序好一个数,N个数,排序N-1次就够了,最后一个一定是最小值
    {
        // i的值每加一次,说明已经有i个数排序好,还剩下N-i个数没排序,
        // 在N-i个数中两两比较找最大值,比较N-i-1次即可找到N-i个数中的最大值
        for (j=0; j<N-i-1; j++)
        {
            if(a[j] > a[j+1])
            {
                int t;
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
    for (i=0; i<N; i++)
    {
        printf("%-3d", a[i]);
    }
    printf("\n");
}
//V3.
#include<stdio.h>
#define  N   10
/*带标志位判断 的冒泡 */
int main(int argc, char *argv[])
{
    int a[N] = {5, 1, 3, 9, 10, 2, 4, 6, 8, 7};

    int i, j;

    for (i=0; i<N-1; i++) //内层循环每执行一次,就会排序好一个数,N个数,排序N-1次就够了,最后一个一定是最小值
    {
        // i的值每加一次,说明已经有i个数排序好,还剩下N-i个数没排序,
        // 在N-i个数中两两比较找最大值,比较N-i-1次即可找到N-i个数中的最大值
        for (j=0; j<N-i-1; j++)
        {
            if(a[j] > a[j+1])
            {
                int t;
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
}
void fun(void)
{
    int a[N] = {5, 1, 3, 9, 10, 2, 4, 6, 8, 7};
    int i, j;
    int flag;

    for (i=0; i<N-1; i++)
    {
        flag = 0;   //判断所有N-i数中,有没有交换,所以在之前将flag重新赋值为0
        for (j=0; j<N-i-1; j++)
        {
            if (a[j]>a[j+1])
            {
                int t;
                t     = a[j];
                a[j]  = a[j+1];
                a[j+1] = t;
                flag = 1; //在N-i个数中,发生任何一次交换,就就说明,还没排好
            }
        }
        if (0==flag) //如果N-i个数中,一次交换都没有发生,flag=1不会被执行,说明排序已经完成,提前扑街
        {
            break;
        }
    }    
}
//字符冒泡:
#include<stdio.h>
#define  N  10
int main(int argc, char *argv[])
{
    char a[N] = {'Z', 'B', 'D', 'a', 'c', 100, 'm', 'M', 'N', 'J'};
    int i,j;

    for (i=0; i<N; i++)
    {
        for (j=0; j<N-i-1; j++)
        {
            if (a[j]>a[j+1])
            {
                int t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
    printf("%s\n", a);
}
//选择排序:
//V0.
#include<stdio.h>
#define N   10
int main(int argc, char *argv[])
{
    int i, j;
    int a[N] = {7, 6, 5, 4, 3, 2, 1, 8, 9, 10};

    /* ************** 选择 ****************** */
    for (i=0; i<N-1; i++)
    {
        for (j=i+1; j<N; j++)
        {
            if (a[i]>a[j])  //if (a[j]>a[j+1])
            {
                int t;
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
    /* ************************************* */
    for (i=0; i<N; i++)
    {
        printf("%3d", a[i]);
    }
    printf("\n");
}
//V1.
#include<stdio.h>
#define  N  10
/* --> 选择排序  ****************** */
int main(int argc, char *argv[])
{
    int i, j;

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

    /* 选择的基本思想是将当前i指向的元素和后面每一个元素比较,然后将最小值放在i指向的位置
     * N个数排序N-1次即可                                                 ************* */
    for (i=0; i<N-1; i++)
    {
        //j从i后一个数(i+1)开始比较,一直比较到最后一个元素(所以j<N);比较的次数为  N-(i+1) ==N-i-1次
        for (j=i+1; j<N; j++)
        {
            if (a[i]>a[j])
            {
                int t;
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }

    return 0;
}
//V2.
#include<stdio.h>
#define  N  10
/* --> 存放下标的选择排序 */
int main(int argc, char *argv[])
{
    int i, j;
    int k;

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

    //k 用来存放最小值下标
    for (i=0; i<N-1; i++)
    {
        k = i; //假设i指向的数最小,
        for (j=i+1; j<N; j++)
        {
            if (a[k]>a[j])
            {
                k = j;  //原来j指向的数才小
            }
        }
        if (k != i)
        {
            int t;
            t = a[k];
            a[k] = a[i];
            a[i] = t;
        }
    }
    for (i=0; i<N; i++)
    {
        printf("%-3d", a[i]);
    }
    printf("\n");
}
//二维数组:
#include<stdio.h>
int main(int argc, char *argv[])
{
    /*定义
    *  <存储类型>  int a[行下标][列下标]   */
    int aa[3][4];
    int ab[4][3];
    /* 初始化  */
    int ba[3][4] = {{1, 3, 5, 7}, {2, 4, 6, 8,}, {9, 11, 13, 15,},};
    int ba1[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};

    int bb[3][4] = { 1, 3, 5, 7, 2, 4, 6, 8, 9, 11, 13, 15  };
    int bb1[4][3] = { 1, 3, 5, 7, 2, 4, 6, 8, 9, 11, 13, 15  };
    int bc[3][4] = {
        {1, 3, 5, 7},
        {2, 4, 6, 8},
        {9, 11, 13, 15},
    };
    int bd[3][4] = { 1, 3,
                    5, 7, 2, 4, 6, 8, 9,
                    11, 13, 15,
                   };

    int be[][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {9, 11, 13, 15},}; //可以省略一维下标
    int bf[][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {9, 11,       },}; //可以省略一维下标,

    int bg[][4] = { 1, 3, 5, 7, 2, 4, 6, 8, 9,   };//部分初始化,未初始化的部分为0

    int ca[3][4] = {1, 3, 5, 7, 9};   //从前向后初始化,部分初始化,未初始化为0
    int cb[3][4] = {{1, 3}, {5, 7}, {9 ,11}}; //对每一行的 前两个数初始化

    int cc[3][4] = {  //指定行初始化
                    [0] = {1, 3, 5, 7},
                    [1] = {1, 3, 5, 7},
                    [2] = {1, 3, 5, 7},
                   };

    int ccd[100][100] = {0}; //定义数组,里面全是0
    int cd[100][100] =   //指定元素初始化
    {
        [0][0] = 1,
        [0][1] = 2,
        [99][98] = 1,
        [99][99] = 2,
    };

    int ce[100][100] =  //先指定行,再指定行中的某一个
    {
        [0] = {
            [0] = 1,
            [1] = 2
        },

        [99] = {
            [0] = 1, //99行第一个元素初始化为1,最后一个初始化为2,没有初始化的部分自动为0
            [99] = 2,
        },
    };

    int ce1[100][100] =  //先指定行,再指定行中的某一个
    {
        [0] = {1, 2},

        [99] = {1, 0,  2},
    };

    /* 赋值 引用 */
    int da[3][5];
    da[0][0] = 1;
    da[0][1] = 2;

    printf("%d\n", da[0][0]);
    printf("%d\n", da[0][1]);

    /* 数组名
    * int a[N];      元素a[0],   一维数组名 a
    *
    * int a[M][N];   元素a[0][0], 一维数组名 a[0],a[1],a[2]..   二维数组名  a
    * 二维数组名:
    *  1.代表整个二维数组
    *      sizeof(数组名) ==>整个数组大小
    *      &(数组名)      ==>整个数组地址
    *
    *  2.对于二维数组来说,每一个元素都是一个一维数组, 数组名中放在第一个一维数组地址 &a[0]
    *      除了上面的情况,都是代表&a[0]  即 a == &a[0]
    *      
    *      sizeof(a) ==>4*M*N;
    *      sizeof(a[0]) ==> 4*N;
    *      sizeof(a[0]0]) ==> 4
    *
    *  PS:二维数组名同样是一个地址常量,
    *      不可以整体引用,不可以被赋值,不可以自加
    * ************************************************ */
    /*遍历 */
    /* 鞍点 */
}

//二维数组求最大值:
#include<stdio.h>
int main(int argc, char *argv[])
{
    #define M  4
    #define N  5
    int  a[M][N] = {
        9,    11,  19,   52,   13,
        2,    8,   18,   23,   6,
        10,   12,  22,   61,   14,
        66,   3,   17,   27,   5,
    };
    int i, j;
    int min, k;
    int x, y;
    for (j=0; j<N; j++) //j控制列
    {
        x = 0;  //假设j列中,x=0行最小
        for (i=0; i<M; i++) //拿j列中,每一行与x=0这行比较
        {
            if (a[x][j] > a[i][j]) // j 列中,x指向的行与 i指向的行比较
            {
                x = i;
            }
        }
        printf("%d\n", a[x][j]);
    }

    for (y=0; y<N; y++) //iy控制列
    {
        min = a[0][y]; //假设y列中,0行最小
        for (x=0; x<M; x++) //x控制行
        {
            if (min > a[x][y]) //找到更小的
            {
                min = a[x][y];
            }
        }
        printf("%d\n", min);
    }
}
//V2.行最大。
#include<stdio.h>
int main(int argc, char *argv[])
{
    #define M  4
    #define N  5
    int  a[M][N] = {
        9,    11,  19,   52,   13,
        2,    8,   18,   23,   6,
        10,   12,  22,   61,   14,
        66,   3,   17,   27,   5,
    };

    int i, j;
    int y;
    for (i=0; i<M; i++)
    {
        y = 0;
        for (j=0; j<N; j++)
        {
            if (a[i][y] < a[i][j])
            {
                y = j;
            }
        }
        printf("%d\n", a[i][y]);
        
    }

    int max;

    for (i=0; i<M; i++)
    {
        max = a[i][0];
        for (j=0; j<N; j++)
        {
            if (max < a[i][j])
            {
                max = a[i][j];
            }
        }
        printf("%d\n", max);
    }
}
//遍历:
#include<stdio.h>
int main(int argc, char *argv[])
{
    #define M  4
    #define N  5
    int  a[M][N] = {
        1,   3, 5,   7, 9,
        2,   4, 6,   8, 10,
        11, 13, 15, 17, 19,
        12, 14, 16, 18, 20,
    };

    int i, j;
    for (i=0; i<M; i++) // 控制着行
    {
        for (j=0; j<N; j++) //j控制列
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }


    for (j=0; j<N; j++) //j控制列
    {
        for (i=0; i<M; i++)  //i控制行
        {
            printf("%-3d",  a[i][j]);
        }
        printf("\n");
    }

    for (i=0; i<N; i++) //i控制列
    {
        for (j=0; j<M; j++)
        {
            printf("%-3d", a[j][i]);
        }
        printf("\n");
    }


    return 0;
}
//输出百分号:
#include<stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    int i;
    int j;
    //  >>>1.0-9%
    printf("Downloading.....\n");
    printf(">>>>>");
    for (i=0; i<=100; i++)
    {
        printf("\b\b>>%d", i);
        for (j=0; j<10&&i!=100; j++)
        {
            printf(".%d%%",j); //99.6%
            usleep(100000);
            fflush(stdout);
            printf("\b\b\b");
        }
        if (i<50)
        {
            usleep(10000);
        }
        else if (i<98)
        {
            usleep(50000);
        }
        else
        {
            sleep(2);
        }
    }
    printf("Completed\n");

}
//鞍点
//v1.先自己尝试着做一遍,再读V2……
#include<stdio.h>
#define M 4
#define N 5
/* 找行最大值,列最小值
* 先找到每一行最大值所在列,存放在y中.
* 在找到y列中最小值所在行,存放在x中,
* 如果x == i, 说明是同一行同一列,即鞍点
* ************************************ */
int main(int argc, char *argv[])
{
    int a[M][N] = {
        9,    11,  19,   52,   13,
        2,    8,   18,   23,   6,
        10,   12,  22,   61,   14,
        66,   3,   17,   27,   5,
    };
    int i, j, k;
    int x, y;



    return 0;
}
//V2.
#include<stdio.h>
#define M 4
#define N 5
int main(int argc, char *argv[])
{
    int a[M][N] = {
        9,    11,  19,   52,   13,
        2,    8,   18,   23,   6,
        10,   12,  22,   61,   14,
        66,   3,   17,   27,   5,
    };
    int i,j, k;
    int y, x;
    for (i=0; i<M; i++)
    {
        y = 0; //y存放i行最大值所在列,默认第一列为最大值
        for (j=0; j<N; j++)
        {
            if (a[i][y] < a[i][j])
            {
                y = j;
            }
        }
        printf("第%d行最大值所在列是%d \n", i, y);

        x = 0; // x存放y列最小值所在行,默认第一行为最小值
        for (k=0; k<4; k++)
        {
            if (a[x][y] > a[k][y])
            {
                x = k;
            }
        }
        printf("第%d列最小值所在行是%d \n\n", y, x);

        if (x == i)
        {
            printf("=========================\n");
            printf("sadlle Point:%d\n", a[x][y]);
        }

    }

}
//VV
#include<stdio.h>
#define  A   2
#define  B    A+3

#define  add(a, b)   a+b
#define  __Farsight__     //空宏
#define  qqId_1324318389yuema
#define  Linux
#define  M  4
#define  N  5
#include <unistd.h>

int main(int argc, char *argv[])
{
    int a[M][N] = {
        9,    11,  19,   52,   13,
        2,    8,   18,   23,   6,
        10,   12,  22,   61,   14,
        66,   3,   17,   27,   5,
    };

    int i, j;
    int x,y;

    for (i=0; i<M; i++)   //控制行
    {
        printf("\n咱家正在搜寻%d行......\n",  i);
        y = 0; //假设在i行中, y = 0列最大
        for (j=0; j<N; j++) //i行中,y指向的列和后面j指向的所有列比较
        {
            if (a[i][y] < a[i][j]) //i行中, y指向列和j指向的列比较
            {
                y = j;
            }
        }
        printf("在%d行中,最大值所在列 y=%d\n", i,  y);
        printf("正在y=%d列搜寻最小值所在行......\n",  y);

        x = 0; //假设在 y 列中, x = 0 行最小
        for (j=0; j<M; j++) // y 列中, x指向的最小行 和  后面 j指向的所有行比较
        {
            if (a[x][y] > a[j][y]) //y列中, x指向的行 和  j 指向的行 比较
            {
                x = j;
            }
        }
        printf("在y=%d列找到最小值所在行 x=%d\n", y,  x);

        if (x==i)
        {
            printf("x=%d == i=%d\n", x,  i);
            printf("朕乃天赐鞍点:a[%d][%d]=%d\n", x, y, a[x][y]);
            break;
        }
    }
    return 0;
}










Linux C学习第六天(数组)

猜你喜欢

转载自blog.csdn.net/nan_lei/article/details/81069627