Habe ich schon und jetzt gehts in die Haircut Klasse, aber kann es sein, dass diese auch gleich meine Main Klasse ist oder brauch ich dafür noch eine ?Ja, also nimm den Parameter raus und reduziere die Restzeit in der Methode einfach um 1
Habe ich schon und jetzt gehts in die Haircut Klasse, aber kann es sein, dass diese auch gleich meine Main Klasse ist oder brauch ich dafür noch eine ?Ja, also nimm den Parameter raus und reduziere die Restzeit in der Methode einfach um 1
Keine Zusätzliche Klasse mehr, die Klasse Haircut bekommt die main-Methode spendiert.Habe ich schon und jetzt gehts in die Haircut Klasse, aber kann es sein, dass diese auch gleich meine Main Klasse ist oder brauch ich dafür noch eine ?
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
}
}
}
}
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]);
}
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]));
}
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])); }
int count = 0;
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 ^^
Aber wie starte ich die Schleife? bzw wie hat die auszusehen. Ich weiß immernoch nicht genau wie das mit den Zeiten ablaufen wirdIch nehme dir nichts böse. Foren fragen zu beantworten ist ein Hobby. Ich finde n dekrementieren bis 0 besser.
Mach einfach eine Dauerschleife, du beendest das Programm mit System.exit(0) wenn n 0 wird
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
}
}
}
for (int i = 0; i < barbers.length; i++) {
for (int j = 0; j < barbers[i].getRequiredTime(); j++) {
}
}
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();
}
}
}
}
}
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.Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfachwhile(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 ?Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfachwhile(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.
Ja du brauchst 2 Schleifen, eine "Zeitschleife" und eine Schleife, welche die Barber untersucht. Die Zeitschleife kann einfachwhile(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.
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
}
}
}
}
}
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 } } } } }
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.
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;
}
}
}
}
}
}
Dann zeig reduceRequiredTime nochmal. Aktuell gibst du übrigens n + 1 aus. n stellt NICHT die Nummer des Friseurs dar, sondern deine Warteschlangenposition.
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;
}
}
public void reduceRestTime() {
this.restTime--;
}
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--; }
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.
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;
}
}
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 check nicht wieso das Programm nicht terminieren will -.-
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 ?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.
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;
}
}
}
}
}
}
Achso, das ist mit neu, wusste ich noch nichtich darf kein system.exit benutzen.
Da wo du programmOn togglest.Wo müsste das System.exit aber theoretisch hin ?
Achso, das ist mit neu, wusste ich noch nicht. Dann mach aber ein break nach deinem programOn toggle.
Da wo du programmOn togglest.
Wo kommt das if-else auf einmal her x.x Vorher sahs doch gut aus
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;
}
}
}
}
}
}
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.
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;
}
}
}
}
}
}
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;
}
}
Dein resetRestTime ist mittlerweile verloren gegangen ^^
Ich verliere ehrlich gesagt doch langsam die LustDu ä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.