Jump to content
| Blasted |

Problema sem resolução aparente.

Recommended Posts

| Blasted |

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

Share this post


Link to post
Share on other sites
Cybernavigator

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.


Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.