Erste Schritte Schreiben Sie eine Klasse Zeit, die eine Zeitdauer in Minuten beschreibt

Terence86

Aktives Mitglied
Schreiben Sie eine Klasse Zeit, die eine Zeitdauer in Minuten beschreibt. Die Anzahl Minuten
verwaltet sie in einer Variablen. Die Klasse bietet folgende Methoden an:
• void setDauer(int m) setzt die Zeitdauer auf m Minuten.
• int stunden() gibt zurück, wieviele Stunden die Zeitdauer umfasst (je 60 Minuten sind
eine Stunde).
• int minuten() gibt zurück, wieviele Minuten die Zeitdauer umfasst, die keine ganze Stunde
mehr ergeben. Das Ergebnis liegt also in dem Bereich von 0 bis 59.

Beispiel: Nach dem Aufruf
Zeit.setDauer(283);
liefert Zeit.stunden() den Wert 4 und Zeit.minuten() den Wert 43.

// Wieso brauch ich void setDauer(int m), da die Eingabe als Minuten doch eingeben wird???

// int stunden() muss ja minuten/60 sein um die Stunden zu bekommen
und int minuten() sowas wie minuten%60, um die Restminuten zu bekommen.
 

Terence86

Aktives Mitglied
Die Frage verstehe ich ja bis auf für was ich setDauer() brauche.
Aber an der Übersetzung scheitert es. Vielleicht auch daran weil ich nicht verstehe was ich mit setDauer zu tun habe.
 

Terence86

Aktives Mitglied
Java:
public class Zeit {
    int stunden;
    int minuten;
void setDauer(int m){
     m = minuten%60;

   // int stunden=m/60;
   // int minuten=m%60;


        }
}
 
Zuletzt bearbeitet:

Terence86

Aktives Mitglied
Code:
public class Zeit {
    int stunden;
    int minuten;
  
void setDauer(int m){
      m = minuten;
}

int stunden(){
    stunden = m/60;
}
int minuten(){
    minuten = m%60;
}

}
Oder eher so? Ich bin hier weil ich es ja nicht so verstehe und nicht grad ein paar Minuten dran bin und eine Musterlösung will. =(
 

Meniskusschaden

Top Contributor
Die eigentliche Berechnung sieht gut aus. Das wird sich aber nicht kompilieren lassen, weil weder stunden() noch minuten() einen Wert zurück liefern. Du solltest die Berechnungen lieber in der Methode setDauer() machen.
 

Salo

Aktives Mitglied
Speichere nur die minuten ab, die du in setDauer(int m) bekommst, und berechne dann alles weitere in den getter methoden.

Kleiner Tipp (Ich weiß halt nicht wie weit du bist, verzeih wenn sich des komisch o. ä. anhört)
mit return kannst du die Werte in einer methode zurückgeben.
Sprich:
Java:
int getMinuten() {
    return minuten%60;
}
und
Java:
int getStunden() {
    return minuten/60;
}
 

Terence86

Aktives Mitglied
Code:
public class Zeit {
    int minuten;
 
void setDauer(int m){
      m = minuten;
}

int getMinuten(){
    return minuten%60;
}

int getStunden(){
    return minuten%60;
}

 
}
Also etwa so?
 
Zuletzt bearbeitet:

Salo

Aktives Mitglied
Code:
public class Zeit {
    int minuten;

void setDauer(int m){
      m = minuten;
}

int getMinuten(){
    return minuten%60;
}

int getStunden(){
    return minuten%60;
}


}
Also etwa so?

eigentlich schreibt man minuten = m.
Weil man sonst der übergebenen Variable den Wert von minuten zuweißt.
Aber sonst ist dein problem geklärt, oder?
Wenn du wieder fragen hast kannst du gerne wiederkommen. Wir beantworten Fragen immer gerne, solange sie klar gestellt sind.;):)
 

Terence86

Aktives Mitglied
Eine Frage hätte ich noch wie teste ich das nun am besten? Brauche ich ja ne main methode, wie würde die den dann aussehen? Eclipse gibt mir immer einen auf den Deckel das ich ne neue Variable erstellen soll oder anderer Fehler.
 

Salo

Aktives Mitglied
Etwa so:
Java:
public static void main(String[] args) {
    Zeit zeit = new Zeit();
    zeit.setMinuten(185);
    System.out.println("Minuten: " + zeit.getMinuten());
    System.out.println("Stunden: " + zeit.getStunden());
}

Du hast noch ein fehler in deiner methode getStunden()
dort heist es nicht % sondern natürlich /.:):p
 
Zuletzt bearbeitet:

Salo

Aktives Mitglied
Die main legst du entweder in der Klass zeit an, oder, was mehr zu empfehlen währe, du erstellst eine neue Klass, in der du dann die main reinschreibst.
 
X

Xyz1

Gast
Mal eine Frage dazu, wird %, / usw. bei setDauer() berechnet oder erst bei den Gettern? Also was soll die Klasse speichern?
 
X

Xyz1

Gast
Die Klasse schaut so:
Java:
/**
 * @author DW
 */
public class Zeit {

    int minuten;

    public Zeit() {
    }

    void setDauer(int m) {
        minuten = m;
    }

    int getMinuten() {
        return minuten % 60;
    }

    int getStunden() {
        return minuten / 60;
    }
}

Ein möglicher Test schaut so:
Java:
import java.util.*;
import org.junit.*;

/**
 *
 * @author DW
 */
public class ZeitTest {

    public ZeitTest() {
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of setDauer method, of class Zeit.
     */
    @Test
    public void testSetDauer() {
        System.out.println("setDauer");
        int m = new Random().nextInt();
        Zeit instance = new Zeit();
        Assert.assertNotNull(instance);
        instance.setDauer(m);
        Assert.assertEquals(instance.minuten, m);
    }

    /**
     * Test of getMinuten method, of class Zeit.
     */
    @Test
    public void testGetMinuten() {
        System.out.println("getMinuten");
        Zeit instance = new Zeit();
        Assert.assertNotNull(instance);
        instance.setDauer(new Random().nextInt());
        int expResult = 0;
        int result = instance.getMinuten();
        Assert.assertEquals(instance.minuten % 60, result);
    }

    /**
     * Test of getStunden method, of class Zeit.
     */
    @Test
    public void testGetStunden() {
        System.out.println("getStunden");
        Zeit instance = new Zeit();
        Assert.assertNotNull(instance);
        instance.setDauer(new Random().nextInt());
        int expResult = 0;
        int result = instance.getStunden();
        Assert.assertEquals(instance.minuten / 60, result);
    }
}

Ihr sagt mir bitte, ob ich beim Test was übersehen hab?
 
X

Xyz1

Gast
Klar hab ich was falsch gemacht, ein möglicher Test schaue so:
Java:
import java.util.*;
import org.junit.*;
import org.junit.rules.*;

/**
 * @author DW
 */
public class ZeitTest {

    @Rule
    public final ExpectedException exception = ExpectedException.none();

    public ZeitTest() {
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of setDauer method, of class Zeit.
     */
    @Test
    public void testSetDauer() {
        System.out.println("setDauer");
        int m = new Random().nextInt();
        Zeit instance = new Zeit();
        Assert.assertNotNull(instance);
        if (m < 0) {
            exception.expect(IllegalArgumentException.class);
            exception.expectMessage("kleiner 0");
        }
        instance.setDauer(m);
        Assert.assertEquals(m, instance.minuten);
    }

    /**
     * Test of getMinuten method, of class Zeit.
     */
    @Test
    public void testGetMinuten() {
        System.out.println("getMinuten");
        int m = new Random().nextInt();
        Zeit instance = new Zeit();
        Assert.assertNotNull(instance);
        if (m < 0) {
            exception.expect(IllegalArgumentException.class);
            exception.expectMessage("kleiner 0");
        }
        instance.setDauer(m);
        int expResult = m % 60;
        int result = instance.getMinuten();
        Assert.assertEquals(expResult, result);
    }

    /**
     * Test of getStunden method, of class Zeit.
     */
    @Test
    public void testGetStunden() {
        System.out.println("getStunden");
        int m = new Random().nextInt();
        Zeit instance = new Zeit();
        Assert.assertNotNull(instance);
        if (m < 0) {
            exception.expect(IllegalArgumentException.class);
            exception.expectMessage("kleiner 0");
        }
        instance.setDauer(m);
        int expResult = m / 60;
        int result = instance.getStunden();
        Assert.assertEquals(expResult, result);
    }
}

setDauer() schaue so:
Java:
    void setDauer(int m) {
        if (m < 0) {
            throw new IllegalArgumentException("kleiner 0");
        }
        minuten = m;
    }

----

"Du hast übersehen, das man in Unit-Tests kein Random benutzt.": Wieso nicht, funktioniert doch?

Ich bin jetzt nicht der Testexperte. :(
 
X

Xyz1

Gast
Ich hab das so geschrieben, weil bei gleichem Test die Implementierung jetzt so geändert werden kann:
Java:
/**
 * @author DW
 */
public class Zeit {

    int minuten;
    int m;
    int s;

    public Zeit() {
    }

    void setDauer(int m) {
        if (m < 0) {
            throw new IllegalArgumentException("kleiner 0");
        }
        minuten = m;
        this.m = minuten % 60;
        this.s = minuten / 60;
    }

    int getMinuten() {
        return m;
    }

    int getStunden() {
        return s;
    }
}

Das ist aber kein Blackbox-Test... Eigentlich hätte uns @Terence86 seine eigene proprietäre Software(/Implementierung) und eine Entwicklerdoku geben müssen, welche wir dann testen, oder nicht?

Tester dürfen überhaupt nicht mit der Entwicklung "in Berührung kommen" (nicht sehen usw.).
 

mrBrown

Super-Moderator
Mitarbeiter
Nur kann man das Testergebniss getrost in die Tonne werfen, eben weil Random benutzt wird.


UnitTests sind auch eher WhiteBox^^
Irgendwie sind so aktuelle Techniken wie TDD und TF nicht so ganz bei dir angekommen?
 
X

Xyz1

Gast
Nur kann man das Testergebniss getrost in die Tonne werfen, eben weil Random benutzt wird.
Du kannst in dem Fall aber nicht den kompletten Wertebereich von Integer testen... Interessante Randfälle gibt es auch nicht... Also ich nehme bei sowas Random.

Na klar gibt es BlackBox-Tests mit JUnit. Schickt mir einfach eine .jar und eine Beschreibung dazu...

Und TDD und den Quatsch mache ich nicht, alles agil ;)

Aber vielleicht kommt das zu sehr vom Thema ab... Gibt's jetzt noch iwelche Fragen (nicht zu den Tests)?

Wenn nicht, widme ich mich wieder meinen eigentlichen Aufgaben :)
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst in dem Fall aber nicht den kompletten Wertebereich von Integer testen... Interessante Randfälle gibt es auch nicht... Also ich nehme bei sowas Random.
Doch gibt es, das m<0.
Und selbst wenn es keine gibt, hat es keinen Sinn, zufällige Werte zu nehmen.


Aber widme dich mal lieber anderen Aufgaben, das wäre sicher für alle ne Bereicherung ;)
 

Neue Themen


Oben