关于二维数组4种模式旋转打印出来

1、一个范例,如有个二维数组

Data[4][6]=
{
1,2,3,4,5,6,
x,t,e,w,w,q,
r,e,w,w,2,3,
y,6,3,1,i,y,
};

2、将数组的元素按照顺时针旋转,如:

1,2,3,4,5,6,        y,r,x,1,
x,t,e,w,w,q,        6,e,t,2,
r,e,w,w,2,3,   ==》 3,w,e,3,
y,6,3,1,i,y,        1,w,w,4,
                    i,2,w,5,
                    y,3,q,6,

3、通过上面的题目,灵感来自LCD屏,大家很清楚,手机有横屏、竖排等,其实和上面这个旋转式一样的原理。

4、通过上面的讲解,下面就给大家贴出我的代码,我的代码可更改二维数组的行大小和列大小即可适配你的数组缓存。

5、由于本代码不复杂,故就一个.c源文件。


#define _CRT_SECURE_NO_WARNINGS//防止编译器提示不安全的函数报错无法运行
#include <stdio.h>

///以下代码应该放在一个.c里的
typedef enum
{
    mode0 =0,//旋转0°或360°
    mode1,   //旋转90°
    mode2,   //旋转180°
    mode3,   //旋转270°
}rotate_mode;//选择模式4种

typedef struct
{
    int row;
    int col;
    int(*buff)[9];//原本使用int *buff;但是有些编译器无法通过,故加入了9列,大家可根据项目调整大小
    void (*data_rotate)(rotate_mode mode);
}data_rotate_struct;

static data_rotate_struct *rotate_s =NULL;
static void mode_0(void)//0°
{
    int row, col;
    //(0,0)
    if (rotate_s == NULL)
        return;
    for (row = 0; row < rotate_s->row; row++)
    {
        for (col = 0; col < rotate_s->col; col++)
        {
            printf("%4d", rotate_s->buff[row][col]);
        }
        printf("\r\n");
    }
}
static void mode_1(void)//90°
{
    int row, col;
    //(x-1,0)
    if (rotate_s == NULL)
        return;
    for (col = 0; col < rotate_s->col; col++)
    {
        for (row = (rotate_s->row - 1); row >= 0; row--)
        {
            printf("%4d", rotate_s->buff[row][col]);
        }
        printf("\r\n");
    }
}
static void mode_2(void)//180°
{
    int row, col;
    //(x-1,y-1)
    if (rotate_s == NULL)
        return;
    for (row = (rotate_s->row - 1); row >= 0; row--)
    {
        for (col = (rotate_s->col - 1); col >= 0; col--)
        {
            printf("%4d", rotate_s->buff[row][col]);
        }
        printf("\r\n");
    }
}
static void mode_3(void)//270°
{
    int row, col;
    //(0,y-1)
    if (rotate_s == NULL)
        return;
    for (col = (rotate_s->col - 1); col >= 0; col--)
    {
        for (row = 0; row < rotate_s->row; row++)
        {
            printf("%4d", rotate_s->buff[row][col]);
        }
        printf("\r\n");
    }
}

void data_rotate(rotate_mode mode)
{
    switch (mode)
    {
    case mode0:mode_0(); break;
    case mode1:mode_1(); break;
    case mode2:mode_2(); break;
    case mode3:mode_3(); break;
    default:
        break;
    }
}
static void data_init_config(data_rotate_struct *rotate)
{
    rotate_s = rotate;
    rotate->data_rotate = data_rotate;
}
///以上代码应该放在一个.c里的




#define x 6//自行调整数组大小
#define y 9//自行调整数组大小
int Data[x][y] = { 0,1,2,3,4,5,6,7,8,8,8,5,4,3,33,2,21,1, };//源缓存
data_rotate_struct rotate =//数组旋转打印结构体
{
    x,y,Data,NULL,
};

int main()
{
    data_init_config(&rotate);
    rotate.data_rotate(mode0);
    printf("\r\n");
    rotate.data_rotate(mode1);
    printf("\r\n");
    rotate.data_rotate(mode2);
    printf("\r\n");
    rotate.data_rotate(mode3);
    printf("\r\n");

}


6、以上代码运行结果如下:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金丝草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值