Ir para conteúdo
Fórum Script Brasil
  • 0

[Ajuda] Preciso de ajuda com um Menu


renatoemoura

Pergunta

Bom dia/Boa tarde/Boa noite,

Estou com o seguinte exercício utilizando lista:

Escreva um programa que simule o controle de uma pista de decolagem de aviões em um
aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas:
a) Listar o número de aviões aguardando na fila de decolagem;
b) Autorizar a decolagem do primeiro avião da fila;
c) Adicionar um avião à fila de espera;
d) Listar todos os aviões na fila de espera;
e) Listar as características do primeiro avião da fila.
Considere que os aviões possuem um nome e um número inteiro como identificador.
Adicione outras características conforme achar necessário.

 

Para este exercício eu resolvi fazer utilizando struct e fazer um menu que interagisse com o usuário, para isso e facilitar na hora de fazer escolhi fazer alguns arquivos separados. 

Fila.h

typedef struct item {
    int numero;
    char nome[30];
    struct item *prox;
} Item;

typedef struct fila {
    Item *primeiro;
    Item *ultimo;
    int qtdItens;
} Fila;

Fila *criaFila();
void liberaFila(Fila *f);
int estahVazia(Fila);
void enfileirar(Fila *f, int n, char nm[]);
void desenfileirar(Fila *f, char *nomeDesenfileirado, int *nDesenfileirado);
void mostrarFila(Fila *f);
int quantidadeFila(Fila *f);
void mostrarCaracteristicas(Fila *f);

Fila.cpp

#include <malloc.h>
#include <iostream>
#include <string.h>
#include "Fila.h"

using namespace std;

#define MSG_FILAVAZIA "\nA Fila está vazia\n"

Fila *criaFila(){
  Fila* f = (Fila*) malloc(sizeof(Fila));

  f->primeiro = NULL;
  f->ultimo = NULL;
  f->qtdItens = 0;

  return f;
}

void liberaFila(Fila *f){
  free(f);
}

int estahVazia(Fila *f){
  return f->qtdItens == 0;
}

void enfileirar(Fila *f, int i, char n[]){
  Item *novoItem = (Item*) malloc(sizeof(Item));
  novoItem->numero = i;
  strcpy(novoItem->nome, n);

  if (estahVazia(f)){
    novoItem->prox = NULL;
  }else{
    novoItem->prox = f->ultimo;
  }

  f->ultimo = novoItem;
  f->qtdItens++;
}

int desenfileirar(Fila *f, char *nomeDesenfileirado[], int *nDesenfileirado){
  Item *i;

  if(!estahVazia(f)){
    i = f->primeiro;
    f->primeiro = i->prox;
    strcpy(*nomeDesenfileirado, i->nome);
    *nDesenfileirado = i->numero;
    free(i);
  }else{
    fprintf(stderr, MSG_FILAVAZIA);
    return 0;
  }
  f->qtdItens--;
  return 1;
}

void mostrarFila(Fila *f){
  Item *i = f->primeiro;

  while(i != f->ultimo){
    cout << " [Numero: " << i->numero << ", Nome: " << i->nome << "] |";
    i = i->prox;
  }
  cout << " [Numero: " << i->numero << ", Nome: " << i->nome << "]" << endl;
}

int quantidadeFila(Fila *f){
  return f->qtdItens;
}

void mostrarCaracteristicas(Fila *f){
  cout << " [Numero: " << f->primeiro->numero << ", Nome: " << f->primeiro->nome << "]" << endl;
}

 

aeroporto.h

#include "Fila.cpp"
/*
Escreva um programa que simule o controle de uma pista de decolagem de aviões em um aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas:
*/


// a) Listar o número de aviões aguardando na fila de decolagem;
void quantosAvioesAguardam(Fila *f);

// b) Autorizar a decolagem do primeiro avião da fila;
void autorizarDecolagem(Fila *f);

// c) Adicionar um avião à fila de espera;
void adicionarAviaoFilaDecolagem(Fila *f);

// d) Listar todos os aviões na fila de espera;
void listarAvioesFilaDecolagem(Fila *f);

// e) Listar as características do primeiro avião da fila;
void caracteristicasProximoDecolar(Fila *f);

// Menu interativo para acesso às funções.
int menuAeroporto(Fila *f);

/*
Considere que os aviões possuem um nome e um número inteiro como identificador.
Adicione outras características conforme achar necessário.
*/

 

aeroporto.cpp

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "aeroporto.h"

using namespace std;

void quantosAvioesAguardam(Fila *f){
	system("clear");
	if(!estahVazia(f)){
		cout << f->qtdItens << " Avioes estao aguardando para decolar." << endl;
	}else{
		cout << "Nao ha avioes aguardando para decolar." << endl;
	}
	cout << endl;
	sleep(2);
	menuAeroporto(f);
}

void autorizarDecolagem(Fila *f){
	Item *i;
	char *nm[30];
	int *num;

	system("clear");
	if (!estahVazia(f)){
		desenfileirar(f, nm, num);
		cout << "Aviao [Numero: " << num << "] [Nome: " << nm << "] | Autorizado a decolar." << endl;
	}else{
		cout << "Nao existem avioes para decolar." << endl;
	}
	sleep(2);
	menuAeroporto(f);
}

void adicionarAviaoFilaDecolagem(Fila *f){
	char nm[30];
	int num=0;

	system("clear");
	cout << "Digite os dados do aviao a ser inserido na Fila de Decolagem" << endl;
	cout << "Numero: ";
	cin >> num;
	cout << endl;
	cout << "Nome: ";
	cin >> nm;
	enfileirar(f, num, nm);
	system("clear");
	cout << "Aviao [" << num << "] [" << nm << "] adicionado com sucesso." << endl;
	sleep(2);
	menuAeroporto(f);
}

void listarAvioesFilaDecolagem(Fila *f){
	Item *i;
	if(!estahVazia(f)){
		system("clear");
		i = f->primeiro;
		while(i != f->ultimo){
			cout << "[" << i->numero << "] [" << i->nome << "] | ";
			i=i->prox;
		}
		cout << "[" << i->numero << "] [" << i->nome << "]" << endl;
	}else{
		cout << "Nao existem avioes para decolar." << endl;
	}
	sleep(2);
	menuAeroporto(f);
}

void caracteristicasProximoDecolar(Fila *f){
	if(!estahVazia(f)){
		system("clear");
		cout << "O proximo a decolar sera:" << endl;
		mostrarCaracteristicas(f);
	}else{
		cout << "Nao existem avioes para decolar." << endl;
	}
	sleep(2);
	menuAeroporto(f);
}

int menuAeroporto(Fila *f){
	int opt=1;
	while(opt != 6){
		opt = 1;
		system("clear");
		if(opt < 1 || opt > 6){
			cout << "Opcao errada." << endl;
			cout << "Escolha entre 1 e 6." << endl;
		}
		cout << "1 - Quantos Avioes estao aguardando." << endl;
		cout << "2 - Autorizar proxima decolagem." << endl;
		cout << "3 - Adidionar aviao a espera." << endl;
		cout << "4 - Ver avioes aguardando." << endl;
		cout << "5 - Detalhes do proximo a decolar." << endl;
		cout << "6 - Sair." << endl;
		cout << endl;
		cout << "Opcao: ";
		cin >> opt;
		switch(opt){
			case 1:
				quantosAvioesAguardam(f);
			case 2:
				autorizarDecolagem(f);
			case 3:
				adicionarAviaoFilaDecolagem(f);
			case 4:
				listarAvioesFilaDecolagem(f);
			case 5:
				mostrarCaracteristicas(f);
			case 6:
				cout << "Fechando aplicacao, aguarde..." << endl;
				sleep(3);
				return 0;
			default:
				menuAeroporto(f);
		}
	}
	return 0;
}

 

exFila.cpp

#include "aeroporto.cpp"

int main(){
	Fila *aeroporto = criaFila();
	menuAeroporto(aeroporto);
	return 0;
}

 

 

Bom... estes são os arquivos, o programa funciona na maioria do tempo, o menu vai e volta tranquilo. O problema é que em alguns momentos ele dá um erro de segmentação que não estou conseguindo resolver, acredito ser relativo a algum ponteiro. E acredito também que o menu pode ser melhorado, se alguém puder dar uma luz, serei muito grato.

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
//SE não utilizar o break ele não tera pausas, ele rodara direto case 1, case 2 ,case 3 sem parar como o proprio nome já diz parar ou quebrar,entendeu?você digita 1 e ele executa do mesmo jeito o 2 o 3 o 4 e assim vai se não adionar o break ;espero ter ajudado amigo.


