Modellieren Haareschneiden

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

MoxxiManagarm

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

zDieTaschenlampe

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
 
Z

zDieTaschenlampe

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++) {

            }
        }
 
Z

zDieTaschenlampe

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

MoxxiManagarm

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.
 
Z

zDieTaschenlampe

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 ?
 
Z

zDieTaschenlampe

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 ?
 
Z

zDieTaschenlampe

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 
                }
            }
        }
    }
}
 
Z

zDieTaschenlampe

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

MoxxiManagarm

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.
 
Z

zDieTaschenlampe

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

MoxxiManagarm

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

zDieTaschenlampe

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

MoxxiManagarm

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--;
    }
 
Z

zDieTaschenlampe

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

MoxxiManagarm

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:
Z

zDieTaschenlampe

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

MoxxiManagarm

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;
    }
}
 
MoxxiManagarm

MoxxiManagarm

Ich check nicht wieso das Programm nicht terminieren will -.-
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.
 
Z

zDieTaschenlampe

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
 
Thema: 

Modellieren Haareschneiden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben