Programmeringsproblem i Java - Ändra variabel - Nybörjare

Permalänk

Programmeringsproblem i Java - Ändra variabel - Nybörjare

Hej,

Är ny till Java, och har kört fast i en grej jag vill få till i koden:

Jag har två variabler som är benämnda (int a = 10) och (int b = 15). Tanken är att dessa två variabler ska köras i en ganska lång uträkning och printa ut värdet som fås fram i slutet på ekvationen.

Därefter är min tanke att jag ska kunna byta ut värdet på a och b samt att köra ekvationen igen, utan att behöva lägga in koden igen längre ned. Har kikat lite på att baka in variablerna i en ny metod och sedan köra metoderna efter varandra, men får inte till det.

Kanske förklarar dåligt, men vet någon hur man löser detta?
Tack på förhand

Permalänk
Medlem

@smalafettot:

Skapa en en metod som tar in två integers och utför din beräkning i den metoden så kan du anropa den med vilka värden som helst.

Exempelvis

public void dinEkvation(int a, int b) { din beräkning här. System.out.println("a: " + a + " b: " + b) } public static void main(String[] args) { dinEkvation(10,15); }

Permalänk
Medlem

När jag läser ditt inlägg igen så inser jag att jag nog ändå tolkat det fel, och Esoterics inlägg ovan är nog vad du egentligen är ute efter. Men jag låter mitt svar nedan vara kvar, det kanske är användbart även om det inte direkt svarar på din fråga.

@smalafettot: Om jag tolkar dig rätt så verkar ditt problem vara att returnera resultatet av uträkningen så att du kan uppdatera dina variabler. Java är ett "pass-by-value"-språk, vilket innebär att argument till metoder alltid skickas som värden (värdet av ett objekt är en referens till objektet, vilket gör att vissa ibland tror att Java är "pass-by-reference").

Om du t.ex. har en metod och anropar den med someMethod(a, b) så är det alltså inte a och b som skickas till metoden utan deras värden, så även om du sedan kallar variablerna för a och b inne i metoden så kommer det vara andra variabler som inte kommer påverka variablerna du anropade metoden med.

Vad du troligtvis vill göra är därför att anropa en metod med dina värden, låta metoden returnera resultatet av uträkningen, och sen tilldela resultatet till dina variabler. Java har dock inte stöd för att returnera flera värden från en metod, utan du måste då samla värdena du vill returnera i t.ex. en array eller ett objekt. Här har du några exempel på hur du kan göra.

Permalänk
Skrivet av Esoteric:

@smalafettot:

Skapa en en metod som tar in två integers och utför din beräkning i den metoden så kan du anropa den med vilka värden som helst.

Exempelvis

public void dinEkvation(int a, int b) { din beräkning här. System.out.println("a: " + a + " b: " + b) } public static void main(String[] args) { dinEkvation(10,15); }

Skrivet av perost:

När jag läser ditt inlägg igen så inser jag att jag nog ändå tolkat det fel, och Esoterics inlägg ovan är nog vad du egentligen är ute efter. Men jag låter mitt svar nedan vara kvar, det kanske är användbart även om det inte direkt svarar på din fråga.

@smalafettot: Om jag tolkar dig rätt så verkar ditt problem vara att returnera resultatet av uträkningen så att du kan uppdatera dina variabler. Java är ett "pass-by-value"-språk, vilket innebär att argument till metoder alltid skickas som värden (värdet av ett objekt är en referens till objektet, vilket gör att vissa ibland tror att Java är "pass-by-reference").

Om du t.ex. har en metod och anropar den med someMethod(a, b) så är det alltså inte a och b som skickas till metoden utan deras värden, så även om du sedan kallar variablerna för a och b inne i metoden så kommer det vara andra variabler som inte kommer påverka variablerna du anropade metoden med.

Vad du troligtvis vill göra är därför att anropa en metod med dina värden, låta metoden returnera resultatet av uträkningen, och sen tilldela resultatet till dina variabler. Java har dock inte stöd för att returnera flera värden från en metod, utan du måste då samla värdena du vill returnera i t.ex. en array eller ett objekt. Här har du några exempel på hur du kan göra.

Tack båda två för fina svar. Efter lite meckande så fick jag till det önskade resultatet via Esoterics svar. Men måste metoden vara över main-metoden eller kan jag skriva in dessa efter main-metoden?^

Min sista fråga (vill inte använda er som google): Blir programmet snabbare/bättre om jag använder flera metoder istället för att skriva upprepande kod som jag gjorde innan?

Mvh

Permalänk
Medlem
Skrivet av smalafettot:

Tack båda två för fina svar. Efter lite meckande så fick jag till det önskade resultatet via Esoterics svar. Men måste metoden vara över main-metoden eller kan jag skriva in dessa efter main-metoden?^

Min sista fråga (vill inte använda er som google): Blir programmet snabbare/bättre om jag använder flera metoder istället för att skriva upprepande kod som jag gjorde innan?

Mvh

