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、以上代码运行结果如下: