Permalänk

@Svettig finnepinne: Jag gjorde precis samma uppgift innan sommaren som en del av slutprovet

använde detta
static int males = 0;
static int females = 0;
static float maleAge = 0;
static float femaleAge = 0;
static Scanner scan = new Scanner(System.in);

Men jag använde scanner och inte JOptionPane

Permalänk

@ZalamanderRelic: jag pluggar på distans så jag har inte riktigt någon jag kan fråga :/ så jag är verkligen tacksam för all hjälp!
jag har skrivit så här nu:
String age1=JOptionPane.showInputDialog(null, "Ålder?");
int p1=Integer.parseInt(age1);
int nr2=p1/r1;
int t1= nr2;
tänkte du att jag skulle skriva något sådant istället:
int t1=0;
String age1=JOptionPane.showInputDialog(null, "Ålder?");
t1=t1+Integer.parseInt(age1);
int nr2=t1/r1

Eller blir det värre nu?

Permalänk
Skrivet av Svettig finnepinne:

@ZalamanderRelic: jag pluggar på distans så jag har inte riktigt någon jag kan fråga :/ så jag är verkligen tacksam för all hjälp!
jag har skrivit så här nu:
String age1=JOptionPane.showInputDialog(null, "Ålder?");
int p1=Integer.parseInt(age1);
int nr2=p1/r1;
int t1= nr2;
tänkte du att jag skulle skriva något sådant istället:
int t1=0;
String age1=JOptionPane.showInputDialog(null, "Ålder?");
t1=t1+Integer.parseInt(age1);
int nr2=t1/r1

Eller blir det värre nu?

tycker nästan du ska börja om från början och göra bättre benämningar och se hur du ska göra. Du kan skippa vill du mata in information för det vill vi redan göra eftersom vi kör programmet. däremot ska du fråga vill du mata in fler. om du inte vill mata in fler så ska du göra en break; och sen skriva ut antalet män och antalet kvinnor och även då medelåldern. Har det inte blivit några män eller kvinnor inmatade skriv ut det istället. även kontrollera om man avbryter inmatning så hoppa direkt till utskrift.

Kontrollera även så att användaren skriver in siffror och inte annat. börja i småsteg. t ex skapa variablar, skapa en ruta där du matar in män t ex enbart och se att du får den delen att fungera sen lägg på mer och mer

Permalänk

@ZalamanderRelic: Ok, tack för hjälpen!!

Permalänk

@Svettig finnepinne:
Gjorde om källkoden till detta:

import javax.swing.*;

public class aktivitet711 {
public static void main (String[] arg) {

int antalMan=0;
double totalManAges;
double maleAverageAge;
double totalWomanAges;
double womanAverageAge;
int antalKvinna=0;
int mera=0;
int aldrarMan=0;
int aldrarKvinna=0;
String manAges;
String womanAges;

do {

int start=JOptionPane.showConfirmDialog(null, "Man?",
"Fråga", JOptionPane.YES_NO_OPTION);

if(start==0) {
antalMan=antalMan+1;
manAges=JOptionPane.showInputDialog(null, "Ålder på mannen?");

if(false)
break;

else {
totalManAges=aldrarMan+Double.parseDouble(manAges);
maleAverageAge=totalManAges / antalMan;

}
}
else if(start==1) {
antalKvinna=antalKvinna+1;
womanAges=JOptionPane.showInputDialog(null, "Ålder på kvinnan?");

if(false)
break;

else {
totalWomanAges=aldrarKvinna+Double.parseDouble(womanAges);
womanAverageAge=totalWomanAges / antalKvinna;
}
}
else {
JOptionPane.showMessageDialog(null, "Beräkningen avbryten");
System.exit(0);
}

int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in mer uppgifter?",
"Fråga", JOptionPane.YES_NO_OPTION);

if(fortsatt==0)
mera=+1;
else if(fortsatt==1)
mera=+0;
else {
JOptionPane.showMessageDialog(null, "Beräkningen avbryten");
System.exit(0);
}

} while (mera>0);

JOptionPane.showMessageDialog(null, "Antalet män: " + antalMan + " Männens medelålder: " + maleAverageAge +
"\nAntalet kvinnor: " + antalKvinna + " Kvinnornas medelålder: " + womanAverageAge);
}
}

Men jag får inte maleAverageAge och womanAverageAge att fungera kompilatorn säger att dem har inte blivit initierade.. Vad gör jag för fel?

Permalänk
Skrivet av Svettig finnepinne:

@Svettig finnepinne:
Gjorde om källkoden till detta:

import javax.swing.*;

public class aktivitet711 {
public static void main (String[] arg) {

int antalMan=0;
double totalManAges;
double maleAverageAge;
double totalWomanAges;
double womanAverageAge;
int antalKvinna=0;
int mera=0;
int aldrarMan=0;
int aldrarKvinna=0;
String manAges;
String womanAges;

do {

int start=JOptionPane.showConfirmDialog(null, "Man?",
"Fråga", JOptionPane.YES_NO_OPTION);

if(start==0) {
antalMan=antalMan+1;
manAges=JOptionPane.showInputDialog(null, "Ålder på mannen?");

if(false)
break;

else {
totalManAges=aldrarMan+Double.parseDouble(manAges);
maleAverageAge=totalManAges / antalMan;

}
}
else if(start==1) {
antalKvinna=antalKvinna+1;
womanAges=JOptionPane.showInputDialog(null, "Ålder på kvinnan?");

if(false)
break;

else {
totalWomanAges=aldrarKvinna+Double.parseDouble(womanAges);
womanAverageAge=totalWomanAges / antalKvinna;
}
}
else {
JOptionPane.showMessageDialog(null, "Beräkningen avbryten");
System.exit(0);
}

int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in mer uppgifter?",
"Fråga", JOptionPane.YES_NO_OPTION);

if(fortsatt==0)
mera=+1;
else if(fortsatt==1)
mera=+0;
else {
JOptionPane.showMessageDialog(null, "Beräkningen avbryten");
System.exit(0);
}

} while (mera>0);

JOptionPane.showMessageDialog(null, "Antalet män: " + antalMan + " Männens medelålder: " + maleAverageAge +
"\nAntalet kvinnor: " + antalKvinna + " Kvinnornas medelålder: " + womanAverageAge);
}
}

Men jag får inte maleAverageAge och womanAverageAge att fungera kompilatorn säger att dem har inte blivit initierade.. Vad gör jag för fel?

Sätt = 0;

Skickades från m.sweclockers.com

Permalänk
Permalänk
Medlem

@Svettig finnepinne:

För att enklare läsa din kod bör du omge den med code-taggar:
[code]
Din kod här.
[/code]

Att en variabel inte är initierad betyder att du inte har tilldelat den något "värde". Det du har gjort är att endast deklarera variablarna, vilket säger att en variabel ska vara av en viss typ, t.ex. en "String".

// Detta är endast en deklarerad variabel String name;

// Denna variabel är initierad. String name = "Kalle Svensson";

Tog även ett titt på din kod, gav några enklare kommentarer på saker du kan fundera på.

