C_Language_06

C_Language_06

二维数组:
        1.二维数组的本质:将数组作为数组元素的数组。称为数组的数组。
        2.类如:管理一个班级4个学生的年龄。
        int age[4] = {12,13,14,15};
        12,13,14,15
        21,22,23,24
        31,32,33,34
        3.为了形象化理解二维数组,通常将二维数组写成行和列的排列形式
        4.二维数组通常被称为:m*n,或m行n列
          m二维数组中包含多少个一维数组,是第一维,表示第几行
          n一维数组包含多少个元素,是第二维,表示第几列
        5.二维数组常称为矩阵。矩阵:纵横排列的数据表格
        定义二维数组
        1.类型名 数组名[行数][列数] = [值];
          行和列使用常量表达式
        2.行数可以省略,列数不可以省
        3.设置初始值,使用{{},{},{}};形式
        4.每一行元素不足,会自动补齐
定义:
        1.定义二维数组形式1
        定义一个二维数组,存储3个班级学生的年龄,每个班的学生都是5人
        int age[3][5] = {{12,13,14,15,16},
                         {21,22,23,24,25},
                         {31,32,33,34,35}};
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                printf("%d ",age[i][j]);
            }
            printf("\n");
        }
       2.定义二维数组形式2,省略行数,列数不可以省
        int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};
        for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ",a[i][j]);
        }
        printf("\n");
        }
        3.定义二维数组形式3,不推荐,不容易看出每一行的开始和结束
        int a1[][3] = {1,2,3,4,5};
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                printf("%d ",a1[i][j]);
            }
            printf("\n");
        }
访问二维数组的元素:
        访问单个元素 必须指定两个下标,下标1代表所在的行,下标2代表所在的列。
注意越界问题:
       int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};
       printf("%d\n",a[1][0]);
       printf("%d\n",a[1][3]);
修改二维数组的元素:
        a[0][1] = 6;
        printf("%d\n",a[0][1]);
遍历:需要使用两层循环,第一层循环控制第几行,第二层循环控制第几列
        int str[2][3] = {{1,2,3},{4,5}};
        for (int i = 0 ; i < 2; i ++)
        {
            for (int j = 0; j < 3; j ++)
            {
                printf("%2d ",str[i][j]);//%2d是打印出的每个字符占两个格
            }
            printf("\n");
        }
示例:将一个二维数组的行和列交换,存储到另一个数组
        int arr1[2][3] = {{1,2,3,},{4,5}};
        int arr2[3][2] = {0};
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 2; j++) {
                arr2[i][j] = arr1[j][i];
                printf("%2d ",arr2[i][j]);
            }
            printf("\n");
        }
示例:定义一个3行4列的数组,找出数组的最大元素所在行和列
        方法一   只能找一个最大的,有两个以上最大值则打印第一个
        int a[3][4] = {{1,2,3,245},
                       {4,5,1333,7},
                       {99,10,11,1333}};
        int max = a[0][0], im = 0, jm = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 4; j++) {
                if (max < a[i][j]) {
                    max = a[i][j];
                    im = i;
                    jm = j;
                }
            }
        }
        printf("最大元素%d所在行为%d 列为%d",max,im,jm);
        方法二   可以查找多个相同的最大值
        int a[3][4] = {{1333,2,3,245},
            {4,5,1333,7},
            {99,10,11,1333}};
        int max = a[0][0];
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 4; j++) {
                if (max < a[i][j]) {
                    max = a[i][j];
                }
            }
        }
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 4; j++) {
                if (a[i][j] == max) {
                    printf("最大元素%d所在行为%d、列为%d\n",a[i][j],i,j);
                }
            }
        }
    
字符串数组:
        1.字符数组:数组元素是字符的数组,一维数组
        2.字符串数组:数据元素是 字符串 的数组,二维数组。字符串本身也是字符数组
定义:定义字符串数组,赋值时有些不同
示例:char names[3][30] = {
                            "pengqifeng",
                            "caijianping",
                            "zhangdonghui"
                             };
        printf("%s \n",names[2]);
        for (int i = 0; i < 3; i++) {
            printf("%s ",names[i]);
        }
        printf("\n");
访问某个字符:数组名[第一维下标][第二维下标]
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 30; j++) {
                printf("%c ",names[i][j]);
            }
            printf("\n");
        }
