Permalänk
Medlem

Java switch statements

Hejsan!

Jag ska skriva ett program där användare ska kunna göra 4 val (1. sätta in pengar, 2. ta ut pengar, 3. kontoinformation, 4. avsluta).

Då jag skrivit en del if, else-if osv så tänkte jag att en switch-sats på detta kunde vara kul.

Jag skrev allt i switch och la en do-while runtom ifall användaren skulle mata in något annat nummer än 1-4. So far so good.

Problemet kom när jag skulle räkna ihop saldot, dvs differensen mellan insättning och uttag. Kan man räkna i en switch-sats, och i så fall hur?

Tack för hjälpen

Permalänk
Medlem
Skrivet av JJ72:

Hejsan!

Jag ska skriva ett program där användare ska kunna göra 4 val (1. sätta in pengar, 2. ta ut pengar, 3. kontoinformation, 4. avsluta).

Då jag skrivit en del if, else-if osv så tänkte jag att en switch-sats på detta kunde vara kul.

Jag skrev allt i switch och la en do-while runtom ifall användaren skulle mata in något annat nummer än 1-4. So far so good.

Problemet kom när jag skulle räkna ihop saldot, dvs differensen mellan insättning och uttag. Kan man räkna i en switch-sats, och i så fall hur?

Tack för hjälpen

Det finns inga begränsningar på vad du kan ha i själva sats-biten av en switch case; villkoret är däremot [väldigt] begränsat i Java. För din del spelar det ingen roll då du bara är ute efter vilken siffra användaren har valt.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Ok..... förslag på hur jag ska räkna ut saldot?

import java.util.Scanner; public class KontoT { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int choice, saldo, withdrawal, deposit; do{ System.out.println("Vad vill du göra? "); System.out.println("1. Insättning \n2. Uttag \n3. Kontoinformation \n4. Avsluta"); choice = scan.nextInt(); switch (choice){ case 1: System.out.println("Insättning"); System.out.println("\n Vänligen mata in belopp ni vill sätta in: "); deposit = scan.nextInt(); break; case 2: System.out.println("Uttag"); System.out.println("\n Vänligen mata in belopp ni vill ta ut: "); withdrawal = scan.nextInt(); break; case 3: System.out.println("Kontoinformation"); break; case 4: System.out.println("Avsluta"); break; default: System.out.println("Fel inmatning"); break; } }while(choice < 1 || choice > 4); } }

Det funkade inte med något så enkelt som saldo = deposit - withdrawal

Permalänk
Medlem

Kom ihåg att deposit och withdraw innehåller den senaste referensen av värdet som har tilldelats. Saldot = withdraw - deposit funkar utmärkt om koden kör varje switch statement max 1 gång. Men om du exempelvis skulle köra deposit fler gånger skrivs värdet i deposit över varje gång det körs.

Försök tänka ut ett sätt där du vill göra totalbeloppet av withdraw - totalbeloppet av deposit = saldot.

Permalänk
Medlem

Ok... nu var jag nog inte så smart. Hehe

Jag tänkte ge användaren 1000 kr att börja med.

int saldo = 1000;
int newSaldo = 0;

case 1:
insättning
newSaldo = saldo + insättning;

case 2:
uttag
newSaldo = saldo - uttag;

print newSaldo

Tack för hjälpen

Permalänk

@JJ72:
Vad jag skulle göra är att uppdatera saldot asap så det alltid är uppdaterat.
Då behöver du inte göra det senare med problematiken att det kan vara flera uttag/insättningar som behöver räknas ihop.

Edit:
Varför använda newSaldo istället för saldo?
Gör du ett uttag och en insättning försvinner uttaget från newSaldo

Permalänk
Medlem

Som robertlindgren82 skriver, använder du newSaldo kommer du bara kunna köra programmets switch satser 1 gång. körs exempelvis deposit 2 gånger kommer newsaldo skriva över det gamla värdet. Däremot använder du saldo igen (saldo = saldo +/- deposit/withdraw) så kan du köra deposit/withdraw tills användaren bestämmer sig att avsluta programmet.

