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

Opet problem sa kreiranjem n brojaca...

[es] :: Pascal / Delphi / Kylix :: Opet problem sa kreiranjem n brojaca...

[ Pregleda: 4112 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Opet problem sa kreiranjem n brojaca... 21.11.2004. u 21:32 - pre 235 meseci
Imam jednu funkciju, koju pozivam sa parametrom n, tipa integer.
Kako da napravim da ta funkcija napravi n brojaca ugnjezdena jedan u drugi ? Primer :

Code:

For C1 := 0 to 9 Do
Begin
  // Do something
  For C2 := 0 to 9 Do
  Begin
  // Do something
    For C3 := 0 to 9 Do
    Begin
    // Do something
    End;
  End;
End;

Znaci ovaj kod gore bi zavrsio posao, ali meni treba jedna univerzalna funkcija koja moze kreirati proizvoljan broj brojaca...

poz
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
*.vdial.verat.net.

Sajt: www.diy-fever.com


+1 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 21.11.2004. u 22:21 - pre 235 meseci
tebi trebaju varijacije n elementata sa ponavljanjem. ideja je sledeca:
imas ugnjezdene petlje
Code:

for a1 := d1 to g1 do
 ...
  for an := dn to gn do

napravi niz duzine n i posavi a[i]=d[i], za svako i
onda radis sledece

repeat

//obrada, indeksi su u nizu a[i]

j := n;
while (j > 0) and (a[j] = g[j]) do
 begin
  a[j] := d[j]; Dec(j);
 end;
if j > 0 then
 Inc(a[j]);
until j = 0;


mislim da je ok, samo kucam ti iz glave, pa nisam siguran bas 100% :)
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

filjo

Član broj: 17551
Poruke: 136
*.co.yu.



+1 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 21.11.2004. u 22:29 - pre 235 meseci
Ma znao sam da ces na kraju doci do ovog problema.
Ovako stoje stvari:

n - broj brojaca tj. broj petlji.
mn - od kojeg broja pocinje brojanje npr. 0
mx - na kojem broju se zavrsava npr. 9

u br[x] vidis trenutno stanje brojaca;

Sve je ovo super, ako ti izmedju svake for petlje nemas kod, vec su one ugnezdene jedna u drugu, a kod se izvrsava tek u zadnjoj. To je onda ovaj slucaj.

Ako hoces da se izmedju svake petlje izvrsi neki tvoj kod, onda moras uz brojace da imas i pokazivace na funkcije koje se izvrsavaju. Znaci koliko brojaca, toliko pokazivaca na funkcije, ali to je vec druga prica.

Code:

nekafunkcija ili procedura

var i,n,mn,mx:integer;
  br:array[1..100] of integer;

  function povecaj(x:integer):boolean;
  begin
    br[x]:=succ(br[x]);
      if br[x]>mx then
        begin
          if x=1 then
            povecaj:=true
          else
            begin
              br[x]:=mn;
              povecaj:=povecaj(x-1);
            end;
        end
      else
        povecaj:=false;
  end;

begin
  n:=3;
  mx:=9;
  mn:=0;
  for i:= 1 to n do br[i]:=mn;
  while not povecaj(n) do
    begin
        // ovde ide kod
    end;
end;


 
Odgovor na temu

milika
Milika Delic
RD
NS

Član broj: 13221
Poruke: 120
*.yu
Via: [es] mailing liste



Profil

icon Re: Opet problem sa kreiranjem n brojaca... 22.11.2004. u 13:44 - pre 235 meseci
Ovo je jedino moguce uz pomoc rekurzije i pokazivaca na procedure
ali to bas nije osnovni paskal...

vidi ti bolje da li mozes osnovnu ideju da uprostis...
pozdrav.,..
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
212.62.59.*



+11 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 22.11.2004. u 14:30 - pre 235 meseci
Ako uzmemo da gornji primer znaci da parametar odredjuje koliko je ugnjezdenih petlji a da saka petlaj uvek broji od 0 do 9 to dosta pojednostavljujes stvar.

Da uprostimo, petlej se vrte ali samo ona najdublja stvarno zivrsava neki kod:

Onda ti ustvari treba jedna petlja koja ce brojati od 0 do m gde je m = 10 na n-ti a n ulazni parametar. U toj petlji radi sta treba.

E sad da se vratimo na komplikovaniji slucaj da svaka petlja treba da radi jos nesto osim sto vrti petlju unutar sebe kao sto si ti naveo u primeru.

U tom slucaju opet radi ista petlja samo sto sad u nju treba da stavis malo uslova da proveris stanje brojaca i da na osnovu toga izvrsavas odredjeni kod.

Nego da razjasnim sustinu. S obzirom da ti svaka petlja vrti od 0 do deset to znaci da ako neka cifra u vrednosti brojaca m jednaka nulit to znaci da na tom nivou treba zivrsiti predvidjeni kod. Da imas fiksanbrojpetlji mogao bi sa mod da utvrdjujes vrdnsoti cifara ali posto nije, trenutno mi pada na pamet da pretvoris m u string i dopunis sa nulama ispred tako da dobijeni string ima onoliko znakova koliko ima petlji pa da onda proveravas koje su cifre '0' i da izvrsavas odgovarajuci kod.

Naravno, uvek mozes da napravis niz od n integer-a da ti sluze kao brojaci pa da ih rucno uvecevas u svakoj iteraciji ali s obzirom da ti pelje broje od 0 do 9 onda mozes da iskorsitis obican dekadni sistem jedne integer vrednosti. Svaka cifra ti predstavlja jedan brojac.

Nekako mi se vise svidja ovakvo resenje nego petljanje sa rekurzijom, koje bi bilo komplikovano zbog potrebe da se izvrsava razlicit kod u svakoj petlji.


 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.83.beocity.net.

Sajt: localhost


+5 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 23.11.2004. u 09:45 - pre 235 meseci
o bože.. "petljanje sa rekurzijom"??

pa ovo je školski primer za upotrebu rekurzije..

(a usput, ovaj, to što je broker opisao, to neće, ovaj neće nikad da.. poleti..)


[Ovu poruku je menjao -zombie- dana 23.11.2004. u 10:50 GMT+1]
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: Opet problem sa kreiranjem n brojaca... 23.11.2004. u 09:49 - pre 235 meseci
Citat:
-zombie-: pa ovo je školski primer za upotrebu rekurzije..


...Ukoliko je u koodu iz prve poruke na mestima //Do something isti kood. Iz kasnijih poruka nije jasno da li je tako, a autor threada nas bojkotuje :)
Kad bi nam marko objasnio malo detaljnije, moglo bi se mozda dalje i razglabati na tu temu.

Citat:
(a usput, ovaj, to što si opisao, to ti neće poleteti..)


must agree on that. a i da poleti, svakako to ne bi bio kood na koji bih (bar ja) bio ponosan :)

ss.
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 23.11.2004. u 11:23 - pre 235 meseci
Citat:
milika: Ovo je jedino moguce uz pomoc rekurzije i pokazivaca na procedure
ali to bas nije osnovni paskal...


Najcistiji Pascal koji se moze zamisliti :). S tim sto ne moras da koristis pokazivace na procedure, vec reference na iste. (Pascal: funkcije i procedure su takodje VARIJABLE, i kao takve se mogu dodeljivati, prosledjivati i ne znam sta jos).

Rajko
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 23.11.2004. u 22:48 - pre 235 meseci
Citat:
sasas wrote:...Ukoliko je u koodu iz prve poruke na mestima //Do something isti kood. Iz kasnijih poruka nije jasno da li je tako, a autor threada nas bojkotuje :)
Kad bi nam marko objasnio malo detaljnije, moglo bi se mozda dalje i razglabati na tu temu.


Da, umesto // Do something ce biti isti kod - tj. najverovatnije ce se pozivati jedna ista funkcija.
Kako to resiti preko rekurzije ?
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: Opet problem sa kreiranjem n brojaca... 24.11.2004. u 07:07 - pre 235 meseci
Ovo ti je otprilike kako rekurzija radi. Pogledaj kako ovo funkcionise, pa napisi novu prema svojim potrebama.

ss.

Code:

procedure sale(iNivo: integer);     // ovo je rekurzivna procedura
var
  i: integer;
begin
  if iNivo = 10 then exit;          // uslov za izlazak
  writeln;
  writeln('Nalazis se u dubini: ', iNivo);
  for i := 1 to 10 do               // ovo bi bila tvoja for petlja
  begin
    write(i, '  ');                 // do something
  end;
  inc(iNivo);
  sale(iNivo);                      // funkcija poziva samu sebe, sa novim argumentom
end;

begin
  sale(0); // prvi poziv funkcije
  readln;
end.

When something is hard to do, then it's not worth doing.
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
212.62.59.*



+11 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 24.11.2004. u 13:31 - pre 235 meseci
Momci, itekako bi poletelo i radilo bi posao.

Bas bih voleo da vidim tu rekurziju koja na svakom nivou radi neki drugi posao (kao sto coveku treba) a da je jednostavna. Moze da se napravi ali cemu petljanje kad moze prosto da se resi.

Mislim, ok je voleti rekurzije, uvek je bilo fancy korsititi ih, ali ipak ne treba ih gurati u sve i svasta.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 24.11.2004. u 15:29 - pre 235 meseci
@broker
Gresis, izvrsava se jedan isti kod na svakom nivou.
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
212.62.59.*



+11 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 24.11.2004. u 16:01 - pre 235 meseci
Marko, napisao si:

Code:

For C1 := 0 to 9 Do
Begin
  // Do something
  For C2 := 0 to 9 Do
  Begin
  // Do something
    For C3 := 0 to 9 Do
    Begin
    // Do something
    End;
  End;
End;


Iz ovoga sam protumacio da pored toga sto pokrece petlju ispod sebe, petlja izvrsava i dodatni kod koji je oznacen sa "Do Something".

Ako problem svodis na

Code:

For C1 := 0 to 9 Do
Begin
  For C2 := 0 to 9 Do
  Begin
    For C3 := 0 to 9 Do
    Begin
    // Do something
    End;
  End;
End;


Onda brate prosto izracunaj koliko puta terba da se izvrsi taj kod, mnozeci broj petlji sa brojem iteracija i napravi jednu obicnu petlju sa potrebnim brojem iteracija koja ce to sve da uradi.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 24.11.2004. u 21:25 - pre 235 meseci
OK, moracu malo vise da pojasnim problem...
Ovako, treba da napisem AI za igricu Lines. To je igra gde se crveni i plavi kruzici ubacuju odozgo i pobednik je onaj ko prvi napravi liniju (horizontalnu, vertikalnu ili dijagonalnu) od 4 istih kruzica. Sad ne bih da reklamiram, ali kome nije jasno neka vidi ovaj link
Polje za igru je velicine 10x15 (sirina=10, visina=15). U mom DLL-u sam definisao matricu koja odgovara polju ([0..9, 0..14]). Postoji i funkcija DetermineMove(const maxLine, minLine, deepCount, blobType : Integer) : Integer;
maxLine je maksimalna velicina linije za koju funkcija ispitava, minLine minimalna velicina linije. blobType je tip kruzica, da li je plavi ili crveni.
E sad, deepCount oznacava koliko poteza unapred funkcija proverava zadate uslove. Recimo, ako napisem ovako :
Code:
DetermineMove(4, 4, 0, fEnemy)
, funkcija ce napraviti samo jedan prolaz i proverice da li postoji mogucnost da se napravi linija od 4 neprijateljska kruzica u narednom potezu. Zatim, ako je deepCount = 1, funkcija proverava dva poteza unapred, tj. pravi dva prolaza kroz kod.

Otprilike tako sam zamislio tu funkciju. E sad, postoje funkcije WriteBlob(const col : Integer) : Boolean; i RemoveBlob(const col : Integer);. Njih fja DetermineMove koristi. Recimo, ako je deepCount = 0, onda funkcija treba da napravi jedan brojac, recimo C1, od 0 do 9, da u kolonu C1 pomocu fje WriteBlob() upise jedan kruzic i da ispita da li trenutni raspored odgovara zadatim parametrima. Posle toga, pomocu fje RemoveBlob() se kruzic uklanja iz kolone, kako bi se vratio stari raspored. Ako je raspored kruzica pre pozivanja RemoveBlob() fje odgovarao uslovima, izlazi se iz funkcije.
Zatim, ako se fja pozove sa deepCount=1, funkcija treba da napravi dva prolaza i da ispita sve moguce kombinacije (ili varijacije, nisam siguran). Znaci, prvo se u kolonu 0 zapise jedan kruzic pa se onda u kolone od 0 do 9 zapisuje po jos jedan i ispituje (posle toga se uklanja). Zatim se prelazi na kolonu 2, tu se upisuje kruzic, i opet se od 0..9 zapisuje jos po jedan kruzic... I tako dalje, sve dok se ne doje do situacije kad se u 9 koloni nalaze oba kruzica.

Eto celog problema, znaci ja ne znam ovo da napravim. Ona Saletova funkcija bi odgovaral za deepCount=1, ali sta ako je =2 ili vise ?

poz
 
Odgovor na temu

masetrt
Marko Djurovic
Programer, Omni-Explorer
Beograd

Član broj: 3129
Poruke: 228
*.nat-pool.bgd.sbb.co.yu.

Sajt: www.vast.com


+2 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 02.12.2004. u 09:41 - pre 235 meseci
Ne bih da sigurisem , ali mislim da ti je potreban drugaciji pristup resavanju problema. naime standardi za resavanje ovakvih zadataka (tzv. sahovski problemi) koristi se mini-max funkcija (na netu gomila objasnjenja a ako ne nadjes cimni me na mail pa cu ti poslati). E sad ako je vazna brzina (ako je ono takmicenje sto mislim da jeste vazna je) postoje tehnike skracivanja kao alpha-beta cut. Pa jos ako uvedes neku heuristiku bog da te vidi (salim se).
His majesty Grand Duke of Shumadija and Western Pomoravlje
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Opet problem sa kreiranjem n brojaca... 02.12.2004. u 21:51 - pre 235 meseci
Aj molim te posalji na paunovic [at] gmail [dot] com to sto imas

poz i hvala unapred
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Opet problem sa kreiranjem n brojaca...

[ Pregleda: 4112 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

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