You are not logged in.

  • Login

1

Friday, November 11th 2005, 7:55pm

[java] dreieck zeichnen

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class gleichschenkliges_Dreieck {
 
	/**
	 * @author Torben Brodt
	 * @version 1.0
	 * 
	 * <p />Malt ein Dreieck aus Sternen (Leerzeichen helfen bei der Ausrichtung)
	 * <p />Funktioniert mit Java <= 1.5
	 * 
	 */
 
 
	public static void main(String[] args) {
 
		java.util.Scanner input = new java.util.Scanner(System.in);
		System.out.print("Bitte geben Sie die Hoehe des gleichschenkligen Dreiecks ein: ");
		int eingabe = input.nextInt();
 
		int anzahl = eingabe;
		//Nullen sind Leerzeichen
		String nullen, sterne="";
 
		while(anzahl > 0)
		{
			sterne += (anzahl == eingabe) ? "*" : "**";
 
			anzahl--;
			nullen = "";
			for(int i=0; i<anzahl; i++)
				nullen += " ";
 
			System.out.println("          "+nullen+sterne);
		}
	}
 
}


Alternativer Code:

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class A4_Dreieck_Sternchen {
 
	/**
	 * @param args
	 */	
	public static void main(String[] args) {
		int max = 15, sternzahl=1;
 
		// Ausgabe
		signs(' ', max/2+1);
		System.out.println("*");
		for (int count=max/2; count >= 0;  count--) 
		{
			sternzahl += 2;
			signs(' ', count);
			signs('*', sternzahl);
			System.out.println();
		}
	}
 
	static void signs(char sign, int count) {
		for (int i=0; i<count; i++)
			System.out.print(sign);
	}
}

2

Wednesday, February 22nd 2006, 6:54pm

Das Programm funktioniert ja wunderbar, allerdings möchte ich in der Mitte des Dreiecks keine Sternchen, sondern einfach gar nix.
Wie kann ich das realisieren?


jetzt


nachher

3

Wednesday, February 22nd 2006, 7:12pm

hier meine änderungen für ein leeres Dreieck

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class A4b_Dreieck_Sternchen {
 
	/**
	 * @param args
	 */	
	public static void main(String[] args) {
		int max = 15, sternzahl=1;
 
		// Ausgabe
		signs(' ', max/2+1, false);
		System.out.println("*");
		for (int count=max/2; count >= 0;  count--) 
		{
			sternzahl += 2;
			signs(' ', count, false);
			signs('*', sternzahl, (count == 0));
			System.out.println();
		}
	}
 
	static void signs(char sign, int count, boolean max) {
		for (int i=0; i<count; i++) {
			char newsign = (sign == '*' && i > 0 && i < count-1 && max == false) ? ' ' : sign;
			System.out.print(newsign);
		}
	}
}

4

Wednesday, February 22nd 2006, 7:23pm

Vielen Dank.
Dann werde ich ma gucken, dass ich das irgendwie verstehe ;)

5

Thursday, February 23rd 2006, 8:32am

Das Programm von dir hatte nich so ganz funktioniert, hatte unten die letzte Zeile nich geschrieben oder eine falsche Anzahl an Sternchena ausgeben, also z.B. rechte und linke Zeile 5 Sternchen und unten die Seite 9 Sternchen...

Hier ist das überarbeitete:

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class gleichschenkliges_Dreieck2 {
 
    public static void main(String[] args) throws IOException {
            int sternzahl=1; 
 
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Bitte geben Sie die Hoehe des gleichschenkligen Dreiecks ein: "); 
            String max2 = input.readLine(); 
            int max = Integer.parseInt(max2);
 
            // Ausgabe
            signs(' ', max, 0); 
            System.out.println("*"); 
 
            for (int count=max-1; count > 1;  count-=1) 
            {
                    sternzahl += 2; 
                    signs(' ', count, 0); 
                    signs('*', sternzahl, max+999);                        
                    System.out.println(); 
            }
            for (int bla=max; bla>0; bla-=1)             {
            	    System.out.print(" *"); 
            }
    }
 
    static void signs(char sign, int count, int max) { 
            for (int i=0; i<count; i++) { 
            char newsign = (sign == '*' && i > 0 && i < count-1 && count != max) ? ' ' : sign; 
                    System.out.print(newsign); 
            }
    }
}

6

Thursday, February 23rd 2006, 4:29pm

du hast recht!
habe mein code aktualisiert.. ist hoffentlich ein bisschen schöner als das +999 ;-)

7

Sunday, November 5th 2006, 12:00am

@ d0nUt

Hi,
könntest Du mir bitte beim dem ersten Code ab der 26, Zeile erklären was Du genau machst?
Ich bin noch ein Anfänger und ich weiß u.a. nicht was folgende Zeichen bedeuten
+= , ? , : (also wie gesagt, quasi fast die ganze Zeile)

Das wäre nett!
Danke

Mick

8

Sunday, November 5th 2006, 12:28am

Hi,
ich bin zwar nicht d0nUt aber ich erklär es dir trotzdem :wink: .

Also erstmal der hintere Teil:

Java Quellcode

1
(anzahl == eingabe) ? "*" : "**"

Das ganze ist ne Kurzversion von if/else.
Wenn das was for dem Fragezeichen steht wahr ist wird der Ausdruck zu dem ausgewertet was direkt hinter dem Fragezeichen steht ansonsten wird er zu dem ausgewertet was hinter dem Doppelpunkt steht.

Der vordere Teil ist wiederum ne kürzere Schreibweise für Wert = Wert + x.
Was da insgesamt steht entspricht:

Java Quellcode

1
2
3
4
5
6
7
8
if(anzahl == eingabe)
{
     sterne = sterne + "*";
}
else
{
     sterne = sterne +"**";
}


Unterm Strich sollte man es vermeiden bei String mit dem + Operator zu arbeiten(zumindest nicht wenn das sehr oft passiert).
Nen String ist in Java nen "konstantes" Objekt und jedesmal wenn man da mit + dran rumwerkelt wird nen neues String Objekt erstellt.

Nur mal so zum Vergleich:

Java Quellcode

1
2
3
String str = new String();
for(int i=0;i<100000;i++)
       str +='a';

zu

Java Quellcode

1
2
3
4
5
6
String str = new String();
StringBuilder strBuilder = new StringBuilder();
strBuilder.setLength(100000);
for(int i=0;i<100000;i++)
      strBuilder.setCharAt(i,'a');
str = strBuilder.toString();

Lass mal beide Versionen laufen.Die machen beide das selbe.

Gruß void

9

Sunday, November 5th 2006, 11:47am

ah ok!
soweit schon mal danke! So aufgelöst ist der Ausdruck für mich schon deutlicher klarer!
jetzt steh ich aber trotzdem noch ein bisschen auf dem schlauch.
Was besagt dieser ausdruck denn nun genau? Ich mein, ich seh ja was rauskommt, und ich habe auch schon mit den Variable und Operatoren rumgespielt und sehe die Veränderungen, aber ich checks noch nicht ganz.
Wann ändert man die Leerzeichen und Sterne rechts bzw links des Dreiecks, oder beide gleichzeitig, oder wo ist die Vorgehensweise?

10

Sunday, November 5th 2006, 12:39pm

hi

am besten verstehst du es, wenn du es schritt für schritt nachprogrammierst
zeichne es dir erstmal auf ein blatt papier

du zählst ein sternchen ganz oben
3 sternchen in der zweiten zeile
5 sternchen in der dritten zeile
7 sternchen in der vierten zeile
9 sternchen in der fünften zeile

du erkennst also dass die anzahl der sternchen immer um 2 erhöht wird
am anfang gibts nur ein sternchen
das macht dieser ausdruck

Java Quellcode

1
sterne += (anzahl == eingabe) ? "*" : "**";


und jetzt pack es mal in eine schleife

Java Quellcode

1
2
3
4
5
while(anzahl > 0) {
        sterne += (anzahl == eingabe) ? "*" : "**";
        System.out.println("          "+sterne);
	anzahl--;
}


deine ausgabe sieht so aus

Source code

1
2
3
4
5
*
***
*****
*******
*********


was fehlt? richtig, die einrückung
überlege wie viele zeichen du einrücken musst
machen wir doch in der ersten zeile 5 leerzeichen davor
in der zweiten zeile machen wir 4 leerzeichen davor
in der dritten nur noch 3
dann 2
dann 1

Source code

1
2
3
4
5
[    5]*
[   4]***
[  3]*****
[ 2]*******
[1]*********


was ist die einfachste möglichkeit um 5 leerzeichen zu erhalten?
eine schleife

Java Quellcode

1
2
for(int i=0; i<anzahl; i++)
	nullen += " ";


und diese ausgabe leerzeichen packen wir vor die sterne

11

Sunday, November 5th 2006, 1:52pm

ok,

und der ausdruck der for schleife liest sich etwa so:

wenn i kleiner als die anzahl (also die eingabe ist) dann passiert was?
und das i++ heisst doch, das i bei jedem durchlaufen der schleife um 1 größer wird,
d.h. es wird irgendwann (größer)gleich der anzahl womit die abbruchbedingung erreicht ist. so in etwa?

13

Tuesday, November 28th 2006, 9:39pm

:oops:

Irgendwie versteh ich das alles nich...

Den ganzen Kram, der unten bei der Ausgabe steht hatten wir noch gar nich.
Und mein Lehrer will trotzdem, dass wir das programmieren.
Und der einzige, ders aus unserem Kurs versteht, kanns nich erklären.
Und einfach nur irgendwas abtippen bringts ja auch nich.

Also: geht das ganze auch einfacher? Oder irgendwie ohne diese ganzen Abkürzungen? Wahrscheinlich hab ich nur irgendeinen fehler dabei gemacht, aber bei mir funktioniert das nicht, wenn ich die schon erwähnten abkürzungen nehm.
Und was will dieses programm eigentlich von mir?

Wer immer mir helfen möchte und kann, bitte für Hirnblonde erklären...

14

Tuesday, November 28th 2006, 10:13pm

hirnblonde, lol

nun gut.. also mein Posting weiter oben ist eine recht ausführliche Erklärung. Zumindest so ausführlich, dass man dem ohne genaure Rückfragen nichts mehr hinzufügen kann.

Jetzt bleibt also noch die Kurzschreibweise.
In meinem ursprünglichen Code, verwende ich sie ja nur einmal.
Wie du dieses eine Zeile durch "Langschreibweise" ersetzt, hat void in diesem Posing erklärt.

Sorry, ist nicht böse gemeint, aber meiner Meinung nach ist alles geklärt, was in den paar Zeilen steht. Wenn du eine Frage formulierst, beantworte ich dir diese aber gerne nochmal.

Similar threads

Social bookmarks