» »

[Java] While zanka

[Java] While zanka

draciel ::

Imam to nalogo:

/*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")); 

mgermo ::

Do while in switch case?

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 ::

draciel je izjavil:

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 ()

Mipe ::

Ja, je veliko načinov :)

draciel ::

Jih je ja. Mipe je pogruntal še najlažjega :D

Mipe ::

Nedelujočega, sem na hitro natipkal in se imena spremenljivk ne ujemajo :P

draciel ::

Vem sem opazu, ma sem razumel kaj hočeš povedati XD

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?

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:
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:

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!

		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 ::

PaX_MaN je izjavil:

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));

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 ::

Hvala Karky. Vsak nasvet mi pride zelo prav.

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:


 

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.

mallard ::

draciel je izjavil:


 
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.

draciel je izjavil:


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.

draciel je izjavil:


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 ::

draciel je izjavil:

Ta do-while se bo vršil vse dokler bo numCount 0, ter numChar 0. A imam prav?
Da.

draciel je izjavil:


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 :)

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
}

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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Java @Override

Oddelek: Programiranje
6712 (577) kretze
»

Java skeniranje map in podmap

Oddelek: Programiranje
61068 (957) nightrage
»

[java] naloge za vajo

Oddelek: Programiranje
71246 (932) Yacked2
»

java net beans pomoč

Oddelek: Programiranje
121485 (1373) i33a
»

Java in pošiljanje elektronske pošte!!

Oddelek: Programiranje
51277 (1178) janez_janez

Več podobnih tem