# Flaggenaufgabe, für mich zu schwierig



## noobinjava (11. Nov 2009)

Hallo,

ich habe wieder eine tolle aufgabe bekommen, wo ich verschiedene Flaggenformationen
ausgeben soll. der code ist bis zu einem gewissen grad vorgegeben, aber ich habe
keine ahnung wie das gemacht werden soll. for, if, while schleifen sind erlaubt:


```
123456789 
1 1.......1 
2 .0.....0. 
3 ..1...1.. 
4 ...0.0... 
5 ....1.... 
6 ...0.0...
7 ..1...1.. 
8 .0.....0. 
9 1.......1
```

so soll die flagge aussehen. es müssen noch weitere flaggen ausgegeben werden,
aber ich will erst mal das hier verstehen. hier ist der code, der kompletiert werden soll:


```
public class Miniprojekt2 {
public static String flagge1(int groesse) {
// Großes X, Zeilen 1 und 0
// der Parameter groesse ist stets ungerade und <= 9
String m = "";
// hier die Lösung implementieren
return m;
}

public static void main(String[] args) {
// Testausgaben
System.out.println(flagge1(5));
System.out.println(flagge1(7));
System.out.println(flagge1(9));

}
}
```

ich bin für jeden vorschlag dankbar.

grüße


----------



## SlaterB (11. Nov 2009)

fange bitte mit etwas einfacherem an:
*
**
***
****
*****
******

kennst du for-Schleifen?

for int i=0;i < 6; i++
führt zu Durchgängen mit i = 0, 1, 2, 3, 4, 5
könnte das nicht beim Zeichnen helfen?


----------



## Landei (11. Nov 2009)

Ein kleiner Trick für den 0-1 Wechsel: Definiere eine Variable int v = 1; und wechsle bei jedem Schleifendurchlauf mit v = 1 - v;


----------



## noobinjava (11. Nov 2009)

> *
> **
> ***
> ****
> ...




das habe ich hingekriegt:


```
public class flaggenübung {
	public static void main(String [] args){
		String m = "";
		for (int i =1; i <7; i++){
			System.out.println ( m+="*");
		
		
	}
		}
	}
```


----------



## Michael... (11. Nov 2009)

"intelligenter" wäre vermutlich folgendes:

```
for (int i=0; i<7; i++) {
	for (int k=0; k<i; k++)
		System.out.print("*");
	System.out.println();
}
```

Prinzipiell geht es darum Gesetzmässigkeiten zu erkennen und diese dann in Schleifen umzusetzen
Im Fall der Flagge oben wandern die Zahlen in jeder Zeile um eine Position nach innen - bis sie sich "treffen". Danach wandern sie wieder nach aussen bis sie ganz aussen angekommen sind. Gleichzeitig wechselt die Zahl immer zwischen 0 und 1 (s. Post von Landei)
Eine Möglichkeit wäre also eine Schleife, welche die Zahlen nach innen "laufen" lässt und anschliessend eine zweite Schleife, welche die Zahlen nach aussen laufen lässt.


----------



## SlaterB (11. Nov 2009)

@noobinjava
hmm, ganz ordentlich, leider eher nicht die Richtung der weiteren Aufgaben 
wobei auch das halbwegs möglich wäre,
als nächstes käme 

*
**
***
****
*****
******
*****
****
***
**
*

also mit einem if prüfen, ob du in der zweiten Hälfte bist und dann von m wieder Sterne wegnehmen
usw.

---------

sauberer könnte aber grundsätzlich ein anderer Gedanke sein, gerade bei dem was noch alles kommt,
(edit: von Michael... schon erwähnt)
baue keinen String m auf, sondern male jede Zeile quasi komplett neu,
wenn du bei i = 6 angelangt bist,
dann verwende z.B. eine innere Schleife wie ich hier ausnahmsweise verrate:

```
int n = 7;
        String m = "";
        for (int i = 1; i < n; i++)
        {
            for (int j = 0; j < i; j++)
            {
                System.out.print("*");
            }
            System.out.println();
        }
```

so, nun gilt immer noch, als nächsten Schritt

*
**
***
****
*****
******
*****
****
***
**
*
hinzubekommen,
die Grenze für die innere Schleife ist dann nicht genau i, sondern ein aus i berechneter Wert, 
abhängig von der Gesamtzahl der Zeilen n

falls das klappt als nächstes in jeder Zeile am Ende die Zahl 0 oder 1 dazu,

danach zusätzlich
*******
*****
***
*
was auch wieder durch eine Schleife geht

---------

oder, vielleicht noch ein ganz anderer Weg:
immer eine Doppelschleife verwenden
for i bis n,
darin j bis n
damit ein Quadrat malen
*******
*******
*******
*******
*******
*******
*******

und dann nur die Positionen berechnen, an denen eine Zahl statt eines Punktes stehen muss,
abhängig von i, j und n

--------

so, vieles zur Auswahl, erstmal für ein Verfahren entscheiden


----------



## noobinjava (13. Nov 2009)

> *
> **
> ***
> ****
> ...



das klappt leider nicht mit diesem Code. Warum nicht?

[Java]
public class flaggenübung {
	public static void main(String [] args){

		String m = ""; 

		for (int i =1; i <= 6; i++){
			System.out.println ( m+="*");
			}
		m = "*****";
		for (int i = 7; i <=11; i++) {
			System.out.println( m -= "*");

	}
		}
}
[/Java]


----------



## Gast2 (13. Nov 2009)

[Java]
			System.out.println( m -= "*");
[/Java]

weil Strings nicht subtrahiert werden können ... Du musst mit Substring (String (Java 2 Platform SE v1.4.2)) arbeiten


----------



## ARadauer (13. Nov 2009)

ich würde ganz anders an das problem heran gehen. wie gesagt zwei schleifen..
1. das machen, ganz einfach oder?


> .........
> .........
> .........
> .........
> ...



dann das machen, ganz leicht, na wann kommt die 1 hin statt dem . ?



> 1........
> .1.......
> ..1......
> ...1.....
> ...



3. das nicht ganz so leicht aber auch leicht raus zu finden wann jetzt die 1 zusätzlich kommt


> 1.......1
> .1.....1.
> ..1...1..
> ...1.1...
> ...


und nun.. wann kommt da eine 0 statt 1?
das sag ich dir:
 i/2 rest ==0 
-> if(i%2==0)



> 1.......1
> .0.....0.
> ..1...1..
> ...0.0...
> ...



Also wir sehen ihr wirklich oft schlechte aufgabenstellungen von Lehrern, aber diese finde ich wieder mal echt gut ;-)


----------



## noobinjava (15. Nov 2009)

Ich habe es leider nicht geschafft, dies darzustellen:


> .........
> .........
> .........
> .........
> ...



Wir müssen nämlich mit dieser Vorgabe coden:

[Java]public class Miniprojekt2 {
public static String flagge1(int groesse) {
// Großes X, Zeilen 1 und 0
// der Parameter groesse ist stets ungerade und <= 9
String m = "";
// hier die Lösung implementieren
return m;
}

public static void main(String[] args) {
// Testausgaben
System.out.println(flagge1(5));
System.out.println(flagge1(7));
System.out.println(flagge1(9)); [/Java]


----------



## ARadauer (15. Nov 2009)

mit zwei Schleifen.. hilft der tipp nicht? Brauchst du die Lösung?


```
public static String flagge1(int groesse) {
		// Großes X, Zeilen 1 und 0
		// der Parameter groesse ist stets ungerade und <= 9
		String m = "";
		// hier die Lösung implementieren

		for(int i = 0; i< groesse; i++){
			for(int j = 0; j < groesse; j++){
				m += ".";
			}
			m+="\n";			
		}
		return m;
	}
```
so in etwa...

Schaffst du mit dem das 2. von mir?


----------



## noobinjava (16. Nov 2009)

Hallo,

ich habe versucht, direkt 


> 1.......1
> .0.....0.
> ..1...1..
> ...0.0...
> ...



hinzukriegen, aber wieder mal vergebens:





```
public static String flagge1(int groesse) {
        // Großes X, Zeilen 1 und 0
        // der Parameter groesse ist stets ungerade und <= 9
        String m = "";
        int a;
        for(int i = 0; i< groesse; i++){
        	for(int j = 0; j < groesse; j++){
        		if (i%2 ==0){ for (j=2; j<groesse; j = j+2 )
        		for (j = groesse -1; j <groesse; j = j -2)
        		{ a = 1; }
        		}
                m += ".";
        	}
            m+="\n";            
        }
        return m;
	}
	
	public static void main(String[] args) {
		// Testausgaben
		System.out.println(flagge1(5));
		System.out.println(flagge1(7));
		System.out.println(flagge1(9));
	}}
```


Könntest du bitte dann die Lösung präsentieren, ich kriegs leider nicht
gebacken.

Danke


----------



## ARadauer (16. Nov 2009)

mach doch sinnvolle Klammern!


```
if (i%2 ==0){ for (j=2; j<groesse; j = j+2 )
                for (j = groesse -1; j <groesse; j = j -2)
                { a = 1; }
```
wer soll denn das lesen können?
warum machst du drei schleifen? willst du einen Würfle darstellen?

willst du die Lösung?


----------



## ARadauer (16. Nov 2009)

viel spaß noch ;-)

```
public static String flagge1(int groesse) {
		String result = new String();
		for(int i = 0; i< groesse; i++){
			for(int j = 0; j < groesse; j++){
				if(j==i ||  groesse-i-1 ==j){
					if(i%2==0){
						result+="1";
					}else{
						result+="0";						
					}
				}else{
					result+=".";					
				}
			}
			result+="\n";
		}
		return result;
	}
```


----------



## 0x7F800000 (17. Nov 2009)

ARadauer, wenn du so eine Lösung postest, dann erlaub dir doch wenigstens den Spaß, das ganze möglichst lustig hinzuschreiben, dann hat der Mensch wenigstens was zum puzzeln 

```
import static java.lang.System.*;
import static java.lang.Math.*;

public class Flaggen {
	
	private static interface Flagge{
		char getChar(int x, int y, int w, int h);
	}
	
	public static void draw(Flagge f, int w, int h){
		for(int x=0; x<w; x++){
			for(int y=0; y<h; y++){
				out.print(f.getChar(x,y,w,h));
			}
			out.println();
		}
	}
	
	public static void main(String..._){
		draw(new Flagge(){
			@Override public char getChar(int x, int y, int w, int h){
				return abs(x-w/2)==abs(y-h/2)?(x-w/2+1)%2==0?'0':'1':'.';
			}
		}, 19,19);
	}
}
```
Ich find die doppelten Doppelpunkte soo toll^^ :lol:


----------



## ARadauer (17. Nov 2009)

kreativ ;-)
Programmieren ist eine Kunst und da sollte man kreativ sein


----------



## noobinjava (17. Nov 2009)

stimmt, danke nochmal wegen der lösung, das problem ist nur, dass die aufgabe
mittels der vorgaben gelöst werden sollte, also mit "String m = "";" etc. hier ist
es nochmal:


```
public class Miniprojekt2 {
public static String flagge1(int groesse) {
// Großes X, Zeilen 1 und 0
// der Parameter groesse ist stets ungerade und <= 9
String m = "";
// hier die Lösung implementieren
return m;
}
 
public static void main(String[] args) {
// Testausgaben
System.out.println(flagge1(5));
System.out.println(flagge1(7));
System.out.println(flagge1(9));
```

kannst du das auch auf diese weise lösen?


----------



## Michael... (17. Nov 2009)

noobinjava hat gesagt.:


> kannst du das auch auf diese weise lösen?


Nun ja, wenn man sich den Code von ARadauer anschaut und dann Deine Vorgaben anschaut, was fällt dann auf?
--> Er hat sich (fast) genau an die Vorgaben gehalten.


----------



## noobinjava (17. Nov 2009)

tatsächlich, ich habe das "new String ()" mit "" ersetzt und es funktioniert trotzdem.
wie gesagt, ich bin ein noob in java, ich nichts verstehen.


----------



## SlaterB (17. Nov 2009)

zumindest schreibst du "" statt new String(), damit bist du quasi besser als ARadauer


----------

