Hilfe bei einer Aufgabe!

lisali

Erfahrenes Mitglied
Hallo,

bräuchte dringend Eure Hilfe.

Folgende Aufgabe:

Write an Abstract Data Type for a traffic light control unit, which implements the TrafficLightControlType
interface below. The method next() changes the internal state according to the German sequence: red, red+yellow,
green, yellow, red, ... , with red as initial state. Hint: Identify states by numbers, 0-3.

public interface TrafficLightControlType {
public boolean redIsOn();
public boolean yellowIsOn();
public boolean greenIsOn();
public void next();
}

Was sagt mit denn der Hinweis mit Abstract Data Type?

Kann mir jemand sagen wie man an eine solche Aufgabe herangeht und wie ihr sie lösen würdet? Die Lösung habe ich, jedoch wäre ich darauf nicht gekommen... soll ich die auch posten oder erstmal eure Antworten abwarten!?

Liebe Grüße,

Lisa
 
Hi,
es steht doch eigentlich schon alles da. Du sollst eine Klasse erstellen, die eine Ampel (durch die Implementierung des Interfaces TrafficLightControlType )nachstellt.
Beim Aufruf der next() - Methode soll sich der interne Status ändern.
D.h. wenn sie wie geschrieben anfangs auf rot steht (redIsOn() muss also true liefern, alle anderen false), muss nach dem Aufruf von next() redIsOn() und yellowIsOn() true liefern. Usw....

Zusammengefasst:
Aufruf von next: Änderung der internen Statusvariablen
Die drei Boolean Methoden liefern true/false in abhängigkeit der internen Statusvariablen....



Das steht alles schon im Text, ich habs nur umformuliert...

Grüße!
 
Hey,

und was genau sagt mir dabei der Hinweise mit "Write an Abstract Data Type"?

Also, das hier ist der Code und ich kann ihn auch fast komplett nachvollziehen:

Code:
public class TrafficLightControl implements TrafficLightControlType {
private boolean red = true, yellow=false, green=false;
private int state = 0;
public boolean greenIsOn() {
return green;
}
public boolean redIsOn() {
return red;
}
public boolean yellowIsOn() {
return yellow;
}
public void next() {
switch (state) {
case 0: yellow = true; break; // turn to red-yellow
case 1: green = true; red = false; yellow = false; break;
// turn to green
case 2: yellow = true; green = false; break; // turn to yellow
case 3: red = true; yellow = false; break; // turn to red
}
state = (state +1) % 4;
}
}

Außer diese state-MOdulo-Anweisung am Ende... die versteh ich nicht ganz.
 
Also, ich weiß, dass in der Aufgabe steht, dass der Anfangswert (intial state) red bzw. rot sein soll. Das ist ja in case 3 der Fall. Und mit dieser Anweisung wird ja "state" erstmal von 0 auf 1 gesetzt durch die Addition und dann modulo 4 genommen, aber das Ergebnis von 1 modulo 4 ist doch 1?

Das mit dem ADT versteh ich irgendwie nur teilweise. Also, ich weiß, dass es wohl bedeuten soll eine Klasse zu schreiben und zu implementieren... und dass die implementierten Sachen größtenteils immer Methoden sind oder in den meisten Fällen, wenn ich das richtig verstanden hab!?

Ansonsten weiß ich jetzt nicht was mir der Hinweise bringt... hätte ich denn ohne den Hinweis etwas falsch machen können?
 
Also, ich weiß, dass in der Aufgabe steht, dass der Anfangswert (intial state) red bzw. rot sein soll. Das ist ja in case 3 der Fall. Und mit dieser Anweisung wird ja "state" erstmal von 0 auf 1 gesetzt durch die Addition und dann modulo 4 genommen, aber das Ergebnis von 1 modulo 4 ist doch 1?
Vielleicht solltest du das Programm auch mal laufen lassen, und dir ein paar Ausgaben einbauen. Dann sollte schnell klar werden, was in dieser next() Methode eigentlich passiert.


Ansonsten weiß ich jetzt nicht was mir der Hinweise bringt... hätte ich denn ohne den Hinweis etwas falsch machen können?
Der Hinweis ist nur eine formale, sprachunabhängie Beschreibung, was zu tun ist. Steht ja schließlich nirgendwo da, dass es in Java zu realsieren ist.

Schönen Abend noch,
Grüße!
 
Jetzt versteh ich das auch erst. Das mit Modulo wird gemacht, damit das ganze wieder auf 0 gesetzt wird und nochmal durchlaufen kann!

Ja, also die Aufgaben sind alle in Java zu realisieren.

