Problema sem resolução aparente

| Blasted |

Portugal@Home Member
Hi folks ;D

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:

Código:
#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:
Código:
    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 ;)

Blasted
 
Assim de repente teu problema deverá ser que palavra1 é um char, e não uma string. Estás a tentar concatenar char com string e tal coisa gera problemas.

edit:

Código:
#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]))
            {
                string str(1, palavra1[i]);
            string str2(1, palavra2[i]);
            mensagem += str + " != " + str2;
            numero_letras_diferentes += 1;
            }
        else if (palavra1[i] != palavra2[i])
        {
            string str(1, palavra1[i]);
            string str2(1, palavra2[i]);
            mensagem += ", " + str + " != " + str2;
            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());

    cout << endl;
    return 0;
}
Vê se é isso.

Para veres como "converti" de char para string vê aqui: http://www.cppreference.com/wiki/string/string_constructors

Usei o seguinte construtor:
string( size_type length, const char& ch );


edit 2:

código da função ligeiramente mais agradável :P

Código:
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 (palavra1[i] != palavra2[i])
        {
            string str(1, palavra1[i]);
            string str2(1, palavra2[i]);

            if (numero_letras_diferentes != 0)
                mensagem += ", ";

            mensagem += str + " != " + str2;
            ++numero_letras_diferentes;
        }
    }
    cout << "NUMERO DE CARACTERES DIFERENTES: " << numero_letras_diferentes << endl;
    return mensagem;
}
 
Última edição:
Back
Topo