Permalänk
Medlem

Hjälp med Java, val

Hej!

Nu sitter jag här och försöker knåpa ihop ett program där användaren ska skriva hur många asterisker som ska vara i en triangel samt vilket håll den ska ritas ut på. Jag förstår dock inte vad som är problemet då endast den första funkar. Några tips?

import javax.swing.*; import java.util.Scanner; public class Triangle{ public static void main (String[] args) { String star = JOptionPane.showInputDialog("Hur stor ska triangeln vara, skriv 1 - 50:"); String updown = JOptionPane.showInputDialog("Vilket håll, 1 = upp 0 = ner:"); Scanner scanner = new Scanner(System.in); int x, y; int star1 = Integer.parseInt(star); boolean a = true; boolean b = false; boolean upordown = Boolean.parseBoolean(updown); if ( upordown == a && star1 >= 2 && star1 <= 50) { for(x = 0; x <= star1; x++){ for(y = 0; y < x; y++){ System.out.print("*"); } System.out.println(); } } else if (upordown == b && star1 >= 2 && star1 <= 50) { for(x = 0; x <= star1; x--){ for(y = 0; y < x; y--){ System.out.print("*"); } System.out.println(); } } } }

Visa signatur

Jag är så progg att jag lyssnar på konceptalbum på shuffle

Permalänk
Mattecoach

Nu är inte jag super på detta, men gör ett försök...

I den andra så försöker du räkna ner en variabel som börjar på 0, vilket alltså inte funkar. Du ska fortfarande räkna upp variabeln, men om jag har förstått vad du vill göra rätt så måste du skriva ut mellanslag först, sen avsluta med en stjärna. T.ex.

* ** *** ****

osv

I if-satserna testar man om det som är innanför är sant. Det du gör nu är att kolla om en variabel är lika med sant eller falsk, sen kolla om detta är sant, dvs ett steg mer än nödvändigt. Första kan du bara skriva som if(boolean). Om boolean är sann så kommer if-satsen att köras. Finns motsvarande för falskt, tror att det är if(!boolean), men är inte säker på syntaxen.

EDIT: Det du alternativt skulle kunna göra är att du initierar variabeln med högstavärdet, sen räknar ner till 0. Dock kommer de två delarna ge samma resultat.
Jag tror att det lättaste är att lägga till en if-sats som printar ut mellanslag (högsta värdet - x) och en if-sats som printar ut stjärnor (x). Båda dessa ligger innanför en if-sats för antal rader.

Permalänk
Skrivet av Señor Hallon:

Hej!

Nu sitter jag här och försöker knåpa ihop ett program där användaren ska skriva hur många asterisker som ska vara i en triangel samt vilket håll den ska ritas ut på. Jag förstår dock inte vad som är problemet då endast den första funkar. Några tips?

import javax.swing.*; import java.util.Scanner; public class Triangle{ public static void main (String[] args) { String star = JOptionPane.showInputDialog("Hur stor ska triangeln vara, skriv 1 - 50:"); String updown = JOptionPane.showInputDialog("Vilket håll, 1 = upp 0 = ner:"); Scanner scanner = new Scanner(System.in); int x, y; int star1 = Integer.parseInt(star); boolean a = true; boolean b = false; boolean upordown = Boolean.parseBoolean(updown); if ( upordown == a && star1 >= 2 && star1 <= 50) { for(x = 0; x <= star1; x++){ for(y = 0; y < x; y++){ System.out.print("*"); } System.out.println(); } } else if (upordown == b && star1 >= 2 && star1 <= 50) { for(x = 0; x <= star1; x--){ for(y = 0; y < x; y--){ System.out.print("*"); } System.out.println(); } } } }

Din for-loop är fel,

} else if (upordown == b && star1 >= 2 && star1 <= 50) { for(x = 0; x <= star1; x--){ for(y = 0; y < x; y--){ System.out.print("*"); } System.out.println(); } }

Den börjar på 0 och blir mindre för varje varv, dvs varv 2 är den -1.
Om du i stället gör:

} else if (upordown == b && star1 >= 2 && star1 <= 50) { for(x = star1; x > 0; x--){ for(y = 0; y < x; y++){ System.out.print("*"); } System.out.println(); } }

så kommer x börja med att vara din maximala bredd och sedan bli ett smalare för varje varv tills den blir 0.

Visa signatur

Corsair Vengeance LPX 4x8GB 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)

Permalänk
Medlem

Jag bara undrar, varför deklarerar du tva booleans? Blir inte din kod tydligare om du skippar det och skriver upordown == true exempelvis?

Permalänk
Medlem
Skrivet av Motherofgod:

Jag bara undrar, varför deklarerar du tva booleans? Blir inte din kod tydligare om du skippar det och skriver upordown == true exempelvis?

För att jag inte vet hur de ska användas riktigt ärligt talat. Att skriva int upordown1 = Integer.parseInt(upordown); och sedan skriva upordown == 1 på första och upordown == 0 på andra funkar inte.

Visa signatur

Jag är så progg att jag lyssnar på konceptalbum på shuffle

Permalänk
Mattecoach
Skrivet av Señor Hallon:

För att jag inte vet hur de ska användas riktigt ärligt talat. Att skriva int upordown1 = Integer.parseInt(upordown); och sedan skriva upordown == 1 på första och upordown == 0 på andra funkar inte.

Det är för att det är en boolean, dvs den har värdet sant eller falskt. Om du vill testa om den är sann så skriver du helt enkelt
if(upordown1). Om upordown1 har värdet true så kommer if-satsen att köras. Om du vill att if-satsen ska köras när värdet innanför är false så skriver du
if(!upordown1)

Permalänk
Medlem

Tänk efter vad som händer om du skriver in att storleken ska vara 1.

Permalänk
Medlem
Skrivet av Señor Hallon:

För att jag inte vet hur de ska användas riktigt ärligt talat. Att skriva int upordown1 = Integer.parseInt(upordown); och sedan skriva upordown == 1 på första och upordown == 0 på andra funkar inte.

Just nu sa försöker du jämföra en boolean med true/false vilket är onödigt. En boolean är ju redan antingen sann eller falsk. Jämför du tva ints exempelvis sa far du ett boolskt uttryck. Sedan sa vet jag inte om parseBoolean(String) fungerar som du tänkt dig. Jag tror den tar värdet "True" som true och "False"/alla andra strings som false. Inte 1 och 0.

Kollade upp det och japp. Den tar inte dina "0" och "1" som argument till false resp. true. Ditt uttryck bör evalueras till false sa länge du inte skriver true i din dialogruta. http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.ht...

Permalänk
Medlem
Skrivet av gaminggirl:

Din for-loop är fel,

} else if (upordown == b && star1 >= 2 && star1 <= 50) { for(x = 0; x <= star1; x--){ for(y = 0; y < x; y--){ System.out.print("*"); } System.out.println(); } }

Den börjar på 0 och blir mindre för varje varv, dvs varv 2 är den -1.
Om du i stället gör:

} else if (upordown == b && star1 >= 2 && star1 <= 50) { for(x = star1; x > 0; x--){ for(y = 0; y < x; y++){ System.out.print("*"); } System.out.println(); } }

så kommer x börja med att vara din maximala bredd och sedan bli ett smalare för varje varv tills den blir 0.

Den andra verkar inte funka, den skriver inte ut någonting.

Edit: Det var ingenting, hade missat y++ bara. Tack så mycket för hjälpen!

Visa signatur

Jag är så progg att jag lyssnar på konceptalbum på shuffle