Jump to content

Dúvida a fechar menu dentro de um switch-case


MikleCod

Recommended Posts

Estou com uma duvida, eu tenho este menu. Na ultima case (case 6), o menu tem de fechar, mas não sei o que fazer, podem me ajudar. Estou a trabalhar em código de C++.

//Projeto UFCD - programação
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//declaração de variaveis
int opcao, numero1, numero2, ntrabalhadores;
ofstream ficheiro ("GESTAOSALARIAL.txt");

struct trabalhadores
{
    string nome;
    int nhoras;
    int escalao;
};

//ARRAY QUE GUARDA NOMES DOS TRABALHADORES
trabalhadores conjtrabalhadores[1000];

//FUNCAO SALARIO
float salario (int escalao, float nhoras)
{
    float res;
    
    if (escalao == 1){
        res= 150 * nhoras;
    }
    else if (escalao == 2){
        res= 200 * nhoras;
    }    
    else if (escalao == 3){
        res= 250 * nhoras;
    }
    else if (escalao == 4){
        res= 300 * nhoras;
    }
    else {
        cout<<"Escalao Invalido"<<endl;
    }    
    return res;
}


int main ()
{
    menu:
    cout<<system("cls");
    cout<<" \t\t_________________________________"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|         GESTAO SALARIAL       |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|     1- Inserir trabalhador    |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|     2- Lista de trabalhadores |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|     3- Escaloes               |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|     4- Salarios               |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|     5- Gravar                 |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t|                               |"<<endl;
    cout<<" \t\t|     6- Sair                   |"<<endl;
    cout<<" \t\t|_______________________________|"<<endl;
    cout<<" \t\t Selecione a opcao pretendida: ";
    cin>>opcao;
    
    //EXITs
    switch(opcao)
    {
        case 1:
             cout<<"\n\t\t\t Quantos trabalhadores pretende inserir? ";
               cin>>ntrabalhadores;    
               for (int i=0; i<ntrabalhadores;i++)
               {
                       cout<<"\n\t\t\t Introduza o nome do "<<i+1<< " trabalhador: ";
                       cin>>conjtrabalhadores[i].nome;
                    cout<<"\t\t\t Introduza o numero de horas do "<<i+1<< " trabalhador: ";
                       cin>>conjtrabalhadores[i].nhoras;
                    cout<<"\t\t\t Introduza o escalao do "<<i+1<< " trabalhador: ";
                       cin>>conjtrabalhadores[i].escalao;                       
                    cout<<endl;                   
               }
               break;
        
        case 2:
                 cout<<" \n\t\t\t *** LISTAGEM DOS TRABALHADORES *** "<<endl;
               for (int i=0; i<ntrabalhadores;i++)
                       {
                           cout<<"\n\t\t\t Nome do "<<i+1<< " trabalhador: "<<conjtrabalhadores[i].nome<<endl;
                        cout<<"\t\t\t Numero de horas do "<<i+1<< " trabalhador: "<<conjtrabalhadores[i].nhoras<<endl;
                        cout<<"\t\t\t Escalao do "<<i+1<< " trabalhador: "<<conjtrabalhadores[i].escalao<<endl;
                    
                    }    
                break;                

        case 3: 
            system("cls");
            cout<<"\t\t\t______________________________"<<endl;
            cout<<"\t\t\t|           |                |"<<endl;
            cout<<"\t\t\t|  ESCALAO  | MONTANTE GANHO |"<<endl;
            cout<<"\t\t\t|___________|________________|"<<endl;
            cout<<"\t\t\t|           |                |"<<endl;
            cout<<"\t\t\t|     1     |     150/H      |"<<endl;
            cout<<"\t\t\t|___________|________________|"<<endl;
            cout<<"\t\t\t|           |                |"<<endl;
            cout<<"\t\t\t|     2     |     200/H      |"<<endl;
            cout<<"\t\t\t|___________|________________|"<<endl;
            cout<<"\t\t\t|           |                |"<<endl;
            cout<<"\t\t\t|     3     |     250/H      |"<<endl;
            cout<<"\t\t\t|___________|________________|"<<endl;
            cout<<"\t\t\t|           |                |"<<endl;
            cout<<"\t\t\t|     4     |     300/H      |"<<endl; 
            cout<<"\t\t\t|___________|________________|"<<endl<<endl;
            break;
        
    
    
        case 4:
        {
            //cin>> ntrabalhadores;
            for (int i=0; i<ntrabalhadores;i++)
            {
                //SALARIO DO PRIMEIRO TRABALHADOR
                cout<<"\t O "<<conjtrabalhadores[i].nome<<" tem o escalao: "<<conjtrabalhadores[i].escalao<<endl;
                cout<<"\t O "<<conjtrabalhadores[i].nome<<" trabalhou: "<<conjtrabalhadores[i].nhoras<<endl;
                cout<<"\t --> O salario do "<<conjtrabalhadores[i].nome<<" e: "<<salario(conjtrabalhadores[i].escalao, conjtrabalhadores[i].nhoras)<<" euros"<<endl<<endl;
            }
                        
        }
                break;
        
        case 5:
               if (ficheiro.is_open())
               {
                       ficheiro<<" ***** PROGRAMA GESTAO SALARIAL *****"<<endl;
                       for (int i=0; i<ntrabalhadores;i++)
                    {
                           ficheiro<<"\t\t\t O"<<i+1<<conjtrabalhadores[i].nome<<endl;
                        ficheiro<<endl;
                        cout<<"\t\t\t O salario do "<<conjtrabalhadores[i].nome<<"e: "<<salario(conjtrabalhadores[i].escalao, conjtrabalhadores[i].nhoras)<< " euros"<<endl;           
                      }
                      
                    ficheiro.close();                
               }
               
               else
               {
                       cout<<"NAO E PERMITIDO GRAVAR"<<endl;    
                    cout<<"\t\t\t A Informação foi gravada com sucesso!"<<endl;    
                }        
                      break;
               
        case 6:
        {
            system ("ext");
        }
        
        
        
               default: cout<<"\n\t\t\t**OPCAO INVALIDA!!!**"<<endl<<endl;
            break;    
    }
        system("pause");
        goto menu;
        return 0;
        cout<<endl<<endl<<endl<<endl;
}    


 

Edited by thoga31
GeSHi, título
Link to comment
Share on other sites

como tens o goto como controlo de ciclo, o que podes fazer é colocar uma nova anotação após o goto menu, e dentro do case saltar para essa nova anotação.

outra coisa que podes fazer é ter uma chamada do return dentro do case.

a melhor solução (por se mais prática), é não usar o goto e usar outra estrutura de controle que que dê um outro controlo no cico de menu (while por exemplo)

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Antes de mais, editei o tópico de forma a cumprir as regras de formatação e ser legível. Peço que tenhas este cuidado nos próximos tópicos/mensagens que escreveres.

Acerca do problema, algumas "notas soltas":

  1. Não há necessidade de usares uma sequência de if-else quando tens a estrutura switch-case, que torna o código bastante mais legível:
    /* Com recurso a switch-case para evitar a sequência de if-else */
    float calc_salario(int escalao, float nhoras) {
        switch (escalao) {
            case 1:  return 150.f * nhoras;
            case 2:  return 200.f * nhoras;
            case 3:  return 250.f * nhoras;
            case 4:  return 300.f * nhoras;
            default: cout << "Escalao Invalido" << endl;
        }
        return 0.f;
    }

     

  2. Tendo em conta que há uma proporcionalidade entre o escalão e o salário, podes calcular o salário matematicamente:
    /* Com recurso a cálculo matemático */
    float calc_salario_opt(int escalao, float nhoras) {
        if (escalao < 1 || escalao > 4)
            return 0.f;
        return (100.f + escalao * 50.f) * nhoras;
    }

     

  3. Sugiro fortemente que separes o código em diferentes funções. Neste caso, é perfeitamente aceitável ter uma função por cada opção do menu.
  4. Sugiro também que não uses variáveis globais uma vez que neste caso não há nenhum motivo inultrapassável que o obrigue. Usa variáveis locais e passa os dados em causa por argumento e devolve por retorno:
    int inserir(trabalhadores *t);           // Opção 1
    void listar(trabalhadores *t, int n);    // Opção 2
    void escaloes(void);                     // Opção 3
    void salarios(trabalhadores *t, int n);  // Opção 4
    void gravar(trabalhadores *t, int n);    // Opção 5

    Deixo como exemplo a função inserir():

    int inserir(trabalhadores *t) {
        int n;
        do {
            cout << "Quantos trabalhadores pretende inserir? ";
            cin >> n;
        } while (n < 0 || n > LIM);
    
        for (int i = 0; i < n; i++) {
            cout << "Introduza o nome do " << i + 1 << " trabalhador: ";
            cin >> t[i].nome;
            cout << "Introduza o numero de horas do " << i + 1 << " trabalhador: ";
            cin >> t[i].nhoras;
            cout << "Introduza o escalao do " << i + 1 << " trabalhador: ";
            cin >> t[i].escalao;
        }
    
        return n;    // Devolve o número de trabalhadores inseridos
    }

     

  5. Podes colocar de igual forma o menu numa função à parte que devolva a opção selecionada:
    int menu(void) {
        cout << "|      GESTAO SALARIAL      |" << endl;
        cout << "| 1- Inserir trabalhador    |" << endl;
        cout << "| 2- Lista de trabalhadores |" << endl;
        cout << "| 3- Escaloes               |" << endl;
        cout << "| 4- Salarios               |" << endl;
        cout << "| 5- Gravar                 |" << endl;
        cout << "| 6- Sair                   |" << endl;
    
        int opcao = 0;
        do {
            cout << "Opcao? ";
            cin >> opcao;
        } while (opcao < 1 || opcao > 6);
        return opcao;
    }

 

Desta forma podes ter um main() mais limpo e que faz o que pretendes com recurso a um ciclo while, sem necessidade do goto:

int main(void) {
    trabalhadores conjtrabalhadores[LIM];
    int ntrabalhadores = 0;

    int opcao = 0;
    do {
        switch (opcao = menu()) {
            case 1:
                ntrabalhadores = inserir(conjtrabalhadores);
                break;
            case 2:
                listar(conjtrabalhadores, ntrabalhadores);
                break;
            case 3:
                escaloes();
                break;
            case 4:
                salarios(conjtrabalhadores, ntrabalhadores);
                break;
            case 5:
                gravar(conjtrabalhadores, ntrabalhadores);
            default:    // A opção 6 é tratada automaticamente pelo do-while
                break;
        }
    } while (opcao != 6);

    return 0;
}

 

Tem em atenção que esta sugestão para o main() pressupõe que o código se comporta exatamente como o que tens atualmente (em termos de gestão de trabalhadores). Repara que na opção 1 (inserir) descartas os dados inseridos anteriormente, pelo que eu implementei com o mesmo comportamento. Para expandir o vetor já existente e não descartar serão necessárias as devidas adaptações.

 

Cumprimentos.

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.