需求:
  根据用户的四个按键的(上下左右)显示对应的内容,左右键切换显示项目名称,上下键切换切换该项目的具体信息条目。另外有一个无符号整型变量上的每一位用于控制项目的显示与否,该位为1则显示对应项目,反之则不显示该项目。

  组合按键采用面向对象的思想,加上数据结构中的双向链表,这样的组合按键需求十分容易实现。

  下面是对上述需求的模型化:
  Linux终端用于显示,键盘上的w、s、a、d键和箭头符号分别表示上下左右按键。左右按键用于切换显示附近的银行名称,上下键用于切换显示该银行的具体信息,如地址、当前排队人数等。另外show_ctl变量对应的位用于控制对应的银行是否显示。

  编码如下:

#include <stdio.h>#define KEY_UP      192
#define KEY_DOWN    193
#define KEY_LEFT    195
#define KEY_RIGHT   194//封装显示结构体
typedef void (*SHOW_FUN)(void);
typedef struct _tag_bank
{struct _tag_bank* pre;struct _tag_bank* next;SHOW_FUN    showFunc[10];size_t      subScrMaxIndex;size_t      subScrIndex;
}bankItem_t;bankItem_t *current_bankItem = NULL;void agricultural_bank_func1() { printf("------------ 中国农业银行 ------------ \n");}
void agricultural_bank_func2(){ printf("1. 地址: xx街道xxx号\n");}
void agricultural_bank_func3(){ printf("2. 当前排队人数: 5人\n"); }
void agricultural_bank_func4() { printf("3. 上班时间: 9:30 ~ 17:30\n"); } void icbc_bank_func1() { printf("-------------- 工商银行 --------------\n"); }
void icbc_bank_func2() { printf("1. 地址: yy街道yyy号\n"); }
void icbc_bank_func3() { printf("2. 当前排队人数: 6人\n"); }
void icbc_bank_func4() { printf("3. 上班时间: 10:00 ~ 17:30\n"); }void china_bank_func1() { printf("-------------- 中国银行 --------------\n"); }
void china_bank_func2() { printf("1. 地址: cc街道cc号\n"); }
void china_bank_func3() { printf("2. 当前排队人数: 8人\n"); }
void china_bank_func4() { printf("3. 上班时间: 10:00 ~ 17:00\n"); }void construction_bank_func1() { printf("-------------- 建设银行 --------------\n"); }
void construction_bank_func2() { printf("1. 地址: zz街道zzz号\n"); }
void construction_bank_func3() { printf("2. 当前排队人数: 4人\n"); }
void construction_bank_func4() { printf("3. 上班时间: 9:00 ~ 17:00\n"); }bankItem_t bank1 = {0, 0, {agricultural_bank_func1, agricultural_bank_func2, agricultural_bank_func3, agricultural_bank_func4}, 3, 0};
bankItem_t bank2 = {0, 0, {icbc_bank_func1, icbc_bank_func2, icbc_bank_func3, agricultural_bank_func4}, 3, 0};
bankItem_t bank3 = {0, 0, {china_bank_func1, china_bank_func2, china_bank_func3, china_bank_func4}, 3, 0};
bankItem_t bank4 = {0, 0, {construction_bank_func1, construction_bank_func2, construction_bank_func3, construction_bank_func4}, 3, 0};//用于控制哪个银行是否显示 bit[0]-农业,bit[1]-工商,bit[2]-中国,bit[3]-建设
unsigned char show_ctl = 0x02;  static bankItem_t* _show_ctl_arr[] = {&bank1, &bank2, &bank3, &bank4};
static char _check_show(unsigned char num)
{if ((show_ctl >> num) & 0x01)return 1;return 0;
}//初始化显示条目的顺序
int struct_init()
{char i = 0, ret, cnt = 0;bankItem_t* tail = NULL;for (i = 0; i < 4; i++){ret = _check_show(i);if (ret){//以下是双向链表的插入操作if (current_bankItem == NULL){_show_ctl_arr[i]->pre = _show_ctl_arr[i];_show_ctl_arr[i]->next = _show_ctl_arr[i];current_bankItem = _show_ctl_arr[i];}else{_show_ctl_arr[i]->next = current_bankItem;_show_ctl_arr[i]->pre = tail;tail->next = _show_ctl_arr[i];current_bankItem->pre = _show_ctl_arr[i];}tail = _show_ctl_arr[i];cnt++;}}return cnt;
}//获取键盘数据
int static _get_input(void)
{char buf[8];int ret;ret = read(0, buf, 8);  //0是标准输入的fdif (ret == 1)           //用于输入的是w/s/a/dreturn buf[0];else if (ret == 3 && buf[0] == 27 && buf[1] == 91)  //用于输入的是箭头符号return 127 + buf[2];                            //小于127的数都和键盘上按键有对应关系
}int main(void)
{int c;int ret;system("clear");if (!(ret = struct_init())) //struct_init()根据select_ctl变量初始化显示条目的顺序{printf("\t[附近没有银行(%#x)]\n\n", show_ctl);return 0;}printf("\t[附近有%d家银行(%#x)]\n\n", ret, show_ctl);//关闭终端的输入回显system("stty -echo -icanon");    printf("当前位于:\n");current_bankItem->showFunc[current_bankItem->subScrIndex]();printf("[请按左右键显示附近银行,上下键显示当前银行信息] \n");while (1){c = _get_input();if (c == 'a' || c == KEY_LEFT){current_bankItem = current_bankItem->pre;current_bankItem->subScrIndex = 0;}else if (c == 'd' || c == KEY_RIGHT){current_bankItem = current_bankItem->next;current_bankItem->subScrIndex = 0;}else if (c == 'w' || c == KEY_UP){if (current_bankItem->subScrIndex < current_bankItem->subScrMaxIndex)current_bankItem->subScrIndex++;}else if (c == 's' || c == KEY_DOWN){if (current_bankItem->subScrIndex > 1)current_bankItem->subScrIndex--;elsecurrent_bankItem->subScrIndex = 1;}else{printf("输入有误,请重新输入\n");continue;}current_bankItem->showFunc[current_bankItem->subScrIndex]();}//打开终端的输入回显system("stty echo icanon");        return 0;
}

  运行结果:

  比起用面向过程的方法实现,用面向对象思想和函数指针来设计按键应用程序,最大的好处在于其可扩展性,思路也清晰得多。

组合按键的软件设计(c语言)相关推荐

  1. 加按键的秒表设计c语言,秒表设计C语言程序.doc

    /*----------------------------------------------- 名称:数码管显示,按键控制秒表 论坛: 编写:shifang 日期:2009.5 修改:无 内容:中 ...

  2. 加按键的秒表设计c语言,秒表设计C语言程序

    名称 数码管显示 按键控制秒表 论坛 编写 shifang 日期 2009 5 修改 无 内容 中断按键控制 数码管显示 中断 0 控制计时和停止 中断 1 清零 include 包含头文件 一般情况 ...

  3. 南邮-软件设计实验(C++版)

    说在前面:所有代码实现均在C++环境下实现(与c基本一致,只是文件后缀名不一样).建立文件(*.cpp),粘贴代码即可,运行~ 若将代码直接复制进.c文件编译会出错哦! 如需C语言版移步软件设计-C语 ...

  4. 南邮-软件设计实验(Java GUI版)

    说在前面:利用此次课程设计的机会,慢慢地加强对编程语言实际应用的能力,不断地丰富知识点! 此篇文章是基于java语言开发GUI的应用程序,希望可以帮助一些想在Java学习中深入的同学(当然,这里应用的 ...

  5. 第二届 “国信蓝点”软件设计大赛 C语言模拟题(附程序题 解题程序)

    第二届 "国信蓝点"软件设计大赛 C语言模拟题 一 .以下是简答题: 1.代码填空 形如:"abccba","abcba"的串称为回文串,下 ...

  6. 编程,C语言,代码,黑客,软件,JAVA,DW,软件设计等等,怎么循序渐进学习?

    目录 1. 编程 2.代码 3. 软件 4.C语言,JAVA 5.黑客 6. DW 7.总结 有同学在评论区里问我技术方向和发展前景的问题,虽然认真回答了一下,但我的专业毕竟不是那个方向的,只能说了解 ...

  7. c语言项目研发实训设计,关于软件设计实训心得体会(通用5篇)

    关于软件设计实训心得体会(通用5篇) 当我们经过反思,对生活有了新的看法时,往往会写一篇心得体会,这样能够让人头脑更加清醒,目标更加明确.那么好的心得体会都具备一些什么特点呢?以下是小编精心整理的关于 ...

  8. UML ~ Unified Modeling Language ~ 统一建模语言。+ 软件设计原则。

    UML ~ Unified Modeling Language ~ 统一建模语言. 文章目录 UML ~ Unified Modeling Language ~ 统一建模语言. what. 类图. 类 ...

  9. c语言压力变送器程序设计,智能温度变送器信号处理软件算法与软件设计

    针对热电偶传感器电偶热电势与温度之间的非线性以及热电阻传感器阻值与温度间的非线性特征,设计一种通用智能温度变送器,并对现在广泛应用的线性化算法进行了改进.通过引入牛顿迭代法及Horner算法等对其进行 ...

  10. c语言嵌入式系统编程软件,C语言嵌入式系统编程软件设计研究论文

    C语言嵌入式系统编程软件设计研究论文 摘要:近年来,C语言编程在嵌入式系统越来越受到广大技术人员的青睐.介绍了C语言系统软件的编程思路,阐述了嵌入式系统编程软件架构的基本知识,包括模块划分.分层架构. ...

最新文章

  1. 百度CTO王海峰阐释AI融合创新,降低门槛,按下产业智能化加速键
  2. 树莓派设置NTP同步
  3. 真正简单的基于prototype的表单验证
  4. JBoss Fuse –一些鲜为人知的技巧
  5. Django中的F对象和Q对象
  6. 哀悼地震遇难者--5月19至21日为全国哀悼日
  7. 鼠标移入通过时间控制实现两个不同步的动画效果
  8. Debian - 搭建Debian本地APT源
  9. java项目超市购物管理系统
  10. 一个程序员的时间管理“辛”路历程
  11. eclipse更换jdk版本
  12. ARM处理器开发详解
  13. 某代理网站免费IP地址抓取测试
  14. 微信如何将聊天记录输出html或pdf
  15. 编写程序实现输入一个不超过100的十进制正整数,输出与其相等的二进制形式
  16. 种子计数法对种子公司的好处
  17. linux下jdk安装步骤_jdk下载安装步骤
  18. 新域名做网站优化,如何才能快速的被蜘蛛爬取收录?
  19. kitex 中 consistent hashing 的实现
  20. xamarin android 邮件,Xamarin Android:通过标准API(电子邮件,脸谱等)分享图像

热门文章

  1. 22牛客多校5 - Don‘t Starve(DP,依靠边更新端点)
  2. 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
  3. 【论文阅读】GCA:Graph Contrastive Learning with Adaptive Augmentation
  4. 常见遥感卫星基本参数大全
  5. 如何写一篇杀手级的软件工程师简历
  6. 【python学习笔记】爬虫总遇到的:'latin-1' codec can't encode character...
  7. 【IOS 之愤怒的小鸟】使用Lua语言:Wax框架详解
  8. python实现非常有趣的数学问题
  9. Netbox 开源 IPAM 管理工具搭建详细流程
  10. 【毕业设计_课程设计】基于机器视觉的智能快递分拣系统