Hamstersimulator? SEW?
Schreibe ein Programm, bei dem der Hamster ein Rechteck ausfüllt. Er startet dazu in der linken oberen Ecke nach rechts schauend. Lass dir vom Benutzer die Breite und die Höhe des Rechtecks eingeben und übrprüfe, ob sich das Rechteck im Territorium ausgeht. Falls zu große Werte eingegeben wurden, soll der Hamster das Rechteck so groß wie möglich legen. Es gibt prinzipiell mehrere Möglichkeiten an die Aufgabe heranzugehen. Wähle eine davon und gib die Lösung ab.
So soll es ungefähr ausschauen ich über mich schon Stunden daran schaffe es aber nicht kann mir wer helfen?
LG. Finn F
3 Antworten
![](https://images.gutefrage.net/media/user/regex9/1455660989427_nmmslarge__0_13_270_270_615d5a3bc6888f4c1486ce2b4d9d8f60.png?v=1455660989000)
Ein erster Tipp von mir für einen künftigen Programmierstil: Fasse Zeilen zusammen, bei denen es unnötig ist, sie aufzusplitten. Konkret meine ich Definitionen und Deklarationen:
// to looooonngg ...
int breite;
// ...
breite = 0;
// better
int breite = 0;
Eine Variable sollte nach Möglichkeit erst dann eingeführt werden, wenn sie spätestens benötigt wird. Damit reduziert sich die Zeilenanzahl und die Variable rutscht näher an ihren Einsatzort. Es ist einfacher zu lesen.
Ein zweiter Tipp: Vermeide Umlaute / Sonderzeichen in Bezeichnern. Statt höhe heißt es dann hoehe. So sparst du mögliche Encoding-Probleme aus. Nach Java-Konvention werden Bezeichner, die aus mehreren Wörtern bestehen, in kamelHoeckerSchreibweise geschrieben.
Ein dritter Tipp: Schreibe Kommentar in der Zeile über der Zeile, die du kommentieren möchtest. Dahinter verbreitert die Spaltenzahl und nötigt den Leser womöglich, horizontal scrollen zu müssen.
Damit ergibt sich erst einmal folgender Code:
void main() {
int breite = liesZahl("Wie breit ist das Rechteck?");
// Wenn der Benutzer eine zu große Breite eingibt dann korrigieren wir die Breite auf die des Territoriums
if (breite > 10) {
breite = 10;
}
int hoehe = liesZahl("Wie hoch ist das Rechteck?");
// Wenn der Benutzer eine zu große Hoehe eingibt dann korrigieren wir die Hoehe auf die des Territoriums
if (hoehe > 6) {
hoehe = 6;
}
for (int reihen = 0; reihen < hoehe; ++reihen) {
gib();
vor();
// Reihe erledigen = breite gehen mit Körner ablegen
}
linksUm();
linksUm();
while (vornFrei() == true) {
vor();
}
for (int schritte = 2; schritte < breite; ++schritte) {
linksUm();
vor();
linksUm();
}
}
Hilfe bei der Logik:
So, deinem Bild nach würde der Hamster ja nun jede Reihe zweimal ablaufen. Einmal von links nach rechts und dann wieder zurück. Ich halte das für unnötigen Aufwand, am Ende einer Reihe könnte er doch gleich einen Schritt hinunter, in die nächste Reihe tun.
Neben der Schleife, mit der du die einzelnen Spalten abwanderst, wäre es zum einen praktisch, eine Schaltervariable zu haben, die je Reihe die Richtung beeinflusst. Bei einer ungeraden Zeile dreht sich er Hamster zuletzt nach rechts. Bei einer geraden Zeile dreht er sich am Ende nach links.
laufe bis zeilenende
wenn gerade zelle
drehe nach links
sonst
rechts
ein schritt vor (in die naechste reihe; sofern moeglich)
Nun besteht bei diesem Algorithmus jedoch noch das Problem, dass der Hamster an dieser Stelle erst einmal nur eine Reihe abwandern würde, obwohl noch andere auf ihn warten. Das heißt, dieser gesamte Ablauf müsste mehrmals wiederholt werden, mit Beschränkung auf die Höhe / Reihenanzahl, die der Nutzer zuvor festgelegt hat. Dieser Tipp sollte dir zunächst einmal reichen.
![](https://images.gutefrage.net/media/user/SchwarzHarrier/1493969340376_nmmslarge__84_0_276_276_ad1503275ed74dac813ba3ee8ebc9a54.jpg?v=1493969340000)
Du machst eine If-Abfrage... Falls der Wert zu groß ist, setzt du die Eigenschaft des Feldes... Z.b. Das Feld ist 6 breit, du als User gibts 120 ein und durch die if-Abfrage wird dann der Wert des Feldes, also 6, verwendet
![](https://images.gutefrage.net/media/user/HellasPlanitia/1444746240_nmmslarge.jpg?v=1444746240000)
Zeig, was du bisher hast und welcher Teil nicht funktioniert, dann kann man dir helfen. Keiner wird dir hier aber ein komplettes Programm schreiben. Das geht auch gar nicht, zumal du noch nicht mal angibst, in welcher Sprache du programmieren sollst, welches Framework du verwendest usw.
![](https://images.gutefrage.net/media/user/HellasPlanitia/1444746240_nmmslarge.jpg?v=1444746240000)
Okay. Und was fehlt noch/geht nicht? Was passiert stattdessen?
void main() {
int breite;
int höhe;
int anzahlmal;
int schritte;
int reihen;
reihen = 0;
breite = 0;
höhe = 0;
breite = liesZahl("Wie breit ist das Rechteck?");
höhe = liesZahl("Wie hoch ist das Rechteck?");
if(breite > 10) { //Wenn der Benutzer eine zu große breite eingibt dann korrigieren wir die breite auf die des Terretoriums
breite=10;
}
if(höhe > 6) { // //Wenn der Benutzer eine zu große höhe eingibt dann korrigieren wir die höhe auf die des Terretoriums
höhe=6;
}
// schleife über die Höhe
for(reihen=0;reihen<höhe;reihen++) {
gib();
vor();
//reihe erledigen = breite gehen mit Körner ablegen
}
linksUm();
linksUm();
while(vornFrei() == true) {
vor();
}
for(schritte=2;schritte<breite;schritte++) {
linksUm();
vor();
linksUm();
}
}