FilipedeOliveira Posted March 9, 2014 at 10:05 AM Report #547964 Posted March 9, 2014 at 10:05 AM Boas, preciso de fazer uma função que verifica se uma palavra está dentro de outra ou se uma palavra é prefixo de outra. Alguém me pode ajudar como fazer? Alguma ideia? Estava a pensar em usar o strncmp.
rjfs Posted March 9, 2014 at 01:10 PM Report #547972 Posted March 9, 2014 at 01:10 PM 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. 1 Report
thoga31 Posted March 9, 2014 at 03:20 PM Report #547977 Posted March 9, 2014 at 03:20 PM Agora não tenho tempo para fazer a função Nem é nosso objectivo aqui fazer nada a ninguém. Nós orientamos as pessoas para elas mesmas chegarem à solução dos seus problemas. 1 Report Knowledge is free!
FilipedeOliveira Posted March 9, 2014 at 04:11 PM Author Report #547979 Posted March 9, 2014 at 04:11 PM (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 March 9, 2014 at 04:11 PM by FilipedeOliveira
Rui Carlos Posted March 9, 2014 at 04:48 PM Report #547982 Posted March 9, 2014 at 04:48 PM Estava a pensar em usar o strncmp. Não é a forma mais eficiente de resolver o problema, mas também podes fazer dessa forma. Mas tudo depende do objectivo. Se estiveres a aprender a usar ciclos, não deverás usar a função. Rui Carlos Gonçalves
HappyHippyHippo Posted March 9, 2014 at 08:49 PM Report #547996 Posted March 9, 2014 at 08:49 PM 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 Portugol Plus
rjfs Posted March 9, 2014 at 10:41 PM Report #548002 Posted March 9, 2014 at 10:41 PM 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.
HappyHippyHippo Posted March 10, 2014 at 01:36 AM Report #548016 Posted March 10, 2014 at 01:36 AM 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 Portugol Plus
eatg75 Posted March 10, 2014 at 02:20 AM Report #548017 Posted March 10, 2014 at 02:20 AM 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.
HappyHippyHippo Posted March 10, 2014 at 02:54 AM Report #548018 Posted March 10, 2014 at 02:54 AM @eatg75 : deverias ter cuidado a usar a palavra reservada restrict, especialmente em sniplets ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Flinger Posted March 10, 2014 at 09:59 AM Report #548022 Posted March 10, 2014 at 09:59 AM Também não vejo necessidade de forçar o standard, para algo tão simples.
Rui Carlos Posted March 10, 2014 at 11:00 AM Report #548035 Posted March 10, 2014 at 11:00 AM @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). Rui Carlos Gonçalves
HappyHippyHippo Posted March 10, 2014 at 11:11 AM Report #548038 Posted March 10, 2014 at 11:11 AM 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 Portugol Plus
Rui Carlos Posted March 10, 2014 at 11:26 AM Report #548044 Posted March 10, 2014 at 11:26 AM 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.) Rui Carlos Gonçalves
FilipedeOliveira Posted March 23, 2014 at 02:43 PM Author Report #549677 Posted March 23, 2014 at 02:43 PM (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 March 23, 2014 at 07:29 PM by thoga31 GeSHi
HappyHippyHippo Posted March 23, 2014 at 03:19 PM Report #549680 Posted March 23, 2014 at 03:19 PM é 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 ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
FilipedeOliveira Posted March 23, 2014 at 03:28 PM Author Report #549684 Posted March 23, 2014 at 03:28 PM (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 March 23, 2014 at 07:29 PM by thoga31 GeSHi
HappyHippyHippo Posted March 23, 2014 at 03:38 PM Report #549686 Posted March 23, 2014 at 03:38 PM vais fazer este exercício : a frente de cada linha vais colocar um comentário a dizer o que essa linha está a fazer 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
eatg75 Posted May 22, 2014 at 04:08 AM Report #556573 Posted May 22, 2014 at 04:08 AM (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 May 22, 2014 at 10:52 PM 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.
HappyHippyHippo Posted May 22, 2014 at 08:32 AM Report #556578 Posted May 22, 2014 at 08:32 AM (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 May 22, 2014 at 08:35 AM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now