需要一些帮助,找出如何在我的C程序中做两件事

时间:2016-01-30 03:27:31

标签: c

我正在尝试在C程序中实现2项内容。我认为没有必要向您展示代码,因为我只想知道它们是否可以完成。我搜索了这个,但找不到任何明确的答案。

我在C中有这个程序,有很多函数,main()和3“子菜单”。 主要基本上只是程序的主菜单,它包含一个转到其他子菜单的情况,每个子菜单都转到与它们相关的功能。 我想知道的是如何使这些函数返回到那些子菜单,而不是一直回到main()。 在每个函数中,我都有一个“返回”;最后,但他们返回主菜单而不是子菜单。很清楚这一点。

我的另一个问题是,是否可以返回子菜单,在该子菜单的功能中输入数据之前或同时,通过按退格键,或者可以按下作业键,按下时取消功能(好像,我错误地点击了这个功能,想要回去)然后回到子菜单。

我真的很感激一些帮助,如果需要,我可以发布代码,或者它的一部分,因为它仍然很大,给出一些上下文(但要记住所有的变量,函数的名称,printf的什么不是葡萄牙文。)

编辑: 这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#define NR 1000

////////////////////////////////////////////////////////////////////////////////

typedef struct
{
  int idJogo;
  char nomeJogo[50];
  char genero[50];
  char empresa[50];
  char plataforma[50];
  long int preco;
  int estado; // 1 - Ocupado e 0 - Livre
}jogo;

typedef struct
{
  int idCliente;
  char nomeCliente[50];
  long int contacto;
  char cidade[50];
  int estado; // 1 - Ocupado e 0 - Livre
}cliente;

typedef struct
{
  int idCompra;
  int idCliente;
  int idJogo;
  char nomeJogo[50];
  char nomeCliente[50];
  char dataCompra[20];
  long int valor;
  int estado; // 1 - Ocupado e 0 - Livre
}compra;

////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// FICHEIROS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

///////////////////////////// Ler Ficheiros ////////////////////////////////////

int lerficheiros (jogo *jogo, cliente *cliente, compra *compra)
{
  int m, n, o;
  printf("\n\tA carregar os ficheiros...\n\n");
  FILE *fj, *fc, *fk;

  // Verifica se existe o ficheiro txt dos jogos
  if(!(fj=fopen("jogos.txt", "r")))
  {
    printf("\n\n\tO ficheiro de jogos não existe. <Enter> para criar o ficheiro.");getch();
    // Cria o ficheiro caso não exista
    fj=fopen("jogos.txt", "w");
    printf("\n\tO ficheiro dos jogos foi criado.");
  }
  // Lê o ficheiro dos jogos
  fj=fopen("jogos.txt", "r");
  for (m=1; m<NR; m++)
  {
    fscanf(fj, "%d\n", &jogo[m].idJogo);
    fscanf(fj, "%s\n", jogo[m].nomeJogo);
    fscanf(fj, "%s\n", jogo[m].genero);
    fscanf(fj, "%s\n", jogo[m].empresa);
    fscanf(fj, "%s\n", jogo[m].plataforma);
    fscanf(fj, "%ld\n", &jogo[m].preco);
    fscanf(fj, "%d\n", &jogo[m].estado);
  }
  fclose(fj);
  printf("\n\tFicheiro dos jogos lido <Enter> para continuar.\n");getch();

  //Igual para o ficheiro dos clientes
  if(!(fc=fopen("clientes.txt", "r")))
  {
    printf("\n\n\tO ficheiro de clientes não existe. <Enter> para criar o ficheiro.");getch();
    // Cria o ficheiro caso não exista
    fc=fopen("clientes.txt", "w");
    printf("\n\tO ficheiro dos clientes foi criado.");
  }
  // Lê o ficheiro dos clientes
  fc=fopen("clientes.txt", "r");
  for (n=1; n<NR; n++)
  {
    fscanf(fc, "%d\n", &cliente[n].idCliente);
    fscanf(fc, "%s\n", cliente[n].nomeCliente);
    fscanf(fc, "%ld\n", &cliente[n].contacto);
    fscanf(fc, "%s\n", cliente[n].cidade);
    fscanf(fc, "%d\n", &cliente[n].estado);
  }
  fclose(fc);
  printf("\n\tFicheiro dos clientes lido <Enter> para continuar.\n");getch();

  //Mais uma vez igual para o ficheiro das compras
  if(!(fk=fopen("compras.txt", "r")))
  {
    printf("\n\n\tO ficheiro de compras não existe. <Enter> para criar o ficheiro.");getch();
    // Cria o ficheiro caso não exista
    fk=fopen("compras.txt", "w");
    printf("\n\tO ficheiro de compras foi criado.");
  }
  // Lê o ficheiro das compras
  fk=fopen("compras.txt", "r");
  for (o=1; o<NR; o++)
  {
    fscanf(fk, "%d\n", &compra[o].idCompra);
    fscanf(fk, "%d\n", &compra[o].idCliente);
    fscanf(fk, "%d\n", &compra[o].idJogo);
    fscanf(fk, "%s\n", compra[o].nomeJogo);
    fscanf(fk, "%s\n", compra[o].nomeCliente);
    fscanf(fk, "%s\n", compra[o].dataCompra);
    fscanf(fk, "%ld\n", &compra[o].valor);
    fscanf(fk, "%d\n", &compra[o].estado);
  }
  fclose(fk);
  printf("\n\tFicheiro de compras lido <Enter> para continuar.\n");getch();

}

///////////////////////////// Gravar Ficheiros /////////////////////////////////

void gravarficheiros(char sair, jogo *jogo, cliente *cliente, compra *compra)
{
  int m, n, o;
  FILE *fj, *fc, *fk;

  // Grava ficheiro dos jogos

  fj=fopen("jogos.txt", "w");
  for(m=1;m<NR;m++)
    {
        if(jogo[m].estado==1)
        {
            fprintf(fj,"%d\n%s\n%s\n%s\n%s\n%ld\n%d\n",jogo[m].idJogo,jogo[m].nomeJogo,
      jogo[m].genero,jogo[m].empresa,jogo[m].plataforma,jogo[m].preco,jogo[m].estado);
        }
    }
    fclose(fj);

  // Grava ficheiro dos clientes

  fc=fopen("clientes.txt", "w");
  for(n=1;n<NR;n++)
    {
        if(cliente[n].estado==1)
        {
            fprintf(fc,"%d\n%s\n%ld\n%s\n%d\n",cliente[n].idCliente,cliente[n].nomeCliente,
      cliente[n].contacto,cliente[n].cidade,cliente[n].estado);
        }
    }
    fclose(fc);

  // Grava ficheiro de compras

  fk=fopen("compras.txt", "w");
  for(o=1;o<NR;o++)
    {
        if(compra[o].estado==1)
        {
            fprintf(fk,"%d\n%d\n%d\n%s\n%s\n%s\n%ld\n%d\n",compra[o].idCompra,compra[o].idCliente,
      compra[o].idJogo,compra[o].nomeJogo,compra[o].nomeCliente,compra[o].dataCompra,
      compra[o].valor,compra[o].estado);
        }
    }
    fclose(fj);

  if (sair=='S') exit(0);
    printf("\n\n\n\tFicheiros gravados <Enter> para continuar."); getch();

}

////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// JOGOS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

///////////////////////////// Consultar Jogos //////////////////////////////////

int consultarjogos(jogo *jogo)
{
  int n;
  system ("cls");
  printf("\n----------------------- LISTA DE JOGOS -----------------------\n");
  for(n=1;n<NR;n++)
  {
    if(jogo[n].estado==1)
    {
      printf("\n\tID: %d | Nome: %s | Genero: %s\n\tEmpresa: %s | ", jogo[n].idJogo, jogo[n].nomeJogo, jogo[n].genero, jogo[n].empresa);
      printf("Plataforma: %s | Preco: %ld€\n", jogo[n].plataforma, jogo[n].preco);
    }
  }
  printf("\n--------------------------------------------------------------\n");
  printf("\n\tListagem concluída. <Enter> para continuar.");
  getch();
}

///////////////////////////// Inserir Jogo /////////////////////////////////////

int inserirjogo(jogo *jogo)
{
  int n;
  system ("cls");
  fflush(stdin);
  printf("\n----------------------- INSERIR JOGO -----------------------\n");
  for(n=1;n<NR;n++)
  {
    if(jogo[n].estado!=1)
    {
      jogo[n].idJogo=rand() % 999;
      printf("\n\tNome do Jogo -> "); gets(jogo[n].nomeJogo);
      printf("\n\tGenero -> "); gets(jogo[n].genero);
      printf("\n\tEmpresa -> "); gets(jogo[n].empresa);
      printf("\n\tPlataforma -> "); gets(jogo[n].plataforma);
      printf("\n\tPreco (€) -> "); scanf("%ld", &jogo[n].preco); fflush(stdin);
      jogo[n].estado=1;
      printf("\n\n------------------------------------------------------------\n");
      printf("\n\tJogo inserido. <Enter> para continuar.");
      getch();
      return(0);
    }
  }
  printf("\n\tErro, não foi possivel inserir o jogo. <Enter> para continuar.");
  getch(); return(1);
}

/////////////////////////////// Alterar Jogo ///////////////////////////////////

int alterarjogo(jogo *jogo)
{
  int n;
  long int altjogo;
  system("cls");
  printf("\n----------------------- ALTERAR JOGO -----------------------\n");
  printf("\n\tID do Jogo que pretende alterar: ");
  scanf("%d", &altjogo); fflush(stdin);
  for(n=1;n<NR;n++)
  {
    if(jogo[n].idJogo==altjogo)
    {
      jogo[n].estado=0;
      printf("\n\n\tID: %d | Nome: %s | Genero: %s\n\tEmpresa: %s | ", jogo[n].idJogo, jogo[n].nomeJogo, jogo[n].genero, jogo[n].empresa);
      printf("Plataforma: %s | Preco: %ld€", jogo[n].plataforma, jogo[n].preco);
      printf("\n\n\tNome do Jogo -> "); gets(jogo[n].nomeJogo);
      printf("\n\tGenero -> "); gets(jogo[n].genero);
      printf("\n\tEmpresa -> "); gets(jogo[n].empresa);
      printf("\n\tPlataforma -> "); gets(jogo[n].plataforma);
      printf("\n\tPreco (€) -> "); scanf("%ld", &jogo[n].preco); fflush(stdin);
      jogo[n].estado=1;
      printf("\n\n------------------------------------------------------------\n");
      printf("\n\tJogo alterado. <Enter> para continuar.");
      getch();
      return(0);
    }
  }
  printf("\n\tErro, jogo não encontrado. <Enter> para continuar.");
    getch(); return(1);
}

/////////////////////////////// Eliminar Jogo //////////////////////////////////

int eliminarjogo(jogo *jogo)
{
  char conf;
  int n;
  long int elimjogo;
  system("cls");
  printf("\n----------------------- ELIMINAR JOGO -----------------------\n");
  printf("\n\tID do Jogo que pretende eliminar: ");
  scanf("%ld", &elimjogo); fflush(stdin);
  for(n=1;n<NR;n++)
  {
    if(jogo[n].idJogo==elimjogo)
    {
      printf("\n\n\tID: %d | Nome: %s | Genero: %s\n\tEmpresa: %s | ", jogo[n].idJogo, jogo[n].nomeJogo, jogo[n].genero, jogo[n].empresa);
      printf("Plataforma: %s | Preco: %ld€", jogo[n].plataforma, jogo[n].preco);
      printf("\n\n\tTem a certeza que quer eliminar o jogo? <S/N>");
      conf=toupper(getch());
      if (conf!='S') return(1);
      jogo[n].estado=0;
      printf("\n\n-------------------------------------------------------------\n");
      printf("\n\tJogo eliminado. <Enter> para continuar.");
      getch();
      return(0);
    }
  }
  printf("\n\tErro, jogo não encontrado. <Enter> para continuar.");
  getch(); return(1);
}

///////////////////////////// Menu Gerir Jogos /////////////////////////////////

int gerirjogos(jogo *jogo)
{
  system("cls");
  char op;
  do {
    printf("\n----------------------- GERIR JOGOS -----------------------\n");
    printf("\n\t 1 - Consultar Jogos\n\t 2 - Inserir Jogo\n\t 3 - Alterar Jogo\n\t 4 - Eliminar Jogo\n\t 0 - Voltar");
    printf("\n\n-----------------------------------------------------------\n");
    printf("\n\t Opcao:"); op=getch();
  } while(op<'0' || op>'4');
  switch (op){
    case '1': consultarjogos(jogo); break;
    case '2': inserirjogo(jogo);    break;
    case '3': alterarjogo(jogo);    break;
    case '4': eliminarjogo(jogo);   break;
    case '0': return(0);            break;
  }
}

////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// CLIENTES /////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

////////////////////////// Consultar Clientes //////////////////////////////////

