【C语言】之实现数组数据旋转

/*
 * 文件名:数组旋转.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];
    	}
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值