Ir ao conteúdo
  • Cadastre-se

C++ Fila só está pegando o último que entrou


Tony Soprano
Ir à solução Resolvido por arfneto,

Posts recomendados

Olá galera, estou fazendo um trabalho da faculdade de fazer uma fila de alunos em C++. Mas o problema está na hora de incluir um novo aluno na fila, só é validado o último que entrou, por exemplo: Cadastro um aluno A, logo depois cadastro um aluno B, o aluno B substitui o A e só fica ele na fila... aqui está o código:

#include <iostream>
#include <windows.h>
#include <cstdlib>

#define MAXTAM 30

typedef struct Aluno {
    int RA;
    char nome[12];
}Aluno;

typedef struct {
    int inicio, fim;
    Aluno Fila[MAXTAM];
    int tamanho;
}TFila;
  

// Funções:  
void TFila_Inicializa (TFila *f);
bool TFila_Vazia (TFila *f);
bool TFila_Cheia (TFila *f);
void TFila_Enfileira(TFila *f, Aluno x);
Aluno TFila_Desenfileira(TFila *f);
void TFila_Imprime (TFila *f);
void IncluiAluno (TFila *f, Aluno a);
void ImprimeFila(TFila *f);
void AtendeAluno (TFila *f);

using namespace std;

int main() {
  UINT CPAGE_UTF8 = 65001;
  UINT CPAGE_DEFAULT = GetConsoleOutputCP();
  SetConsoleOutputCP(CPAGE_UTF8);


  TFila f;
  Aluno a;


  int opcao_menu;
    do {
      cout<<"  \n        ����������������������������������������������������������������";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        �                     FILA DE ALUNOS                           �";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        ����������������������������������������������������������������";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        � 1 - INCLUIR NOVO ALUNO                                       �";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        � 2 - ATENDER ALUNO                                            �";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        � 3 - EXIBIR FILA                                              �";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        � 4 - SAIR                                                     �";
      cout<<"  \n        �                                                              �";
      cout<<"  \n        ����������������������������������������������������������������\n\n";


        cout << "  \n        Escolha uma opção: ";
        cin >> opcao_menu;
        system ("cls");
        switch (opcao_menu) {
              case 1:
                IncluiAluno(&f, a);
                break;  
              case 2:
                AtendeAluno(&f);
                break;
              case 3:
                ImprimeFila(&f);
                break;
              case 4:
                cout << "Volte sempre!" << endl;
                break;
         }
    } while (opcao_menu != 4);


  cout << endl << endl;
  system("pause");
  return 0;
}


void TFila_Inicializa(TFila *f) {
    f->inicio = 0;
    f->fim = -1;
    f->tamanho = 0;
}

bool TFila_Vazia(TFila *f) {
    if (f->inicio > f->fim) {   // 0 é maior que -1 no começo
        return true; // 1
    } else {
        return false; // 0 fila não vazia
    }
}

bool TFila_Cheia(TFila *f) {
    if (f->fim == MAXTAM-1) {
        return true; // fila cheia
    } else {
        return false; // 0 fila não cheia
    }
}

void TFila_Enfileira(TFila *f, Aluno x) {
    if (TFila_Cheia(f)) {
        cout << "Fila Cheia.\n";
    } else {
        f->fim++;
        f->Fila[f->fim] = x;
        f->tamanho++;
    }
}


Aluno TFila_Desenfileira(TFila *f) {
    Aluno aux;
    if (TFila_Vazia(f)) {
        cout << "Fila vazia.\n";  
    } else {
        aux = f->Fila[f->inicio];
        f->inicio++;
        f->tamanho--;
        return aux;      
    }
        Aluno a;
        return a;
}

void IncluiAluno (TFila *f, Aluno a) {
     cout<<"  \n        ����������������������������������������������������������������";
     cout<<"  \n        �                                                              �";
     cout<<"  \n        �                           RECEPÇÃO                           �";
     cout<<"  \n        �                                                              �";
     cout<<"  \n        ����������������������������������������������������������������";


    cout << "\n\n\tNome: ";
    cin.ignore();
    gets(a.nome);
    cout << "\tRA: ";
    cin >> a.RA;

    TFila_Inicializa(f);
    TFila_Enfileira(f, a);


    cout << "\n\n\tO aluno entrou na fila e aguarda ser atendido." << endl;
    system("pause");
    system("cls");
}

void ImprimeFila(TFila *f) {
    if (TFila_Vazia(f)) {
        cout << "\nFila vazia!" << endl;
    } else {
     cout<<"  \n        ����������������������������������������������������������������";
     cout<<"  \n        �                                                              �";
     cout<<"  \n        �                       FILA DE ALUNOS                         �";
     cout<<"  \n        �                                                              �";
     cout<<"  \n        ����������������������������������������������������������������";


        for (int i = f->inicio; i <= f->fim; i++) {
            cout << "\n\n\tNome: " << f->Fila[i].nome << endl;
            cout << "\tRA: " << f->Fila[i].RA;
        }
        cout << endl;
        cout << "\n\tTamanho da fila: " << f->tamanho << endl;
    }
    system("pause");
    system("cls");
}

void AtendeAluno (TFila *f) {
    Aluno aux;

    if (TFila_Vazia(f)) {
        cout << "\nFila vazia!" << endl;
    } else {
        aux = TFila_Desenfileira(f);

        cout << "O aluno foi atendido." << endl;
        system("pause");
        system("cls");
    }

}

 

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Tony Soprano disse:
typedef struct Aluno {
    int RA;
    char nome[12];
}Aluno;

typedef struct {
    int inicio, fim;
    Aluno Fila[MAXTAM];
    int tamanho;
}TFila

 

Não use typedef em C++. Use struct ou class. É muito, mas muito mais fácil. Não pode usar as filas que C++ oferece, usando queue e os métodos comuns? Não há nada demais em usar um vetor e índices, só fica mais complicado.

 

Não use void

 

Coloque os métodos DENTRO da struct. Para isso a linguagem foi criada, 42 anos atrás. Até se chama "C com classes" antes de ser C++.

 

Seus dados não estão claros: A fil é uma fila de algo. Cada item na fila dee conter um cliente.

  • Triste 1
Link para o comentário
Compartilhar em outros sites

27 minutos atrás, Tony Soprano disse:

essas TAD´s foi meu professor que criou, e n tô usando biblioteca porque assim é mais fácil de mudar alguma coisa se eu quiser

 

Não, não é. É muito mais fácil usar a linguagem.

 

E isso que seu professor criou está bem ruim. Talvez ele tenha feito de propósito :( 

 

Seu curso usar de fato C++? Tem um livro texto ou algo assim?

 

 

 

 

Link para o comentário
Compartilhar em outros sites

@Tony Soprano não se usa typedef em C++. O equivalente seria using mas o propósito é um pouco diferente. O programa todo está muito ruim, mesmo que fosse em C, em termos das estruturas. 

 

Mais tarde te mostro um exemplo em C++ comum com essas funções. Penso que vai achar BEM mais fácil

Link para o comentário
Compartilhar em outros sites

  • Solução

Talvez seu professor tenha feito assim de propósito com algum outro plano. Mas está muito ruim, como eu disse.

 

Entre outras coisas

  • typedef não é usado em C++. Não há razão.
  • as tais funções em C++ fazem parte da struct. Este é o princípio básico de C++:  a noção de classe, objeto
  • não use void. é um desperdício ou um erro
  • não escreva um programa interativo . NUNCA. Apenas coloque isso ao final. depois de tudo testado
  • não se preocupe com detalhes tipo cor, limpar a tela, fontes. Escreva o objetivo de seu programa. Implemente uma fila de alunos
  • um cout de oito linhas é muito mais esperto que 8 cout de uma linha. E se vai apenas mostrar valores use puts(). Muito mais esperto e rápido.
  • não use system(). Nunca. 
  • não use gets(). NUNCA. Isso nem existe mais em alguns compiladores.
  • escreva em torno dos dados. Um container é um container. TEM que ter isso no código. C ou C++ ou java ou ou COBOL...
  • use os #define antes dos #include

 

EXEMPLO, em C++
 

Essa é a saída do exemplo, um programa mínimo só pra você ter um exemplo de uma maneira comum de escrever isso nessa linguagem.

 

Acho que vai perceber que é muito mais simples.

 

Fila: "Unica" tem 0 alunos
Fila: "Unica" tem 8 alunos
Nome..., RA #1
Nome..., RA #2
Nome..., RA #3
Nome..., RA #4
Nome..., RA #5
Nome..., RA #6
Nome..., RA #7
Nome..., RA #8
Fila "Unica"Cheia
Fila "Anonima" Vazia
Atendeu o cara de RA #1 da fila "Unica"
Atendeu o cara de RA #2 da fila "Unica"
Atendeu o cara de RA #3 da fila "Unica"
Atendeu o cara de RA #4 da fila "Unica"
Atendeu o cara de RA #5 da fila "Unica"
Atendeu o cara de RA #6 da fila "Unica"
Atendeu o cara de RA #7 da fila "Unica"
Atendeu o cara de RA #8 da fila "Unica"
Fila: "Unica" tem 0 alunos
Apagando a fila "Anonima"
Apagando a fila "Unica"

 

Eis o programa

 

int main(void)
{
    Fila unica("Unica",8);
    unica.imprime(); // vazia ainda
    int   seq = 1;
    while (unica.enfileira(Aluno(seq++, "Nome...")) > 0);
    unica.imprime(); // mostra a fila agora
    // fila cheia?
    if (unica.cheia())
        cout << "Fila \"" << unica.nome << "\"Cheia\n";
    else
        cout << "Fila \"" << unica.nome << "\" não esta cheia\n";
    // fila vazia?
    Fila outra;
    if (outra.vazia())
        cout << "Fila \"" << outra.nome << "\" Vazia\n";
    else
        cout << "Fila \"" << outra.nome << "\" não esta vazia\n";
    // atende todo mundo da fila 'unica'
    while (not unica.vazia() ) unica.atende();
    unica.imprime();  // mostra a fila agora

    return 0;
}

 

O programa cria 2 filas, uma chamada unica e outra chamada outra. Sim, foi pobre a nomenclatura :(

 

Um loop enche a fila unica até dar erro. Vai dar erro, claro, quando não couber mais gente. Como cada fila tem um nome e uma capacidade nada de especial acontece. 

 

A fila é mostrada antes e depois, e tem um teste de outras funções. No final atende todo mundo que estava na primeira fila e encerra o programa.

 

Eis o código "todo"

 

// https:www.clubedohardware.com.br/forums/topic/
// 1578391-fila-s%C3%B3-est%C3%A1-pegando-o-
//%C3%BAltimo-que-entrou/#comment-8325416

#define LIMITE 10
#include <iostream>
#include <queue>
using namespace std;

struct Aluno
{
    int    RA;
    string nome;
    void imprime();
    Aluno(int ra, string nome) : RA(ra), nome(nome){};
    Aluno() : Aluno(0, ""){};  // padrão
};

struct Fila
{
    unsigned     limite;  // maior tamanho aceito
    string       nome;    // para distinguir as filas
    queue<Aluno> fila;

    bool         vazia() { return fila.empty(); };
    bool         cheia() { return fila.size() == limite; };
  
    int          enfileira(Aluno x)
    { 
        if (fila.size() >= limite) return -1;
        fila.push(x);
        return (int) fila.size();
    };

    void         desenfileira() { fila.pop(); };
    void         imprime(); // codigo abaixo
    Aluno        atende();  // não tem as chaves...

    Fila(string n, int lim) : nome(n), limite(lim)
    {
        if (lim > LIMITE) limite = LIMITE;
    };
    Fila() : Fila("Anonima",LIMITE){};  // fila padrão sem nome

    ~Fila() { cout << "Apagando a fila \"" << Fila::nome << "\"\n"; };
};

int main(void)
{
    Fila unica("Unica",8);
    unica.imprime(); // vazia ainda
    int   seq = 1;
    while (unica.enfileira(Aluno(seq++, "Nome...")) > 0);
    unica.imprime(); // mostra a fila agora
    // fila cheia?
    if (unica.cheia())
        cout << "Fila \"" << unica.nome << "\"Cheia\n";
    else
        cout << "Fila \"" << unica.nome << "\" não esta cheia\n";
    // fila vazia?
    Fila outra;
    if (outra.vazia())
        cout << "Fila \"" << outra.nome << "\" Vazia\n";
    else
        cout << "Fila \"" << outra.nome << "\" não esta vazia\n";
    // atende todo mundo da fila 'unica'
    while (not unica.vazia() ) unica.atende();
    unica.imprime();  // mostra a fila agora

    return 0;
}

void Fila::imprime()
{
    // Quantos tem?
    cout << "Fila: \"" << nome << "\" tem " << fila.size()
                          << " alunos\n";
    // agora os alunos
    for (int i = 0; i < fila.size(); i+=1)
    { 
        Aluno a = fila.front();
        fila.pop(); // tira da fila
        Fila::fila.push(a); // poe de volta no fim
        a.imprime(); // mostra esse
    }
}

Aluno Fila::atende()
{
    Aluno prim = fila.front();  // salva o primeiro
    fila.pop();                 // tira da fila
    cout << "Atendeu o cara de RA #" << prim.RA << 
        " da fila " << "\"" << nome << "\"\n";
    return prim;           // retorna
}

void Aluno::imprime() { cout << nome << ", RA #" << RA << "\n"; };

 

Veja que algumas funções tem só um linha de código.

 

Há maneiras diferentes e mais elegantes de escrever isso. Sugiro que se concentre em ver a diferença entre as duas linguagens. E entenda como em C++ as abstrações são muito mais simples.

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

 

Esse loop por exemplo

 

19 horas atrás, arfneto disse:
    while (not unica.vazia() ) unica.atende();
    unica.imprime();  // mostra a fila agora

 


tem uma linha só e atende a fila toda e ao ler o programa isso fica fácil de entender. 

 

1 hora atrás, Tony Soprano disse:

Realmente assim parece estar muito mais fácil, apesar de eu já estar acostumado a programar daquele jeito, quero aderir a sua forma. Se você puder me indicar materiais como livros, PDFs, vídeos, etc, para ajudar no meu aprendizado, agradeço mais ainda

 

Não é "a minha forma". Mas é a razão de C++ ter sido criada num primeiro momento: juntar comportamento e variáveis numa mesma coisa, a tal classe, o tal objeto. E essa linguagem em particular é muito expressiva, muito boa para criar modelos de sistemas. Mas é enorme. 

 

Claro que não é preciso saber muito dela para conseguir algo útil. Mas ao começar se o curso foca numa transição de C para C++ é mais prejuízo que lucro, como acho que pode ver comparando o código que te mostrei e o original quase-C que postou.

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...