int consultarclientes(cliente *cliente)
{
  int n;
  system ("cls");
  printf("\n----------------------- LISTA DE CLIENTES -----------------------\n");
  for(n=1;n<NR;n++)
  {
    if(cliente[n].estado==1)
    {
      printf("\n\tID: %d | Nome: %s", cliente[n].idCliente, cliente[n].nomeCliente);
      printf("\n\tContacto: %ld | Cidade: %s\n", cliente[n].contacto, cliente[n].cidade);
    }
  }
  printf("\n-----------------------------------------------------------------\n");
  printf("\n\tListagem concluída. <Enter> para continuar.");
  getch();
}

///////////////////////////// Inserir Cliente //////////////////////////////////

int inserircliente(cliente *cliente)
{
  int n;
  system ("cls");
  fflush(stdin);
  printf("\n----------------------- INSERIR CLIENTE -----------------------\n");
  for(n=1;n<NR;n++)
  {
    if(cliente[n].estado!=1)
    {
      cliente[n].idCliente=rand() % 999;
      printf("\n\tNome do Cliente -> "); gets(cliente[n].nomeCliente);
      printf("\n\tContacto -> "); scanf("%ld", &cliente[n].contacto); fflush(stdin);
      printf("\n\tCidade -> "); gets(cliente[n].cidade);
      cliente[n].estado=1;
      printf("\n\n---------------------------------------------------------------\n");
      printf("\n\tCliente inserido. <Enter> para continuar.");
      getch(); return(0);
    }
  }
  printf("\n\tErro, não foi possivel inserir o cliente. <Enter> para continuar.");
  getch(); return(1);
}

/////////////////////////////// Alterar Cliente ////////////////////////////////

int alterarcliente(cliente *cliente)
{
  int n;
  long int altcliente;
  system("cls");
  printf("\n----------------------- ALTERAR CLIENTE -----------------------\n");
  printf("\n\tID do Cliente que pretende eliminar: ");
  scanf("%d", &altcliente); fflush(stdin);
  for(n=1;n<NR;n++)
  {
    if(cliente[n].idCliente==altcliente)
    {
      cliente[n].estado=0;
      printf("\n\n\tID: %d | Nome: %s | ", cliente[n].idCliente, cliente[n].nomeCliente);
      printf("\n\tContacto: %ld | Cidade: %s", cliente[n].contacto, cliente[n].cidade);
      printf("\n\n\tNome do Cliente -> "); gets(cliente[n].nomeCliente);
      printf("\n\tContacto -> "); scanf("%ld", &cliente[n].contacto); fflush(stdin);
      printf("\n\tCidade -> "); gets(cliente[n].cidade);
      cliente[n].estado=1;
      printf("\n\n---------------------------------------------------------------\n");
      printf("\n\tCliente alterado. <Enter> para continuar.");
      getch(); return(0);
    }
  }
  printf("Erro, cliente não encontrado. <Enter> para continuar.");
    getch(); return(1);
}

//////////////////////////// Eliminar Cliente //////////////////////////////////

int eliminarcliente(cliente *cliente)
{
  char conf;
  int n;
  long int elimcliente;
  system("cls");
  printf("\n----------------------- ELIMINAR CLIENTE -----------------------\n");
  printf("\n\tID do Cliente que pretende eliminar: ");
  scanf("%ld", &elimcliente); fflush(stdin);
  for(n=1;n<NR;n++)
  {
    if(cliente[n].idCliente==elimcliente)
    {
      printf("\n\n\tID: %d | Nome: %s | ", cliente[n].idCliente, cliente[n].nomeCliente);
      printf("\n\tContacto: %ld | Cidade: %s", cliente[n].contacto, cliente[n].cidade);
      printf("\n\n\tTem a certeza que quer eliminar o cliente? <S/N>");
      conf=toupper(getch());
      if (conf!='S') return(1);
      cliente[n].estado=0;
      printf("\n\n----------------------------------------------------------------\n");
      printf("\n\tCliente eliminado. <Enter> para continuar.");
      getch();
      return(0);
    }
  }
  printf("\n\tErro, cliente não encontrado. <Enter> para continuar.");
  getch(); return(1);
}

///////////////////////////// Menu Gerir Clientes //////////////////////////////

