热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

傻孩子菜单框架

转载自:http:blog.csdn.netyangluoningarticledetails9313677#include<stdio.h>#include<str

转载自:http://blog.csdn.net/yangluoning/article/details/9313677

#include 
#include

#define Null 0
char over=0; //结束标志

//结构体类型定义
struct MenuItem
{
char MenuCount; //结构体数组的元素个数
char *DisplayString; //当前LCD显示的信息
void (*Subs)(); //执行的函数的指针.
struct MenuItem *Childrenms; //指向子节点的指针
struct MenuItem *Parentms; //指向父节点的指针
};

//函数声明
void Nop(void);
void DoSomething(struct MenuItem *manyou);
void GameOver(void);
void Locate(struct MenuItem *manyou);
void Run(struct MenuItem *manyou);

//====================================
//结构体声明
struct MenuItem m0_main[4];
struct MenuItem m1_file[5];
struct MenuItem m1_edit[4];
struct MenuItem m1_view[2];
struct MenuItem m2_font[3];
struct MenuItem m1_help[3];

//====================================
//结构体实现
struct MenuItem m0_main[4]=
{
{4,"file",Nop,m1_file,Null},
{4,"edit",Nop,m1_edit,Null},
{4,"view",Nop,m1_view,Null},
{4,"help",Nop,m1_help,Null},
};

struct MenuItem m1_file[5]=
{
{5,"open",DoSomething,Null,m0_main},
{5,"save",DoSomething,Null,m0_main},
{5,"save as",DoSomething,Null,m0_main},
{5,"print",DoSomething,Null,m0_main},
{5,"exit",GameOver,Null,m0_main},
};

struct MenuItem m1_edit[4]=
{
{4,"undo",DoSomething,Null,m0_main},
{4,"redo",DoSomething,Null,m0_main},
{4,"copy",DoSomething,Null,m0_main},
{4,"paste",DoSomething,Null,m0_main},
};

struct MenuItem m1_view[2]=
{
{2,"font",Nop,m2_font,m0_main},
{2,"color",DoSomething,Null,m0_main},
};

struct MenuItem m2_font[3]=
{
{3,"songti",DoSomething,Null,m1_view},
{3,"heiti",DoSomething,Null,m1_view},
{3,"youyuan",DoSomething,Null,m1_view},
};

struct MenuItem m1_help[3]=
{
{3,"index",DoSomething,Null,m0_main},
{3,"online",DoSomething,Null,m0_main},
{3,"about",DoSomething,Null,m0_main},
};

//====================================
//函数实现
void Locate(struct MenuItem *manyou)
{
printf("Now we at %s\n" ,manyou->DisplayString);
}

void Run(struct MenuItem *manyou)
{
(*(manyou->Subs))(manyou);
}

void Nop(void)
{}

void DoSomething(struct MenuItem *manyou)
{
printf("we have done %s\n" ,manyou->DisplayString);
}

void GameOver(void)
{
over=1;
printf("Now Game is Over ");
getchar();
}

//====================================
//主函数
int main(int argc, char *argv[])
{
char charin; //输入的字符
char menuid[3]={0,0,0}; //某一级的菜单的偏移量的记录数组
char i=0; //上面数组的下标值

struct MenuItem *manyou; //漫游,在菜单中漫游

manyou=&m0_main[0]; //开始的位置
Locate(manyou); //输出

while (!over) //如果还没完
{
charin=getchar(); //读取键盘字符
switch (charin) //根据字符跳转
{
case '0': //到同级菜单的后一项
{
menuid[i]++;
if (menuid[i]>manyou->MenuCount-1) menuid[i]=0;//可以看到MenuCount项是必要的
Locate(manyou+menuid[i]);
break;
}
case '1': //到同级菜单的前一项
{
if (menuid[i]==0) menuid[i]=manyou->MenuCount-1;//可以看到MenuCount项是必要的
else menuid[i]--;
Locate(manyou+menuid[i]);
break;
}
case '+': //到下一级菜单,无下级时执行某功能
{
if ((manyou+menuid[i])->Childrenms !=Null)
{
manyou=(manyou+menuid[i])->Childrenms;
i++;
menuid[i]=0;
Locate(manyou+menuid[i]);
}
else
{
Run(manyou+menuid[i]);
}
break;
}
case '-': //到上一级菜单,无上级时给出些提示
{
if ((manyou+menuid[i])->Parentms !=Null)
{
manyou=(manyou+menuid[i])->Parentms;
i--;
Locate(manyou+menuid[i]);
}
else
{
printf("You are at the top of menu");
}
break;
}
default: break;
}
}
return 0;
}



推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
dmcm0010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有