Commit 9c998082 authored by Dr. Martin Goik's avatar Dr. Martin Goik

Using enum, adding javadoc image

parent be28cc4d
...@@ -4,109 +4,144 @@ package de.hdm_stuttgart.mi.sd1.aufgabe1; ...@@ -4,109 +4,144 @@ package de.hdm_stuttgart.mi.sd1.aufgabe1;
* <p>Ein Fitnesstudio bietet folgende Tarife:</p> * <p>Ein Fitnesstudio bietet folgende Tarife:</p>
* *
* <ul> * <ul>
* <li>Jährliche Einmalzahlung, siehe {@link #TARIFTYP_JAHRESVORAUSZAHLUNG}.</li> * <li>Jährliche Einmalzahlung, keine Kosten pro Besuch, siehe {@link Tarif#JAHRESFLATRATE}.</li>
* <li>Flextarif, siehe {@link #TARIFTYP_FLEX}.</li> * <li>Jährliche Vorauszahlung und Kosten pro Besuch, siehe {@link Tarif#GEMISCHT}.</li>
* <li>Einmalbesuch ohne gebuchten Tarif, siehe {@link #TARIFTYP_PRO_BESUCH}.</li> * <li>Nur Kosten pro Besuch, keine jährlichen Kosten, siehe {@link Tarif#PRO_BESUCH}.</li>
* </ul> * </ul>
* *
* Der Rechner bietet Methoden zur Ermittlung sowohl von Kosten als auch des günstigsten Tarifs auf Basis * <p>Der Rechner ermittelt sowohl die Kosten als auch die günstigste Tarifart auf Basis der Anzahl von
* der Anzahl von Besuchen pro Jahr. * Besuchen pro Jahr.</p>
*/ */
public class FitnessTarifRechner { abstract public class FitnessTarifRechner {
/* Tariftypen */
/** /**
* <p>Für einen Jahresbeitrag von {@link #kostenJahrestarif} € kann man das Studio beliebig oft besuchen.</p> * Tarifarten zur Nutzung des Studios. Für jede Tarifart sind die Jahreskosten {@link #jahresKosten} und die
* Kosten pro Besuch {@link #kostenProBesuch} verfügbar.
*/ */
static public final byte TARIFTYP_JAHRESVORAUSZAHLUNG = 1; public enum Tarif {
/**
* Keine Jahresbeitrag, nur {@link #kostenProBesuch}
*/
PRO_BESUCH(0, 12),
/** /**
* <p>Pro Besuch des Studios werden {@link #kostenEinmaligFlextarif} € fällig. Zusätzlich fällt eine * Jahresbeitrag {@link #jahresKosten} und {@link #kostenProBesuch}.
* einmalige Jahresgebühr von {@link #basiskostenFlextarif} € an.</p> */
*/ GEMISCHT(150, 5),
static public final byte TARIFTYP_FLEX = 2;
/** /**
* <p>Ein einmaliger Besuch ohne vorab gebuchten Tarif kostet {@link #kostenEimaligOhneTarif} €.</p> * Keine Kosten pro Besuch, Jahresbeitrag {@link #jahresKosten}.
*/ */
static public final byte TARIFTYP_PRO_BESUCH = 3; JAHRESFLATRATE(800, 0);
/* Kostenangaben */ Tarif(final int jahresKosten, final int kostenProBesuch) {
this.jahresKosten = jahresKosten;
this.kostenProBesuch = kostenProBesuch;
}
/** /**
* Kosten eines Ganzjahrestickets. * Gesamtkosten auf Basis einer jährlichen Vorauszahlung und Kosten pro Besuch.
*/ *
static public final int kostenJahrestarif = 800; * @param anzahlBesuche Negative Werte werden als «0 Besuche» gewertet.
* @return Die jährlichen Gesamtkosten.
*/
public int getKosten(final int anzahlBesuche) {
if (anzahlBesuche <= 0) {
return jahresKosten;
} else {
return jahresKosten + anzahlBesuche * kostenProBesuch;
}
}
/** /**
* Jährliche Grundkosten Flextarif. * Jährlich anfallende Kosten in der jeweiligen Tarifart.
*/ */
static public final int basiskostenFlextarif = 150; public final int jahresKosten;
/** /**
* Kosten pro Besuch im Flextarif. * Pro Besuch des Studios anfallende Kosten.
*/ */
static public final int kostenEinmaligFlextarif = 5; public final int kostenProBesuch;
/**
* Kosten pro Besuch ohne jeglichen Tarif.
*/
static public final int kostenEimaligOhneTarif = 12;
}
/** /**
* Kosten pro Jahr bei vorheriger Buchung des Flextarifs {@link #TARIFTYP_FLEX}. * Jährliche Gesamtkosten Kosten bei Nutzung des {@link Tarif#GEMISCHT} Tarifs.
* *
* @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als * @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als
* 0 Besuche gewertet. * «0 Besuche» gewertet.
* @return Die Jahresgesamtkosten für alle Besuche im Jahr. * @return Die Gesamtkosten aller Besuche im Jahr.
*/ */
static public int getKostenFlextarif(final int anzahlBesucheProJahr) { static public int getKosten_GEMISCHT_Tarif(final int anzahlBesucheProJahr) {
return -12345; // TODO: Implementiere mich richtig! return Tarif.GEMISCHT.getKosten(anzahlBesucheProJahr);
} }
/** /**
* Kosten pro Jahr ohne Buchung eines Tarifs. * Jährliche Gesamtkosten Kosten ohne Buchung eines Tarifs.
* *
* @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als * @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als
* 0 Besuche gewertet. * 0 Besuche gewertet.
* @return Die Jahresgesamtkosten für alle Besuche im Jahr. * @return Die Gesamtkosten aller Besuche im Jahr.
*/ */
static public int getKostenOhneTarif(final short anzahlBesucheProJahr) { static public int getKostenOhneTarif(final short anzahlBesucheProJahr) {
return -12345; // TODO: Implementiere mich richtig! return Tarif.PRO_BESUCH.getKosten(anzahlBesucheProJahr);
} }
/** /**
* <p>Optimaler Tariftyp basierend auf der Anzahl von Besuchsterminen pro Jahr.</p> * <p>Optimaler Tariftyp basierend auf der Anzahl von Besuchsterminen pro Jahr.</p>
* *
* <p>Beispiel: Ein Nutzer besucht das Studio an 200 Tagen im Jahr. Dies ergibt folgende * <p>Beispiel: Ein Nutzer besucht das Studio an <span style="color:red">200</span> Tagen im Jahr. Dies ergibt folgende
* Gesamtkosten in den drei Tariftypen:</p> * Gesamtkosten in den drei Tariftypen:</p>
* *
* <dl> * <table class="goikTableDefaults">
* <dt>{@link #TARIFTYP_JAHRESVORAUSZAHLUNG}</dt> * <tr>
* <dd><code>{@link #kostenJahrestarif}</code></dd> * <th>Tariftyp</th>
* <th>Jährliche Kosten</th>
* </tr>
* <tr>
* <td>{@link Tarif#JAHRESFLATRATE}</td>
* <td>800.- € für Jahresflatrate</td>
* </tr>
* *
* <dt>{@link #TARIFTYP_FLEX}</dt> * <tr>
* <dd>{@link #basiskostenFlextarif} + 200 * {@link #kostenEinmaligFlextarif}</dd> * <td>{@link Tarif#GEMISCHT} (Jahreskosten 150.- € und 5.- € pro Besuch)</td>
* <td>150.- € + <span style="color:red">200</span> * 5.- €</td>
* </tr>
* *
* <dt>{@link #TARIFTYP_PRO_BESUCH}</dt> * <tr>
* <dd> 200 * {@link #kostenEimaligOhneTarif}</dd> * <td>{@link Tarif#PRO_BESUCH} (12.-€ pro Besuch)</td>
* <td><span style="color:red">200</span> * 12.- €</td>
* </tr>
* *
* </dl> * </table>
* *
* @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. * @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio.
* *
* @return <p>Der günstigste Tariftyp entsprechend der Anzahl an Besuchen. Falls sich für verschiedene Tariftypen * @return <p>Der günstigste Tariftyp bei vorgegebener Anzahl an Besuchen pro Jahr. Bei identischen Kosten
* identische Kosten ergeben, so gilt folgende Prioritätenfolge:</p> * für verschiedene Tariftypen gilt folgende Prioritätenfolge:</p>
* <ol> * <ol>
* <li>{@link #TARIFTYP_PRO_BESUCH}</li> * <li>{@link Tarif#PRO_BESUCH}</li>
* <li>{@link #TARIFTYP_FLEX}</li> * <li>{@link Tarif#GEMISCHT}</li>
* <li>{@link #TARIFTYP_JAHRESVORAUSZAHLUNG}</li> * <li>{@link Tarif#JAHRESFLATRATE}</li>
* </ol> * </ol>
* *
*/ */
static public byte getOptimalenTariftyp(final short anzahlBesucheProJahr) { static public Tarif getOptimalenTariftyp(final short anzahlBesucheProJahr) {
return (byte) -14; // TODO: Implementiere mich richtig!
final int
flatrate = Tarif.JAHRESFLATRATE.getKosten(anzahlBesucheProJahr),
gemischt = Tarif.GEMISCHT.getKosten(anzahlBesucheProJahr),
proBesuch = Tarif.PRO_BESUCH.getKosten(anzahlBesucheProJahr);
if (proBesuch <= gemischt && proBesuch <= flatrate) {
return Tarif.PRO_BESUCH;
} else { // proBesuch ist nicht der günstigste Tarif, dann muss es einer der zwei übrigen Tarife sein:
if (gemischt <= flatrate) {
return Tarif.GEMISCHT;
} else {
return Tarif.JAHRESFLATRATE;
}
}
} }
} }
\ No newline at end of file
...@@ -2,18 +2,20 @@ package de.hdm_stuttgart.mi.sd1.aufgabe1; ...@@ -2,18 +2,20 @@ package de.hdm_stuttgart.mi.sd1.aufgabe1;
/** /**
* <p>Bewertungen für das Würfelspiel »Mäxchen« (Schwäbisch »Mäxle«). Gespielt wird mit zwei * <p>Bewertungen für das Würfelspiel «Mäxchen» (Schwäbisch «Mäxle»). Gespielt wird mit zwei
* Würfeln, jeweils mit Augenzahl 1 bis 6.</p> * Würfeln, jeweils mit Augenzahl 1 bis 6:</p>
* *
* <p>Die Schreibweise (5|2) bedeutet eine Augenzahl 2 für den ersten und eine Augenzahl 5 für den zweiten * <object data="doc-files/maexle.png" type="image/png"></object>
* Würfel. Neben solchen »normalen« Ereignissen gibt es folgende Sonderfälle:</p> *
* <p>Die Schreibweise «(2|5)» bedeutet die Augenzahlen «2» und «5» auf den beiden
* Würfeln, wobei die Reihenfolge irrelevant ist. Neben solchen «normalen» Ereignissen gibt es folgende Sonderfälle:</p>
* *
* <dl> * <dl>
* <dt>(1|1), (2|2),... (6|6), </dt> * <dt>Pasch:</dt>
* <dd>Haben beide Würfel dieselbe Augenzahl, so handelt es sich um einen Pasch.</dd> * <dd>(1|1), (2|2),... (6|6), beide Würfel haben dieselbe Augenzahl.</dd>
* *
* <dt>(2|1) bzw. (1|2)</dt> * <dt>«Mäxchen» bzw. «Mäxle»:</dt>
* <dd>Dieser Sonderfall ist ein »Mäxchen« bzw. schwäbisch ein »Mäxle«.</dd> * <dd>(2|1) bzw. (1|2)</dd>
* *
* </dl> * </dl>
*/ */
......
...@@ -4,6 +4,8 @@ import de.hdm_stuttgart.mi.sd1.aufgabe1.Maexchen; ...@@ -4,6 +4,8 @@ import de.hdm_stuttgart.mi.sd1.aufgabe1.Maexchen;
/** /**
* <p>Darstellung eines Mäxchen Wurfs, z.B. (3|2), siehe auch die Erläuterungen in {@link Maexchen}.</p> * <p>Darstellung eines Mäxchen Wurfs, z.B. (3|2), siehe auch die Erläuterungen in {@link Maexchen}.</p>
*
* <object data="../aufgabe1/doc-files/maexle.png" type="image/png"></object>
*/ */
public class MaexleWurf { public class MaexleWurf {
...@@ -21,7 +23,7 @@ public class MaexleWurf { ...@@ -21,7 +23,7 @@ public class MaexleWurf {
* <p>Vergleiche den aktuellen Wurf mit einem anderen Wurf: Welches Paar von Augenzahlen liegt höher? Nachfolgend * <p>Vergleiche den aktuellen Wurf mit einem anderen Wurf: Welches Paar von Augenzahlen liegt höher? Nachfolgend
* die Werte in aufsteigender Reihenfolge:</p> * die Werte in aufsteigender Reihenfolge:</p>
* *
* <table border="1" style="border-collapse: collapse;" > * <table class="goikTableDefaults">
* <tr> * <tr>
* <th >Typ</th> * <th >Typ</th>
* <th >Würfe aufsteigend</th> * <th >Würfe aufsteigend</th>
......
...@@ -30,17 +30,19 @@ public class Test_FitnessTarifRechner extends ExaminationTestDefaults { ...@@ -30,17 +30,19 @@ public class Test_FitnessTarifRechner extends ExaminationTestDefaults {
} }
/** /**
* Kosten im Flextarif * Kosten im GEMISCHT Tarif
*/ */
@Test public void test_260() { @Test public void test_260() {
Assert.assertEquals(FitnessTarifRechner.basiskostenFlextarif, FitnessTarifRechner.getKostenFlextarif((short) 0)); Assert.assertEquals(FitnessTarifRechner.Tarif.GEMISCHT.jahresKosten,
FitnessTarifRechner.getKosten_GEMISCHT_Tarif((short) 0));
} }
@Test public void test_280() { @Test public void test_280() {
Assert.assertEquals(260, FitnessTarifRechner.getKostenFlextarif((short) 22)); Assert.assertEquals(260, FitnessTarifRechner.getKosten_GEMISCHT_Tarif((short) 22));
Assert.assertEquals(655, FitnessTarifRechner.getKostenFlextarif((short) 101)); Assert.assertEquals(655, FitnessTarifRechner.getKosten_GEMISCHT_Tarif((short) 101));
} }
@Test public void test_300() { @Test public void test_300() {
Assert.assertEquals(FitnessTarifRechner.basiskostenFlextarif, FitnessTarifRechner.getKostenFlextarif((short) -14)); Assert.assertEquals(FitnessTarifRechner.Tarif.GEMISCHT.jahresKosten,
FitnessTarifRechner.getKosten_GEMISCHT_Tarif((short) -14));
} }
// Abschnitt optimale Tarifbestimmung. // Abschnitt optimale Tarifbestimmung.
...@@ -50,25 +52,25 @@ public class Test_FitnessTarifRechner extends ExaminationTestDefaults { ...@@ -50,25 +52,25 @@ public class Test_FitnessTarifRechner extends ExaminationTestDefaults {
*/ */
@Test @Test
public void test_400() { public void test_400() {
Assert.assertEquals(FitnessTarifRechner.TARIFTYP_PRO_BESUCH, FitnessTarifRechner.getOptimalenTariftyp((short) 21)); Assert.assertEquals(FitnessTarifRechner.Tarif.PRO_BESUCH, FitnessTarifRechner.getOptimalenTariftyp((short) 21));
} }
/** /**
* Niedrigste Besuchszahl, bei welcher sich der Flextarif lohnt. * Niedrigste Besuchszahl, bei welcher sich der GEMISCHT lohnt.
*/ */
@Test @Test
public void test_420() { public void test_420() {
Assert.assertEquals(FitnessTarifRechner.TARIFTYP_FLEX, FitnessTarifRechner.getOptimalenTariftyp((short) 22)); Assert.assertEquals(FitnessTarifRechner.Tarif.GEMISCHT, FitnessTarifRechner.getOptimalenTariftyp((short) 22));
} }
/** /**
* Grenztest: 800€ sowohl für Flex- als auch Ganzjahrestarif. * Grenztest: 800€ sowohl für GEMISCHT- als auch Ganzjahrestarif.
*/ */
@Test public void test_480() { @Test public void test_480() {
Assert.assertEquals(FitnessTarifRechner.TARIFTYP_FLEX, FitnessTarifRechner.getOptimalenTariftyp((short) 130)); Assert.assertEquals(FitnessTarifRechner.Tarif.GEMISCHT, FitnessTarifRechner.getOptimalenTariftyp((short) 130));
} }
/** /**
* Grenztest: 800€ sowohl für Flex- als auch Ganzjahrestarif. * Grenztest: Erstmalig ist Flatrate am günstigsten.
*/ */
@Test public void test_500() { @Test public void test_500() {
Assert.assertEquals(FitnessTarifRechner.TARIFTYP_JAHRESVORAUSZAHLUNG, FitnessTarifRechner.getOptimalenTariftyp((short) 131)); Assert.assertEquals(FitnessTarifRechner.Tarif.JAHRESFLATRATE, FitnessTarifRechner.getOptimalenTariftyp((short) 131));
} }
} }
\ No newline at end of file
...@@ -4,122 +4,143 @@ package de.hdm_stuttgart.mi.sd1.aufgabe1; ...@@ -4,122 +4,143 @@ package de.hdm_stuttgart.mi.sd1.aufgabe1;
* <p>Ein Fitnesstudio bietet folgende Tarife:</p> * <p>Ein Fitnesstudio bietet folgende Tarife:</p>
* *
* <ul> * <ul>
* <li>Jährliche Einmalzahlung, siehe {@link #TARIFTYP_JAHRESVORAUSZAHLUNG}.</li> * <li>Jährliche Einmalzahlung, keine Kosten pro Besuch, siehe {@link Tarif#JAHRESFLATRATE}.</li>
* <li>Flextarif, siehe {@link #TARIFTYP_FLEX}.</li> * <li>Jährliche Vorauszahlung und Kosten pro Besuch, siehe {@link Tarif#GEMISCHT}.</li>
* <li>Einmalbesuch ohne gebuchten Tarif, siehe {@link #TARIFTYP_PRO_BESUCH}.</li> * <li>Nur Kosten pro Besuch, keine jährlichen Kosten, siehe {@link Tarif#PRO_BESUCH}.</li>
* </ul> * </ul>
* *
* Der Rechner bietet Methoden zur Ermittlung sowohl von Kosten als auch des günstigsten Tarifs auf Basis * <p>Der Rechner ermittelt sowohl die Kosten als auch die günstigste Tarifart auf Basis der Anzahl von
* der Anzahl von Besuchen pro Jahr. * Besuchen pro Jahr.</p>
*/ */
public class FitnessTarifRechner { abstract public class FitnessTarifRechner {
/** /**
* <p>Für einen Jahresbeitrag von {@link #kostenJahrestarif} € kann man das Studio beliebig oft besuchen.</p> * Tarifarten zur Nutzung des Studios. Für jede Tarifart sind die Jahreskosten {@link #jahresKosten} und die
* Kosten pro Besuch {@link #kostenProBesuch} verfügbar.
*/ */
static public final byte TARIFTYP_JAHRESVORAUSZAHLUNG = 1; public enum Tarif {
/**
* Keine Jahresbeitrag, nur {@link #kostenProBesuch}
*/
PRO_BESUCH(0, 12),
/** /**
* <p>Pro Besuch des Studios werden {@link #kostenEinmaligFlextarif} € fällig. Zusätzlich fällt eine * Jahresbeitrag {@link #jahresKosten} und {@link #kostenProBesuch}.
* einmalige Jahresgebühr von {@link #basiskostenFlextarif} € an.</p> */
*/ GEMISCHT(150, 5),
static public final byte TARIFTYP_FLEX = 2;
/** /**
* <p>Ein einmaliger Besuch ohne vorab gebuchten Tarif kostet {@link #kostenEimaligOhneTarif} €.</p> * Keine Kosten pro Besuch, Jahresbeitrag {@link #jahresKosten}.
*/ */
static public final byte TARIFTYP_PRO_BESUCH = 3; JAHRESFLATRATE(800, 0);
/** Tarif(final int jahresKosten, final int kostenProBesuch) {
* Kosten eines Ganzjahrestickets. this.jahresKosten = jahresKosten;
*/ this.kostenProBesuch = kostenProBesuch;
static public final int kostenJahrestarif = 800; }
/** /**
* Jährliche Grundkosten Flextarif. * Gesamtkosten auf Basis einer jährlichen Vorauszahlung und Kosten pro Besuch.
*/ *
static public final int basiskostenFlextarif = 150; * @param anzahlBesuche Negative Werte werden als «0 Besuche» gewertet.
* @return Die jährlichen Gesamtkosten.
*/
public int getKosten(final int anzahlBesuche) {
if (anzahlBesuche <= 0) {
return jahresKosten;
} else {
return jahresKosten + anzahlBesuche * kostenProBesuch;
}
}
/** /**
* Kosten pro Besuch im Flextarif. * Jährlich anfallende Kosten in der jeweiligen Tarifart.
*/ */
static public final int kostenEinmaligFlextarif = 5; public final int jahresKosten;
/** /**
* Kosten pro Besuch ohne jeglichen Tarif. * Pro Besuch des Studios anfallende Kosten.
*/ */
static public final int kostenEimaligOhneTarif = 12; public final int kostenProBesuch;
}
/** /**
* Kosten pro Jahr bei vorheriger Buchung des Flextarifs {@link #TARIFTYP_FLEX}. * Jährliche Gesamtkosten Kosten bei Nutzung des {@link Tarif#GEMISCHT} Tarifs.
* *
* @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als * @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als
* 0 Besuche gewertet. * «0 Besuche» gewertet.
* @return Die Jahresgesamtkosten für alle Besuche im Jahr. * @return Die Gesamtkosten aller Besuche im Jahr.
*/ */
static public int getKostenFlextarif(final int anzahlBesucheProJahr) { static public int getKosten_GEMISCHT_Tarif(final int anzahlBesucheProJahr) {
if (anzahlBesucheProJahr < 0) { return Tarif.GEMISCHT.getKosten(anzahlBesucheProJahr);
return basiskostenFlextarif;
} else {
return basiskostenFlextarif + anzahlBesucheProJahr * kostenEinmaligFlextarif;
}
} }
/** /**
* Kosten pro Jahr ohne Buchung eines Tarifs. * Jährliche Gesamtkosten Kosten ohne Buchung eines Tarifs.
* *
* @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als * @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. Negative Werte werden als
* 0 Besuche gewertet. * 0 Besuche gewertet.
* @return Die Jahresgesamtkosten für alle Besuche im Jahr. * @return Die Gesamtkosten aller Besuche im Jahr.
*/ */
static public int getKostenOhneTarif(final short anzahlBesucheProJahr) { static public int getKostenOhneTarif(final short anzahlBesucheProJahr) {
if (anzahlBesucheProJahr < 0) { return Tarif.PRO_BESUCH.getKosten(anzahlBesucheProJahr);
return 0;
} else {
return kostenEimaligOhneTarif * anzahlBesucheProJahr;
}
} }
/** /**
* <p>Optimaler Tariftyp basierend auf der Anzahl von Besuchsterminen pro Jahr.</p> * <p>Optimaler Tariftyp basierend auf der Anzahl von Besuchsterminen pro Jahr.</p>
* *
* <p>Beispiel: Ein Nutzer besucht das Studio an 200 Tagen im Jahr. Dies ergibt folgende * <p>Beispiel: Ein Nutzer besucht das Studio an <span style="color:red">200</span> Tagen im Jahr. Dies ergibt folgende
* Gesamtkosten in den drei Tariftypen:</p> * Gesamtkosten in den drei Tariftypen:</p>
* *
* <dl> * <table class="goikTableDefaults">
* <dt>{@link #TARIFTYP_JAHRESVORAUSZAHLUNG}</dt> * <tr>
* <dd><code>{@link #kostenJahrestarif}</code></dd> * <th>Tariftyp</th>
* <th>Jährliche Kosten</th>
* </tr>
* <tr>
* <td>{@link Tarif#JAHRESFLATRATE}</td>
* <td>800.- € für Jahresflatrate</td>
* </tr>
* *
* <dt>{@link #TARIFTYP_FLEX}</dt> * <tr>
* <dd>{@link #basiskostenFlextarif} + 200 * {@link #kostenEinmaligFlextarif}</dd> * <td>{@link Tarif#GEMISCHT} (Jahreskosten 150.- € und 5.- € pro Besuch)</td>
* <td>150.- € + <span style="color:red">200</span> * 5.- €</td>
* </tr>
* *
* <dt>{@link #TARIFTYP_PRO_BESUCH}</dt> * <tr>
* <dd> 200 * {@link #kostenEimaligOhneTarif}</dd> * <td>{@link Tarif#PRO_BESUCH} (12.-€ pro Besuch)</td>
* <td><span style="color:red">200</span> * 12.- €</td>
* </tr>
* *
* </dl> * </table>
* *
* @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio. * @param anzahlBesucheProJahr Anzahl der jährlichen Besuche im Studio.
* *
* @return <p>Der günstigste Tariftyp entsprechend der Anzahl an Besuchen. Falls sich für verschiedene Tariftypen * @return <p>Der günstigste Tariftyp bei vorgegebener Anzahl an Besuchen pro Jahr. Bei identischen Kosten
* identische Kosten ergeben, so gilt folgende Prioritätenfolge:</p> * für verschiedene Tariftypen gilt folgende Prioritätenfolge:</p>
* <ol> * <ol>
* <li>{@link #TARIFTYP_PRO_BESUCH}</li> * <li>{@link Tarif#PRO_BESUCH}</li>
* <li>{@link #TARIFTYP_FLEX}</li> * <li>{@link Tarif#GEMISCHT}</li>
* <li>{@link #TARIFTYP_JAHRESVORAUSZAHLUNG}</li> * <li>{@link Tarif#JAHRESFLATRATE}</li>
* </ol> * </ol>
* *
*/ */
static public byte getOptimalenTariftyp(final short anzahlBesucheProJahr) { static public Tarif getOptimalenTariftyp(final short anzahlBesucheProJahr) {
final int
flatrate = Tarif.JAHRESFLATRATE.getKosten(anzahlBesucheProJahr),
gemischt = Tarif.GEMISCHT.getKosten(anzahlBesucheProJahr),
proBesuch = Tarif.PRO_BESUCH.getKosten(anzahlBesucheProJahr);
final int flextarifGesamtkosten = getKostenFlextarif(anzahlBesucheProJahr); if (proBesuch <= gemischt && proBesuch <= flatrate) {
if (getKostenOhneTarif(anzahlBesucheProJahr) <= flextarifGesamtkosten) { return Tarif.PRO_BESUCH;
return TARIFTYP_PRO_BESUCH; } else { // proBesuch ist nicht der günstigste Tarif, dann muss es einer der zwei übrigen Tarife sein:
} else { if (gemischt <= flatrate) {
if (flextarifGesamtkosten <= kostenJahrestarif) { return Tarif.GEMISCHT;
return TARIFTYP_FLEX;
} else { } else {
return TARIFTYP_JAHRESVORAUSZAHLUNG; return Tarif.JAHRESFLATRATE;
} }
} }
} }
......
package de.hdm_stuttgart.mi.sd1.aufgabe1; package de.hdm_stuttgart.mi.sd1.aufgabe1;
/** /**
* <p>Bewertungen für das Würfelspiel »Mäxchen« (Schwäbisch »Mäxle«). Gespielt wird mit zwei * <p>Bewertungen für das Würfelspiel «Mäxchen» (Schwäbisch «Mäxle»). Gespielt wird mit zwei
* Würfeln, jeweils mit Augenzahl 1 bis 6.</p> * Würfeln, jeweils mit Augenzahl 1 bis 6:</p>
* *
* <p>Die Schreibweise (5|2) bedeutet die Augenzahlen 5 und 2 auf den beiden * <object data="doc-files/maexle.png" type="image/png"></object>
* Würfeln. Neben solchen »normalen« Ereignissen gibt es folgende Sonderfälle:</p> *
* <p>Die Schreibweise «(2|5)» bedeutet die Augenzahlen «2» und «5» auf den beiden
* Würfeln, wobei die Reihenfolge irrelevant ist. Neben solchen «normalen» Ereignissen gibt es folgende Sonderfälle:</p>
* *
* <dl> * <dl>
* <dt>Pasch:</dt> * <dt>Pasch:</dt>
* <dd>(1|1), (2|2),... (6|6), beide Würfel haben dieselbe Augenzahl.</dd> * <dd>(1|1), (2|2),... (6|6), beide Würfel haben dieselbe Augenzahl.</dd>
* *
* <dt>»Mäxchen« bzw. schwäbisch »Mäxle«:</dt> * <dt>«Mäxchen» bzw. «Mäxle»:</dt>
* <dd>(2|1) bzw. (1|2)</dd> * <dd>(2|1) bzw. (1|2)</dd>