Search  
Friday, September 18, 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  permutari...
 permutari
 
 2/21/2014 4:14:49 PM
User is offlinelucipet
4 posts


permutari
 (N/A)
N-am reusit sa transpun un cod pentru generare de permutari din C++ in VFP. Poate are cineva o secventa de cod in VFP. Ma poate ajuta cineva ?
 2/21/2014 8:05:50 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: permutari
 (N/A)
Ati incercat si aveti erori?
Publicati programul dumneavoastra sau partea cu erori ca sa puteti fi ajutat.

Este o problema clasica de backtraking.
Exista multe variatiuni. Iata o varianta algoritm:
va genera :
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

procedure permutari
  parametru n && ce permutari se genereaza
  poz=1 && pozitia in stiva (a cata cifra din permutarea curenta se genereaza)
  val[poz]=1 && valoarea cifrei din pozitia respectiva (pentru permutarea curenta)
  continui=.T.
  cat timp continui
    daca val[poz]<=n?
    da:
      daca fara duplicate (cifra curenta nu se regaseste printre precedentele, se poate cu un ciclu while/for, poate fi o procedura)?
      da:
        daca poz=n? && (gasit solutie)
        da:
          retin (tiparire sau memorare intr-un tabel/matrice cu solutiile generate, poate fi o procedura)
          poz=poz-1
          continui=poz>0
          daca continui
            val[poz]=val[poz]+1
          sf.daca
        nu:
          poz=poz+1
          val[poz]=1
        sf.daca gasit solutie
      nu:
        val[poz]=val[poz]+1
      sf.daca duplicat
    nu:
      poz=poz-1
      continui=poz>0
      daca continui
        val[poz]=val[poz]+1
      sf.daca
    sf.daca val[poz]<=n
  sf.cat timp continui
end procedure
 2/24/2014 10:45:49 AM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: permutari
 (Romania)
Ati reusit? Algoritmul propus se poate traduce aproape cuvant cu cuvant in Foxpro. L-am testat si functioneaza.
procedure permutari
  lparameter n && ce permutari se genereaza
  poz=1 && pozitia in stiva (a cata cifra din permutarea curenta se genereaza)
  val[poz]=1 && valoarea cifrei din pozitia respectiva (pentru permutarea curenta)
  continui=.T.
  do while continui
    if val[poz]<=n
etc.

Trebuie sa adaugati doar cateva instructiuni
 2/25/2014 6:52:08 PM
User is offlinelucipet
4 posts


Re: permutari
 (N/A)
Nu genereaza corect permutarile. Secventa este urmatoarea:

procedure permutari
lparameter n && ce permutari se genereaza
declare valo[3]
set alte to vfp.txt
set alte on

n=3
poz=1
valo[poz]=1
continua=.T.
clea
do while continua
if valo[poz] <= n
for i = 1 to n
if valo[poz] <> valo[i]
continua=.F.
valo[poz]=valo[poz]+1
else
if poz=n
for k= 1 to n
??valo[k], ' ,'
endfor
?
poz = poz-1
if poz>0
store .T. to continua
else
continua= .F.
endif
if continua
valo[poz]=valo[poz]+1
endif
else
poz=poz+1
valo[poz]=1
endif
&& valo[poz]=valo[poz]+1
endif
endfor
else
poz=poz-1
if poz>0
store .T. to continua
else
store .F. to continua
endif
if continua
valo[poz]=valo[poz]+1
endif
endif
endDo

Rezultatul este :
1 , 1 , 1
1 , 3 , 1
2 , 1 , 1
2 , 2 , 2
2 , 4 , 1
3 , 1 , 1
3 , 3 , 1
 2/26/2014 9:46:49 AM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: permutari
 (Romania)
Programul este bun, cu putine exceptii.
Fac doar cateva mici corectii ca sa functioneze.

permutari(3) && Apelati procedura cu valoarea lui N
WAIT "Apasati o tasta pentru a continua"
permutari(4) && Aceeasi procedura trebuie sa functioneze pentru orice valoare a lui N



Procedure permutari
Lparameter N && ce permutari se genereaza


Declare valo[N] && pentru ca procedura sa fie generala trebuie ca dimensiunea sa fie depinda de valoarea parametrului


Set Alte To vfp.txt
Set Alte On

*n=3 eliminat si transmis valoarea ca parametru
poz=1
valo[poz]=1
continua=.T.
Clea
Do While continua
    If valo[poz] <= N


   
        duplicat=.F. && cautarea duplicatului: se verifica o ipoteza (ca nu sunt duplicate). Daca exista cel putin un contraexemplu, ipoteza este contrazisa
        For i = 1 To poz-1 && se compara toate elementele precedente cu elementul curent
            If valo[poz] = valo[i] && daca cel putin unul coincide cu elementul curent, atunci exista un duplicat
                duplicat=.T.
            ENDIF
        ENDFOR && ciclul for se aplica doar verificarii ipotezei ca nu exista duplicat


       
        IF !duplicat
            If poz=N
                For k= 1 To N
                    ??valo[k], ' ,'
                Endfor
                ?
                poz = poz-1
                If poz>0
                    Store .T. To continua
                Else
                    continua= .F.
                Endif
                If continua
                    valo[poz]=valo[poz]+1
                Endif
            Else
                poz=poz+1
                valo[poz]=1
            ENDIF && poz=N


        ELSE && La dumneavoastra era comentariu; fara aceasta ramura aloritmul esueaza intr-un ciclu infinit
            valo[poz]=valo[poz]+1
        ENDIF && !duplicat
       
       
    Else
        poz=poz-1
        If poz>0
            Store .T. To continua
        Else
            Store .F. To continua
        Endif
        If continua
            valo[poz]=valo[poz]+1
        Endif
    Endif && valo[poz] <= N
Enddo


Cateva observatii suplimentare pentru imbunatatire:
- desi nu e necesar, e recomandat sa declarati ca locale variabilele folosite in procedura: LOCAL continua,poz (si asa mai departe)
-         If poz>0
            Store .T. To continua
        Else
            Store .F. To continua
        Endif
se poate inlocui cu o singura instructiune
continua=poz>0
- (afisarea valorilor) se poate inlocui sau completa cu scrierea intr-un tabel
                 For k= 1 To N
                    ??valo[k], ' ,'
                Endfor
                ?

                APPEND from array valo

Pentru aceasta, mai intai trebuie sa va definiti un tabel la inceputul procedurii:
campuri=""
virgula=""
FOR i=1 TO N
    campuri=campuri+virgula+"cifra_"+LTRIM(STR(i))+" I"
    virgula=","
NEXT
CREATE TABLE perm (&campuri)

ceea ce pentru i=3 se traduce prin
CREATE TABLE perm (cifra_1 I,cifra_2 I,cifra_3 I)
iar pentru i=4
CREATE TABLE perm (cifra_1 I,cifra_2 I,cifra_3 I,cifra_4 I)

- pentru marirea lizibilitatii, e util sa indicati sfarsitul procedurii prin
ENDPROC

 2/26/2014 2:01:10 PM
User is offlinelucipet
4 posts


Re: permutari
 (N/A)
Acum ruleaza corect.L-am modificat cu toate amendamentele. Multumesc.
Cele bune !
Lucipet
 2/26/2014 6:13:51 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: permutari
 (N/A)
Mi-a facut placere sa fiu de folos.
Ati putea incerca sa modificati acest program ca sa genereze aranjamente de n luate cate m.

  Visual FoxPro  Tema pentru acasa  permutari...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement