Permalänk

Hjälp med java programering

Hej håller på att läsa programmering a på komvux det är då java språket jag läser.
men nu har jag fassnat helt, hjärnsläpp till max!! skulle bli super glad om någon vänlig själ skulle vilja hjälpa mig lite på vägen!

Uppgiften jag håller på med lyder såhär:
För att vid en deklaration få göra avdrag för dubbel bosättning krävs det att avståndet till arbetet överstiger 50 km och att arbetet vara högst ett år för ensamstående och tre år för sammanboende. Konstruera ett program som låter användaren mata in aktuella data och som meddelar om användaren har rätt till ett skatteavdrag eller inte.

jag har ändrat i koden så mycket nu så den blivigt så rörig, men här är vad jag lyckats få ihop, fungerar inte alls som jag vill =(

//Skatteavdrag public class Uppgift62{ public static void main(String[] args){ char svar = 'n'; System.out.print("Hur km har du till jobbet?"); int km = Keyboard.readInt(); if (km > 50){ System.out.print("Är du ensamstående (j/n)? "); char svar = Keyboard.readChar(); } if (svar == 'n') System.out.print("Vara arbetet över tre år (j/n)? "); char svar1 = Keyboard.readChar(); if (svar1 == 'n') System.out.print("Du får skatteavdrag!"); else if (svar1 == 'j') System.out.print("Du får inte skatteavdrag!"); if (svar == 'j'){ System.out.print("Vara arbetet över ett år (j/n)? "); char svar2 = Keyboard.readChar(); } if (svar2 == 'n') System.out.print("Du får skatteavdrag!"); else if (svar2 == 'j') System.out.print("Du får inte skatteavdrag!"); if (km <= 50){ System.out.print("Du får inte skatteavdrag!"); } } }

Permalänk
Hedersmedlem

if (svar == 'n') System.out.print("Vara arbetet över tre år (j/n)? "); char svar1 = Keyboard.readChar();

Du måste bädda in båda uttrycken inom måsvingar. Som det är där så kommer frågan skrivas ut bara om svar == 'n' men du kommer oavsett läsa in en ny char till svar1.

Och jag ser att du behöver tänka på räckvidder av variabler (scopes). Variablerna 'svar1' (när du rättat den) och 'svar2' försvinner när slutmåsvingen kommer i if-satsen. Du får göra likt för 'svar' att deklarera den först utanför (du kan låta den vara tom), sen tilldela till dem inne i if-satserna.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk

så menar du?

if (km > 50){ System.out.print("Är du ensamstående (j/n)? "); char svar = Keyboard.readChar(); if (svar == 'n') System.out.print("Vara arbetet över tre år (j/n)? "); char svar1 = Keyboard.readChar(); }

men då får jag massa error med cannot find symbol med svar1 2 etc.
känner mig helt lost, enda uppgiften jag har kvar på kapitel 6 med så borde ju få det till o gå. men jusst nu står det still...

Permalänk
Hedersmedlem

"cannot find symbol" är det jag beror på det jag berättar om i min edit på förra inlägget.
Det är även logiska fel i vad du försöker åstadkomma, ska formulera ihop det strax.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Hedersmedlem

För att göra det mer läsbart så har jag gjort om det vad jag föreslog i förrförra inlägget (använd måsvingar och ha rätt scope på variablerna. Och uniform indentering. Då blir det så här:

public class Uppgift62{ public static void main(String[] args){ char svar, svar1, svar2; System.out.print("Hur km har du till jobbet?"); int km = Keyboard.readInt(); if (km > 50){ System.out.print("Är du ensamstående (j/n)? "); svar = Keyboard.readChar(); } if (svar == 'n'){ System.out.print("Vara arbetet över tre år (j/n)? "); svar1 = Keyboard.readChar(); } if (svar1 == 'n'){ System.out.print("Du får skatteavdrag!"); } else if (svar1 == 'j'){ System.out.print("Du får inte skatteavdrag!"); } if (svar == 'j'){ System.out.print("Vara arbetet över ett år (j/n)? "); svar2 = Keyboard.readChar(); } if (svar2 == 'n'){ System.out.print("Du får skatteavdrag!"); } else if (svar2 == 'j') { System.out.print("Du får inte skatteavdrag!"); } if (km <= 50){ System.out.print("Du får inte skatteavdrag!"); } } }

Så kan vi arbeta vidare ifrån

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Hedersmedlem

Nu blir det lite monolog här men kör ändå.

Nyckel för dig att lösa uppgiften är att nästla if-satserna. Det du gör nu är ju att försöka testa irrelevanta saker. T.ex. om avståndet är mindre än 51 km så går den ändå igenom massa andra test.

Här har du en början på din omskrivning

public class Uppgift62{ public static void main(String[] args){ char svar; System.out.print("Hur km har du till jobbet?"); int km = Keyboard.readInt(); if (km > 50){ // Alla frågor och test om boendefrågor ska vara här } else { System.out.print("Du får inte skatteavdrag!"); } } }

Målet är alltså att inga onödiga jämförelser ska göras. Som du ser har jag bara en char-variabel, det är för att samma används varje gång och man bara tilldelar den nytt värde (kom ihåg att aldrig skriva "char svar = Keyboard.getChar();" i det inre, då får du en ny char-variabel som överskymmer yttre variabeln svar. Så om du nu tar och försöker skriva om det med bara den enda char-variabeln så tvingar det dig att nästla if-satserna och allt blir nog bra tillslut!

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk

Tack så mycket för hjälpen!!

blev så frustrerad på min kladdiga kod så jag började om istället =P
men nu fungerar den, tack så mycket! kanske inte dne snyggaste men här är den:

//skatteavdrag public class Uppgift62b{ public static void main(String[] args){ // char svar, svar1, svar2; System.out.println("Hur långt har du till arbetet?"); System.out.print("Ange i km: "); int km = Keyboard.readInt(); if (km <=50){ System.out.print("Du får inte skatteavdrag!"); } else if (km >50){ System.out.print("Är du ensamstående? (j/n)"); char svar = Keyboard.readChar(); if (svar == 'j'){ System.out.print("Ska du arbeta över ett år? (j/n)"); char svar1 = Keyboard.readChar(); if (svar1 == 'n'){ System.out.print("Grattis du får skatteavdrag!"); } else if (svar1 == 'j'){ System.out.print("Tyvär du får inte skatteavdrag!"); } } if (svar == 'n'){ System.out.print("Ska du arbeta över tre år? (j/n)"); char svar2 = Keyboard.readChar(); if (svar2 == 'n'){ System.out.print("Grattis du får skatteavdrag!"); } else if (svar2 == 'j'){ System.out.print("Tyvär du får inte skatteavdrag!"); } } } } }

Permalänk
Medlem

Det behövs väl egentligen inte nästlas ifall du först kollar avståndet, ifall under 50, skriv nej och avsluta. Annars, ta in dom andra två och jämför i 1 if, 1 else if och en else ifall ingen av dom stämmer.

Permalänk
Hedersmedlem
Skrivet av MystiX:

Det behövs väl egentligen inte nästlas ifall du först kollar avståndet, ifall under 50, skriv nej och avsluta. Annars, ta in dom andra två och jämför i 1 if, 1 else if och en else ifall ingen av dom stämmer.

Nej såklart inte. Jag tycker för uppläggets och förstålighetens skull så är single-exit-point lösning bra. Vidare så vet jag inte om det i kursen exponerats för konceptet med att metoder med void resultat kan returneras med return lite var man vill.
Dessutom åker man ju på lite nästling ändå.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Hedersmedlem
Skrivet av Niklas807:

Tack så mycket för hjälpen!!

blev så frustrerad på min kladdiga kod så jag började om istället =P
men nu fungerar den, tack så mycket! kanske inte dne snyggaste men här är den:

//skatteavdrag public class Uppgift62b{ public static void main(String[] args){ // char svar, svar1, svar2; System.out.println("Hur långt har du till arbetet?"); System.out.print("Ange i km: "); int km = Keyboard.readInt(); if (km <=50){ System.out.print("Du får inte skatteavdrag!"); } else if (km >50){ System.out.print("Är du ensamstående? (j/n)"); char svar = Keyboard.readChar(); if (svar == 'j'){ System.out.print("Ska du arbeta över ett år? (j/n)"); char svar1 = Keyboard.readChar(); if (svar1 == 'n'){ System.out.print("Grattis du får skatteavdrag!"); } else if (svar1 == 'j'){ System.out.print("Tyvär du får inte skatteavdrag!"); } } if (svar == 'n'){ System.out.print("Ska du arbeta över tre år? (j/n)"); char svar2 = Keyboard.readChar(); if (svar2 == 'n'){ System.out.print("Grattis du får skatteavdrag!"); } else if (svar2 == 'j'){ System.out.print("Tyvär du får inte skatteavdrag!"); } } } } }

Ja du kan finslipa på den lite mer. Om km är inte är mindre eller lika med 50, då måste det vara större än 50. Så det är givet.
Och om du använder else if (svar == 'n') så kan du använda svar variabeln i det inre testen.

Sen hur du skriver koden.

if (...) { ... } else if () { ... }

är förvirrande. Egentligen är det på detta viset men man brukar underlätta det lite för sig med else if (eftersom else-nivån skjuter på mer i indenteringen):

if (...) { ... } else { if () { ... } }

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG