MikleCod Posted April 17, 2022 at 06:58 PM Report Share #625783 Posted April 17, 2022 at 06:58 PM (edited) 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 April 17, 2022 at 10:52 PM by thoga31 GeSHi, título Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 17, 2022 at 10:42 PM Report Share #625784 Posted April 17, 2022 at 10:42 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
thoga31 Posted April 17, 2022 at 11:45 PM Report Share #625786 Posted April 17, 2022 at 11:45 PM 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": 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; } 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; } 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. 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 } 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 More sharing options...
MikleCod Posted April 18, 2022 at 11:03 AM Author Report Share #625789 Posted April 18, 2022 at 11:03 AM Obrigado, eu ainda estou a aprender, acabei de aprender uma coisa nova! E já agora, origado por teres editado o tópico, eu realmente não sabia como começar a conversa Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now