# Sternenraute



## earl_hickey (4. Jun 2012)

Hey Leute!
Vorab bin noch sozusagen blutiger Anfänger, also seid gnädig 
Aber ok zum Thema:
Ich soll eine Sternenraute entwerfen, die Eingaben vom Benutzer einliest und dann quasi eine Sternenraute ausgibt, die Eingaben stellen die Höhe einer Raute dar und sie sollen nur ungerade, positive und ganze Zahlen sein. Wenn es ein unerlaubter Wert ist, sollen die Eingaben vom Benutzer solange wiederholt werden bis es passt! 
Ein Beispiel wäre:  --*
------------------*-*
-----------------*---*
----------------*-----*
----------------*----*
-----------------*--*
-------------------*  (Sorry ich gebe zu, dasist vlt jetzt nicht das schönste Beispiel, aber zum Verständnis, dachte ich hilfts ganz gut und die Minuse sollen natürlich Leerzeichen darstellen, hab es nicht anders auf die Reihe gekriegt ) 
Joa also so weit so gut, ich weiß auch ungefähr wie man einen Sägezahn erstellt, also dass von Zeile zu Zeile es mehr Sterne werden, aber hier jetzt häng ich iwie grad ziemlich, wenn der Wert und die Höhe vorgegeben ist, tu ich mich auch leichter. Aber ja jetzt auch mal eine Frage: Wie mach ich das denn, dass die Raute ab der Hälfte (also hier bei meiner wunderschönen Skizze "soll" es einen Stern mit der Höhe 7 darstellen), dass die Raute wieder enger zusammengeht?
Hmm naja hier mal was ich bis jetzt geschafft hab, aber wie gesagt,ich kriege es hin, dass ich zum Beispiel von Zeile zu Zeile immer mehr Sterne habe, aber eben keine Raute. Wäre euch sehr dankbar, wenn ihr mir vlt sagen könnt bzw Tipps geben könnt, wie ich das ungefähr bewerkstelligen könnte?!
Aber hier erst mal, soweit ich gekommen bin: 
[Java=1]
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Diamond2 {
	public static void main(String[] args) {
		BufferedReader in =
				new BufferedReader(new InputStreamReader(System.in));
		try {
			System.out.println("Bitte geben sie die Höhe ein, sie sollte "
					+ "eine ungerade, positive und ganze Zahl sein!");
			String höheSTR = in.readLine();
			int höhe = Integer.parseInt(höheSTR);
			for (int i = 1; i <= höhe; i++) {
				for (int j = 1; j <= höhe; j++) {
					System.out.print("*");
				}

				// Zeilenumbruch
				System.out.print("\n");

			}

		} catch (Exception e) {
			System.out.println("Ungültige Eingabe!");
		}

	}

}
[/Java]
MfG
earl


----------



## SlaterB (4. Jun 2012)

absteigend geht z.B. mit einer Schleife bzw. Berechnung zu einer Differenz,
wenn i mit 1, 2, 3, 4 ansteigt dann fällt (10-i) gleichzeitig mit 9, 8, 7, 6 usw.

für * brauchst du keine Schleifen, das sind sowieso maximal 2, für Leerzeichen brauchst du sicherlich evtl. Schleifen,
damit die gut sichtbar und zählbar sind gerne auch erstmal Minuse oder anderes als Leerzeichen in deinem Programm

```
for jede Zeile:
  Schleife für Beginn-Leerzeichen
  Stern
  evtl. Schleife für mittlere Leerzeichen
  evtl. zweiter Stern
```

oder alles nur per if im Inneren lösen, ist je nach Denkweise auch einfacher:

```
for jede Zeile:
  for jede Spalte, immer alle Spalten behandeln:
     if (durch Berechnung aktuelles i und j als Stern erkannt)
        Stern  
     sonst
        Leerzeichen
```

für den Wechsel brauchst du eh irgendein if, da bietet sich das an
"wenn (in der ersten Hälte der Zeilen und Spalte j ist gerade Zeile i -17) oder (..)"
kann kompliziert werden..

```
if ...
   Stern
else if ...
   Stern
else
  Leerzeichen
```
geht natürlich auch


----------



## earl_hickey (5. Jun 2012)

Hmmm sorry ich blick da auch trotz jetzt schon nach längerer Zeit Betrachtens der Aufgabe und deiner Antwort  immer noch nicht durch.
Ich weiß ehrlich gesagt nicht wirklich, wie man denn jetzt eine Raute mit den ganzen Leerzeichen dazwischen implementieren soll, wie gesagt einen einseitigen Tannenbaum kann ich 
Aber der hilft mir ja hier nicht weiter, hehe. Tut mir echt Leid, aber wie gesagt, solange bin ich noch ned dabei, obwohl ich mir ungefähr die Basics (dachte ich zumindest) schon erlernt habe.


----------



## SlaterB (5. Jun 2012)

konzentrieren wir uns auf den zweiten Ansatz, der ist wohl zielführender,
je komplizierter es wird wie mit dieser Raute, desto besser ist dieser geeignet,

schreibe erst eine Doppelschleife die ein komplettes Quadrat mit Sternen füllt, schaffst du das?
dann kannst du schon experimentieren mit if/ else statt Stern auch ein Leerzeichen zu malen,
als Bedingung z.B. if (i==j) oder anderes, schaue dir allein schon an, was dabei herauskommt, 

kannst du soweit mit Code folgen?


----------



## earl_hickey (5. Jun 2012)

Ähm ja habs gerade gemacht, einmal mit vorgegebenen int Werten und einmal muss der Benutzer sie selbst eingeben!
Also ich hoffe, ich habs richtig gemacht, aber ein Quadrat hat ja meines Wissens die Eigenschaft, genauso viele Zeilen wie Spalten zu haben und so hab ichs dann auch gemacht und die Ausgabe schaut eig auch in Ordnung aus.
Hier einmal mit vorgegebenen int Werten, hier also mit jeweils 5. 

```
public class Sternenquadrat {
	public static void main(String[] args) {
		int zeilenAnzahl = 5;
		int spaltenAnzahl = 5;
		for (int i = 1; i <= zeilenAnzahl; i++){
			for (int j = 1; j <= spaltenAnzahl; j++){
				System.out.print("* ");
			}
			System.out.println();
		 }
	}

}
```
Und hier hab ichs mit Eingabewerten vom Benutzer gemacht:

```
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SternenquadratEingabe {
	public static void main(String[] args) {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		try {
			System.out.println("Geben sie bitte zwei gleiche Zahlen nacheinander ein!");
			String inputStringZ = in.readLine();
			int zeilenAnzahl = Integer.parseInt(inputStringZ);
			String inputStringS = in.readLine();
			int spaltenAnzahl = Integer.parseInt(inputStringS);
			for (int i = 1; i <= zeilenAnzahl; i++) {
				for (int j = 1; j <= spaltenAnzahl; j++) {
					System.out.print("* ");
				}
				System.out.println();
			}
		} catch (Exception e) {
			System.out.println("Ungültige Eingabe!");
		}
	}

}
```

Achja danke übrigens schon mal, dass du mir hilfst Slater!


----------



## SlaterB (5. Jun 2012)

wie gesagt noch ein if darin, verstehst du diesen Punkt oder ist das noch technisch unklar?

wie gesagt ist der Rest dann allein das Finden der richtigen Bedingungen,
für welche Koordinaten (i,j)muss ein Stern, Rest Leerzeichen

extrem wäre direktes aufzählen: if ( (i==0 and j==4) or (i==1 and j==3) or ..
was aber natürlich nicht das Ziel ist oder bei Variabler Anzahl eh nicht mehr geht,

du musst die mathematischen Beziehungen rausfinden, ruhig mit gewissen Startwerten,
was ist das Maximum der Zeilen, das Maximum für i? was ist die Hälfte davon, kann man ausrechnen,
wenn i kleiner oder größer dieser Mitte ist, dann ist das die obere oder untere Hälfte der Zeilen

also:
teste if (i==j), teste tausend andere Dinge wie die angesprochene Halbierung, 
alles ausprobieren, nichts muss direkt hingeschrieben endgültig korrekt sein,

finde Kombinationen, an denen ein Stern stehen muss (Rest Leerzeichen),
oder stelle zumindest intelligente Fragen a la 'ich kann den Stern nach rechts runter laufen lassen, aber wie lasse ich diese Kante erst erst in der Mitte der Zeile beginnen' usw

du musst schon selber dran arbeiten, ich kann dir die Aufgabe nicht lösen


----------



## earl_hickey (5. Jun 2012)

Ähm naja nicht so wirklich, wenn ich ehrlich bin 
Habe gerade vorher i == j gesetzt, mit Leerzeichen dann versehen um zu sehen was passiert, aber joa wirklich weiter gebracht bzw. genau verstanden was da passiert hab ichs ned so, wenn ich ehrlich bin  
Und zum zweiten Absatz: Ja freilich brauchst du mir die Aufgabe nicht machen. ich will sie auch ja verstehen, selbst können und nicht, dass es mir einfach jemand löst  (Sorry wenns vlt so rübergekommen ist!)
Wollte bloß ein paar Denkanstöße und wie ich überhaupt an die Aufgabe herangehen soll! 
Aber ja ok ich lass mir des mal durchn Kopf gehen und probier mal bischen rum.
Zumindest ist mir jetzt schon mehr klarer, als wie ich angefangen habe mit der Aufgabe.

Danke nochmal!


----------



## earl_hickey (5. Jun 2012)

So also ich hab jetzt ne Zeit lang probiert und bin auch zu einigen Ergebnissen gekommen, aber weiß nicht recht wie ich die alle miteinander kombinieren kann...
Naje also die Erste und die jeweils Letzte Zeile kann ich mittlerweile mit if-Anweisungen ausgeben lassen, da ja diese zwei Zeilen, die Einzigen sind, die nur einen Stern als Ausgabe haben und sonst nur Leerzeichen und dann hätt ich halt sowas gmeint, da ja in jeder Zeile, ausser eben nur die Anfangszeile und Endzeile, jeweils zwei Sterne existieren und der Rest aus Leerzeichen sowas in der Art geschrieben: 

```
if (i != anfang && i != ende){
int sz = 2; //Sternenanzahl
int lz = n-2; //Leerzeichen ist immer Höhe-2
```
 Auch wenn man eine Zahl eingeben soll (und nicht wie ich jetzt mit konkreten vorgegebenen Zahlenwerten, aber ich tu mich anfangs noch leichter) kann man ja doch ganz leicht den Anfang und das Ende rausfinden, zum Beispiel wenn man zuerst gefragt wird, welche Höhe man haben möchte und man 11 eingibt, dann ist doch generell der Anfang immer 
n -(n-1) und das Ende n selbst oder sehe ich das falsch? Und ja iwie hab ich mir gedacht, dass zwei neue Variablen (sz und lz) mir vlt das nocherleichtern könnten, deswegen hab ich die eben noch dazu erstellt, weiß ned vlt erschweren sie mir auch nurdie Aufgabe 
Achja genau und hier eben der Quellcode den ich habe, dass die erste und letzte Zeile jeweils nur einen Stern und sonst nur Leerzeichen ausgibt (aber mit konkreten Werten erst einmal!).

```
public static void main(String[] args) {
		int zeilenAnzahl = 5;
		int spaltenAnzahl = 5;
		//int mitte = (zeilenAnzahl + 1) / 2;
		// int anzahlSterne = (zeilenAnzahl*2) - 2;
		int anfang = 1;
		int ende = 5;

		for (int i = 1; i <= zeilenAnzahl; i++) {
			for (int j = 1; j <= spaltenAnzahl; j++) {
				if ((j == ende && i == anfang) || (j == ende && i == ende)) {
					System.out.print("*");

				} else
					System.out.print(" ");
			}
			System.out.println();
		}

		
	}

}
```


----------



## SlaterB (5. Jun 2012)

> doch generell der Anfang immer n -(n-1) 
äh ja, und gekürzt ist das 1 oder 0, falls man die Schleife bei 0 anfangen läßt, 
der Anfang ist immer die erste Zeile 

ein if (i==j) sehe ich immer noch nicht in deinen Beispielen, 
das würde dir so schön quer über alle Zeilen hinweg eine Schräge einbauen, was schon ziemlich viel ist

gibt dir das nichts zu denken?
dazu 
if (i==j*2) 
if (i==j/2) 
if (i==j+Hältfe der Breite) 
if (i>Hälfte der Breite AND j < Hälfte der Breite) 
usw.,
ich selbst kann mir das Ziel denken und führe deshalb subjektiv in die richtige Richtung,
aber selbst das Ausdenken anderer Beispiele dauerte nur jeweils 1,85 sec,
machst du das auch fleißig ohne darüber zu reden oder zauders zu weiterhin?


----------



## earl_hickey (5. Jun 2012)

Hmm naja ich hab da schon viel darüber nachgedacht, wenn ich ehrlich bin, weiß ned iwie muss ich ein bischen was fürs logische Denken machen, weil ich die Schritte nicht ganz nachvollziehen kann, ich stell mir immer die Matrix dazu vor, aber ganz hilft mir des auch ned...


----------



## SlaterB (5. Jun 2012)

zu einem Teil bist du mir schon gefolgt, ich verstehe nicht warum du nicht z.B.
if (i==j+Hältfe der Breite) 
ausprobierst  

in Sekunden reinkopiert:

```
public class Test {
    public static void main(String[] args)   {
        int n = 10;
        for (int i = 1; i <= n; i++)     {
            for (int j = 1; j <= n; j++)    {
                if (i == j + n / 2)     {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

    }
}
```
das ist nämlich sogar schon eine der 4 Kanten der Raute, die anderen sind fast schon durch gewisse Spiegelung zu erreichen,
vorher aber natürlich genau überlegen, was das bedeutet, 
gehe die Zeilen und Spalten durch, für welche Koordinaten passt das, aus welchem Grund ist der Stern pro Zeile versetzt, 
aus welchem Grund ist das unten oder oben, links oder rechts von der Mitte usw.,


----------



## earl_hickey (5. Jun 2012)

Ach s*****e jetzt hab ichs endlich zum Teil bischen gepeilt 
Hab jetzt immer auf die Matrix (endlich mal) geschaut, wann genau in welcher Spalte und welcher Zeile immer ein Stern rauskommen soll, ich doofi. Es fehlen nur noch ein paar Kleinigkeiten. Mir fehlt eig im Grunde nur noch der rechte untere Teil und ein paar Sachen, weil mein eingegebener Wert ja ungerade sein soll. Aber da ist wieder mein Problem, ich kriegs noch ned ganz hin, aber ich tüftel mal hier noch bis morgen sowas rum, vlt kannst du mir ja noch ein paar Tipps mit auf den Weg geben, wenn ich verzweifelt wieder dastehe und mich ned auskenne?
Jetzt verstehe ich auch deine Tipps besser, die du mir anfangs gegeben hast, sorry, da stand ich iwie aufn Schlauch.
Hier übrigens der Code, im Groben und Ganzem ist es das schon ungefähr (glaub ich), mir fällt nur noch rechts unten die Matrix und sie ist iwie noch bischen naja ich sag mal "grob", aber hier soweit ichs geschafft hab (bis jetzt)!

```
public class Test {
    public static void main(String[] args)   {
        int n = 8;
        for (int i = 0; i < n; i++)     {
            for (int j = 0; j < n; j++)    {
                if (i ==  j - (n / 2) || i == j + (n/2) || i == (n/2) - j)     {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
 
    }
}
```


----------



## SlaterB (6. Jun 2012)

```
public class Test {

	public static void main(String[] args) throws Exception {
		int n = 9;
		int k = (n) / 2;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (i == j - k || i == j + k || i == k - j || k + i == j
						|| (n + k -1) == i + j) {
					System.out.print("*");
				} else {
					System.out.print(" ");
				}
			}
			System.out.println();
		}
	}
}
```
was nun gerade oder ungerade sein soll ist auch davon abhängig ob du bis n läufst oder bis n-1,
aus einer geraden Anzahl Zeilen kann man wohl auch auf Papier keine gute Raute zusammenbekommen


----------



## earl_hickey (6. Jun 2012)

Hehe, ok danke Slater!
Hab auch selber nochmal alles probiert und glaub ich verstehs schon iwie


----------

