Jump to content

Recommended Posts

Posted

Agora não tenho tempo para fazer a função mas tens que fazer um ciclo que compare letra a letra, o possível prefixo e a palavra. Qualquer coisa do género:

for(i=0;i<strlen(prefixo);i++{
  if (prefixo[i]!=palavra[i]){
     return -1; // nao e' prefixo
  }
}
return 1; // e' prefixo

Para veres se uma palavra está dentro de outra, tens que procurar por uma letra que seja igual à primeira letra da palavra mais pequena e depois fazeres o mesmo processo.

  • Vote 1
Posted (edited)

Agora não tenho tempo para fazer a função mas tens que fazer um ciclo que compare letra a letra, o possível prefixo e a palavra. Qualquer coisa do género:

for(i=0;i<strlen(prefixo);i++{
  if (prefixo[i]!=palavra[i]){
  return -1; // nao e' prefixo
  }
}
return 1; // e' prefixo

Para veres se uma palavra está dentro de outra, tens que procurar por uma letra que seja igual à primeira letra da palavra mais pequena e depois fazeres o mesmo processo.

Obrigado pela dica. 😉

Nem é nosso objectivo aqui fazer nada a ninguém. Nós orientamos as pessoas para elas mesmas chegarem à solução dos seus problemas.

Claro, ajuda muito dar uma ideia. Também não se quer que alguém faça tudo senão não se aprende. 😉 Edited by FilipedeOliveira
Posted

for(i=0;i<strlen(prefixo);i++{
  if (prefixo[i]!=palavra[i]){
     return -1; // nao e' prefixo
  }
}
return 1; // e' prefixo

notas sobre este código:

- este código é para o prefixo e não para procurar uma frase dentro de outra

- apresenta problemas para casos onde poderá ter acessos inválidos de memória (deixo como exercício saber onde está o problema)

- o valor de falso é o zero e não o -1

- não se deve ter a função strlen na verificação de paragem, o que se deve fazer é chamar essa função antes do ciclo, guardar o resultado numa variável local e fazer a comparação com essa variável. razão : em cada verificação estás a fazer um novo ciclo (dentro do strlen) a calcular o tamanho da frase (imagina o overhead ...)

---

como isto parece um problema simples de ciclos, não vou apresentar soluções mais eficientes de resolução do problema, porque são demasiado complexos ...

IRC : sim, é algo que ainda existe >> #p@p
Posted

notas sobre este código:

- este código é para o prefixo e não para procurar uma frase dentro de outra

- apresenta problemas para casos onde poderá ter acessos inválidos de memória (deixo como exercício saber onde está o problema)

- o valor de falso é o zero e não o -1

- não se deve ter a função strlen na verificação de paragem, o que se deve fazer é chamar essa função antes do ciclo, guardar o resultado numa variável local e fazer a comparação com essa variável. razão : em cada verificação estás a fazer um novo ciclo (dentro do strlen) a calcular o tamanho da frase (imagina o overhead ...)

---

como isto parece um problema simples de ciclos, não vou apresentar soluções mais eficientes de resolução do problema, porque são demasiado complexos ...

Acho que tinha ficado claro que o código que apresentei era só para prefixos.

Não percebi muito bem quando podem ocorrer erros de acesso à memória. Talvez quando o prefixo é maior que a palavra, mas assumi que isso não ocorria.

Vou ter em atenção as duas últimas dicas nas próximas vezes.

Posted

Acho que tinha ficado claro que o código que apresentei era só para prefixos.

Não percebi muito bem quando podem ocorrer erros de acesso à memória. Talvez quando o prefixo é maior que a palavra, mas assumi que isso não ocorria.

Vou ter em atenção as duas últimas dicas nas próximas vezes.

assumir é o primeiro passo para garantir que um sistema irá estoirar no futuro.

IRC : sim, é algo que ainda existe >> #p@p
Posted

Este pequeno snipet faz o inverso (que e um bocado mais dificil), agora tenta modifica-lo

para fazer o que queres.

bool str_ends_with(const char* restrict src, const char* restrict sfix) {
 size_t const src_len = strlen(src);
 size_t const sfix_len = strlen(sfix);

 if (src_len == sfix_len) return (bool) !strcmp(src, sfix);
 else if (src_len < sfix_len) return false;
 else if (src_len > sfix_len) return (bool) !strcmp(src + (src_len - sfix_len), sfix);
 return false;
}

PS : para compilar este codigo precisas de incluir os devidos header files e forcar o

standard para c99 ou superior.

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Posted

@eatg75 : deverias ter cuidado a usar a palavra reservada restrict, especialmente em sniplets ...

Se a implementação da função assume que há memory aliasing, faz todo o sentido que use o restric para tornar esse requisito explícito. Mas não vi nada na função que necessitasse desse requisito (até porque a função não mexe não memória).

Posted

Se a implementação da função assume que há memory aliasing, faz todo o sentido que use o restric para tornar esse requisito explícito.

queres tentar explicar isso a um iniciante de programação ?

é que estou sempre a obter respostas do pessoal que apresento soluções demasiado complexas, e agora que é demonstrado uma funcionalidade claramente avançada ...

IRC : sim, é algo que ainda existe >> #p@p
Posted

queres tentar explicar isso a um iniciante de programação ?

é que estou sempre a obter respostas do pessoal que apresento soluções demasiado complexas, e agora que é demonstrado uma funcionalidade claramente avançada ...

Não, não espero que um iniciante perceba o código apresentado. Mas também não assumi que o código fosse para um iniciante. Tendo em conta que este usa aritmética de apontadores, acho que o código será desajustado para iniciantes quer tenha lá o restrict ou não. Adicionalmente, diria que qualquer solução que não use ciclos é má para iniciantes.

Eu acho que algumas das tuas respostas são demasiado complexas para iniciantes. Mas não quero com isso dizer que não as deves colocar. Apenas deverás ter em conta que as mesmas podem não ser úteis para quem colocou. Ainda assim, acho que as respostas têm valor para o fórum (pois no futuro haverá outros utilizadores interessados nas mesmas).

(Neste caso em particular, ainda não percebi sequer se isto é parte de um exercício, ou se é apenas algo que é necessário para resolver um outro problema qualquer. Isto porque ele estava a pensar no strncmp. E o autor do tópico ainda não clarificou esta questão.)

  • 2 weeks later...
Posted (edited)

A do prefixo:

Fiz assim:

int comp (char s1[]{
int i;
while(s1[i]!='\0') i++;
return i;
}
int eprefixo (char s1[], char s2[]){
int i,k;
k = comp(s2);
if(comp(s1)<comp(s2)){
for(i=0;i<k;i++){
        if(s1[i]==s2[i]) return 0;
    }
}
retun (-1);
}

No entanto => Erro de segmentação, alguém me pode ajudar? 😕

Edited by thoga31
GeSHi
Posted (edited)

é impossível teres erro de segmentação quando existem erros de sintaxe que não permitem sequer o compilador terminar com sucesso ...

e mesmo que (por milagre) isso é compilado, qual o valor de i na função comp ?

yap tinha-me esquecido de inicializar o i=0;

int comp (char s1[]{
int i=0;
while(s1[i]!='\0') i++;
return i;
}
int eprefixo (char s1[], char s2[]){
int i,k;
k = comp(s2);
if(comp(s1)<comp(s2)){
for(i=0;i<k;i++){
                if(s1[i]==s2[i]) return 0;
                                   else return (-1);
        }
}
retun (-1);
}

Já funciona. Obrigado. 😉

Edited by thoga31
GeSHi
  • 1 month later...
Posted (edited)

Também não vejo necessidade de forçar o standard, para algo tão simples.

Os standards existem para serem utilizados, e melhorar a vida do utilizador da linguagem,

acreditas que no politecnico onde estudo ainda se ensina o C89 a maltas do primeiro ano?

Nao seria grande coisa se apenas uma nova revisao do standard apos o C89, mas, o

problema e que existem 2!

Oi HappyHippyHippo, de fato como o Rui disse nao havia necessidade de utilizar a palavra

reservada restrict no bocado de codigo que apresentei, pois como o Rui disse e bem

nao existe aliasing logo nao ha oportunidades para o compilador optimizar o codigo.

Porque dizes para ter cuidado em utilizar essa palavra reservada em snippets?

Sera porque podera confundir/trabalhar alguns utilizadores?

Addendum: corrigi um erro ortagrafico na palavra sinippet.

Edited by eatg75

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Posted (edited)

sniplets são bocados de código simples e pequenos normalmente usados para exemplificar um conceito ou resolução de um problema. Como este código deverá ser visualizado por uma grande quantidade de pessoas, o uso de uma funcionalidade que 99% das pessoas não reconhece sem a sua explicação é desaconselhado, porque realmente irá confundir as várias pessoas.

Nota que não disse para não usar, mas sim para ter cuidado, isto é, ser reservado o seu uso a casos que realmente é necessário e/ou com explicação do seu significado.

Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.