Search  
Saturday, October 24, 2020 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Tema pentru acasa  Problema recure...
 Problema recurenta
 
 1/31/2012 2:41:18 PM
User is offlineSaiSaijo
21 posts


Problema recurenta
 (N/A)
Salutari,

  Am de rezolvat o problema de verificare a unei posibile anagramatizari intre doua siruri (sa aiba elemente comune dar in alta ordine). Doresc ca atunci cand gasesc un element comun intre cele doua siruri, sa sterg acel element din sirul al doilea.

Codul meu este:
a="aabbaabb"
b="ababweyt"

IF LEN(a)=LEN(b)

FOR i=1 to LEN(a)
X=substr(a,i,1)
FOR j=1 to LEN(b)
IF SUBSTR(b,j,1)=x
    a=SUBSTR(a,i+1)
    b=SUBSTR(b,1,j-1)+SUBSTR(b,j+1)

?a
?b

Endif
Endfor
ENDFOR
ENDIF

si raspunsul pe care-l primesc este:


abbaabb
babweyt

bbaabb
bbweyt

aabb
bweyt

b
weyt

eyt

et

et

et

t

t

Stergerea elementelor ar trebui sa se termine dupa primele 4 cicluri ale lui 'j', deoarece 'i'  nu mai are elemente comune cu el, dar totusi continuua sa stearga din ambele siruri. De ce ? Ce imi lipseste in cod ?


Multumesc,
Sai.
 1/31/2012 3:05:40 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: Problema recurenta
 (N/A)
Vrei sa stergi toate aparitiile unui element din sirul a in sirul b?

a="aabbaabb"
b="ababweyt"

For lni=1 to len(a)
   b=chrtran(b,subs(a,lni,1),'')
Next
? a
? b

Sau numai elementele identice aflate pe aceeasi pozitie in ambele siruri?
a="aabbaabb"
b="ababweyt"
bb=b
For lni=len(a) to 1 step -1
   if subs(bb,lni,1)=subs(a,lni,1)
     b=left(b,lni-1)+subs(b,lni+1)
   endif
Next
? a
? b


In codul tau redefinesti sirul a in permanenta: a=subs(a,i+1)
Iar sirul b il parcurgi pe toata lungimea initiala, desi il scurtezi la fiecare aparitie a unui element comun.

Incearca sa definesti mai concret problema.

Daniel Buduru
 1/31/2012 3:34:48 PM
User is offlineSaiSaijo
21 posts


Re: Problema recurenta
 (N/A)
ok, am sa incerc sa fiu mai concret. Vreau sa sterg in sirul B elementul comun in sirul A dar per "event" cum s-ar spune, deci ca sa sterg 3 elemente in sirul B trebuie sa am comun 3 elemente in sirul A. (Ex: daca am "AAA" in sirul 1 si "AAAAA" in sirul B, doar 3 elemente vor fi sterse din sirul B, pentru fiecare element comun "A").

Pentru ca sirul B ar trebui sa fie o anagrama a sirului A, elementele nu au cum sa si aiba aceeasi pozitie in ambele siruri. Ci doar sa aiba acelasi numar, amestecate cate oricum.

Trebuie sa rezolv problema prin recurenta, d-aia tot scurtez mereu cu elementul comun pentru ca data viitoare cand "j" trece prin sirul B sa nu mai gaseasca elementul care tocmai stabilisem ca exista comun in cele doua siruri si treaca la urmatorul.

Din start se poate vedea ca sirurile nu sunt anagrame, doar ca trebuie sa si demonstrez acest lucru. Dupa ce-mi rulez codul, sirurile ar trebui sa ajunga la forma:
a="aabb"
b="weyt"

Pentru ca s-au sters cele 4 elemente comune "aabb" din sirul A si "abab"  din sirul B. Doar ca ele ajung la o alta forma, cea pe care am aratat-o in primul post. Nu-mi dau seama de ce, dar sirurile continuua sa piarda caractere, desi in momentul acesta (a="aabb" b="weyt") nu mai au elemente comune, deci codul de IF de mai jos nu ar trebui sa mai ruleze, cel putin nu la partea de TRUE, pentru ca SUBSTR(b,j,1) nu are cum sa mai fie egal cu X (pentru ca nu mai au elemente comune)
 IF SUBSTR(b,j,1)=x
a=SUBSTR(a,i+1)
b=SUBSTR(b,1,j-1)+SUBSTR(b,j+1)



P.S. ca regula, nu am voie decat sa folosesc LEN() si SUBSTR() pentru a rezolva aceasta problema si in principal incerc sa inteleg ce gresesc eu in codul meu...

Sper ca am fost cat mai explicit.
Multumesc,
Sai.

 1/31/2012 4:00:31 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: Problema recurenta
 (N/A)
Trebuie sa iesi din al doilea for dupa ce gasesti o potrivire.
Parcurgi sirul a de la coada la cap ca sa eviti problemele legate de deplasarea cu o pozitie la stanga dupa gasirea unei potriviri si eliminarea caracterului.

a="aabbaabb"
b="ababweyt"
?
?a
?b
For lni=len(a) to 1 step -1
    x=SUBSTR(a,lni,1)
   FOR lnj=LEN(b) TO 1 STEP -1
       if subs(b,lnj,1)=x
         b=subs(b,1,lnj-1)+subs(b,lnj+1)
         a=SUBSTR(a,1,lni-1)+SUBSTR(a, lni+1)
         exit
       ENDIF
   NEXT lnj
NEXT lni

?
?a
?b

Daniel Buduru
 1/31/2012 4:46:37 PM
User is offlineSaiSaijo
21 posts


Re: Problema recurenta
 (N/A)
Multumesc pentru raspuns ! Interesanta abordare. Poti sa-mi explici si ce face STEP -1 ?

De asemenea, exista vreo speranta pentru abordarea mea ? Adica mai pot face ceva cu codul meu cat sa iasa din al doilea FOR si sa-l pot folosii ?


Multumesc,
Sai.
 1/31/2012 5:01:04 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: Problema recurenta
 (N/A) Modified By Daniel Buduru  on 1/31/2012 6:06:38 PM)
Daca nu ai un help vfp9 instalat descarca unul de la codeplex si instaleaza-l. Nu poti invata vfp fara documentatia lui.
http://vfpx.codeplex.com/wikipage?title=VFP%209%20SP2%20Help%20File&referringTitle=Home

Step -1 in comanda For inseamna decrementarea contorului. Implicit contorul este incrementat cu +1, daca nu se specifica altfel prin clauza STEP.

Codul pe care l-am postat este abordarea ta corectata.
Daca tii la parcurgerea sirului a de la stanga la dreapta (i de la 1 la len(a)), trebuie sa compensezi deplasarea subsirului la stanga dupa ce elimini o pozitie din sir.
Pe de alta parte, sirul a se scurteaza mereu, si trebuie sa stabilesti o alta iesire din ciclu decat i=len(a). Intr-un ciclu For, conditia este evaluata numai la inceputul ciclului, nu la fiecare bucla.
Fie compari de fiecare data i cu lungimea curenta a sirului si iesi din bucla daca este egala, fie utilizezi o bucla DO WHILE, in care comparatia se face la fiecare rulare.

Cu IF Len(a)=Len(b) nu stiu ce vrei sa faci, asa ca il las deoparte.

FOR i=1 to LEN(a)
   X=substr(a,i,1)
     FOR j=1 to LEN(b)
        IF SUBSTR(b,j,1)=x
            a=SUBS(a,1,i-1)+ SUBSTR(a,i+1)
            i=i-1 && decrementezi contorul, altfel sare peste un caracter
            b=SUBSTR(b,1,j-1)+SUBSTR(b,j+1)
            ?a
            ?b
            Exit
       Endif
    Next j
    if i=len(a)
       exit
    endfi
Next i



Daniel Buduru
 1/31/2012 5:57:07 PM
User is offlineSaiSaijo
21 posts


Re: Problema recurenta
 (N/A)
Multumesc f mult pt raspuns, promptitudine si rabdare !
cu IF len(a)=len(b) faceam verificarea ca cele doua siruri au pentru inceput acelasi nr de caractere, in caz ca nu, acest exercitiu nu mai fi avut  rost.

Multumesc pt explicatii, iti urez o seara placuta in continuare.
Sai.
  Visual FoxPro  Tema pentru acasa  Problema recure...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement