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  cel mai scurt d...
 cel mai scurt drum dintre x->y FoxPro
 
 1/9/2014 6:07:55 PM
User is offlinetirexrex
5 posts


cel mai scurt drum dintre x->y FoxPro
 (N/A)
Buna am urmatoarea tema in FoxPro si nu ma descurt .. trebuie sa calculez cel mai scurt drum dintre doua puncte de pe harta de exemplu distanta Bucuresti-Brasov , Bucuresti-Arad, Bucuresti-Baia Mare, practic asta se face cu algoritmul lui dijkstra..
Ma puteti ajuta va rog .. nu imi iese nicicum :(

Microsoft VFP 6.0
 1/9/2014 7:28:01 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
Ce anume incerci sa faci si nu iti iese?

Daniel Buduru
 1/9/2014 7:48:07 PM
User is offlinetirexrex
5 posts


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
mai exact nu stiu cum sa fac algoritmul lui dijkstra din C++ sa-l fac pentru FoxPro

Matricea la mine arata ceva in genu
0 1 1 1 1 1 1
1 0 1 1 1 1 1
1 1 0 1 1 1 1
1 1 1 0 1 1 1
1 1 1 1 0 1 1
1 1 1 1 1 0 1
1 1 1 1 1 1 0

dar nu stiu cum sa o import in program cum deschid fisierul text

ar mai trebui sa fac matricea ponderilor .. dar nu stiu cum sa fac algoritmul .. ca ala e cel mai important

Microsoft VFP 6.0
 1/9/2014 8:10:34 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
Algoritmul lui Dijkstra il stii? Stii ceva despre el? Ai un cod in c++, pe care il stii, sau asta este ce tot ce ai gasit?

Poti importa un fisier text intr-o tabela vfp cu structura coresounzatoare cu comanda Append from file_name type sdf.
O alta modalitate este copierea fisierului intr-un string cu filetostr() si extragerea fiecarui element cu functiile alines() si getwordnum(), apoi plasarea elementului intr-o matrice vfp.




Daniel Buduru
 1/9/2014 8:21:03 PM
User is offlinetirexrex
5 posts


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
max=10000
Dimension viz[max],d[max],tata[max]
for i=1 to n
d[i]=c[x][i]
tata[i]=x
viz[i]=0
endfor
tata[x]=0
viz[x]=0
ok=1
do while ok
min=infinit
for i=1 to n
if !viz[i] .and. min>d[i]
min=d[i]
k=i;
endif
if min !=infinit
viz[k]=1
for i=i to n
if !viz[i] .and. d[i]>d[k]+c[k][i]
d[i]=d[k]+c[k][i]
tata[i]=k
endif
endfor
else ok=0
endif
enddo


eu asa am incercat dar am o gramada de erori ..
ma puteti ajuta va rog cu el .. nu stiu sa-l reformulez din c++ in foxpro

Microsoft VFP 6.0
 1/9/2014 8:43:58 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)

Problema expusa de tine este gasirea distantei celei mai mici, pe harta, intre doua localitati.
Asta presupune sa ai cateva variante de drum, fiecare pornind din punctul x si ajungand in punctul y, trecand printr-un numar de puncte intermediare. Acesta este graful.
Fiecare punct din graf este definit de cel putin doua coordonate, latitudine si longitudine, daca nu luam in calcul si altitudinea.
Datele tale primare trebuie sa fie aceste puncte, fiecare cu doua coordonate, sa fie reperat punctele de inceput si de sfarsit, si punctele corespunzatoare fiecarei cai - daca nu presupui ca poti ajunge de la x la y trecand pin orice insiruire de puncte inermediare.
Matricea pe care ai postat-o nu seamana nicium cu cu un graf, iar algoritmul postat - pe care inteleg ca l-ai luat d eundeva si ai incercat sa il treci in vfp - nu poate rula nicium, intrucat faci opeartii cu variabile (vectori) pe care nu i-ai definit si incarcat in nici un fel.

Revin la intrebarea initiala: stii ceva despre algoritmul lui Dijkstra? Ai citit ceva despre el?
Vezi articolul acesta:
 http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm


Daniel Buduru
 1/9/2014 9:58:21 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
