Permalänk
Medlem

JAVA: problem med metoder

Hejsan. jJag har problem med metoder.
Det som är mitt program, det är bara en sak. Så låt oss skriva koden enkelt från min sida.

jag ska skriva ett program där du ska kunna skriva in hur många liter bilen dragit och hur många km du åkt.

Låt oss kalla dessa variablar antalLiter samt antalKm.
När du skriver in detta, så ska en METOD returnera svaret i Liter per 100 km.

Du ska alltså kunna skriva in att bilen drack 5 liter och du körde 24km (jag vet den bilen drack jädrigt mkt) och så ska du ändå få svaret uträknat i Liter / 100km.

Jag vet hur jag löser uppgiften med en enkel uträkning genom att jag skapar en variabel som heter resultat = antalLiter * (100 / antalKm).
Men hur ska detta lösas om det är en METOD som ska returnera svaret i Liter per 100km?
Vad är liksom skillnaden mellan att göra en variabel som jag gjorde där och att blanda in en metod? Vad är det positiva med det?

Jag är helt blank.
Notera att kod läser jag alltid igenom, så det är inte copy paste.
Vore sjyst ifall ni kunde bidra med kod. Jag har fått blackout

Tack så mycket för hjälpen!

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk

metoden tar emot två variabler i form av antalliter och antalkm.

Sedan gör den alla beräkningar och får fram ett svar som den skickar tillbaka med return.

Det positiva med en metod är att du sen kan med variablerna antalliter och antalkm kan lägga till ytterligare variabler och anropa en annan metod som räknar ut andra saker.
Och du behöver inte skriva om hela programmet.

Permalänk
Medlem

Typ nåt sånt här?

float getForbrukning(int antalLiter, int antalKm){ float resultat = antalLiter * (100 / antalKm); return resultat; }

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk
Medlem

public class utrakning { public static Double literPerHundraKm(double hundraKmResultat) { double bensin = hundraKmResultat * (100 / antalKm); return bensin; }

Så ser min uträkning.java ut. i den andra filen som heter uppgift.java så hämtar detta. Men det blir antingen helt stört, eller så måste jag deklarera variablar i utrakning.java (som jag trodde jag skulle slippa iom att värdena ska ju hämtas från uppgift.java där alla formulär finns)

Jag har nog missuppfattat allting. Någon som kan droppa lite kod så jag kommer på fötterna och förstår vad jag gjort fel?

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Nioreh83
Typ nåt sånt här?

float getForbrukning(int antalLiter, int antalKm){ float resultat = antalLiter * (100 / antalKm); return resultat; }

Åh... Är det där en metod du skrev där?
Den där koden du skrev där, ska den vara i samma javafil som formuläret, eller kan man slänga in den i utrakning.java?

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

En metod ska ligga inuti en klass. Du kan även bestämma synligheten på metoden precis som med variabler med public eller private etc.

Om du anropar en public metod från en annan klass skriver du "Klassnamn.funktionsNamn(argument)".

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk

Det han skrev där är en metod som returnerar ett float-tal.

Metoden i sig kräver två int-variabler.

Den räknar sedan ut ett resultat från de två och returnerar detta resultat tillbaka till den plats den blev anropad ifrån.

Det här är väldigt enkelt, så ta det lugnt och metodiskt och fundera på det. Om vi hjälper dig genom att knattra ner koden för det här så kommer du absolut inte hänga med längre fram.

Varför inte göra tvärtom.

Skriv ner koden du har och det du har skrivit. Så kan vi ge lite direkta tips om var du behöver förändra, bygga ut etc.

Permalänk
Medlem

Hur ser den exakta koden ut för att anropa en public metod från en annan klass?
är det

double variabel = Klassnamn.funktionsNamn(argument);

?

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk

Den delen du skrivit där anropar metoden funktionsnamn i klassen klassnamn och skickar med argument till metoden.

Den får ett värde returnerat som sedan sparas i variabeln variabel.

Permalänk
Medlem

Sorry att jag blandar med begreppen funktion och metod, men det är typ samma samma.

Metoden jag skrev tar som sagt två heltal som argument och returnerar en float (decimaltal). Vill du kunna skicka in exempelvis 5,3 liter som argument måste du ändra antalLiter till exempelvis en float.

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk
Medlem

så om jag kör

double antalLiter = JOptionPane.showInputDialog("Skriv in hur många liter bilen drack"); double antalKm = JOptionPane.showInputDialog("Skriv in hur många km du åkte"); double resultatIHundraKm = utrakning.omvandlaHundraKm(double antalKm, double antalLiter); JOptionPane.showMessageDialog(null, "Din bil drar " + resultatHundra + " liter per 100km");

Detta tänkte jag ha i uppgift.java

i utrakning.java har jag

public static Double omvandlaHundraKm (double antalLiter, double antalKm) { double bensin = antalLiter * (100 / antalKm); return bensin; }

Så ser koden ut.

Jag skippade det orelevanta i uppgift.java, allt med public class osv

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Är nog smidigast att lägga metoden i samma klass i ett så simpelt program.

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk

det ser korrekt ut. Men din metod omvandlHundraKm tar emot antalLiter och sen antalKM, men du skickar dom till metoden i omvänd ordning.

Du borde även ändra variabeln bensin till ett mer passande namn.
bensinForbrukning kanske?

Permalänk
Medlem

Jo jag vet. Men sen ska jag kunna göra om gallons till lite och kilometer till miles.
Då vill jag gärna ha allt i en egen classs.

Sen också för att jag vill lära mig det. Är ju på G.

Angående koden jag skrev så verkar det som att programmet inte gillar att jag skriver

double resultatIHundraKm = utrakning.omvandlaHundraKm(double antalKm, double antalLiter);

Hur ska man skriva för att den ska samla upp värdena från båda fälten?
För att senare i metoden räkna ut vad resultatet av värdena blir?

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk

Hur menar du samla upp värdena från båda fälten.

Säg att jag kör ditt program. exakt som du har skrivit det nu.

Jag får upp frågan:
Skriv in hur många liter bilen drack?

skriver in 24.

Sen får jag frågan:
Skriv in hur många km du åkte?

där skriver jag in 200

Programmet fortsätter sin exekvering.

antalLiter = 24
antalKM = 200

Vi kommer ner till ditt metodanrop:
double resultatIHundraKm = utrakning.omvandlaHundraKm(double antalKm, double antalLiter);

vilket blir utrakning.omvandlaHundraKm(double 200, double 24)

Vilket tas emot här:
public static Double omvandlaHundraKm (double antalLiter, double antalKm)
och sätts in likadant
omvandlaHundraKM(double 200, double 24)

Där har du första felet
Du deklarerar variablerna igen för varje del av programmet du gör. Det enda programmet vet är att den skickar variabel 1 och 2. Om du byter plats på dom så blir det fel i programmet.

Därefter räknar programmet:
double bensin = antalLiter * (100 / antalKm);

bensin = 200*(100/24) = 833.333333333
(skall vara) 24*(100/200) = 12

12 returneras.

Jag förstår inte hur du menar med samla upp värdena från båda fälten. Den samlar aldrig upp värden. Dom har du redan tillgång till eftersom personen som kör programmet skrev in dom. Utan du skickar två värden till en annan metod.
Jag gissar på att du har problem att anropa från klass till klass och det är egentligen struntsamma. Behöver du ha två separata klasser? Annars, lägg in metoden i samma klass som du redan har och anropa den bara genom att kalla på omvandlaHundraKM(var, var);

I första delen av ditt program har du nu tillgång till värden:
antalKM = 200
antalLiter = 24
resultatIHundraKm = 12

Permalänk
Medlem

Du är en riktig pärla!

Tack för all din hjälp!

Nu förstår jag precis vad jag gjorde för fel, och nu förstår jag precis hur man ska lägga upp metoder.
Jag missuppfattade helt och hållet!

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk

så lite så. alltid kul att kunna hjälpa till.

Får man fel i början på java så blir det bara mycket krångligare än det egentligen är.