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

Fila em C++ (problema).


Hugão

Pergunta

Olá galera.

Fiz a fila abaixo, mas ela não insere, não retira e não imprime. Compila normalmente.

Na execução ocorre uma mensagem de falha de segmentação:

Segmentation fault

O fonte da fila:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define TAMANHO 10

class minhaFila{
    private:
        int inicioFila, fimFila, f[TAMANHO];

    public:
        void inicializaFila(){
            for(int i=0; i<TAMANHO; i++){
                f[i]=0;
            }
            inicioFila=fimFila=-1;
        }

        void insere(int elemento){
            if(fimFila!=TAMANHO){
                fimFila++;
                f[fimFila]=elemento;
            }
        }

        void retira(){
            if(inicioFila!=fimFila){
                int elementoRetirado;
                inicioFila++;
                elementoRetirado=f[inicioFila];
                f[inicioFila]=0;
                //return elementoRetirado;
                //printf("O elemento retirado foi %d: ",&elementoRetirado);
            }

            else {printf("A fila está vazia!");}
        }

        void imprimeFila(){
            for(int i=TAMANHO; i<=f[fimFila]; i--){
                printf("%d\n",f[i]);
            }
        }
};

int main(){
    minhaFila f1;
    int insereElemento,op;

    //f1.inicioFila();

    printf("\n1- Inicializar fila \n2- Para inserir \n3- Para retirar \n4- Mostrar fila \n5- Sair\n\n");
    scanf("%d",&op);

    switch(op){
        case 1:
            f1.inicializaFila();
        break;
        case 2:
            printf("Digite um número inteiro: ");
            scanf("%u",&insereElemento);
            f1.insere(insereElemento);
            //return main();
        break;
        case 3:
            f1.retira();
            //return main();
        break;
        case 4:
            f1.imprimeFila();
            //return 0;
        break;
    }

    system("PAUSE");
    return 0;
}

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Saudações,

Em rápida consulta ao seu código, o seu método "imprimeFila()" está errado, uma vez que tenta percorrer sua fila (vetor) de trás para frente. Observe que quando adiciona um item na fila, você incrementa o valor da variável que controla o fim da fila.

Tente algo mais simples como:

for (int i = 0; i < TAMANHO; i++) {
     printf("Fila[%d] = %d\n",i,f[i]);
}

Abraços,

William Rodrigues.

Editado por William Rodrigues
Link para o comentário
Compartilhar em outros sites

  • 0

Ok, o imprime está ok!

Agora ainda não consigo inserir, nem retirar, em ambos dá erro segmentação (apontando para um local de memória vazio).

O método inicioFila funciona em parte, porque ele zera apenas as posições 0,1,5,6 e a última posição sempre vale 4.

Link para o comentário
Compartilhar em outros sites

  • 0

Saudações,

Para controlar o bloco de execução da sua aplicação, utilize um loop ao invés de "return main()".

Veja:

while (op != 5) {
        printf("\n1- Inicializar fila \n2- Para inserir \n3- Para retirar \n4- Mostrar fila \n5- Sair\n\n");
        scanf("%d",&op);

        switch(op){
            case 1:
                f1.inicializaFila();
            break;
            case 2:
                printf("Digite um número inteiro: ");
                scanf("%u",&insereElemento);
                f1.insere(insereElemento);
            break;
            case 3:
                f1.retira();
            break;
            case 4:
                f1.imprimeFila();
            break;
        }
    }

Abraços,

William Rodrigues.

Editado por William Rodrigues
Link para o comentário
Compartilhar em outros sites

  • 0

Não mudou nada.

Na hora que mostro a fila há um loop infinito.

Quando insiro o programa sai após eu digitar o elemento. O mesmo ocorre quando retiro.

Você está ajudando muito!

Muito obrigado pela sua atenção.

Editado por Hugão
Link para o comentário
Compartilhar em outros sites

  • 0

Hugão,

Tento não mudar muito o código para ficar o mais próximo possível do seu cenário.

Segue como está o seu fonte:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define TAMANHO 10

class minhaFila{
    private:
        int inicioFila, fimFila, f[TAMANHO];

    public:
        void inicializaFila(){
            for(int i=0; i<TAMANHO; i++){
                f[i]=0;
            }
            inicioFila=fimFila=-1;
        }

        void insere(int elemento){
            if(fimFila!=TAMANHO){
                fimFila++;
                f[fimFila]=elemento;
            }
        }

        void retira(){
            if(inicioFila!=fimFila){
                int elementoRetirado;
                inicioFila++;
                elementoRetirado=f[inicioFila];
                f[inicioFila]=0;
                //return elementoRetirado;
                //printf("O elemento retirado foi %d: ",&elementoRetirado);
            }

            else {printf("A fila está vazia!");}
        }

        void imprimeFila(){
            for(int i = 0; i< TAMANHO; i++){
                printf("%d\n",f[i]);
            }
        }
};

int main(){
    minhaFila f1;
    int insereElemento,op;

    while (op != 5) {
        printf("\n1- Inicializar fila \n2- Para inserir \n3- Para retirar \n4- Mostrar fila \n5- Sair\n\n");
        scanf("%d",&op);

        switch(op){
            case 1:
                f1.inicializaFila();
            break;
            case 2:
                printf("Digite um número inteiro: ");
                scanf("%u",&insereElemento);
                f1.insere(insereElemento);
            break;
            case 3:
                f1.retira();
            break;
            case 4:
                f1.imprimeFila();
            break;
        }
    }

    system("PAUSE");
    return 0;
}

Estamos ai prá isso ;)

Abraços,

William Rodrigues.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu estava errando porque estava lendo a variável op fora do while. Corriji e deu certo.

Cara muito obrigado! Sou iniciante e autoditaca e está sendo ótimo poder ter a ajuda de pessoas como você. Muito obrigado.

Abraço;

Att,

Hugo Sousa.

Link para o comentário
Compartilhar em outros sites

  • 0

Estou com um pequeno probleminha referente a essa fila.

Na parte da impressão não estou conseguindo fazer ma condição para quando a fila estiver vazia apresentar a mensagem: FIla vazia!

Jà tentei assim:

void imprimeFila(){
            if(f[fimFila]==0&&f[fimFila]==0){
                printf("\n\nA fima está vazia!!\n");
            }
            else{
                printf("\n-----------------------------------------\n");
                printf("|    Posicao   |   Elementos  | Endereco |\n");
                printf("-----------------------------------------\n");
                for(int i=0; i<TAMANHO; i++){
                    printf("       [%u]             %u\n",i,f[i]);
                }
            }
        }

Mas não acontece nada e quando tento assim: if(f[fimFila]==-1&&f[fimFila]==1) dá certo só quando zero a fila, pois o f[inicioFila] e f[fimFila] recebem o valor inicial de inicioFila e fimFila que é -1 atribuído no método inicializaFila.

Alguma dica?

Link para o comentário
Compartilhar em outros sites

  • 0

A fila deve funcionar assim:

1 - Quando iniciada deve ser zerada automaticamente, mas no meu caso ela apresenta lixo em todas posições.

2 - Quando a fila for impressa, se estiver vazia, deve apresentar a mensagem de fila vazia, não está acontecendo comigo também.

3 - Quando excluídos todos os elementos na próxima exclusão, se estiver vazia, deve informar que está vazia, também não está funcionando.

4 - Na inpressão deve ser mostrada o endereço de memória em hexadecimal, também não consigo fazer mesmo com o %x.

5 - Não consegui fazer o programa como solocitado pelo professor (é um trabalho de faculdade).

O que você me indica? Vamos começar o raciocínio do zero para absorver 100% o conhecimento de fila? Preciso entender isso. Você me ajuda?

Acho melhor começar do zero.

Suas explicações são claras para mim. Acho que pode ajudar.

Link para o comentário
Compartilhar em outros sites

  • 0

Saudações,

Caro Hugão, essa decisão (começar do zero ou não) cabe a você. Se achar que começar do zero facilitará seu entendimento, o faça.

Como está trabalhando com Classe, seu método "inicializaFila" poderia ser o construtor da classe, assim não se preocuparia em invocá-lo.

O processo de verificar se a fila está vazia para exibição da mensagem, basta seguir mais ou menos o que disse no meu poste anterior.

Se as explicações estão te ajudando, vai postando as suas dúvidas e como está fazendo que vamos te ajudando.

Abraços,

William Rodrigues.

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
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...