Domnul Daniel Buduru are dreptate. Copiind programele facute de altii e putin probabil sa invatati sa programati.
Presupun ca fiind vorba de o tema scoala, datele sunt simple. Fiecare arc (legatura intre orase) este un triplet de trei numere: origine, destinatie, cost. Asadar fisierul de intrare ar putea fi organizat in acest fel.
De exemplu:
1,2,3
2,3,4
ar insemna ca exista 3 noduri (orase).
Prima linie are semnificatia: drumul de la nodul 1 la nodul 2 are costul 3
A doua linie are semnificatia: drumul de la nodul 2 la nodul 3 are costul 4
Intre nodul 1 si nodul 3 nu exista intrare, adica orasele 1 si 3 nu sunt conectate direct intre ele

Generarea unui fisier text se pote face in mai multe feluri.
- Folosind functia strtofile
- Folosind functiile low-level FOpen, etc.
- Creand un tabel / cursor si exportandu-l intr-un fisier text
Similar citirea dintr-un fisier text

Generarea unui tabel se poate face si ea in mai multe feluri:
- comanda XBASE CREATE
- fraza SQL CREATE TABLE
- transformare (import) dintr-un alt tip de fisier (text, XLS, etc.)
 1/9/2014 10:07:03 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
In Foxpro, tablourile cu doua dimensiun (matricele) au indecsii scrisi intre aceeasi pereche de paranteze, separati prin virgula
Deci nu C[1][1] ci C[1,1] sau C(1,1) (ambele variante sunt acceptate)

Initializarea tuturor elementelor unui tablou se poate face printr-o singura comanda:
NumeTablou=Valoare
De exemplu :
C=3
are ca efect atribuirea valorii 3 fiecarui element al tabloului, adica C(1,1)=3, C(1,2)=3, etc.

In Foxpro 0 si fals nu sunt echivalente, deci o variabila de tip boolean trebuie atribuita cu .F. sau .T.

Transmiterea unui parametru prin referinta in Foxpro se poate face folosind simbolul @
 1/9/2014 10:19:43 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
* Presupun ca algorimul e de aici http://stefanproiect.blogspot.ro/2013/04/algoritmul-lui-dijkstra.html
* Varianta 1: datele sunt introduse manual (prin atribuire directa in matrice)

# define NMAX 100
# define INFINIT 2147483647
CLEAR

LOCAL lni,C(NMAX,NMAX), d[NMAX],n,x0
* exemplul 1
n=3 && 3 orase
exemplul1(@c)
FOR x0=1 TO n
    ? 'Pornind din',x0
    dijkstra(x0,@c,@d,n)
    FOR lni=1 TO n
        ? d[lni]
    NEXT
NEXT
* exemplul 2
n=4 && 4 orase
exemplul2(@c)
FOR x0=1 TO n
    ? 'Pornind din',x0
    dijkstra(x0,@c,@d,n)
    FOR lni=1 TO n
        ? d[lni]
    NEXT
NEXT


PROCEDURE dijkstra
    LPARAMETERS x0 as Integer,c,d,n
    LOCAL i as Integer, j as Integer, min as Integer, k as Integer, ok as Boolean
    LOCAL viz[NMAX], tata[NMAX]
    FOR i = 1 TO n
        d[i] = C[x0,i]
        tata[i] = x0
        viz[i] = .F.
    ENDFOR
    tata[x0] = 0
    viz[x0] = .T.
    ok = .T.
    DO WHILE ok
        min = INFINIT
        FOR i = 1 TO n
            IF !viz[i] AND min>d[i]
                min = d[i]
                k = i
            ENDIF
        NEXT
        IF min != INFINIT
            viz[k] = .T.
            FOR i = 1 TO n
               IF !viz[i] AND d[i]>d[k]+C[k,i]
                   d[i] = d[k]+C[k,i]
                   tata[i] = k
               ENDIF
           NEXT
        ELSE
            ok = .F.
        ENDIF
    ENDDO
ENDPROC

PROCEDURE exemplul1
LPARAMETERS c
*
* Trei orase
* Matricea legaturilor
*          1    2    3
*    1    X    3    X
*    2    3    X    4
*    3    X    4    X
STORE INFINIT TO c(1,1),c(2,2),c(3,3)
STORE 3 TO c(1,2),c(2,1)
STORE INFINIT TO c(1,3),c(3,1)
STORE 4 TO c(2,3),c(3,2)
ENDPROC

PROCEDURE exemplul2
LPARAMETERS c
*
* Patru orase
* Matricea legaturilor
*          1    2    3    4
*    1    X    3    X    2
*    2    3    X    4    1
*    3    X    4    X    2
*    4    2    1    2    X
STORE INFINIT TO c(1,1),c(2,2),c(3,3),c(4,4)
STORE 3 TO c(1,2),c(2,1)
STORE INFINIT TO c(1,3),c(3,1)
STORE 2 TO c(1,4),c(4,1)
STORE 4 TO c(2,3),c(3,2)
STORE 1 TO c(2,4),c(4,2)
STORE 2 TO c(3,4),c(4,3)
ENDPROC

 1/9/2014 10:21:31 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
* Presupun ca algorimul e de aici http://stefanproiect.blogspot.ro/2013/04/algoritmul-lui-dijkstra.html
* Varianta 2 Datele sunt stocate si citite in fisiere text, cate un arc pe un rand, numerele fiind separate prin virgula

# define NMAX 100
# define INFINIT 2147483647
CLEAR

* Trei orase
* Matricea legaturilor
*          1    2    3
*    1    X    3    X
*    2    3    X    4
*    3    X    4    X
STRTOFILE('1,2,3'+CHR(13)+'2,3,4','Exemplu1.txt') && generarea fisierului
* Patru orase
* Matricea legaturilor
*          1    2    3    4
*    1    X    3    X    2
*    2    3    X    4    1
*    3    X    4    X    2
*    4    2    1    2    X
STRTOFILE('1,2,3'+CHR(13)+'1,4,2'+CHR(13)+'2,3,4'+CHR(13)+'2,4,1'+CHR(13)+'3,4,2','Exemplu2.txt') && generarea fisierului

LOCAL lni,C(NMAX,NMAX), d[NMAX],n,x0
* exemplul 1
citestefis(@c,'Exemplu1.txt',@n)
FOR x0=1 TO n
    ? 'Pornind din',x0
    dijkstra(x0,@c,@d,n)
    FOR lni=1 TO n
        ? d[lni]
    NEXT
NEXT
* exemplul 2
citestefis(@c,'Exemplu2.txt',@n)
FOR x0=1 TO n
    ? 'Pornind din',x0
    dijkstra(x0,@c,@d,n)
    FOR lni=1 TO n
        ? d[lni]
    NEXT
NEXT


PROCEDURE dijkstra
    LPARAMETERS x0 as Integer,c,d,n
    LOCAL i as Integer, j as Integer, min as Integer, k as Integer, ok as Boolean
    LOCAL viz[NMAX], tata[NMAX]
    FOR i = 1 TO n
        d[i] = C[x0,i]
        tata[i] = x0
        viz[i] = .F.
    ENDFOR
    tata[x0] = 0
    viz[x0] = .T.
    ok = .T.
    DO WHILE ok
        min = INFINIT
        FOR i = 1 TO n
            IF !viz[i] AND min>d[i]
                min = d[i]
                k = i
            ENDIF
        NEXT
        IF min != INFINIT
            viz[k] = .T.
            FOR i = 1 TO n
               IF !viz[i] AND d[i]>d[k]+C[k,i]
                   d[i] = d[k]+C[k,i]
                   tata[i] = k
               ENDIF
           NEXT
        ELSE
            ok = .F.
        ENDIF
    ENDDO
ENDPROC

PROCEDURE citestefis
* procedure de citire a fisierului
LPARAMETERS c,lcFis,n
LOCAL lcFisier,laRand[1],lnRand,laArc[1],lnArc,lni
lcFisier=FILETOSTR(lcFis)
lnRand=ALINES(laRand,lcFisier,1+4)
n=0
c=INFINIT
FOR lni=1 TO lnRand
    lnArc=ALINES(laArc,laRand[lni],1+4,",")
    IF lnArc=3 && un arc are trei elemente: origine, destinatie, cost
        STORE VAL(laArc[3]) TO c[VAL(laArc[1]),VAL(laArc[2])],c[VAL(laArc[2]),VAL(laArc[1])]
        n=MAX(n,VAL(laArc[1]),VAL(laArc[2]))
    ENDIF
NEXT
ENDPROC

 1/9/2014 10:22:17 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
* Presupun ca algorimul e de aici http://stefanproiect.blogspot.ro/2013/04/algoritmul-lui-dijkstra.html
* Varianta 3 Datele sunt memorate si citite intr-un tabel

