Ir para conteúdo

Arquivado

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

  • 0

Pergunta

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()
                                             ^~~~~
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 resposta a esta questão

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Leandro T.
      pessoal bom dia alguém poderia me ajudar com o FormValidation?
       
      "nomefuncionario": {
                  validators: {
                      
                  
                    notEmpty: {
                      message: "Nome completo do funcionário é obrigatório."
                    } , <=== este funciona normalmente
                      
                      callback: {  // agora o callback nao consigo fazer funcionar
                              message: 'este nome não é valido',
                              callback: function (input) {
                                  if (input.value = 'algum valor digitado') {
                                      return true
                                  } }},
                      
                      
                      
                  }
    • Por nathanmoreira
      Após diversos cálculos provindos de um código, recebo um número inteiro ao qual não sei o tamanho ao certo (pode variar de 1 pra frente). Quero passar esse número para string e formatar ele de maneira a colocar um ,00 no final e, a cada 3 números antes da virgula, um ponto. Ou seja, deixar o número num formato como: 45.114.477,00
       
      Como fazer? 
    • Por TK_T
      olá sou iniciante consegui fazer um o código de um exercício só que quando eu peço o valor 12ab ele lê como numérica alguém pode me ajudar? 
      Exercício: Leia uma string e diga se a mesma é numérica (na base decimal) ou não.
      Ex.: "123" -> numérica
      "abc" -> não numérica
      "12ab" -> não numérica
      "12.34" -> numérica 
      #include <stdio.h> int main() { char Numero; printf("Digite Algo: "); scanf("%c", &Numero); if(Numero == '1' || Numero == '2' || Numero == '3' || Numero == '4' || Numero == '5' || Numero == '6' || Numero == '7' || Numero == '8' || Numero== '9' || Numero == '0') printf("\tNumérica...\n"); else printf("\tNão Numérica\n"); return 0; }  
    • Por clayton.lima2020
      Boa Tarde!
       
      Pessoal estou com um problema para resolver:
       
      Tenho um uma string que é um Nome:  SYLVIA
       
      Eu preciso fazer uma uma busca nessa string achar a letra Y e depois verificar se após a letra Y a próxima letra é Vogal ou Consoante.
       
      No caso do nome SYLVIA a próxima letra é L então retorna Consoante.
       
      Alguém sabe montar esse algoritmo ai?
    • Por Sharank
      Strcat Function In C++
       
      I'm new to C and C++ programming, can anyone give me a hint on what I'm doing wrong here. I'm trying to write to concat function that takes to pointers to chars and concatenates the second to the first. The code does do that, but the problem is that it adds a bunch of junk at the end.
       
      For instance, when passing the arguments - "green" and "blue", the output will be "greenblue" plus a bunch of random characters. I also wrote the strlen function that strcat uses, which I will provide below it for reference. I'm using the online compiler at InterviewBit The exact instructions and specification is this:
       
      int main(int argc, char** argv)
      {
      const int MAX = 100;
       
      char s1[MAX];
      char s2[MAX];
       
      cout << "Enter your first string up to 99 characters. ";
      cin.getline(s1, sizeof(s1));
      int size_s1 = strlen(s1);
      cout << "Length of first string is " << size_s1 << "\n";
       
      cout << "Enter your second string up to 99 characters. ";
      cin.getline(s2, sizeof(s2));
      int size_s2 = strlen(s2);
      cout << "Length of second string is " << size_s2 << "\n";
      cout << " Now the first string will be concatenated with the second
      string ";
      char* a = strcat(s1,s2);
       
      for(int i = 0; i<MAX; i++)
      cout <<a;
       
      // system("pause");
      return 0;
      }
       
      //strcat function to contatenate two strings
      char* strcat(char *__s1, const char *__s2)
      {
      int indexOfs1 = strlen(__s1);
      int s2L = strlen(__s2);
      cout <<s2L << "\n";
      int indexOfs2 = 0;
      do{
      __s1[indexOfs1] = __s2[indexOfs2];
      indexOfs1++;
      indexOfs2++;
      }while(indexOfs2 < s2L);
       
       
      return __s1;
      }
       
      //Returns length of char array
      size_t strlen(const char *__s)
      {
      int count = 0;
      int i;
      for (i = 0; __s != '\0'; i++)
      count++;
      return (count) / sizeof(__s[0]);
       
      }
×

Informação importante

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