/*
* 文件名: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;
}
}
【C语言】之实现对数组数据进行左移、右移和翻转
最新推荐文章于 2022-06-29 16:11:38 发布