# define NMAX 100
# define INFINIT 2147483647
CLEAR
CLEAR ALL
* Trei orase
* Matricea legaturilor
*          1    2    3
*    1    X    3    X
*    2    3    X    4
*    3    X    4    X
CREATE TABLE Exemplu1 (origine I,destinatie I,cost I) && generarea fisierului
USE
INSERT INTO Exemplu1 VALUES (1,2,3)
INSERT INTO Exemplu1 VALUES (2,3,4)
* Patru orase
* Matricea legaturilor
*          1    2    3    4
*    1    X    3    X    2
*    2    3    X    4    1
*    3    X    4    X    2
*    4    2    1    2    X
CREATE TABLE Exemplu2 (origine I,destinatie I,cost I) && generarea fisierului
USE
INSERT INTO Exemplu2 VALUES (1,2,3)
INSERT INTO Exemplu2 VALUES (1,4,2)
INSERT INTO Exemplu2 VALUES (2,3,4)
INSERT INTO Exemplu2 VALUES (2,4,1)
INSERT INTO Exemplu2 VALUES (3,4,2)
CLOSE DATABASES ALL

LOCAL lni,C(NMAX,NMAX), d[NMAX],n,x0
* exemplul 1
citestefis(@c,'Exemplu1',@n)
FOR x0=1 TO n
    ? 'Pornind din',x0
    dijkstra(x0,@c,@d,n)
    FOR lni=1 TO n
        ? d[lni]
    NEXT
NEXT
* exemplul 2
citestefis(@c,'Exemplu2',@n)
FOR x0=1 TO n
    ? 'Pornind din',x0
    dijkstra(x0,@c,@d,n)
    FOR lni=1 TO n
        ? d[lni]
    NEXT
NEXT


PROCEDURE dijkstra
    LPARAMETERS x0 as Integer,c,d,n
    LOCAL i as Integer, j as Integer, min as Integer, k as Integer, ok as Boolean
    LOCAL viz[NMAX], tata[NMAX]
    FOR i = 1 TO n
        d[i] = C[x0,i]
        tata[i] = x0
        viz[i] = .F.
    ENDFOR
    tata[x0] = 0
    viz[x0] = .T.
    ok = .T.
    DO WHILE ok
        min = INFINIT
        FOR i = 1 TO n
            IF !viz[i] AND min>d[i]
                min = d[i]
                k = i
            ENDIF
        NEXT
        IF min != INFINIT
            viz[k] = .T.
            FOR i = 1 TO n
               IF !viz[i] AND d[i]>d[k]+C[k,i]
                   d[i] = d[k]+C[k,i]
                   tata[i] = k
               ENDIF
           NEXT
        ELSE
            ok = .F.
        ENDIF
    ENDDO
ENDPROC

PROCEDURE citestefis
* procedure de citire a fisierului
LPARAMETERS c,lcFis,n
n=0
c=INFINIT
USE (lcFis)
SCAN
    STORE cost TO C[origine,destinatie],C[destinatie,origine]
    n=MAX(n,origine,destinatie)
ENDSCAN
ENDPROC

 1/9/2014 10:24:11 PM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
Ca exercitiu va propun sa modificati algoritmul (oricare dintre ele) in asa fel incat in locul tablourilor (C, d, viz si tata) sa folositi tabele (fisiere DBF).
 1/10/2014 12:23:01 AM
User is offlineDaniel Buduru
3522 posts
1st




Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
Ai aici un articol despre grafuri in SQL in care se gaseste si determinarea drumului minim cu algoritmul dijkstra. Este ceea ce iti trebuie.
http://hansolav.net/sql/graphs.html#dijkstra
Codul poate fi transpus in vfp. Incearca mai intai.

Daniel Buduru
 1/10/2014 12:51:19 AM
User is offlineDaniel Buduru
3522 posts
1st




Re: cel mai scurt drum dintre x->y FoxPro
 (N/A) Modified By Daniel Buduru  on 1/10/2014 1:53:07 AM)
@praisach
In sectiunea asta, noi ne straduim sa aplicam principul acesta: http://www.rightwords.ro/folclor/da-i-omului-un-peste-si-va-avea-de-mancare-o-zi-invata-l--4740

Daniel Buduru
 1/10/2014 6:04:18 AM
User is offlinepraisach
208 posts
praisachion.blogspot.ro/
4th


Re: cel mai scurt drum dintre x->y FoxPro
 (Romania)
 Daniel Buduru wrote
@praisach
In sectiunea asta, noi ne straduim sa aplicam principul acesta: http://www.rightwords.ro/folclor/da-i-omului-un-peste-si-va-avea-de-mancare-o-zi-invata-l--4740


Sunt de acord. Ma voi conforma pe viitor.
 2/3/2014 12:18:43 PM
User is offlinetirexrex
5 posts


Re: cel mai scurt drum dintre x->y FoxPro
 (N/A)
Va multumesc frumos pentru ajutor. Imi cer scuze ca am raspuns asa tarziu .
Microsoft VFP 6.0
  Visual FoxPro  Tema pentru acasa  cel mai scurt d...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement