Modellieren Haareschneiden

  • Themenstarter zDieTaschenlampe
  • Beginndatum
Diskutiere Modellieren Haareschneiden im Java Basics - Anfänger-Themen Bereich.
MoxxiManagarm

MoxxiManagarm

Hier nochmal die Schritte, welche du für meinen vorgeschlagenen Ansatz (Simulationsdurchlauf) mit Arrays benötigst:
1. Erstmal musst du die Kommandozeilen Parameter nach int parsen, du brauchst die Anzahl der Friseure (s: int), deine Qarteschlangenposition (n: int) und die generell benötigten Zeiten der Friseure (times: int[]). Die Benennung von s n und times ist dir überlassen.
2. Du baust ein s-großes Array von Friseuren, welchen du ihre Zeit bekanntmachst. Sie haben erstmal eine Restzeit von 0, schließlich habe sie noch keinen Haarschnitt begonnen.
3. Du initialisierst einen Zähler mit 0, welcher die Anzahl der angefangenen Haarschnitte darstellt
4. Du startest die Simulation mit einer Schleife. Erreicht die Restzeit eines Friseurs 0, dann wird seine Zeit zurückgesetzt und der Zähler um 1 erhöht. Für die Iteration hast du 2 verschiedene Möglichkeiten:
4a. Die jede Iteration ist eine Minute. Das heißt in jeder Iteration wird die Restzeit des Friseurs um 1 dekrementiert.
4b. In jeder Iteration suchst du das globale Minimum von Restzeit. Dieses globale Minimum wird von allen Friseuren abgezogen. Das kannst du dir so ähnlich wie einen Zeitraffer vorstellen.
5. Du musst immer, wenn der Zähler erhöht wurde diesen mit n vergleichen. Hast du n erreicht, so gibst du die Nummer des letzten Friseurs zurück, der einen Haarschnitt begonnen hat

FERTIG
 
Z

zDieTaschenlampe

Hier nochmal die Schritte, welche du für meinen vorgeschlagenen Ansatz (Simulationsdurchlauf) mit Arrays benötigst:
1. Erstmal musst du die Kommandozeilen Parameter nach int parsen, du brauchst die Anzahl der Friseure (s: int), deine Qarteschlangenposition (n: int) und die generell benötigten Zeiten der Friseure (times: int[]). Die Benennung von s n und times ist dir überlassen.
2. Du baust ein s-großes Array von Friseuren, welchen du ihre Zeit bekanntmachst. Sie haben erstmal eine Restzeit von 0, schließlich habe sie noch keinen Haarschnitt begonnen.
3. Du initialisierst einen Zähler mit 0, welcher die Anzahl der angefangenen Haarschnitte darstellt
4. Du startest die Simulation mit einer Schleife. Erreicht die Restzeit eines Friseurs 0, dann wird seine Zeit zurückgesetzt und der Zähler um 1 erhöht. Für die Iteration hast du 2 verschiedene Möglichkeiten:
4a. Die jede Iteration ist eine Minute. Das heißt in jeder Iteration wird die Restzeit des Friseurs um 1 dekrementiert.
4b. In jeder Iteration suchst du das globale Minimum von Restzeit. Dieses globale Minimum wird von allen Friseuren abgezogen. Das kannst du dir so ähnlich wie einen Zeitraffer vorstellen.
5. Du musst immer, wenn der Zähler erhöht wurde diesen mit n vergleichen. Hast du n erreicht, so gibst du die Nummer des letzten Friseurs zurück, der einen Haarschnitt begonnen hat

FERTIG
Ersteinmal danke für alles. Und dein Vorgehen ist mir mehr oder weniger auch verständlich, aber an der Umsetzung scheitert es. Zu 1. Es muss nichts geparst werden, da in der Aufgabenstellung vorausgesetzt wird, dass die der Kommandozeile übergebenen Parameter dem entsprechenden Format entsprechen.

Das ist bisher mein Ansatz, aber es passt vorne und hinten nicht. Passieren deine Schritte 1 bis 5 alle innerhalb einer Methode oder was übersehe ich? oder innerhalb einer Klasse ? Weil die Sachen, die eingegeben werden müssen ja gespeichert werden, so dass ich darauf zugreifen kann.
Baue ich die Restzeit von 0 in den Konstruktor der Friseure ein?

Java:
public class Barber {
    private final int requiredTime;
    private int restTime;

    public Barber(int requiredTime) {
        this.requiredTime = requiredTime;
    }

    public int getRestTime() {
        return this.restTime;
    }

    public int getRequiredTime() {
        return this.requiredTime;
    }

