Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 22.1.2011, 23:32   #1
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Question do...while petlja sa 2 izraza (uslova)

Pomažem drugaru sa pripremom za kolokvijum iz C# (u pitanju je konzolna aplikacija) i naišao sam na jedan zadatak koji mi pravi problem, a on glasi:
"Generišu se slučajni brojevi 0-20. Potrebno je generisati brojeve sve dok se 5 ne pojavi ukupno dva puta, ili dok se bilo koji drugi broj ne pojavi uzastopno dva puta. Na kraju je potrebno ispisati na ekranu pod kojim uslovom je došlo do kraja programa."
OK, jasno mi je šta treba da se uradi. Ja sam rešio da koristim do...while petlju. Da dam objašnjenje kako sam zamislio da odradim ovaj zadatak:
Kod:
int broj = 0; // nasumicno izabran broj
int broj2 = 0; // broj razlicit od 5
int brojPonavljanja = 0; // broj ponavljanja broja 5
int brojOstalihPonavljanja = 0; // broj ponavljanja brojeva razlicitih od 5
do{
    broj = nasumicanBroj.Next(0, 20) + 1;
    Console.WriteLine("Izabran je broj " + broj); // ispisi koji je broj izabran
    Console.ReadLine();
    if (broj == 5){
    brojPonavljanja++; // inkrementiraj promenljivu (imace vrednost 1)
    if (brojOstalihPonavljanja == 1) // ako smo vec jednom pre broja 5 dobili broj != 5
     { 
      brojOstalihPonavljanja--; // resetuj vrednost promenljive na 0
      }
                }
      else if (brojOstalihPonavljanja == 0) // ako nismo 2 puta zaredom pronasli iste brojeve{ 
      broj2 = broj;
      brojOstalihPonavljanja++; // inkrementiraj promenljivu za 1
                }
      else if (brojOstalihPonavljanja == 1) // ako smo vec jednom dobili broj razlicit od 5{ 
               if (broj2 == broj){
               brojOstalihPonavljanja++; // ako je broj2 == broj onda inkrementiraj promenljivu za 1 (imace vrednost 2)
                }
                else{
                   brojOstalihPonavljanja--; // u suprotnom resetuj vrednost promenljive na 0
                    }
                }
            }
            while (brojPonavljanja < 2 || brojOstalihPonavljanja < 2);
Console.WriteLine("Program se zavrsio zato sto se broj {0} pojavio 2 puta",(brojPonavljanja == 2)?broj:broj2);
Console.ReadLine();
Problem je while uslov (brojPonavljanja < 2 || brojOstalihPonavljanja < 2). Stvar je u tome što moram izvršiti proveru da li se broj 5 pojavio ukupno dva puta (i zato koristim promenljivu brojPonavljanja), a za ostale brojeve moram proveriti da li su se pojavili zaredom dva puta. U ovom slučaju samo jedan od ova dva uslova se izvršava, međutim nekada mi se desi da se dva puta pojavi broj 5 a da se program ne završi, a da se završi kada se dva puta zaredom pojave isti brojevi, a nekada obrnuto. Znam da ne bi bilo problema kada bi za uslov koristio samo jednu promenljivu, ali ovo je jedini način koji mi pada na pamet. Da li neko ima ideju kako bi mogao ovo drugačije da izvedem?
P.S: U slučaju da vam je bliskiji actionscript 3 isti taj zadatak izgleda ovako:
Kod:
var nasumicanBroj:int;
var broj2:int = 0;
var brojPonavljanja:int = 0;
var brojOstalihPonavljanja:int = 0;
do {
	nasumicanBroj = Math.random()*20;
	trace("Izabran je broj " + nasumicanBroj);
	if (nasumicanBroj == 5) {
		brojPonavljanja++;
	} else if (brojOstalihPonavljanja == 0) {
		broj2 = nasumicanBroj;
		brojOstalihPonavljanja++;
	} else if (brojOstalihPonavljanja == 1) {
		if (broj2 == nasumicanBroj) {
			brojOstalihPonavljanja++;
		} else {
			brojOstalihPonavljanja--;
		}
	}
} while (brojPonavljanja < 2 && brojOstalihPonavljanja < 2);

trace("Program je zavrsen zato sto je broj " + String((brojPonavljanja == 2) ? nasumicanBroj : broj2) + " izabran 2 puta");
Malo mi je čudno što u AS-u kada koristim logički operator && ne pojavljuje se navedeni problem, dok se u C# i dalje isto ponaša.

Poslednja ispravka: Bolton (22.1.2011 u 23:56) Razlog: actionscript update
Bolton je offline   Odgovor sa citatom ove poruke
Stara 22.1.2011, 23:59   #2
Pele023
Član
 
Član od: 5.2.2009.
Poruke: 74
Zahvalnice: 14
Zahvaljeno 12 puta na 11 poruka
Određen forumom Re: do...while petlja sa 2 izraza (uslova)

Probaj da koristis while petlju, a ne do..while.
Pele023 je offline   Odgovor sa citatom ove poruke
Stara 23.1.2011, 2:12   #3
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Lightbulb Re: do...while petlja sa 2 izraza (uslova)

Probao sam to još ranije ali isto se dešava. Problem je u while petlji, odnosno kada koristim dva izraza kao uslov. Inače ovaj problem sam rešio tako što sam za uslov koristio samo jednu promenljivu (brojPonavljanja < 2) i dodelio joj vrednost inkrementirane promenljive brojOstalihPonavljanja, odnosno:
Kod:
else if (brojOstalihPonavljanja == 1) // ako smo vec jednom dobili broj razlicit od 5
                { 
                    if (broj2 == broj)
                    {
                        //brojOstalihPonavljanja++; // ako je broj2 == broj onda inkrementiraj promenljivu za 1 (imace vrednost 2)
                        brojPonavljanja = ++brojOstalihPonavljanja;
                    }
                    else
                    {
                        brojOstalihPonavljanja--; // u suprotnom resetuj vrednost promenljive na 0
                    }
                }
Pored toga, metodi Next klase Random sam sada prosledio samo jedan argument (20) kao maksimalnu vrednost broja
Kod:
broj = nasumicanBroj.Next(20) + 1;
tako da sada funkcioniše, ali nije htelo kada sam prosleđivao 2 argumenta (0,20), odnosno prvi za početnu i drugi za krajnju vrednost.
Bolton je offline   Odgovor sa citatom ove poruke
Stara 23.1.2011, 10:42   #4
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom Re: do...while petlja sa 2 izraza (uslova)

Generalno, nema potrebe za tolikim kodom (koji ne mogu da kompajliram, btw)

C#
Kod:
        static void Main()
        {
            int prethodni;
            var trenutni = -1;
            var rnd = new Random();
            var brojPetica = 0;

            
            do
            {
                prethodni = trenutni;
                trenutni = rnd.Next(0, 20);
                if (trenutni == 5) brojPetica++;
                
                Console.WriteLine(trenutni);
            } while (brojPetica != 2 && trenutni != prethodni);

            Console.ReadLine();
        }
Pretpostavljam da je kod tebe problem bio u while uslovu...?

Poslednja ispravka: MG-RAY (23.1.2011 u 10:55)
MG-RAY je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci:
Bolton (23.1.2011)
Stara 23.1.2011, 12:33   #5
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom Re: do...while petlja sa 2 izraza (uslova)

Citat:
MG-RAY kaže: Pregled poruke
Generalno, nema potrebe za tolikim kodom (koji ne mogu da kompajliram, btw)

C#
Kod:
          while (brojPetica != 2 && trenutni != prethodni);
Ovde treba da bude ILI iterator a ne I, bar tako kaže zadatak. Ili jedno ili drugo.
Todors je offline   Odgovor sa citatom ove poruke
Stara 23.1.2011, 15:12   #6
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Smile Re: do...while petlja sa 2 izraza (uslova)

Citat:
MG-RAY kaže: Pregled poruke
Generalno, nema potrebe za tolikim kodom (koji ne mogu da kompajliram, btw)
Nisam pokušavao da kompajliram, samo sam debagovao i radilo je onako kako sam zamislio, ali je tvoj način efikasniji i kraći. Evo kako izgleda finalna verzija:
Kod:
int prethodni;
var trenutni = -1;
var rnd = new Random();
var brojPetica = 0;
do{
prethodni = trenutni;
trenutni = rnd.Next(0, 20);
  if (trenutni == 5) brojPetica++;
  Console.WriteLine(trenutni);
}
while (brojPetica != 2 && trenutni != prethodni);
Console.WriteLine("Program je zavrsen zato sto se broj {0} pojavio 2 puta", (brojPetica == 5)?brojPetica:trenutni);
Console.ReadLine();
Citat:
Todors kaže: Pregled poruke
Ovde treba da bude ILI iterator a ne I, bar tako kaže zadatak. Ili jedno ili drugo.
To sam i ja mislio, međutim iako bi logički to trebalo da bude tačno, u praksi ne funkcioniše. Mora da se upotrebi && operator da bi se izašlo iz petlje kada se JEDAN od uslova ispuni (a ne oba kako bi se pretpostavilo kada se posmatra uslov), i zbog toga mi je bilo čudno zašto je u actionscriptu radilo kada se koristi &&, a ne || operator.
U svakom slučaju hvala obojici na odgovorima.
Bolton je offline   Odgovor sa citatom ove poruke
Stara 23.1.2011, 20:04   #7
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Talking Re: do...while petlja sa 2 izraza (uslova)

Ne ne, moja je greška, zato što lepo piše "trenutni != prethodni", a ne "trenutni == prethodni". Malo sam napravio previd dok sam kompajlirao u glavi .
Todors je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Todors na korisnoj poruci:
MG-RAY (24.1.2011)
Stara 24.1.2011, 12:36   #8
irreal
V.I.P. Programiranje
 
Član od: 9.1.2009.
Lokacija: Beograd, Banovo Brdo
Poruke: 1.157
Zahvalnice: 83
Zahvaljeno 448 puta na 303 poruka
Određen forumom Re: do...while petlja sa 2 izraza (uslova)

Citat:
Bolton kaže: Pregled poruke
To sam i ja mislio, međutim iako bi logički to trebalo da bude tačno, u praksi ne funkcioniše. Mora da se upotrebi && operator da bi se izašlo iz petlje kada se JEDAN od uslova ispuni (a ne oba kako bi se pretpostavilo kada se posmatra uslov), i zbog toga mi je bilo čudno zašto je u actionscriptu radilo kada se koristi &&, a ne || operator.
U svakom slučaju hvala obojici na odgovorima.

Bas sam se naostrio da ti demonstriram milion puta jednostavniji nacin pamcenja prethodnog broja i uporedjivanja novog sa prethodnim medjutim naravno da me je neko pretekao.

Sada mi je ostalo samo da ti kazem da si od pocetka logicki pogresno posmatrao petlju.

ti u while petlji ne dajes uslov za izlazak nego uslov za ostanak u istoj!
Da si o tome razmislio, radio bi ti i tvoj mnogo komplikovaniji kod.

samo ime while petlje kaze radi nesto dok vazi dati uslov.

tako da ako mu ti kazes "radi ovaj kod dokle god vazi da je ILI broj petica manji od 2 ILI prethodna dva nisu ista" onda ce se kod svaki put izvrsavati dokle god se oba uslova ne ispune.

a ako mu kazes "radi ovaj kod dokle god je broj petica manji od dva I TAKODJE prethodna dva nisu ista" onda cim se jedan od ta dva uslova ispuni, uslov je false i petlja se zavrsava.

Nadam se da ti je to jasno jer kapiranje logike je jako bitna stvar.
I jos bitnije je da nikada ne pomislis "logicno je u teoriji ali u praksi iz nekog razloga mora suprotno". apsolutno ne! kada god to pomislis, teorija ti je losa

prijateljski savet, cisto da ne mislis da se boris protiv kompajlera...
irreal je offline   Odgovor sa citatom ove poruke
Stara 24.1.2011, 16:41   #9
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Post Re: do...while petlja sa 2 izraza (uslova)

Znam, shvatio sam to kada sam se malo više udubio u problematiku i rešenje zadatka koje je postavio MG-RAY. Korišćenje operatora OR je bio uzrok problema koji sam naveo, i zbog toga mi se dešavalo da se neki put petlja završi samo kada se broj 5 pojavi dva puta, nezavisno od toga koliko se istih brojeva pojave zaredom, a nekada obrnuto.
Bolton je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Pesma/e koja vas najviše dirne? Wolverine Opšta kultura 1131 5.9.2019 15:13
Problem sa zvukom - da li je do hardware-a ili nesto drugo? FiresnakE Kvarovi 6 5.3.2010 12:08
Smešni, interesantni tekstovi o raznim geek temama NjegovaWisost Cvet kompjutera 286 20.2.2010 13:18
ASUS - AROT 2010 - pravila takmičenja (7.12.2009. do 5.1.2010.) Spacemaster Dešavanja i događaji 2 19.12.2009 22:40
Slušalice sa mikrofonom od 1000 do 1300 din donmarko ŠDK - Zvuk na računaru 12 26.8.2008 11:14


Sva vremena su po Griniču +2 h. Sada je 14:43.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com