Jump to content

Question

Entao pessoal, sou novo no forum e preciso de ajuda com o seguinte problema: implementar uma arvore binaria de palavras em c++ (existem alguns quesitos do trabalho mas estes eu acho q posso resolver). Meu problema é colocar uma string como parametro dentro de cada Nó da arvore, tentei transformar tudo em 'const char *' mas nao obtive sucesso.

segue o codigo e os erros, se alguem souber como me ajudar desde ja agradeço.

 

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

class No
{

public:
	No *esq, *dir;
	const char* no;
	int frequencia=0;

	No(const char* no){
		this-> no = no;
		esq = NULL;
		dir = NULL;
	}
//////////////////////////////////////////////////////////////////
	int getNo(int i){
		return no[i];
	}
//////////////////////////////////////////////////////////////////
	No* getEsq(){
		return esq;
	}
//////////////////////////////////////////////////////////////////
	No* getDir(){
		return dir;
	}
//////////////////////////////////////////////////////////////////
	void setEsq(No* word){
		esq = word;
	}
//////////////////////////////////////////////////////////////////
	void setDir(No* word){
		dir = word;
	}
//////////////////////////////////////////////////////////////////
/*	void setFrequencia(){
		frequencia+=frequencia;
	}
//////////////////////////////////////////////////////////////////
	int getFreq(){
		return frequencia;
	} */
//////////////////////////////////////////////////////////////////
	
};

class Arvore
{
private:
	No* raiz;
public:
	arvore(){
	raiz = NULL;
}
//////////////////////////////////////////////////////////////////
void inserir (const char * word)
{
	if(raiz == NULL)
		raiz = new No (word);			// INSERIR COM ARVORE VAZIA
	else
		inserir2(raiz,word);
}
//////////////////////////////////////////////////////////////////
void inserir2 (No* no, const char* word)
{
	int i=0, end = 1;
	while(end==1 || i>word.strlen() || i > no-> no.strlen())
	{
		if ((int)word[i] < no->getNo(i))
		{
			if(no->getEsq()==NULL)
			{
				No* novo_no = new No(word);
				no->setEsq(novo_no);
			}else{
				inserir2(no->getEsq(),word);
			}
			end=0;									// INSERIR A DIREITA OU A ESQUERDA
		}else if((int)word[i] > no->getNo(i))
		{
			if(no->getDir()==NULL)
			{
				No* novo_no = new No(word);
				no->setDir(novo_no);
			}else{
				inserir2(no->getDir(),word);
			}
			end=0;
		}
		i++;
	}
	/* SE FOR IGUAL SOMA A FREQUENCIA DA PALAVRA */
	// setFrequencia();
	/* SE FOR IGUAL SOMA A FREQUENCIA DA PALAVRA */
}
	
};

bool escrever (){
//////////////////////////////////////////////////////////////////
	string texto;
	ofstream myfile ("original.txt");
		if(myfile.is_open()){
			getline(cin,texto);
			myfile << texto;				// ESCREVER TEXTO // 
			myfile.close();
			return 0;
		}else{
			return 1;
		}
//////////////////////////////////////////////////////////////////	
}
/////////////////////////////////////////////////////////////////
bool modificar(){
	string texto;
	fstream arq("original.txt");
	ofstream myfile("modificado.txt");
	
	if((arq.is_open()) && (myfile.is_open())){
		getline(arq, texto);

		for (int i = 0; i < texto.length(); ++i)
		{
			if (((texto[i]<65)||(texto[i]>122)) || ((texto[i]>90)&&(texto[i]<97)))
			{
				texto[i]='\n';
			}

			if((texto[i]>64)&&(texto[i]<91))
			{
				texto[i]+=32;
			}
			
		}
		cout<< texto <<endl;
		myfile<< texto;
		arq.close();
		myfile.close();
		return 0;
	}else{
		return 1;
	}
}
/////////////////////////////////////////////////////////////////
int main()
{
	string palavra;
	Arvore arv;

	cout<<escrever()<<endl;
	cout<<modificar()<<endl;

	fstream arquivo ("modificado.txt");
	const char* temp= getline(arquivo,palavra).c_str()
	arv.inserir( temp  );
	/*for (int i = 0; i < 7; ++i)
	{
		arv.inserir (getline(arquivo,palavra));
		endl;
	}*/
	return 0;
}
//////////////////////////////////////////////////////////////////

Erros: 
main.cpp: In member function 'void Arvore::inserir2(No*, const char*)':
main.cpp:71:25: error: request for member 'strlen' in 'word', which is of non-class type 'const char*'
  while(end==1 || i>word.strlen() || i > no-> no.strlen())
                         ^~~~~~
main.cpp:71:49: error: request for member 'strlen' in 'no->No::no', which is of non-class type 'const char*'
  while(end==1 || i>word.strlen() || i > no-> no.strlen())
                                                 ^~~~~~
main.cpp: In function 'int main()':
main.cpp:158:45: error: 'class std::basic_istream<char>' has no member named 'c_str'
  const char* temp= getline(arquivo,palavra).c_str()
                                             ^~~~~
 

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

você está transformando uma string num char *

Não tem como chamar métodos num tipo primitivo. Só em classe (em C++ string e char * são coisas diferentes). Leia a msg de erro do compilador.

 

Além disso, getline não retorna um objeto da classe string p/ você tentar converter usando c_str. Procure os manuais das funções e métodos na internet.

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

  • Similar Content

    • By TheRuivo
      Olá,
      estou tentando criar um código em c++ com funções e procedimentos a um tempo, só que eles sempre retornam 0, se alguém puder me ajudar, agradeço. ;)
      Segue o código:
      #include <iostream>
      #include <stdlib.h>
      #include <stdio.h>
      #include<locale.h>
      #include<math.h>
      #include<cmath>
      using namespace std;
      void Triangulo(int la)
      {
          double b,h,r;
              printf("Por favor digite o valor da base e da altura: \n");
              scanf("%i %i",&b,&h);
              r=(b*h)/2;
              printf("A área é: %i \n",r);
      }
      double Quadrado(int la, int b, int h)
      {
          double r;
          printf("Por favor digite o valor da base e da altura: \n");
          scanf("%i %i",&b,&h);
          r=b*h; 
          printf("A área é: %i ",r);
          return r;
      }
      int Menu(int la)
      {
          int b,h;
          switch(la)
          {
              case 3:
                  printf("É um triângulo \n");
                  Triangulo(la);
                  break;
              case 4:
                  printf("É um quadrilátero \n");
                  Quadrado(la,b,h);
                  break;
              case 5:
                  printf("É um pentágono \n");
                  break;
              case 6:
                  printf("É um hexágono \n");
                  break;        
          }
          return la;
      }
      int main(int argc, char** argv) {
          setlocale(LC_ALL, "Portuguese");
          int b,h,r,l;
          printf("Por favor insira a quantidade de lados da figura(3-6): ");
          scanf("%i",&l);
          Menu(l);
          
          
          
             
          system("pause");
          return 0;
      }
    • By Santos_2015
      tenho array que está sendo preenchido assim:
      $dados = array([0] => "Nome",[1] => "SobreNome",[2] => "null"); queria que ficasse dessa forma:
      $dados = array([0] => "Nome",[1] => "SobreNome",[2] => null); pois estou extraindo os valores do array com array_values  pra colocar em um INSERT, os campos que podem ser null são do tipo date(BD mysql),
      então tenho que retirar as aspas quando o valor vier null , ou no próprio array, ou após o array_values, alguma sugestão?  
    • By Thalysson Torres
      Estou com problema nesse código, na verdade é uma duvida de como trabalhar melhor com string. Eu quero faze um programa e nele quero receber do usuario, o sexo, caso o usuario digite um nome no local do sexo e seja diferente de Masculino, Feminino... de mensagem de erro. 
       
       
      #include <stdio.h>
      #include <stdlib.h>
      #include <math.h>

      int main()
      {
          char nome [25], sexo;

          
          
      printf("Digite o nome \n");
      scanf("%[\n]", &nome);
      printf("Digite o Sexo:\n Para feminino digite: F \n\n Para masculino digite; M \n");
      scanf("%c",&sexo);
      if (sexo != 'f'|| 'F' || 'M' || 'm')
          printf("Sexo Invalido");
       
       
      ...
       


          
          return 0;
      }
       
    • By joaov369
      Então, preciso fazer um programa em c++ que duplique o valor do vetor se ele for um numero par, até ai tudo bem, e preciso trocar a ordem desse vetor ate a penultima posição, desde a primeira, isso que tá garrando aqui, se alguem puder dar uma olhada no meu codigo.
      #include <iostream> using namespace std; #define n 10 int main() { int a[n], temp; for (int i = 0; i<n; i++) { cin >> a[i]; } for (int i = 0; i<n; i++) { if (a[i] % 2 ==0) a[i]=a[i]*2; } for (int i = 0; i<n-1; i++) { temp=a[i]; a[i]=a[i+1]; temp=a[i]; a[i]=temp; } for (int i = 0; i<n; i++) { cout << a[i] << " " ; } return 0; }  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.