Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

i307

Comparar strings (ver se palavra contida)

Mensagens Recomendadas

i307

Boas

estou aqui com um problema.

Preciso de receber 2 strings , e verificar o número de vezes que 2ª strings está contida na 1ª.

Tenho praticamente tudo , mas não está correcto. Mas não me dá qualquer error ou warning.

NOTA: não se podem usar bibiliotecas de strigs.

Código de comparação:

int count(char frase[],char palavra[])
{
        int  i,z,c,d;
        for (i=0;i<50;i++){
            c=0;
            d=0;
        for (z=0;z<10;z++){
            if (palavra[z] == frase[z+i])
            c++;
            if (c == n_car(palavra))
            d++;
            }
return d;
}
}

Função auxiliar para contagem de numero de caracteres (esta está a funcionar):

int n_car(char s[])
{
    int i=-1;

    do{
        i++;
    }
    while(s[i]!='\0');

    i=i-1;



return i;

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Primeiro crias uma função que retorna o tamanho da string que queres procurar. Depois percorres a string principal de len em len em que len foi o tamanho retornado e verificas se nesse segmento todas os caracteres são iguais.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos
int i=0;
int j=0;
counter=0;

while(string1[i] != '\0')
{
    if(string1[i] == string2[j])
    {
        j++;

        if(string2[j] == '\0')
        {
            counter++;
            j=0;
        }
    }
    else
    {
        j=0;

        if(string1[i] == string2[j])
        {
            j++;

            if(string2[j] == '\0')
            {
                counter++;
                j=0;
            }
        }
    }

    i++;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

É profundamente irritante estar sempre a bater na mesma tecla. Dar soluções completas NÃO É, DEFINITIVAMENTE, a melhor maneira de ajudar. Principalmente quando NEM UM ÚNICO COMENTÁRIO se dão ao trabalho de escrever.

É assim tão difícil de compreender esta ideia e ajudar de forma decente?


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos

É profundamente irritante estar sempre a bater na mesma tecla. Dar soluções completas NÃO É, DEFINITIVAMENTE, a melhor maneira de ajudar. Principalmente quando NEM UM ÚNICO COMENTÁRIO se dão ao trabalho de escrever.

É assim tão difícil de compreender esta ideia e ajudar de forma decente?

Respondo da forma que sempre respondi... eu aprendo a analisar código e exemplos, como tal forneço código e exemplos para que outros aprendam da mesma forma que o fiz.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

O que escreveste é código debitado sem a mínima explicação. É muito raro isso ajudar quem tem dificuldades. É que, repito, nem uma linha te deste ao trabalho de escrever a explicar o que estás a fazer no código. Isso não é ajudar, é mostrar que se sabe resolver.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos

O que escreveste é código debitado sem a mínima explicação. É muito raro isso ajudar quem tem dificuldades. É que, repito, nem uma linha te deste ao trabalho de escrever a explicar o que estás a fazer no código. Isso não é ajudar, é mostrar que se sabe resolver.

Mal estava se nesta altura não fosse capaz de resolver este tipo de problemas.

O código é tão pequeno e tal elementar que não julgo requerer explicação. Basta seguir a lógica.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos

Pergunta ao autor deste tópico se aprendeu alguma coisa e se viu o seu problema resolvido e depois verificas se realmente se confirma o que dizes.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

Eu não queria um código novo (é suposto fazer por mim). Eu queria a correcção do meu.

E até era bastante simples , já descobri. Era trocar aqueles '50' e '10' (os limites das strings) pelo exacto numero de caracteres (usando a função auxiliar).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mribeiro

A ideia que tenho para fazer isso pode ser algo complexa, mas no fundo fica um coisa em condições :P

Ora bem, não vou fazer código (lamento, mas a dúvida aqui é mais lógica que o código em si) e espero que não leves a mal.

O que eu faria era:

1º obter tamanho da palavra (vamos tratar aqui por X)

2º obter tamanho da frase (vamos tratar aqui por Y)

(aqui começa a parte "complicada")

3º começando no primeiro caracter da frase, comparas com os X próximos caracteres

4º se a palavra existe aumentas 1 ao contador. Se a palavra não existe não aumentas. Em ambos os casos avanças uma posição no array frase

e assim sucessivamente...

Vou tentar explicar melhor

frase = olaadeola -> [o][l][a][a][d][e][o][l][a] = Y = 9

palavra = ola -> [o][l][a] = X= 3

(vou colocar a posição dos apontadores com a letra a negrito)

Primeira iteração:

array frase = [o][l][a][a][d][e][o][l][a]

array palavra = [o][l][a]

(existem várias maneiras de fazer isto mas vou pela mais simples)

O nosso ponteiro no array frase está na primeira posição e X = 3, por isso vamos pegar + 2 caracteres (a contar com o actual fazendo um total de 3) [para simplificar ficam num array a parte]

array temporário = [o][l][a] (são os X caracteres da frase, o actual + (X-1)

array palavra = [o][l][a]

Com um for simples consegues comparar se são iguais. Como neste caso são iguais o contador passa a 1 e avançamos 1 posição no array frase.

Então actualmente temos:

array frase = [o][l][a][a][d][e][o][l][a]

array palavra = [o][l][a]

fazendo novamente o anterior, pegamos no caracter actual + (X-1) caracteres e comparamos. Temos assim:

Array temporário = [l][a][a]

Array palavra = [o][l][a]

mais uma vez, com um for simples verificas a igualdade. Não são iguais, o contador continua igual (ou seja, igual a 1) e avança uma posição no array frase. Ficando assim:

array frase = [o][l][a][a][d][e][o][l][a]

array palavra = [o][l][a]

E voltamos ao mesmo... Penso que não é preciso exemplificar mais.

Posto isto, a codificação é relativamente simples mas deixo-te duas questões para "resolveres":

  • Se o tamanho da palavra for maior do que os restantes caracteres na frase.
  • Que optimização pode ser feita aquando a comparação das palavras? (quando comparas "ola" com "laa" sabes que "o" != "l" , por isso não precisas de fazer a comparação de todos os caracteres)

Entendo que esta explicação possa parecer confusa, mas vais ver que não é assim tão difícil.

E mais uma vez, desculpa não fornecer código (nem tenho isto feito, foi uma ideia que me surgiu assim de repente) mas no secundário (presumo que seja no grau que estás, se não é peço desculpa e não quis ofender  :) ) o desafio era resolver a lógica sozinho ou com um empurrão (que te acabei de dar)

Só mais um ponto, não te esqueças que programação é um mundo e que para qualquer caso existem várias maneiras de "matar um gato". Esfolar o gato vivo é mais rápido e resolve o problema mas não previne que te possas arranhar.

Penso que percebes o que quero dizer  :thumbsup:

Abraço e bom trabalho ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mribeiro

Essa forma de resolver o problema é muito ineficiente.

em que aspectos?

O que se pretende neste caso nem é uma forma eficiente porque se fosse tinhamos a biblioteca de strings, pretende-se é raciocinio (pelo que eu percebi...)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos

Se tt for o número de letras do texto e ta o número de letras da palavra vocês vão fazer aproximadamente tt*ta comparações entre números (descartando optimizações). É possível reduzir esse problema de forma a apenas percorrer o texto uma única vez.

Se ainda estivesse a arranjar uma solução pouco eficiente em termos de execução mas de mais simples implementação ainda compreendia. Agora estar a desenvolver uma solução que nem é simples, nem é eficiente não me parece a melhor abordagem. De qualquer forma, essa solução faz o que é pedido e isso é o mais importante, apenas estou a destacar que há outras formas de o fazer de forma mais simples e eficiente.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mribeiro

Se tt for o número de letras do texto e ta o número de letras da palavra vocês vão fazer aproximadamente tt*ta comparações entre números (descartando optimizações). É possível reduzir esse problema de forma a apenas percorrer o texto uma única vez, como no código que coloquei anteriormente.

Haa... isso eu sei... torna-se mais pesado, mas daí falar em optimização.

Eu só dei uma ajuda teórica ao rapaz para ele pensar numa maneira, agora tem ele de arranjar outra maneira mais optimizada para resolver a questão.

Trabalho oferecido não é trabalho aprendido

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.