int antalMan=0; double totalManAges; double maleAverageAge; double totalWomanAges; double womanAverageAge; int antalKvinna=0; int mera=0; int aldrarMan=0; int aldrarKvinna=0; String manAges; String womanAges; do { int start= JOptionPane.showConfirmDialog(null, "Man?", "Fråga", JOptionPane.YES_NO_OPTION); if(start==0) { antalMan=antalMan+1; manAges=JOptionPane.showInputDialog(null, "Ålder på mannen?"); if(false) // Här säger du: "om falsk är sant, bryt loopen.", vilket alltså aldrig kan inträffa. break; else { totalManAges=aldrarMan+Double.parseDouble(manAges); maleAverageAge=totalManAges / antalMan; } } else if(start==1) { antalKvinna=antalKvinna+1; womanAges=JOptionPane.showInputDialog(null, "Ålder på kvinnan?"); if(false) // Här säger du: "om falsk är sant, bryt loopen.", vilket alltså aldrig kan inträffa. break; else { totalWomanAges = aldrarKvinna+Double.parseDouble(womanAges); womanAverageAge = totalWomanAges / antalKvinna; } } else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } int fortsatt = JOptionPane.showConfirmDialog(null, "Vill du mata in mer uppgifter?", "Fråga", JOptionPane.YES_NO_OPTION); if(fortsatt==0) mera=+1; else if(fortsatt==1) mera=+0; // Här säger du att mera ska plussas på med 0... 5 + 0 är fortfarnade 5. else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } } while (mera>0); JOptionPane.showMessageDialog(null, "Antalet män: " + antalMan + " Männens medelålder: " + maleAverageAge + "\nAntalet kvinnor: " + antalKvinna + " Kvinnornas medelålder: " + womanAverageAge); }

Permalänk

@noyce: As schysst att du tog en titt på den, uppskattar det till tusen! Tack för tipsen!

Permalänk

Behöver hjälp igen :/ Kan någon snäll själ förklara vad jag gör för fel, det verkar bli något fel på midtaxes och hightaxes satserna, jag får fel summa. Uppgiften går ut på att man skall beräkna hur mycket statligt skatt man skall betala på sin årsinkomst. (13100 är grundavdrag)

import javax.swing.*; public class Aktivitet8 { public static void main (String[] arg) { String TotSalary; int YearSalary; double Below=0.0; double over=0.0; double screwed=0.0; double Over=0.0; double MidTaxes=0.0; double HighTaxes=0; String MoreDraw; double Relief=0.0; int mera=0; TotSalary=JOptionPane.showInputDialog(null, "Årsinkomst?"); YearSalary=Integer.parseInt(TotSalary); if(YearSalary<438900) { JOptionPane.showMessageDialog(null, "Du betalar ingen statligskatt");//<438900 ingen statlig skatt System.exit(0); } else if(YearSalary>438900&&YearSalary<638500) MidTaxes=Relief-13100-(0.2*YearSalary);//årsinkomst mellan 438900 och 638500,lägg till 20% statlig skatt else if(YearSalary>638500) HighTaxes=Relief-13100-(YearSalary*0.25);//årsinkomst över 638500, lägg till 5% statlig skatt utöver 20% else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } do { int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in fler skatteavdrag?Grundavdraget har redan blivit avdragen.", "Fråga", JOptionPane.YES_NO_OPTION); if(fortsatt==0) { mera=+1; MoreDraw=JOptionPane.showInputDialog(null, "Mata in avdraget"); Relief=Relief+Double.parseDouble(MoreDraw); } else if(fortsatt==1) mera=+0; else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } } while (mera>0); JOptionPane.showMessageDialog(null," Statlig skatt: " + MidTaxes + HighTaxes); } }

Permalänk
Medlem

Snälla använd CODE taggen..
Och en annan viktig sak, som inte bara gäller när du ska ha hjälp, utan även när du ev. skall jobba i framtiden. Ge variabler namn som makes sense och inte massa joll ingen förstår..
variabler som p1, p2, n1,n2 osv är det ju ingen som förstår utan att läsa koden & kommentarer runtom ..

Håller variablen t.ex. ålder så döp den till age då? Eller något annat lämpligt..

Visa signatur

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | KFA2 GTX 1080 Ti

Permalänk

@Tony32: Tack för tipset!

Permalänk
Medlem

@Svettig finnepinne:

Viktigt att tänka på är att ditt program exekveras (körs) uppifrån och ner, därför skulle vi kunna dela in ditt program i olika delar.

Del 1: Först deklarerar och initierar du ett antal variabler som du tänkt att använda genom programmets gång. De flesta variablerna får värdet 0. Att tänka på: Används alla variabler?

String TotSalary; int YearSalary; double Below=0.0; double over=0.0; double screwed=0.0; double Over=0.0; double MidTaxes=0.0; double HighTaxes=0; String MoreDraw; double Relief=0.0; int mera=0;

Del 2: I denna del frågar du efter årsinkomsten hos personen, och beroende på vad de svarar ska olika saker utföras. Så om du nu t.ex. tittar på raden där du räknar ut MidTaxes, vad har Relief för värde? Vad förväntar du dig att det ska ha i detta läge? Även att tänka på: vad händer om du skriver in årsinkomsten 438900 eller 638500, vad säger dina if-satser?

TotSalary=JOptionPane.showInputDialog(null, "Årsinkomst?"); YearSalary=Integer.parseInt(TotSalary); if(YearSalary<438900) { JOptionPane.showMessageDialog(null, "Du betalar ingen statligskatt");//<438900 ingen statlig skatt System.exit(0); } else if(YearSalary>438900&&YearSalary<638500) MidTaxes=Relief-13100-(0.2*YearSalary);//årsinkomst mellan 438900 och 638500,lägg till 20% statlig skatt else if(YearSalary>638500) HighTaxes=Relief-13100-(YearSalary*0.25);//årsinkomst över 638500, lägg till 5% statlig skatt utöver 20% else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); }

Del 3: I detta steg kör du en do-while loop, så länge variabeln mera är större än 0. Såg att jag i mitt föregående inlägg hade skrivit en kommentar som inte riktigt stämde, du skriver mera = +1, i mitt förra inlägg läste jag detta som "mera += 1", vilket är stor skillnad. "mera += 1" är samma sak som att skriva "mera = mera + 1", medan "mera = +1" är samma sak som att skriva "mera = 1". Men hur som helst, i detta avsnitt tilldelar du variablerna "MoreDraw" och "Relief" värden om man vill lägga till fler avdrag. Hint: Hur används dessa i sista delen av programmet?

do { int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in fler skatteavdrag?Grundavdraget har redan blivit avdragen.", "Fråga", JOptionPane.YES_NO_OPTION); if(fortsatt==0) { mera = +1; MoreDraw=JOptionPane.showInputDialog(null, "Mata in avdraget"); Relief=Relief+Double.parseDouble(MoreDraw); } else if(fortsatt==1) mera = +0; else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } } while (mera>0);

Del 4: Det sista du gör är att skriva ut den statliga skatten. Viktigt att tänka på här är att " Statlig skatt: " + MidTaxes + HighTaxes är en sträng, så det sker inga beräkningar här (MidTaxes + HighTaxes är ingen beräkning) då allt görs om till strängar som slås ihop. Ett exempel: Om MidTaxes har värdet 5 och HighTaxes har värdet 2, så kommer strängen "Statlig skatt: 52" att skrivas ut och inte "Statlig skatt: 7". Vill du göra en beräkning måste du alltså göra det innan du skriver ut det i din dialog.

JOptionPane.showMessageDialog(null," Statlig skatt: " + MidTaxes + HighTaxes);

Det kan vara bra att dela upp sitt program såhär i olika delar för att försöka förstå vad som händer. Ett annat sätt för att hitta fel i ditt program är ett debugga sin kod, det betyder att du kan sätta en brytpunkt på en viss rad i din kod, och när du sedan kör ditt program i "debug-mode" så stannar programmet där du satt brytpunkten och du kan se vad alla variabler har för värde i just det läget av koden. I din kod skulle du alltså kunna sätta en brytpunkt där du gör dina beräkningar som blir fel, för att se vad alla varibler har för värde som utgör beräkningen, t.ex Relief och YearSalary.

Detta blev långt, tanken är inte att lösa ditt problem, utan att försöka få dig att se hur du kan hitta det själv. Inom programmering är felsökning en viktig del, att kunna felsöka sin kod för att förstå vart det blir fel. "När denna beräkning utförs, vad förväntar jag mig att alla variabler ska ha för värde då och vad är deras faktiska värde".

Permalänk
Skrivet av noyce:

@Svettig finnepinne:

Viktigt att tänka på är att ditt program exekveras (körs) uppifrån och ner, därför skulle vi kunna dela in ditt program i olika delar.

Del 1: Först deklarerar och initierar du ett antal variabler som du tänkt att använda genom programmets gång. De flesta variablerna får värdet 0. Att tänka på: Används alla variabler?

String TotSalary; int YearSalary; double Below=0.0; double over=0.0; double screwed=0.0; double Over=0.0; double MidTaxes=0.0; double HighTaxes=0; String MoreDraw; double Relief=0.0; int mera=0;

Del 2: I denna del frågar du efter årsinkomsten hos personen, och beroende på vad de svarar ska olika saker utföras. Så om du nu t.ex. tittar på raden där du räknar ut MidTaxes, vad har Relief för värde? Vad förväntar du dig att det ska ha i detta läge? Även att tänka på: vad händer om du skriver in årsinkomsten 438900 eller 638500, vad säger dina if-satser?

TotSalary=JOptionPane.showInputDialog(null, "Årsinkomst?"); YearSalary=Integer.parseInt(TotSalary); if(YearSalary<438900) { JOptionPane.showMessageDialog(null, "Du betalar ingen statligskatt");//<438900 ingen statlig skatt System.exit(0); } else if(YearSalary>438900&&YearSalary<638500) MidTaxes=Relief-13100-(0.2*YearSalary);//årsinkomst mellan 438900 och 638500,lägg till 20% statlig skatt else if(YearSalary>638500) HighTaxes=Relief-13100-(YearSalary*0.25);//årsinkomst över 638500, lägg till 5% statlig skatt utöver 20% else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); }

Del 3: I detta steg kör du en do-while loop, så länge variabeln mera är större än 0. Såg att jag i mitt föregående inlägg hade skrivit en kommentar som inte riktigt stämde, du skriver mera = +1, i mitt förra inlägg läste jag detta som "mera += 1", vilket är stor skillnad. "mera += 1" är samma sak som att skriva "mera = mera + 1", medan "mera = +1" är samma sak som att skriva "mera = 1". Men hur som helst, i detta avsnitt tilldelar du variablerna "MoreDraw" och "Relief" värden om man vill lägga till fler avdrag. Hint: Hur används dessa i sista delen av programmet?

do { int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in fler skatteavdrag?Grundavdraget har redan blivit avdragen.", "Fråga", JOptionPane.YES_NO_OPTION); if(fortsatt==0) { mera = +1; MoreDraw=JOptionPane.showInputDialog(null, "Mata in avdraget"); Relief=Relief+Double.parseDouble(MoreDraw); } else if(fortsatt==1) mera = +0; else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } } while (mera>0);

Del 4: Det sista du gör är att skriva ut den statliga skatten. Viktigt att tänka på här är att " Statlig skatt: " + MidTaxes + HighTaxes är en sträng, så det sker inga beräkningar här (MidTaxes + HighTaxes är ingen beräkning) då allt görs om till strängar som slås ihop. Ett exempel: Om MidTaxes har värdet 5 och HighTaxes har värdet 2, så kommer strängen "Statlig skatt: 52" att skrivas ut och inte "Statlig skatt: 7". Vill du göra en beräkning måste du alltså göra det innan du skriver ut det i din dialog.

JOptionPane.showMessageDialog(null," Statlig skatt: " + MidTaxes + HighTaxes);

Det kan vara bra att dela upp sitt program såhär i olika delar för att försöka förstå vad som händer. Ett annat sätt för att hitta fel i ditt program är ett debugga sin kod, det betyder att du kan sätta en brytpunkt på en viss rad i din kod, och när du sedan kör ditt program i "debug-mode" så stannar programmet där du satt brytpunkten och du kan se vad alla variabler har för värde i just det läget av koden. I din kod skulle du alltså kunna sätta en brytpunkt där du gör dina beräkningar som blir fel, för att se vad alla varibler har för värde som utgör beräkningen, t.ex Relief och YearSalary.

Detta blev långt, tanken är inte att lösa ditt problem, utan att försöka få dig att se hur du kan hitta det själv. Inom programmering är felsökning en viktig del, att kunna felsöka sin kod för att förstå vart det blir fel. "När denna beräkning utförs, vad förväntar jag mig att alla variabler ska ha för värde då och vad är deras faktiska värde".

Helt rätt, vill inte ha en lösning heller utan mer vägledning/tips. Såg att det smög in lite variabler från en tidigare version som inte används längre i den nya. Sitter inte vid datan just nu (behövde en andningspaus ) men ska hugga tag i dina grymma tips lite senare. Tusen tack!

Skickades från m.sweclockers.com

Permalänk

@noyce:
Kom fram till det här:

import javax.swing.*; public class Aktivitet8 { public static void main (String[] arg) { String TotSalary; double YearSalary; double MidTaxes=0.0; double HighTaxes=0.0; String MoreDraw; double Relief=0.0; int mera=0; TotSalary=JOptionPane.showInputDialog(null, "Årsinkomst?"); YearSalary=Double.parseDouble(TotSalary); if(YearSalary<=438900) { JOptionPane.showMessageDialog(null, "Du betalar ingen statligskatt");//<438900 ingen statlig skatt System.exit(0); } else if(YearSalary>438900&&YearSalary<638500) MidTaxes=((YearSalary*0.20)-13100);//årsinkomst mellan 438900 och 638500, 20% statlig skatt do { int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in fler skatteavdrag? Grundavdraget har redan blivit avdragen.", "Fråga", JOptionPane.YES_NO_OPTION); if(fortsatt==0) { mera=+1; MoreDraw=JOptionPane.showInputDialog(null, "Mata in avdraget"); Relief=Relief+Double.parseDouble(MoreDraw); } else if(fortsatt==1) mera=+0; else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } } while (mera>0); JOptionPane.showMessageDialog(null," Statlig skatt: " + (MidTaxes-Relief)); System.exit(0); if(YearSalary>=638500) { HighTaxes=((YearSalary*0.25)-13100); do { int fortsatt=JOptionPane.showConfirmDialog(null, "Vill du mata in fler skatteavdrag? Grundavdraget har redan blivit avdragen.", "Fråga", JOptionPane.YES_NO_OPTION); if(fortsatt==0) { mera=+1; MoreDraw=JOptionPane.showInputDialog(null, "Mata in avdraget"); Relief=Relief+Double.parseDouble(MoreDraw); } else if(fortsatt==1) mera=+0; else { JOptionPane.showMessageDialog(null, "Beräkningen avbryten"); System.exit(0); } } while (mera>0); JOptionPane.showMessageDialog(null," Statlig skatt: " + (HighTaxes-Relief)); System.exit(0); } } }

Nu funkar programmet på första och andra steget men inte på HighTaxes.. Fattar inte varför? Då får jag fram resultat 0.0. Relief variabeln funkar i den också men inte just HighTaxes variabeln, några tips?

Permalänk
Medlem
Skrivet av Svettig finnepinne:

Nu funkar programmet på första och andra steget men inte på HighTaxes.. Fattar inte varför? Då får jag fram resultat 0.0. Relief variabeln funkar i den också men inte just HighTaxes variabeln, några tips?

Det ser ut som att du missat {} efter "else if(YearSalary>438900&&YearSalary<638500)", så det är i själva verket MidTaxes som används när man matar in en årsinkomst högre än 638500. Och MidTaxes blir då aldrig tilldelat något värde, så resultatet blir så klart 0.0. Detta är orsaken till att man alltid ska använda {} runt if-satser, särskilt när man är nybörjare (och särskilt när koden är helt galet indenterad, men jag hoppas att det bara är något som blivit när du klistrat in koden här).

Ett sånt här problem hittar du för övrigt lätt med hjälp av debuggern, så lär dig använda den så att du kan stega igenom programmet och se vad som händer när du kör det. Det är oerhört hjälpsamt när man är nybörjare så att man kan se vad som faktiskt körs och vilket värde alla variabler har vid ett visst ställe i koden.

Permalänk
Medlem

@Svettig finnepinne:

Jag ser att du fixat några problem som jag hintade om, t.ex. att programmet inte hanterade om man skrev in värdet 438900 eller 638500, samt att du fixade till dina beräkningar, bra!

Problemet som du har nu tror jag enbart beror på en liten förvirring eftersom du får utskrivet resultatet 0.0 och att du få fokuserar på fel delar av din kod. Nu spekulerar jag, men av din kod att bedöma ser det ut som att du tänkt dig följande:
1. Fråga om årsinkomst.
2. Om den är under eller exakt 438900 avsluta programmet.
3. Om den är mellan 438900 och 638500 beräkna MidTaxes
3.1 Fråga om fler avdrag för MidTaxes.
3.2 Skriv ut statlig skatt grundat på MidTaxes och avsluta programmet.
4. Om den är över 638500 beräkna HighTaxes
4.1 Fråga om fler avdrag för HighTaxes
4.2 Skriv ut statlig skatt grundat på HighTaxes och avsluta programmet.

Detta mönster fungerar absolut, men precis som @perost så verkar det som att du glömt bort lite måsvingar ({}) för att kapsla in steg 3.1 och steg 3.2 i steg 3, vilket kommer leda till att steg 3.1 och steg 3.2 alltid körs (om årsinkomsten är över 438900). Det finns flera designval som går att peka på och förbättra i din kod, men jag tycker att det är bra att man får märka av problemet som kan uppstå genom att faktiska göra felen.

När man skriver if-satser så är det fullt giltigt att skriva utan måsvingar ({}) när det bara är 1 rad som ska köras efteråt, precis som du gjort här:

if (fortsatt == 1) mera = +0; // annan note: här behöver du inte skriva +0, räcker med 0 (det betyder ju samma sak). Kan bli förvirrande, som jag nämnde i mitt förra inlägg.

Däremot om det är flera saker som ska köras om if-satsen är giltig så måste man använda måsvingar, för annars körs bara första raden. Detta verkar du redan ha greppat, men problemet som uppstår är att när man inte använder måsvingar hela tiden, så kommer man att glömma bort dem ibland. Man tänker alltså kanske rätt, men allt blir fel för att man glömt bort att kapsla in sin kod i rätt if-sats. Därför är det god praxis (det är rekommenderat) att alltid använda måsvingar efter sina if-satser, oavsett om det är 1 rad kod som ska köras i den. Då blir både mer enhetlig kod och tydligare att se vad som ska köras i if-satsen, framförallt då koden brukar bli indenterad (indragen) innanför måsvingarna. Exemplet ovan blir alltså:

if (fortsatt == 1) { mera = +0; }

Sen vill jag också slå ett till slag för att titta på hur man debuggar sin kod, jag länkade till ett youtube-klipp i mitt föregående inlägg som visar hur man gör detta i IntelliJ, du kanske använder en annan IDE? Eclipse eller IntelliJ är väl de två stora, så om du inte använder någon av dem skulle jag föreslå att byta till någon av dem, sedan titta på någon guide eller youtube hur man debuggar sin kod.

Permalänk
Skrivet av noyce:

@Svettig finnepinne:

Jag ser att du fixat några problem som jag hintade om, t.ex. att programmet inte hanterade om man skrev in värdet 438900 eller 638500, samt att du fixade till dina beräkningar, bra!

Problemet som du har nu tror jag enbart beror på en liten förvirring eftersom du får utskrivet resultatet 0.0 och att du få fokuserar på fel delar av din kod. Nu spekulerar jag, men av din kod att bedöma ser det ut som att du tänkt dig följande:
1. Fråga om årsinkomst.
2. Om den är under eller exakt 438900 avsluta programmet.
3. Om den är mellan 438900 och 638500 beräkna MidTaxes
3.1 Fråga om fler avdrag för MidTaxes.
3.2 Skriv ut statlig skatt grundat på MidTaxes och avsluta programmet.
4. Om den är över 638500 beräkna HighTaxes
4.1 Fråga om fler avdrag för HighTaxes
4.2 Skriv ut statlig skatt grundat på HighTaxes och avsluta programmet.

Detta mönster fungerar absolut, men precis som @perost så verkar det som att du glömt bort lite måsvingar ({}) för att kapsla in steg 3.1 och steg 3.2 i steg 3, vilket kommer leda till att steg 3.1 och steg 3.2 alltid körs (om årsinkomsten är över 438900). Det finns flera designval som går att peka på och förbättra i din kod, men jag tycker att det är bra att man får märka av problemet som kan uppstå genom att faktiska göra felen.

När man skriver if-satser så är det fullt giltigt att skriva utan måsvingar ({}) när det bara är 1 rad som ska köras efteråt, precis som du gjort här:

if (fortsatt == 1) mera = +0; // annan note: här behöver du inte skriva +0, räcker med 0 (det betyder ju samma sak). Kan bli förvirrande, som jag nämnde i mitt förra inlägg.

Däremot om det är flera saker som ska köras om if-satsen är giltig så måste man använda måsvingar, för annars körs bara första raden. Detta verkar du redan ha greppat, men problemet som uppstår är att när man inte använder måsvingar hela tiden, så kommer man att glömma bort dem ibland. Man tänker alltså kanske rätt, men allt blir fel för att man glömt bort att kapsla in sin kod i rätt if-sats. Därför är det god praxis (det är rekommenderat) att alltid använda måsvingar efter sina if-satser, oavsett om det är 1 rad kod som ska köras i den. Då blir både mer enhetlig kod och tydligare att se vad som ska köras i if-satsen, framförallt då koden brukar bli indenterad (indragen) innanför måsvingarna. Exemplet ovan blir alltså:

if (fortsatt == 1) { mera = +0; }

Sen vill jag också slå ett till slag för att titta på hur man debuggar sin kod, jag länkade till ett youtube-klipp i mitt föregående inlägg som visar hur man gör detta i IntelliJ, du kanske använder en annan IDE? Eclipse eller IntelliJ är väl de två stora, så om du inte använder någon av dem skulle jag föreslå att byta till någon av dem, sedan titta på någon guide eller youtube hur man debuggar sin kod.

Ah, ja, det var det som saknades 😊 Från och med nu så kommer jag alltid att använda måsvingarna i if satser! Det blir mer enhetligt och så slipper jag såna här problem i framtiden! Att lära sig debugg ligger högst upp på listan, började att kolla på länken du skickade, måste byta till någon av IDE du föreslog. Tack snälla ni för all hjälp, ni är guldvärda!

Skickades från m.sweclockers.com

Permalänk
Skrivet av Svettig finnepinne:

Ah, ja, det var det som saknades 😊 Från och med nu så kommer jag alltid att använda måsvingarna i if satser! Det blir mer enhetligt och så slipper jag såna här problem i framtiden! Att lära sig debugg ligger högst upp på listan, började att kolla på länken du skickade, måste byta till någon av IDE du föreslog. Tack snälla ni för all hjälp, ni är guldvärda!

Skickades från m.sweclockers.com

se också om du kan lösa den delen med att checka så att användaren verkligen skriver in siffror och inte annat. du behöver inte använda try och catch om du inte vill

Permalänk
Skrivet av Svettig finnepinne:

Ah, ja, det var det som saknades 😊 Från och med nu så kommer jag alltid att använda måsvingarna i if satser! Det blir mer enhetligt och så slipper jag såna här problem i framtiden! Att lära sig debugg ligger högst upp på listan, började att kolla på länken du skickade, måste byta till någon av IDE du föreslog. Tack snälla ni för all hjälp, ni är guldvärda!

Skickades från m.sweclockers.com

Hur går det? Har du löst det? Kassaskåps säkert?

Permalänk

@ZalamanderRelic:
Vart så exalterad när jag fick det att funka så jag skickade in uppgiften fort som bara den, innan jag såg ditt meddelande angående att jag borde se till att användaren bara skriver in siffror men annars å gick det galant, tack vare er!

Permalänk

@Svettig finnepinne:
Så här gjorde jag

package a_och_b; import javax.swing.JOptionPane; public class A_Uppgift { //Class variablar för att komma åt dessa från hela programmet static final double STATLIG_INKOMSTSKATT = 0.20; static final double VÄRNSKATT = 0.05; static final int GRUNDAVDRAG = 13100; /*Metoden inkomstskatt tar emot en double inkomst och sedan jämför det med dem olika skattenivåerna och beräknar skatten efter det*/ public static double inkomstSkatt(double inkomst) { double skatt = 0; if(inkomst <= GRUNDAVDRAG) JOptionPane.showMessageDialog(null, "Ingen skatt du tjänar mindre än grundavdraget"); else { double inkomstEfterSkatt = inkomst - GRUNDAVDRAG; if(inkomst >= 430200) skatt += inkomstEfterSkatt * STATLIG_INKOMSTSKATT; if(inkomst >= 616100) skatt += inkomstEfterSkatt * (STATLIG_INKOMSTSKATT + VÄRNSKATT); } return skatt; } /* calculateTax frågar om årsinkomst och om inmatningFrånAnvändare är null så stängs programmet av. * Efter det så kontrollerar programmet att användaren har skrivt in siffror och inte något annat * för att sedan ta inmatningFrånAnvändare och skicka den parametern till inkomstSkatt. * Slutet av metoden frågar om användaren vill skriva in fler årsinkomster vid ja kallas metoden på igen * och vid nej stängs programmet av*/ public static void calculateTax(){ String inmatningFrånAnvändare = JOptionPane.showInputDialog(null, "Årsinkomst"); if(inmatningFrånAnvändare == null)System.exit(0); while(true) { if(inmatningFrånAnvändare.contains(" ") || !inmatningFrånAnvändare.matches("[0-9]+")) { JOptionPane.showMessageDialog(null, "Du skrev inte in siffror"); calculateTax(); } else if(inmatningFrånAnvändare != null && inmatningFrånAnvändare.length() > 0) { JOptionPane.showMessageDialog(null, "Din statliga skatt är " + inkomstSkatt(Double.parseDouble(inmatningFrånAnvändare))); break; } } int flerBeräkningar = JOptionPane.showConfirmDialog(null, "Vill du mata in fler årsinkomster?"," " , JOptionPane.YES_NO_OPTION); if(flerBeräkningar == JOptionPane.YES_OPTION) calculateTax(); if(flerBeräkningar == JOptionPane.CLOSED_OPTION || flerBeräkningar == JOptionPane.NO_OPTION) System.exit(0); } //Start metoden som anropar calculateTax(); public static void main(String[]args) { calculateTax(); } }

Permalänk

@ZalamanderRelic:
Hahah, när jag jämför ditt och mitt så ser jag att jag har mycket att jobba med jag började att läsa om metoddeklarationer och return igår

Permalänk

@Svettig finnepinne:

Jag håller på läser igenom och pluggar själv. Läste programmering 1 precis men sökte inte programmering 2 än utan går igenom hela boken och sedan programmerar mycket på egen hand(gör ett text baserat spel) sen blir det nog söka programmering 2 så jag gått igenom det med. Det svåraste tycker jag är att komma på en lösning som är bra och hitta alla funktioner.

Som övning tycker jag det är svårt att hitta bra övningar att göra

Permalänk

@ZalamanderRelic:
Läste du på skolan eller distans?

Permalänk

@Svettig finnepinne:
Läste c++ programmering A i skolan när jag gick gymnasiet och nu på fritiden pluggar jag själv så läste programmering 1 på distans

Permalänk
Medlem

Hej igen alla duktiga kodare!

Jag har återigen fastnat på uppgiften jag hade att lösa, jag känner att jag har svårt för detta, blir helt stopp i huvudet.
Ställde tidigare en fråga kring uppgiften på sida 1 i denna tråden.

Koden är klar förutom att programloopen ska hoppa ur när användaren matar i ett 'e'... Jag har försökt på många sätt men får inte till det. För upplysnings skull så räckte det visst med de två översta meny valen för att få godkänt, fick till 3dje också men stannar där.

Så om någon vänlig skäl vill upplysa mig hur jag ska tänka för att lösa detta.

Tycker tyvärr att kursen är väldigt tuff att försöka hänga med i och har dålig studievana dessutom. Men jag vill inte ge upp än men har svårt att ta in allt när takten är så hög. Tanken om att hoppa av har dykt upp några gånger, men det känns tråkigt också. Jag är 45 år och det känns liksom att detta är sista chansen för studier.

Här är koden då:

import java.util.Scanner;

public class LabEtt {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

while (true) {
System.out.println("Vad vill du göra");
System.out.println("1:Addera två tal");
System.out.println("2:Räkna bokstäver i en sträng");
System.out.println("3:Spegelvänd en sträng");
System.out.println("4:Summera alla tal i en sträng");
System.out.println("Avsluta programmet med bokstaven e");

int numbersChoice = sc.nextInt();

if (numbersChoice == 1) {
System.out.println("Vilka tal vill du addera?");
int yourChoise1 = sc.nextInt();
int yourChoice2 = sc.nextInt();
sum(yourChoise1, yourChoice2);
System.out.println("De adderade talen blir " + sum(yourChoise1,yourChoice2)tillsammans");

} else if (numbersChoice == 2) {
System.out.println("Vilket ord väljer du?");
String yourWord = sc.next();
System.out.println("Vilken bokstav väljer du?");
String yourLetter = sc.next();
System.out.println("Det finns " + countLetters(yourWord, yourLetter) + " av dessa bokstäver i ordet du valt.");

} else if (numbersChoice == 3) {
System.out.println("Vilket ord vill du spegelvända?");
String yourWord = sc.next();
System.out.println("Spegelvänt ser ditt valda ord ut så här: " + reverseString(yourWord));
}

}
}

public static int sum(int yourChoice1, int yourChoice2) {
return yourChoice1 + yourChoice2;
}

public static int countLetters(String yourWord, String yourLetter) {
int numLetters = 0;
for (int i = 0; i < yourWord.length(); i++) {
if (yourWord.charAt(i) == yourLetter.charAt(0))
numLetters++;
}
return numLetters;
}

public static String reverseString(String yourWord) {
String mirror = "";
for (int i = yourWord.length() - 1; i >= 0; i--) {
mirror = mirror + yourWord.charAt(i);
}
return mirror;
}

}

Tack på förhand! //bikerrog

Permalänk
Medlem

@bikerrog: Tycker definitivt inte du ska ge upp, bara ge den järnet och kämpa på

Btw, använd gärna taggarna [ code ] "din kod här" [ /code ], utan mellanslagen, när du postar kod på forumet.

När det gäller att läsa inmatningar i menyn, är det ett krav i uppgiften att menyn internt ska jämföra mot heltal? Eller skulle du kunna jämföra mot strängvärden?

Så här tänker jag man skulle kunna gjort:

isRunning = true; Scanner sc = new Scanner(System.in); sc.useDelimiter(""); while (isRunning) { string menuSelection = sc.next(); if (menuSelection == "1") { // gör något } else if (menuSelection == "2") { // gör något annat } else if (menuSelection == "e") { isRunning = false // avslutar loopen } }

Har inte testat om detta funkar, och har inte pysslat jättemycket med just java, men förhoppningsvis är det hjälpsamt på något vis
Förresten, i ett sånt här läge där man har en meny så är en switch ( https://docs.oracle.com/javase/tutorial/java/nutsandbolts/swi... ) lite smidigare än en massa if/else, men ni kanske inte har kommit så långt i kursen än.

Permalänk
Medlem

@elBenko: Tack för svar!

Ska tänka på detta med kod taggarna hädanefter.

Nej finns inget krav kring menyn. Den ska bara visa användaren de möjliga valen och sen ska själva funktionerna ligga i varsin metod. programmet ska sen avslutas först när användaren matar in ett 'e'

Alltså valmenyn ska loopas fram så länge användaren gör ngt av valen.

Jo har också tänkt att byta ut if/else mot switch...
Jodå vi är snart klara med hela Java delen problemet är att det går så fort fram så jag hänger tyvärr inte med.

//Bikerrog

Permalänk
Medlem

@bikerrog: Ah ja jobbigt om man inte riktigt hänger med. Hjälper gärna till och svarar på frågor osv. om det behövs, bara släng iväg ett privat meddelande.

Vet ej om du hunnit testa mitt förslag, men tänk på att eftersom du använder scannern för andra inmatningar, t.ex. för ord osv. så kan du inte använda "sc.useDelimiter(""); som jag föreslagit, då den begränsar alla inmatningar till enbart ett tecken - tanken med den var att det skulle bli rätt i menyvalen.