Weitere Informationen folgen:wink:
____----------------------------.
.
.
.
.
.
.-
.
-.
.-
.-
.-
Kann ich gerne machen. Worum geht es denn konkret?
Kann ich gerne machen. Worum geht es denn konkret?
eINE aUFGABE SCHICKE SIE IN 25 MIN
Hi,
Ich hab von NIKI keine Ahnung, sorry.
Kann ich gerne machen. Worum geht es denn konkret?
Im Gang einer lAger halle sind Paletten abgestellt. Nikki soll sp programmiert werden, dass die hohen Paletten (zwei GegenstÀnde) in rechte Regalreihe, die kleine Paletten in die Linke regaleihe einsortiert werden . Entwickle ein Programm:
____________________________________
/ / / / / / / /
/
/
°° ° °° ° ° °° °° /
(Roboter) / / / / / / / /
( ) / / / / / / / /
Kann ich gerne machen. Worum geht es denn konkret?
So. Hatte Mittagspause.
Hier die Lösung:
PROGRAM Lager_aufraeumen;
PROCEDURE drehe_um;
BEGIN
drehe_links;
drehe_links;
END;
PROCEDURE drehe_rechts;
BEGIN
drehe_links;
drehe_links;
drehe_links;
END;
PROCEDURE Links_ablegen;
BEGIN
drehe_links;
vor;
WHILE hat_Vorrat DO gib_ab;
drehe_um;
vor;
drehe_links;
END;
PROCEDURE Rechts_ablegen;
BEGIN
drehe_rechts;
vor;
WHILE hat_Vorrat DO gib_ab;
drehe_um;
vor;
drehe_rechts;
END;
BEGIN
vor;
WHILE Platz_belegt DO
BEGIN
nimm_auf;
IF Platz_belegt THEN
BEGIN
nimm_auf;
Rechts_ablegen;
END
ELSE
Links_ablegen;
vor;
END;
END.
Kann ich gerne machen. Worum geht es denn konkret?
Ich habe noch gesehen, dass der Nikki nicht am Beginn der Reihe steht. Also fehlte in der ersten Lösung noch eine Routine, damit er zum Startpunkt geht:
PROGRAM Lager_aufraeumen;
PROCEDURE drehe_um;
BEGIN
drehe_links;
drehe_links;
END;
PROCEDURE drehe_rechts;
BEGIN
drehe_links;
drehe_links;
drehe_links;
END;
PROCEDURE Links_ablegen;
BEGIN
drehe_links;
vor;
WHILE hat_Vorrat DO gib_ab;
drehe_um;
vor;
drehe_links;
END;
PROCEDURE Rechts_ablegen;
BEGIN
drehe_rechts;
vor;
WHILE hat_Vorrat DO gib_ab;
drehe_um;
vor;
drehe_rechts;
END;
PROCEDURE Anfang_finden;
BEGIN
WHILE vorne_frei DO vor;
drehe_links;
vor;
drehe_rechts;
vor;
END;
BEGIN
Anfang_finden;
vor;
WHILE Platz_belegt DO
BEGIN
nimm_auf;
IF Platz_belegt THEN
BEGIN
nimm_auf;
Rechts_ablegen;
END
ELSE
Links_ablegen;
vor;
END;
END.
Kann ich gerne machen. Worum geht es denn konkret?
ErgĂ€nzung: Der Befehl âvor;â nach dem Aufruf von âAnfang_findenâ im Hauptprogramm muss noch raus.
Welche Information(en) benötigen Sie?
warum geht das z.B nicht?
PROGRAM danke fĂŒr die vorherige Hilfe;
BEGIN
vor;
vor;
if platz_belegt then drehe_links;
vor;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_belegt then nimm_auf;
drehe_links;
drehe_links;
drehe_links;
vor;
if platz_frei then gib_ab;
drehe_um;
vor;
drehe_links;
drehe_links;
drehe_links;
abschalten;
end;
END
warum geht das z.B nicht?
âŠ
Dein Vorschlag enthÀlt einen entscheidenden Fehler, denn Nikki soll ja in AbhÀngigkeit der Belegung eines Feldes entscheiden, ob der Inhalt nach links oder nach rechts abgelegt werden soll.
Wenn auf einem Feld zwei Container stehen, muss er natĂŒrlich auch zwei aufnehmen, bevor er beide dann rechts ablegt. Die Aufgabenstellung impliziert, dass nicht unbedingt von vornherein feststeht, auf welchem Feld welche Anzahl Container stehen.
AuĂerdem fehlt in deinem Code die Prozedur âdrehe_umâ, die nicht zum Sprachumfang gehört und also von dir selbst deklariert werden muss.
Die Verwendung von Prozeduren hat den Vorteil, dass gleichartige Aufgaben, die mehrmals benötigt werden, nur einmal programmiert und geprĂŒft werden mĂŒssen.
Wenn z.B. die Prozedur âdrehe_rechtsâ einmal geschrieben ist und funktioniert, kann man sie beliebig oft einsetzen und kann davon ausgehen, dass sie an jeder Stelle des Programms fehlerfrei funktioniert.
Ein zweiter Aspekt, neben der Vermeidung von Fehlern, ist der geringere Aufwand beim Schreiben des Programms.
drehe_rechts;
schreibt sich erheblich schneller, als
drehe_links;
drehe_links;
drehe_links;
Hinzu kommt die bessere Ăbersichtlichkeit des Quellcodes.
In der Informatik fĂŒhren immer viele Wege nach Rom. Aber einen guten Informatiker zeichnet effizienter und zugleich gut lesbarer Code aus.
Zu meiner Lösung gelangt man durch eine einfache Form der Anforderungsanalyse. Dazu habe ich die gestellte Aufgabe in kleinere und leichter ĂŒberschaubare Unteraufgaben aufgeteilt.
Offenbar sollen Container, die Nikki aufgenommen hat, entweder links oder rechts abgelegt werden. AuĂerdem wĂ€re es praktisch, wenn er danach zum Ausgangspunkt zurĂŒckkehrt, damit er mit dem nĂ€chsten Arbeitsschritt weitermachen kann.
In den Unteraufgaben âLinks_ablegenâ und âRechts_ablegenâ ist jeweils das Umdrehen von Nikki erforderlich, was also als weitere Teilaufgabe abgegrenzt werden kann.
Zur besseren Lesbarkeit des Hauptprogramms wird die Bewegung zum Startpunkt als Prozedur geschrieben.
Das Hauptprogramm ĂŒbernimmt die grundlegende Ablaufsteuerung, wozu auch die Entscheidung gehört, wenn nach der Aufnahme eines Containers auf dem aktuellen Feld noch ein weiterer Container vorhanden ist, die Entscheidung fĂ€llt, ihn ebenfalls aufzunehmen und beide dann rechts abzulegen und ansonsten den einen bereits aufgenommenen Container links abzulegen.
Durch das Schreiben der beiden ââŠ_ablegenâ-Prozeduren, brauche ich mir im Hauptprogramm um die Details des Ablegens keine Gedanken mehr zu machen und kann nach dem Ablegen Nikki einfach einen Schritt weiter vor gehen lassen, zum nĂ€chsten Feld, bis keine Container mehr zu finden sind.
Fazit:
Strukturierte modulare Programmierung (so nennt man diese Vorgehensweise) fĂŒhrt zu Quellcode, der leichter gepflegt werden kann und weniger fĂŒr Fehler anfĂ€llig ist, als so genannter âSpaghetti-Codeâ (alles ist einfach hintereinander weg programmiert), der zwar zunĂ€chst schnell zum Ziel zu fĂŒhren scheint, aber fehleranfĂ€llig, schwer zu lesen und sehr unflexibel ist.
Pascal ist eine der ersten âmodularenâ Programmiersprachen gewesen. Die allererste hieĂ treffenderweise âModulaâ. In der weiteren Entwicklung der Programmiersprachen kam zum modularen Prinzip spĂ€ter noch die Objektorientierung als nĂ€chster grundlegender Meilenstein hinzu. Ăhnlich, wie bei der modularen Programmierweise ein anderer Analyseansatz fĂŒr die Lösung von Aufgaben/Problemen erforderlich ist, als beim âSpaghetti-Codeâ, wurden mit der EinfĂŒhrung der objektorientierten Programmierung wiederum ganz neue Vorgehensweisen in der Analyse erforderlich.
Alle diese Weiterentwickungen von Programmiersprachen hatten jeweils zum Ziel, die Lösung immer komplexerer Aufgaben zu ermöglichen und zugleich den Quellcode trotzdem ĂŒbersichtlich und handhabbar zu erhalten.
Ein âgutesâ Programm benötigt fĂŒr eine Aufgabenstellung den kleinstmöglichen Quellcode, der zugelich die Laufzeit (also Performance) des Programms nicht beeintrĂ€chtigt.
Sorry fĂŒr den kleinen Exkurs. Hatte gerade Lust dazu und ich hoffe, ich konnte dir ein wenig weiterhelfen.
GruĂ
Robert
Also wenn es hier schon einmal um ein Problem mit Niki geht, kommt gleich meine Frage.
Bin nÀmlich blutiger AnfÀnger
Aufgabe:
In der ersten Zeile sind in unregelmĂ€Ăigen AbstĂ€nden solche âKugelnâ verteilt. Niki soll dort, wo keine sind welche ablegen & auĂerdem sollen wir viel mit âWhile,âŠâ und âIfâŠâ arbeiten. Also nicht âvor,vor, gib_ab,âŠâ
WĂ€re sehr nett.
Also wenn es hier schon einmal um ein Niki geht, kommt gleich meine Frage.
Bin nÀmlich blutiger AnfÀnger
In der ersten Zeile sind in unregelmĂ€Ăigen AbstĂ€nden solche âKugelnâ verteilt. Niki soll dort, wo keine sind welche ablegen & auĂerdem sollen wir viel mit âWhile,âŠâ und âIfâŠâ arbeiten. Also nicht âvor,vor, gib_ab,âŠâ