Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Räknefel i Java

Hej!
Jag har fått en rätt enkel uppgift:
"Skapa ett program som läser in en initial summa att placera på ett konto och
därefter tio insättningar. Inläsningen av insättningarna skall hanteras av en
metod som skriver ut en trevlig ledtext, läser in insättningen och returnerar
summan. Efter varje insättning skall en andra metod anropas som lägger på
10% av värdet på insättningen som en bonus och returnerar denna nya
summa. Efter inläst insättning och pålagd bonus skall den totala summan
läggas till på kontot.
Det är fritt fram att lägga till ledtext så att användaren vet vad hen skall göra i
varje steg. Den totala summan på kontot skall skrivas ut innan programmet
avslutas.
Följande måste användas:
1. En Scanner
2. En metod utan parametrar som returnerar ett värde
3. En metod som tar en parameter och returnerar ett värde"

Först skrev jag:

import java.util.Scanner; class Moh{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); double saldo = 1000; double rate = .1; double deposit = 0; double depsum; System.out.println("Välkommen till Superspelsajten!!!\nVi ger dig omedelbart " + saldo + " SEK att spela för.\nVi ger dig dessutom 10% extra på dina 10 första insättningar!"); System.out.println("\nVälkommen till din första insättning."); for(int counter = 0; counter <10;){ System.out.println("Hur mycket vill du sätta in?"); deposit = scan.nextDouble(); counter++; depsum = (deposit * rate)+ deposit; saldo = depsum + saldo; System.out.println("Du satte in " + deposit + " SEK"); System.out.println("Vi ger dig " + depsum + " SEK"); System.out.println("Ditt saldo är " + saldo + " SEK\n"); System.out.println("Du har utnyttjat " + counter + " av dina 10 bonusinsättningar."); } System.out.println("Du har inga bonusinsättningar kvar."); } }

Detta funkade ju alldeles utmärkt, tills jag läste lite mer noga om vilka krav som gällde.
Jag skrev om programmet till:

import java.util.Scanner; class wtf{ public static void main(String[] args) { double saldo = 1000; int deposit; Scanner scan = new Scanner(System.in); wtf wtfObject = new wtf(); System.out.println("Välkommen till Superspelsajten!!!\nVi ger dig omedelbart " + saldo + " SEK att spela för.\nVi ger dig dessutom 10% extra på dina 10 första insättningar!"); System.out.println("\nVälkommen till din första insättning."); for(int counter = 0; counter <10;){ System.out.println("Hur mycket vill du sätta in?"); deposit = scan.nextInt(); wtfObject.deposits(saldo, deposit); } } public void deposits(double saldo, int deposit){ double depsum; double rate = .1; depsum = (deposit * rate)+ deposit; saldo = depsum + saldo; System.out.println("Du satte in " + deposit + " SEK"); System.out.println("Vi ger dig " + depsum + " SEK"); System.out.println("Ditt saldo är " + saldo + " SEK\n"); // System.out.println("Du har utnyttjat " + counter + " av dina 10 bonusinsättningar."); // System.out.println("Du har inga bonusinsättningar kvar."); } }

Nu funkar inte saldoräknaren som den ska längre. Jag känner mig lite dum här, för jag har en känsla av att det är något ganska självklart jag missar.
Jag fick inte heller med de två sista printsatserna (förvisso inte nödvändiga, men vadå ).

Tacksam för all input om detta.

Tack

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Din metod deposits räknar ut saldo och skriver ut det, men den lagrar inte saldot någonstans. Din saldo-variabel i main kommer alltså alltid att vara 1000 eftersom du inte sparar det nya saldot i den. Lösningen på detta skulle vara att returnera saldot från deposits och spara det nya saldot i saldo-variabeln.

Däremot så är det inte vad som efterfrågas i uppgiften. Du ska använda en Scanner, vilket du gör. Du ska sedan ha en metod som läser in input från användaren och returnerar hur mycket användaren satte in, men den koden ligger än så länge direkt i main. Sen ska du ha en annan metod som tar ett argument (saldot) och lägger på 10%, för att sedan returnera ett värde (det nya saldot). En del av koden i deposits bör alltså flyttas tillbaks till main, och så bör du antagligen ändra namnet på metoden till något mer lämpligt.

Sen är det egentligen inte nödvändigt att instantiera wtf för att använda metoderna, du kan lika gärna bara deklarera dem som static eftersom wtf ändå är tillståndslös (dvs. den har inga instansvariabler som ändrar värde när metoderna använda).

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Haha, namnet var bara något som blev när jag kladdade lite. Självklart blir det ett annat när det blir klart

Jag tackar så jättemycket för hjälpen. Jag ska erkänna att jag har haft väldigt svårt att förstå uppgiften (jag får väl läsa lite extra).

Jag ska se om jag kan lösa det, annars återkommer jag.

Tack igen

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Feb 2006
Skrivet av JJ72:

Haha, namnet var bara något som blev när jag kladdade lite. Självklart blir det ett annat när det blir klart

Värt att notera är att det var inte namnet som kommenterades på, det var att du kunde använda statiska metoder och inte instansiera WTF.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av JJ72:

Haha, namnet var bara något som blev när jag kladdade lite. Självklart blir det ett annat när det blir klart

Att hitta på bra namn på saker är 90% av all programmering

Fast jag klagade egentligen inte på det nuvarande namnet, även om det kanske inte är världens bästa metod-namn. Jag ville mer bara påminna om att döpa om den ifall du ändrar på den enligt uppgiften, eftersom namnet annars skulle bli helt missvisande.

Edit: För att förtydliga så pratar jag alltså om metoden deposits.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Jag är helt med på det

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Rätt tänkt?

import java.util.Scanner; class wtf{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); int deposit; System.out.println("Insättning: "); deposit = scan.nextInt(); wtf wtfObject = new wtf(deposit); wtfObject.money(); } private int NewDeposit; private wtf(int deposit){ NewDeposit = deposit; } public void setDeposit(int deposit){ NewDeposit = deposit; } public int getDeposit(){ return NewDeposit; } public void money(){ System.out.println("Din insättning: " + getDeposit()); } }

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av JJ72:

Rätt tänkt?

import java.util.Scanner; class wtf{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); int deposit; System.out.println("Insättning: "); deposit = scan.nextInt(); wtf wtfObject = new wtf(deposit); wtfObject.money(); } private int NewDeposit; private wtf(int deposit){ NewDeposit = deposit; } public void setDeposit(int deposit){ NewDeposit = deposit; } public int getDeposit(){ return NewDeposit; } public void money(){ System.out.println("Din insättning: " + getDeposit()); } }

Några tankar:

  • Varför stor bokstav i början av NewDeposit?

  • Varför heter NewDeposit NewDeposit? Deposit betyder insättning; jag gissar att det är balansen du vill spara i ditt objekt

  • money är inte förklarande för vad metoden faktiskt gör. Den borde heta printDeposit, eller printBalance om du nu inte vill skriva ut random insättning. Vad den faktiskt skriver ut nämner ju faktiskt just insättningen; det borde kanske inte den här klassen skriva ut alls, eller så borde det ligga i setDeposit

  • getDeposit "lider" av samma problem som ovan.

  • setDeposit borde bara heta deposit

  • du saknar metod som lägger 10 % bonus på insättning

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av JJ72:

Rätt tänkt?

Du krånglar till det lite i onödan. Uppgiften frågar efter två metoder, och om alla programmeringskurser jag läst lärt mig något så är det att kreativitet sällan uppskattas särskilt mycket. Använd statiska metoder istället, så blir det enklare:

class Whatever { public static void main(String[] args) { int someValue = 17; someValue = addOne(someValue); } private static int addOne(int x) { return x + 1; } }

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Så här?

(oj vad jag suger på detta Borde kanske ägna mig åt något annat?)

import java.util.Scanner; class hepp{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); double saldo = 1000; double rate = .1; int deposit; double depsum; System.out.println("Välkommen till Superspelsajten!!!\nVi ger dig omedelbart " + saldo + " SEK att spela för.\nVi ger dig dessutom 10% extra på dina 10 första insättningar!"); System.out.println("\nVälkommen till din första insättning."); for(int counter = 0; counter < 10;){ System.out.print("\nHur mycket vill du sätta in? "); deposit = scan.nextInt(); counter++; deposit = addDeposit(deposit); depsum = (deposit * rate) + deposit; depsum = addDepsum(depsum); saldo = depsum + saldo; saldo = addSaldo(saldo); counter = addCounter(counter); } System.out.println("Du har inga bonusinsättningar kvar."); } private static int addDeposit(int deposit){ System.out.println("Din insättning: " + deposit + " SEK."); return deposit; } private static double addDepsum(double depsum){ System.out.println("\nVi ger dig: " + depsum + " SEK."); return depsum; } private static double addSaldo(double saldo){ System.out.println("Ditt saldo: " + saldo + " SEK."); return saldo; } private static int addCounter(int counter){ System.out.println("Insättning nr " + counter + " av 10."); return counter; } }

Måste bara säga att jag är otroligt tacksam för all er hjälp

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av JJ72:

Så här?

Nja, du är rätt långt ifrån vad uppgiften efterfrågar nu. Här är lite hjälp med hur programmet ska se ut enligt uppgiften:

class hepp { public static void main(String[] args) { ... } private static int getDeposit() { // Fråga efter insättning. // Läs in insättning. // Returnera insättning. } private static int addBonus(int saldo) { // Lägg på 10% på saldot och returnera det nya saldot. } }

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Ok, tack.

Jag tror att jag börjar hänga med. Jag läste ditt första inlägg och det kanske hjälpte lite (jag vågar inte hoppas för mkt längre )

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Here we go again...

import java.util.Scanner; class hepp{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); hepp heppObject = new hepp(); int deposit; double saldo = 1000; double rate = .1; double bonus; System.out.println("Välkommen till Superspelsajten!!!\nVi ger dig omedelbart " + saldo + " SEK att spela för.\nVi ger dig dessutom 10% extra på dina 10 första insättningar!"); System.out.println("Välkommen till din första insättning."); for(int counter = 0; counter < 10;){ System.out.print("\nHur mycket vill du sätta in? "); deposit = scan.nextInt(); counter++; bonus = heppObject.add(deposit, rate); saldo = heppObject.add(saldo, bonus); System.out.println("\nDu satte in " + deposit + " SEK."); System.out.println("Vi ger dig " + bonus + " SEK."); System.out.println("Ditt saldo är " + saldo + " SEK"); System.out.println("Du har utnyttjat " + counter + " av dina 10 bonusinsättningar."); } System.out.println("Du har inga bonusinsättningar kvar."); } private double add(int deposit, double rate){ return (deposit * rate) + deposit; } private double add(double bonus, double saldo){ return ( bonus + saldo); } }

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Absolut kan jag döpa om en del saker, tex heppObject, men just nu vill jag bara försöka förstå rätt

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2008
Skrivet av JJ72:

Absolut kan jag döpa om en del saker, tex heppObject, men just nu vill jag bara försöka förstå rätt

Mitt tips är att göra rätt från början, och i detta fall syftar jag på namngivning. Du kommer att lära och förstå bättre om du gör det till en rutin att alltid försöka använda bra och tydlig namngivning. Att döpa saker till hepp, pepp, nepp, käpp, grepp osv funkar i väldigt små program, men det skalar inte alls. Redan när du kommer ha få klasser som samarbetar med varandra blir det väldigt jobbigt att underhålla och felsöka kod som du bara döpt till något random. Du kommer lägga onödig tid på att försöka förstå ditt tidigare jag när du egentligen vill förstå varför det vart fel.

Det är guld att kunna skriva självförklarande kod som inte behöver dokumenteras eller till ett minimum. Blir du expert på namngivning och struktur kommer du bli älskad av dina medarbetare

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Aight!

Jag tar åt mig av det du, och alla andra, säger och ska genast bättra mig

Någon kommentar till koden för övrigt?

Trädvy Permalänk
Medlem
Registrerad
Sep 2015

När det handlar om pengar så är oftast double inte någon bra data typ då det är flyttal.
I java kan man använda java.math.BigDecimal för mera exakta beräkningar.
http://www.tutorialspoint.com/java/math/java_math_bigdecimal....
http://stackoverflow.com/questions/588004/is-floating-point-m...

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

ok