C 入门 第五节 多维数组 字符串数组


#pragma mark  ----------二维数组----------
int main(int argc, const char * argv[]) {
/*
    1 . 二维数组的本质:将数组作为数组元素的数组,称为数组的数组
    2 . 类如:管理一个班4个学生的年龄,将一维数组作为数组元素,存储到另一个数组中
    int age[4] = {12,13,14,15};
    12,13,14,15
    21,22,23,24
    31,32,33,34
    3 . 为了形象化理解二维数组,通常将二维数组写成行和列的排列形式.
    二维数组通常被称为:m*n数组,或 m行n列
    m 二维数组中包含多少个一维数组,是第一维,表示第几行
    n 一维数组包含多少个元素,是第二维,表示第几列
    5 . 二维数组常称为矩阵.矩阵:纵横排列的数据表格.
    定义二维数组
    类型  数组名[行数][列数] = {值}
    1 . 行和列使用常量表达式
    2 . 行数可以省略,列数不可以省
    3 . 设置初始值,使用{{},{},{}};形式
    4 . 每一行元素不足,会自动补齐

    1 . 定义一个二维数组,存储3个班级学生的年龄,每班的学生都是5人
    int age[3][5] = {{12,13,14,15,16},{21,22,23,24,25},{31,32,33,34,35}};
    2 . 定义二维数组形式2,省略行数
    a[][3] = {{1,2,3}{1,2,3,4,5}};
    3 . 定义二维数组形式3,不推荐,不容易看出每一行的开始和结束
    int a[][3] = {1,2,3,4,5};
    访问二维数组的元素
    访问单个元素 必须指定俩个下标,下标1代表所在的行,下标2代表所在列;
    注意越界问题
    printf("%d",a[1][0]);
    printf("%d",a[1][2]);
    修改二维数组元素
    a[0][1] = 6;
    printf("%d",a[0][1]);

    //遍历二维数组,需要使用俩层循环,第一层循环控制第几行,第二层循环控制第几列
    int a[2][3] = {{1,21,3},{4,5}};
    for (int i = 0; i < 2; i ++)
    {
        for (int j = 0; j < 3; j ++)
        {
            printf("%2d\t",a[i][j]); //%2d是打印出的每个字符占俩个格
        }
        printf("\n");
    }
 */
/*
//练习 : 讲一个二维数组的行和列交换,存储到另一个数组
    int arr[2][3] = {{1,2,3},{4,5}};
    int brr[3][2] = {0};
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 2; j ++)
        {
            //printf("%d ",arr[i][j]);
            brr[i][j] = arr[j][i];
            printf("%d ",brr[i][j]);

        }
        printf("\n");
    }

 
// 练习: 定义一个3行4列的数组,找出数组的最大元素,打印出来,并打印所在的行和列
    int a[3][4] = {{5,45,566,58},{4,15,65,456},{21,47,5,566,}};
    int c = 0;
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 4; j ++)
        {
            if (c < a[i][j])
            {
                c = a[i][j];
                
            }
        }
    }
    printf("%d \n",c);
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 4; j ++)
        {
            if (c == a[i][j])
            {
                printf("第%d行第%d列 \n",i,j);
            }
        }
    }
    printf("\n\n\n");
    
*/
/*
#pragma mark  ---------字符串数组---------
    1. 字符数组: 数组元素是字符的数组,一维数组
    2. 字符串数组: 数据元素是 字符串 的数组,二维数组.字符串本身也是字符组
    定义字符串数组,赋值时有些不同
 
    char name[3][30] = {"pengqifeng","caijingping","zhangdonghui"};
//    访问某个字符串, 数组名[第一维下标]
   
    for (int i = 0; i < 3; i ++)
    {
        printf("%s\n",name[i]);
    }
    
//   访问某个字符 数组名[第一维下标][第二维下标]
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 30; j ++)
        {
            printf("%c ",name[i][j]);
        }
        printf("\n");
    }

    
// 练习 : 创建一个字符串数组(内容是你周围人的姓名),输出最长字符串的长度
    char a[4][50] = {"asdf","gadf","qwerejir","asdfxcv"};
    int c = 0;
    for (int i = 0; i < 4; i ++)
    {
        int d = (int)strlen(a[i]);
        if (c < d)
        {
            c = d;
        }
    }
    
    printf("%d \n",c);
 
 
// 练习 : 创建⼀一个字符串数组(内容是你周围⼀一圈人的姓名),对字符串 (英文)从⼩到大排序。
    char a[3][30] = {"lvyao","gaolei","gaojinghong"};
    for (int i = 0; i < 2; i ++)
    {
        for (int j = 0; j < 2 - i; j ++)
        {
            
            if (strcmp(a[j], a[j + 1]) > 0)        //按ACCII碼排列
//          if (strlen(a[j]) < strlen(a[j + 1]))   //按字符串长度排列
            {
                char b[30]= {0};
                strcpy(b, a[j]);
                strcpy(a[j], a[j + 1]);
                strcpy(a[j + 1], b);
            }
        }
    }
    for (int i = 0; i < 3; i ++)
    {

        printf("%s ",a[i]);
    
        
    }

//    从控制台输入字符串
//    字符数组存储字符串
    char a[100] = {0};
//    gets从标准输入设备读取字符串,以回车结束读取,使用'\0'结尾,回车符'\n'被舍弃没有遗留在缓冲区.
//    可以用来输入带空格的字符串
//    可以无限读取,不会判断上限,因此使用gets不安全,可能造成溢出

    printf("请输入字符串");
    gets(a);   //读取
    printf("%s\n",a);
    //scanf(%s\n,a);以空格或回车符结束读取,空格或是回车符会遗留在缓冲区
    //不能直接输入带空格的字符串
    //scanf("%[^\n]",argc); %[]输入字符集
    //[^\n]表示除了'\n'之外的字符都接收,即可以接收空格,这个可以用来输入带空格的字符串.
    printf("请输入字符串");
    scanf("%[^\n]",a);
    printf("%s\n",a);
    //从控制台输入字符串
   //字符串数组存储多个字符串
    char names[6][30] = {};
    printf("请输入字符串: \n");
    for (int i = 0; i < 6; i ++)
    {
        scanf("%s",names[i]); //循环输入字符串
        getchar();
        
    }
    printf("您输入字符串为: \n");
    for (int i = 0; i < 6; i ++)
    {
        printf("%s\n",names[i]);
    }
 */
#pragma mark ------多维数组 ------
//    多维数组;数组下标在2个以上
//    三维数组;立体的 层,行,列
//    定义三维数组 类型 数组名[层][行][列]
//    int a[2][3][4] = [0];
//    遍历三维数组  需要三层循环
    int ages[2][3][4] = {{{1,2,3,4},{4,5,6,7},{7,8,9,10}},{{12,13,14,15},{15,16,17,18},{21,22,23,24}}};
        
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 4; k++) {
                    printf("ages[%d][%d][%d] = %d\n",i,j,k,ages[i][j][k]);
                }
            }
        }
    
    //    多维数组访问元素,数组名[下标][下标]....
    //    多维数组 元素个数 = 各位数个数 乘积
    //    多为数组占用内存 = 元素个数 乘以 单个元素所占空间
    

posted @ 2015-12-26 21:05  _小帅  阅读(841)  评论(0编辑  收藏  举报