Also, ich hab nun den folgenden Code und diese Ampel mal gebaut, aber irgendwie funktioniert der Mausklick nicht mit der next() Methode.
Warum?

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class niti extends JPanel implements MouseListener,TrafficLightControlType {
	private boolean red = true, yellow=false, green=false;
	private int state = 0;
	private TrafficLightControlType trafficLight = new TrafficLightControl();
	private int boxX = 150, boxY = 35, boxWidth = 200, boxHeight = 400,
	posX = 190, redY = 52, circleWidth = 120, circleHeight = 120,
	yellowY = redY+120,
	greenY = yellowY+120;
	
  public static void main(String[] args) {
	    JFrame frame = new JFrame();
	    frame.getContentPane().add(new niti());
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setSize(500,500);
	    frame.setVisible(true);

  }
  
	private void drawBox(Graphics g) {
		g.setColor(Color.BLACK);
		g.fillRect(boxX, boxY, boxWidth, boxHeight);
		}
	public void paint(Graphics g) {
		drawBox(g);
		drawRed(g);
		drawYellow(g);
		drawGreen(g);
		}
	private void drawRed(Graphics g) {
		if (trafficLight.redIsOn()) g.setColor(Color.RED);
		else g.setColor(Color.DARK_GRAY);
		g.fillOval(posX, redY, circleWidth, circleHeight);
		}
	private void drawYellow(Graphics g) {
		if (trafficLight.yellowIsOn()) g.setColor(Color.YELLOW);
		else g.setColor(Color.DARK_GRAY);
		g.fillOval(posX, yellowY, circleWidth, circleHeight);
		}
	private void drawGreen(Graphics g) {
		if (trafficLight.greenIsOn()) g.setColor(Color.GREEN);
		else g.setColor(Color.DARK_GRAY);
		g.fillOval(posX, greenY, circleWidth, circleHeight);
		}

public boolean greenIsOn() { return green; }
public boolean redIsOn() { return red; }
public boolean yellowIsOn() { return yellow; }

public void next() {
switch (state) {
case 0: yellow = true; break; // turn to red-yellow
case 1: green = true; red = false; yellow = false; break; // turn to green
case 2: yellow = true; green = false; break; // turn to yellow
case 3: red = true; yellow = false; break; // turn to red
}
state = (state +1) % 4;
System.out.println("Status:" + state);
}

public void mouseClicked(MouseEvent e){
	trafficLight.next();
	repaint();
	}

public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }


}
 
Dankeschön, das hat geklappt.

Mein Code sieht nun so aus, aber irgendwie wechselt er die Ampelfarben falsch. Zuerst rot, dann grün, dann rot-gelb, dann grün, dann rot, dann gelb, dann wieder rot...

Und das unabhängig davon was ich bei "state" eingebe. Auch wenn ich schreibe "state = 1;"
Da wird mir in der Console dauernd nur angezeigt:

State: 0
State: 0
State: 0
...
...

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class niti extends JPanel implements MouseListener {
	private boolean red = true, yellow=false, green=false;
	private int state = 0;
	private TrafficLightControlType trafficLight = new TrafficLightControl();
	private int boxX = 150, boxY = 35, boxWidth = 200, boxHeight = 400,
	posX = 190, redY = 52, circleWidth = 120, circleHeight = 120,
	yellowY = redY+120,
	greenY = yellowY+120;
	
	public boolean greenIsOn() { return green; }
	public boolean redIsOn() { return red; }
	public boolean yellowIsOn() { return yellow; }
	
  public static void main(String[] args) {
	    JFrame frame = new JFrame();
	    frame.getContentPane().add(new niti());
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setSize(500,500);
	    frame.setVisible(true);

  }
	private void drawBox(Graphics g) {
		g.setColor(Color.BLACK);
		g.fillRect(boxX, boxY, boxWidth, boxHeight);
		}
	public void paint(Graphics g) {
		drawBox(g);
		drawRed(g);
		drawYellow(g);
		drawGreen(g);
		addMouseListener(this);
		}
	private void drawRed(Graphics g) {
		if (trafficLight.redIsOn()) g.setColor(Color.RED);
		else g.setColor(Color.DARK_GRAY);
		g.fillOval(posX, redY, circleWidth, circleHeight);
		}
	private void drawYellow(Graphics g) {
		if (trafficLight.yellowIsOn()) g.setColor(Color.YELLOW);
		else g.setColor(Color.DARK_GRAY);
		g.fillOval(posX, yellowY, circleWidth, circleHeight);
		}
	private void drawGreen(Graphics g) {
		if (trafficLight.greenIsOn()) g.setColor(Color.GREEN);
		else g.setColor(Color.DARK_GRAY);
		g.fillOval(posX, greenY, circleWidth, circleHeight);
		}

public void next() {
switch (state) {
case 0: yellow = true; break; // turn to red-yellow
case 1: green = true; red = false; yellow = false; break; // turn to green
case 2: yellow = true; green = false; break; // turn to yellow
case 3: red = true; yellow = false; break; // turn to red
}
state = 1;

}

public void mouseClicked(MouseEvent e){
	trafficLight.next();
	repaint();
	System.out.println("State:" + state);
	}

public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }


}
 
Moin!
Warum weist du den MouseListener in der paint Methode zu? Nach x Aufrufen der paint Methode wird auch dann x-Mal die next Methode nach einem Mausklick aufgerufen!
Sowas gehört beispielsweise in den Konstruktor!

Grüße!
 
Zurück