Javában hogyan tudom ezt megcsinálni?
Le kell ellenőriznem, hogy megfelelő számot válaszottak-e. 1, 2, 3 és 9es számot lehet választani, ha rossz számít ír be a terminálba akkor újra kell kérdeznem.
do whilelal akartam megoldani, de még nem használtam ezért nem értem mit rontok el. Valaki letudja írni helyesen vagy hogy mit kéne használnom.
do {
System.out.println("Select an option:");
userInput = sc.nextInt();
System.out.println(userInput);
} while (userInput != 1 || userInput != 2 || userInput != 3 || userInput != 9);
if (userInput == 9){
run = false;
}
Gondolom az a probléma hogy a ha pl.: 2-t ad a felhasználó akkor az nem lesz egyenlő 1-el meg többi számmal így örökké menni a fog a while. Hogyan oldanátok meg elegánsan? Egy plusz methoddal ami vissza ad egy boolean-t?
do {
System.out.println("Select an option:");
userInput = sc.nextInt();
System.out.println(userInput);
} while (isvalid(userInput));
if (userInput == 9){
run = false;
}
public boolean isvalid(int userInput){
boolean isValid = true;
if (userInput == 1){
isValid = false;
} else if (userInput == 2){
isValid = false;
} else if (userInput == 3){
isValid = false;
} else if (userInput == 9){
isValid = false;
}
return isValid;
}
Ezzel megoldottam, de olyan rondának nézki meglehet jobban oldani?
Az első kóddal az volt a gond, hogy || műveleteket használtál, tehát a while(a || b || c || d) azt jelentette, hogy amíg FENNÁLL az, hogy 'a', vagy hogy 'b', vagy hogy 'c', vagy hogy 'd', addig folytassa a ciklust. Tehát a ciklusod csak akkor lépett volna ki, ha a beolvasott érték egyszerre 1,2,3 és 9 is. Ez nyilván lehetetlen :D
Most hogy külön függvénybe kiszervezted még mindig fennáll az a probléma, hogy totál meg van fordítva a logika. Az IsValid függvénynek akkor kéne false-ot visszaadnia, amikor NEM érvényes értéket kap, és a ciklusnak addig kéne mennie, amíg fennáll, hogy NEM IsValid. (Ezt jegyezd meg, a WHILE ciklusfeltételt úgy értelmezzük, hogy "amíg fennáll, hogy")
Tehát első lépés a while-ban megfordítani a feltételt. Utána megfordítani a függvény kiértékelését, hogy akkor legyen true, ha 1,2,3 vagy 9 jön paraméterül. Egyben össze is vonhatjuk a sok if-et egyetlen kifejezésbe:
if(userInput == 1 || userInput == 2 || userInput == 3 || userInput == 9)
return true;
Vagy rögtön vissza is adhatod a logikai kiértékelés eredményét:
return (userInput == 1 || userInput == 2 || userInput ==3 || userInput == 4);
Használj tömböket, valahogy így:
int promptOption() {
int[] validOptions = new int[] {1, 2, 3, 9};
int option;
do {
option = sc.nextInt();
} while (!Arrays.toList(validOptions).contains(option));
return option;
}
#6 Egyrészt tömbök és a contains függvény használatával jóval érthetőbb kódot ír, másrészt karbantarthatóbb is az eredmény, harmadrészt pedig "élesben" inkább fog ezzel a formával találkozni.
Teljesen felesleges olvashatatlan feltételek tömegével megszórni a kódot, amikor vannak rá jóval olvashatóbb és karbatarthatóbb megoldások. Tegyük hozzá, hogy minnél egyszerűbb a feltétel, annál könnyebb megértenie és tovább lépnie. Márpedig azt vizsgálni, hogy "tartalmaz/nem tartalmaz" még mindig sokkal egyszerűbb, mint egyesével explicit megvizsgálni az értékeket.
"Plusz ezzel átugorjuk a logikai kifejezések írását, amiben a kérdezőnek láthatóan vannak hiányosságai."
TOvábbra is kitartok amellett, amit mondtam.
#8 Értem, amit mondasz, hogy gyakorlat teszi a mestert, csak én meg marha sok olyan esettel találkoztam, amikor a delikvensnek rögzült ez a fajta kódolási módszer (ti. hogy egymás után hány repetitiív módon kódokat), azt alkalmazta "élesben" is, és olyan ocsmány kódot hagyott maga után, hogy az ember szálanként tépi tőle a haját.
Messzebbre jut szerintem, ha nem így gyakorolja a feltételek megfogalmazását, hanem úgy, ha értelme is van annak, amit csinál, és nem csak gányol.
#9 Én meg picit a másik oldalról nézem a dolgot, millió olyan kódot láttam már, hogy egy programozó anynira el van szállva a beépített függvényekkel, hogy szabályosan megtöbbszörözi a program futási idejét, mert szó szerint mindenre valami beépített cuccmákot hív meg, bele se gondolva, hogy mennyi fölösleges mukát végez emaitt a háttérben a program.
Hogy egy hasonlattal éljek, Petike le akar ugrani a két sarokra levő boltba, ezért elsétál a buszmegállóba ami ott van 10 méterre a házától, felszáll a buszra, tesz vele egy teljes kört, hogy végül a bolt előtt levő megállóban leszálljon róla. AZtán hazafelé természetesen megvárja a következő buszt hogy azon az 50 méteren elvigye. NAgyon sok ilyen programozóval találkoztam, aki csak azt látja, hogy milyen hosszú a kód amit írt, és milyen egyszerű olvasni, de abba nem gondol bele, hogy a rövidke kis kód mögött milyen algoritmusok mozognak, és mennyi fölösleges munkát végez vele.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!