|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
22.1.2011, 23:32 | #1 |
Član
|
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(); 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"); Poslednja ispravka: Bolton (22.1.2011 u 23:56) Razlog: actionscript update |
22.1.2011, 23:59 | #2 |
Član
Član od: 5.2.2009.
Poruke: 74
Zahvalnice: 14
Zahvaljeno 12 puta na 11 poruka
|
Re: do...while petlja sa 2 izraza (uslova)
Probaj da koristis while petlju, a ne do..while.
|
23.1.2011, 2:12 | #3 |
Član
|
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 } } Kod:
broj = nasumicanBroj.Next(20) + 1; |
23.1.2011, 10:42 | #4 |
Starosedelac
|
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(); } Poslednja ispravka: MG-RAY (23.1.2011 u 10:55) |
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci: | ||
Bolton (23.1.2011) |
23.1.2011, 12:33 | #5 |
Član
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
|
Re: do...while petlja sa 2 izraza (uslova)
|
23.1.2011, 15:12 | #6 | |
Član
|
Re: do...while petlja sa 2 izraza (uslova)
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:
U svakom slučaju hvala obojici na odgovorima. |
|
23.1.2011, 20:04 | #7 |
Član
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
|
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 .
|
Sledeći korisnik se zahvaljuje korisniku Todors na korisnoj poruci: | ||
MG-RAY (24.1.2011) |
24.1.2011, 12:36 | #8 | |
V.I.P. Programiranje
Član od: 9.1.2009.
Lokacija: Beograd, Banovo Brdo
Poruke: 1.157
Zahvalnice: 83
Zahvaljeno 448 puta na 303 poruka
|
Re: do...while petlja sa 2 izraza (uslova)
Citat:
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... |
|
24.1.2011, 16:41 | #9 |
Član
|
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.
|
Bookmarks sajtovi |
Alatke vezane za temu | |
Vrste prikaza | |
|
|
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 |