Forum » Programiranje » [Java] While zanka
[Java] While zanka
draciel ::
Imam to nalogo:
Tukaj sem jo rešil. Program sicer deluje. Vendar zanima me če je to sploh učinkovito za program. A bi se dalo ta program rešiti brez 3. while loopov?
/*Write an application that asks a user to type 1, 2, 3, or 4. When the user types 4, the program ends. When the user types 1, 2, or 3, the program displays the message “Good job!” and then asks for another input.When the user types anything else, the application issues an error message and then asks for another input.*/
Tukaj sem jo rešil. Program sicer deluje. Vendar zanima me če je to sploh učinkovito za program. A bi se dalo ta program rešiti brez 3. while loopov?
int userInput = Integer.parseInt(JOptionPane.showInputDialog("Type 1 , 2 , 3 to proceed or 4 to Exit")); while(userInput > 4 || userInput < 1) { JOptionPane.showMessageDialog(null, "Invalid input"); userInput = Integer.parseInt(JOptionPane.showInputDialog("Type another number: 1, 2, 3 to proceed or 4 to Exit")); } while(userInput > 0 && userInput < 4) { JOptionPane.showMessageDialog(null, "Good Job"); userInput = Integer.parseInt(JOptionPane.showInputDialog("Type another number: 1, 2, 3 to proceed or 4 to Exit")); while(userInput > 4 || userInput < 1) { JOptionPane.showMessageDialog(null, "Invalid input"); userInput = Integer.parseInt(JOptionPane.showInputDialog("Type another number: 1, 2, 3 to proceed or 4 to Exit"));
draciel ::
Jap, imaš prav. Nevem kako se nisem spomnil sam. Se mi zdi da manj kode kot to pa ne gre..
int userInput; do { userInput = Integer.parseInt(JOptionPane.showInputDialog("Type 1 , 2 , 3 to proceed or 4 to Exit")); switch(userInput) { case 1: JOptionPane.showMessageDialog(null, "Good Job"); break; case 2: JOptionPane.showMessageDialog(null, "Good Job");break; case 3: JOptionPane.showMessageDialog(null, "Good Job");break; case 4: break; default: JOptionPane.showMessageDialog(null, "Invalid input"); } } while((userInput > 0 && userInput < 4) || (userInput < 0 || userInput > 4));
mallard ::
int userInput; while (true) { userInput = Integer.parseInt(JOptionPane.showInputDialog("Type 1 , 2 , 3 to proceed or 4 to Exit")); if (userInput == 4) break; if (userInput >= 1 && userInput <= 3) JOptionPane.showMessageDialog(null, "Good Job"); else JOptionPane.showMessageDialog(null, "Invalid input"); }
Zgodovina sprememb…
- spremenilo: mallard ()
Mipe ::
Jap, imaš prav. Nevem kako se nisem spomnil sam. Se mi zdi da manj kode kot to pa ne gre..
boolean getawaytruck = false; while(!getAwayTruck) { userInput = Integer.parseInt(JOptionPane.showInputDialog("Type 1 , 2 , 3 to proceed or 4 to Exit")); if(userInput > 0 && userInput < 4) JOptionPane.showMessageDialog(null, "Good Job"); else if(userInput == 4) getAwayTruck = true; else JOptionPane.showMessageDialog(null, "Invalid input"); }
Zgodovina sprememb…
- spremenil: Mipe ()
mallard ::
Ali pa do { } while (userInput != 4); pri čemer prvi if stavek znotraj zanke izbrišeš.
Zgodovina sprememb…
- spremenilo: mallard ()
draciel ::
Imam problem. Spodnja koda mi vrže (Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(Unknown Source)
at Palindrome.main(Palindrome.java:20)) . Zakaj?
Sicer to je le prvi del kode vendar ( program ni končan ), vendar mi že tukaj vrže izjemo. Ne razumem zakaj. Včeraj sem delal na podobni kodi in je bilo vse ok.
Sicer piše da je charAt(unknown source). Kako zaboga je lahko unknown, saj sem poslal številko noter.
at java.lang.String.charAt(Unknown Source)
at Palindrome.main(Palindrome.java:20)) . Zakaj?
String input = JOptionPane.showInputDialog("Vnesi besedilo"); StringBuilder forward = new StringBuilder(""); StringBuilder backward = new StringBuilder(""); int f = 0; int b = input.length(); while(f < input.length()) { while(input.charAt(f) > 63) { forward.append(input.charAt(f)); f++; } f++; } System.out.println(forward);
Sicer to je le prvi del kode vendar ( program ni končan ), vendar mi že tukaj vrže izjemo. Ne razumem zakaj. Včeraj sem delal na podobni kodi in je bilo vse ok.
Sicer piše da je charAt(unknown source). Kako zaboga je lahko unknown, saj sem poslal številko noter.
Zgodovina sprememb…
- spremenil: draciel ()
draciel ::
Študiram in res mi ne potegne kaj bi lahko bilo narobe...
1. prvi while loop gre skozi besedilo ki ga uporabnik vpiše. Npr če je beseda "Luka", je v pogoju napisano tako:
Ne razumem kaj sem tu naredil narobe.
1. prvi while loop gre skozi besedilo ki ga uporabnik vpiše. Npr če je beseda "Luka", je v pogoju napisano tako:
0<4. Ker je 0 res manjše od 4. se izvrši koda v zvitih oklepajih. Nato sledi novi while ki vpraša: ali je črka, ki ima po unicode lestvici večjo vrednost od 63. Če nima, se koda preskoči in index se poveča. Nato gre spet od začetka. Če je vrednost večja sledi nova izvršba kode v zavitih oklepajih. Se pravi dokler bo vrednost večja od 63 , bo konstantno dodajalo črke v forward referenco, dokler pač ne zmanjka črk oz. bo index manjši od dolžine besede.
Ne razumem kaj sem tu naredil narobe.
draciel ::
Zgleda, da sedaj deluje. Spremenjena koda:
Sam nimam pojma zakaj ni delalo že s prejšnjo kodo. Včeraj sem imel tako kodo in je delovalo ( delček kode kopiram )
Program je deloval perfektno. Zakaj danes ni ?
while(f < input.length()) { if(input.charAt(f) > 63) { forward.append(input.charAt(f)); } f++; }
Sam nimam pojma zakaj ni delalo že s prejšnjo kodo. Včeraj sem imel tako kodo in je delovalo ( delček kode kopiram )
while(index < phrase.length()) { while(phrase.charAt(index) <= 63) { index++; if(phrase.charAt(index) > 63) { acronym.append(phrase.charAt(index)); }
Program je deloval perfektno. Zakaj danes ni ?
draciel ::
Hmm, očitno zadevi še nisem prišel do dna! A mi lahko kdo razloži zakaj ta koda deluje perfektno!
Ta, ki je pa ISTA , vendar gre samo v obratni smeri pa vrže EXCEPTION napisan zgoraj!!
Prosim, nekdo?
while(x < name.length()) { if(name.charAt(x) > 63) { System.out.println("Večji je od 63 "+x); } x++; }
Ta, ki je pa ISTA , vendar gre samo v obratni smeri pa vrže EXCEPTION napisan zgoraj!!
int b = name.length(); while(b > 0) { if(name.charAt(b) > 63) { System.out.println("Večji je od 63 "+b); } b--; }
Prosim, nekdo?
Zgodovina sprememb…
- spremenil: draciel ()
PaX_MaN ::
Iz docs za String:
Returns the character at the specified index. An index ranges from 0 to length() - 1.
[...]
Throws:
IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string.
draciel ::
Iz docs za String:
Returns the character at the specified index. An index ranges from 0 to length() - 1.
[...]
Throws:
IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string.
You saved the day! Hvala ti 1000X. Zej pa zadeva deluje kot mora. Evo popravek..
int b = name.length() - 1; // To je popravek, se pravi: name.length ( dolzina besede ) - 1 while(b > 0) { if(name.charAt(b) > 63) { System.out.println("Večji je od 63 "+b); } b--; }
kunigunda ::
A ni bolj prijazno kar tkole ?
Object[] moznosti = {"1-Ok", "2-Tud ok", "3-Se vedno ok", "4-Exit"};
userInput = Integer.parseInt(JOptionPane.showInputDialog(frm,"Izberi","Izbira",JOptionPane.PLAIN_MESSAGE,null,moznosti).substring(1,1));
Object[] moznosti = {"1-Ok", "2-Tud ok", "3-Se vedno ok", "4-Exit"};
userInput = Integer.parseInt(JOptionPane.showInputDialog(frm,"Izberi","Izbira",JOptionPane.PLAIN_MESSAGE,null,moznosti).substring(1,1));
KaRkY ::
@darciel v prvi kodi si imel problem z notranjo while zanko. Ti si števec povečeval če je znak večji od 63 to pomeni da če je zadnji znak bil večji od 63 ti je šlo čez mejo. Če v prvo kodo v notranjo zanko dodaš še pogoj če je index manjši od dolžine bi morala delati. Vem da si že rešil problem samo pač tako da veš.
When you look long into an abyss, the abyss looks into you
draciel ::
Jaz nevem kaj imam neke čudne probleme s temi while loopi. Razumem jih vendar očitno ne dovolj. Sedaj mi prosim povejte. A je mogoče da se - do , while loop NE izvrši, če while loop popolnoma ne ustreza pogojem. Stvari postajajo vse bolj čudne. Kopiram delček kode:
Ne bom vas moril s celo kodo. Vendar, sedaj me nekaj zanima. Ta do-while se bo vršil vse dokler bo numCount 0, ter numChar 0. A imam prav? Se pravi OBA pogoja morata biti izpolnjena, da se koda NE izvrši. A imam prav? Se pravi numCount mora biti vsaj 1 IN numChar mora biti vsaj 1. Imam prav?
Problem je ker se mi koda NE izvrši tudi če je ali ena spremenljivka 0 ali druga. Kako vem da niso 0?
Ker imam na koncu output, ki mi pokaže vrednost obeh spremenljivk. In tudi če je ena izmed njih 0, mi pokaže output, brez da bi še enkrat izvršilo kodo.
A sem tako neumen?
int numCount = 0; int charCount = 0; do { // tukaj je nekaj kode, ki mora povečati numCount in charCount. } while(numCount == 0 && charCount == 0);
Ne bom vas moril s celo kodo. Vendar, sedaj me nekaj zanima. Ta do-while se bo vršil vse dokler bo numCount 0, ter numChar 0. A imam prav? Se pravi OBA pogoja morata biti izpolnjena, da se koda NE izvrši. A imam prav? Se pravi numCount mora biti vsaj 1 IN numChar mora biti vsaj 1. Imam prav?
Problem je ker se mi koda NE izvrši tudi če je ali ena spremenljivka 0 ali druga. Kako vem da niso 0?
Ker imam na koncu output, ki mi pokaže vrednost obeh spremenljivk. In tudi če je ena izmed njih 0, mi pokaže output, brez da bi še enkrat izvršilo kodo.
A sem tako neumen?
genesiss ::
&& je logični AND, deluje tako:
TRUE && TRUE -> TRUE
TRUE && FALSE -> FALSE
FALSE && TRUE -> FALSE
FALSE && FALSE -> FALSE
Torej če ena izmed spremenljivk ni enaka 0 izstopiš iz zanke.
TRUE && TRUE -> TRUE
TRUE && FALSE -> FALSE
FALSE && TRUE -> FALSE
FALSE && FALSE -> FALSE
Torej če ena izmed spremenljivk ni enaka 0 izstopiš iz zanke.
mallard ::
int numCount = 0;
int charCount = 0;
do {
} while(numCount == 0 && charCount == 0);
Ta do-while se bo vršil vse dokler bo numCount 0, ter numChar 0. A imam prav?
Do-while zanka se be izvršila vsaj enkrat, tudi če pogoj ni izpolnjen.
Se pravi OBA pogoja morata biti izpolnjena, da se koda NE izvrši. A imam prav? Se pravi numCount mora biti vsaj 1 IN numChar mora biti vsaj 1. Imam prav?
Hm, ne. Tvoja zanka se prekine, če eden ali nobeden od pogojev ni izpolnjen. Logični ali ter logični in v Javi ne ovrednotita desnega operanda, če je že po levem jasno da pogoj ne bo izpoljnen (glej Short-circuit evaluation @ Wikipedia) (kako temu rečejo v slovenščini, kdo ve?) Torej, če je numCount drugačen od nič, prevajalnik charCounta sploh ne pogleda, ker skupen izraz ne more biti true.
Problem je ker se mi koda NE izvrši tudi če je ali ena spremenljivka 0 ali druga. Kako vem da niso 0?
Ker imam na koncu output, ki mi pokaže vrednost obeh spremenljivk. In tudi če je ena izmed njih 0, mi pokaže output, brez da bi še enkrat izvršilo kodo.
A sem tako neumen?
Kot že rečeno, pogoj da se tvoja zanka izvrši je "numCount je enak nič IN charCount je enak nič". Če hočeš, da se ti izvrši ko je vsaj eden nič, reci do {} while (pogoj1 == 0 || pogoj2 == 0).
Spura ::
Ta do-while se bo vršil vse dokler bo numCount 0, ter numChar 0. A imam prav?Da.
Se pravi OBA pogoja morata biti izpolnjena, da se koda NE izvrši. A imam prav? Se pravi numCount mora biti vsaj 1 IN numChar mora biti vsaj 1. Imam prav?
Ne. Ce je pogoj izpoljnjen skoci na DO, torej izvrsi se naslednja iteracija. Ce je katera spremenljivka nenicelna je pogoj false in se loop konca.
Stvar ki je v oklepaju zravn while je EN POGOJ. To je en izraz, ki ima eno boolean vrednost. Ce bos razmisljal o teh stvareh kot o vecih pogojih ce imajo || ali && se bos zelo hitro zapletel.
Zgodovina sprememb…
- spremenil: Spura ()
draciel ::
Hvala fantje. Sem rešil zadevo z || ali operatorjem. Zadeva sedaj deluje. Imel sem pa še naslednji problem ker mi zadeva še vedno ni delovala pravilno ker sem vedno ko se je ponovil loop sem spremenljivkam vedno dodajal vrednost. Tako da če sem v obrazec prvo vpisal samo črke ni šlo naprej. Je pa seštelo tiste črke. Naslednjič ko sem ponovil in sem vpisal samo številke se koda ni več izvršila, zato ker je pač zaznalo da sem že napisal črke in številke v obrazec. No zadevo sem na koncu rešil s tem da sem na začetek '' do '' postavil obe spremenljivki v začetno vrednost ( 0 ).
Cilj programa je pa pač da preveri če uporabnik vpiše vsaj eno številko ter eno črko v obrazec za geslo. Če kateri od pogojev ni izpolnjen vpraša še enkrat in to ponavlja dokler uporabnik ne vnese v obrazec vsaj ene črke ter ene številke.
Hvala vam še enkrat za razjasnitev :)
Cilj programa je pa pač da preveri če uporabnik vpiše vsaj eno številko ter eno črko v obrazec za geslo. Če kateri od pogojev ni izpolnjen vpraša še enkrat in to ponavlja dokler uporabnik ne vnese v obrazec vsaj ene črke ter ene številke.
Hvala vam še enkrat za razjasnitev :)
kunigunda ::
To lohk tud drgac nardis
String s="Moje1geslo123";
if (s.matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{6,}$")) {
// Geslo se zacne z veliko zacetnico, in ima notri potem vsaj eno crko ali stevilko, in vsaj 6 mest dolgo
}
String s="Moje1geslo123";
if (s.matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{6,}$")) {
// Geslo se zacne z veliko zacetnico, in ima notri potem vsaj eno crko ali stevilko, in vsaj 6 mest dolgo
}
Spura ::
Ja, sej je sam pocasno kot svinja, zakomplicirano in niti ne dela tega (zahteva, da geslo vsebuje veliko crko nekje). Worst use case za regex.
kunigunda ::
Ah prehitr pisu, un .* na zacetku je treba umaknt.
if (s.matches("^(?=[A-Z])(?=.*[a-z])(?=.*[0-9]).{6,}$")) {
Pocasno ? 49milisekund za 10,000 klicev ? Niti ne.
if (s.matches("^(?=[A-Z])(?=.*[a-z])(?=.*[0-9]).{6,}$")) {
Pocasno ? 49milisekund za 10,000 klicev ? Niti ne.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Java @OverrideOddelek: Programiranje | 791 (656) | kretze |
» | Java skeniranje map in podmapOddelek: Programiranje | 1148 (1037) | nightrage |
» | [java] naloge za vajoOddelek: Programiranje | 1369 (1055) | Yacked2 |
» | java net beans pomočOddelek: Programiranje | 1599 (1487) | i33a |
» | Java in pošiljanje elektronske pošte!!Oddelek: Programiranje | 1353 (1254) | janez_janez |