Nybörjare behöver hjälp med Javaproblem!

Trädvy Permalänk
Medlem
Registrerad
Sep 2007

Nybörjare behöver hjälp med Javaproblem!

Som rubriken lyder.
Jag är nu färdig med Programmering A och började på B-kursen men här körde jag fast.
Förmodligen vet jag lösningen men jag kan inte gräva ordentligt i min hjärna för att finna den, det vore guld värt om någon kan ta sig en titt på min kod och förklara vad det är jag har gjort fel. Måhända att allt är helt fel.

All hjälp är väldigt uppskattad.

Uppgiften är som följande:

Skriv ett Javaprogram som beräknar medelvärdet av ett antal heltal. Antal matas in i en dialogruta vid uppstarten. Sedan visar programmet flera dialogrutor i följd, där man matar in heltalen (en i taget).

import javax.swing.JOptionPane; public class help { public static void main(String[] args) { String s1 = null; String s = JOptionPane.showInputDialog("Antal heltal?"); int antal = Integer.parseInt(s); double[] f = new double[antal]; for (int i = 0; i < f.length; i++) ; while (true){ if (antal > 0) s1 = JOptionPane.showInputDialog("Nästa heltal"); else if (antal < 0 || antal == 0) break; int antal1 = Integer.parseInt(s1); double sum = antal/antal1; System.out.println(sum); } } }

Sedan för ett högre betyg behövs även

Man behöver inte mata in antal vid uppstarten. Serien av heltalen matas in i flera dialogrutor och man kan avslutas inmatningen med avbryt-knappen (Cancel) i den sista dialogrutan.

Men det där bör jag kunna lista ut på egen hand så fort koden är färdig.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009

Du har en for-loop som inte gör någonting och sen en forever-loop istället, varför inte använda den första?

Du minskar aldrig variabeln antal, så loopen kommer spinna i all evighet.

Du ska nog endast ha dialogrutans kod i loopen?

Edit: sen tor jag du räknar ut medelvärdet fel också?

Edit2: Det är nog också dags att lära sig använda bättre variabelnamn, så blir koden lättare att förstå.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Du har en for-loop som inte gör någonting och sen en forever-loop istället, varför inte använda den första?

Du minskar aldrig variabeln antal, så loopen kommer spinna i all evighet.

Du ska nog endast ha dialogrutans kod i loopen?

Edit: sen tor jag du räknar ut medelvärdet fel också?

Edit2: Det är nog också dags att lära sig använda bättre variabelnamn, så blir koden lättare att förstå.

Jag har grejat en del med looparna och har inte fått till det men jag kunde få fram "JOptionPane.showInputDialog("Nästa heltal");"-fönstret med while-loopen.

Du menar att jag endast borde ha showInputDialog i loopen? Hur ska den då förstå varför den ska loopa?

Du har rätt angående medelvärdet...

Jag ska fortsätta kolla på detta och försöka få lite bättre ordning på detta.
Jag tackar för hjälpen. Övning ger färdighet, heter det.

Edit:
När jag stal ett gäng koder från min bok knåpade jag ihop följande:

String s = showInputDialog("Antal medelvärden"); final int antalet = Integer.parseInt(s); double sum = 0; int[] f = new int[antalet]; int i = 0; for ( i = 0; i<f.length; i++);{ s = JOptionPane.showInputDialog("Medelvärde " + i + "? "); f[i] = Integer.parseInt(s); sum += f[i]; } double medelv = sum / antalet; System.out.println(medelv);

Mitt problem är att jag inte riktigt vet eller förstår hur jag ska lyckas fixa så att man kan få in fler dialogrutor där tal ska matas in.
Jag försökte i min första kod men där, som du sa, loopade det i evighet.

Jag vill på något sätt kunna spara ner "Antal medelvärden" som ska stoppas in i en variabel och sedan loopa ett input-fönster sålänge som jag vill mata in heltal och senare spara ner dessa för att räkna ut medelvärdet.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Jag har grejat en del med looparna och har inte fått till det men jag kunde få fram "JOptionPane.showInputDialog("Nästa heltal");"-fönstret med while-loopen.

Du menar att jag endast borde ha showInputDialog i loopen? Hur ska den då förstå varför den ska loopa?

Du har rätt angående medelvärdet...

Jag ska fortsätta kolla på detta och försöka få lite bättre ordning på detta.
Jag tackar för hjälpen. Övning ger färdighet, heter det.

Du börjar ju med att ange antal i en separat dialog, svaret använder du som gräns in en for-loop. I for-loopen adderar du varje svar till en summa som du efter loopen dividerar med antalet so användaren angav.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Du börjar ju med att ange antal i en separat dialog, svaret använder du som gräns in en for-loop. I for-loopen adderar du varje svar till en summa som du efter loopen dividerar med antalet so användaren angav.

Ok.
Vi har ju variabeln antalet som kopierar variabeln s från inputdialogen, variabeln "antalet" stoppas in i arrayen.
S-stränger har en inputdialog som jag sätter som "antalet" och stoppar in i en array.

I forloopen har jag 1 som sätts till 0 och ökas varje varv, sålänge i är mindre än längden på min array loopas det igen.
Det är här något går snett.

När jag kör programmet och stoppar in 5 exempelvis i första dialogrutan, kommer nästa upp där den ber mig att stoppa i "Medelvärde 5", istället för "Medelvärde 1" och efter detta stängs programmet.

Jag lyckas inte loopa en dialogruta fem gånger.

Det må vara luddigt beskrivet men jag försöker så gott jag kan.
Jag tackar än en gång för din tålmodighet!

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Ok.
Vi har ju variabeln antalet som kopierar variabeln s från inputdialogen, variabeln "antalet" stoppas in i arrayen.
S-stränger har en inputdialog som jag sätter som "antalet" och stoppar in i en array.

I forloopen har jag 1 som sätts till 0 och ökas varje varv, sålänge i är mindre än längden på min array loopas det igen.
Det är här något går snett.

När jag kör programmet och stoppar in 5 exempelvis i första dialogrutan, kommer nästa upp där den ber mig att stoppa i "Medelvärde 5", istället för "Medelvärde 1" och efter detta stängs programmet.

Jag lyckas inte loopa en dialogruta fem gånger.

Det må vara luddigt beskrivet men jag försöker så gott jag kan.
Jag tackar än en gång för din tålmodighet!

Ignorera detta, blandade ihop det med size.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Ignorera detta, blandade ihop det med size.

Ja, nu förstår jag varför det blev som det blev.

Nu är det egentligen bara loopen kvar då, misstänker jag.
Tack!

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Ja, nu förstår jag varför det blev som det blev.

Nu är det egentligen bara loopen kvar då, misstänker jag.
Tack!

Du behöver ingen array för uppgiften, den krånglar bara till det. Kör for-loopen från i=0 till i<antalet, och plussa ihop varje input från användaren.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Du behöver ingen array för uppgiften, den krånglar bara till det. Kör for-loopen från i=0 till i<antalet, och plussa ihop varje input från användaren.

Ingen array? Jag litar på dig.
Jag sätter mig och pillar på detta direkt, tack för hjälpen!

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Ingen array? Jag litar på dig.
Jag sätter mig och pillar på detta direkt, tack för hjälpen!

Du fyller den, men du använder aldrig innehållet till något. Den ligger bara och äter minne

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
KTH, Datateknik
Registrerad
Jun 2011

@kalleftw Hej!

Roligt att du har fått upp intresset för programmering. Efter att ha kollat igenom din lösning har jag identifierat några fel och har några funderingar kring dina tankegångar. Vi kan börja uppifrån och ned:

Rad 9:
Här har du skapat en array med namnet f med storleken som motsvarar antalet nummer som användaren angett. Varför? Det vore ju otroligt mycket enklare att endast skapa en int där du sedan adderar de värden som användaren skriver in. I resten av programmet används sedan inte denna array på något sätt, vilket innebär att de tal som användaren matar in aldrig sparas i programmet för att sedan kunna användas för att räkna ut medelvärdet.

Rad 10: Din for-loop ser konstig ut. For-loopar ser vanligtvis ut såhär:

for(int i = 0; i < 10; i++){ //Kod som skall exekveras så länge forloopens villkor är giltig }

Du har med andra ord missat att omsluta innehållet i forloopen med curly brackets {}.

Rad 11: Semikolonet skall bort (läs ovanstående kommentar om rad 10).

Rad 12: Här har du en while-loop som alltid kommer att vara sann. Varför har du inte nyttjat forloopen ovan? Ta bort hela while-loopen då den inte behövs.

Rad 13-15: Den loop med de villkor du har satt behövs inte. Utveckla gärna din tankegång om vad du vill att loopen skall åstadkomma.

Rad 18: antal1 kommer alltid att skrivas över (d.v.s. kommer du aldrig summera alla tal som användaren matar in).

Rad 20: Din double kommer alltid att vara avrundad till närmsta heltal då du dividerat två ints. Du måste först casta ena integern till en double för att få ut en korrekt avrundad double.

Rad 21: Vad är meningen med att använda JOptionPane om resultatet sedan kastas ut i konsolen? Antingen kör du all input/output via console eller all input/output via JOptionPane. Gäller att vara konsekvent

Har säkert missat att kommentera på en hel del, men skulle starkt rekommendera dig att läsa på om loopar, satser, variable scope samt innan du börjar skriva programmet skapar dig en tydligt uppfattning om vad som behöver göras för att nå önskat resultat (ungefär på samma sätt att man skapar en ritning för ett hus innan man börjar bygga det, gör man det i efterhand/under loppets gång blir resultatet oftast kaosartat).

Som en liten bonus har jag här nedan knåpat ihop en lösning som baseras på din kod, men med några modifikationer:
1) Istället för att spara alla värden i en array summerar jag de direkt i for-loopen till en int.
2) While-loopen har helt och håller rykt.
3) If-else, satsen har helt och hållet rykt.
4) Medelvärdet beräknas numera korrekt genom att jag castat en integer till en double (läs på om casting).
5) Resultatet ges nu i for av en JOptionPane.

Som sagt, koden är endast för att demonstrera hur en alternativ lösning skulle kunna se ut, för att bättre illustrera vilka fel som existerade i din kod. Koden kan dock förbättras, t.ex. kontrollerar jag inte input-värdet för antalet tal som skall matas in (detta får du fixa själv). Ta inte koden rakt av, du gör dig bara en björntjänst i längden. Koden är som sagt en hjälp för dig att förstå vilka fel du har gjort. Ta istället tillfället i akt och läs på om allt som jag tipsat dig om, det kommer att underlätta din framtida programmering. Efter att du läst på om ovanstående kan du sätta dig ner och från grunden tänka hur du skall lösa uppgiften, och därefter börja om från början.

Slutligen: Döp alla variabler och skriv all kod på engelska. Dessutom bör du döpa variabler till något vettigt som gör så att man endast genom att kolla på namnet förstår vad det är för något. Exempelvis säger "antal1" inget om variabelns innehåll, och "sum" är rentav missvisande då du där beräknar medelvärdet och inte någon summa (vilket förövrigt också är felaktigt i din kod, då du dividerar antal med antal1 när det i själva verket skall vara tvärt om).

import javax.swing.JOptionPane; public class Help { public static void main(String[] args) { String s = JOptionPane.showInputDialog("Antal heltal?"); int numberOfIntegers = Integer.parseInt(s); int numberSum = 0; for (int i = 0; i < numberOfIntegers; i++){ String enteredNumber = JOptionPane.showInputDialog("Nästa heltal"); int currentNumber = Integer.parseInt(enteredNumber); numberSum += currentNumber; } double average = (((double) numberSum)/numberOfIntegers); JOptionPane.showMessageDialog (null, average, "Medelvärdet", JOptionPane.INFORMATION_MESSAGE); } }

Dold text

Citera för svar!

Stationär: Fractal Design Arc | Asus P8P67 Pro B3 | Intel i5 2500k @ 3.3 Ghz | Corsair Vengeance 8GB CL9 @ 1600 Mhz | Asus GTX580 Direct CU II | Antec Kühler H20 620 | 5 TB HDD | 128 GB SSD (Crucial M4) | Corsair HX 850W | W7
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | W8

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Du fyller den, men du använder aldrig innehållet till något. Den ligger bara och äter minne

String s = JOptionPane.showInputDialog("Hur många heltal?"); int antal = Integer.parseInt(s); for (int i = 0; i<antal; i++)

Kommer dit tills jag får mitt vanliga problem, jag vill ju på något sätt loopa en dialogruta.
Jag skulle egentligen vilja göra detta genom en while-sats så att den kan loopas fram tills man trycker cancel. Är detta sättet att gå tillväga eller finns det andra möjligheter som jag inte tänker på?

EDIT:

Verkar ha löst det problem nu, i alla fall!

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

String s = JOptionPane.showInputDialog("Hur många heltal?"); int antal = Integer.parseInt(s); for (int i = 0; i<antal; i++)

Kommer dit tills jag får mitt vanliga problem, jag vill ju på något sätt loopa en dialogruta.
Jag skulle egentligen vilja göra detta genom en while-sats så att den kan loopas fram tills man trycker cancel. Är detta sättet att gå tillväga eller finns det andra möjligheter som jag inte tänker på?

EDIT:

Verkar ha löst det problem nu, i alla fall!

Ja, du kan enkelt köra en while-loop tills returvärdet från dialogrutan är att man klickade cancel.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av RedRetro:

@kalleftw Hej!

Roligt att du har fått upp intresset för programmering. Efter att ha kollat igenom din lösning har jag identifierat några fel och har några funderingar kring dina tankegångar. Vi kan börja uppifrån och ned:

Rad 9:
Här har du skapat en array med namnet f med storleken som motsvarar antalet nummer som användaren angett. Varför? Det vore ju otroligt mycket enklare att endast skapa en int där du sedan adderar de värden som användaren skriver in. I resten av programmet används sedan inte denna array på något sätt, vilket innebär att de tal som användaren matar in aldrig sparas i programmet för att sedan kunna användas för att räkna ut medelvärdet.

Rad 10: Din for-loop ser konstig ut. For-loopar ser vanligtvis ut såhär:

for(int i = 0; i < 10; i++){ //Kod som skall exekveras så länge forloopens villkor är giltig }

Du har med andra ord missat att omsluta innehållet i forloopen med curly brackets {}.

Rad 11: Semikolonet skall bort (läs ovanstående kommentar om rad 10).

Rad 12: Här har du en while-loop som alltid kommer att vara sann. Varför har du inte nyttjat forloopen ovan? Ta bort hela while-loopen då den inte behövs.

Rad 13-15: Den loop med de villkor du har satt behövs inte. Utveckla gärna din tankegång om vad du vill att loopen skall åstadkomma.

Rad 18: antal1 kommer alltid att skrivas över (d.v.s. kommer du aldrig summera alla tal som användaren matar in).

Rad 20: Din double kommer alltid att vara avrundad till närmsta heltal då du dividerat två ints. Du måste först casta ena integern till en double för att få ut en korrekt avrundad double.

Rad 21: Vad är meningen med att använda JOptionPane om resultatet sedan kastas ut i konsolen? Antingen kör du all input/output via console eller all input/output via JOptionPane. Gäller att vara konsekvent

Har säkert missat att kommentera på en hel del, men skulle starkt rekommendera dig att läsa på om loopar, satser, variable scope samt innan du börjar skriva programmet skapar dig en tydligt uppfattning om vad som behöver göras för att nå önskat resultat (ungefär på samma sätt att man skapar en ritning för ett hus innan man börjar bygga det, gör man det i efterhand/under loppets gång blir resultatet oftast kaosartat).

Som en liten bonus har jag här nedan knåpat ihop en lösning som baseras på din kod, men med några modifikationer:
1) Istället för att spara alla värden i en array summerar jag de direkt i for-loopen till en int.
2) While-loopen har helt och håller rykt.
3) If-else, satsen har helt och hållet rykt.
4) Medelvärdet beräknas numera korrekt genom att jag castat en integer till en double (läs på om casting).
5) Resultatet ges nu i for av en JOptionPane.

Som sagt, koden är endast för att demonstrera hur en alternativ lösning skulle kunna se ut, för att bättre illustrera vilka fel som existerade i din kod. Koden kan dock förbättras, t.ex. kontrollerar jag inte input-värdet för antalet tal som skall matas in (detta får du fixa själv). Ta inte koden rakt av, du gör dig bara en björntjänst i längden. Koden är som sagt en hjälp för dig att förstå vilka fel du har gjort. Ta istället tillfället i akt och läs på om allt som jag tipsat dig om, det kommer att underlätta din framtida programmering. Efter att du läst på om ovanstående kan du sätta dig ner och från grunden tänka hur du skall lösa uppgiften, och därefter börja om från början.

Slutligen: Döp alla variabler och skriv all kod på engelska. Dessutom bör du döpa variabler till något vettigt som gör så att man endast genom att kolla på namnet förstår vad det är för något. Exempelvis säger "antal1" inget om variabelns innehåll, och "sum" är rentav missvisande då du där beräknar medelvärdet och inte någon summa (vilket förövrigt också är felaktigt i din kod, då du dividerar antal med antal1 när det i själva verket skall vara tvärt om).

import javax.swing.JOptionPane; public class Help { public static void main(String[] args) { String s = JOptionPane.showInputDialog("Antal heltal?"); int numberOfIntegers = Integer.parseInt(s); int numberSum = 0; for (int i = 0; i < numberOfIntegers; i++){ String enteredNumber = JOptionPane.showInputDialog("Nästa heltal"); int currentNumber = Integer.parseInt(enteredNumber); numberSum += currentNumber; } double average = (((double) numberSum)/numberOfIntegers); JOptionPane.showMessageDialog (null, average, "Medelvärdet", JOptionPane.INFORMATION_MESSAGE); } }

Dold text

Hejsan!
Tack, det var verkligen hyggligt att du tog dig tid att kolla igenom koden, peka ut felen och tipsa mig om vad som behöver fixas.
Det blev mycket enklare att förstå mina fel när jag kunde se hur det ska se ut för att det ska fungera.

Jag tar till mig allt du skrev och jag ska jobba på det.
Tack!

Skrivet av DunderKlumpen:

Ja, du kan enkelt köra en while-loop tills returvärdet från dialogrutan är att man klickade cancel.

Perfekt.
Nu verkar jag ha fått lite ordning på det hela.
Jag tackar även dig för allt hjälp!

Trädvy Permalänk
Medlem
Plats
KTH, Datateknik
Registrerad
Jun 2011
Skrivet av kalleftw:

Hejsan!
Tack, det var verkligen hyggligt att du tog dig tid att kolla igenom koden, peka ut felen och tipsa mig om vad som behöver fixas.
Det blev mycket enklare att förstå mina fel när jag kunde se hur det ska se ut för att det ska fungera.

Jag tar till mig allt du skrev och jag ska jobba på det.
Tack!

Det var så lite, alla har vi varit nybörjare någon gång. Hoppas att du ger dig på uppgiften för högre betyg. Lycka till!

Citera för svar!

Stationär: Fractal Design Arc | Asus P8P67 Pro B3 | Intel i5 2500k @ 3.3 Ghz | Corsair Vengeance 8GB CL9 @ 1600 Mhz | Asus GTX580 Direct CU II | Antec Kühler H20 620 | 5 TB HDD | 128 GB SSD (Crucial M4) | Corsair HX 850W | W7
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | W8

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004
Skrivet av kalleftw:

Jag har grejat en del med looparna och har inte fått till det men jag kunde få fram "JOptionPane.showInputDialog("Nästa heltal");"-fönstret med while-loopen.

Du menar att jag endast borde ha showInputDialog i loopen? Hur ska den då förstå varför den ska loopa?

Du har rätt angående medelvärdet...

Jag ska fortsätta kolla på detta och försöka få lite bättre ordning på detta.
Jag tackar för hjälpen. Övning ger färdighet, heter det.

Edit:
När jag stal ett gäng koder från min bok knåpade jag ihop följande:

String s = showInputDialog("Antal medelvärden"); final int antalet = Integer.parseInt(s); double sum = 0; int[] f = new int[antalet]; int i = 0; for ( i = 0; i<f.length; i++);{ s = JOptionPane.showInputDialog("Medelvärde " + i + "? "); f[i] = Integer.parseInt(s); sum += f[i]; } double medelv = sum / antalet; System.out.println(medelv);

Mitt problem är att jag inte riktigt vet eller förstår hur jag ska lyckas fixa så att man kan få in fler dialogrutor där tal ska matas in.
Jag försökte i min första kod men där, som du sa, loopade det i evighet.

Jag vill på något sätt kunna spara ner "Antal medelvärden" som ska stoppas in i en variabel och sedan loopa ett input-fönster sålänge som jag vill mata in heltal och senare spara ner dessa för att räkna ut medelvärdet.

Jag såg att du fick svar men vet inte hur klart felet i den här koden kom fram, så jag tänkte reda ut det. I fall du redan har fått det klart kan du skippa detta.

Felet ligger i följande kodbit:

for ( i = 0; i<f.length; i++);{ s = JOptionPane.showInputDialog("Medelvärde " + i + "? "); f[i] = Integer.parseInt(s); sum += f[i]; }

Och närmare bestämt i semikolonet efter for-loopens parenteser.

En sats (if-sats, else-sats, for-loop, while-loop etc.) kan antingen innesluta innehållet i brackets {}, eller om det endast rör sig om en rad, med ett semikolon.

Inget säger att en sats måste innehålla någon kod, och brackets kan även omsluta kod som inte hör till någon if-sats eller dylikt.

Ovanstående kod läser datorn således som:

// Kör loopen så länge i är mindre än f.length for ( i = 0; i<f.length; i++); // <- gör ingenting // Nu har for-loopen kört färdigt, i har värdet f.length // Kör nu nästa bit av koden { s = JOptionPane.showInputDialog("Medelvärde " + i + "? "); f[i] = Integer.parseInt(s); sum += f[i]; } // <-- dessa brackets hör inte ihop med någon loop, eftersom loopen slutade vid semikolonet

Lösning? Tag bort semikolonet direkt efter for-loopen.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av Tazavoo:

Lösning? Tag bort semikolonet direkt efter for-loopen.

Nja, for-loopen användes inte alls. Han försökte med while-loopen istället om du läser hans andra inlägg, vilket är en bra ide om man ska göra del två också.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004
Skrivet av DunderKlumpen:

Nja, for-loopen användes inte alls. Han försökte med while-loopen istället om du läser hans andra inlägg, vilket är en bra ide om man ska göra del två också.

I hans första inlägg, jo. I det andra inlägget som jag citerade använde han en for-loop, men hade problemet att den bara körde sista varvet. Detta berodde alltså på ett litet semi-kolon, som gjorde att koden som borde ha körts inom for-loopen endast kördes efteråt.

Jag valde att kommentera detta då koden i det inlägget annars såg bra ut, och jag inte själv genast noterade det lilla felet.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av Tazavoo:

I hans första inlägg, jo. I det andra inlägget som jag citerade använde han en for-loop, men hade problemet att den bara körde sista varvet. Detta berodde alltså på ett litet semi-kolon, som gjorde att koden som borde ha körts inom for-loopen endast kördes efteråt.

Jag valde att kommentera detta då koden i det inlägget annars såg bra ut, och jag inte själv genast noterade det lilla felet.

Ahh sorry, missade det när jag läste på mobilen.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007

Nu känner jag att jag har fått duglig ordning på det hela.

import javax.swing.*; public class Medelvärde { public static void main(String[] args) { String s = JOptionPane.showInputDialog("Hur många heltal?"); int antalHeltal = Integer.parseInt(s); int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } }

Det finns säkerligen hundratals sätt att förbättra den men jag är ganska nöjd.
Jag har försökt att ge mig på delen för högre betyg, jag har förstått att det förmodligen är bra att använda sig av en while-loop. Problemet är att jag inte får ihop hur det ska vara.

För mig blir det:

import javax.swing.*; public class test { public static void main(String[] args) { int knappNr; knappNr = JOptionPane.showConfirmDialog(null, "Vill du beräkna antal heltal?"); while (knappNr == 0) { //Om man trycker "Yes" så ska det ju vara som vanligt String s = JOptionPane.showInputDialog("Hur många heltal?"); } //Vill stänga detta, så att det går klämma in en knappNr == 1 någonstans här. int antalHeltal = Integer.parseInt(s); //S hittar inget värde int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } }

Det är väldigt frustrerande med tanke på att hela kursen är klar efter detta och att jag har klarat av värre problem i Java än detta.

Hoppas att någon orkar ta sig en titt och vägleda mig!

EDIT:
Problemet ligger i detta:

Man behöver inte mata in antal vid uppstarten.

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Okt 2011
Skrivet av kalleftw:

Nu känner jag att jag har fått duglig ordning på det hela.

import javax.swing.*; public class Medelvärde { public static void main(String[] args) { String s = JOptionPane.showInputDialog("Hur många heltal?"); int antalHeltal = Integer.parseInt(s); int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } }

Det finns säkerligen hundratals sätt att förbättra den men jag är ganska nöjd.
Jag har försökt att ge mig på delen för högre betyg, jag har förstått att det förmodligen är bra att använda sig av en while-loop. Problemet är att jag inte får ihop hur det ska vara.

För mig blir det:

import javax.swing.*; public class test { public static void main(String[] args) { int knappNr; knappNr = JOptionPane.showConfirmDialog(null, "Vill du beräkna antal heltal?"); while (knappNr == 0) { //Om man trycker "Yes" så ska det ju vara som vanligt String s = JOptionPane.showInputDialog("Hur många heltal?"); } //Vill stänga detta, så att det går klämma in en knappNr == 1 någonstans här. int antalHeltal = Integer.parseInt(s); //S hittar inget värde int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } }

Det är väldigt frustrerande med tanke på att hela kursen är klar efter detta och att jag har klarat av värre problem i Java än detta.

Hoppas att någon orkar ta sig en titt och vägleda mig!

Du är rätt på det, men du vill ha mer än frågan om du vill beräkna medelvärde i while-loopen. Allt du vill göra medan någon vill fortsätta ska vara i den

Sedan ett tips är att du vill nog använda "knappNr = JOptionPane.showConfirmDialog(null, "Vill du beräkna antal heltal?");" på fler ställen...

Corsair Vengeance LPX 2x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av gaminggirl:

Du är rätt på det, men du vill ha mer än frågan om du vill beräkna medelvärde i while-loopen. Allt du vill göra medan någon vill fortsätta ska vara i den

Sedan ett tips är att du vill nog använda "knappNr = JOptionPane.showConfirmDialog(null, "Vill du beräkna antal heltal?");" på fler ställen...

Du menar att jag ska låta

while knappNr == 0

löpa genom hela koden?
Hur ska jag då få till det om man nu skulle trycka "Nej" på frågan? Skulle inte koden bli väldigt lång?

Jag tycker att det borde finnas ett enklare sätt att lösa detta på men som sagt så är jag endast nybörjare och ni andra kan detta mycket bättre än mig, det var bara en tanke.

Eller så missförstod jag dig.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Nu känner jag att jag har fått duglig ordning på det hela.

Det finns säkerligen hundratals sätt att förbättra den men jag är ganska nöjd.
Jag har försökt att ge mig på delen för högre betyg, jag har förstått att det förmodligen är bra att använda sig av en while-loop. Problemet är att jag inte får ihop hur det ska vara.

För mig blir det:

Det är väldigt frustrerande med tanke på att hela kursen är klar efter detta och att jag har klarat av värre problem i Java än detta.

Hoppas att någon orkar ta sig en titt och vägleda mig!

Börja med att skapa en dialogruta och spara returvärdet. Sedan skapar du en while-loop som kör tills variabeln du sparade returvärdet i inte är lika med null (vilket innebär att man klickade cancel). Då kommer du få upp upprepade dialogrutor tills man klickar cancel, och i varje iteration av loopen sparar du ner returvärdet.

Eller så bygger du din egna input-dialog men det kanske är överkurs.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Börja med att skapa en dialogruta och spara returvärdet. Sedan skapar du en while-loop som kör tills variabeln du sparade returvärdet i inte är lika med null (vilket innebär att man klickade cancel). Då kommer du få upp upprepade dialogrutor tills man klickar cancel, och i varje iteration av loopen sparar du ner returvärdet.

Eller så bygger du din egna input-dialog men det kanske är överkurs.

Jag editerade min post!
Det stora problemet ligger i:

Man behöver inte mata in antal vid uppstarten.

Lägger in detta i en ny post, så att ingen som känner sig manad till att hjälpa till missar detta.

Jag passar på att citera dig, Dunderklumpen. Missade det.

Att bygga min egen input-dialog låter intressant. Det ska jag läsa på om!

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Jag editerade min post!
Det stora problemet ligger i:

Man behöver inte mata in antal vid uppstarten.

Lägger in detta i en ny post, så att ingen som känner sig manad till att hjälpa till missar detta.

Jag passar på att citera dig, Dunderklumpen. Missade det.

Att bygga min egen input-dialog låter intressant. Det ska jag läsa på om!

Det är inga svårigheter egentligen, det kan enkelt lösas så som jag beskrev. Om något var oklart så får du hojta till.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Okt 2011
Skrivet av kalleftw:

Du menar att jag ska låta

while knappNr == 0

löpa genom hela koden?
Hur ska jag då få till det om man nu skulle trycka "Nej" på frågan? Skulle inte koden bli väldigt lång?

Jag tycker att det borde finnas ett enklare sätt att lösa detta på men som sagt så är jag endast nybörjare och ni andra kan detta mycket bättre än mig, det var bara en tanke.

Eller så missförstod jag dig.

Om man trycker nej på frågan så ska väl programmet avsluta? När du gjort allt du ska göra i en genomkörning så kommer frågan, om nej så ändras värdet i while och den körs inte fler gånger. Om ja så körs while en gång till och frågar i slutet. Vad skulle göra din kod lång?

Corsair Vengeance LPX 2x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Det är inga svårigheter egentligen, det kan enkelt lösas så som jag beskrev. Om något var oklart så får du hojta till.

Om det är enkelt så bör jag kunna lösa det, tack för hjälpen!

Skrivet av gaminggirl:

Om man trycker nej på frågan så ska väl programmet avsluta? När du gjort allt du ska göra i en genomkörning så kommer frågan, om nej så ändras värdet i while och den körs inte fler gånger. Om ja så körs while en gång till och frågar i slutet. Vad skulle göra din kod lång?

Då var det jag som missförstod dig.
Jag trodde att antingen trycker du ja, så körs koden, eller så trycker du nej så körs en separat kod där du inte behöver stoppa in hur många heltal man vill köra.

Men nu förstår jag vad du menar, det tackar jag för!

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Börja med att skapa en dialogruta och spara returvärdet. Sedan skapar du en while-loop som kör tills variabeln du sparade returvärdet i inte är lika med null (vilket innebär att man klickade cancel). Då kommer du få upp upprepade dialogrutor tills man klickar cancel, och i varje iteration av loopen sparar du ner returvärdet.

Eller så bygger du din egna input-dialog men det kanske är överkurs.

Jag har filat lite på två lösningar men jag tror att jag fortfarande är lika långt borta från att lyckas med programmet.

import javax.swing.*; public class test { public static void main(String[] args) { boolean placeHolder = true; int fragaBerakning = JOptionPane.showConfirmDialog(null, "Vill du beräkna ett visst antal heltal?"); while (placeHolder) { if (fragaBerakning == 2) System.exit(0); else if (fragaBerakning == 0) { String s = JOptionPane.showInputDialog("Hur många heltal?"); int antalHeltal = Integer.parseInt(s); int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } } } }

Tror du att jag är på rätt kurs även om jag hittade på lite eget eller verkar det helt fel?

Jag får inte riktigt klarhet i vad du menar.

int hej = JOptionPane.showConfirmDialog(null, "Vill du beräkna ett specifikt antal heltal?"); while (hej == 2){ System.exit(0); // Om du klickar cancel avslutas koden } while (hej == 0){ //Klickar du ja så får du välja hur många heltal du vill beräkna. Klickar du nej så avbryts programmet.

Jag vill ju inte att programmet skall avbrytas när man klickar nej, utan bara hoppa vidare till "Ange nästa heltal".
Jag är medveten om att man måste klicka cancel när det är dags att beräkna heltalen när man inte angett ett specifikt antal heltal men det blir helt fel när jag tidigare har sagt att det ska stängas ner när man klickar cancel.

Detta ska ju inte vara så svårt, det är sånt här jag ska kunna vid det här laget, jag vet men jag får verkligen inte ihop det.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av kalleftw:

Jag har filat lite på två lösningar men jag tror att jag fortfarande är lika långt borta från att lyckas med programmet.

import javax.swing.*; public class test { public static void main(String[] args) { boolean placeHolder = true; int fragaBerakning = JOptionPane.showConfirmDialog(null, "Vill du beräkna ett visst antal heltal?"); while (placeHolder) { if (fragaBerakning == 2) System.exit(0); else if (fragaBerakning == 0) { String s = JOptionPane.showInputDialog("Hur många heltal?"); int antalHeltal = Integer.parseInt(s); int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } } } }

Tror du att jag är på rätt kurs även om jag hittade på lite eget eller verkar det helt fel?

Jag får inte riktigt klarhet i vad du menar.

int hej = JOptionPane.showConfirmDialog(null, "Vill du beräkna ett specifikt antal heltal?"); while (hej == 2){ System.exit(0); // Om du klickar cancel avslutas koden } while (hej == 0){ //Klickar du ja så får du välja hur många heltal du vill beräkna. Klickar du nej så avbryts programmet.

Jag vill ju inte att programmet skall avbrytas när man klickar nej, utan bara hoppa vidare till "Ange nästa heltal".
Jag är medveten om att man måste klicka cancel när det är dags att beräkna heltalen när man inte angett ett specifikt antal heltal men det blir helt fel när jag tidigare har sagt att det ska stängas ner när man klickar cancel.

Detta ska ju inte vara så svårt, det är sånt här jag ska kunna vid det här laget, jag vet men jag får verkligen inte ihop det.

Dold text

Ja, du är nog på rätt väg, men jag kanske var otydlig när jag försökte förklara.

Något sådant här tänkte jag:

String s = JOptionPane.showInputDialog("Give a number"); while(s != null) { sum += Integer.ParseInt(s); s = JOptionPane.showInputDialog("Give a number"); }

Den kommer loopa och du kan mata in siffror tills att du klickar cancel.

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Ja, du är nog på rätt väg, men jag kanske var otydlig när jag försökte förklara.

Något sådant här tänkte jag:

String s = JOptionPane.showInputDialog("Give a number"); while(s != null) { sum += Integer.ParseInt(s); s = JOptionPane.showInputDialog("Give a number"); }

Den kommer loopa och du kan mata in siffror tills att du klickar cancel.

Det går verkligen inte ihop sig, jag är helt lost.
Möjligtvis kanske jag borde vänta med detta tills resten av kursen är färdig och ta det här sist.

import javax.swing.JOptionPane; public class placeholdermedelv { public static void main(String[] args) { /* Här vill jag ha något i stil med * JOptionPane.showConfigDialog("Vill du beräkna ett visst antal heltal"); * Om "Ja" klickas vill jag gå vidare till * String s = JOptionPane.showInputDialog("Hur många heltal?"); * * Om nej vill jag hoppa ner till * "String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal");" * Hur jag än gör förstår jag inte hur jag ska få med allt. * * Jag har försökt att stoppa in while-loopen du gav som exempel lite här och där jag tycker att den passar * utan framgång. */ String s = JOptionPane.showInputDialog("Hur många heltal?"); int antalHeltal = Integer.parseInt(s); int sifferSumma = 0; for (int i = 0; i < antalHeltal; i++) { /* Jag hänger inte huruvida allt ska gå ihop för att det ska hoppa ner hit * Så att allt går ihop. * Oavsett hur jag gör så fattas det alltid variablar lite här och där när jag försöker loopa. */ String angeHeltal = JOptionPane.showInputDialog("Ange nästa heltal"); int plats = Integer.parseInt(angeHeltal); sifferSumma += plats; } double medelv = sifferSumma / antalHeltal; JOptionPane.showMessageDialog(null, "Medelvärdet är: " + medelv + "."); } }

Jag uppskattar verkligen att du tar dig tid och hjälper till, guld värt!
Jag själv hade blivit galen.