För övrigt kan följande kod skrivas om, om du önskar. saldo = saldo +/- variabel kan skrivas om till saldo += variabel respektive saldo -= variabel.

Permalänk
Medlem

Jag bugar och bockar för den hjälpen.

Det verkar inte riktigt som att min hjärna hängt med så bra idag. haha

Kul att få lite annan input så att man lär sig något

Permalänk

@JJ72:
Programmet ska krashas i fall av fel inmatning, dvs att om användare inmatar värde av fel datatyp.
Tror du att det är bara int som användare (lr lärare) ska inmata ?
Åtminstone hasNextInt() innan nextInt() bör användas, IMHO
Helt enkelt, if- loop med hasNextInt, return i fall av false.
Prova

Permalänk
Hedersmedlem
Skrivet av Nicknickname:

@JJ72:
Programmet ska krashas i fall av fel inmatning, dvs att om användare inmatar värde av fel datatyp.
Tror du att det är bara int som användare (lr lärare) ska inmata ?
Åtminstone hasNextInt() innan nextInt() bör användas, IMHO
Helt enkelt, if- loop med hasNextInt, return i fall av false.
Prova

Sån mjukvara skulle jag inte vilja använda. Går till en bankomat(till exempel), råkar trycka på en olämplig knapp och maskinen bara brakar ihop?

Fel inmatning av användaren är absolut ett fall man kan hantera utan att "krascha" programmet. Det går till exempel att uppmana användaren om vilken input som är lämplig.

Permalänk

@Shimonu:

Det är ditt val

Dock programmet som skriver topicstarter är ju definitivt Javauppgift, som körs i JVM på datorn.
Titta oxå på Scanner, det är System.in som användas för inmatning - tangenmtbord användas alltså.
Tror du att ATM knappar och dator tangentbord är samma sak ?
ATM användare är begransad med 10 knappar bara, men inte dator användare.
Ide att begränsa felhantering med "... att uppmana användaren om vilken input som är lämplig" är lite konstigt för programmeraring, IMHO.
Om du föreslår att "... att uppmana användaren om vilken input som är lämplig" i fall av Exception , det skev jag om return i fall av hasNextInt() "säger" att inga int finns. Ny inmatning i do- while komer alltså. Det går att skriva om vilken input som är lämplig innan return oxå.

Just titta på det, det är resultatet :

Vad vill du göra?
1. Insättning
2. Uttag
3. Kontoinformation
4. Avsluta

u

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Test.main(Test.java:12)

Permalänk
Hedersmedlem
Skrivet av Nicknickname:

@Shimonu:

Det är ditt val

Dock programmet som skriver topicstarter är ju definitivt Javauppgift, som körs i JVM på datorn.
Titta oxå på Scanner, det är System.in som användas för inmatning - tangenmtbord användas alltså.
Tror du att ATM knappar och dator tangentbord är samma sak ?
ATM användare är begransad med 10 knappar bara, men inte dator användare.
Ide att begränsa felhantering med "... att uppmana användaren om vilken input som är lämplig" är lite konstigt för programmeraring, IMHO.
Om du föreslår att "... att uppmana användaren om vilken input som är lämplig" i fall av Exception , det skev jag om return i fall av hasNextInt() "säger" att inga int finns. Ny inmatning i do- while komer alltså. Det går att skriva om vilken input som är lämplig innan return oxå.

Just titta på det, det är resultatet :

Vad vill du göra?
1. Insättning
2. Uttag
3. Kontoinformation
4. Avsluta

u

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Test.main(Test.java:12)

Min grundpoäng är att inmatning ska vara idiotsäkert. En apa ska kunna banka på inmatningsdonet utan att få programmet att krascha. Det kan hamna i udda tillstånd men inte ska programmet sluta exekveras för att det kom fel tecken som input. Det är ju extremt frustrerande som användare att behöva starta om ett program för att man träffade 'T' istället för 5. Sen om du vill göra det med Exception och fånga det så kan det såklart vara ett alternativ.

Permalänk
Skrivet av Shimonu:

Min grundpoäng är att inmatning ska vara idiotsäkert. En apa ska kunna banka på inmatningsdonet utan att få programmet att krascha. Det kan hamna i udda tillstånd men inte ska programmet sluta exekveras för att det kom fel tecken som input. Det är ju extremt frustrerande som användare att behöva starta om ett program för att man träffade 'T' istället för 5. Sen om du vill göra det med Exception och fånga det så kan det såklart vara ett alternativ.

Det funkar att hantera InputMismatchException som alternativ till hasNextInt(), absolut !

Scanner har dock sina speciella inbyggda metoder för dessa situationer, då tror jag att det är smidigt sätt att bygga "idiotsäkert" inmatning. Det är ju bättre från optimiserings synpunkt, eller hur ?

Tror att TS ska utöka sitt program på ngt av övanstående sätt

Permalänk

@Shimonu:

Tror, som sagt, att TS löser uppgift. Det är bra ide kanske att skapa alla program (även övningar) ordentligt från början ?
Enkelt felhantering med en och enda if-sats är inte "idiotssäket" i detta fall.

Permalänk
Hedersmedlem
Skrivet av Nicknickname:

Det funkar att hantera InputMismatchException som alternativ till hasNextInt(), absolut !

Scanner har dock sina speciella inbyggda metoder för dessa situationer, då tror jag att det är smidigt sätt att bygga "idiotsäkert" inmatning. Det är ju bättre från optimiserings synpunkt, eller hur ?

Tror att TS ska utöka sitt program på ngt av övanstående sätt

Jag är oklar på om du fortfarande tycker det är okej att låta programmet kasta exception som ingen fångar bara för att det är fel input? Jag ska erkänna att jag har väldigt lite erfarenhet av Java mer än de kurser som man råkade stöta på i universitetskurser. Språket är dock skitsamma, programmet ska inte krascha av fel format på inmatningen.

Rent generellt tycker jag exception endast ska kastas då programmet hamnat i ett tillstånd som är oväntat och man inte kan vara förberedd på att ta sig ur. Rätt mycket kan gå att hantera(beroende på tillämpning), det ska ha gått väldigt fel innan det behövs ett exception.

Permalänk
Hedersmedlem
Skrivet av Nicknickname:

@Shimonu:

Tror, som sagt, att TS löser uppgift. Det är bra ide kanske att skapa alla program (även övningar) ordentligt från början ?
Enkelt felhantering med en och enda if-sats är inte "idiotssäket" i detta fall.

Osäker på vad du försöker förmedla här. Nej, det är inte jätteviktigt för TS att sköta all felhantering i en skoluppgift om det inte efterfrågas. Man behöver däremot inte leda in något på ett konstigt spår för det.

Permalänk
Skrivet av Shimonu:

Osäker på vad du försöker förmedla här. Nej, det är inte jätteviktigt för TS att sköta all felhantering i en skoluppgift om det inte efterfrågas. Man behöver däremot inte leda in något på ett konstigt spår för det.

Vill inte börja "hollywar", dock förklarar mina synpunkt.
Du som moderator kan ju skapa ny tråd, tex "Säkert inmatning" lr "hasNext() vs Exception" typ, om det blir flood här.

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.h...

"... As another example, this code allows long types to be assigned from entries in a file myNumbers:

Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
long aLong = sc.nextLong();
}
..."

Smidigt sätt att välja typ som behövs, passar till int hur bra som helst. Då tycker jag att detta sätt är ännu smidigare än undantagshantering.

Mitt råd gäller till TS programmet. Det krashas vid felinmatning, du kan kompilera och köra själv. Då tror jag att mitt råd ska bli nyttig.

I alla fall, att träna sig att skriva klumpiga program som krashas vid fel inmatning är inte världens bästa ide

Hoppas att ngn av Java proffs kan säga ngnting ? Är mitt råd till TS att använda hasNextInt () är dåligt ?

PS. Om TS behov kom på tal, då kan han svara själv Det är ju inte du lr jag som är hans lärare

Permalänk
Skrivet av Shimonu:

Jag är oklar på om du fortfarande tycker det är okej att låta programmet kasta exception som ingen fångar bara för att det är fel input? Jag ska erkänna att jag har väldigt lite erfarenhet av Java mer än de kurser som man råkade stöta på i universitetskurser. Språket är dock skitsamma, programmet ska inte krascha av fel format på inmatningen.

Rent generellt tycker jag exception endast ska kastas då programmet hamnat i ett tillstånd som är oväntat och man inte kan vara förberedd på att ta sig ur. Rätt mycket kan gå att hantera(beroende på tillämpning), det ska ha gått väldigt fel innan det behövs ett exception.

Nu förstår jag inte vad du menar. Jag ger råd om ytterliggare inbyggda Scanner method, då det är bra sätt att undvika programmets krash !

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.h...

Vart säger jag att "det är okej att låta programmet kasta exception som ingen fångar " ?
Precis tvärtom, om du använder hasNextInt() innan nextInt() , ingen undantag kommer att kastas.

Permalänk
Hedersmedlem
Skrivet av Nicknickname:

Vill inte börja "hollywar", dock förklarar mina synpunkt.
Du som moderator kan ju skapa ny tråd, tex "Säkert inmatning" lr "hasNext() vs Exception" typ, om det blir flood här.

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.h...

"... As another example, this code allows long types to be assigned from entries in a file myNumbers:

Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
long aLong = sc.nextLong();
}
..."

Smidigt sätt att välja typ som behövs, passar till int hur bra som helst. Då tycker jag att detta sätt är ännu smidigare än undantagshantering.

Mitt råd gäller till TS programmet. Det krashas vid felinmatning, du kan kompilera och köra själv. Då tror jag att mitt råd ska bli nyttig.

I alla fall, att träna sig att skriva klumpiga program som krashas vid fel inmatning är inte världens bästa ide

Hoppas att ngn av Java proffs kan säga ngnting ? Är mitt råd till TS att använda hasNextInt () är dåligt ?

PS. Om TS behov kom på tal, då kan han svara själv Det är ju inte du lr jag som är hans lärare

Jag kanske hängde upp mig på den här meningen du skrev.

Citat:

Programmet ska krashas i fall av fel inmatning, dvs att om användare inmatar värde av fel datatyp.

Här låter det som du uppmanar att programmet ska krascha vid fel inmatning medan du nu säger att det ska hanteras.

Permalänk
Medlem

Wow!

Ok, så här är det i just min situation:

Enligt den nybörjarkurs jag går så är det än så länge ok om programmet krachar.

Personligen kommer jag ju att försöka skriva så mycket som möjligt UTAN att det krachar. Visst, det kanske är överkurs men jag går den här kursen enbart för min egen skull. Dvs jag behöver inga extra högskolepoäng eller något sådant.

Jag uppskattar dock ert engagemang, men jag vill inte skapa osämja av min fråga

Tack ska ni ha för era input. Jag kommer se vad jag kan använda från er båda (jag är som sagt en newbie, så vi får se vad jag klarar).

Permalänk
Skrivet av Shimonu:

Jag kanske hängde upp mig på den här meningen du skrev.

Här låter det som du uppmanar att programmet ska krascha vid fel inmatning medan du nu säger att det ska hanteras.

Nu förstår jag varför vi förstår inte varandra
När skrev jag att "programmet ska krahas " menade jag "programmet krashas i framtiden " , inte att "programmet måste krashas "

ska [ska: el. sk:'al] verb
〈ska, skulle, skolat, skola〉
komma att
(anger framtid)

den är betydelse som menar jag

ska [ska:] verb
〈ska, skulle, skolat, skola〉
vara tvungen; måste
(anger plikt eller nödvändighet)

och den är din

Nästa gång SKA jag kanshe använda engelska för inlägg, Hahaha

TS, hoppas att du får ngt nyttig iaf !!!

Permalänk
Medlem

Haha

Semantik....

Absolut. Ni ska ha väldigt mycket tack