当前位置: 首页 > ds >正文

按键实现多个界面切换的方法

在C语言中实现三个界面的按键切换

下面我将介绍几种实现三个界面切换的方法,并分析它们的优缺点。

方法1:简单条件语句实现

#include <stdio.h>
#include <conio.h> // 用于getch()void screen1() {printf("=== 界面1 ===\n");printf("功能1\n");printf("按2切换到界面2,按3切换到界面3\n");
}void screen2() {printf("=== 界面2 ===\n");printf("功能2\n");printf("按1切换到界面1,按3切换到界面3\n");
}void screen3() {printf("=== 界面3 ===\n");printf("功能3\n");printf("按1切换到界面1,按2切换到界面2\n");
}int main() {int current_screen = 1; // 初始界面为1while(1) {system("cls"); // 清屏(Windows)// system("clear"); // Linux/Mac// 显示当前界面switch(current_screen) {case 1: screen1(); break;case 2: screen2(); break;case 3: screen3(); break;}// 获取按键输入char input = getch();// 处理界面切换switch(input) {case '1': current_screen = 1; break;case '2': current_screen = 2; break;case '3': current_screen = 3; break;case 'q': return 0; // 退出程序}}return 0;
}

方法2:函数指针数组实现

#include <stdio.h>
#include <conio.h>typedef void (*ScreenFunc)();// 三个界面函数
void screen1() {printf("界面1 - 按2或3切换\n");
}void screen2() {printf("界面2 - 按1或3切换\n");
}void screen3() {printf("界面3 - 按1或2切换\n");
}int main() {ScreenFunc screens[] = {screen1, screen2, screen3};int current = 0; // 从界面1开始while(1) {system("cls");screens[current](); // 显示当前界面char input = getch();// 处理按键输入if(input >= '1' && input <= '3') {current = input - '1'; // 转换为0-based索引} else if(input == 'q') {break; // 退出}}return 0;
}

方法3:状态机模式实现

#include <stdio.h>
#include <conio.h>typedef enum {SCREEN_1,SCREEN_2,SCREEN_3,SCREEN_EXIT
} ScreenState;void handleScreen1(ScreenState *state) {printf("=== 界面1 ===\n");printf("按2切换到界面2,按3切换到界面3\n");char input = getch();switch(input) {case '2': *state = SCREEN_2; break;case '3': *state = SCREEN_3; break;case 'q': *state = SCREEN_EXIT; break;}
}void handleScreen2(ScreenState *state) {printf("=== 界面2 ===\n");printf("按1切换到界面1,按3切换到界面3\n");char input = getch();switch(input) {case '1': *state = SCREEN_1; break;case '3': *state = SCREEN_3; break;case 'q': *state = SCREEN_EXIT; break;}
}void handleScreen3(ScreenState *state) {printf("=== 界面3 ===\n");printf("按1切换到界面1,按2切换到界面2\n");char input = getch();switch(input) {case '1': *state = SCREEN_1; break;case '2': *state = SCREEN_2; break;case 'q': *state = SCREEN_EXIT; break;}
}int main() {ScreenState current = SCREEN_1;while(current != SCREEN_EXIT) {system("cls");switch(current) {case SCREEN_1: handleScreen1(&current); break;case SCREEN_2: handleScreen2(&current); break;case SCREEN_3: handleScreen3(&current); break;default: break;}}return 0;
}

方法4:面向对象风格实现(使用结构体)

#include <stdio.h>
#include <conio.h>typedef struct {void (*show)();void (*handleInput)(int*);
} Screen;void show1() { printf("界面1 - 按2或3切换\n"); }
void show2() { printf("界面2 - 按1或3切换\n"); }
void show3() { printf("界面3 - 按1或2切换\n"); }void handleInput1(int* current) {char input = getch();if(input == '2') *current = 1;else if(input == '3') *current = 2;else if(input == 'q') *current = -1;
}void handleInput2(int* current) {char input = getch();if(input == '1') *current = 0;else if(input == '3') *current = 2;else if(input == 'q') *current = -1;
}void handleInput3(int* current) {char input = getch();if(input == '1') *current = 0;else if(input == '2') *current = 1;else if(input == 'q') *current = -1;
}int main() {Screen screens[] = {{show1, handleInput1},{show2, handleInput2},{show3, handleInput3}};int current = 0;while(current != -1) {system("cls");screens[current].show();screens[current].handleInput(&current);}return 0;
}

各方法优缺点分析

  1. 简单条件语句

    • 优点:直观易懂,适合初学者
    • 缺点:扩展性差,界面增多时代码会变得冗长
  2. 函数指针数组

    • 优点:结构清晰,易于添加新界面
    • 缺点:界面逻辑分散,输入处理不够集中
  3. 状态机模式

    • 优点:结构清晰,状态转换明确,易于扩展
    • 缺点:实现稍复杂,需要定义多个处理函数
  4. 面向对象风格

    • 优点:高内聚低耦合,最适合大型项目
    • 缺点:C语言实现面向对象需要额外工作

推荐方案

对于三个界面的切换,我推荐状态机模式,因为:

  1. 结构清晰,易于理解和维护
  2. 每个界面的显示和输入处理集中在一起
  3. 方便未来扩展更多界面
  4. 状态转换逻辑明确

如果项目可能继续增加更多界面,可以考虑使用面向对象风格的实现,虽然C语言不是面向对象语言,但通过结构体和函数指针模拟面向对象特性,可以获得更好的代码组织。

http://www.xdnf.cn/news/5326.html

相关文章:

  • 从需求到用例的AI路径:准确率与挑战
  • PyQt5基础:QWidget类的全面解析与应用实践
  • LinkedList源码解析
  • stm32 lcd绘制波形和频谱
  • android HashMap和List该如何选择
  • Go多服务项目结构优化:为何每个服务单独设置internal目录?
  • ChatBI选型指南:主流产品技术对比与落地建议
  • 【Docker 新手入门指南】第四章:镜像加速
  • 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字
  • [6-2] 定时器定时中断定时器外部时钟 江协科技学习笔记(41个知识点)
  • JMeter 中实现 双 WebSocket(双WS)连接
  • 【Linux实践系列】:进程间通信:万字详解共享内存实现通信
  • 系统分析与设计期末复习
  • 高效全能PDF工具,支持OCR识别
  • ThinkPad T440P如何从U盘安装Ubuntu24.04系统
  • QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版)
  • [亲测搭建可用]LoliMeow主题二次元风博客WordPress主题模板
  • Android 关闭Activity切换过渡动画
  • 栈溢出攻击最基本原理
  • 宝塔服务安装使用的保姆级教程
  • Redis 集群
  • 安装或更新 CUDA Toolkit - Ubuntu - RuntimeError
  • CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发
  • WPF中如何自定义控件
  • 【Oracle认证】MySQL 8.0 OCP 认证考试英文版(MySQL30 周年版)
  • #Redis黑马点评#(四)优惠券秒杀
  • Fabric系列 - SoftHSM 软件模拟HSM
  • 前端SSE技术详解:从入门到实战的完整指南
  • C++泛型编程(二):现代C++特性
  • 常见的降维算法