• C语言学习(5)


    一、C语言中的二维数组

    1. 一维数组

      int a[10]; 一维数组

      int a[5][6]; 二维数组

      肤浅的认识: 当成数学中的矩阵理解,行和列

      char b[5][20]; 二维数组

    2. 二维数组在计算机中的存储

      跟一维数组一样,也是线性存放的,一个元素挨着一个元素(没有行列说法)

    3. 二维数组的初始化和使用

      认真理解并记住例子程序中所有的写法

      举例: int的二维数组和char类型的二维数组

    #include <stdio.h>
    
    int main()
    {
        int i, j;
        //新的初始化数组的写法
        //int a[]={45,56,79};  //正确,这种写法仅限于定义数组的时候立马初始化
        /* 
        int a[]; 错误
        a[0]=78;
        a[1]=96; 
        */
    
        //定义二维数组
        int n = 88;
        //第一种:定义数组并立马部分初始化(定义数组立马赋值)
        //a[0][0]--a[0][1] --------a[3][2]
        //int a[4][3]={15,12,96}; //这个二维数组最多存放12个int
    
        //第二种:花括号嵌套花括号。里面的花括号代表一行数据
        //int a[4][3]={{15,12},96}; //第0行 15 12 */
        //语法错误,花括号的嵌套,花括号只能从左到右连续
        //还要求从第一组数据开始全部都要有花括号
        /*     int a[4][3]={{3,15},12,96}; //a[0][0] -->3
        //int a[4][3]={{3,15},{12},96}; 
        //int a[4][3]={{3,15},12,{96}};  //错误,花括号不连续
        //int a[4][3]={3,15,{12},{96}}; //错误,最前面的没有加花括号
        for(i=0; i<4; i++)
        {
            for(j=0; j<3; j++)
                printf("a[%d][%d] is:%d
    ",i,j,a[i][j]);
        } */
    
        //第三种:
        //int a[][]={45,96,854}; //错误,编译器无法确定行和列的数量
        //int a[4][]={55,956,855}; //错误
        //int a[][3]={852,98546,5512};  //正确
    
        //第四种:考察一下逗号表达式的用法
        //int a[4][3]={(45,96,n),96,78}; //{88,96,78}
    
        //第五种:通过两个下标去访问二维数组成员赋值
        /*int a[4][3]; //没有初始化,里面放的是随机数
        a[1][2] = 85;
        a[0][2] = 96;*/
    
        //第六种:键盘输入数据依次赋值
        int a[4][3];
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 3; j++)
                scanf("%d", &a[i][j]);
        }
    }

      char类型的二维数组主要用于存放多个字符串

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int i;
        //定义char类型的二维数组
        //5--》最多存放5个字符串
        //10 --》每个字符串实际长度最多不能超过10个字节
        /*     char a[5][10]={"hello","world","gec"};  //char b[10]; 只能存放一个字符串
        //第一个字符串越界了
        char a[5][10]={"helloworldgechaha","world","gec"};
        char a[5][10]={'h','e','k'};
        char a[5][10]={{'h','e'},{'p'},98};
        
        char a[][10]={"hello","中国"};
        
        char a[5][10];
        a[0][1]='@'; */
        /*     
        char a[5][10];  //int  a[5][10]
        strcpy(a[0],"world1");
        strcpy(a[1],"world2");
        strcpy(a[2],"world3");
        strcpy(a[3],"world4");
        strcpy(a[4],"world5"); */
    
        char a[5][10];
        for (i = 0; i < 5; i++)
            scanf("%s", a[i]); //a[i]就是指针
    
        /*     for(i=0; i<5; i++)
        {
            for(j=0; j<10; j++)
                scanf("%c",&a[i][j]); 
        } */
    
        for (i = 0; i < 5; i++)
            printf("%s
    ", a[i]);
    }

    练习: 

      1. 定义int a[4][4]的数组,从键盘输入数据初始化这个数组,将这个数组中的数据以斜线作为对称轴互换

    #include <stdio.h>
    
    int main()
    {
        int i, j;
        int temp;
        //定义二维数组
        int a[4][4];
        printf("请输入16个整数!
    ");
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 4; j++)
                scanf("%d", &a[i][j]);
        }
        //打印一下原本的数据
        printf("===================
    ");
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 4; j++)
                printf("%-5d", a[i][j]);
            //换行
            printf("
    ");
        }
    
        //对称的位置互换
        for (i = 0; i < 4; i++)
        {
            for (j = i; j < 4; j++)
            {
                //a[i][j]和a[j][i]互换
                temp = a[i][j];
                a[i][j] = a[j][i];
                a[j][i] = temp;
            }
        }
        printf("===================
    ");
        //打印一下交换之后的数据
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 4; j++)
                printf("%-5d", a[i][j]);
            //换行
            printf("
    ");
        }
    }

      2. 用char类型二维数组存放, 从键盘中任意输入5个字符串,要求统计每个字符串中小写

      字母的个数,并且按照小写字母的个数从小到大排序(中等难度)

      a[0] heAJFD 2

      a[1] helllo 6 strcpy()

      a[2] HEHhhfd 4

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int i, j;
        //定义二维数组存放5个字符串
        char buf[5][20] = {0};
        char buf1[20] = {0};
        //定义int数组统计五个字符串中小写字母个数
        int count[5] = {0};
        int temp;
    
        printf("请输入五个字符串!
    ");
        for (i = 0; i < 5; i++)
            scanf("%s", buf[i]);
    
        //统计一下每个字符串中小写字母的个数
        for (j = 0; j < 5; j++)
        {
            for (i = 0; i < strlen(buf[j]); i++)
            {
                //统计小写字母
                if (buf[j][i] >= 'a' && buf[j][i] <= 'z')
                    count[j] = count[j] + 1;
            }
        }
        printf("=======================
    ");
        //根据字符串小写字母的个数依次排序
        for (i = 0; i < 4; i++) //0-1234   1-234   2-34   3-4
        {
            for (j = i + 1; j < 5; j++)
            {
                if (count[i] > count[j])
                { //交换小写字母个数的排序
                    temp = count[i];
                    count[i] = count[j];
                    count[j] = temp;
                    //交换字符串
                    strcpy(buf1, buf[i]);
                    strcpy(buf[i], buf[j]);
                    strcpy(buf[j], buf1);
                }
                //清空数组
                memset(buf1, 0, sizeof(buf1));
            }
        }
        //依据小写字母个数排序
        for (j = 0; j < 5; j++)
        {
            printf("count[%d] is:%d  ", j, count[j]);
            printf("%s
    ", buf[j]);
        }
        //对count数组排序--》很简单
    }

      3. char类型的二维数组,保存5个字符串,要求把每个字符串中的小写字母转换成大写字母保存

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int i, j;
        //定义二维数组存放5个字符串
        char buf[5][20] = {0};
    
        printf("请输入五个字符串!
    ");
        for (i = 0; i < 5; i++)
            scanf("%s", buf[i]);
    
        //将每个字符串中小写字母转换为大写字母
        for (j = 0; j < 5; j++)
        {
            for (i = 0; i < strlen(buf[j]); i++)
            {
                //统计小写字母
                if (buf[j][i] >= 'a' && buf[j][i] <= 'z')
                    buf[j][i] = buf[j][i] - 32; //小写字母与大写字母相差32
            }                                   //例如a为97而A为65,以此类推
        }
        printf("=======================
    "); //分界线
        for (j = 0; j < 5; j++)
        {
            printf("%s
    ", buf[j]);
        }
    }

    作业:

      1. 简单

      写一个程序将一个字符串循环右移n位

      例如:字符串abcdef 循环右移2位是 efabcd

    #include <stdio.h>
    #include <string.h>
    
    /*
    *写一个程序将一个字符串循环右移n位
    *例如:字符串abcdef 循环右移2位是  efabc
    */
    
    int main()
    {
        int a, k;
        char input[100] = {0};
        char String[100] = {0};
    
        printf("请输入一个字符串:
    ");
        scanf("%s", input);
        printf("请问想将字符串循环右移几位:
    ");
        scanf("%d", &a);
        while (a > strlen(input))
        {
            printf("你输入的数字大于该字符
    ");
            printf("请重新输入
    ");
            scanf("%d", &a);
        }
        strncpy(String, input, strlen(input) - a); //先将剩余部分取出来
        for (k = 0; k <= a; k++)                   //将字符串右移位数
        {
            input[k] = input[strlen(input) - a + k]; //将结束符移至右移字符后面
        }
        //例如:abcdef
        //右移2位
        //ef-->最终input[100]={"efdef"}
        //但是打印以结束符为标准
        strcat(input, String); //再拼接在一起
        printf("The String is:%s
    ", input);
        return 0;
    }
    View Code

      2. 动脑筋

      计算字符串中最大连续相同的字符个数。例如,若为"aaabbbb",打印最大连续字符是b,个数是4 ;若字符串为 "abcde"

      打印最大连续字符是1

      "aaabccdccccfdddddddd"

    #include <stdio.h>
    #include <string.h>
    
    /*
    * 计算字符串中最大连续相同的字符个数。
    * 例如,若为"aaabbbb",打印最大连续字符是b,个数是4 ;
    * 若字符串为  "abcde",打印最大连续字符是1
    * "aaabccdccccfdddddddd"
    */
    
    int main()
    {
        int i, count = 0, cup = 0;
        char String = {0};
        char input[100] = {0};
    
        printf("请输入一段带有连续字符的字符串:
    ");
        scanf("%s", input);
    
        for (i = 0; i < strlen(input); i++)
        {
            if (input[i] == input[i + 1]) //判断前后字符是否相同
            {
                count++; //计数器
            }
            else //不相同
            {
                count++; //以上个字符与下个字符不相同,但需要加上这个字符
                if (cup <= count)
                {
                    cup = count;       //保存到这个最大的值
                    String = input[i]; //保存这个字符
                }
                count = 0; //清空这个计数器
            }
        }
        printf("THE Max Num is %d! This %c
    ", cup, String);
        return 0;
    }
    View Code

       3.输入字符串,分别统计出其中英文字母、空格、数字和其它字符的个数。

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int i;
        int letter = 0, space = 0, num = 0, other = 0;
        char input[50] = {0};
        printf("Please enter 1 string:
    ");
    
        gets(input); //输入带空格符的字符串
    
        //之所以不用scanf();是因为输入带空格的字符串时,遇到空格则就结束输入
    
        for (i = 0; i < strlen(input); i++) //逐个判断进行划分
        {
            if (input[i] >= 'A' && input[i] <= 'z') //判断字母
            {
                letter++;
                continue; //使用continue是因为这个已经判断完成了,不用再往下逐个判断,加快速度
            }
            else if (input[i] == 32) //判断空格
            {
                space++;
                continue;
            }
            else if (input[i] >= '0' && input[i] <= '9') //判断数字
            {
                num++;
                continue;
            }
            else //其他字符
            {
                other++;
                continue;
            }
        }
        printf("Letter: %d,Space: %d,Num: %d,Other: %d", letter, space, num, other);
        return 0;
    }
    View Code
  • 相关阅读:
    捕获控制台输出信息
    .net 值类型变量赋值需要注意
    《河北省实施〈中华人民共和国道路交通安全法〉办法》
    在Win7应用程序中使用盾牌图标
    32位WIndows 7的“快速启动”,重启后丢失的问题,被确认是一个bug
    在本地网页中,让flash可以访问本地文件
    WPF 3D编程中,摄像机的位置很重要
    让Windows7任务栏图标显示Windows菜单(恢复,最小化,关闭)
    Joomla 书籍
    Joomla! 1.5 Template Toolbar简化Joomla模板做成的工具
  • 原文地址:https://www.cnblogs.com/xiaojian98/p/Geek_jian.html
Copyright © 2020-2023  润新知