我该如何使用结构数组制作菜单(将Lua代码转换为C++代码)?

我使用 lua 编写了一个菜单,现在想在 c++ 中实现相同的功能。以下是我尝试的代码,但我认为需要使用结构体并创建一个新的数组来实现。在 lua 中,我只需使用三个函数即可制作任何样式的菜单。

在下面的数组中:

char* menuname[]
= { "calc", "internet", "painter", "movie", "update", "exit" };

void SelectItem(char* menu[])
{
    fflush(stdin);

    int key = _getch();

    if (key == 13)

    {
        system("CLS");

        switch (selecteditem)
        {
        case 1:Calcmenu(); break;
        case 2:CtoF(); wait(); break;
        case 3:painter(); break;
        case 4:printf("Work In Progress\n"); wait(); break;
        case 5:printf("Work In Progress\n"); wait(); break;
        case 6:exit(0); wait(); break;
        default: mainmenu(); break;
        }
    }

    switch (key)
    {
        case 72: if(selecteditem > 1) selecteditem -= 1; break;
        case 80: if (selecteditem < 6) selecteditem += 1; break;
    }
}

void printmenu(char* menu[])
{
    gotoxy(20, 10);
    int menusize = strlen(*menu);

    for (int i = 0; i < menusize; i++)
    {
        if (i == selecteditem - 1)
        {
            gotoxy(30, 9 + i);
            printf(">>[%d]%s\n", i + 1, menu[i]);
        }
        else
        {
            gotoxy(30, 9 + i);
            printf("  [%d]%s\n", i + 1, menu[i]);
        }
    }
}

void main()
{
    while (1)
    {
        system("CLS");
        printmenu(menuname);
        SelectItem(menuname);
    }

}
点赞
用户1560821
用户1560821

你的编码相当优秀。我的意思是,Lua。在一些练习之后,你也会成为一个优秀的C程序员。

以下是如何在C中实现的(不是真正的C++):

#include <stdio.h>

/* ---------------------- type -------------------------*/

/* 将类型'menu_item'定义为菜单项。 */
typedef struct {
  char *text;
  void (*handler)();  /* 指向函数的指针 */
} menu_item;

/* --------------------- handlers ----------------------*/

void ItemCalc()
{
   printf("启动计算器...\n");
}

void ItemPainter()
{
   printf("启动画图工具...\n");
}

void ItemMovie()
{
   printf("启动电影播放器...\n");
}

/* --------------------- data --------------------------*/

menu_item my_menu[] = {
  { "calc", ItemCalc },
  { "painter", ItemPainter },
  { "movie", ItemMovie },
};

int my_menu_size = sizeof(my_menu) / sizeof(menu_item);

int selecteditem = 1;

/* -------------------- I/O-----------------------------*/

/*
  输入输出(I/O)非常依赖于平台。在我的系统上没有_getch()。
  因此为了让这个程序在所有系统上都可以运行,我们模拟了一个I/O系统:
*/

int _key = 0;

void simulate_key_press(int key)
{
    _key = key;
}

int read_key()
{
    return _key;
}

/* -----------------------------------------------------*/

void SelectItem(menu_item menu[], int menu_size)
{
    fflush(stdin);

    int key = read_key();

    if (key == 13)
    {
        printf("正在执行第 %d 项: \n", selecteditem);
        menu[selecteditem].handler();
    }
    else
    {
       int num = (key - '0'); // convert characters '1'..'9' to integers 1..9.

       if (num >= 1 && num <= menu_size) {
          selecteditem = num;
          printf("选中第 %d 项。\n", num);
       }
       else
          printf("无效按键。只能输入ENTER键或数字\n");
    }
}

void printmenu(menu_item menu[], int menu_size)
{
    int i;

    for (i = 0; i < menu_size; i++)
    {
        if (i == selecteditem - 1)
        {
            printf(">>[%d]%s\n", i + 1, menu[i].text);
        }
        else
        {
            printf("  [%d]%s\n", i + 1, menu[i].text);
        }
    }
}

void main()
{
    printmenu(my_menu, my_menu_size);
    simulate_key_press('2');
    SelectItem(my_menu, my_menu_size);
    printmenu(my_menu, my_menu_size);
    simulate_key_press(13);
    SelectItem(my_menu, my_menu_size);
}

关于使用数组:有两种方法可以确定它们的大小。上面,我在函数中明确告诉数组的大小。另一种方法是使用“哨兵”值标记数组的末尾:

menu_item my_menu[] = {
  { "calc", ItemCalc },
  { "painter", ItemPainter },
  { "movie", ItemMovie },
  { NULL, NULL },
};

然后在循环中,在达到这个元素时停止:

void printmenu(menu_item menu[])
{
    int i;

    for (i = 0; menu[i].text != NULL; i++)
    {

Lua这样的“脚本”语言和C(或C++)这样的低级语言之间有很多差异。我希望我的代码能激励你学习更多。即使最终你不会使用C,学习它了解机器的实际工作原理也是值得的。

2015-11-22 14:20:43