case 1:
				quantosAvioesAguardam(f);
			break;
case 2:
				autorizarDecolagem(f);
                   break; 
case 3:
				adicionarAviaoFilaDecolagem(f);
			break;
case 4:
				listarAvioesFilaDecolagem(f);
			break;
case 5:
				mostrarCaracteristicas(f);
			break;
case 6:
				cout << "Fechando aplicacao, aguarde..." << endl;
				sleep(3);
				return 0;
             

			default:
				menuAeroporto(f);
Editado por Leonardo Prass
Link para o comentário
Compartilhar em outros sites

  • 0
//SE não utilizar o break ele não tera pausas, ele rodara direto case 1, case 2 ,case 3 sem parar como o proprio nome já diz parar ou quebrar,entendeu?você digita 1 e ele executa do mesmo jeito o 2 o 3 o 4 e assim vai se não adionar o break ;espero ter ajudado amigo.


case 1:
				quantosAvioesAguardam(f);
			break;
case 2:
				autorizarDecolagem(f);
                   break; 
case 3:
				adicionarAviaoFilaDecolagem(f);
			break;
case 4:
				listarAvioesFilaDecolagem(f);
			break;
case 5:
				mostrarCaracteristicas(f);
			break;
case 6:
				cout << "Fechando aplicacao, aguarde..." << endl;
				sleep(3);
				return 0;
             

			default:
				menuAeroporto(f);

Entendi... vou alterar e testar, obrigado! pode ser exatamenete isso =D

Link para o comentário
Compartilhar em outros sites

  • 0

pode inserir o menu já corrigido?

Fila.h 

typedef struct item {
    int numero;
    char nome[30];
    struct item *prox;
} Item;

typedef struct fila {
    Item *primeiro;
    Item *ultimo;
    int qtdItens;
} Fila;

Fila *criaFila();
void liberaFila(Fila *f);
int estahVazia(Fila);
void enfileirar(Fila *f, int n, char nm[]);
void desenfileirar(Fila *f, char *nomeDesenfileirado, int *nDesenfileirado);
void mostrarFila(Fila *f);
int quantidadeFila(Fila *f);
void mostrarCaracteristicas(Fila *f);

Fila.cpp

#include <malloc.h>
#include <iostream>
#include <string.h>
#include "Fila.h"

using namespace std;

#define MSG_FILAVAZIA "\nA Fila está vazia\n"

Fila *criaFila(){
  Fila* f = (Fila*) malloc(sizeof(Fila));

  f->primeiro = NULL;
  f->ultimo = NULL;
  f->qtdItens = 0;

  return f;
}

void liberaFila(Fila *f){
  free(f);
}

int estahVazia(Fila *f){
  return f->qtdItens == 0;
}

void enfileirar(Fila *f, int i, char n[]){
  Item *novoItem = (Item*) malloc(sizeof(Item));
  novoItem->numero = i;
  strcpy(novoItem->nome, n);

  if (estahVazia(f)){
    novoItem->prox = NULL;
  }else{
    novoItem->prox = f->ultimo;
  }

  f->ultimo = novoItem;
  f->qtdItens++;
}

int desenfileirar(Fila *f, char *nomeDesenfileirado[], int *nDesenfileirado){
  Item *i;

  if(!estahVazia(f)){
    i = f->primeiro;
    f->primeiro = i->prox;
    strcpy(*nomeDesenfileirado, i->nome);
    *nDesenfileirado = i->numero;
    free(i);
  }else{
    fprintf(stderr, MSG_FILAVAZIA);
    return 0;
  }
  f->qtdItens--;
  return 1;
}

void mostrarFila(Fila *f){
  Item *i = f->primeiro;

  while(i != f->ultimo){
    cout << " [Numero: " << i->numero << ", Nome: " << i->nome << "] |";
    i = i->prox;
  }
  cout << " [Numero: " << i->numero << ", Nome: " << i->nome << "]" << endl;
}

int quantidadeFila(Fila *f){
  return f->qtdItens;
}

void mostrarCaracteristicas(Fila *f){
  cout << " [Numero: " << f->primeiro->numero << ", Nome: " << f->primeiro->nome << "]" << endl;
}

aeroporto.h

#include "Fila.cpp"
/*
1. Escreva um programa que simule o controle de uma pista de decolagem de aviões em um aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas:
*/


// a) Listar o número de aviões aguardando na fila de decolagem;
void quantosAvioesAguardam(Fila *f);

// b) Autorizar a decolagem do primeiro avião da fila;
void autorizarDecolagem(Fila *f);

// c) Adicionar um avião à fila de espera;
void adicionarAviaoFilaDecolagem(Fila *f);

// d) Listar todos os aviões na fila de espera;
void listarAvioesFilaDecolagem(Fila *f);

// e) Listar as características do primeiro avião da fila;
void caracteristicasProximoDecolar(Fila *f);

// Menu interativo para acesso às funções.
int menuAeroporto(Fila *f);

aeroporto.cpp

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "aeroporto.h"

using namespace std;

void quantosAvioesAguardam(Fila *f){
	system("clear");
	if(!estahVazia(f)){
		cout << f->qtdItens << " Avioes estao aguardando para decolar." << endl;
	}else{
		cout << "Nao ha avioes aguardando para decolar." << endl;
	}
	cout << endl;
	sleep(2);
	menuAeroporto(f);
}

void autorizarDecolagem(Fila *f){
	Item *i;
	char *nm[30];
	int *num;

	system("clear");
	if (!estahVazia(f)){
		desenfileirar(f, nm, num);
		cout << "Aviao [Numero: " << num << "] [Nome: " << nm << "] | Autorizado a decolar." << endl;
	}else{
		cout << "Nao existem avioes para decolar." << endl;
	}
	sleep(2);
	menuAeroporto(f);
}

void adicionarAviaoFilaDecolagem(Fila *f){
	char nm[30];
	int num=0;

	system("clear");
	cout << "Digite os dados do aviao a ser inserido na Fila de Decolagem" << endl;
	cout << "Numero: ";
	cin >> num;
	cout << endl;
	cout << "Nome: ";
	cin >> nm;
	enfileirar(f, num, nm);
	system("clear");
	cout << "Aviao [" << num << "] [" << nm << "] adicionado com sucesso." << endl;
	sleep(2);
	menuAeroporto(f);
}

void listarAvioesFilaDecolagem(Fila *f){
	Item *i;
	if(!estahVazia(f)){
		system("clear");
		i = f->primeiro;
		while(i != f->ultimo){
			cout << "[" << i->numero << "] [" << i->nome << "] | ";
			i=i->prox;
		}
		cout << "[" << i->numero << "] [" << i->nome << "]" << endl;
	}else{
		cout << "Nao existem avioes para decolar." << endl;
	}
	sleep(2);
	menuAeroporto(f);
}

void caracteristicasProximoDecolar(Fila *f){
	if(!estahVazia(f)){
		system("clear");
		cout << "O proximo a decolar sera:" << endl;
		mostrarCaracteristicas(f);
	}else{
		cout << "Nao existem avioes para decolar." << endl;
	}
	sleep(2);
	menuAeroporto(f);
}

int menuAeroporto(Fila *f){
	int opt=1;
	while(opt != 6){
		system("clear");
		if(opt < 1 || opt > 6){
			cout << "Opcao errada." << endl;
			cout << "Escolha entre 1 e 6." << endl;
		}
		
		opt = 1;
		cout << "1 - Quantos Avioes estao aguardando." << endl;
		cout << "2 - Autorizar proxima decolagem." << endl;
		cout << "3 - Adidionar aviao a espera." << endl;
		cout << "4 - Ver avioes aguardando." << endl;
		cout << "5 - Detalhes do proximo a decolar." << endl;
		cout << "6 - Sair." << endl;
		cout << endl;
		cout << "Opcao: ";
		cin >> opt;
		switch(opt){
			case 1:
				quantosAvioesAguardam(f);
				break;
			case 2:
				autorizarDecolagem(f);
				break;
			case 3:
				adicionarAviaoFilaDecolagem(f);
				break;
			case 4:
				listarAvioesFilaDecolagem(f);
				break;
			case 5:
				mostrarCaracteristicas(f);
				break;
			case 6:
				cout << "Fechando aplicacao, aguarde..." << endl;
				sleep(3);
				return 0;
				break;
			default:
				menuAeroporto(f);
				break;
		}
	}
	return 0;
}

exFila.cpp

#include "aeroporto.cpp"

int main(){
	Fila *aeroporto = criaFila();
	menuAeroporto(aeroporto);
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...