【C语言】之实现对数组数据进行左移、右移和翻转

本文介绍了一个C语言程序,用于演示如何通过用户输入控制数组元素的左移、右移及翻转操作。程序支持方向键控制,并提供了简洁的命令提示菜单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 文件名:moveData.c
 * 功能描述:对数组数据进行左移、右移和翻转
 * 编写人:王廷云
 * 编写日期:2017-10-10
*/
#include <stdio.h>
#include <stdlib.h>

#define   NR   10           // 元素个数

/* 按键输入枚举 */
enum key_e {
    UP,             // 上
    DOWN,           // 下
    LEFT,           // 左
    RIGHT,          // 右
    QUIT,           // 退出
    UNKNOW,         // 其它
};

/* 功能函数声明 */
void initial(void);         // 界面初始化
int getInput(void);         // 获取用户输入
void showArray(int ar[NR]); // 显示数组数据
void moveRight(int ar[NR]); // 数组元素往右移动
void moveLeft(int ar[NR]);  // 数组元素往左移动
void turnOver(int ar[NR]);  // 数组元素翻转

/* 主函数开始 */
int main(void)
{
    int ar[NR] = {0,1,2,3,4,5,6,7,8,9}; // 操作的数据
    int loop = 1;  // 循环标志位
    int key;       // 用户输入按键

    /* 初始化界面 */
    initial();

    /* 显示数组 */
    showArray(ar);

    /* 进入用户交互 */
    while (loop)
    {
        key = getInput();  // 获取用户输入
    	switch (key)       // 根据输入完成不同操作
    	{
    	    case LEFT : moveLeft(ar);  break;
    	    case RIGHT: moveRight(ar); break;
    	    case UP   : turnOver(ar);  break;
    	    case QUIT : loop = 0;   continue;
    	    default   :             continue;
    	}
    	showArray(ar);             // 显示操作之后的结构
    }
    fputc('\n', stdout);           // 程序退出后回车显示

    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, "=left : 循环向左移动  \n");
    fprintf(stdout, "=right: 循环向右移动  \n");
    fprintf(stdout, "=   up: 翻    转 \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 'A': key = UP;      break; // 上键
            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[NR])
{
    int i;

    /* 定位到菜单下一行显示数组内容 */
    fprintf(stdout, "\033[7;1H");   // 定位到第7行第1列
    fprintf(stdout, "\033[K");      // 清除该行的内容
    fflush(stdout);                 // 刷新

    /* 循环打印数组元素 */
    for (i = 0; i < NR; i++)
    {
        fprintf(stdout, "\033[32m%d \033[0m", ar[i]);
    }
    fprintf(stdout, "\n====================\n");
}

/*
 * 函数名:moveRight
 * 函数功能:数组元素往右移动
 * 函数参数:待移动的数组
 * 返回值:无
*/
void moveRight(int ar[NR])
{
    int temp;
    int i;

    /* 保存最右边的元素 */
    temp = ar[NR-1];

    /* 全部元素往右移动一个位值 */
    for (i = NR-1; i > 0; i--)
    {
        ar[i] = ar[i-1];
    }

    /* 把最右边的元算放到最左边 */
    ar[i] = temp;
}

/*
 * 函数名:moveLeft
 * 函数功能:数组元素往左移动
 * 函数参数:待移动的数组
 * 返回值:无
*/
void moveLeft(int ar[NR])
{
    int temp;
    int i;

    /* 保存最左边的元素 */
    temp = ar[0];

    /* 全部元素往左移动一个位值 */
    for (i = 0; i < NR-1; i++)
    {
        ar[i] = ar[i+1];
    }

    /* 把最左边的元算放到最右边 */
    ar[i] = temp;
}

/*
 * 函数名:turnOver
 * 函数功能:把数组元素翻转
 * 函数参数:待翻转数组
 * 返回值:无
*/
void turnOver(int ar[NR])
{
    int temp;
    int i;

    /* 使用折半算法实现数组翻转 */
    for (i = 0; i < NR/2; i++)
    {
        /* 两边对称位置元素互换位值 */
        temp = ar[i];
    	ar[i] = ar[NR-1-i];
    	ar[NR-1-i] = temp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值