Modellieren Haareschneiden

zDieTaschenlampe

Aktives Mitglied
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

Top Contributor
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]));
}
 

zDieTaschenlampe

Aktives Mitglied
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

Top Contributor
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:

zDieTaschenlampe

Aktives Mitglied
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 :/
 

zDieTaschenlampe

Aktives Mitglied
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?
 

zDieTaschenlampe

Aktives Mitglied
Mach einfach eine Dauerschleife, du beendest das Programm mit System.exit(0) wenn n 0 wird

Also keine extra Methode in der Klasse, sondern einfach alles in die main Methode ? Aber wie sieht die Simulation aus, ich brauch ja eine for Schleife, aber durch was iteriert diese ? Hab ja for (int i = 0 < .?...< i++). Ich habs mit barber.lenght versucht, aber das kann es nicht sein oder brauch ich ineinander geschachtelte mehrere Schleifen ? Weil wir haben ja festgelegt, dass eine Iteration eine Minute entspricht, aber ich hab keine Ahnung wie ich das umsetzen kann
 

zDieTaschenlampe

Aktives Mitglied
Code:
package uebungsblatt1;

public class Haircut {

    public static void main(String[] args) {

        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]));
        }

        for (int i = 0; i < barbers.length; i++) { // durch die Friseure zu iterieren ist doch der erste Schritt, aber der Zusammenhang zu deren zeiten fehlt mir. Ich brauch ja jetzt noch eine Schleife mit den Zeiten von dem Friseur i 
           
        }
    }
}

Edit : so vermutlich irgendwie ?

Code:
for (int i = 0; i < barbers.length; i++) {
            for (int j = 0; j < barbers[i].getRequiredTime(); j++) {

            }
        }
 

zDieTaschenlampe

Aktives Mitglied
Okey ich glaube ich versteh es langsam und es geht in die richtige Richtung, aber paar Zusammenhänge fehlen mir noch, denn ich hab doch nirgendwo festgelegt, wie die RestTime mit der Requiredtime zusammenhängt

Wenn ich richtig liege, müsste das unten ca the way to go sein, aber wie und wo bau ich das n ein und passt das alles überhaupt?
Code:
public class Haircut {

    public static void main(String[] args) {

        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]));
        }

        for (int i = 0; i < barbers.length; i++) {
            for (int j = 0; j < barbers[i].getRequiredTime(); j++) {
                barbers[i].reduceRestTime();
                if (barbers[i].getRestTime() == 0) {
                    barbers[i].resetRestTime();
                }
            }
        }
    }
}
 

MoxxiManagarm

Top Contributor
Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfach while(true) sein, was ich mit Dauerschleife meinte. Du weißt ja schließlich nicht wieviel Zeit du benötigst. Die Innere Schleife iteriert über das Barber Array, das bekommst du sicher hin. Durch die Dauerschleife ist es sehr wichtig, dass du die Schleife irgendwann auch beendest, System.exit(0) ist eine Möglichkeit für den Fall, wenn du alles in der Main machst. Das n kommt an die Gleiche Stelle wie der resetRestTime Aufruf.
 

zDieTaschenlampe

Aktives Mitglied
Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfach while(true) sein, was ich mit Dauerschleife meinte. Du weißt ja schließlich nicht wieviel Zeit du benötigst. Die Innere Schleife iteriert über das Barber Array, das bekommst du sicher hin. Durch die Dauerschleife ist es sehr wichtig, dass du die Schleife irgendwann auch beendest, System.exit(0) ist eine Möglichkeit für den Fall, wenn du alles in der Main machst. Das n kommt an die Gleiche Stelle wie der resetRestTime Aufruf.

Also ist mein geposteter Ansatz nicht gut ? Hab jetzt auch verschiedene Sachen getestet aber mein Ansatz macht keinen Sinn i guess. Aber wenn ich eine Dauerschleife mit while (true) erstelle, inwiefern stellt das dann die Zeit dar ?
 

zDieTaschenlampe

Aktives Mitglied
Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfach while(true) sein, was ich mit Dauerschleife meinte. Du weißt ja schließlich nicht wieviel Zeit du benötigst. Die Innere Schleife iteriert über das Barber Array, das bekommst du sicher hin. Durch die Dauerschleife ist es sehr wichtig, dass du die Schleife irgendwann auch beendest, System.exit(0) ist eine Möglichkeit für den Fall, wenn du alles in der Main machst. Das n kommt an die Gleiche Stelle wie der resetRestTime Aufruf.
Und ja über das barber array zu iterieren ist nicht das Problem, aber ich seh nicht den Zusammenhang von dem und der Zeit ? Irgendwo muss ich ja die barber methoden so einbauen, dass die Zeiten inkrementiert oder dekrementiert werden, aber wohin damit ?
 

zDieTaschenlampe

Aktives Mitglied
Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfach while(true) sein, was ich mit Dauerschleife meinte. Du weißt ja schließlich nicht wieviel Zeit du benötigst. Die Innere Schleife iteriert über das Barber Array, das bekommst du sicher hin. Durch die Dauerschleife ist es sehr wichtig, dass du die Schleife irgendwann auch beendest, System.exit(0) ist eine Möglichkeit für den Fall, wenn du alles in der Main machst. Das n kommt an die Gleiche Stelle wie der resetRestTime Aufruf.

ich glaube ich hab es fast, aber irgenwo steckt der Fehler noch drinnen
Code:
public class Haircut {

    public static void main(String[] args) {

        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);
        int count = 0;

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

        while (true) {
            for (int i = 0; i < barbers.length; i++) {
                barbers[i].reduceRequiredTime();
                if (barbers[i].getRestTime() == 0) { 
                    barbers[i].resetRestTime();
                    count++;                    // ich weiß wir wollten es ohne Zähler machen, aber teset gerade etwas und mein Programm kommt gar nicht zu dieser If Abfrage hier unten, aber wieso ?? Die schleife iteriert doch die ganze Zeit durch die Friseure und reduziert die ganze die Zeit mithilfe der Methoden, aber zur if abfrage kommt es einfach nicht 
                }
            }
        }
    }
}
 

zDieTaschenlampe

Aktives Mitglied
ich glaube ich hab es fast, aber irgenwo steckt der Fehler noch drinnen
Code:
public class Haircut {

    public static void main(String[] args) {

        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);
        int count = 0;

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

        while (true) {
            for (int i = 0; i < barbers.length; i++) {
                barbers[i].reduceRequiredTime();
                if (barbers[i].getRestTime() == 0) {
                    barbers[i].resetRestTime();
                    count++;                    // ich weiß wir wollten es ohne Zähler machen, aber teset gerade etwas und mein Programm kommt gar nicht zu dieser If Abfrage hier unten, aber wieso ?? Die schleife iteriert doch die ganze Zeit durch die Friseure und reduziert die ganze die Zeit mithilfe der Methoden, aber zur if abfrage kommt es einfach nicht
                }
            }
        }
    }
}

Edit : Der Fehler liegt irgendwie bei der reduceTime methode, denn ich hab gerade etwas getestet und wenn ich die schleife mit 2 Frsieuren und die Zeiten 10 und 5 starte, werden diese Zeiten nur ein mal auf 9 und 4 reduziert und das dann in Dauerschleife. Deswegen kommt es auch die ganze Zeit nicht zur If Abfrage. Aber wieso reduziert sich die Zeit nicht weiter nach jeder Iteration ? Also es bleibt wenn man 10 und 5 macht die gnaze zeit im Anschluss auf 9 und 4, also es speichert nicht die neuen Werte, aber woran liegt das
 

MoxxiManagarm

Top Contributor
Du hast es schon fast, dein aktueller Stand ist dem Ziel nahe. Was dir aber noch fehlt ist der Vergleich von n, je nachdem entweder mit count oder mit 0. Du willst nach jedem Start eines Haarschnitts (Aufruf von resetRestTime) überprüfen, ob n erreicht wurde. Dafür brauchst du eine Bedingung (if). Falls n erreicht wurde gibst du die Nummer des Barbers aus und beendest das Programm. Eine Schleife hat erstmal nichts mit Zeit zu tun. Die Zeit ist hier rein virtuell. In deinem gewählten Ansatz ist ein Durchlauf der while-Schleife eine Zeiteinheit, nenne es Minute.
 

zDieTaschenlampe

Aktives Mitglied
Du hast es schon fast, dein aktueller Stand ist dem Ziel nahe. Was dir aber noch fehlt ist der Vergleich von n, je nachdem entweder mit count oder mit 0. Du willst nach jedem Start eines Haarschnitts (Aufruf von resetRestTime) überprüfen, ob n erreicht wurde. Dafür brauchst du eine Bedingung (if). Falls n erreicht wurde gibst du die Nummer des Barbers aus und beendest das Programm. Eine Schleife hat erstmal nichts mit Zeit zu tun. Die Zeit ist hier rein virtuell. In deinem gewählten Ansatz ist ein Durchlauf der while-Schleife eine Zeiteinheit, nenne es Minute.

Das alles hab ich glaub ich schon. Mein Problem liegt bei der reduceTime Methode :

Code:
public class Haircut {

    public static void main(String[] args) {

        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);
        int count = 0;
        boolean programmOn = true;

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

        }

        while (programmOn == true) {
            for (int i = 0; i < barbers.length; i++) {
                barbers[i].reduceRequiredTime();
                // System.out.println(barbers[i].getRequiredTime());
                System.out.println(barbers[i].getRestTime());

                if (barbers[i].getRestTime() == 0) { // Es kommt hier nicht zur If Abfrage, da die Zeit der Friseure nicht gescheit gesenkt wird
                    barbers[i].resetRestTime();
                    count++;
                    if (count == n) {
                        System.out.println(n + 1);
                        programmOn = !programmOn;
                    }
                }
            }

        }
    }
}

Wie 1 oder 2 post vor deinem Beitrag jetzt beschrieben werden die reduzierten Werte bzw reduzierten Zeiten nicht gespeichert bzw. beim 2. 3. etc Iterieren der Schleife übernommen. Jedes Mal wenn die while schleife startet tutu sie es mit den Werten der Kommandozeile. Aber ich check nicht wieso ?
 

MoxxiManagarm

Top Contributor
Dann zeig reduceRequiredTime nochmal. Aktuell gibst du übrigens n + 1 aus. n stellt NICHT die Nummer des Friseurs dar, sondern deine Warteschlangenposition.
 

zDieTaschenlampe

Aktives Mitglied
Dann zeig reduceRequiredTime nochmal. Aktuell gibst du übrigens n + 1 aus. n stellt NICHT die Nummer des Friseurs dar, sondern deine Warteschlangenposition.

Code:
public class Barber {
    private int requiredTime;
    private int restTime;

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

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

    public void setRestTime(int time) {
        this.restTime = time;
    }

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

    public void reduceRequiredTime() {
        this.restTime = requiredTime - 1;
    }

    public void resetRestTime() {
        this.restTime = requiredTime;
    }
}

Ahja und wegen der Ausgabe von n. Das ist mir schon selbst aufgefallen, nachdem ich mein Code hier gepostet habe. Ich wollte i +1 oder count nehmen für die Ausgabe

Edit : Ich hab keine Ahnung was an der reduceTime methode falsch ist, aber es muss in das Problem muss in der Friseur Klasse liegen
 

MoxxiManagarm

Top Contributor
Hätte mir eigentlich bei der Benennung schon auffallen sollen ^^ Du willst die Restzeit reduzieren, nicht die requiredTime. Die Methode hat mit requiredTime nichts zu tun. requiredTime ist ein fester Wert eines Friseurs, er ist unveränderlich. Das ist die Zeit die ein Friseur für jeden Haarschnitt benötigt.

Java:
public void reduceRestTime() {
        this.restTime--;
    }
 

zDieTaschenlampe

Aktives Mitglied
Hätte mir eigentlich bei der Benennung schon auffallen sollen ^^ Du willst die Restzeit reduzieren, nicht die requiredTime. Die Methode hat mit requiredTime nichts zu tun. requiredTime ist ein fester Wert eines Friseurs, er ist unveränderlich. Das ist die Zeit die ein Friseur für jeden Haarschnitt benötigt.

Java:
public void reduceRestTime() {
        this.restTime--;
    }

Ja so hat ich es Anfang, aber wie kann das sein, dass es nichts damit zu tun hat ? Die Resttime ist ja am anfang mit 0 initialisiert und wenn ich davon 1 abziehe ist es negativ oder nicht ?

Muss nicht die requiredtime abgezogen werden
 

MoxxiManagarm

Top Contributor
Spricht nichts dagegen, dass es restTime negativ wird. Kannst ja den neuen Haarschnitt beginnen wenn restTime <= 0. Oder du setzt den ersten Wert für restTime auf 1. Die requiredTime hat nur insofern mit der restTime was zun tun, dass es der Wert ist, auf den restTime zurückgesetzt wird. Wenn der Friseur mit einem Haarschnitt beginnt, dann ist die noch benötigte Zeit um den Haarschnitt zu beenden, die Zeit, welche er allgemein benötigt. Und die ist ja für jeden Friseur anders.
 
Zuletzt bearbeitet:

zDieTaschenlampe

Aktives Mitglied
Spricht nichts dagegen, dass es restTime negativ wird. Kannst ja den neuen Haarschnitt beginnen wenn restTime <= 0. Oder du setzt den ersten Wert für restTime auf 1. Die requiredTime hat nur insofern mit der restTime was zun tun, dass es der Wert ist, auf den restTime zurückgesetzt wird. Wenn der Friseur mit einem Haarschnitt beginnt, dann ist die noch benötigte Zeit um den Haarschnitt zu beenden, die Zeit, welche er allgemein benötigt. Und die ist ja für jeden Friseur anders.

Es klappt einfach nicht. Ich check nicht wieso das Programm nicht terminieren will -.-
 

MoxxiManagarm

Top Contributor
Ich habe dir Friseur etwas übertrieben nochmal umbenannt. Das sollst du nicht übernehmen, es soll dir lediglich helfen es zu verstehen was die Werte bedeuten.

Java:
public class Friseur {
    private final int benoetigteZeitJeHaarschnitt;
    private int verbleibendeZeitAktuellerHaarschnitt;

    public Friseur(int benoetigteZeitJeHaarschnitt) {
        this.benoetigteZeitJeHaarschnitt = benoetigteZeitJeHaarschnitt;
    }
    
    public void schneideEineMinuteLangHaare() {
        verbleibendeZeitAktuellerHaarschnitt--;
    }
    
    public void starteHaarschnitt() {
        verbleibendeZeitAktuellerHaarschnitt = benoetigteZeitJeHaarschnitt;
    }
}
 

zDieTaschenlampe

Aktives Mitglied
Sehe ich jetzt spontan nicht, aber du unterbrichst dein Programm erstmal nicht. Falls Friseur 1 dich dran nimmt, dann schneiden die anderen munter weiter. Es ist nicht notwendig die Simulation weiterlaufen zu lassen. Beende das Programm einfach mit System.exit(0) nach der Ausgabe.
ich darf kein system.exit benutzen. Dafür hab ich ja die boolean Variable eingeführt. Wo müsste das System.exit aber theoretisch hin ?

Ich probiere die ganze Zeit verschiedene Variationen aus, aber nichts klappt, weil das ineinader schachteln glaub ich falsch ist. Was sagst du zu dem :
Code:
public class Haircut {

    public static void main(String[] args) {

        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);
        int count = 0;
        boolean programmOn = true;

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

        }

        while (programmOn == true) {
            for (int i = 0; i < barbers.length; i++) {
                barbers[i].resetRestTime();
                if (barbers[i].getRestTime() != 0) {
                    barbers[i].reduceRestTime();
                } else {
                    count++;
                    if (count == n) {
                        System.out.println(i + 1);
                        programmOn = !programmOn;
                    }
                }
            }
        }
    }
}

Edit : Ich bin dumm und sehe wieso das nicht funktionieren kann. In jeder Schleife wird ja die Resttime resetted also kann es niemals terminieren xD
 

zDieTaschenlampe

Aktives Mitglied
So sieht es jetzt auf und es funktinoniert für die Kommandoargumente 1 und 2 aber mehr auch nicht. Aber ich versteh es net
Code:
public class Haircut {

   


 public static void main(String[] args) {

        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);
        int count = 0;
        boolean programmOn = true;

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

        }

        while (programmOn == true) {
            for (int i = 0; i < barbers.length; i++) {
                barbers[i].reduceRestTime();
                if (barbers[i].getRestTime() == 0) {
                    count++;
                    if (count == n) {
                        System.out.println(i + 1);
                        programmOn = !programmOn;
                        //break;
                    }
                }
            }
        }
    }
}
 

MoxxiManagarm

Top Contributor
Das break soll beenden nachdem Friseur 1 dich drangenommen hat und nicht die anderen Friseure noch betrachten. Die sind egal. Du betrachtest natürlich alle, solange du noch in der Warteschlange stehst. Das Programm läuft aktuell noch in eine Dauerschleife weil du restTime mit == 0 vergleichst, es sollte <= 0 sein ODER restTime wird in der Klasse Barber erstmalig auf 1 gesetzt.
 

zDieTaschenlampe

Aktives Mitglied
Das break soll beenden nachdem Friseur 1 dich drangenommen hat und nicht die anderen Friseure noch betrachten. Die sind egal. Du betrachtest natürlich alle, solange du noch in der Warteschlange stehst. Das Programm läuft aktuell noch in eine Dauerschleife weil du restTime mit == 0 vergleichst, es sollte <= 0 sein ODER restTime wird in der Klasse Barber erstmalig auf 1 gesetzt.

Wenn ich es so mache, funktioniert es fast, aber auch nur fast :
Code:
package uebungsblatt1;

public class Haircut {

    public static void main(String[] args) {

        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);
        int count = 0;
        boolean programmOn = true;

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

        }

        while (programmOn == true) {
            for (int i = 0; i < barbers.length; i++) {

                if (barbers[i].getRestTime() != 0) {
                    barbers[i].reduceRestTime();
                }

                if (barbers[i].getRestTime() == 0) {
                    count++;
                    if (count == n) {
                        System.out.println(i);
                        programmOn = !programmOn;
                        // break;
                    }
                }
            }
        }
    }
}

Die Beispielausgabe 1 und 3 aus der Aufgabe passen, aber die 2. wo es um 3 12 7 7 7 geht, kommt nicht die richtige Zahl raus -.-

Edit : Ich habs raus. Ich hab die resetRestTime methode vergessen und das break brauch ich nicht. Alles klappt jetzt . Hallelulja :) und wirklich fettes Danke an dich hahaha Es war eine sehr schwere Geburt, aber wirklich danke. Wird nicht das letzte Mal sein, dass ich hier Hilfe suchen werden, denn die Aufgaben werden schlimmer und schlimmer, aber für jetzt bin ich happy.
Danke <3
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Dein resetRestTime ist mittlerweile verloren gegangen ^^

Ich verliere ehrlich gesagt doch langsam die Lust :D Du änderst viele Dinge wieder falsch ab, obwohl du sie schon einmal richtig hattest. Ich glaube du bist mittlerweile von vielen Dingen verwirrt, aber hoffentlich nicht mehr ganz so Ansatzlos wie am Anfang. Du hast viel selbst versucht und gezielt hinterfragt, das ist lobenswert. Daher habe ich dir mal nun dein Programm korrigiert. Es ist wie unten abgebildet theoretisch vollständig. Du musst es dir nun aber nochmal anschauen und verstehen was sich zu dir unterscheidet und warum. Ordne deine Gedanken. ;) Wenn etwas nicht klar lies dir ruhig nochmal die Kommentare durch. Wie du siehst ist es insgesamt kein Hexenwerk.
(Ich habe mir erlaubt programmOn umzubenennen und nicht count zu nehmen, wiezwischenzeitlich mal besprochen).

Java:
public class Haircut {
    public static void main(String[] args) {
        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);

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

        boolean iAmStillInQueue = true;

        // jeder Durchlauf dieser Schleife stellt eine Minute dar
        while (iAmStillInQueue == true) {
            for (int i = 0; i < barbers.length; i++) {
                // jeder Friseur schneidet eine Minute lang Haare
                barbers[i].reduceRestTime();

                // der Friseur ist mit dem letzten Haarschnitt fertig, erist frei für einen neuen
                if (barbers[i].getRestTime() <= 0) {
                    // deine Warteschlangenposition verringert sich
                    n--;
                    // Friseur beginnt mit dem neuen Haarschnitt
                    barbers[i].resetRestTime();

                    // du warst der letzte Kunde, der an die Reihe gekommen ist
                    if (n == 0) {
                        // Programm ausgeben und Simulation beenden
                        System.out.println(i + 1);
                        iAmStillInQueue = false;
                        break;
                    }
                }
            }
        }
    }
}

class Barber {
    private final int requiredTime;
    private int restTime;

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

    public int getRestTime() {
        return restTime;
    }

    public void reduceRestTime() {
        restTime--;
    }

    public void resetRestTime() {
        restTime = requiredTime;
    }
}

Die Kommentarzeilen im Code sollen dir nur nochmal zum Verständnis helfen, lass sie nicht drin




PS.: Ich fand das übrigens eine sehr schöne Übungsaufgabe.
 
Zuletzt bearbeitet:

zDieTaschenlampe

Aktives Mitglied
Dein resetRestTime ist mittlerweile verloren gegangen ^^

Ich verliere ehrlich gesagt doch langsam die Lust :D Du änderst viele Dinge wieder falsch ab, obwohl du sie schon einmal richtig hattest. Ich glaube du bist mittlerweile von vielen Dingen verwirrt, aber hoffentlich nicht mehr ganz so Ansatzlos wie am Anfang. Du hast viel selbst versucht und gezielt hinterfragt, das ist lobenswert. Daher habe ich dir mal nun dein Programm korrigiert. Es ist wie unten abgebildet theoretisch vollständig. Du musst es dir nun aber nochmal anschauen und verstehen was sich zu dir unterscheidet und warum. Ordne deine Gedanken. ;) Wenn etwas nicht klar lies dir ruhig nochmal die Kommentare durch. Wie du siehst ist es insgesamt kein Hexenwerk.
(Ich habe mir erlaubt programmOn umzubenennen und nicht count zu nehmen, wiezwischenzeitlich mal besprochen).

Java:
public class Haircut {
    public static void main(String[] args) {
        int b = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);

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

        boolean iAmStillInQueue = true;

        // jeder Durchlauf dieser Schleife stellt eine Minute dar
        while (iAmStillInQueue == true) {
            for (int i = 0; i < barbers.length; i++) {
                // jeder Friseur schneidet eine Minute lang Haare
                barbers[i].reduceRestTime();

                // der Friseur ist mit dem letzten Haarschnitt fertig, erist frei für einen neuen
                if (barbers[i].getRestTime() <= 0) {
                    // deine Warteschlangenposition verringert sich
                    n--;
                    // Friseur beginnt mit dem neuen Haarschnitt
                    barbers[i].resetRestTime();

                    // du warst der letzte Kunde, der an die Reihe gekommen ist
                    if (n == 0) {
                        // Programm ausgeben und Simulation beenden
                        System.out.println(i + 1);
                        iAmStillInQueue = false;
                        break;
                    }
                }
            }
        }
    }
}

class Barber {
    private final int requiredTime;
    private int restTime;

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

    public int getRestTime() {
        return restTime;
    }

    public void reduceRestTime() {
        restTime--;
    }

    public void resetRestTime() {
        restTime = requiredTime;
    }
}

Die Kommentarzeilen im Code sollen dir nur nochmal zum Verständnis helfen, lass sie nicht drin




PS.: Ich fand das übrigens eine sehr schöne Übungsaufgabe.

Hast du meinen bearbeiteten Kommentar vor deinem hier noch gelesen ? Wenn nicht, dann bist du nachdem du es jetzt tust, bestimmt stolz haha Ob du es mir glaubst oder nicht, ich hab all das, was du jetzt im letzten Beitrag von dir angesprochen hast, doch noch selbst geschafft und umgesetzt. Aber trotzdem Danke, dass du mich nicht aufgegeben hast. Die resetMethode die ich vergessen hatte, war der Key zum Ende, aber naja wie gesagt schwere Geburt

Ich mochte die Aufgabe nicht, weil die Modellierung nicht vorgegeben oder beschrieben war, aber ich versteh wieso du sie magst xD
 

MoxxiManagarm

Top Contributor
Nein den edit hatte ich vor meinem letzten Beitrag nicht gesehen. Bin stolz auf dich. Modellieren musst du können, aber auch ein Bildhauer kann nicht von heute auf morgen Skulpturen meißeln. Bleib dran, dann klappt's rirgendwann
 

Ähnliche Java Themen

Neue Themen


Oben