Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ne razumem komandu

[es] :: Visual Basic 6 :: Ne razumem komandu

[ Pregleda: 2917 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Ne razumem komandu03.08.2010. u 09:07 - pre 166 meseci
Code:

For i = 1 To 30
    For j = 0 To 31
        resenje= i And 2 ^ j
    Next j
Next i


Nikako ne razumem ovu kombinaciju komandi. Sta se uopste racuna u promenjivoj resenje?
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Ne razumem komandu03.08.2010. u 09:37 - pre 166 meseci
tu je neka logicka greska, jer su te for petlje suvisne, to ce da ti da isti rezultat kao i:
Code:

resenje = 30 And 2 ^ 31


sto je jednako 0

pretpostavljam da te buni And operacija, VB nema tzv logicko-i ima samo bitwise-i, operator koji radi na nivou bitova.

30 zapisano u binarnom obliku (32bitnom) je 0000 0000 0000 0000 0000 0000 0001 1110,
2 ^ 31 = 2147483648, zapisano u binarnom obliku je 1000 0000 0000 0000 0000 0000 0000 0000

kada nad ta dva broja izvrsis bitwise and operaciju (VB-ov And operator), dobices nulu:
Code:

     0000 0000 0000 0000 0000 0000 0001 1110
     1000 0000 0000 0000 0000 0000 0000 0000
     ---------------------------------------
AND  0000 0000 0000 0000 0000 0000 0000 0000


tako da je resenje uvek jednako nuli.

vise o bitwise operacija mozes da procitas na wikipediji
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Ne razumem komandu03.08.2010. u 09:38 - pre 166 meseci
Napisi ceo zadatak pa mozda razumemo...
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Ne razumem komandu03.08.2010. u 09:40 - pre 166 meseci
Ovakav blok koda ne radi ništa pametno, na izlazu iz dva For-a u promenljivoj resenje ćeš imati vrednost 0.

Ako je ovo samo jedan deo koda, onda se u svakoj iteraciji za i od 1 do 30, određuje da li j-tom bitu 1 ili 0. "And" komanda će dati nulu ako na jtom msetu u binarnom zapisu broja i stoji 0 ili 2^j ako stoji 1
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Ne razumem komandu03.08.2010. u 10:21 - pre 166 meseci
@Ruzicic
Da, bas me je to bunilo.

@djoka
ne radi nista pametno ali ovo npr radi

Code:
Private Sub Command1_Click()
'pravim kombinacije prvog ulaznog niza
Dim Niz(100), strString As String
Dim Br_Elemenata_Niza, i, j As Long

Open "c:\niz2.txt" For Input As #1
    Do Until EOF(1)
            Line Input #1, broj
        Niz(i) = broj: i = i + 1
    Loop
Close #1

Br_Elemenata_Niza = i

For i = 1 To (2 ^ Br_Elemenata_Niza) - 1
    For j = 0 To Br_Elemenata_Niza
        If i And 2 ^ j Then strString = strString & Niz(j)
    Next j
    
    
   List1.AddItem strString
    strString = ""
Next i


End Sub


Nisam sad isprobao ovaj code, kucam iz glave ali trebalo bi da radi.

On izbacuje sve kombinacije brojeva ili elemenata niza. I sve radi sa malim brojem clanova niza ali kada se dodje do 31-og clana onda puca sa Overwlof na liniji
Code:
 If i And 2 ^ j Then strString = strString & Niz(j)

gde je i=1 a j=31

 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Ne razumem komandu03.08.2010. u 11:05 - pre 166 meseci
2 ^ 31 generiše overflow ako rezultat treba da bude integer dugačak 32 bita. Naime, 2 ^ 31 je zapis broja -1. Ne znam da li u VB može da se castuje izraz kao u drugim jezicima - na primer C/C++ (unsigned) 2^31

EDIT:

Evo, sada sam proverio.
Na primer, komanda
Code:
MsgBox 2^31

daje rezultat, ali
Code:
Dim x As Long
x=2^31

daje overflow

[Ovu poruku je menjao djoka_l dana 03.08.2010. u 12:25 GMT+1]
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Ne razumem komandu03.08.2010. u 11:25 - pre 166 meseci
Rezultata zapravo nema (u obliku promenjive), ne znam kako to da prepravim.

On puca tacno ovde:

Code:
If i And 2 ^ j


Znaci nema promenjiva koja je pogresno deklarisana puna na izrazu i And 2 ^ j.

EDIT

Zapravo on 2 ^ 31 moze da odradi bez greske, greska nastaje kada mu se doda 1 And
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Ne razumem komandu03.08.2010. u 11:41 - pre 166 meseci
Ovako, program ti ne valja!

Prvo, promenljiva j treba da ide do Br_elemenata_niza - 1
Drugo, za broj članova niza 32, linija

If i And 2 ^ j Then strString = strString & Niz(j)

će se izvršiti više od 137 MILIJARDI puta. Ne znam kako si mislio da dočekaš kraj izvršavanja programa. Sva sreća da si imao overflow.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Ne razumem komandu03.08.2010. u 11:59 - pre 166 meseci
Nisam siguran da te razumem. Promenjiva j treba da stoji tako kako jeste. Evo ti primer pa probaj.
Stavi jedan listbox i dugmence i kopiraj ovo

Code:
Private Sub Command1_Click()
'pravim kombinacije prvog ulaznog niza
Dim Niz(100), strString As String
Dim Br_Elemenata_Niza, i, j As Long

For i = 0 To 2
    Niz(i) = i + 1
Next i

Br_Elemenata_Niza = i

For i = 1 To (2 ^ Br_Elemenata_Niza) - 1
    For j = 0 To Br_Elemenata_Niza
        If i And 2 ^ j Then strString = strString & Niz(j)
    Next j
   List1.AddItem strString
    strString = ""
Next i

End Sub


Program ce pokazati tacno sve kombinacije brojeva i to radi lepo dok imam 30 brojeva u kombinaciji. Kada imam 31 onda stane. Kombinacija ima puno ali zato je tu racunar da ih racuna.
Imas neko bolje resenje? Ja bih ipak ovo prepravio jer verujem da sam na pravom putu mada naravno, mozda gresim.

EDIT:

U prevodu ono sa cime se ja bakcem je Kako naci sve moguce zbirove zadatog niza brojeva bez ponavljanja. Znaci 1+2 je isto sto i 2+1
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Ne razumem komandu03.08.2010. u 13:26 - pre 166 meseci
Zabunu je izazvao naziv promenljive Br_elemenata_niza

Na primer, ako imaš niz brojeva 1,2,3 tada je broj elemenata niza 3. Kod tebe je 2. U stvari, 2 je INDEKS POSLEDNJEG ELEMENTA zato što si niz indeksirao od 0.

E sada, pod uslovom da je broj elemenata niza 32 (tj Br_elemenata_niza +1 u tvom stilu imenovanja promenljivih), u tvojoj petlji "i" treba da ide od 1 do (2^32) -1, a "j" od 0 do 31.

Ajde sada da vidimo kako tvoj program radi. Za 32 elementa spoljna petlja se poziva 2^32 puta. Unutrašnja petlja se izvršava 32 puta (2^5). To znači da se linija:

If i And 2 ^ j Then strString = strString & Niz(j)

Izvrši 2^37 puta što je jednako 137,438,953,472 iteracija.
Neka je prosečna dužina stringa koji se tom prilikom kreira 15 znakova.
Kako se to kreira 2^32 puta, to bi za čuvanje svih međurezultata trebalo: 64,424,509,440 bajtova što je oko 60GB RAM memorije (sumnjam da imaš više od 4GB).

Tvoj program ima zavisnost od 2^n, gde je n broj članova niza, što se u računarstvu zove NP problem (ne polinomijalan). Za svaki sledeći dodati član niza vreme izvršavanja se duplira. Zato ovo nije dobar način da se rešava problem...
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Ne razumem komandu03.08.2010. u 14:11 - pre 166 meseci
Dobro, ubedio si me.

A sada imas li nekog keca u rukavu? :)
Kako izracunati sve zbirove brojeva koji su u nekom n-tom nizu?

