1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema sem resolução aparente

Discussão em 'Programação' iniciada por | Blasted |, 9 de Março de 2009. (Respostas: 2; Visualizações: 472)

  1. | Blasted |

    | Blasted | [email protected] 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:

    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 :
    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:

    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
     
  2. OubeLa

    OubeLa Power Member

    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: 9 de Março de 2009
  3. | Blasted |

    | Blasted | [email protected] Member

    Certissimo sir_atmc.
    Obrigadíssimo pela ajuda ;)

    O problema estava mesmo em tentar juntar um char a uma string. Não reparei isso.
     

Partilhar esta Página