• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

| Blasted |

Problema sem resolução aparente.

3 mensagens neste tópico

Bem, chegou a hora de me iniciar aqui neste excelente fórum.

Um olá a todos!

Indo directo ao assunto: tenho um código em c++ para resolver um problema. O programa deve pedir duas palavras ao utilizador separadas por um espaço até que o comprimento das duas seja igual. Nesse momento deve dar uma mensagem indicando quais as letras diferentes na palavra. A mensagem a mostrar deverá ser algo como:

NUMERO DE CARACTERES DIFERENTES: 2

a != b, b != x

O código que tenho é este:

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



string letras_diferentes(string palavra1, string palavra2)
{
        unsigned int numero_letras_diferentes = 0;
string mensagem;
unsigned int i = 0;
for (i; i<palavra1.length();i++)
{
	if ((numero_letras_diferentes == 0) && (palavra1[i] != palavra2[i]))
		{
		mensagem += palavra1[i] + " != " + palavra2[i];
		numero_letras_diferentes += 1;
		}
	else if (palavra1[i] != palavra2[i])
	{
		mensagem += ", " + palavra1[i] + " != " + palavra2[i];
		numero_letras_diferentes += 1;
	}
}
cout << "NUMERO DE CARACTERES DIFERENTES: " << numero_letras_diferentes << endl;
return mensagem;
}


int main()
{
string palavra1, palavra2;
    do{
        cout << "PALAVRAS ? ";
        cin >> palavra1;
        cin >> palavra2;
        if (palavra1.length() != palavra2.length())
        	cout << palavra1.length() << " != " << palavra2.length() << endl;
        else
           cout << letras_diferentes(palavra1, palavra2);
	   }while(palavra1.length() != palavra2.length());

    return 0;
}

A minha ideia é ter uma função que analise duas palavras e produza a mensagem. Como podem ver caso seja a primeira letra diferente que encontra, dá a primeira parte da mensagem e depois nas outras dá basicamente o mesmo mas com a vírgula.

Uma nota para dizer que quando digo letras diferentes é tipo palavra1[ i ] == palavra2[ i ] e não ver se a letra se encontra na palavra.

Portanto compilando o meu código obtenho um erro nesta linha:

	mensagem += ", " + palavra1[i] + " != " + palavra2[i];

que me diz o seguinte :

Type invalid operands of types `const char*' and `const char[5]' to binary `operator+'

Não percebo o porquê visto que em cima faço basicamente o mesmo e não me dá erro, e nesta linha se retirar o ", " já deixa de dar erro.

Se decidir tirar a virgula para testar e correr, obtenho outro problema.

Admitindo que insiro logo duas palavras de comprimento igual, tenho isto:

PALAVRAS ? poi poq

NUMERO DE CARACTERES DIFERENTES: 1

ring::reserve

Não percebo o porquê de me dar aquela mensagem. Já revi isto n vezes e tenho 99% certeza que o meu algoritmo funciona, mas aparentemente algo está mal.

P.S: Ainda não tratei do caso de comparar maiúsculas com minúsculas, mas nesse caso é simples e usando o tolower resolvo rapidamente.

Obrigado desde já pela ajuda  :P

Blasted

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vez o comprimento das duas palavras, calculas a diferença entre elas, fazes o ciclo até à palavra mais pequena, somas no final ao numero de letras diferentes, a diferença entre as duas palavras significa que todas as letras são diferentes.

Acho que te está a dar o erro por causa do return, experimenta, qd chamas a função, fazes .c_str();

cout << letras_diferentes(palavra1, palavra2).c_str();

Acho que isso deve resolver.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema é que ", " é uma constante, e estás a tentar concatenar lá alguma coisa. Se separares essa operação em várias instruções esse erro deve desaparecer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora