Permalänk
Medlem

Java fråga [Nyb]

Hej!

Jag är helt ny i hur man använder variabler i matte sammanhang.
Och kan inte få det att fungera. Lite tips och idér är jättevälkomna
ni behöver ej skriva programmet åt mig. Lite in-stickare och tips
vore kanon!

Error:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - bad operand types for binary operator '*'
first type: java.lang.String
second type: java.lang.String
at javaapplication1.JavaApplication1.main(JavaApplication1.java:16)
Java Result: 1

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { String vikt; String langd; vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); String Dela; Dela = (langd * langd ); String Total; Total = vikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + Total); } }

Permalänk
Medlem

Dina variabler langd och vikt är ju av typen String dvs ren text. Vill du räkna så bör du göra om dem till tal med t.ex. int inmatadVikt = Integer.parseInt(vikt);

osv.

Permalänk
Medlem

du måste köra med endra flyttal eller heltal för matematiska funktioner i detta fall, sedan bör du använda en sk parsefunktion för att få dina strängar till hel/flyttal. du får fundera påt ett tag

edit: oops, du fick redan svaret...

Permalänk
Medlem

Skulle nog rekommendera float eller double i detta fall.
Skapa variable av typ double (med litet "d"). Sätt dem sedan med Double.parseDouble().
Om du använder Integer (och int) som föreslagits ovan så kommer du att tappa alla decimaler.

Exempel:

String s; double d; s = JOptionPane.showInputDialog("Ange värde"); d = Double.parseDouble(s);

Sen kan du använda dina double variabler för att utföra beräkningarna med.
Det kan också vara snyggt att göra en Double.toString() innan du skriver ut restultatet (behövs naturligtvis inte på indata då du redan har dem som String) men det är inte helt nödvändigt.

PS. Tror att du skulle få NumberFormatException eller någon form av parse exception om du försökte använda Integer för längden.

PPS. Små bokstäver på variabelnamn, stora på klassnamn.

Permalänk
Medlem

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); int inmatadVikt = Integer.parseInt(vikt); int inmatadLangd = Integer.parseInt(langd); int Dela; Dela = langd * langd; int Total; Total = vikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + Total); } }

Något åt detta ?

Permalänk
Medlem

Tror du var lite snabb där

Du har glömt att deklarera dina indatavariabler och som jag nämnde kommer du att behöva double till längden och resultatet.

Permalänk
Medlem
Skrivet av neterul:

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); int inmatadVikt = Integer.parseInt(vikt); int inmatadLangd = Integer.parseInt(langd); int Dela; Dela = langd * langd; int Total; Total = vikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + Total); } }

Något åt detta ?

Borde vara:

int Dela;
Dela = inmatatLangd* inmatadLangd;

int Total;
Total = inmatadVikt / Dela;

Du skrev nog fel

Och för att undvika krash eller liknande så kan du kasta exceptions, (ifall du skriver "abc" i text rutan och Integer.parseInt("abc") )

try{ int inmatadVikt = Integer.parseInt(vikt); int inmatadLangd = Integer.parseInt(langd); }catch(NumberFormatException e){ System.err.println(e.getMessage()) }

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem

För att göra allt extra komplicerat så måste du nog try catcha int-parsningen.
Om du tex skickar in "olle" i partseint så går det inte att parsa och du kommer att få ett numberformatexception. (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/In...))

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); int inmatadVikt = 0; int inmatadLangd = 0; try { inmatadVikt = Integer.parseInt(vikt); inmatadLangd = Integer.parseInt(langd); } catch (NumberFormatException e) { System.err.println("numberformatexception"); } int Dela; Dela = inmatadLangd * inmatadLangd; int Total; Total = inmatadVikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + inmatadVikt + " kg \nDin längd är: " + inmatadLangd + " meter \nDitt BMI är: " + Total); } }

editerade dit lite deklarations fel..

Visa signatur

intel i5, a-data 4 gb ram, 1 tb caviar black, gigabyte hd5850, win 7 x64 home premium, gigabyte p55m-ud2, dwa-140 wireless

Permalänk
Medlem

Tack för alla svar. har lite att jobba med nu känner jag Ska se om jag reder ut allt. Tack igen!

Permalänk
Medlem

Och lägger vi ihop alla förslag så får vi nedanstående.
* deklarera indatavariabler
* double istället för int
* använda inmantadX vid beräkningarna
* fånga NumberFormatException

Så här ser det ut då:

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { String vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); String langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); try { double inmatadVikt = Double.parseDouble(vikt); double inmatadLangd = Double.parseDouble(langd); } catch (NumberFormatException e) { System.err.println(e.getMessate()); } double dela; dela = inmatadLangd * inmatadLangd; double total; total = inmatadVikt / dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + total); } }

Permalänk
Medlem
Skrivet av Skoter:

För att göra allt extra komplicerat så måste du nog try catcha int-parsningen.
Om du tex skickar in "olle" i partseint så går det inte att parsa och du kommer att få ett numberformatexception. (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/In...))

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); int inmatadVikt = 0; int inmatadLangd = 0; try { inmatadVikt = Integer.parseInt(vikt); inmatadLangd = Integer.parseInt(langd); } catch (NumberFormatException e) { System.err.println("numberformatexception"); } int Dela; Dela = inmatadLangd * inmatadLangd; int Total; Total = inmatadVikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + inmatadVikt + " kg \nDin längd är: " + inmatadLangd + " meter \nDitt BMI är: " + Total); } }

editerade dit lite deklarations fel..

Vad löjligt, satt och editera och skrev till try catch och sen hade du skrivit det :-).

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem

Detta är vad jag kommit upp med nu.. får fortf roliga komp fel..

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { String vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); String langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); try { double inmatadVikt = Integer.parseInt(vikt); double inmatadLangd = Integer.parseInt(langd); } catch (NumberFormatException e) { System.err.println("numberformatexception"); } double Dela = inmatadLangd * inmatadLangd; double Total = inmatadVikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + Total); } }

error:
numberformatexception
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: variable inmatadLangd
location: class javaapplication1.JavaApplication1
at javaapplication1.JavaApplication1.main(JavaApplication1.java:20)
Java Result: 1

Permalänk
Medlem

Ser mer ut som runtime errors och inte kompileringsfel. D.v.s du kör koden och det blir fel på vägen.
Eftersom den skriver ut "numberformatexception" så betyder det att det du skriver in inte går att parsa.

Som jag skrivit 3 gånger tidigare (:)) så måste du använda Double.parseDouble() till längden då denna ska antes i meter (exempelvis 1.70 gissar jag). Integer kan inte hantera decimaler. Därför får du fel.

Se mitt tidigare inlägg "Och lägger vi ihop alla förslag så får vi nedanstående." så ser du hur jag menar.

Permalänk
Medlem

Du får nog också importera java.lang.NumberFormatException.

Använder du netbeans förästen?

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem
Skrivet av KGB_HC:

Ser mer ut som runtime errors och inte kompileringsfel. D.v.s du kör koden och det blir fel på vägen.
Eftersom den skriver ut "numberformatexception" så betyder det att det du skriver in inte går att parsa.

Som jag skrivit 3 gånger tidigare (:)) så måste du använda Double.parseDouble() till längden då denna ska antes i meter (exempelvis 1.70 gissar jag). Integer kan inte hantera decimaler. Därför får du fel.

Se mitt tidigare inlägg "Och lägger vi ihop alla förslag så får vi nedanstående." så ser du hur jag menar.

Aa ledsen missade det.

Får lite andra kul fel här.

rad 20: cannot find symbol: variable inmatadLangd location: javaapplication1;
rad 21: cannot find symbol: variable inmatadVikt location: javaapplication1;

package javaapplication1; import javax.swing.*; public class JavaApplication1 { public static void main(String[] args) { String vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); String langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); try { double inmatadVikt = Double.parseDouble(vikt); double inmatadLangd = Double.parseDouble(langd); } catch (NumberFormatException e) { System.err.println("Error r: "); } double Dela = inmatadLangd * inmatadLangd; double Total = inmatadVikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + Total); } }

Permalänk
Medlem
Skrivet av neterul:

Detta är vad jag kommit upp med nu.. får fortf roliga komp fel..

I Java så har en variabel en livslängd som motsvarar det block som den finns i, där ett block definieras med {}. Så fort du lämnar ett block så försvinner alla variabler du deklarerat i det. Problemet är därför att du deklarerar dina variabler inmatatVikt och inmatatLangd i try-blocket. Så fort du går ur det blocket så försvinner dina variabler, vilket är orsaken till att du får felet att inmatatLangd inte kunde hittas på rad 20. Du måste deklarera variablerna utanför try-blocket för att kunna använda dem utanför blocket.

Permalänk
Medlem

På engelska så kallas begreppet perost talar om för "scope".

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem

så jag ska baka in de som skrivs ut osv i try { } ?

Permalänk
Medlem
Skrivet av neterul:

så jag ska baka in de som skrivs ut osv i try { } ?

Flytta snarare ut variabelderklarationerna ur try-blocket:

double inmatadVikt; double inmatadLangd; try { inmatadVikt = Double.parseDouble(vikt); inmatadLangd = Double.parseDouble(langd); } catch (NumberFormatException e) { System.err.println("Error r: "); }

Permalänk
Medlem
Skrivet av neterul:

så jag ska baka in de som skrivs ut osv i try { } ?

package javaapplication1; import javax.swing.*; import java.lang.NumberFormatException; public class JavaApplication1 { public static void main(String[] args) { String vikt = JOptionPane.showInputDialog("Ange vikt: (Heltal)"); String langd = JOptionPane.showInputDialog("Ange längd: (i meter)"); double inmatadVikt = null; double inmatadLangd = null; try { inmatadVikt = Double.parseDouble(vikt); inmatadLangd = Double.parseDouble(langd); } catch (NumberFormatException e) { System.err.println(e.getMessage()); } double Dela = inmatadLangd * inmatadLangd; double Total = inmatadVikt / Dela; JOptionPane.showMessageDialog(null, "Din vikt är: " + vikt + " kg \nDin längd är: " + langd + " meter \nDitt BMI är: " + Total); } }

Såhär, allt du definerar innanför block försvinner när programmet lämmnar blocken.

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem

Fick vi massa annat kul hehe.. Java <3
Uncompilable source code - variable inmatadLangd might not have been initialized

double Dela; Dela = inmatadLangd * inmatadLangd; double Total; Total = inmatadVikt / Dela;

Edit:

Nu funkar det att köra.

Dock blir Bmi "BMI: Infinity"

Permalänk
Medlem
Skrivet av neterul:

Fick vi massa annat kul hehe.. Java <3
Uncompilable source code - variable inmatadLangd might not have been initialized

double Dela; Dela = inmatadLangd * inmatadLangd; double Total; Total = inmatadVikt / Dela;

Edit:

Nu funkar det att köra.

Dock blir Bmi "BMI: Infinity"

Låter som att "Dela" är 0. Skriv ut värdet på Dela så du ser vad det blir.

Permalänk
Medlem

#Uncompilable source code - variable inmatadLangd might not have been initialized
Betyder vell att du försöker räkna på något som kanske inte nes existerar eftersom du kör try/catch

De lär försvinna om du sätter dem till null.

double inmatadVikt = null;
double inmatadLangd = null;

-Edit- Nu blev jag osäker, jag och mitt C++ tänk :P. Sätt dem till =0 istället. null i java är inte samma sak som NULL C++.

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem
Skrivet av ediz:

#Uncompilable source code - variable inmatadLangd might not have been initialized
Betyder vell att du försöker räkna på något som kanske inte nes existerar eftersom du kör try/catch

De lär försvinna om du sätter dem till null.

double inmatadVikt = null;
double inmatadLangd = null;

-Edit- Nu blev jag osäker, jag och mitt C++ tänk :P. Sätt dem till =0 istället. null i java är inte samma sak som NULL C++.

I detta fall är nog problemet att koden där variablerna används inte "kan se" att variablerna har satts inne i try-blocket. Men att sätta dem till 0 (som ediz föreslår) borde väl lösa problemet.

Permalänk
Medlem

Det fungerar nu. Man kunde tydligen inte skriva in längden med ett kommatecken.. Utan fick
använda en punkt ist.

FEL: 1,90
Rätt: 1.90

Men nu fungerar det iaf

Tack för all hjälp gott folk!

Permalänk
Medlem
Skrivet av neterul:

Det fungerar nu. Man kunde tydligen inte skriva in längden med ett kommatecken.. Utan fick
använda en punkt ist.

FEL: 1,90
Rätt: 1.90

Men nu fungerar det iaf

Tack för all hjälp gott folk!

det bör väll gå att ställa in språkstandard i java, localization eller liknande till svenska, ev köra en replace på tecknet , till . om det förekommer i strängen, en liten fullösning dock.