# Ampel (mitBlueJ)



## butters3x (10. Nov 2012)

Hallo,
ich habe ein Problem. Ich schreibe gerade eine Ampel mit Java und komme nicht weiter. ???:L
Ich kann bereits die einzelenen Phasen durchschalten und auch mit nur 1 Klick alle 1 mal durchlaufen lassen. Nun möchte ich aber eine Schleife machen das ich z.b. sage 7 durchläufe und er das dann auch macht. Aber irgenwie klappt das nicht. Er sagt variable i is already definded in method schleife (int)Desweiteren will ich mit der Klasse public void weiterschalten immer nur 1 Ampelphaseweiterschalten aber auch hierzu hab ich keine Ahnung wie das gehen soll.


```
/**
 * Beschreiben Sie hier die Klasse Ampel.
 * 
 * Das definieren eines Atributes int zustand; hat bei mir nicht funktioniert.
 * Zudem kann ich keine Schleife machen. Wo der Fehler liegt ist mir nicht klar.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Ampel
{
    Kreis k1;
    Kreis k2;
    Kreis k3;
    Rechteck r;

    /**
     * Konstruktor für Objekte der Klasse Ampel
     */
    public Ampel()
    {
        k1 = new Kreis (20,20,50,"rot");
        k2 = new Kreis (20,70,50,"gelb");
        k3 = new Kreis (20,120,50,"gruen");
        r = new Rechteck (20,20,50,150, "schwarz");
        r.sichtbarMachen();
    }
    
    public void AmpelRot()
    {
        k1.sichtbarMachen();
        k2.unsichtbarMachen();
        k3.unsichtbarMachen();
    }
    
    public void AmpelRotGelb()
    {
        k1.sichtbarMachen();
        k2.sichtbarMachen();
        k3.unsichtbarMachen();
    }
    
    public void AmpelGruen()
    {
        k1.unsichtbarMachen();
        k2.unsichtbarMachen();
        k3.sichtbarMachen();
    }
    
    public void AmpelGelb()
    {
        k1.unsichtbarMachen();
        k2.sichtbarMachen();
        k3.unsichtbarMachen();
    }
    
    //public void AmpelGelbGruen()  |
    //                              |
    //    k1.unsichtbarMachen();    | Nur zum Test deshalb "entfernt"
    //    k2.sichtbarMachen();      |
    //    k3.sichtbarMachen();      |
    //}
    
    public void weiterschalten()
    {
        
    }
    
    public void simulieren()
    {
        k1.sichtbarMachen();
        k2.unsichtbarMachen();
        k3.unsichtbarMachen();
      warten(1000);
        k1.sichtbarMachen();
        k2.sichtbarMachen();
        k3.unsichtbarMachen();
      warten(1000);
        k1.unsichtbarMachen();
        k2.unsichtbarMachen();
        k3.sichtbarMachen();
      warten(2000);  
        k1.unsichtbarMachen();
        k2.sichtbarMachen();
        k3.unsichtbarMachen();
      warten(1000);
        k1.sichtbarMachen();
        k2.unsichtbarMachen();
        k3.unsichtbarMachen();
    }
    
    public void schleife (int anzahl)
    {
        int i = anzahl;
        while (anzahl < 0) {
            for (int i=0; i < 0; i=i+1)
            {
            simulieren();
            }
        } 
    }
    
    /** ms Milli-Sekunden warten.*/
    public static void warten(int ms) {
        long zeit = System.currentTimeMillis();
        while (ms > (System.currentTimeMillis()-zeit)) ;
    }
}
```

Vielen Dank im Vorraus


----------



## pro2 (10. Nov 2012)

Methodenaufrufe brauchen Klammern.


```
simulieren();
```

Dann ist es auch eine "Statement".


----------



## butters3x (10. Nov 2012)

danke iwie hab ich dann andere probleme :/ aber thx


----------



## jgh (10. Nov 2012)

versuch mal folgendes:

[JAVA=93]	public void schleife(int anzahl) {
		for (int i = anzahl; i <= 0; i--) {
			simulieren();
		}
	}[/code]

ansonsten nutzt du irgendwie 3x eine variable die anzahl heißt: eimal als parameter des aufrufes, einmal vor der while schleife und einmal in der for-schleife. btw warum denn 2 schleifen?


----------



## nevermind 10844 (10. Nov 2012)

Moin, also soweit ich das sehe ist vor allem in der Schleife einiges zu überarbeiten:

```
for (int i=0; i < 0; i=i+1)
            {
            simulieren();
            }
```
Der Schleifenkopf besteht aus 3 Teilen
1. der Zählervariable int i=0;
2. der Bedingung gegen die geprüft wird ob die Schleife ein weiteres mal durchlaufen wird i < 0;
3. der Aktion die bei jedem durchlauf durchgeführt werden soll i = i+1

Zu 1: hier initialisiert du i was auch der Grund ist warum sich der Compiler beschwert: Du initialisiert i bereit zuvor: int i = anzahl; Das darf jedoch nur ein mal passieren an der Stelle es kann keine 2 Variablen mit selbem Namen im gleichen Scope geben.

Zu 2: die Bedingung bei dir lautet: solange i kleiner ist als 0 das ist jedoch so nie der Fall weil du i mit 0 initialisierst. So wird die Schleife also nie durchlaufen.

Zu 3: Der Ausdruck ist zwar richtig, es gibt jedoch den Inkrementoperator ++ schreibst du also i++ statt i=i+1 hin, ist das äquivalent. Ist einfach der übliche Weg.

Die Zuweiseung int i = anzahl; macht für mich keinen Sinn. Wenn du damit die Zahl der durchläufe begrenzen willst kannst du z.B. die variable anzahl direkt benutzen:


```
while(anzahl>0){
    anzahl--; //anzahl um 1 verringern!
    for(...){
        ...
    }
}
```


----------



## butters3x (10. Nov 2012)

public void schleife (int anzahl)
    {
        int i = anzahl;
        while (anzahl > 0) {
            for (; i > 0; i=i+1)
            {
            simulieren();
            anzahl = (-1)*anzahl;
            }
        } 
    }


----------



## nevermind 10844 (10. Nov 2012)

das sieht sehr konfus aus:


```
public void schleife (int anzahl)
{
    for (int i = 0; i < anzahl; i++)
    {
        simulieren();
    }
}
```

sollte eigentlich funktionieren und sieht deutlich sauberer aus.
Schau dir noch mal Schleifen in Java an!


----------

