Jump to content
Dreigon Fenriz

[Resolvido] Ajuda na função pos?

Recommended Posts

Dreigon Fenriz

ola tenho um vetor de 100 elementos onde guardo palavras com a regra:

palavra-categoria

mas o problema esta na procura de uma palavra que já que não sei qual a categoria ,utilizo a função pos

mas ira da erro se uma palavra que procuro estiver dentro de outra

ex:

nome-outros

me-outros

assim se eu quiser procurar a palavra "me-",e quando achar a palavra "nome-" ira encontrar,mas não a que eu quero

não sei se puderam entender,mas o que eu quero é que retorne a palavra real e não a encontrada dentro dentro de outra

Share this post


Link to post
Share on other sites
thoga31
if pos(substr, str) = 1 then begin
  // encontraste, possivelmente
  if pos('-', str) - 1 = length(substr) then
     // encontraste mesmo!
  else
     // false alarm...
end else
  // não interessa

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Procurar por palavra:

if Copy(Vetor[1], 1, pos('-', Vetor[1])-1) = Palavra_A_Pesquisar
  then // Encontraste a palavra

Procurar por categoria:

if Copy(Vetor[1], pos('-', Vetor[1])+1, 999) = Categoria_A_Pesquisar
  then // Encontraste a Categoria

O que fazes aqui não é pesquisar uma palavra dentro de uma string, mas sim comparar a palavra que precisas com a parte da string que tem a palavra.

O Copy, no primeiro caso, retorna-te a palavra que está no vector, que vai do caracter 1 até ao caracter anterior ao '-'.

No segundo caso, retorna-te a categoria, do caracter seguinte ao '-' até "cascos de rolha", com o 999 (este valor não interessa qual é, desde que seja sempre maior do que o tamanho da maior categoria).

Se não quiseres que a pesquisa seja sensível a maiúsculas e minúsculas, deves usar a função UpperCase, de um lado e de outro do operador = na condição do IF:

if UpperCase(Copy(Vetor[1], 1, pos('-', Vetor[1])-1)) = UpperCase(Palavra_A_Pesquisar)
  then // Encontraste a palavra, mesmo que de um lado tenhas maiúsculas e do outro minúsculas


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Dreigon Fenriz

ambos os modos funcionaram tanto o do thoga31 e o do nunopicado ,se a a palavra menor estiver acima da palavra maior no vetor

assim funcionou:

vetor[1]:='me-outros'

vetor[2]:='nome-outros'

mas não o contrario

Share this post


Link to post
Share on other sites
nunopicado

Como assim?

Se tiveres por exemplo

vetor[1]:='nome-outros'

vetor[2]:='me-outros'

e procurares a palavra "me", não funciona com o meu método?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Dreigon Fenriz

i

Como assim?

Se tiveres por exemplo

vetor[1]:='nome-outros'

vetor[2]:='me-outros'

e procurares a palavra "me", não funciona com o meu método?

no pzim funcionou com uma busca simples assim:

Program Pzim ;
var vetor:array[1..3] of string;
pl:string;
j,p:integer;
Begin
p:=0;
vetor[1]:='nome-outros';
vetor[2]:='me-outros';
pl:='me';
for j:=1 to 2 do
if COPY(vetor[j],1,POS('-',vetor[J])-1)=pl then begin p:=j; break;end;
writeln(p);
End.

aqui é a parte onde estou a usar no meu codigo:

FOR J:=1 TO 100 DO 
   IF COPY(TVETOR[J],1,POS(':',TVETOR[J])-1)=PL 
      THEN BEGIN 
                V:=J;
                BREAK;
           END;

Edited by nunopicado
Adicionadas tags GeShi, indentação

Share this post


Link to post
Share on other sites
nunopicado

':'?

Não era '-'?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Que valor te fica no V?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Eu sei... Com que valor fica ele quando terminas o ciclo (quando o "me" está depois de "nome")?

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Não me respondeste a história do : vs -

Afinal, qual deles usas?

Esse código tem de funcionar independentemente da posição, porque estás a comparar strings, e não a verificar posições!

Ele copia a palavra que está no vetor, qualquer que ela seja, e compara-a com a que estás a pesquisar. É indiferente a ordem!

Verifica a história das maiúsculas/minúsculas, e a história do separador!

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Dreigon Fenriz

eu uso o v pois só quero a posição da palavra correta ,v é iniciado com 0 e depois que uso aquele código quando "me" esta depois de "nome" no vetor ,ele ainda fica com 0

Share this post


Link to post
Share on other sites
pwseo

Dreigon Fenriz,

Tens prestado atenção ao que te têm dito e perguntado nesta thread? O nunopicado já focou dois pontos importantes:

  • é muito importante decidires qual é o separador que utilizas -- ou usas : (dois pontos) ou então - (hífen)
  • é importante teres em conta que não podem existir diferenças de maiúsculas/minúsculas

Se estivesses mais atento, terias reparado que num post acima onde colocaste dois fragmentos de código utilizaste separadores diferentes em cada fragmento. No primeiro, onde dizes que "uma busca simples" funcionou no PascalZIM utilizaste o hífen. No segundo, logo abaixo, mostras código que supostamente estás a utilizar, mas desta vez com o separador : (dois pontos).

Ora, se de facto no teu código tu usas separadores diferentes nas strings pesquisadas e no código que as examina, o único resultado possível é não funcionar.

Como podes ver neste link (http://ideone.com/WcL2eS), o código funciona, desde que tenhas o cuidado de utilizar o separador correcto! Neste exemplo coloquei duas arrays para mostrar que a ordem não importa, a posição é sempre calculada correctamente.

No caso que denominei de 'incorrecto', utilizo os dois pontos como separador (como tu fizeste no teu segundo exemplo) e o resultado é sempre -1 porque o programa nunca encontra ":" nas strings analisadas, daí o teu V ficar sempre a zero (eu apenas optei por utilizar um valor que dê mais nas vistas), porque a linha V := J nunca chega a ser executada.

  • Vote 1

Share this post


Link to post
Share on other sites
Dreigon Fenriz

assim,agora me dei conta ,eu estava a testar com um separador diferente,pois com o hífen não estava a funcionar,mas de todo já resolvi o problema ,coloquei J como variável local no procedimento,e funcionou,mas não compreendi porque estava a da erro,pois j não foi utilizado em nenhuma outra parte do código

Share this post


Link to post
Share on other sites
nunopicado

assim,agora me dei conta ,eu estava a testar com um separador diferente,pois com o hífen não estava a funcionar,mas de todo já resolvi o problema ,coloquei J como variável local no procedimento,e funcionou,mas não compreendi porque estava a da erro,pois j não foi utilizado em nenhuma outra parte do código

As variáveis em geral devem ser sempre que possível locais.

Variáveis de controle de um ciclo devem ser ABSOLUTAMENTE SEMPRE locais!

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

As variáveis em geral devem ser sempre que possível locais.

Variáveis de controle de um ciclo devem ser ABSOLUTAMENTE SEMPRE locais!

Um dia vou entender porque é que os professores insistem em achar que isto é muito confuso para as mentes jovens. Antes de eu aprender o conceito de scope, passava a vida a fazer borrada com programas mais "longos" (aka 5000 linhas de código) porque usava e abusava das globais, e depois os ciclos ficavam malucos... obviamente :P


Knowledge is free!

Share this post


Link to post
Share on other sites

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.