Klasse Signal

Heinrich500

Bekanntes Mitglied
Hallo liebes Forum,
mir bereitet folgende Aufgabe den ganzen Tag schon Kopfzerbrechen:

Programmieren Sie eine Klasse Notsignalgeber. Bleibt eine gewisse Zeit (z. B. 30 s) ohne Bewegung, wird ein Voralarm ausgelöst. Ist der Träger bei Bewusstsein, wird er sich dann leicht bewegen, um den Alarm auszuschalten. Ansonsten wird z. B. nach weiteren 10 s der Hauptalarm ausgelöst. Die Klasse Notsignalgeber soll die wesentliche Steuerungslogik enthalten. Informationen über die Bewegung und die Zeit kommen von außen (s. u., das brauchen Sie nicht zu programmieren). Die Klasse Notsignalgeber soll einen Konstruktur und zwei Methoden bekommen:
• Der Konstruktor hat zwei Parameter für die Zeit bis zum Voralarm und die zusätzliche Zeit bis zum Hauptalarm. Ein Aufruf könnte so aussehen:
Notsignalgeber notsig = new Notsignalgeber(30,10);

• Die Methode tick() (ohne Parameter) wird von einem externen Zeitgeber jede Sekunde einmal aufgerufen. Sie soll die Lautstärke des Alarms zurückliefern (als Rückgabewert der Methode), also 0 für kein Alarm, 50 für Voralarm und 100 für Hauptalarm. Ein möglicher Aufruf könnte so aussehen:
int lautstaerke = notsig.tick();
Beim oben erzeugten Objekt soll bei den ersten 30 Aufrufen der Wert 0 geliefert werden, beim 31. bis 40. Aufruf der Wert 50, und ab dem 41. Aufruf der Wert 100 (sofern nicht zwischendurch eine Bewegung festgestellt wurde).

• Eine Methode bewegt(), die aufgerufen wird, wenn der Bewegungsmelder eine Bewegung erkannt hat. Diese Methode hat keine Parameter und keinen Rückgabewert. Ein möglicher Aufruf könnte so aussehen:
notsig.bewegt();
Nachdem diese Methode aufgerufen wurde, sollen die nächsten 30 Aufrufe von tick() wieder den Wert 0 liefern. Die beiden Methoden (und natürlich der Konstruktor) sollen von außen aufrufbar sein. Entsprechend muß die Klasse auch von außerhalb benutzbar sein. Nichts sonst darf von außen zugreifbar sein (auch nicht von anderen Klassen des gleichen Paketes aus). Sie dürfen beliebige Attribute verwenden, die aber nur von innerhalb dieser Klasse aus zugreifbar sein dürfen. Hinweis: Offenbar muss man sich die Parameter des Konstruktors abspeichern und über die Zeit (Anzahl Aufrufe von tick()) seit dem letzten Aufruf von bewegt() ” Buch fuhren“ (wie Sie das genau realisieren, ist Ihnen überlassen).



Mein Programm bis jetzt:
Java:
public class Notsignalgeber {

    private int vor;
    private int haupt;
    private int speichervor;
    private int speichernach;
    private int anzahlderAufrufevonTick=0;
   
   
    public Notsignalgeber(int vor, int haupt) {
        this.vor=vor;
        this.haupt=haupt;
        speichervor=vor;
        speichernach=haupt;
       
       
    }
   
    public int tick() {
        anzahlderAufrufevonTick++;
        if(anzahlderAufrufevonTick<=vor) return 0;
        if(anzahlderAufrufevonTick>vor && anzahlderAufrufevonTick<=haupt) return 50;
        return 100;
       
       
    }
   
   
    public void bewegt() {
       
    }
}

Ich weis nicht wie ich die Methoden bewegt und tick verketten soll, dass das klappt.
Kann mir da jmd bitte weiterhelfen ;(
 
Erstell doch einfach eine Variable, die in der Methode tick() überprüft wird, ob sie 0 ist, dann kann der Rest folgen oder du dekrementierst nur und beendest dann die Methode. bewege() macht dann nichts anderes als diese Variable neu zusetzen.
Warum brauchst du die Variablen speichervor und speichernach?
 
Erstell doch einfach eine Variable, die in der Methode tick() überprüft wird, ob sie 0 ist, dann kann der Rest folgen oder du dekrementierst nur und beendest dann die Methode. bewege() macht dann nichts anderes als diese Variable neu zusetzen.
Warum brauchst du die Variablen speichervor und speichernach?
Weis ich nicht genau. Es stand im Hinweis, dass man die Werte aus dem Konstruktor speichern soll.
Wie soll das mit der 0 gehen.
Ich verstehe das nicht.
 
Du musst die Argumente ja aber nicht zweimal zuweisen!

Java:
//als Beispielname counter
private int counter;

//Initialisierung im Konstruktor
counter = 30;

public int tick() {
        anzahlderAufrufevonTick++;
        if(counter != 0){
                 counter--;
                 return;
        }

        if(anzahlderAufrufevonTick<=vor) return 0;
        if(anzahlderAufrufevonTick>vor && anzahlderAufrufevonTick<=haupt) return 50;
        return 100;
  
  
    }
 
 
    public void bewegt() {
          counter = 30;
          anzahlderAufrufevonTick = 0;
    }
 
Zuletzt bearbeitet:
Danke für deine Antwort.
Du setzt in bewegt den counter auf 30.
Wenn dann tick aufgerufen wird, wird der counter verringert, jedoch wird doch trotzdem anzahlderAufrufevonTick erhöht und bleibt dann nicht 30 mal 0 ?
 
Habs geändert. War ein kleiner Denkfehler.
Es ist sogar noch viel einfacher, wenn du das oben genannte Bsp. noch einmal durchgehst, kannst du auch folgende Lösung nutzen:
Java:
public int tick() {
        anzahlderAufrufevonTick++;

        if(anzahlderAufrufevonTick<=vor) return 0;
        if(anzahlderAufrufevonTick>vor && anzahlderAufrufevonTick<=haupt) return 50;
        return 100;
 

    }
    public void bewegt() {
          anzahlderAufrufevonTick = 0;
    }
 
Ach so.
Das ist ja ganz einfach.
anzahlderAufrufevonTick wird einfach zurückgesetzt.
Danke euch🙂))))
Endlich verstanden.
Nur verwunderlich, dass die Aufgabe 13 Punkte bringt für so "wenig" .
Und auch der Hinweis: Offenbar muss man sich die Parameter des Konstruktors abspeichern?
Naja es geht ja so🙂
 
Es müsste dann bei dir folgendes stehen:
Java:
public class Notsignalgeber {

    private int vor;
    private int haupt;
    private int anzahlderAufrufevonTick;
  
    public Notsignalgeber(int vor, int haupt) {
        this.vor = vor;
        this.haupt = haupt;
        this.anzahlderAufrufevonTick = 0;
    }
  
    public int tick() {
        anzahlderAufrufevonTick++;

        if(anzahlderAufrufevonTick <= vor) return 0;
        if(anzahlderAufrufevonTick > vor && anzahlderAufrufevonTick <= haupt) return 50;

        return 100;      
    }
  
  
    public void bewegt() {
       anzahlderAufrufevonTick = 0;
    }
}
 
Naja, abgesehen davon, dass es nicht das macht was es soll.
Schreib doch Tests dazu, dann siehst du auch was fehlt:
Java:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class NotsignalgeberTest {
 
  private Notsignalgeber signal;
  private int preAlarm = 10;
  private int mainAlarm = 10;
 
  @BeforeEach
  private void init() {
    signal = new Notsignalgeber(preAlarm, mainAlarm);
  }
 
  @Test
  void tickTest() {
    for (int i = 0; i < preAlarm; i++) {
      Assertions.assertEquals(Notsignalgeber.NO_ALARM, signal.tick());
    }
    for (int i = 0; i < mainAlarm; i++) {
      Assertions.assertEquals(Notsignalgeber.PRE_ALARM, signal.tick());
    }
    Assertions.assertEquals(Notsignalgeber.MAIN_ALARM, signal.tick());
  }
 
  @Test
  void bewegt() {
    for (int i = 0; i < preAlarm + mainAlarm; i++) {
      signal.tick();
    }
    Assertions.assertEquals(Notsignalgeber.MAIN_ALARM, signal.tick());
    signal.bewegt();
    Assertions.assertEquals(Notsignalgeber.NO_ALARM, signal.tick());
  }
}
 

Zurück
Oben