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

Array de palavras

Discussão em 'Programação' iniciada por tochano, 17 de Agosto de 2007. (Respostas: 12; Visualizações: 1458)

  1. Boa noite!

    Gostaria de saber se é possivel criar um array de palavras, ou seja, em cada posição guardar uma palavra em vez de numeros.
    Obrigado!
     
  2. HecKel

    HecKel The WORM

    Sim é.

    Agora diz em que linguagem queres, sem mais dados..., no help!

    HecKel
     
  3. pois é, esqueci-m de dizer que é em c++. Pexo desculpa!
     
  4. AliFromCairo

    AliFromCairo Power Member

    Código:
    [SIZE=2]string palavras[] = { "rei", "rainha" };[/SIZE]
     
  5. dessa forma realmente eu consigo inserir palavras no array mas eu queria que fosse colocado atraves do utilizador e dessa forma eu não consigo porque no final quando eu faço o output do array para ver todos os nomes que lá inseri, aparece em todas as posições o ultimo nome que inseri... e o array "está bem feito" pk caso eu mude por exemplo para inteiros para colocar numeros, ja aparece tudo bem conforme eu inseri...
     
  6. AliFromCairo

    AliFromCairo Power Member

    Hmm, mostra o código sff.

    De qualquer forma, se pretendes ter um array dinâmico, podes usar algo deste género:

    Código:
    [SIZE=2]vector<string> palavras;[/SIZE]
    string palavra;
     
    while ( cin >> palavra ) {
        palavras.push_back(palavra);
    }
    
    Em seguida, podes usar um iterador para percorrer o vector.
     
    Última edição: 17 de Agosto de 2007
  7. johnny_b_good

    johnny_b_good Power Member

    boas, alguém podia postar aqui um algoritmo para encontrar strings repetidas num vector de strings e removê-las? (em C ou C++) já tive a tentar e não consegui nada :S obrigado ^^
     
  8. AliFromCairo

    AliFromCairo Power Member

    Boas, tens várias maneiras de fazer isso.

    Podes ordenar (lexicograficamente) o vector, de modo a colocares os duplicados juntos, e, em seguida, basta uma simples passagem pelo vector para remover os duplicados, ou seja, pegas no primeiro elemento, e vais iterando (e removendo) até encontrares um elemento diferente do primeiro. Quando encontrares, repetes o processo para o novo elemento, até chegares ao fim do vector.

    Alternativamente, podes também percorrer o vector, e ir guardando os elementos num dicionário. Neste caso, sempre que tentares guardar um elemento que já existe no dicionário, esse elemento é necessariamente um duplicado, logo terá de ser removido.

    Podes também usar a função unique, mas penso que a ideia é seres tu a implementar. Qualquer dúvida diz.
     
    Última edição: 17 de Agosto de 2007
  9. Código:
    [SIZE=2]map<string, int> palavras;[/SIZE]
    string pal;
     
    while ( cin >> pal ) {
        ++palavras[pal];
    }
    Desta forma cada palavra irá estar associada ao número de ocorrências.
     
  10. AliFromCairo

    AliFromCairo Power Member

    Bom, se a ideia é processar as palavras a partir do input, podes usar um set, e garantes que não vais ter palavras repetidas ... Mas fiquei com a ideia de que o objectivo era implementar uma função semelhante à unique.
     
  11. johnny_b_good

    johnny_b_good Power Member

    ora bem já ordenei o vector usando o selection sort agora eu tentei assim para comparar os restantes elementos do vector com o primeiro e removê-los:

    Código:
    vector<string>::iterator primeiro = vector.begin();
    vector<string>::iterator it2;
    for(it2 = vector.begin()+1; it2 != vector.end();it2++ )
    {
            if((*it2) == (*primeiro))
            {                  vector.erase( it2 );}
    }
    mas depois eu imprimo e o vector aparece igual como se n tivesse feito nada disto :S além de que isto só serve para comparar o primeiro elemento com o último e não todos entre si por isso uma ajudinha era bem vinda :)
     
  12. AliFromCairo

    AliFromCairo Power Member

    Boas, o teu código tem alguns problemas.

    A ideia de pegares no primeiro elemento é para teres uma referência para comparar com os restantes, mas assim que encontrares um elemento que seja diferente do primeiro tens que actualizar essa tua variável para o novo elemento.

    Outro problema que vejo, é estares sempre a incrementar o it2, o que faz com que saltes uma posição no caso de fazeres erase (esta função faz implicitamente com que o teu iterador avance para a posição seguinte da que foi eliminada).

    Segue uma versão corrigida da tua (alterei o nome do teu vector de palavras para palavras, e a variável que contém o elemento a comparar para ultimo):

    Código:
    [LEFT][SIZE=2]sort( palavras.begin(), palavras.end() );[/SIZE]
    [SIZE=2]vector<string>::iterator iterador = palavras.begin();[/SIZE]
    [SIZE=2]vector<string>::iterator ultimo = iterador;[/SIZE]
    [SIZE=2]iterador++;[/SIZE]
    [B][SIZE=2][COLOR=#7f0055]while[/COLOR][/SIZE][/B][SIZE=2] ( iterador != palavras.end() ) {[/SIZE]
       [B][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/B][SIZE=2] ( *ultimo == *iterador ) {[/SIZE]
    [SIZE=2]       palavras.erase( iterador );[/SIZE]
    [SIZE=2]   } [/SIZE][B][SIZE=2][COLOR=#7f0055]else[/COLOR][/SIZE][/B][SIZE=2] {[/SIZE]
    [SIZE=2]       ultimo = iterador;[/SIZE]
    [SIZE=2]       iterador++;[/SIZE]
    [SIZE=2]   }[/SIZE]
    
    [SIZE=2]}[/SIZE][/LEFT]
    
    Sugeria que tentasses agora fazer o mesmo usando o outro algoritmo. Depois diz qualquer coisa.
     
  13. johnny_b_good

    johnny_b_good Power Member

    funciona! obrigado pela ajuda :)
     

Partilhar esta Página