java\03_UML\ (Start mit java Aufgabe_UML_07_k.java)
| Diagramm | Strukturdiagramm | Verhaltensdiagramm |
|---|---|---|
| Klassendiagramm | X | |
| Aktivitätsdiagramm | X | |
| Objektdiagramm | X | |
| Zustandsdiagramm | X | |
| Sequenzdiagramm | X | |
| Komponentendiagramm | X | |
| Anwendungsfalldiagramm | X | |
| Verteilungsdiagramm | X |
| Nr. | Sachverhalt | Diagramm |
|---|---|---|
| 1 | Funktionen der App für Leser und Personal | Use-Case-Diagramm (Anwendungsfalldiagramm) |
| 2 | Zustände eines Leserkontos | Zustandsdiagramm |
| 3 | Ablauf der Fernleihe über mehrere Stellen | Aktivitätsdiagramm (mit Partitionen) |
| 4 | Reihenfolge der Methodenaufrufe App – KatalogService – Datenbank | Sequenzdiagramm |
| 5 | Klassen mit Attributen, Methoden, Beziehungen | Klassendiagramm |
| 6 | Software auf Server, Terminal, Smartphone | Verteilungsdiagramm |
Erklärung: Häufigster Fehler: Das Anwendungsfalldiagramm wird für ein Strukturdiagramm gehalten, weil es keine Reihenfolge zeigt. Es beschreibt aber, was das System für seine Akteure tut, und gehört deshalb zu den Verhaltensdiagrammen.
Nach dem Verbuchen sollen zwei Schritte unabhängig voneinander (parallel) ausgeführt werden: Die Diebstahlsicherung des Mediums wird deaktiviert und das Rückgabedatum wird angezeigt. Erst wenn beides erledigt ist, fragt das Terminal, ob weitere Medien ausgeliehen werden sollen. Bei „ja“ legt der Leser das nächste Medium auf und der Ablauf wiederholt sich ab dort; bei „nein“ wird eine Quittung gedruckt und der Vorgang endet.
| Nr. | Fehler | Auswirkung | Korrektur |
|---|---|---|---|
| 1 | Die Guards an der ersten Entscheidung [offene Gebühren > 10 €] und [< 10 €] decken den Fall „genau 10,00 €“ nicht ab. | Bei genau 10,00 € trifft keine Bedingung zu; der Ablauf ist nicht definiert (bleibt stehen). Laut Anlage 1 ist das Konto in diesem Fall gesperrt. | [offene Gebühren >= 10 €] und [offene Gebühren < 10 €] |
| 2 | Die Rückführung [ja] mündet direkt in die Aktion „Medium auflegen“, die damit zwei eingehende Kanten hat. | Mehrere eingehende Kanten einer Aktion wirken wie eine Synchronisation (UND): „Medium auflegen“ würde auf beide Kanten warten – der Ablauf verklemmt sich schon beim ersten Medium. | Eine Zusammenführung (Raute) vor „Medium auflegen“ einfügen, in die beide Kanten münden. |
| 3 | Nach „RFID-Etikett lesen“ steht eine Teilung (Balken) mit Guards statt einer Entscheidung. | Bei einer Teilung werden alle Zweige ausgeführt: Die Ausleihe würde gleichzeitig abgelehnt und verbucht. Guards sind an einer Teilung nicht zulässig. | Entscheidung (Raute) mit [für andere Person vorgemerkt] / [nicht vorgemerkt]. |
| 4 | Die parallelen Zweige (Diebstahlsicherung, Rückgabedatum) werden mit einer Zusammenführung (Raute) statt einer Synchronisation zusammengeführt. | Es wird nicht auf beide Zweige gewartet; beide Zweige laufen einzeln weiter. Die Frage „weitere Medien?“ und alles danach würde doppelt ausgeführt (z. B. zwei Quittungen). | Synchronisationsbalken (Join) statt der Raute. |
Erklärung: Mit dem Marken-Modell (Erklärungssatz UML-02) lassen sich alle vier Fehler begründen: Raute = ein Weg (ODER), Balken = alle Wege (UND). Eine Aktion mit zwei Eingängen wartet auf beide – deshalb laufen Schleifen immer über eine Zusammenführung.
| Aspekt | Diagramm | Begründung |
|---|---|---|
| A1 | Sequenzdiagramm | zeigt den Nachrichtenaustausch (Methodenaufrufe und Antworten) zwischen mehreren Objekten bzw. Systemen in zeitlicher Reihenfolge. |
| A2 | Zustandsdiagramm | beschreibt ein einzelnes Objekt (ein Fach), seine möglichen Zustände und die Ereignisse (Sensormeldungen, Codeeingabe, Fristablauf), die Zustandswechsel auslösen. |
| A3 | Use-Case-Diagramm | Übersicht über Akteure (Leser, Personal, Techniker, Server) und die Funktionen, die sie nutzen – aus Außensicht, ohne Ablauf. |
| A4 | Aktivitätsdiagramm mit Partitionen | stellt einen Ablauf mit Verzweigungen über mehrere Beteiligte dar; die Partitionen zeigen die Zuständigkeiten. |
abholfristAbgelaufen modelliert, weil sie durch die Verlängerung verschoben werden kann. Die Verlängerung ist eine interne Transition im Zustand „Belegt“: Das Fach bleibt belegt, die entry-Aktion (neuer Abholcode) wird nicht erneut ausgeführt.türGeschlossen hier eine andere Wirkung hat als im Zustand „Reserviert“.after(3 Tage) statt abholfristAbgelaufen (mit Hinweis auf die Verlängerung), eine interne Transition codeEingegeben [Code ungültig] / Hinweis anzeigen in „Belegt“ sowie andere sinnvolle Ereignisnamen.switch) programmiert werden.| Nr. | Bezeichnung | Nr. | Bezeichnung |
|---|---|---|---|
| ① | Startknoten | ⑤ | Zusammenführung |
| ② | Partition (Schwimmbahn, Swimlane) | ⑥ | Teilung (Gabelung, Fork) |
| ③ | Entscheidung (Verzweigung) | ⑦ | Synchronisation (Vereinigung, Join) |
| ④ | Bedingung (Guard, Wächterbedingung) | ⑧ | Endknoten (Aktivitätsende) |
Erst wenn beide parallelen Aktionen „Ausweis drucken“ und „Zugangsdaten für die App senden“ abgeschlossen sind. Die Synchronisation ⑦ wartet, bis an allen eingehenden Kanten der Ablauf angekommen ist (UND-Verknüpfung), und setzt den Ablauf dann einmal fort.
Erklärung: Signalwörter: „gleichzeitig“ → Teilung, „sind beide Schritte abgeschlossen“ → Synchronisation, „in beiden Fällen“ → Zusammenführung der beiden Wege, „wiederholt sich ab dem Einlegen“ → Rückführung in eine Zusammenführung vor „Medium einlegen“, „sofern gewünscht“ → Entscheidung mit einem Weg ohne Aktion.
[gesperrt]/[nicht gesperrt], Ablehnung, Ende – 3 P[weitere Partnerbibliothek] → nächste auswählen → Zusammenführung vor „Bestellung absenden“ – 3 P[keine weitere]: stornieren (Fernleihstelle), Gebühr erstatten und Leser benachrichtigen (BiblioNet), Ende – 2 PErklärung: Die Schleife ist der schwierigste Teil: Der Text sagt „wähle die nächste Partnerbibliothek aus und sende die Bestellung dorthin“ – deshalb führt der Rückweg vor „Bestellung absenden“ und nicht vor die Teilung (die Gebühr wird nur einmal gebucht). Die Entscheidung „weitere Partnerbibliothek vorhanden?“ trifft die Fernleihstelle und steht deshalb in deren Bahn.
0..*). Jede Ausleihe gehört zu genau einem Leser (1).1..*). Jedes Exemplar gehört zu genau einem Medium (1); als Komposition werden die Exemplare mit ihrem Medium gelöscht.0..4 an der Rolle mitleser). Ein Leser hat höchstens ein Hauptkonto (0..1 an der Rolle hauptkonto) – er ist also entweder eigenständig oder Mitleser genau eines Familienkontos.# = protected: Auf titel dürfen die Klasse Medium und ihre Unterklassen (Buch, Film) zugreifen (in Java zusätzlich Klassen im selben Paket), andere Klassen nicht.getLeihfrist() hat in Medium keine Implementierung und muss in Buch und Film überschrieben werden.Foerdermodul ist abstrakt (Name kursiv bzw. {abstract}), ebenso die Methode starten(). Wartbar ist ein Interface.anzahlAnlagen und getAnzahlAnlagen() sind static → unterstrichen (oder {static}). leeren() hat keinen Modifizierer → Sichtbarkeit package ~.band und kisten werden als Beziehungen dargestellt (Rollennamen am Linienende), nicht zusätzlich als Attribute. barcodes ist eine Liste von Strings und bleibt ein Attribut.6; 1..* oder * wird ebenfalls akzeptiert.band und kisten als Attribute statt als Beziehung eingetragen, gibt es für die Beziehung höchstens die Hälfte der Punkte.new Kiste(i, 40)) und gibt keine Referenzen nach außen. Die Kisten existieren nur als Teil dieser Anlage und werden mit ihr gelöscht.berechneAuslastung() : double), Referent, Leser, Anmeldung je 1 P (8 P). Beziehungen mit Multiplizitäten: Standort ◆ Raum, Veranstaltung ◆ Termin, Termin – Raum, Veranstaltung ◇ Referent, Vererbung Lesung/Workshop, Leser – Anmeldung, Termin – Anmeldung je 1 P, Kennzeichnung {abstract} 1 P (8 P).
Gleichwertig: Anmeldung als Assoziationsklasse zwischen Leser und Termin; Termin ◆ Anmeldung als Komposition; Termin – Raum ungerichtet; status als Aufzählungstyp («enumeration» Anmeldestatus); Datentypen wie LocalDate, LocalTime, Integer, Boolean.Am Assoziationsende bei Anmeldung (Beziehung Termin – Anmeldung) steht die Eigenschaft {ordered}: Die Anmeldungen eines Termins bilden eine geordnete Liste (Reihenfolge des Eingangs), z. B. umgesetzt als List<Anmeldung>.
{ordered} 1 P, richtige Stelle/Bedeutung 1 P.0..* am Ganzen) und bleiben beim Löschen einer Veranstaltung erhalten.Der Saldo steigt auf 10,50 €. Das Ereignis gebuehrGebucht trifft auf die Transition mit [saldo >= 10] → Folgezustand Gesperrt. Reihenfolge: (Aktiv hat keine exit-Aktion) → Aktion an der Transition „Sperrhinweis senden“ → entry-Aktion von Gesperrt „Ausleihe sperren“.
gebuehrGebucht – Ereignis (Auslöser): löst die Transition aus.[saldo >= 10] – Bedingung (Guard): muss beim Eintreten des Ereignisses erfüllt sein, sonst schaltet diese Transition nicht (dann greift die Selbsttransition mit [saldo < 10])./ Sperrhinweis senden – Aktion (Effekt): wird beim Schalten der Transition ausgeführt.entry wird bei jedem Betreten des Zustands Gesperrt ausgeführt (Ausleihe sperren), exit bei jedem Verlassen (Ausleihe freigeben) – unabhängig davon, über welche Transition der Zustand betreten oder verlassen wird.
after(7 Tage)-Transitionen 2 P; Vermisst mit beiden Ausgängen 1,5 P. Ein eigener Zustand „Ausgesondert“ vor dem Endzustand wird ebenfalls akzeptiert.[Selbsttest fehlerhaft] – 1 PmediumErkannt – 1 PetikettGelesen [eigenes Medium] – 1 PetikettGelesen [fremdes Medium] und after(5 s) – 2 PmediumEntnommen – 1 PbuchungBestätigt und after(10 s) / Rückgabe lokal speichern – 2 P[Kiste nicht voll] und → Kiste voll [Kiste voll] / Personal informieren (Ereignis mediumAbgelegt) – 2 PkisteGetauscht – 1 PstörungQuittiert – 1 Pausschalten – 1 PetikettGelesen modelliert, erhält die Punkte ebenfalls.
„Bereit“ wird über viele Transitionen betreten (nach dem Selbsttest, nach dem Auswurf, nach dem Transport, nach dem Kistentausch). Mit entry wird die Klappe bei jedem Betreten entriegelt, ohne die Aktion an jede eingehende Transition schreiben zu müssen. Das Diagramm bleibt übersichtlich, und bei neuen Transitionen nach „Bereit“ kann die Aktion nicht vergessen werden.
Die fünf Zustände werden zu einem zusammengesetzten Zustand „Betrieb“ zusammengefasst; sein innerer Startzustand führt zu „Bereit“. Eine einzige Transition notAus geht vom Rand des zusammengesetzten Zustands nach „Störung“ und gilt damit für jeden Unterzustand. Vorteil: eine Transition statt fünf, übersichtlicher und weniger fehleranfällig; ein später ergänzter Unterzustand erhält das Not-Aus automatisch. Der Pfeil kisteGetauscht endet am Rand von „Betrieb“: Der Automat beginnt dann wieder beim inneren Startzustand, also in „Bereit“.
notAus vom Rand nach Störung 1 P, Vorteil 1 P. „Kiste voll“ darf auch innerhalb liegen, wenn begründet.«include»: Der Basis-Anwendungsfall bindet einen anderen Anwendungsfall immer ein (Pflichtbestandteil, oft von mehreren Fällen gemeinsam genutzt). Pfeil vom Basisfall zum eingebundenen Fall.
«extend»: Ein erweiternder Anwendungsfall wird nur optional, unter einer Bedingung und an einem Erweiterungspunkt, in den Basisfall eingefügt; der Basisfall ist auch ohne ihn vollständig. Pfeil vom erweiternden Fall zum Basisfall.
| Nr. | Beziehung | Umsetzung |
|---|---|---|
| 1 | include | „Zu Veranstaltung anmelden“ → «include» → „Freie Plätze prüfen“ |
| 2 | extend | „Auf Warteliste setzen“ → «extend» → „Zu Veranstaltung anmelden“, Condition {Termin ausgebucht} |
| 3 | Generalisierung von Akteuren | Lesepate —▷ Leser (Dreieck am Leser) |
| 4 | Generalisierung von Anwendungsfällen | „Veranstaltung per QR-Code finden“ —▷ „Veranstaltung suchen“ |
Das Rechteck um die Anwendungsfälle grenzt das betrachtete System (seinen Funktionsumfang) von der Umgebung ab: Was innerhalb liegt, leistet das System; die Akteure stehen außerhalb und nutzen es.
| Nr. | Fehler | Korrektur |
|---|---|---|
| 1 | Der «include»-Pfeil zeigt von „Abholcode eingeben“ zu „Medien abholen“. | Richtung umkehren: vom Basisfall „Medien abholen“ zum eingebundenen Fall „Abholcode eingeben“. |
| 2 | Der «extend»-Pfeil zeigt von „Medien abholen“ zu „Abholbeleg drucken“. | Richtung umkehren: von „Abholbeleg drucken“ (Erweiterung) zu „Medien abholen“; Bedingung als Notiz (Condition: {Leser wünscht Beleg}). |
| 3 | „„OK“-Taste drücken“ ist ein Bedienschritt der Oberfläche, kein Anwendungsfall mit eigenem Nutzen. | Entfernen (gehört in die Beschreibung von „Abholcode eingeben“). |
| 4 | Einfache Linie (Assoziation) zwischen den Anwendungsfällen „Fach befüllen“ und „Fach öffnen“ – Assoziationen gibt es nur zwischen Akteur und Anwendungsfall. | Durch «include» von „Fach befüllen“ zu „Fach öffnen“ ersetzen (oder entfernen). |
| 5 | Der Akteur „BiblioNet-Server“ steht innerhalb der Systemgrenze. | Als externes System außerhalb der Systemgrenze anordnen. |
| 6 | Linie zwischen den Akteuren Leser und Thekenpersonal. | Entfernen – Akteure werden im Use-Case-Diagramm nicht miteinander verbunden (nur Generalisierung wäre zulässig). |
| Feld | Inhalt |
|---|---|
| Name | Medien abholen |
| Akteur(e) | Leser (primär), BiblioNet-Server (sekundär) |
| Vorbedingung | Das Fach ist belegt, der Leser hat den Abholcode erhalten, die Abholfrist ist nicht abgelaufen. |
| Standardablauf | 1. Leser gibt am Bedienterminal den Abholcode ein. 2. Terminal lässt den Code vom BiblioNet-Server prüfen. 3. Code ist gültig: Die Fachsteuerung entriegelt die Tür, die Medien werden auf das Leserkonto verbucht. 4. Leser entnimmt die Medien und schließt die Tür. 5. (optional, extend) Terminal druckt einen Abholbeleg. |
| Alternative / Ausnahme | 3a. Code ungültig: Terminal zeigt einen Hinweis, weiter mit Schritt 1. |
| Nachbedingung | Die Medien sind auf das Leserkonto verbucht, das Fach ist wieder frei. |
verlaengern(exemplarNr) ist eine synchrone Nachricht (gefüllte Pfeilspitze): Die App wartet, bis der KontoService die Verlängerung bearbeitet hat und das neue Datum bzw. „abgelehnt“ zurückgibt. sendeBestaetigung(leserNr) ist asynchron (offene Spitze): Der KontoService beauftragt den PushDienst und arbeitet sofort weiter, ohne auf eine Antwort zu warten.
Von den beiden Bereichen wird genau einer ausgeführt: Ist das Konto nicht gesperrt, wird die Fälligkeit aktualisiert, eine Bestätigung gesendet und das neue Datum zurückgegeben; andernfalls ([else]) wird „abgelehnt“ zurückgegeben.
Die Rechtecke sind Aktivierungsbalken (das Objekt führt gerade eine Methode aus); die gestrichelten Pfeile sind Antworten (Rückgabewerte) auf synchrone Nachrichten.
(1) opt, (2) loop.
leser:Leser ist das Objekt, das ladeLeser() zurückgibt; istGesperrt() wird an dieses Objekt geschickt.if/else → alt; zeigeHinweis() ist eine eigene Methode → Selbstaufruf.new Quittung(leserNr) → create-Pfeil auf den Kopf der Lebenslinie q:Quittung, die erst dort beginnt.for (String code : barcodes) → loop mit zwei Nachrichten pro Durchlauf.ladeLeser und istGesperrt mit Antworten 2 P; alt mit Bedingungen und Selbstaufruf 2 P; create der Quittung 1 P; loop mit verbuche (Antwort faellig) und hinzufuegen 2,5 P; drucke(q) 1 P.opt [treffer = null] mit Datenbankabfrage, Antwort und asynchronem speichere 4 P; opt [treffer ist leer] mit Verbundkatalog und Antwort 2 P; Antwort Trefferliste an die App 1 P; loop(1,10) mit Verfügbarkeitsabfrage, Datenbankabfrage und beiden Antworten 4 P; Selbstaufruf anzeigen 1 P. Die Antwort an den Leser am Ende ist optional.Der KatalogService braucht vom Cache keine Antwort, um weiterzuarbeiten – laut Anlage 10 wartet er nicht auf eine Bestätigung. Das Speichern im Cache soll die Antwortzeit für den Leser nicht verlängern; deshalb wird die Nachricht asynchron (offene Pfeilspitze, keine Antwort) modelliert.
opt hat einen Bereich mit einer Bedingung, der nur ausgeführt wird, wenn sie zutrifft – sonst passiert nichts. alt hat mehrere Bereiche mit Bedingungen, von denen genau einer ausgeführt wird. Für die Schritte 4/5 wurde opt [treffer = null] verwendet, weil bei einem Cache-Treffer keine Nachrichten anfallen. Ein alt mit leerem Bereich [treffer vorhanden] und [else] ist gleichwertig.
| Aufruf | Rückgabewert | Rechnung |
|---|---|---|
| gebuehrGesamt([4, 15, 0, 9], falsch) | 11,50 | 2,00 + 5,00 (7,50 gedeckelt) + 0,00 + 4,50 |
| gebuehrGesamt([12], wahr) | 0,00 | Kind – Schleife wird nicht ausgeführt |
| gebuehrGesamt([10, 11], falsch) | 10,00 | 5,00 (genau 5,00, nicht > 5,00) + 5,00 (5,50 gedeckelt) |
| gebuehrGesamt([], falsch) | 0,00 | leeres Array – kein Schleifendurchlauf |
Sequenz (Folge von Anweisungen), Verzweigung (zweiseitig bzw. einseitig mit leerem Zweig ∅), Zählschleife.
Fallauswahl (Mehrfachverzweigung) über den Medientyp.
Java · Aufgabe_UML_07_1.java (Auszug)
static double gebuehrGesamt(int[] tage, boolean istKind) {
double summe = 0.00;
if (istKind) {
// leerer Zweig
} else {
for (int i = 0; i <= tage.length - 1; i++) {
double g = tage[i] * 0.50;
if (g > 5.00) {
g = 5.00;
}
summe = summe + g;
}
}
return summe;
}
Ausgabe
gebuehrGesamt([4, 15, 0, 9], falsch) -> 11,50 (erwartet 11,50) OK gebuehrGesamt([12], wahr) -> 0,00 (erwartet 0,00) OK gebuehrGesamt([10, 11], falsch) -> 10,00 (erwartet 10,00) OK gebuehrGesamt([], falsch) -> 0,00 (erwartet 0,00) OK
Datei: java\03_UML\Aufgabe_UML_07_1.java
tag 1 P; kopfgesteuerte Schleife mit Bedingung und Rumpf 1,5 P; Rückgabe 0,5 P.Ist der berechnete Tag bereits ein Öffnungstag, darf er nicht verändert werden – der Schleifenrumpf darf also gar nicht ausgeführt werden. Eine kopfgesteuerte Schleife prüft die Bedingung vor dem ersten Durchlauf. Eine fußgesteuerte Schleife führt den Rumpf mindestens einmal aus; die Fälligkeit läge dann immer mindestens einen Tag zu spät (Beispiel: Buch, ausgeliehen an Tag 100 → richtig 128, fußgesteuert 129).
Java · Aufgabe_UML_07_2.java (Auszug)
static int faelligkeit(String medientyp, int ausleihTag, boolean[] geschlossen) {
int frist;
switch (medientyp) { // Fallauswahl
case "Buch", "Hörbuch" -> frist = 28;
case "Film", "Spiel" -> frist = 14;
case "Zeitschrift" -> frist = 7;
default -> frist = 21;
}
int tag = ausleihTag + frist;
while (geschlossen[tag]) { // kopfgesteuert
tag = tag + 1;
}
return tag;
}
Ausgabe (Testdaten: Tage 114, 115 und 121 geschlossen)
Film, ausgeliehen an Tag 100 -> 116 (erwartet 116) Buch, ausgeliehen an Tag 100 -> 128 (erwartet 128) Zeitschrift, ausgeliehen an Tag 114 -> 122 (erwartet 122) Noten, ausgeliehen an Tag 100 -> 122 (erwartet 122) fußgesteuert, Buch an Tag 100 -> 129 (falsch: 129 statt 128, ein Tag zu spät)
Datei: java\03_UML\Aufgabe_UML_07_2.java
| i | gewicht | ziffer(nr, i) | summe |
|---|---|---|---|
| 0 | 3 | 4 | 12 |
| 1 | 1 | 0 | 0 |
| 2 | 3 | 5 | 15 |
| 3 | 1 | 1 | 1 |
| 4 | 3 | 7 | 21 |
| 5 | 1 | 2 | 2 |
| 6 | 3 | 8 | 24 |
| 7 | 1 | 7 | 7 |
| pz = (10 − 7 mod 10) mod 10 = 3 | ziffer(nr, 7) = 7 → Rückgabe: falsch | ||
Richtig wäre: 4·1 + 0·3 + 5·1 + 1·3 + 7·1 + 2·3 + 8·1 = 33 → pz = (10 − 3) mod 10 = 7 = letzte Ziffer → wahr.
| Nr. | Fehler | Korrektur |
|---|---|---|
| 1 | Die Zählschleife läuft bis 7 – die Prüfziffer selbst wird mitgezählt. | zähle i von 0 bis 6 |
| 2 | summe := 0 steht im Schleifenrumpf – die Summe wird in jedem Durchlauf zurückgesetzt. | summe := 0 vor die Schleife setzen. |
| 3 | Die Gewichte sind vertauscht: Bei i mod 2 = 0 (1., 3., 5., 7. Ziffer) wird mit 3 statt mit 1 gewichtet. | ja-Zweig gewicht := 1, nein-Zweig gewicht := 3 (oder Bedingung i mod 2 = 1). |
i := i + 1 und Rücksprung 1,5 P; Gewichtung als Verzweigung 0,5 P; Prüfziffer und Vergleich 0,5 P.Java · Aufgabe_UML_07_3.java (korrigierte Fassung)
static boolean pruefeAusweis(String nr) {
if (nr.length() != 8) {
return false;
}
int summe = 0; // Korrektur 2: vor der Schleife
int gewicht;
for (int i = 0; i <= 6; i++) { // Korrektur 1: nur sieben Ziffern
if (i % 2 == 0) {
gewicht = 1; // Korrektur 3: Gewichte 1, 3, 1, ...
} else {
gewicht = 3;
}
summe = summe + ziffer(nr, i) * gewicht;
}
int pz = (10 - summe % 10) % 10;
return pz == ziffer(nr, 7);
}
Ausgabe
Schreibtischtest fehlerhafte Fassung mit 40517287:
i=0 gewicht=3 ziffer=4 summe=12
i=1 gewicht=1 ziffer=0 summe=0
i=2 gewicht=3 ziffer=5 summe=15
i=3 gewicht=1 ziffer=1 summe=1
i=4 gewicht=3 ziffer=7 summe=21
i=5 gewicht=1 ziffer=2 summe=2
i=6 gewicht=3 ziffer=8 summe=24
i=7 gewicht=1 ziffer=7 summe=7
pz=3 ziffer(nr,7)=7
Rückgabe: false (erwartet laut Spezifikation: true)
korrigiert: pruefeAusweis("40517287") = true OK
korrigiert: pruefeAusweis("40517280") = false OK
korrigiert: pruefeAusweis("12345678") = true OK
korrigiert: pruefeAusweis("1234567") = false OK
korrigiert: pruefeAusweis("00000000") = true OK
Datei: java\03_UML\Aufgabe_UML_07_3.java (enthält die fehlerhafte und die korrigierte Fassung)