Znaci imam brojeve 1,2,3
treba da mi izbaci:
1,2
1,3
2,3
1,2,3
Tj sve kombinacije ovih brojeva i posle ja racunam zbir tih kombinacija i kombinujem dalje za cega mi treba. Moram napomenuti da je potreban efikasan kod jer se u nizu moze pronaci mnogo brojeva.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Ne razumem komandu03.08.2010. u 14:17 - pre 166 meseci
Citat:
Aleksandar Ružičić: pretpostavljam da te buni And operacija, VB nema tzv logicko-i ima samo bitwise-i, operator koji radi na nivou bitova.

Ima logicko I :)
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Ne razumem komandu03.08.2010. u 15:00 - pre 166 meseci
Citat:
Blue82: Dobro, ubedio si me.

A sada imas li nekog keca u rukavu? :)
Kako izracunati sve zbirove brojeva koji su u nekom n-tom nizu?


Na žalost, ne postoji kec u rukavu. Ovakvi problemi se rešavaju heurističkim algoritmima.
Prvo pitanje je da li ti je zaista potrebno da za 32 elementa niza generišeš svih 4 milijardi kombinacija? Možda problem nisi postavio kako treba. Možda je tvoj problem, u stvari, da odgovoriš na pitanje: Da li broj k može da se predstavi nekom sumom koja sadrži brojeve iz niza a?