    public int haircut(int s, int n, int[] times) {
        Barber[] friseure = new Barber[s]; // Anzahl der Friseure wird festgelegt

        for (int i = 1; i <= friseure.length; i++) {
            friseure[i] = new Barber(times[i]); // Hier werden die Frieseure und deren Zeiten aufgestellt
                                                // Aber die Zeiten werden ja jetzt nur innerhalb der Methode gespeichert
        }
    }
}
 
MoxxiManagarm

MoxxiManagarm

Es muss nichts geparst werden, da in der Aufgabenstellung vorausgesetzt wird, dass die der Kommandozeile übergebenen Parameter dem entsprechenden Format entsprechen.
Doch klar, Kommandozeilenparameter sind Strings, die musst du schon in ints umwandeln! Das ist parsen.


Haircut ist keine Methode von Barber. Nimm die Raus, die muss in deine Haircut Klasse. Der Barber braucht aber noch eine Methode um die Restzeit zu reduzieren und eine Methode um die Restzeit wieder auf die benötigste Zeit zurückzusetzen, also quasi einen Haarschnitt zu starten.
 
Z

zDieTaschenlampe

Doch klar, Kommandozeilenparameter sind Strings, die musst du schon in ints umwandeln! Das ist parsen
Oh stimmt ja, aber das ist kein Problem. Das kann ich und das ist das kleinste Problem xD

Code:
Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2]). // Aber hier ist mir dann auch nicht klar wie ich mit den Zeiten umgehen soll. S und N sind ja einfach zu parsen, aber die Zeiten sind ja Arrays
 
MoxxiManagarm

MoxxiManagarm

Das ganze ist eigentlich kein Problem, du musst nur mal das Brett vor deinem Kopf loswerden :D Aber das passiert öfter, dass man dieses Brett hat, zumindest als Anfänger. Bin mir nur unsicher, wie wir das am besten bei dir wegkriegen ^^
 
Z

zDieTaschenlampe

Doch klar, Kommandozeilenparameter sind Strings, die musst du schon in ints umwandeln! Das ist parsen.
Haircut ist keine Methode von Barber. Nimm die Raus, die muss in deine Haircut Klasse. Der Barber braucht aber noch eine Methode um die Restzeit zu reduzieren und eine Methode um die Restzeit wieder auf die benötigste Zeit zurückzusetzen, also quasi einen Haarschnitt zu starten.
Ja okey das war schon mal Denkfehler Nummer 1. Bezüglich der 2 Methoden :

Code:
public void reduceRestTime(int resttime) {  // Hier bin ich mir nicht sicher, inwiefern die RestTime reduziert wird oder werden soll
        this.restTime =
    }
    
    public void resetRestTime() {  // Die Methode hier sollte eigentlich passen, da sobald die Restzeit auf 0 ist, diese ja auf die benötigte Zeit wieder gesetzt werden muss
        this.restTime = requiredTime;
    }
 
Z

zDieTaschenlampe

Das ganze ist eigentlich kein Problem, du musst nur mal das Brett vor deinem Kopf loswerden :D Aber das passiert öfter, dass man dieses Brett hat, zumindest als Anfänger. Bin mir nur unsicher, wie wir das am besten bei dir wegkriegen ^^
Ich denke mal durch Üben Üben Üben ? Aber jap dieses Brett nervt mich und zerstört mich :(
 
Z

zDieTaschenlampe

ja resetRestTime passt. reduceRestTime sind für die Steps 4a bzw. 4b benötigt. bei 4a bräuchtest du keinen Parameter, sondern reduzierst die Restzeit um 1. Bei 4b würde dieser Parameter das globale Minimum sein.
Ahso hätte das schon erwähnen sollen, dass mir der Weg 4a sympathischer ist und ich diesen die ganze Zeit anpeile, aber damit wäre jetzt die Barber Klasse fertig i guess ?
 
Z

zDieTaschenlampe

Okey langsam seh ich die Zielgerade schon eher, aber bei den Parsen der Zeiten beginnt wie gesagt das erste problem :

Code:
public class Haircut {

    public static void main(String[] args) {
    
        int b =Integer.parseInt(args[0]);
        int n =Integer.parseInt(args[1]);
        int[] times = // ??? 1. Ich brauch jetzt ja die arg[2] bis .... und 2. wie parse ich das bitte
  
      
        public int haircut(b,  n, int[] times) {
        Barber[] friseure = new Barber[b]; // Anzahl der Friseure wird festgelegt

        for (int i = 1; i <= friseure.length; i++) {
            friseure[i] = new Barber(times[i]); // Hier werden die Frieseure und deren Zeiten aufgestellt

        }
    }
}
}
Edit : Okey wie ich den String parse weiß ich inzwischen, aber ich will ja nur ab args[2] alle haben und das check ich net

Edit 2.0 :
So sollte es passen ?
Code:
public static void main(String[] args) {
      
        int b =Integer.parseInt(args[0]);
        int n =Integer.parseInt(args[1]);
        int[] times = new int[args.length];
        
        for(int i = 2;i<=args.length;i++) {
            times[i] = Integer.parseInt(args[i]);
        }
 
Zuletzt bearbeitet:
MoxxiManagarm

MoxxiManagarm

Du brauchst in deinem Fall eigentlich times nicht zusätzlich wenn ich es mir nochmal recht überlege. Du kannst den Wert direkt nachdem du ihn umgewandelt hast dem Friseur mitteilen.

Also so:
Java:
int b =Integer.parseInt(args[0]);
int n =Integer.parseInt(args[1]);

Barber[] barbers = new Barber[b];
for (int i = 2; i < args.length; i++) {
  barbers[i-2] = new Barber(Integer.parseInt(args[i]));
}
 
Z

zDieTaschenlampe

Du brauchst in deinem Fall eigentlich times nicht zusätzlich wenn ich es mir nochmal recht überlege. Du kannst den Wert direkt nachdem du ihn umgewandelt hast dem Friseur mitteilen.

Also so:
Java:
int b =Integer.parseInt(args[0]);
int n =Integer.parseInt(args[1]);

Barber[] barbers = new Barber[b];
for (int i = 2; i < args.length; i++) {
  barbers[i-2] = new Barber(Integer.parseInt(args[i]));
}
Okey das ist tatsächlich besser und übersichtlicher. Damit wären dann Schritt 1 und 2 abgeschlossen? Aber jetzt kommt eh der Punkt, der mich am meisten interessiert, weil was meinst du mit der Zähler muss initialisiert werden /:
 
MoxxiManagarm

MoxxiManagarm

Damit meine ich nur eine Zeile
Java:
int count = 0;
count wird inkrementiert (also um 1 erhöht) wenn ein Friseur resettet wird, also einen Haarschnitt beginnt. Nachdem die Erhöhung von count stattgefunden hat kannst du count mit n vergleichen. Aber auch hier gibt es bei nochmaliger Überlegung eine Variante 2. Nämlich count weglassen und n dekrementieren, n anschließend mit 0 vergleichen. Ich denke halt auch oft zu kompliziert ^^
 
Zuletzt bearbeitet:
Z

zDieTaschenlampe

Damit meine ich nur eine Zeile
Java:
int count = 0;
count wird inkrementiert (also um 1 erhöht) wenn ein Friseur resettet wird, also einen Haarschnitt beginnt. Nachdem die Erhöhung von count stattgefunden hat kannst du count mit n vergleichen. Aber auch hier gibt es bei nochmaliger Überlegung eine Variante 2. Nämlich count weglassen und n dekrementieren, n anschließend mit 0 vergleichen. Ich denke halt auch oft zu kompliziert ^^
Welche der beiden Varianten findest du besser ? Mir erscheinen beide als logisch und gleich gut.
Und ich möchte mich wieder mal bei dir bedanken, da du so bemüht bist, mir zu helfen, auch wenn das nicht so einfach ist xD.. Ich will mich auch dafür entschuldigen, dass ich nicht direkt oder die ganze Zeit antworte bzw antworten kann, obwohl du so zeitnah immer hilfst. Ich muss eben parallel auch noch Online Vorlesungen nachkommen, lernen und andere Sachen erledigen sowie persönlichen Verantwortungen nachkommen. Ich hoffe du nimmst mir das nicht böse :/
 
MoxxiManagarm

MoxxiManagarm

Ich nehme dir nichts böse. Foren fragen zu beantworten ist ein Hobby. Ich finde n dekrementieren bis 0 besser.
 
Z

zDieTaschenlampe

Ich nehme dir nichts böse. Foren fragen zu beantworten ist ein Hobby. Ich finde n dekrementieren bis 0 besser.
Aber wie starte ich die Schleife? bzw wie hat die auszusehen. Ich weiß immernoch nicht genau wie das mit den Zeiten ablaufen wird

Edit : Und passiert jetzt alles in der main methode oder bekommt die Klasse hair cut noch eine Methode ?
 
Z

zDieTaschenlampe

Also mir ist nicht klar wie ich die "Simulation starte" . Brauch ich dafür eine extra Methode in der Haircut klasse der bleib ich einfach in der main und mach da etwas mit Schleifen?
 
Thema: 

Modellieren Haareschneiden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben