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\n",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\n", a[i]);
}

 

练习: 

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

#include <stdio.h>

int main()
{
    int i, j;
    int temp;
    //定义二维数组
    int a[4][4];
    printf("请输入16个整数!\n");
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
            scanf("%d", &a[i][j]);
    }
    //打印一下原本的数据
    printf("===================\n");
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
            printf("%-5d", a[i][j]);
        //换行
        printf("\n");
    }

    //对称的位置互换
    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("===================\n");
    //打印一下交换之后的数据
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
            printf("%-5d", a[i][j]);
        //换行
        printf("\n");
    }
}

 

 

  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("请输入五个字符串!\n");
    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("=======================\n");
    //根据字符串小写字母的个数依次排序
    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\n", buf[j]);
    }
    //对count数组排序--》很简单
}

 

 

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

#include <stdio.h>
#include <string.h>

int main()
{
    int i, j;
    //定义二维数组存放5个字符串
    char buf[5][20] = {0};

    printf("请输入五个字符串!\n");
    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("=======================\n"); //分界线
    for (j = 0; j < 5; j++)
    {
        printf("%s\n", 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("请输入一个字符串:\n");
    scanf("%s", input);
    printf("请问想将字符串循环右移几位:\n");
    scanf("%d", &a);
    while (a > strlen(input))
    {
        printf("你输入的数字大于该字符\n");
        printf("请重新输入\n");
        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\0-->最终input[100]={"ef\0def"}
    //但是打印以结束符为标准
    strcat(input, String); //再拼接在一起
    printf("The String is:%s\n", 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("请输入一段带有连续字符的字符串:\n");
    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\n", 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:\n");

    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

 

posted @ 2020-03-09 10:23  Geek_Jian  阅读(280)  评论(0编辑  收藏  举报