示例:创建一个字符串数组(内容是你周围人的姓名),输出最长字符串的长度
方法一:char a[4][20] = {
                        "liudehua",
                         "zhangxueyou",
                         "lilianjieg",
                         "chenglong"
                        };
        int lengthMax = 0;
        for (int i = 0; i < 4; i++) {
            int length = (int)strlen(a[i]);
            if (length > lengthMax) {
                lengthMax = length;
            }
        }
        printf("%d ",lengthMax);
        for (int i = 0; i < 4; i++) {
            if (lengthMax == (int)strlen(a[i])) {
                printf("%s",a[i]);
            }
        }
方法二:char a[6][20] = {
        "liudehua",
        "liuhuan",
        "lilianjieg",
        "chenglong",
        "naying",
        "zhangxueyou"
    };
    int lMax = 0, n = 0;
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j <20; j++) {
            if (a[i][j] != '0' && a[i][j] != '\0') {
                n++;
            }else{
                lMax = lMax < n ? n : lMax;
                n = 0;
            }
        }
    }
    n = 0;
    printf("%d ",lMax);
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 20; j++) {
            if (a[i][j] != '0' && a[i][j] != '\0') {
                n++;
                if(n == lMax){
                    printf("%s ",a[i]);
                }
                
            }else{
                n = 0;
            }
        }
    }
    printf("\n");
    
示例:创建一个字符串数组,对字符串(英文)从小到大排列
        char names[5][20] = {"zhangsanfeng","yangguo","xiaobaima","angnababy","sixdf"};
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4 - i; j++) {
                if (strcmp(names[j], names[j+1]) > 0){
                    char name[20] = {0};
                    strcpy(name,names[j]);
                    strcpy(names[j],names[j+1]);
                    strcpy(names[j+1],name);
                }
            }
        }
        for (int i = 0; i < 5; i++) {
            printf("%s ",names[i]);
        }
        从后台输入字符串
        字符数组存储字符串
        char a22[100] = {0};
        gets 从标准输入设备读取字符串,以回车结束读取,使用‘\0’结尾,回车符‘\n’被舍弃没有遗留在缓冲区。可以用来输入带空格的字符
        可以无限读取,不会判断上限,因此使用gets不安全,可能造成溢出
        printf("请输入字符串:");
        gets(a22);
        printf("%s\n",a22);
        sccanf("%s\n",a);以空格或回车符结束读取,空格或是回车符会遗留在缓冲区,不能直接输入带空格的字符串
        scanf("%[^\n]",a); %[]输入字符集
        [^\n]表示除了‘\n’之外的字符都接收,即可以空格,这个可以用来输入带空格的字符串。
        printf("请输入字符串:");
        char a22[100] = {0};
        scanf("%[^\n]",a22);
        printf("%s",a22);
        从控制台输入字符串
        字符串数组存储多个字符串
        char names3[6][30] = {};
        printf("请输入字符串:\n");
        for (int i = 0; i < 6; i++) {
            scanf("%s",names3[i]);//循环输入字符串
            getchar();
        }
        printf("您输入的字符串为:");
        for (int i = 0; i < 6; i++) {
            printf("%s\n",names3[i]);
        }
多维数组(了解):
        多维数组:数组下标在2个以上
        三维数组:立体的层,行,列
        定义三维数组 类型 数组名[层][行][列]
        int a11[2][3][4] ={0};
        遍历三维数组 需要三层循环
        int ages[2][3][4] = {{{1,2,3,4},{4,5,6,7},{7,8,9,}},
                             {{12,13,14,15},{15,16,17,18},{21,22,23,24}}};
        for (int i = 0; i < 2; i++) {
            printf("第%d层\n",i);
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 4; k++) {
                    printf("ages[%d][%d][%d] = %d  ",i,j,k,ages[i][j][k]);
                }
                printf("\n");
            }
            printf("\n");
        }
        多维数组访问元素,数组名[下标][下标]...
        多维数组 元素个数 = 各位数个数 乘积
        多维数组占用内存 = 元素个数 乘以单个元素所占空间

posted @ 2015-11-24 23:07  DH_Fantasy  阅读(93)  评论(0)    收藏  举报