Ir para conteúdo

POWERED BY:

Arquivado

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

Daniel92

Struct + ponteiros

Recommended Posts

Hello. Estou aqui para falar de outro exercicio que tenho para fazer. Sobre ponteiros e structs. Conhecido como estrutura encadeada.

 

http://www.inf.pucrs.br/~pinho/PRGSWB/Ponteiros/ponteiros.html

 

O exercicio se baseia em você abrir um arquivo, ir lendo as linhas dele, pegar os números e salvar-los já em ordem. Algo tipo: pega um número, salva. Pega o segundo e vai vendo em qual posição ele se encaixa acessando a lista encadeada. Pega o terceiro e idem.

Não vai ter pegadinha nem nada. EX:

453
34
766
231
23

 

Claro que usando um vetor que gravasse e ir comparando e salvando iria ser muito mais facil, mas o objetivo do problema é se familiarizar com os ponteiros e structs.

 

Eu fiz algo mas está longe de estar pronto. Take a look:

 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <string>
using namespace std;

char nome_arquivo[30],x[30];
void gravar(void);


struct number
{
      float numero;
      number *prox;
}
number*inicio;


int main () 
{


   cout << "Escreva o nome do arquivo a ser aberto\n";
   cin >> nome_arquivo;

   ifstream leitura;

   leitura.open(nome_arquivo);

   if(!leitura.is_open())
   {
                         cout << "O arquivo nao foi encontrado! O programa sera fechado!\n";
                         system("pause");
   }
   else
   {       
           while (leitura.getline(x,50))
           gravar();

           while (leitura.getline(x,50))
           cout << x;

           cout << "Rotina terminada!\n";
           system("pause");
   }

  return(0);
}

void gravar(void)
{

    number*inicio;

    if(inicio==null)
    {

                    inicio=(number*)(malloc(sizeof(number)));
                    numero=atof(x);
    }
    else
    {



    }


}

 

Meus principais problemas são:

1- A declaração, que sempre da erro.

2- Ver se o ponteiro é null.

3- Fazer um ponteiro do tipo da minha struct de inicio e fim.

 

Podem me dar uma luz?

Grato.

Se fico mau explicado, me desculpe e peça que eu tente explicar novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu codigo apos algum estudo sobre o assunto.

 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <string>
using namespace std;

char nome_arquivo[30],x[30];
void gravar(void);
int y;


struct number
{
      float numero;
      number *prox;
};
number*inicio,*u;


int main () 
{    
   inicio=NULL;

   cout << "Escreva o nome do arquivo a ser aberto\n";
   cin >> nome_arquivo;

   ifstream leitura;

   leitura.open(nome_arquivo);

   if(!leitura.is_open())
   {
                         cout << "O arquivo nao foi encontrado! O programa sera fechado!\n";
                         system("pause");
   }
   else
   {       
           while (leitura.getline(x,50))
           gravar();

           system("pause");
           u=inicio;
           while(u->prox!=NULL)
           {
                                    cout << u->numero << "\n";
                                    u= (u->prox);
           }

           cout << "Rotina terminada!\n";
           system("pause");
   }

  return(0);
}

void gravar(void)
{     
    number*aux,*novo;

    if((novo=(number*)malloc(sizeof(number)))==NULL)
    {
                                                 cout << "Não foi possivel alocar a area de memoria\n";
                                                 y=1;
    }
    else
    {
         novo->numero=atof(x);                                                          
         if(inicio==NULL)
         {
                    inicio=aux;
                    (aux->prox)=NULL;                                                                                 
         }
         else
         {
             if((inicio!=NULL)&&((inicio->numero)<(novo->numero))) 
             {                     
                          while((aux->prox!=NULL)&&((aux->numero)<(novo->numero)))
                          aux=aux->prox;

                          novo->prox=aux->prox;
                          aux->prox=novo;
             }
         }                              
    }         
}

 

E ai? O programa esta travando e eu não faço idéia de qual seja o problema. Se puderem copiar, compilar e testar ficarei grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Daniel, se a gente compilar e testar você não vai aprender a depurar código. Por mais "banana" que seja a frase, existem uns posts no fórum de C nos quais você percebe o "clássico problema" da falta de conhecimento sobre depuradores e até mesmo do compilador por parte dos usuários. Em alguns rola até falta de vontade de aprender (isso porque faz parte do processo e ajuda você a melhorar o código... imagine se não prestasse p/ nada).

 

 

Qual compilador você está usando e em que ambiente? No Linux, por exemplo, você pode utilizar o GCC ou o Sun Studio (que dizem ser o único que implementa o padrão C99 completo, mas já está vindo outro, o C1X -- nome não-oficial).

P/ depurador eu uso o GDB, também no Linux.

 

 

http://forum.imasters.com.br/topic/294106-aviso-leia-antes-de-postar/page__view__findpost__p__1299190

http://forum.imasters.com.br/topic/322646-programando/page__view__findpost__p__1409771

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo. Realmente, acho que a parte que eu mais aprendi nesse processo foi quando eu procurei o que estava errado. Admito que não sei usar o meu compilador muito bem (DevC++) mas mesmo assim consegui concertar o codigo.

Todavia, obrigado pelo comentario.

 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <string>
using namespace std;

char nome_arquivo[30],x[30];
void gravar(void);
int y;


struct number
{
      float numero;
      number *prox;
};
number*inicio,*u;

int main () 
{    
   inicio=NULL;

   cout << "Escreva o nome do arquivo a ser aberto\n";
   cin >> nome_arquivo;       // * pega o nome do arquivo que iremos trabalhar *

   ifstream leitura; // * objeto de leitura *

   leitura.open(nome_arquivo);

   if(!leitura.is_open())  // * verifica se o arquivo 'nome_arquivo' foi aberto *
   {
                         cout << "O arquivo nao foi encontrado! O programa sera fechado!\n";
                         system("pause");
   }
   else
   {       
           while (leitura.getline(x,50))    // * pega uma linha do arquivo 'nome_arquivo' e joga na string 'x' *
           gravar();                        // * função feita para adicionar os numeros na lista encadeada direto na ordem crescente *
           leitura.close();
           cout << "Lista ordenada!\n\n";

           ofstream escreve;           // * objeto de escrita *
           escreve.open(nome_arquivo);                       
           u=inicio;                                         // * atribui ao ponteiro auxiliar 'u', de tipo 'number', o endereço do primeiro termo da lista *
           do
           {
                                    cout << u->numero << "\n";            // * escreve na tela a variavel 'numero' que é apontada pelo ponteiro auxiliar 'u' *
                                    escreve << u->numero << "\n";         // * escreve no arquivo 'nome_arquivo' a variavel 'numero' apontada pelo ponteiro auxiliar 'u' *
                                    u= (u->prox);                         // * faz com que o ponteiro passe a apontar para o proximo termo da lista *
           }while(u!=NULL);
           escreve.close();         // * fecha o objeto de leitura

           cout << "\nRotina terminada!\n";
           system("pause");
   }

  return(0);
}

void gravar(void)
{     
    number*aux,*novo;


    novo=(number*)malloc(sizeof(number));     // * pega uma area da memoria da maquina e reserva para um tipo 'number'. 
                                              // * Ou seja: um ponteiro e uma variavel int. 
                                              // * Apos pegar essa area para essas informações, ele da o endereço da area para o ponteiro 'novo'
    if (novo==NULL) {cout << "Não foi possivel alocar a area!\n";}

    novo->numero=atof(x);                      // * joga na variavel 'numero' apontada pelo 'novo' o numero contido na string  'x' *

    if(inicio==NULL)                           // * interpreta-se essa condição como LISTA VAZIA *
    {  
                    inicio=novo;
                    novo->prox=NULL;                                                                                                                                          
    }
    else                                       // * se a lista não estiver vazia... *                                                         
    {
        aux=inicio;  
        if((inicio->numero)>(novo->numero)) // * se o 'numero' do ponteiro 'novo' for menor que o 'numero' do primeiro elemento da lista *
        {
                                            novo->prox=inicio; // * o ponteiro que aponta para o proximo do 'novo' recebe o endereço de 'inicio' *
                                            inicio=novo;       // * e o primeiro elemento da lista passa a ser o 'novo' *
        }
        else
        {                                                                                                              
            while((aux->prox!=NULL)&&((aux->prox->numero)<(novo->numero))) // * Essa logica diz que: 
            {                                                              // * enquanto o ponteiro que aponta para o proximo não for NULL, ou seja, enquanto ouver um proximo elemento na lista
                       aux=aux->prox;                                      // * E enquanto o 'numero' de 'novo' for maior que o 'numero' de 'aux'            
            }                                                              // * Pule para o proximo elemento *                                                               
        novo->prox=aux->prox;                                              // * o ponteiro do proximo elemento apontado pelo 'novo' recebe o ponteiro do proximo elemento apontado pelo 'aux' *
        aux->prox=novo;                                                    // * E esse proximo elemento de 'aux' vai apontar para 'novo' *
        }
    }                              

}    

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, o DevC++ não é um compilador, é uma IDE. São coisas diferentes. O compilador que o ambiente utiliza é o MingW, um port do GCC p/ Windows.

Honestamente, acho que dificilmente alguém aqui vai te recomendar essa IDE. Se você puder trocar, troque (existe Netbeans, Eclipse, CodeBlocks e Geany).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom saber pois os 2 professores que tive de programação se referiam ao devC++ como um compilador. Mas por enquanto é meio dificil trocar de ambiente pois o meu professor se baseia nesse IDE. Mas vou dar uma conversada com meu professor sobre o assunto. Muito obrigado pela ajuda.

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.