Jump to content
Sign in to follow this  
B!

Ajuda .txt e listas ligadas

Recommended Posts

B!

Boas, eu pretendo carregar um ficheiro, neste caso um dicionário para uma lista, para poder depois trabalhar com a lista.

Mas estou a ter alguns problemas.

O codigo que tenho é este :

 #include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>


using namespace std;

class Clista{

public:

string dados;
Clista *Proximo;
};



class ClistaInteiros{

Clista *cabeca;

public:
ClistaInteiros();
~ClistaInteiros();

void InsereItem(string item);
void carregadicionario();
void EscreveLista();
};




ClistaInteiros::ClistaInteiros(){
cabeca=NULL;
}


ClistaInteiros::~ClistaInteiros(){
Clista *actual, *proximo;

if(cabeca!=NULL){
actual=cabeca;
while(actual!=NULL){
proximo=actual->Proximo;
delete actual;
actual=proximo;
	}
}
}


void ClistaInteiros::InsereItem(string item){
Clista *Novo=new Clista;
Clista *actual;
Novo->dados=item;
Novo->Proximo=NULL;

if(cabeca==NULL){
cabeca=Novo;
}else{
actual=cabeca;
while(actual->Proximo!=NULL)
actual=actual->Proximo;
actual->Proximo=Novo;
}
}

void ClistaInteiros::carregadicionario(){

ClistaInteiros teste;

	ifstream file;
string a;
  
file.open("um.txt");



while(getline(file,a)) {
	teste.InsereItem(a);  

}
}


void ClistaInteiros::EscreveLista(){

Clista *actual=cabeca;
if(cabeca==NULL)
cout << "Lista Vazia..." << endl;
else{

while(actual!=NULL){

	cout << actual->dados << ", ";

	actual=actual->Proximo;
}
cout << "FIM" << endl;
			}

}

int main(){

ClistaInteiros ab;

ab.carregadicionario();

ab.EscreveLista();
system("pause");
} 

Share this post


Link to post
Share on other sites
B!

Devo estar a fazer alguma coisa mal porque quando chamo a Escrevelista aparece lista vazia, algo esta mal quando carrego o ficheiro txt

Share this post


Link to post
Share on other sites
pikax

isto é algum programa para aprenderes a fazer uma lista?

Se não for podes sempre utilizar a STD, que tona o código muito mais pequeno


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
B!

Não eu preciso de fazer um jogo do tipo scrabble, para isso tenho que carregar um ficheiro de texto com muitas palavras, um dicionario para uma lista, o meu problema esta em carregar esse ficheiro.

Share this post


Link to post
Share on other sites
pikax

Podes fazer com a list:http://www.cplusplus.com/reference/stl/list/

ficaria algo assim:

#include <iostream>
#include <fstream>
#include <list>

using namespace std;

bool carregadicionario(list<string> &lista)
{
    ifstream file;
    string a;

    file.open("dic.txt");



    while(getline(file,a))
    {
        lista.push_back(a);
    }

    return lista.size();
}


int main()
{
    list<string> lista;

    if(carregadicionario(lista))
        for(list<string>::iterator it=lista.begin();it!=lista.end();++it)
            cout<<*it<<endl;
}

É uma das resoluções, estou a ver se encontro o erro no teu código, mas é mais rápida desta forma, da tua iria demorar algum tempo, já que não era necessário uma lista para o que queres bastava um vector.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
B!

eu queria ver se utilizava listas pois esta no programa e era valorizado o seu uso no projecto.

Ja alterei o codigo mas continua a dar erro.

  #include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>


using namespace std;

class Clista{

public:

char a;
Clista *Proximo;
};



class ClistaInteiros{

Clista *cabeca;

public:
ClistaInteiros();
~ClistaInteiros();

void InsereItem(char a);
void carregadicionario();
void EscreveLista();
};




ClistaInteiros::ClistaInteiros(){
cabeca=NULL;
}


ClistaInteiros::~ClistaInteiros(){
Clista *actual, *proximo;

if(cabeca!=NULL){
actual=cabeca;
while(actual!=NULL){
proximo=actual->Proximo;
delete actual;
actual=proximo;
	}
}
}


void ClistaInteiros::InsereItem(char a){
Clista *Novo=new Clista;
Clista *actual;
Novo->a=a;
Novo->Proximo=NULL;

if(cabeca==NULL){
cabeca=Novo;
}else{
actual=cabeca;
while(actual->Proximo!=NULL)
actual=actual->Proximo;
actual->Proximo=Novo;
}
}

void ClistaInteiros::carregadicionario(){
Clista *actual=cabeca;
Clista *novo = new Clista;
ClistaInteiros teste;

	ifstream file;
	char  a;
  
	file.open("um.txt", ios::in);
	if(!file){
	cout <<"ERRO: Nao foi aberto!" << endl;
	return;
}



	while(!file.eof()) 
	{
		novo->Proximo=NULL;

		if(actual==NULL){
		actual=novo ;
		file.getline(novo->a,869);

		actual=actual->Proximo;
}

			while(actual!=NULL)
	{
		file.getline(actual->a 860,'/n');
		actual = actual->Proximo;

	}
	actual->Proximo=novo;
}

file.close();

}


void ClistaInteiros::EscreveLista(){

Clista *actual=cabeca;
if(cabeca==NULL)
cout << "Lista Vazia..." << endl;
else{

while(actual!=NULL){

	cout << actual->dados << ", ";

	actual=actual->Proximo;
}
cout << "FIM" << endl;
			}

}

int main(){

ClistaInteiros ab;

ab.carregadicionario();

ab.EscreveLista();
system("pause");
}

Share this post


Link to post
Share on other sites
KTachyon

E que erro é que continua a dar?

EDIT: Tens alguns erros, de facto:

char a;

file.getline(novo->a,869);

A variável 'a' não é um ponteiro.

file.getline(actual->a 860,'/n');

O mesmo, mais uma ',' em falta.

cout << actual->dados << ", ";

A classe não tem nenhuma variável 'dados'.

Pelo menos, depois há alguns derivados desses erros.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
B!

Pessoal ja consigo carregar o ficheiro, contudo como é um dicionário e tem muitas muitas palavras demora uma eternidade a carregar =\

Precisava de ajuda a optimizar isto, pensei numa array de listas ?

 #include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>


using namespace std;

class Clista{

public:

        char palavra[30];
        Clista *proximo;
};



class ClistaInteiros{

Clista *cabeca;

public:
ClistaInteiros();
~ClistaInteiros();
void carregadicionario();
void EscreveLista();
};




ClistaInteiros::ClistaInteiros(){
cabeca=NULL;
}


ClistaInteiros::~ClistaInteiros(){
Clista *actual, *proximo;

if(cabeca!=NULL){
actual=cabeca;
while(actual!=NULL){
proximo=actual->proximo;
delete actual;
actual=proximo;
                }
        }
}



void ClistaInteiros::carregadicionario(){
       
Clista *Actual=cabeca;
Clista *novo = new Clista;
int count=0;
ifstream fich;


fich.open("ListaPalavras.txt",ios::in);
if(!fich){
	cout <<"ERRO: Nao foi aberto!" << endl;
	return;
}
     
 while(!fich.eof()) 
{

Clista *novo=new Clista;
Clista *Actual;


   

       novo->proximo=NULL;

if(cabeca==NULL){
	cabeca=novo;




}else{

	Actual=cabeca;

	while(Actual->proximo!=NULL)
	{
		  Actual=Actual->proximo;
	}
	      Actual->proximo=novo;

		   fich.getline(novo->palavra,40,'\n');
		   
}

}

fich.close();
}



void ClistaInteiros::EscreveLista(){

        Clista *actual=cabeca;
if(cabeca==NULL)
cout << "Lista Vazia..." << endl;
else{

        while(actual!=NULL){

                cout << actual->palavra <<endl;

                actual=actual->proximo;
}
}
}

int main(){

ClistaInteiros ab;

ab.carregadicionario();
ab.EscreveLista();
system("pause");
}

Share this post


Link to post
Share on other sites
Localhost

O problema é que tu estás sempre a percorrer a tua lista até ao final o que vai demorar muito. A ideia é manteres um ponteiro sempre para o final da lista (último elemento), inserir um novo elemento no seguinte ao último e actualizar esse mesmo ponteiro.

Anyway, quantas palavras tens mais ou menos?


here since 2009

Share this post


Link to post
Share on other sites
KTachyon

Para além dessa questão, que realmente deverá ser a que causa maior problema de performance, podes também ter um problema de buffer para leitura do ficheiro. Podes ter que brincar um bocado com os tamanhos dos buffers.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
B!

O ficheiro é um dicionário, tem mais ou menos 100 mila palavaras segundo o word.

"O problema é que tu estás sempre a percorrer a tua lista até ao final o que vai demorar muito. A ideia é manteres um ponteiro sempre para o final da lista (último elemento), inserir um novo elemento no seguinte ao último e actualizar esse mesmo ponteiro.

Anyway, quantas palavras tens mais ou menos?"

Podes esplicar melhor?

Share this post


Link to post
Share on other sites
KTachyon

"O problema é que tu estás sempre a percorrer a tua lista até ao final o que vai demorar muito. A ideia é manteres um ponteiro sempre para o final da lista (último elemento), inserir um novo elemento no seguinte ao último e actualizar esse mesmo ponteiro.

Anyway, quantas palavras tens mais ou menos?"

Podes esplicar melhor?

                Actual=cabeca;

                while(Actual->proximo!=NULL)
                {
                          Actual=Actual->proximo;
                }

Se tiveres um ponteiro a apontar para o útlimo elemento da lista, escusas de fazer este ciclo e reduzes o tempo que demora a achar o fundo da lista de cada vez que vais inserir uma palavra.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

Provavelmente no futuro vais ter uma função que te vai pesquisar uma determinada palavra na lista. Se for o caso, aconselho-te desde já a começar a pensar em como ordenar a lista de uma maneira rápida, de modo a que depois possas fazer uma pesquisa binária. Mas primeiro começa por implementar aquilo que eu disse e depois podes pensar no resto.


here since 2009

Share this post


Link to post
Share on other sites
B!

Eu preciso agora de ir a lista e retirar uma palavra a sorte, depois baralhar as letras, e de seguida ver todas as combinaçoes possiveis que existem na lista, que contem o dicionário...alguma ideia??

Share this post


Link to post
Share on other sites
Localhost

Eu preciso agora de ir a lista e retirar uma palavra a sorte, depois baralhar as letras, e de seguida ver todas as combinaçoes possiveis que existem na lista, que contem o dicionário...alguma ideia??

Não entendi ponta do que disseste.


here since 2009

Share this post


Link to post
Share on other sites
pikax

Eu preciso agora de ir a lista e retirar uma palavra a sorte, depois baralhar as letras, e de seguida ver todas as combinaçoes possiveis que existem na lista, que contem o dicionário...alguma ideia??

@Tradução:

-1º->Retirar uma palavra que esteja numa posição aleatória.

-2º->Procurar alguma existência na lista com as palavra que tenham essas mesmas letras

Ps: a parte de baralhar as letras não percebi o porque de fazer isso  🤔


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.