Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

markinhospaulo

retirar dados de uma fila C++

Recommended Posts

Estou com um problema na hora de retirar um dado de uma fila, não sei o que estou fazendo errado.

 


#include <cstdlib>
#include <iostream>
#include <string>
#define TAM 2

using namespace std;
//Estrutura Endereco
struct Endereco
{
   string numero;
   string logradouro;
   string complemento;
   string cep;
   string cidade;
   string estado;
};
//Estrutura Pessoa
struct  Pessoa
{
   Endereco endereco;
   string cpf;  
   string nome;
   string sexo;
   string telefone;
   string email;
};
//Variaveis
Pessoa pessoas[TAM];
int proximo = 0;
int primeiro = 0;
int cont = 0;


//Função Cadastrar Pessoa / Endereço
void inserirPessasNaFila()
{
   if(proximo != TAM)
   {
       cout << "Nome: " ;
       cin >> pessoas[proximo].nome;
       cout << "Cpf(XXXXXXXXXXX): " ;
       cin >> pessoas[proximo].cpf;
       cout << "Sexo(F/M): " ;
       cin >> pessoas[proximo].sexo;
       cout << "Telefone: " ;
       cin >> pessoas[proximo].telefone;
       cout << "Email: " ;
       cin >> pessoas[proximo].email;

       cout << "Logradouro: " ;
       cin >> pessoas[proximo].endereco.logradouro;
       cout << "Numero: " ;
       cin >> pessoas[proximo].endereco.numero;
       cout << "Complemento: " ;
       cin >> pessoas[proximo].endereco.complemento;
       cout << "Cep(*********): " ;
       cin >> pessoas[proximo].endereco.cep; 
       cout << "Cidade: " ;
       cin >> pessoas[proximo].endereco.cidade;
       cout << "Estado(XX): " ;
       cin >> pessoas[proximo].endereco.estado;
       //checar se fila esta cheia
       if(proximo != TAM)
       { 
           proximo++;
       }
       //limpar tela            
           system("cls");

   }
   else
       cout << "FILA CHEIA." << endl << endl; 

}
//função retirar pessoa da fila
void retirarPessoaDaFila()
{
   for (int i = 0; i <= TAM; i++)
   {

       pessoas[i].nome = pessoas[i+1].nome;
       pessoas[i].cpf = pessoas[i+1].cpf;
       pessoas[i].email = pessoas[i+1].email;
       pessoas[i].sexo = pessoas[i+1].sexo;
       pessoas[i].telefone = pessoas[i+1].telefone;
       pessoas[i].endereco.cep = pessoas[i+1].endereco.cep;
       pessoas[i].endereco.cidade = pessoas[i+1].endereco.cidade;
       pessoas[i].endereco.complemento = pessoas[i+1].endereco.complemento;
       pessoas[i].endereco.estado = pessoas[i+1].endereco.estado;
       pessoas[i].endereco.logradouro = pessoas[i+1].endereco.logradouro;
       pessoas[i].endereco.numero = pessoas[i+1].endereco.numero;  
       proximo--;      

   }
       cout << " ITEM RETIRADO" << endl << endl;                   
}        

 

No casso ai eu estaria sobrescrevendo a primeira posição e assim por diante. Programa compila, na função main() fiz um switch case, e quando peço para executar a retirada da erro e o programa fecha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Markinhospaulo,

Não que este seja o problema, mas o limitador do for não deveria ser esta sua variável global próximo?

Talvez o problema estejam na atribuição das strings,tente utilizar o strcpy.

 

Flw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

GBecker, o strcpy é válido para strings da C, aquela string é da C++. Atribuição é válida para as strings da C++.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <cstdlib>
#include <iostream>
#include <string>
#define TAM 2

using namespace std;
//Estrutura Endereco
struct Endereco
{
   string numero;
   string logradouro;
   string complemento;
   string cep;
   string cidade;
   string estado;
};
//Estrutura Pessoa
struct  Pessoa
{
   Endereco endereco;
   string cpf;  
   string nome;
   string sexo;
   string telefone;
   string email;
};
//Variaveis
Pessoa pessoas[TAM];
int proximo = 0;
int primeiro = 0;
int cont = 0;



//Função Cadastrar Pessoa / Endereço
void inserirPessasNaFila()
{
   if(proximo != TAM)
   {
       //PESSOAS
       cout << "Nome: " ;
       cin >> pessoas[proximo].nome;
       cout << "Cpf: " ;
       cin >> pessoas[proximo].cpf;
       cout << "Sexo: " ;
       cin >> pessoas[proximo].sexo;
       cout << "Telefone: " ;
       cin >> pessoas[proximo].telefone;
       cout << "Email: " ;
       cin >> pessoas[proximo].email;
       //ENDEREÇO          
       cout << "Logradouro: " ;
       cin >> pessoas[proximo].endereco.logradouro;
       cout << "Numero: " ;
       cin >> pessoas[proximo].endereco.numero;
       cout << "Complemento: " ;
       cin >> pessoas[proximo].endereco.complemento;
       cout << "Cep(): " ;
       cin >> pessoas[proximo].endereco.cep; 
       cout << "Cidade: " ;
       cin >> pessoas[proximo].endereco.cidade;
       cout << "Estado: " ;
       cin >> pessoas[proximo].endereco.estado;

       //checar se fila esta cheia
       if(proximo != TAM)
       { 
           proximo++;
       }
       //limpar tela            
           system("cls");

   }
   else
       cout << "FILA CHEIA." << endl << endl; 

}
//função retirar pessoa da fila
void retirarPessoaDaFila()
{
  if(proximo!= 0)      
   {
   proximo--;  
   cout << " ITEM RETIRADO" << endl << endl;                   
   }
   else
   cout << " FILA JA ESTA VAZIA" << endl << endl;    
}        
}

 

fiz assim, porem perdi o conceito de fila já que numa fila o 1 que entra teria que ser o 1 a sair. Porem assim estou conseguindo eliminar posição no vetor. Se alguem souber de uma forma para ficar em fila por favor poste aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que só falta deslocar os dados para esquerda quando for retirar da fila. Assim, está parecido com uma pilha.

 

O conceito que você explicou é de pilha.

 

Flw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que só falta deslocar os dados para esquerda quando for retirar da fila. Assim, está parecido com uma pilha.

 

O conceito que você explicou é de pilha.

 

Flw.

o 1° que entra é o 1° que sai. Isto é conceito de fila

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, equívoco meu.

Mas no teu código, está inserindo no fim e retirando do fim.

Isso é pilha.

 

Para completar o que escrevi:

 

http://pt.m.wikipedia.org/wiki/FIFO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta cara vou tentar me puchar para te explicar.

 

Num conceito de fila o primeiro a entrar é o primeiro a sair. OK. Mas isso não quer dizer que tu vai inserir no fim e retirar do fim do vetor. Isto é uma pilha!!

 

Seguinte:

1) Temos um vetor com 6 posições. Esta é a nossa fila:

 0   1   2   3   4   5
|   |   |   |   |   |   |
 P

P é a tua variável "Proximo", que é o sinalizador de ultimo elemento da fila.

Nesta situação P na posição 0 indica fila vazia.

 

2) Vamos inserir alguns elementos:

 0   1   2   3   4   5
| 4 | 2 | 7 |   |   |   | <- (4,2,7)
         P

Cada elemento que inserimos, colocamos em uma posição maior do vetor iniciando em zero. E incrementamos P.

4 na posição 0.

2 na posição 1.

7 na posição 2.

Ok isto tu ja sabe.

 

3) Agora retirar um elemento da fila:

Devemos retirar sempre o elemento da posição 0. Pois ele é o "first in", por que ele que tu inseriu primeiro na fila ou vetor.

      0   1   2   3   4   5
4 <- | 2 | 7 |   |   |   |   |
          P

Para retirar o elemento da fila deve-se mover os elementos uma posição para a esquerda. Ou seja, a posição 0 recebe o dado da posição 1. A posição 1 recebe o dado da posição 2. E assim por diante.

Até chegar a P, que é limitador da fila. Aí sim podemos decrementar o P.

 

Segue uma idéia de código que representa isto:

RetiraLista {
for(int iLaco = 0;iLaco <= P;iLaco++) {
      TeuVetor[iLaco] = TeuVetor[iLaco+1];
  }
  //Chegou ao fim da fila
  P--;
  //Retorna da função
}

Este é o conceito de fila, First In(posição 0 do vetor) First Out(elemento apontado por P).

 

Espero que tenha sido claro o suficiente e ter conseguido te explicar o que estava tentando dizer nos posts acima mas sem sucesso.

E, desculpe pelas tentativas de desenhos horríveis.

 

Espero ter ajudado :thumbsup:

Flw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

GBecker, o strcpy é válido para strings da C, aquela string é da C++. Atribuição é válida para as strings da C++.

 

 

Abraços :D

 

Sim, Renato.

 

Mas pode acessar a "forma em C" da string C++ utilizando o método c_str() da classe string.

Eaí sim, com este método usar o strcpy.

 

Flw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso não faz sentido. Você pode utilizar c_str() para converter para uma string da C para armazenar em uma string da C, mas não vai funcionar fazer tipo:

 

#include <string>
#include <cstring>

int main()
{
   std::string string1 = "lololol", string2;

   strcpy(string2.c_str(), string1.c_str());

   return 0;
}

 

Não sei se já estudou strings da C++, mas o que eu posso garantir é que o uso que o markinhospaulo fez delas está certo. Não faz sentido e é errado utilizar strcpy() com strings da C++.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue uma idéia de código que representa isto:

RetiraLista {
for(int iLaco = 0;iLaco <= P;iLaco++) {
      TeuVetor[iLaco] = TeuVetor[iLaco+1];
  }
  //Chegou ao fim da fila
  P--;
  //Retorna da função
}

Este é o conceito de fila, First In(posição 0 do vetor) First Out(elemento apontado por P).

 

Espero que tenha sido claro o suficiente e ter conseguido te explicar o que estava tentando dizer nos posts acima mas sem sucesso.

E, desculpe pelas tentativas de desenhos horríveis.

 

Espero ter ajudado :thumbsup:

Flw.

 

 

Se olhar o 1° codigo que postei, eu fiz isso, só que quando tento executar essa ação o console fecha, da erro.

 

 

Esse conceito eu já sabia, acho que você não entendeu que eu sabia, por isso disse no 2 codigo que postei que eu consegui remover mais n consegui seguir o conceito de fila.

 

Obrigado por tentar ajudar vlw!

 

void retirarPessoaDaFila()
{

        if(proximo!= 0)      
        {

       proximo--;
       pessoas[cont].nome = pessoas[(cont+1)].nome;
       pessoas[cont].cpf = pessoas[(cont+1)].cpf;
       pessoas[cont].email = pessoas[(cont+1)].email;
       pessoas[cont].sexo = pessoas[(cont+1)].sexo;
       pessoas[cont].telefone = pessoas[(cont+1)].telefone;
       pessoas[cont].endereco.cep = pessoas[(cont+1)].endereco.cep;
       pessoas[cont].endereco.cidade = pessoas[(cont+1)].endereco.cidade;
       pessoas[cont].endereco.complemento = pessoas[(cont+1)].endereco.complemento;
       pessoas[cont].endereco.estado = pessoas[(cont+1)].endereco.estado;
       pessoas[cont].endereco.logradouro = pessoas[(cont+1)].endereco.logradouro;
       pessoas[cont].endereco.numero = pessoas[(cont+1)].endereco.numero;  
       //proximo--;        
       cout << " ITEM RETIRADO" << endl << endl;                   
        }
   else
   cout << " FILA JA ESTA VAZIA" << endl << endl;    
}

 

Cara assim deu certo, ai eu estou conseguindo remover e deixando no conceito de fila. Usei um if, com for esta dando erro, criei essa variável "cont" somente para fazer a mudança de posição, pois estava tentando com for como mostrei ali no 1 código, mais da erro.

 

agora 1 coisa, minha string n esta aceitando o espaço, quando quero digitar por exemplo um nome completo quando dou espaço n aceita, alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Markinho,

 

Acho que seu primeiro código estava retornando erro pq você esta limitando o for no tamanho do vetor. Ja no pseudo código que mostrei limito o for no sinalizador de ultimo elemento da fila.

 

Quanto ao espaço na string experimente usar este método do objeto cin:

http://www.cplusplus.com/reference/iostream/istream/read/

 

Ou algum metodo da string:

http://www.cplusplus.com/reference/string/

 

Me enrolei para tentar te ajudar na duvida. desculpe se confundi você.

 

Flw!

 

Isso não faz sentido. Você pode utilizar c_str() para converter para uma string da C para armazenar em uma string da C, mas não vai funcionar fazer tipo:

 

#include <string>
#include <cstring>

int main()
{
   std::string string1 = "lololol", string2;

   strcpy(string2.c_str(), string1.c_str());

   return 0;
}

 

Não sei se já estudou strings da C++, mas o que eu posso garantir é que o uso que o markinhospaulo fez delas está certo. Não faz sentido e é errado utilizar strcpy() com strings da C++.

 

 

 

Abraços :D

 

Renato,

 

Concordo que o Markinho estava fazendo uso correto da string C++. Apenas dei mais uma opção além da atribuição.

 

Dei esta opção pois não sou muito adepto de strings C++, programo mais em baixo nível e a maioria das vezes preciso tratar dados byte a byte, por isto a preferencia por strings C.

 

Da forma do exemplo que tu postou realmente não da certo. Mas assim:

#include <iostream>
#include <string>
#include <cstring>

int main() {
   char String_C[40];
   std::string String_Cplusplus;

   String_Cplusplus = "Esta e uma string C++ em uma string C";

   std::strcpy(String_C,String_Cplusplus.c_str());
   std::cout << String_C << std::endl;

   return 0;
}

É 100% garantido. Compilado e sem nenhum warning no Code::Blocks.

Segue uma explicação do método c_str() que retorna a string C equivalente da string C++:

http://www.cplusplus.com/reference/string/string/c_str/

 

Realmente não conheço muito de strings C++ pois não estudei a fundo elas. Sempre tive preferencia por strings C.

 

Flw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mano, é claro que isso vai funcionar, você usou o strcpy para passar da string da C++ para a string da C que você criou. E isso foi exatamente o que falei, não sei se não ficou muito claro:

 

Você pode utilizar c_str() para converter para uma string da C para armazenar em uma string da C, mas não vai funcionar fazer tipo:

 

Você simplesmente converteu a string da C++ e a armazenou a string da C. Embora eu também prefira usar as strings da C, se começou usando as da C++ utilize as da C++ no final, ou comece sempre utilizando as da C.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal! Conseguir resolver o problema com a string. Utilizei o método getline() assim consigo capturar a linha inteira. Tive um probleminha com ele, pois quando mandava adicionar ele me preenchia o 1° campo sem nada, resolvi usando o fflush(stdin) para limpar o buffer do teclado.

void inserirPessasNaFila()
{
   if(proximo != TAM)
   {
       //limpa o buffer do teclado
       fflush(stdin);
       cout << "Nome: " ;
       getline(cin,pessoas[proximo].nome);
       cout << "Cpf: " ;
       getline(cin,pessoas[proximo].cpf);
       cout << "Sexo: " ;
       getline(cin,pessoas[proximo].sexo);
       cout << "Telefone: " ;
       getline(cin,pessoas[proximo].telefone);
       cout << "Email: " ;
       getline(cin,pessoas[proximo].email);

       cout << "Logradouro: " ;
       getline(cin,pessoas[proximo].endereco.logradouro);
       cout << "Numero: " ;
       getline(cin,pessoas[proximo].endereco.numero);
       cout << "Complemento: " ;
       getline(cin,pessoas[proximo].endereco.complemento);
       cout << "Cep: " ;
       getline(cin,pessoas[proximo].endereco.cep); 
       cout << "Cidade: " ;
       getline(cin,pessoas[proximo].endereco.cidade);
       cout << "Estado: " ;
       getline(cin,pessoas[proximo].endereco.estado);
       //checar se fila esta cheia
       if(proximo != TAM)
       { 
           proximo++;
       }
       //limpar tela            
           system("cls");

   }
   else
       cout << "FILA CHEIA." << endl << endl; 

}

 

Obrigado GBecker e Renato Utsch pela ajuda. Abraço :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, sim, era essa sua dúvida? malz por não ter lido seu primeiro post.

 

o getline() é o que eu uso também.

 

Hein, não utilize fflush(stdin), é errado usar. http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

 

É muito fácil fazer uma alternativa para limpar o buffer, mas eu só fiz até hoje com as funções da C, não conheço muito bem as da C++.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.