Att lägga kod i en metod och anropa har som du gissat ett visst teoretiskt overhead, men det är så oerhört minimalt att det lika gärna kunde varit samma sak som att ha koden "inline". Betydligt viktigare är att skriva torr kod. Det är en oerhört viktig programmeringsprincip. Ska samma uträkning göras två gånger med olika indata är det enda rimliga att lägga koden i en metod/funktion som anropas och inte bara köra Ctrl+C, Ctrl+V och därefter försöka underhålla exakt samma sak på två olika platser.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av smalafettot:

Men måste metoden vara över main-metoden eller kan jag skriva in dessa efter main-metoden?^

Det spelar ingen roll.

Skrivet av smalafettot:

Min sista fråga (vill inte använda er som google): Blir programmet snabbare/bättre om jag använder flera metoder istället för att skriva upprepande kod som jag gjorde innan?

Kod kan i vissa fall bli snabbare genom att upprepa den, se loop unrolling (inte specifikt för metoder, men samma princip). Detta är dock en ganska extrem optimering som du i stort sett aldrig borde behöva använda så länge som du inte håller på med något väldigt esoteriskt, typ mikrokontrollers eller liknande.

Vad du normalt borde göra är att följa DRY-principen, d.v.s. "Don't Repeat Yourself". Repeterad kod leder enklare till fel och kod som är svår att ändra på eftersom man måste komma ihåg att ändra på alla ställen som koden används på när man vill göra någon förändring. Om du märker att du ofta repeterar en viss bit kod så är det ett tecken på att du kanske borde stoppa den i en metod eller liknande.

Permalänk

@perost:

Återigen, tack snälla. Det du skriver om att inte upprepa sig själv: jag har i koden en: double Namn = 3.58;

Denna variabel har jag i varje metod. Som ni skriver ska man inte upprepa sig. Bör jag hitta ett kommando för att slippa skriva in även denna i varje metod?

mvh

Permalänk
Medlem
Skrivet av smalafettot:

@perost:

Återigen, tack snälla. Det du skriver om att inte upprepa sig själv: jag har i koden en: double Namn = 3.58;

Denna variabel har jag i varje metod. Som ni skriver ska man inte upprepa sig. Bör jag hitta ett kommando för att slippa skriva in även denna i varje metod?

mvh

Ja, det kan vara ett exempel på den typen av upprepning som ska undvikas. Om Namn alltid är en double med värdet 3.58 bör du (utöver att fundera ut ett mer lämpligt variabelnamn för jag har aldrig träffat någon eller sett något som heter 3.58) definiera den som en konstant (i java definieras konstanter som fält i klasser med static och final som modifiers) i relevant klass (om du inte kommit till klasser än har du nog bara en klass att fundera på). Traditionellt skrivs konstanter med versaler och understreck.

class MyProgram { static final double NAMN = 3.58; static void main(String[] args) { // går att använda här System.out.println(NAMN); System.out.println(addNamnTo(7.0)); } static double addNamnTo(double value) { // eller här return value + NAMN; } }

Om jag nu skulle vilja ändra värdet på NAMN behöver jag bara fundera på att ändra på ett ställe istället för på en hel hög olika på grund av att informationen upprepats lite här och där.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk

@LemonIllusion:

Tack!! Väldigt pedagogisk, hatten av. Ja, har egentligen döpt den till lagringsEffekt men skrev namn i inlägget bara!

Permalänk
Medlem
Skrivet av smalafettot:

@LemonIllusion:

Tack!! Väldigt pedagogisk, hatten av. Ja, har egentligen döpt den till lagringsEffekt men skrev namn i inlägget bara!

Liten notis; en konstant behöver inte vara "static", "final" är nyckelordet du behöver lägga på minnet. Om den ska vara static eller ej beror på vilket sammanhang du ska använda den i, dvs. om du vill att variabeln ska vara på klassnivå eller ej.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Punkfrog:

Liten notis; en konstant behöver inte vara "static", "final" är nyckelordet du behöver lägga på minnet. Om den ska vara static eller ej beror på vilket sammanhang du ska använda den i, dvs. om du vill att variabeln ska vara på klassnivå eller ej.

Om vi lägger på kravet att värdet inte heller ska vara muterbart (vilket enligt mig är en förutsättning för att kalla något för en konstant) känns det tämligen meningslöst att utelämna static (värdet kommer ju ändå vara samma för alla instanser), så jag står nog fast vid att båda bör användas i kombination med versaler för att tydligt kommunicera att det rör sig om ett värde som man kan ta för givet att det aldrig ändras. Muterbara värden skulle jag alltså inte klassa som konstanter även om de är både static och final. Se exempel nedan för hur jag tänker:

import java.util.*; class SumCalculator { // inte konstanter final List<Double> numbers = new ArrayList<>(); static final List<SumCalculator> instances = new ArrayList<>(); // konstant static final int CAPACITY_LIMIT = 32; SumCalculator() { instances.add(this); } void addNumber(double number) { if (numbers.size() < CAPACITY_LIMIT) { numbers.add(number); } else { throw new RuntimeException("list is full"); } } double getSum() { return numbers.stream() .mapToDouble(Double::doubleValue) .sum(); } }

Det här är min åsikt och jag försöker inte sälja det som en universell sanning. Jag ville bara visa hur jag tänker kring konstanter. Ta det som du vill.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.