int gerirclientes(cliente *cliente)
{
  system("cls");
  char op;
  do {
    printf("\n----------------------- GERIR CLIENTES -----------------------\n");
    printf("\n\t 1 - Consultar Clientes\n\t 2 - Inserir Cliente\n\t 3 - Alterar Cliente\n\t 4 - Eliminar Cliente\n\t 0 - Voltar");
    printf("\n\n--------------------------------------------------------------\n");
    printf("\n\t Opcao:"); op=getch();
  } while(op<'0' || op>'4');
  switch (op){
    case '1': consultarclientes(cliente); break;
    case '2': inserircliente(cliente);    break;
    case '3': alterarcliente(cliente);    break;
    case '4': eliminarcliente(cliente);   break;
    case '0': return(0);                  break;
  }
}

////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// COMPRAS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

///////////////////////////// Consultar Compras ////////////////////////////////

int consultarcompras(compra *compra)
{
  int n;
  system ("cls");
  printf("\n----------------------- REGISTO DE COMPRAS -----------------------\n");
  for(n=1;n<NR;n++)
  {
    if(compra[n].estado==1)
    {
      printf("\n\tID Compra: %d | ID Jogo: %d | ID Cliente: %d", compra[n].idCompra, compra[n].idJogo, compra[n].idCliente);
      printf("\n\tNome do Jogo: %s | Nome do Cliente: %s", compra[n].nomeJogo, compra[n].nomeCliente);
      printf("\n\tData da Compra: %s | Valor da Compra: %ld€\n", compra[n].dataCompra, compra[n].valor);
    }
  }
  printf("\n------------------------------------------------------------------\n");
  printf("\n\tListagem concluída. <Enter> para continuar.");
  getch();
}

///////////////////////////////// Nova Compra //////////////////////////////////

int novacompra(compra *compra, jogo *jogo, cliente *cliente)
{
  int n, m, o, idj, idc;
  system ("cls");
  printf("\n----------------------- NOVA COMPRA -----------------------\n");
  for(n=1;n<NR;n++)
  {
    if(compra[n].estado!=1)
    {
      compra[n].idCompra=rand() % 999;
      printf("\n\tID do Jogo -> "); scanf("%d", &idj); fflush(stdin);
      for(m=1;m<NR;m++)
      {
        if(jogo[m].idJogo == idj)
        {
          printf("\n\tNome do Jogo: %s", jogo[m].nomeJogo);
          compra[n].idJogo = jogo[m].idJogo;
          strcpy(compra[n].nomeJogo, jogo[m].nomeJogo);
          compra[n].valor = jogo[m].preco;
          printf("\n\n\tID do Cliente -> "); scanf("%d", &idc); fflush(stdin);
          for(o=1;o<NR;o++)
          {
            if(cliente[o].idCliente == idc)
            {
              printf("\n\tNome do Cliente: %s", cliente[o].nomeCliente);
              compra[n].idCliente = cliente[o].idCliente;
              strcpy(compra[n].nomeCliente, cliente[o].nomeCliente);
              printf("\n\n\tData da Compra (dd/mm/aaaa) -> "); scanf("%s", compra[n].dataCompra);
              printf("\n\tValor: %ld€", compra[n].valor);
              compra[n].estado=1;
              printf("\n\n-----------------------------------------------------------\n");
              printf("\n\tCompra registada. <Enter> para continuar.");
              getch(); return(0);
            }
          }
        }
      }
    }
  }
  printf("\n\tErro, não foi possivel concluir a compra. <Enter> para continuar.");
  getch(); return(1);
}

//////////////////////////// Eliminar Compra ///////////////////////////////////

int eliminarcompra(compra *compra)
{
  char conf;
  int n;
  long int elimcompra;
  system("cls");
  printf("\n----------------------- ELIMINAR COMPRA -----------------------\n");
  printf("\n\tID da Compra que pretende eliminar: ");
  scanf("%ld", &elimcompra); fflush(stdin);
  for(n=1;n<NR;n++)
  {
    if(compra[n].idCompra==elimcompra)
    {
      printf("\n\n\tID Compra: %d | ID Jogo: %d | ID Cliente: %d", compra[n].idCompra, compra[n].idJogo, compra[n].idCliente);
      printf("\n\tNome do Jogo: %s | Nome do Cliente: %s", compra[n].nomeJogo, compra[n].nomeCliente);
      printf("\n\tData da Compra: %s | Valor da Compra: %ld€", compra[n].dataCompra, compra[n].valor);
      printf("\n\n\tTem a certeza que quer eliminar a compra? <S/N>");
      conf=toupper(getch());
      if (conf!='S') return(1);
      compra[n].estado=0;
      printf("\n\n---------------------------------------------------------------\n");
      printf("\n\tCompra eliminada. <Enter> para continuar.");
      getch();
      return(0);
    }
  }
  printf("\n\tErro, registo da compra não encontrado. <Enter> para continuar.");
  getch(); return(1);
}

///////////////////////////// Menu Gerir Compras ///////////////////////////////

int gerircompras(compra *compra, jogo *jogo, cliente *cliente)
{
  system("cls");
  char op;
  do {
    printf("\n----------------------- GERIR COMPRAS -----------------------\n");
    printf("\n\t 1 - Consultar Compras\n\t 2 - Nova Compra\n\t 3 - Eliminar Compra\n\t 0 - Voltar");
    printf("\n\n-------------------------------------------------------------\n");
    printf("\n\t Opcao:"); op=getch();
  } while(op<'0' || op>'3');
  switch (op){
    case '1': consultarcompras(compra);                break;
    case '2': novacompra(compra, jogo, cliente);       break;
    case '3': eliminarcompra(compra);                  break;
    case '0': return(0);                               break;
  }
}

////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// MAIN /////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

main()
{
  system("COLOR 1F");
  char op, sair='N';
  int n;
  srand(time(NULL));
  jogo jogo[NR];
  cliente cliente[NR];
  compra compra[NR];
  system ("chcp 1252");
  for(n=1;n<NR;n++)
  {
    jogo[n].estado=0;
    cliente[n].estado=0;
    compra[n].estado=0;
  }
  lerficheiros(jogo, cliente, compra);
  for(;;)
  {
  do
  {
    system("cls");
    printf("\n----------------------- LOJA DE JOGOS -----------------------\n");
    printf("\n\t 1 - Gerir Jogos\n\t 2 - Gerir Clientes\n\t 3 - Gerir Compras");
    printf("\n\t 4 - Ler Ficheiros\n\t 5 - Gravar Ficheiros \n\t 0 - Sair");
    printf("\n\n-------------------------------------------------------------\n");
    printf("\n\t Opcao:"); op=getch();
  }while (op<'0' || op>'5');
  switch (op) {
    case '1': gerirjogos(jogo);                                break;
    case '2': gerirclientes(cliente);                          break;
    case '3': gerircompras(compra, jogo, cliente);             break;
    case '4': lerficheiros(jogo, cliente, compra);             break;
    case '5': gravarficheiros(sair, jogo, cliente, compra);    break;
    case '0': sair='S'; gravarficheiros(sair, jogo, cliente, compra);
  }
}
}

1 个答案:

答案 0 :(得分:0)

据我所知:

#include <stdio.h>
#include <string.h>

void pause(void);
void print_result(char **menu, int ret);
void clrscr(void);

#define MENU_INPUT(a)   menu_input(a,sizeof(a)/sizeof(*a))


char * main_menu[]={
    "Display First Menu",
    "Display Sencond Menu"
    };

 char * first_menu[]={
    "Format Drive C:",
    "Partition First Drive",
    "Scan Drive"
    };
char * second_menu[]={
    "Display an image",
    "Play a sound"
    };


int menu_input(char **menu,int items){
    int i, j;

    clrscr();

    for(i = 1; i<=items;i++)
        printf(" %d - %s\n",i, menu[i-1]);

    printf(" 0 - to cancel\n ");

    do{
        scanf("%d", &i);
    }while( i < 0 || i > items);

    return i;   
}





int main(void){
    int ret;
    for( ; ; ){
        switch( MENU_INPUT( main_menu ) ){
            case 0:
                return 0;
            case 1:
                ret = MENU_INPUT( first_menu );
                print_result( first_menu, ret );
                break;
            case 2:
                ret= MENU_INPUT(second_menu);
                print_result( second_menu, ret );
       }
    }

    return 0;
}


// these are some helpper functions

void pause(void){
    char c;
    printf("press enter to continue\n");
    scanf(" %c", &c);
}


void print_result(char **menu, int ret){
    if( ret ){
        printf("You pressed %d (%s)\n", ret, first_menu[ ret - 1 ] );
        pause();
    }
}


// clear screen
void clrscr(void){
#ifdef WIN32
    char *cmd = "cls";
#else
    char *cmd = "tput reset";
#endif

    system(cmd);
}