Jump to content
Fórum Script Brasil
  • 0

[Ajuda] Preciso de ajuda com um Menu


renatoemoura
 Share

Question

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 to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 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);
Edited by Leonardo Prass
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...