Daniel92 0 Denunciar post Postado Março 17, 2011 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
Daniel92 0 Denunciar post Postado Março 19, 2011 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
_Isis_ 202 Denunciar post Postado Abril 3, 2011 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
Daniel92 0 Denunciar post Postado Abril 3, 2011 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
_Isis_ 202 Denunciar post Postado Abril 4, 2011 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
Daniel92 0 Denunciar post Postado Abril 4, 2011 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