Ono što ti pokušavaš, naziva se "brute force" metod (silom pokušavaš da rešiš problem). To neki put upali, naračito ako u podrumu držiš superkompjuter koji će, eventualno, posle nekoliko dana/meseci rada da na nabasa na rešenje.

Pogledaj, recimo, algoritam koji se naziva A*. U dnu članka imaš i linkove na kategorije :
Graph algorithms, Routing algorithms, Search algorithms, Combinatorial optimization, Game artificial intelligence, Articles with example pseudocode
pa ako tvoj problem upada u neku od ovih kategorija, možeš više da se informišeš.

EDIT: za rešavanje problema: da li k može da se predstavi sumom čiji su članovi podskup niza a, koristio bih "branch and cut" metod.



[Ovu poruku je menjao djoka_l dana 03.08.2010. u 16:20 GMT+1]
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Ne razumem komandu03.08.2010. u 15:31 - pre 166 meseci
Znaš za čega mi treba. Prosto ne mogu da verujem da su računari toliko tromi. Imaš iznose računa u firmi. Jednu grupu od šta znam 4 strane a4 formata i font arial 12. Svaki račun zauzima jedan red pa sad vidi koliko tu brojeva ima. To su računi jedne firme. Isto tako dobiješ račune druge firme, znači ta količina podataka x 2.
E sad zadatak je da nadjes parnjake. Račun od 200 dinara upariš sa računom od 200 dinara sa listinga koji ti je dala druga firma. E sad zabava počinje kada je jedna firma to proknjizila kao 200 dinara a druga firma kao 150 i 50 dinara što u zbiru daje 200. Takodje mogla ga je proknjiziti i kao 150,30,20 sto je opet 200. Takve vratolomije mogu da prave obe firme, znači ne zna se unapred ko će rastavljati račune a ko ih pisati u celosti.
Cilj je upariti sve iste.
Zato sam mislio da napravim sve kombinacije brojeva. Kombinacije iz onog gore primera su bez ponavljanja znači tu sam skratio vreme. Onda saberem sve varijante od jedne firme i sve varijante od druge firme i uporedim zbirove i nadjem parnjake. E sad sve je to supar radilo na testu sa 10 brojeva dok sam pravio a kada sam ubacio 30 opa otišlo u večnost i još me sačekao izveštaj o grešci. Naprosto ne mogu da smislim racionalan način a mora postojati jednostavno rešenje jer čoveku je potrebno par sati da to uporedi a računar bi onda trebao za par sekundi. Aj da ne sitničarimo nek drnda i par minuta pa da mu se oprosti.

Doduše taj broj podataka koji se na kraju kombinuju se može skratiti tako što se prvo upare isti ali opet ih može ostati 30-ak.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Ne razumem komandu03.08.2010. u 16:19 - pre 166 meseci
Tek sada smo došli do srži problema.

Prvo si dao besmisleni komad koda i pitao šta on radi.
Onda si dao malo smisleniji deo koda i pitao zašto se javlja overflow.
I na kraju smo počeli da diskutujemo o teoriji algoritama i P i NP preoblemima.

Sve to je moglo da se lepo izbegne da si odmah pitao ono što te interesuje, a ne da obilaziš oko problema.

To što tebi treba zove se ZATVARANJE STAVKI. Sa jedne strane imaš potraživanja, sa druge strane uplate. Cilj ti je da vidiš šta kupci još moraju da plate.

1. Ako postoje informacije o pozivu na broj, tada zatvaraš potraživanje sa odgovoarajućim prihodom.

2. Ako ne možeš da pogodiš na koji se račun odnosi uplata, tada pozoveš telefonom klijenta i pitaš ga šta ti je to uplatio.

3. Ako 2. nije opcija onda zatvaraš uplatu NAJSTARIJIM potraživanjem

As simple as that. Umesto da pogađaš šta je kupac mislio, zatvaraš najstariju stavku uplatom. Na primer, ako je trebao da plati 200, a uplatio 180, tada je ta stavka ostala otvorena za 20. Ako je uplatio 220, u potpunosti zatvaraš stavku i pamtiš da je stavka uplate otvorena 20, pa tražiš sledeću obavezu.

Na kraju godine, neko je preplatio, neko nije dovoljno platio, pa se razmene izvodi otvorenih stavki (IOS) gde se uporede obaveze i potraživanja...
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Ne razumem komandu03.08.2010. u 16:29 - pre 166 meseci
Citat:
Shadowed: Ima logicko I :)


moguce da sam zaboravio, ne radim u vb-u vec par godina, ali koliko se secam u VB6 su Not, And i Or bitwise operatori, zato je True u vb6 = -1, tj Not 0 = &HFFFFFFFF = -1 (Integer).

kao sto rekoh, vrlo je moguce da gresim :)
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Ne razumem komandu03.08.2010. u 16:49 - pre 166 meseci
A ne ne, nije to u pitanju nego usaglašavanje stanja. Stanje nam se ne slaže i sada treba pronaći gde su razlike. Ti si knjižio 200 dinara, ja sam knjižio 200 dinara i to je ok. Ili ti si knjižio 200 dinara ali ja sam knjižio 150 i 50 po istom računu pa je to opet uredu. Cilj je da na kraju pronađeš gde su razlike. Pa kažeš ti nisi knjižio ovaj, ovaj i ovaj račun a ja nisam knjižio taj i taj i onda napravite prepis tih računa i dalje usaglašavate stanje već po proceduri. Kod slabijih klijenata to je lako uraditi ali evo imam usaglašenje na 8 strana A4 znači 16 strana brojeva što ti oduzme ceo dan na glupost a tako neki program bi puno pomogao.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Ne razumem komandu03.08.2010. u 23:10 - pre 166 meseci
Citat:
Aleksandar Ružičić: moguce da sam zaboravio, ne radim u vb-u vec par godina, ali koliko se secam u VB6 su Not, And i Or bitwise operatori, zato je True u vb6 = -1, tj Not 0 = &HFFFFFFFF = -1 (Integer).

kao sto rekoh, vrlo je moguce da gresim

Ima, s' tim da se pise na isti nacin a zavisi od konteksta. E sad, fora je u tome sto su (kao sto si i sam napisao) True i False tako interno zabelezeni da bitwise operacija ujedno uradi potrebnu logicku. Al' to je interno, gledano sa strane programera - And u zavisnosti od konteksta moze biti bitwise a moze biti i logicki operater
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Ne razumem komandu04.08.2010. u 09:17 - pre 166 meseci
odosmo u offtopic, ali nema veze :)

elem, ja pod logickim operatorima podrazumevam tzv short-circuit operatore, tj AndAlso i OrElse u VB.NET-u kojih u VB6 nema. ali opet, sve je stvar definicije logickih operatora a ocigledno je da se tu ne slazemo :)
a i vrlo je moguce da sam ja medju retkim programerima koji samo short-circuit operacije nazivaju logickim :)
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Ne razumem komandu04.08.2010. u 10:45 - pre 166 meseci
Cini mi se da jesi :)
 
Odgovor na temu

[es] :: Visual Basic 6 :: Ne razumem komandu

[ Pregleda: 2917 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.