/*
* 文件名:数组旋转.c
* 功能描述:把数组数据顺时针或逆时针旋转
* 编辑人:王廷云
* 编辑日期:2017-12-12
*/
#include <stdio.h>
#include <stdlib.h>
#define ROW 4 // 行数
#define COL 4 // 列数
/* 按键输入枚举 */
enum key_e {
LEFT, // 左
RIGHT, // 右
QUIT, // 退出
UNKNOW, // 其它
};
/* 函数声明 */
void initial(void); // 初始化界面
int getInput(void); // 获取用户输入
void showArray(int ar[ROW][COL]); // 显示数组结果
void turnRight(int ar[ROW][COL]); // 数组往右旋转
void turnLeft(int ar[ROW][COL]); // 数组往左旋转
/* 从主函数开始 */
int main(void)
{
/* 待操作数组数据 */
int ar[ROW][COL] = {
{0,1,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,0,0},
};
int loop = 1; // 循环标志位
int key; // 用户输入
/* 初始化界面 */
initial();
/* 显示数组 */
showArray(ar);
/* 进入用户交互 */
while (loop)
{
key = getInput(); // 获取用户输入
switch (key) // 根据输入完成不同操作
{
case LEFT : turnLeft(ar); break;
case RIGHT: turnRight(ar); break;
case QUIT : loop = 0; continue;
default : continue;
}
showArray(ar); // 显示操作完之后的数组数据
}
system("stty icanon"); // 恢复缓冲
system("stty echo"); // 恢复回显
fprintf(stdout, "\033[?25h"); // 恢复鼠标显示
fflush(stdout);
return 0;
}
/*
* 函数名:initial
* 函数功能:初始化屏幕并显示功能菜单
* 函数参数:无
* 返回值:无
*/
void initial(void)
{
/* 屏幕初始化 */
fprintf(stdout, "\033[2J"); // 清屏
fprintf(stdout, "\033[1;1H"); // 定位到第一行第一列
fflush(stdout); // 刷新
/* 输出命令提示菜单 */
fprintf(stdout, "======\033[32m输入命令\033[0m======\n");
fprintf(stdout, "=== 右键: 逆时针旋转 \n");
fprintf(stdout, "=== 左键: 顺时针旋转 \n");
fprintf(stdout, "=== q键: 退出 \n");
fprintf(stdout, "====================\n");
/* 配置相关显示 */
system("stty -icanon"); // 关闭缓冲
system("stty -echo"); // 关闭回显
fprintf(stdout, "\033[?25l"); // 关闭鼠标显示
fflush(stdout); // 刷新
}
/*
* 函数名:getInput
* 函数功能:获取用户输入
* 函数参数:无
* 返回值:返回用户输入对应的枚举值
*/
int getInput(void)
{
int key; // 用户输入的键值
char ch;
ch = getchar(); // 获取输入
/* 方向键判断 */
if (ch == '\033' && getchar() == '[')
{
ch = getchar();
switch (ch) // 方向键由'\033'、'['、'A、B、C、D'组成
{
case 'C': key = RIGHT; break; // 左键
case 'D': key = LEFT; break; // 右键
default : key = UNKNOW; break; // 其它键
}
}
else if (ch == 'q') // q键退出
{
key = QUIT;
}
else
{
key = UNKNOW;
}
return key;
}
/*
* 函数名:showArray
* 函数功能:显示数元素结果
* 函数参数:待显示的数组
* 返回值:无
*/
void showArray(int ar[ROW][COL])
{
int x, y;
/* 定位到菜单下一行 */
fprintf(stdout, "\033[6;1H");
fflush(stdout);
/* 循环打印数据元素 */
for (y = 0; y < ROW; y++)
{
fprintf(stdout, " "); // 前导空白,便于观看效果
for (x = 0; x < COL; x++)
{
if (ar[y][x] == 0)
{
fprintf(stdout, " ");
}
else
{
fprintf(stdout, "\033[42m[]\033[0m");
}
}
fputc('\n', stdout);
}
}
/*
* 函数名:turnRight
* 函数功能:数组元素往右旋转
* 函数参数:待旋转的数组
* 返回值:无
*/
void turnRight(int ar[ROW][COL])
{
int br[ROW][COL]; // 临时保存旋转结果
int x, y;
/* 对数据进行旋转 */
for (y = 0; y < ROW; y++)
{
for (x = 0; x < COL; x++)
{
/* 顺时针旋转时ar的行跟着br的列变化 */
br[y][x] = ar[ROW-1-x][y];
}
}
/* 把旋转后的数据赋值给原来的数组 */
for (y = 0; y < ROW; y++)
{
for (x = 0; x < COL; x++)
{
ar[y][x] = br[y][x];
}
}
}
/*
* 函数名:turnLeft
* 函数功能:数组元素往左旋转
* 函数参数:待旋转的数组
* 返回值:无
*/
void turnLeft(int ar[ROW][COL])
{
int br[ROW][COL]; // 临时保存旋转结果
int x, y;
/* 对数据进行旋转 */
for (y = 0; y < ROW; y++)
{
for (x = 0; x < COL; x++)
{
/* 逆时针旋转时ar的列跟着br的行变化 */
br[y][x] = ar[x][COL-1-y];
}
}
/* 把旋转后的数据赋值给原来的数组 */
for (y = 0; y < ROW; y++)
{
for (x = 0; x < COL; x++)
{
ar[y][x] = br[y][x];
}
}
}
【C语言】之实现数组数据旋转
最新推荐文章于 2024-08-18 20:26:20 发布