diff --git a/Aausleihe.java b/Aausleihe.java new file mode 100644 index 0000000..9a7af4d --- /dev/null +++ b/Aausleihe.java @@ -0,0 +1,4 @@ +public class Aausleihe { + + +} diff --git a/Benutzer.java b/Benutzer.java index 652aaaf..9d39bf8 100644 --- a/Benutzer.java +++ b/Benutzer.java @@ -1,19 +1,23 @@ import java.util.Date; +import java.util.Calendar; -abstract class Benutzer { + class Benutzer { private String name; private String nachname; private int kundennummer; private Date date; - Benutzer(String name,String nachname,int kundennummer,Date date){ - this.name=name; - this.nachname=nachname; - this.date=date; - this.kundennummer=kundennummer; + + // Konstruktor + Benutzer(String name, String nachname, int kundennummer, Date date) { + this.name = name; + this.nachname = nachname; + this.date = date; + this.kundennummer = kundennummer; } + // Getter-Methoden public String getNachname() { return nachname; } @@ -22,27 +26,40 @@ abstract class Benutzer { return name; } - public Date getDate() { + public Date getDate() { return date; } public int getKundennummer() { return kundennummer; } - public static class Erwachsen extends Benutzer{ - Erwachsen(String name,String nachname,int kundennummer,Date date){ - super(name,nachname,kundennummer,date); + + // Methode zum Extrahieren des Jahres aus dem Date + public static int getJahr(Benutzer benutzer) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(benutzer.getDate()); // Setzt das Date in das Calendar-Objekt + return calendar.get(Calendar.YEAR); // Gibt das Jahr aus dem Calendar-Objekt zurück + } + + + // Die Unterklassen Erwachsen und Kinder bleiben unverändert + public static class Erwachsen extends Benutzer { + Erwachsen(String name, String nachname, int kundennummer, Date date) { + super(name, nachname, kundennummer, date); + } + } + + public static class Kinder extends Benutzer { + Kinder(String name, String nachname, int kundennummer, Date date) { + super(name, nachname, kundennummer, date); + } + } + public static class Admin extends Benutzer { + Admin(String name, String nachname, int kundennummer, Date date) { + super(name, nachname, kundennummer, date); } - - } - public static class Kinder extends Benutzer{ - Kinder(String name,String nachname,int kundennummer,Date date){ - super(name,nachname,kundennummer,date); - } - - - } } + diff --git a/Main.java b/Main.java index 7046417..8607e1c 100644 --- a/Main.java +++ b/Main.java @@ -1,2 +1,22 @@ public class Main { + public static void main(String[] args) { + Creator creator = new Creator(); + Verwaltung verwaltung = new Verwaltung(); + + // Medienobjekte hinzufügen + verwaltung.mediensListe.add(creator.factoryMedien("Java Programmierung", "Max Mustermann", 1, "buch", 2020)); + verwaltung.mediensListe.add(creator.factoryMedien("Datenstrukturen", "Julia Schmidt", 2, "buch", 2018)); + verwaltung.mediensListe.add(creator.factoryMedien("Inception", "Christopher Nolan", 3, "dvd", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("Matrix", "Wachowski", 4, "dvd", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("Thriller", "", 5, "cd", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("Back in Black", "", 6, "cd", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("Schach", "", 7, "sb", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("Monopoly", "", 8, "sb", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("Minecraft", "Mojang", 9, "videospiel", 0)); + verwaltung.mediensListe.add(creator.factoryMedien("The Witcher 3", "CD Projekt", 10, "videospiel", 0)); + + // Ui mit der Verwaltung-Instanz initialisieren + Ui ui = new Ui(verwaltung); + ui.anmeldung(); + } } diff --git a/Medien.java b/Medien.java index 472f2e9..e49f4b6 100644 --- a/Medien.java +++ b/Medien.java @@ -1,17 +1,27 @@ -public abstract class Medien { - // Eigenschaften der Medien-Klasse +// Interface für Medien, die ausgeliehen werden können +interface Ausleihbar { + int getMaxVerlängerungen(); // Gibt die maximale Anzahl an Verlängerungen zurück + boolean kannVerlängern(); // Prüft, ob das Medium verlängerbar ist + boolean verlängern(); // Verlängert das Medium, wenn möglich +} + +// Abstrakte Basisklasse für alle Medien +public abstract class Medien implements Ausleihbar { protected String name; - protected String autor; protected int id; - protected boolean verlängerung; // Standardwert für alle Medien - protected int frist; // Diese Variable wird in den Unterklassen gesetzt + protected int frist; // Standard-Ausleihfrist in Wochen + protected int maxVerlängerungen; // Maximale Anzahl an möglichen Verlängerungen + protected int aktuelleVerlängerungen; // Aktuelle Anzahl an durchgeführten Verlängerungen + protected boolean istAusgeliehen; // Status, ob das Medium ausgeliehen ist // Konstruktor - public Medien(String name, String autor, int id) { + public Medien(String name, int id, int frist, int maxVerlängerungen) { this.name = name; - this.autor = autor; this.id = id; - this.verlängerung = false; // Standardwert, falls nicht anders gesetzt + this.frist = frist; + this.maxVerlängerungen = maxVerlängerungen; + this.aktuelleVerlängerungen = 0; // Initialisierung ohne Verlängerungen + this.istAusgeliehen = false; // Initialer Status: nicht ausgeliehen } // Getter-Methoden @@ -19,66 +29,133 @@ public abstract class Medien { return name; } - public String getAutor() { - return autor; - } - public int getId() { return id; } - public boolean isVerlängerung() { - return verlängerung; + // Implementierung der Ausleihbar-Methoden + @Override + public int getMaxVerlängerungen() { + return maxVerlängerungen; } - // Setter für verlängerung, falls benötigt - public void setVerlängerung(boolean verlängerung) { - this.verlängerung = verlängerung; + @Override + public boolean kannVerlängern() { + return aktuelleVerlängerungen < maxVerlängerungen; } - // Getter für frist - public int getFrist() { - return frist; + @Override + public boolean verlängern() { + if (kannVerlängern()) { + aktuelleVerlängerungen++; + return true; // Verlängerung erfolgreich + } + return false; // Keine Verlängerung mehr möglich } - // Statische innere Klassen, die Medien erben + public boolean istAusgeliehen() { + return istAusgeliehen; + } + + public void ausleihen() { + if (!istAusgeliehen) { + istAusgeliehen = true; + } else { + System.out.println("Das Medium ist bereits ausgeliehen."); + } + } + + public void zurückgeben() { + istAusgeliehen = false; + } + + // Unterklasse für Bücher public static class Book extends Medien { - // Spezifische frist für Bücher - public Book(String name, String autor, int id) { - super(name, autor, id); - this.frist = 4; // frist für Book ist 4 + private String autor; + private int erscheinungsjahr; + + public Book(String name, String autor, int id, int erscheinungsjahr) { + super(name, id, 4, 3); // Frist für Bücher ist 4 Wochen, bis zu 3 Mal verlängerbar + this.autor = autor; + this.erscheinungsjahr = erscheinungsjahr; + } + + // Getter-Methoden für spezifische Eigenschaften von Büchern + public String getAutor() { + return autor; + } + + public int getErscheinungsjahr() { + return erscheinungsjahr; + } + + @Override + public String toString() { + return "Buch: " + name + " von " + autor + " (ID: " + id + ", Jahr: " + erscheinungsjahr + ")"; } } + // Unterklasse für DVDs public static class Dvds extends Medien { - // Spezifische frist für DVDs - public Dvds(String name, String autor, int id) { - super(name, autor, id); - this.frist = 1; // frist für Dvds ist 1 + private String regisseur; + + public Dvds(String name, String regisseur, int id) { + super(name, id, 1, 0); // Frist für DVDs ist 1 Woche, keine Verlängerung möglich + this.regisseur = regisseur; + } + + // Getter-Methoden für spezifische Eigenschaften von DVDs + public String getRegisseur() { + return regisseur; + } + + @Override + public String toString() { + return "DVD: " + name + " von " + regisseur + " (ID: " + id + ")"; } } + // Unterklasse für CDs public static class Cds extends Medien { - // Spezifische frist für CDs - public Cds(String name, String autor, int id) { - super(name, autor, id); - this.frist = 2; // frist für Cds ist 2 + public Cds(String name, int id) { + super(name, id, 2, 0); // Frist für CDs ist 2 Wochen, keine Verlängerung möglich + } + + @Override + public String toString() { + return "CD: " + name + " (ID: " + id + ")"; } } + // Unterklasse für Brettspiele public static class Brettspiel extends Medien { - // Spezifische frist für Brettspiele - public Brettspiel(String name, String autor, int id) { - super(name, autor, id); - this.frist = 2; // frist für Brettspiel ist 2 + public Brettspiel(String name, int id) { + super(name, id, 2, 0); // Frist für Brettspiele ist 2 Wochen, keine Verlängerung möglich + } + + @Override + public String toString() { + return "Brettspiel: " + name + " (ID: " + id + ")"; } } + // Unterklasse für Videospiele public static class Videospiel extends Medien { - // Spezifische frist für Videospiele - public Videospiel(String name, String autor, int id) { - super(name, autor, id); - this.frist = 3; // frist für Videospiel ist 3 + private String entwickler; + + public Videospiel(String name, String entwickler, int id) { + super(name, id, 4, 1); // Frist für Videospiele ist 4 Wochen, einmal verlängerbar + this.entwickler = entwickler; + } + + // Getter-Methoden für spezifische Eigenschaften von Videospielen + public String getEntwickler() { + return entwickler; + } + + @Override + public String toString() { + return "Videospiel: " + name + " von " + entwickler + " (ID: " + id + ")"; } } } diff --git a/Ui.java b/Ui.java new file mode 100644 index 0000000..c7eae44 --- /dev/null +++ b/Ui.java @@ -0,0 +1,110 @@ +import java.util.*; // Für LinkedList, List, ArrayList, Scanner und andere grundlegende Klassen +import java.util.stream.Collectors; // Für die Collectors-Funktionalität in Streams +import java.text.ParseException; // Für Ausnahmebehandlung beim Parsen von Daten +import java.text.SimpleDateFormat; +import java.util.function.Predicate; +// Für die Verarbeitung von Datumsformaten + +public class Ui { + private Scanner scanner = new Scanner(System.in); + private Verwaltung verwaltung; + + // Konstruktor, der eine Verwaltung-Instanz annimmt + public Ui(Verwaltung verwaltung) { + this.verwaltung = verwaltung; + } + + void anmeldung() { + boolean running = true; + + while (running) { + System.out.println("Willkommen! Bitte wählen Sie eine Option:"); + System.out.println("1: Registrieren"); + System.out.println("2: Anmelden mit Kundennummer"); + System.out.println("3: Suchen nach Objekten"); + System.out.println("0: Programm beenden"); + + int menue = scanner.nextInt(); + scanner.nextLine(); // Leert den Puffer nach nextInt() + + switch (menue) { + case 1: + registrieren(); + break; + + case 2: + anmelden(); + break; + + case 3: + suchenNachMedien(); + break; + case 4: + + + case 0: + System.out.println("Programm wird beendet. Auf Wiedersehen!"); + running = false; + break; + + default: + System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut."); + } + } + } + + private void registrieren() { + System.out.print("Geben Sie Ihren Vornamen ein: "); + String name = scanner.nextLine(); + + System.out.print("Geben Sie Ihren Nachnamen ein: "); + String nachname = scanner.nextLine(); + + System.out.print("Geben Sie Ihr Geburtsdatum ein (Format: TT.MM.JJJJ): "); + String dateInput = scanner.nextLine(); + + SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy"); + formatter.setLenient(false); + + try { + Date geburtsdatum = formatter.parse(dateInput); + int genkundennummer = verwaltung.generiereEindeutigeKundennummer(); + + Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, geburtsdatum); + verwaltung.benutzerListe.add(neuerBenutzer); + + System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer); + } catch (ParseException e) { + System.out.println("Ungültiges Datum. Bitte verwenden Sie das Format TT.MM.JJJJ."); + } + } + + private void anmelden() { + System.out.print("Geben Sie Ihre Kundennummer zur Anmeldung ein: "); + int eingabeKundennummer = scanner.nextInt(); + Predicate isKundennummerGleich = benutzer -> benutzer.getKundennummer() == eingabeKundennummer; + + if (verwaltung.benutzerListe.stream().anyMatch(isKundennummerGleich)) { + System.out.println("Willkommen zurück, Benutzer mit Kundennummer: " + eingabeKundennummer + "!"); + } else { + System.out.println("Kundennummer '" + eingabeKundennummer + "' nicht gefunden. Bitte registrieren Sie sich."); + } + } + + private void suchenNachMedien() { + System.out.println("Bitte geben Sie stichwortartig an, wonach Sie suchen:"); + String suchbegriff = scanner.nextLine(); + + // Die Methode durchsuchenMedien in der Verwaltungsklasse wird aufgerufen + List gefundeneMedien = Verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff); + + if (gefundeneMedien.isEmpty()) { + System.out.println("Keine Medien gefunden."); + } else { + System.out.println("Gefundene Medien:"); + gefundeneMedien.forEach(System.out::println); // Nutzt die toString()-Methode jeder Medienklasse zur Ausgabe + } + } + +} + diff --git a/Verwaltung.java b/Verwaltung.java index 53eeffb..5174c21 100644 --- a/Verwaltung.java +++ b/Verwaltung.java @@ -1,2 +1,100 @@ +import javax.crypto.spec.PSource; +import java.util.*; +import java.util.stream.Collectors; + public class Verwaltung { + LinkedList mediensListe = new LinkedList<>(); + LinkedList benutzerListe = new LinkedList<>(); + Creator obj = new Creator(); + + void addFunktion(Medien medien) { + mediensListe.add(medien); + } + + void addBenutzer(Benutzer benutzer) { + benutzerListe.add(benutzer); + } + + static int mrgen() { + Random m = new Random(); + int[] zahl = new int[7]; + + int number; + for (int i = 0; i < 7; ++i) { + number = m.nextInt(10); + zahl[i] = number; + } + + number = Arrays.stream(zahl).reduce(0, (acc, digit) -> { + return acc * 10 + digit; + }); + return number; + } + + public int generiereEindeutigeKundennummer() { + final int[] genkundennummer = new int[1]; // Verwendung eines Arrays, um den Wert zu ändern + do { + genkundennummer[0] = mrgen(); // Eine neue Kundennummer generieren + } while (benutzerListe.stream().anyMatch(benutzer -> benutzer.getKundennummer() == genkundennummer[0])); + return genkundennummer[0]; // Rückgabe der Kundennummer + } + + // Verbesserte Version der durchsuchenMedien-Methode + public static List durchsuchenMedien(LinkedList medienListe, String suchbegriff) { + String suchbegriffKlein = suchbegriff.toLowerCase(); // Der Suchbegriff in Kleinbuchstaben für einfache Vergleiche + + return medienListe.stream() + .filter(medien -> { + // Sucht nach dem Mediumstyp (Art des Mediums) und dem Namen des Werkes + boolean gefunden = false; + + // Überprüfe, ob die Art des Mediums im Suchbegriff enthalten ist + if (medien instanceof Medien.Book) { + gefunden |= "buch".contains(suchbegriffKlein); + } else if (medien instanceof Medien.Dvds) { + gefunden |= "dvd".contains(suchbegriffKlein); + } else if (medien instanceof Medien.Cds) { + gefunden |= "cd".contains(suchbegriffKlein); + } else if (medien instanceof Medien.Brettspiel) { + gefunden |= "sb".contains(suchbegriffKlein); // "sb" für Brettspiel + } else if (medien instanceof Medien.Videospiel) { + gefunden |= "videospiel".contains(suchbegriffKlein); + } + + // Zusätzlich wird nach dem Namen des Werkes gesucht + gefunden |= medien.getName().toLowerCase().contains(suchbegriffKlein); + + return gefunden; // Wenn das Medium den Suchbegriff in der Art oder im Namen enthält, bleibt es in der Liste + }) + .collect(Collectors.toList()); // Rückgabe der gefilterten Liste + } + +} + +class Creator { + + static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, Date date) { + if (Benutzer.getJahr(new Benutzer(name, nachname, kundennummer, date)) > 18) { + return new Benutzer.Erwachsen(name, nachname, kundennummer, date); + } else { + return new Benutzer.Kinder(name, nachname, kundennummer, date); + } + } + + public static Medien factoryMedien(String name, String regisseur, int id, String art, int erscheinungsjahr) { + switch (art.toLowerCase()) { + case "buch": + return new Medien.Book(name, regisseur, id, erscheinungsjahr); // Autor für Bücher + case "dvd": + return new Medien.Dvds(name, regisseur, id); // Regisseur für DVDs + case "cd": + return new Medien.Cds(name, id); // CDs benötigen keinen Autor + case "sb": // Brettspiel + return new Medien.Brettspiel(name, id); // Brettspiele benötigen keinen Autor + case "videospiel": + return new Medien.Videospiel(name, regisseur, id); // Entwickler für Videospiele + default: + throw new IllegalArgumentException("Unbekannter Medientyp: " + art); + } + } }