|
Computerorientierte Mathematik |
![]() |
|
Inhalt
|
Mailarchiv zur Computerorientierte Mathematik IHier stehen alle Emails, die von uns an alle CoMa-Gruppen gleichzeitig geschickt wurden. Es handelt sich dabei im Wesentlichen um Ankündigungen, Aufgabenhinweise und -korrekturen. Das gibt Euch die Möglichkeit, den Inhalt versehentlich von Euch gelöschter Emails (erneut) zu lesen. Inhalt
EmailsFrom: baier@math.tu-berlin.de Date: Subject: Zu Aufgabe 3
Hallo liebe CoMa I Teilnehmer,
die dritte Aufgabe des ersten Uebungsblattes besteht darin, auf diese
Email per "reply" (Taste R in pine) zu antworten, wobei
a) ihr diese Originalmail mit einfuegt
(einfach die Frage "Include original message in Reply?" mit Y beantworten)
und
b) Ihr unter den mit "> " markierten Text die Zeile aus der Ausgabe des
Befehls rusers kopiert, die fuer Euren aktuellen Rechner steht. Wie das
geht, wird gleich erklaert.
Abschicken (mit CONTROL x) nicht vergessen!
Wie geht das mit dem Kopieren?
Fuehrt in einem anderen xterm als dem, in dem gerade dieser pine laeuft,
einmal das Kommando rusers aus. Es wird angezeigt, wer gerade auf welchem
Rechner eingeloggt ist (gut zu wissen, ob Freunde gerade da sind...).
Eine Zeile steht dabei auch fuer den Rechner, an dem Ihr gerade sitzt.
Insbesondere steht da dann auch mindestens Euer Name co1-1xx.
Jetzt fahrt bei gedrueckter LINKER MAUSTASTE einmal von links nach rechts
ueber diese Zeile. Sie wird schwarz gefaerbt. [*]
Jetzt bewegt Ihr die Maus wieder in das Fenster von pine (Maustaste
vorher loslassen), und zwar an die Stelle unter dem zitierten Text,
und drueckt einmal kurz die MITTLERE MAUSTASTE. Voila, der Text ist
kopiert.
Jetzt koennt Ihr noch ein paar nette Worte dazuschreiben -- wenn Ihr
wollt -- und abschicken.
[*] Fussnote: Eventuell passte die ganze Liste nicht in das Fenster.
Dann vergroessert es oder benutzt den "Scrollbalken" am linken Rand
(Bedienung ist gewoehnungsbeduerftig: Klick (im Scrollbalken!) auf
linke oder rechte Maustaste bewegt den Fensterinhalt ein Stueck hoch
bzw. runter. Klick auf die mittlere Maustaste (Vorsicht: Nicht ins
Fensterinnere rutschen -- da wird so ja eingefuegt!) stellt den
Scrollbalken auf die gewuenschte Position.
Oder Ihr erinnert Euch an die Uebung und benutzt das pipe-Kommando
zusammen mit dem less-Kommando um die Ausgabe von rusers umzuleiten.
Gruss
Eure CoMa-Betreuer
From: liebchen@math.tu-berlin.de Date: Subject: .java, .class, .html
Liebe Comas,
gestern ist mir in der Uebung noch eine Sache durch
die Lappen gegangen: Wir haben zwar darueber gesprochen,
wie der Java-Quellcode auszusehen hat, aber der Schritt
zu Ausfuehrbarem blieb im Detail noch aus.
Daher hier eine Skizze:
1.) Ihr fertigt in einem Texteditor (emacs) euren
Quellcode an und speichert diesen in einer Datei,
die genauso anfaengt wie euer Klassenname und
auf .java endet (SumWhile.java).
2.) Entweder ihr nutzt die von Georg vorgestellten
Faehigkeiten des emacs, oder ihr tippt in einem
xterm-Fenster
javac SumWhile.java
Das ist der Schritt, wo das interpretierbare
class-File erstellt wird.
3.) Damit euer Applet in einem Browser angezeigt und
ausgefuehrt werden kann, muss es in seiner Sprache
bekannt gemacht werden, dies ist html (hypertext
markup language).
Ihr erstellt in einer weiteren Textdatei, die
SumWhile.html
heissen sollte (aber nicht muss), Zeilen wie
<html>
<body
<applet code=SumWhile.class width=300 height=200></applet>
</body>
</html>
Nachzulesen durch Klick auf eines der Applets der
Coma-Homepage, und dann in netscape Menue
View -> Page Source.
4.) Dann koennt ihr in einem weiteren xterm die Zeile
appletviewer SumWhile.html
tippen und die in dieser html-Datei genannte class-
Datei wird als Applet ausgefuehrt.
Probleme kann dabei der Punkt (2) machen, wenn ihr euch
irgendwo vertippt hat. Aber nicht verzagen!
Christian
From: liebchen@math.tu-berlin.de Date: Subject: Applets im Abseits Liebe Comas, da beim Zusammenspiel zwischen XServer, WindowManager und appletviewer immer noch das Problem besteht, dass ein neu geöffnetes Applet "ins Abseits" gestellt wird, hier ein Tipp, wie ihr das Applet "einfangen" könnt. Fahrt mit der Maus auf die untere oder rechte Rahmenkante des Appletviewers. Dort angekommen drückt ihr dann eine Maustaste, ich glaube die mittlere. In jedem Fall soll dann ein so genanntes Kontextmenü aufgehen und wenn ihr dort ei- nen Eintrag mit dem Namen Move seht, dann klickt einmal mit der linken Maustaste drauf. Und schon folgt das Applet eurer Maus, bis ihr es habt, wo ihr es haben wollt. Dann drückt ihr einfach noch einmal die linke Maustaste und es kann losgehen! Christian From: fest@math.tu-berlin.de Date: Subject: Ergänzungen zur Übung: Layouts
Liebe CoMa-Studenten,
in der gestrigen Übung kamen einige Fragen zu den Layouts auf, die ich
leider zunächst unbeantwortet lassen musste. Ich hoffe, ich kann die
Fragen jetzt beantworten.
1. Wenn ich bei einem GridLayout Felder frei lassen will, was muß ich
dann tun?
Ich hatte gesagt, man könne einfach
add(null;)
eingeben. Dies führt jedoch zu Compiler-Fehlern. Richtig geht es,
in dem man ein leeres Panel einfügt:
add( new Panel() );
Nicht sehr elegant, aber es funktioniert...
2. Kann ich beim GridLayout ein Element an eine bestimmte Stelle
packen oder geht es immer nur hinter das letzte ?
Ein klares "Jein"!
Also man kann nicht sagen, wenn noch nichts da ist, packe das
Element an Position (3,2). Das geht leider nicht!
Der Grund ist folgender:
Die Elemente, die mit add eingefügt wurden, werden in einer Liste
(was das genau ist, kommt erst später in der CoMa, aber man kann
sich das wie eine Warteschlange vorstellen) gespeichert, ohne das
die Position auf dem Bildschirm irgendwie festgelegt wird. Erst
wenn das Applet gezeichnet wird, wird geguckt, welches Layout
genommen werden soll, und bei GridLayout werden dann die Felder
Zeilenweise mit den Elementen der Liste gefüllt.
Man kann jedoch in diese Liste zwischen zwei vorhandenen Positionen
ein weiteres Element einfügen mit
add(new Button("neu!"), pos);
wobei pos eine int-Zahl ist und die position in der Liste angibt,
an die das Element soll (funktioniert also wie Vordrängeln).
3. Kann man Elemente Nachträglich austauschen?
Ja, wenn man die Position in der Liste weiß oder ein Element in
einer Variablen gespeichert hat, kann man das Element mit
remove(pos);
oder mit
remove(elementName);
löschen und dann mit
add(neuesElement,pos);
ein anderes Einfügen.
Das sollte allerdings nur selten nötig sein, da man meist nur den
Inhalt eines Elements ändern will, und das geht mit
element.setText("neuer Text");
und ähnlichen Methoden einfacher und besser!
4. Was passiert, wenn ich ein GridLayout mit 3 Zeilen und 4 Spalten
angelegt habe, und ich füge mit add ein dreizehntes Element hinzu?
Das bringt - trotz 13 - kein Unglück! Das Layout wird einfach um
eine Spalte erweitert, was allerdings zur Folge hat, dass die
Elemente umgeordnet werden und so eventuell einige Elemente in
höhere Zeilen rutschen.
Das ist ein unschöner Nebeneffekt des Prinzips, die Elemente in
einer Liste zu halten und dann das Layout in der Reihenfolge der
Liste neu aufzufüllen.
Okay, ich glaube, das waren alle Fragen zum Layout, die gestern
aufkamen.
Ich hoffe, es ist soweit klar geworden. Wenn ihr Aufgabe 10 vom
3.Übungsblatt am Rechner ausprobiert, nutzt die Gelegenheit und spielt
ein wenig mit den Layouts rum, probiert einfach alles mögliche aus.
Viel Spaß
Andreas
From: fest@math.tu-berlin.de Date: Subject: neu: Email-Archiv Hallo @GROUP@, es kann immer mal passieren, dass Ihr aus Versehen in pine (oder einem anderen Emailprogramm) eine gelesene oder ungelesene Email loescht. Da wir glauben, dass unsere Rundschreiben an Euch natuerlich ganz besonders wichtig sind, legen wir sie deshalb noch extra im CoMa-Mailarchiv unter <WWWLink href="">http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/Mailarchive.html"> http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/Mailarchive.html</WWWLink> ab. Falls Ihr also eine Email mit den neuesten Hinweisen zur Hausaufgabe geloescht habt, koennt Ihr sie dort nachlesen. Gruss Andreas P.S.: Emails, die nur an EINE Gruppe von Euch gehen (Antworten auf erhaltene Emails etwa), werden dort nicht gespeichert. From: fest@math.tu-berlin.de Date: Subject: Programmier-Richtlinien Hallo @GROUP@, wenn ihr uns eure Programme vorführen wollt, achtet bitte schon vor der Programmabnahme darauf, dass ihr die Programmierregeln eingehalten habt, die unter <WWWLink href="">http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/styleguide.html"> http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/styleguide.html </WWWLink> nachzulesen sind. Ab der Programmieraufgabe vom 4. Übungsblatt werden keine Programme mehr abgenommen, die diese Richtlinien nicht einhalten! Noch ein kleiner Hinweis, wenn ihr den StringTokenizer verwenden wollt: Vergeßt nicht das entsprechende Package in euer Applet zu importieren: import java.util.StringTokenizer; Ein schönes Wochenende wünscht euer CoMaI-Team From: baier@math.tu-berlin.de Date: Subject: XEmacs
Liebe Gruppe @GROUP@,
wiederholt mu{\ss}te ich mit ansehen, dass manche mehrere Versionen des
XEmacs starten. Dabei reicht eine aus. Daf\"ur gab es dann verschiedene
Gr\"unde. Unter anderem wollten manche sich von einem xterm aus eine
Datei ansehen und diese vielleicht auch \"andern. Nun denn, hier eine
L\"osungsm\"oglichkeit.
1) Ihr schreibt eine Datei ".emacs" (der Punkt vor dem Dateinamen ist
wichtig!) Wenn Ihr diese Datei schon vorfindet (k\"onnte passieren, wenn
man Optionen gespeichert hat), so \"andert Ihr sie nur ab.
In diese Datei schreibt Ihr (am Anfang) folgende neue Zeile:
(gnuserv-start)
Genau so, mit diesen Klammern.
2) Jetzt verlasst Ihr den XEmacs und startet ihn neu.
3) Was kann der XEmacs jetzt mehr als vorher? Nun ihr lasst i m m e r
einen XEmacs laufen (z.B. einen nach dem einloggen starten und nicht
wieder verlassen). Jetzt k\"onnt Ihr von einem beliebigen xterm aus den
XEmacs dazubewegen, dass er ein neues Frame (Fester) \"offnet. Statt
xemacs dateiname
schreibt Ihr einfach:
gnuclient dateiname
z.B.: gnuclient hallo
Dann bekommt Ihr von dem schon laufenden (!) XEmacs ein neues Frame in
dem die Datei hallo angezeigt wird (falls sie existiert sonst leeres
Fenster).
Wenn Ihr mit dem Lesen oder Editieren fertig seid, so verlasst Ihr den
XEmacs nicht mit C-x C-c sondern mit:
C-x #
Denn Ihr wollt ja nur das neue Frame schlie{\ss}en und nicht den ganzen
XEmacs.
4) F\"ur Spezialisten: Wer auch in Anderen Programmen einen Editor
verwendet (z.B. in pine), der kann diese Art des Aufrufs vom XEmacs
auch dort einrichten. Dazu schreibt Ihr in die Datei ".cshrc" die
zus\"atzliche Zeile:
setenv EDITOR gnuclient
Alle Programme, die diese Umgebungsvariable bentuzen, um einen Editor
aufzurufen werden nun statt des emacs (war die Voreinstellung) ein
neues Frame vom laufenden XEmacs anfordern. Das geht nat\"urlich
schneller. Wer seinen pine umstellen will, der muss noch im Setup-Menu
den Editor \"andern.
Viel Spa{\ss},
Georg
From: fest@math.tu-berlin.de Date: Subject: Gruppenänderungswünsche
Hallo \@GROUP\@,
da sich entsprechenden Fragen langsam häufen, hier unsere aktuelle,
offizielle Regelung zum Thema "Ich will in eine andere Gruppe":
Solang Gruppen noch aus mehr als zwei Mitgliedern bestehen, kann ein
Wechsel erst nach der Klausur und Aufgabenblatt 7 erfolgen.
Dann wird es eine größere Gruppenumsortierung geben, bei der
evtl. Wünsche berücksichtigt werden, solange sich diese nicht
wiedersprechen.
Ausnahme:
Zwei Zweiergruppen mit etwa gleichen Programmierkenntnissen und
unproblematischem Punktestand können auch jetzt schon "fusionieren",
wenn
- es uns bereits bekannt ist, dass es sich um Zweiergruppen handelt und
- uns beide Gruppen Bescheid geben, dass sie mit der jeweils anderen
Gruppe zusammenarbeiten möchten.
In diesem Fall erhalten beide Gruppen eine gemeinsame Gruppennummer
(jeweils die kleinere), und entsprechend einen gemeinsamen Account im
Unix-Pool.
Alles weitere bezüglich der großen Gruppen-Umräum-Aktion erfahrt ihr dann
noch rechtzeitig von mir.
Bis dahin viel Spaß bei der CoMa
Andreas
From: liebchen@math.tu-berlin.de Date: Subject: Noch ein Stack!
Liebe Gruppe @GROUP@,
nach euren zahlreichen Fragen zu Stacks, wie beispiels-
weise
"aber ein Stack ist doch eine dynamische
Datenstruktur - warum muss ich denn da
eine Größe vorgeben?"
habe ich mir ein Herz gefasst und eine andere Stack-Klasse
geschrieben. Diese kann nun wie es sich für einen ordent-
lichen Stack gehört dynamisch wachsen und weiterhin direkt
mit double-Werten arbeiten. Zu haben ist auch diese unter
der URL
http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/program5/index.html#Stack
Gutes Gelingen!
Christian
From: liebchen@math.tu-berlin.de Date: Subject: Musterlösung zu Aufgabe 17 Liebe Gruppe @GROUP@, da es bei den theoretischen Aufgaben des 5. Übungsblattes sehr viele Lösungsvorschläge gab, die "nicht sehr nah" an dem waren, was wir uns so vorgestellt haben, habe ich eine Musterlösung der Aufgabe 17 aufgeschrieben. Seht euch ganz in Ruhe an, wie die Schleifeninvariante formuliert ist, und wie ihre Korrektheit unter Hinweis auf den Programmcode mittels vollständiger Induktion nachgewiesen wird. Für viele von euch mag es ungewohnt sein, aber es handelt sich in der Tat um eine vollständige Induktion, obwohl gar kein Summen- zeichen auftritt... Ach so, das ganze könnt ihr unter der URL http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/uebung5_muster.html einsehen. Viel Spaß beim Schmökern! Christian From: baier@math.tu-berlin.de Date: Subject: Homepage Liebe @GROUP@, mit etwas Verspätung sind jetzt von der letzten Woche der Vokabeltrainer und das 8. Übungsblatt auf der Homepage verfügbar. Viel Spaß, Georg From: liebchen@math.tu-berlin.de Date: Subject: Zuckerbrot und Peitsche! Liebe Comas, zuerst die gute Nachricht: Ihr könnt ab sofort die Modalitäten unserer Klausur einsehen! Auf der Coma-Homepage befindet sich ein entsprechender Hyperlink auf das Deckblatt der Klausur. So habt ihr morgen die drei Minuten mehr Zeit zur Lösung der Aufgaben, die ihr jetzt zum Lesen - und beherzigen! - der beiden eingebauten Spezialitäten benötigt. Jetzt die schlechte Nachricht: Im Prinzip ist keiner zufrieden mit den bei der Rechnerbetreuung auflaufenden Wartezeiten. Insbesondere das Überziehen um zuletzt mehr als 70(!) Minuten ist unserer Ansicht nach darauf zurück zu führen, dass sich nicht selten bis kurz vor Ende der betreuten Rechnerzeit kaum eine Gruppe bei uns meldet, aber fünf Minuten vor dem Ende urplötzlich zehn Gruppen einfällt, dass sie noch ein Programm abzugeben haben. Daher gilt ab sofort folgende Regelung: Wer sich bei uns in einer betreuten Rechnerzeit nicht spätestens 30 Minuten vor deren Ende anmeldet, wird keinen Anspruch mehr darauf haben, dass wir noch zu ihm kommen. Nur so glauben wir, gegen Ende einen hinreichenden Überblick zu haben, wie viel Zeit wir noch bei jeder Gruppe ver- bringen können, um wenigstens c.t. alle abgearbeitet zu haben. Für andere Vorschläge von eurer Seite sind wir natürlich immer offen!!! Diese Regelung bedeutet insbesondere an Montagen, an denen ent- weder die reguläre Bearbeitungszeit oder die Nachbearbeitungs- zeit abläuft, dass eine Anmeldung nach 12:30:00 keine frist- gerechte Abnahme mehr garantiert! Wenn natürlich ansonsten nichts los ist, werden wir auch noch die sich bis zur vollen Stunde anmeldenden Gruppen besuchen. Christian From: liebchen@math.tu-berlin.de Date: Subject: Zwei Extras zu Weihnachten! Liebe Gruppe @GROUP@, so kurz vor Weihnachten haben auch wir noch ein kleines Geschenk für euch. Um genau zu sein, sogar zwei. Und es ist doch immer gut etwas mehr zu haben, oder? Finden wir auch! Und deshalb haben die Programmierrichtlinien jetzt noch zwei Punkte mehr erhalten. Im Grunde geht es nur darum, dass Exceptions - wie es der Name suggeriert - in der Tat die Ausnahme bleiben sollten. http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/styleguide.html Zwar eröffnen Exceptions Möglichkeiten, die sich nicht über return abbilden lassen. Beispielsweise kann ein Kon- struktur sein Fehlschlagen nur durch den Wurf einer Exception explizit mitteilen. (Wo wir gerade bei Konstruktoren wären: Da an den beiden Stellen der Klausur, wo diese ins Spiel kamen, so einiges angebrannt ist, bei dieser Gelegenheit noch drei hyperlinks: The Java Tutorial - originäre Erklärungen von Sun [english] http://java.sun.com/docs/books/tutorial/java/data/objectcreation.html#instantiating Java-Einführung - Erklärungsversuch in deutsch http://www-pool.math.tu-berlin.de/doc/Java/jein1.html#object The Java Language Specification - Fakten, Fakten, Fakten [english] http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#41652) Wo waren wir? Ach ja. Bei den Programmen, die ihr bislang implementiert habt, sind Benutzereingaben eine externe Fehler- quelle, um die herum mit Exceptions gearbeitet werden sollte. Aber wenn ihr mit einem Stack arbeitet, dann könnt ihr vor jedem top() bzw. pop() einmal isEmpty() fragen und könnt dann sicher gehen, dass keine Exception kommen wird! Dies ist effektiver und viel näher am Sinne des Erfinders und deshalb auch eine neue Programmierrichtlinie. Weiterhin frohes Schaffen, und ein frohes Fest kann ich euch morgen beim Umtrunk noch wünschen! Christian From: fest@math.tu-berlin.de Date: Subject: Bewegen von Robotern Liebe CoMa's, ich habe noch eine kleine Anmerkung zum Bewegen der Roboter in der Methode moveTowards. Viele von Euch bewegen die Roboter, indem sie matrix.setObject(altePosition,null); matrix.setObject(neuePosition,this); schreiben. Besser (weil Verwendung bereits gegebenen Codes) ist matrix.moveObject(altePosition,neuePosition); Dies ist auch für das Funktionieren des Counters und des Geschenke-Einsammelns in der 7.Programmieraufgabe Voraussetzung! Ansonsten wünsche ich allen ein frohes Weihnachtsfest und ein gutes (erfolgreiches) neues Jahr. Andreas From: liebchen@math.tu-berlin.de Date: Subject: Gruppenumordnung vom 21.12.2000
Liebe @GROUP@,
wie ihr gestern und heute sicher mitbekommen habt,
haben wir ein paar der Coma-Gruppen umgeordnet, um
keinen, der nach der Klausur alleine da steht, auf
sich selbst gestellt zu lassen, und um euren Paarungs-
wünschen weitgehend zu entsprechen.
Die Einteilung der Gruppen sollte klar sein. Funktio-
nierende 4er-Gruppen bleiben bestehen. Auf drei Leute
geschrumpfte Gruppen behalten ihre Gruppennummer und
haben vereinzelt einen vierten Mann/Frau hinzu be-
kommen. Bestehende Pärchen haben bis auf co1-127 ihre
Gruppennummer behalten und ggf. einzelne Leute hinzu
bekommen. Die acht unter euch, die derzeit in Gruppen
stecken, bei denen nicht alle vier die Klausur bestan-
den haben, und die am 21.12.2000 nicht in der Übung
waren, müssen sich gleich zu Beginn des nächsten
Jahres unbedingt bei uns melden!!!
^^^^^^^^^^^^^^^^^^^^^^^^
Ebenfalls klar sein sollte, dass wir von jeder noch
aktiven Gruppe erneut die Lösung der Aufgabe 1(b) vom
1. Übungsblatt benötigen, Stichwort Members-Datei!
^^^^^^^^^^^^^
Diese werden wir uns zu dem Zeitpunkt ziehen, an dem
ihr das erste Mal ein Übungsblatt in der ggf. neuen
Konstellation abgebt, also am 11.01.2001 um 16:00.
Für diejenigen unter euch, deren Gruppennummer sich
geändert hat, besteht ab Freitag, dem 12.01.2001 die
Möglichkeit, dem UNIX-Pool-Team zu sagen, dass euer
Bibliotheksausweis nicht mehr den Account der Gruppe
co1-alt, sondern fortan den der Gruppe co1-neu frei
schalten soll.
Alle Klarheiten beseitigt?
Dann nochmals frohe Weihnachten!
Christian
From: fest@math.tu-berlin.de Date: Subject: Hinweise zur 6. und 7. Programmieraufgabe
Liebe CoMa's,
ich wünsche allen ein schönes neues Jahr.
Auch wenn der offizielle Abgabetermin für die 6.Programmieraufgabe
ja bereits vorbei ist, kommen hier noch ein paar Hinweise und
Verbesserungsvorschläge, die sich alle zu Herzen nehmen sollten.
Zunächst einmal etwas zum Thema Directions:
In der Klasse MazeMatrix sind die vier symbolischen Konstanten
NORTH, SOUTH, EAST, WEST definiert.
Wann immer ihr eine bestimmte Richtung ansprechen wollt
(z.B. in einer switch-Anweisung) ist es unschön, die Richtung direkt
durch den entsprechenden int-Wert anzusprechen. Verwendet statt
dessen bitte die symbolischen Konstanten. Das macht den Programm-Code
leichter zu lesen.
Will man die Richtungen nacheinander in einer Schleife ansprechen,
so ist das auch möglich:
for (int dir = MazeMatrix.NORTH; dir <= MazeMatrix.WEST; dir++ ) {
...
}
Hat man eine Richtung spezifiziert, z.B. in der Variable direction,
und ist eine aktuelle Zelle der Matrix durch eine MazePosition pos
gegeben, so erhält man die Koordinaten der benachbarten Zelle in
Richtung direction z.B. so:
MazePosition nextCell = new MazePosition(pos.row,pos.col);
nextCell.row += dy[direction];
nextCell.col += dx[direction];
Dies ist möglich, da in den Arrays dx und dy für jede Richtung die
Veränderungen der x- bzw. y-Koordinaten gespeichert ist.
Mit Verwendung dieser Arrays kann man sich eigentlich jede
switch-Anweisung in der Methode getNextCell sparen!
Noch ein Hinweis:
Wenn der Roboter bewegt werden soll (Methode moveTowards), z.B. von
Position start nach Position stop, so habe ich schon mehrfach folgendes
gesehen:
matrix.setObject(start, null);
matrix.setObject(stop, this);
Dies ist nicht falsch, aber besser ist die Verwendung der Methode
moveObject:
matrix.moveObject(start, stop);
Warum das besser sein soll? Ganz einfach: Falls Ihr den freiwilligen
Teil der 7.Programmieraufgabe (einsammeln der Geschenke) bearbeiten wollt,
so sorgt die Methode moveObject für das Einsammeln der Geschenke und das
zählen der Schritte im Labyrinth. Deshalb ist es besser, diese Methode zu
verwenden. Klingt logisch, oder?
Also dann noch viel Erfolg bei der Bearbeitung der Programmieraufgaben.
Andreas
From: fest@math.tu-berlin.de Date: Subject: zur 7.Programmieraufgabe
Liebe CoMa's!
Heute habe ich die unangehneme Pflicht, eine kleine
Fehlerkorrektur bekanntzugeben!
In den Aufgabendetails zur 7.Programmieraufgabe steht
unter dem ersten Punkt
import digraph.*;
public class MyDigraph extends SimpleDigraph
{
:
:
}
Dies ist natürlich Müll. Es muß nämlich (wie in der
Übung gesagt)
public class MyDigraph implements SimpleDigraph
^^^^^^^^^^
heißen, da SimpleDigraph ja ein Interface ist.
Bitte beachtet das, wenn ihr Eure Graphenklasse implementiert.
Schönes Wochenende
Andreas
From: fest@math.tu-berlin.de Date: Subject: CoMa-Mailingliste Liebe @GROUP@, viele von Euch arbeiten zu Hause und kommen nur zur Programmabgabe in den Unix-Pool. Dagegen ist prinzipiell nichts einzuwenden. Doch ab und an schicken wir wichtige Emails an Euch mit Hinweisen und Fehlerkorrekturen zu den Aufgaben oder Organisatorischem. Wenn ihr diese Emails dann irgendwann lest, wenn ihr mal wieder im Unix-Pool seid ist es vielleicht schon zu spät. Deshalb haben wir jetzt eine Mailingliste für die CoMa eingerichtet, in die ihr Eure privaten Email-Addressen eintragen könnt, falls ihr stets aktuell von uns informiert sein wollt. Eintragen in diese Liste könnt ihr Euch über die CoMa-Homepage oder das Email-Archiv. Schönes Wochenende Andreas From: fest@math.tu-berlin.de Date: Subject: Noch was zur 7.Programmieraufgabe
Hallo CoMa's,
ich habe gerade in meinem Postkasten folgende Frage gefunden, die vielleicht
mehreren von Euch Kopfschmerzen bereitet...
> Mir sind die methoden
>
> setShortestPathToDraw(obj, lastShortPath)
> und
> drawShortestPathTree(Graphics g, int xOffset, int yOffset, int
> cellWidth, int cellHeight);
>
> nicht klar.
>
> Wenn ich die mazeMatrix mit der methode setShortestPathToDraw aufrufe,
> was soll dann passieren?
>
Die Methode setShortestPathToDraw wird immer dann aufgerufen, wenn
entweder ein neues Object angeklickt wurde, für das die
Kürzeste-Wege-Matrix berechnet wurde oder sich diese Matrix für das
bisherige Object geändert hat. Die Methode erhält als Parameter sowohl das
Object (als Startknoten (=Wurzel) des Kürzesten-Wege-Baums) als auch seine
KW-Matrix.
Beides muß in globalen Variablen der Klasse gespeichert werden, damit
später beim zeichen darauf zugegriffen werden kann. Das kann dann etwa so
aussehen:
public class MyMazeMatrix extends MazeMatrixCollecting
{
MazeObject startShortestPathTree=null;
ShortestPathElement[][] shortestPathMatrix = null;
:
:
/** Sets the Shortest Path predecessor matrix and the object to start
the shortest path tree.*/
public void setShortestPathToDraw(MazeObject obj,
ShortestPathElement[][] shortestPath) {
startShortestPathTree = obj;
shortestPathMatrix = shortestPath;
}
:
:
}
Übrigens: Methoden, deren Name mit set beginnt werden meist nur dazu
verwendet, die übergebenen Parameter in globalen Variablen zu speichern
(eventuell noch mit einer Konsistenz-Prüfung). So können auch
private-deklarierte Instanzvariablen von außen geändert werden, wobei in
der set-Methode jedoch noch Sicherheitüberprüfungen stattfinden können.
>
> Und woher nimmt die methode drawShortestPathTree die Information ueber
> den kuerzesten-Wege-Baum? Die steckt ja wohl in 'lastShortPath' und ist
> erstmal nur innnerhalb der methode setShortestPathToDraw bekannt.
> Wie soll also 'drawShortestPathTree' wissen, was es zu zeichnen hat?
>
Naja, genau aus den oben genannten globalen Variablen! ;-)
Ich hoffe, Ihr kommt damit erstmal weiter, falls dennoch weitere Fragen
auftreten, so bin ich gern bereit, Auskunft zu erteilen.
Viel Spaß
Andreas
From: fest@math.tu-berlin.de Date: Subject: Aufgabe 7 ist überarbeitet! Liebe @GROUP@, die überarbeitete Aufgabenstellung zur 7.Programmieraufgabe ist endlich online! Die neuen Fassungen der Interfaces SimpleDigraph und ShortestPathAlgorithm findet ihr nun - im Verzeichnis ~co1-002/robotmaze2/digraph/ - im WWW unter http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/program_robot2/digraph/ - sowie enthalten in den Download-Files Prog07.tar.gz und Prog07.zip Die Package-Dokumentationen sind an den entsprechenden Orten ebenfalls aktualisiert. Es empfiehlt sich übrigens bei der Gelegenheit, auch das Package robotmaze upzudaten, da auch dort ein oder zwei kleine Fehler behoben wurden. Ansonsten noch ein kleiner Hinweis, in Zusammenhang mit explodierenden Gegenständen: Es kann passieren, dass man auf unerwartete NullPointerExceptions stößt, wenn man sich mittels getPosition() die Koordinaten eines Objects berechnen läßt, das gar nicht mehr in der Matrix existiert, da daneben eine Explosion stattfand. Es ist deshalb günstig, nach jeder Abfrage von getPosition() zu überprüfen, ob man hier null erhalten hat und wenn dies der Fall ist, die folgenden Operationen nicht auszuführen! Dies gilt insbesondere beim Zeichnen des Graphen (z.B. für MissileLaunches)! Schönes Wochenende Andreas From: fest@math.tu-berlin.de Date: Subject: Lesen & Schreiben, Dialoge
Liebe @GROUP@,
verzweifelt ihr gerade am Schreiben des 8.Programms, weil das
mit dem Lesen von und Schreiben in Dateien nicht klappt?
Dann kommt jetzt die Rettung:
Hier eine korrigierte Fassung dessen, was ich neulich in der Übung
erzählt habe.
Lesen aus der Datei geht z.B. so:
FileReader datei;
BufferedReader inputStream;
try {
datei = new FileReader(directory+"/"+filename);
inputStream = new BufferedReader(datei);
while (inputStream.ready()) {
System.out.println(inputStream.readLine()+"\n");
}
inputStream.close();
datei.close();
}
catch(FileNotFoundException e){
System.out.println("Open failed: "+filename+" not found!");
}
catch(IOException e) {
System.out.println("Open failed: "+e.getMessage());
}
... und Schreiben geht analog:
FileWriter datei;
try {
datei = new FileWriter(directory+"/"+filename);
String text = "Das ist der String\nden ich schreiben will!\n";
datei.write(text,0,text.length());
datei.close();
}
catch(FileNotFoundException e){
System.out.println("Save failed: "+filename+" not found!");
}
catch(IOException e) {
System.out.println("Save failed: "+e.getMessage());
}
Wenn ihr den Benutzer was Fragen wollt, dann braucht ihr dazu einen
geeigneten Dialog. Den kann man sich selber schreiben (extends Dialog)
oder man verwendet einen fertigen.
Fertige Dialoge für Ja/Nein/Abbruch gibt's in Java aber erst seit
Java1.2 (Swing-Klassen), z.B. in der Klasse JOptionPane, siehe z.B.
<WWWLink href="Java-Tutorial</WWWLink>">http://www-pool.math.tu-berlin.de/doc/javadoc/tutorial/ui/swing/dialog.html">Java-Tutorial</WWWLink>
Wenn ihr zu Hause aber Java 1.1.x habt, z.B. von der CoMa-CD, dann
müßt ihr den Dialog selber schreiben, oder den ganz einfachen
QuestionDialog verwenden, den es auf der Web-Seite zur
8.Programmieraufgabe gibt.
Habt ihr nicht Lust, diesen Dialog schöner/komfortabler zu gestalten?
Viel Spaß
Andreas
From: fest@math.tu-berlin.de Date: Subject: 0/1-Folgen vorhersagen Liebe @GROUP@, in der Übung am vergangenen Donnerstag hab ich die Frage gestellt, ob Menschen eine zufällige 0/1-Folge eintippen können. Um dieser Frage nachzugehen wollen wir einen kleinen Programmier-Wettbewerb starten. Wie das ganze ablaufen soll, verraten wir Euch auf der Internet-Seite http://www.math.TU-Berlin.de/Vorlesungen/WS00/CoMa.1/program_rate01/ Viel Spaß und viel Erfolg wünscht Euer CoMa-Team From: liebchen@math.tu-berlin.de Date: Subject: Wiederholungsruecksprachen und Uebungen 14.02., 15.02. Liebe Gruppe @GROUP@, die Wiederholungsrücksprachen werden am Donnerstag, den 01. März 2001 stattfinden. Dann habt ihr hoffentlich genug Zeit, Stoff nachzuarbei- ten und/oder noch einmal im UNIX-Pool - der die ersten beiden Wochen der vorlesungsfreien Zeit geöffnet haben sollte - in die Tasten zu greifen. Die genauen Termine können wir erst festlegen, wenn wir wissen, wie viele Studenten wir noch einmal befragen werden. Wer an diesem Tag aus dringendem Grund nicht kann, kann direkt mit Herrn Möhring einen Termin vereinbaren. Aber das soll halt, wie eben in Java mit Exceptions, die absolute Ausnahme bleiben. Der Übungsbetrieb wird in der nächsten Woche folgendermaßen aussehen: Mittwoch 16-18, also unmittelbar vor dem Umtrunk, und Donnerstag 16-18. Ihr seid an dieser Stelle noch einmal herzlich eingeladen, uns mitzutei- len, zu welchen Themengebieten ihr noch einmal etwas von uns hören möchtet. Rekursion? Sortieren? static? Klassen und Objekte? Was wollt ihr vor Beginn des nächsten Semesters (noch) besser im Griff haben? Mailt uns eure Wünsche, am besten rechtzeitig! Dann spätestens bis zum Umtrunk! Christian From: fest@math.tu-berlin.de Date: Subject: 0/1-Raten Liebe @GROUP@, leider ist unser kleiner Programmier-Wettbewerb nicht gerade auf große Resonanz gestoßen. Woran lag's? Zu viele Klausuren oder habt ihr kein Interesse? Dennoch wird es heute Abend wohl einen Sieger des Wettbewerbs geben. Ich würde mich sehr freuen, wenn die eine oder der andere von Euch noch bis zum Umtrunk eine 0-1-Folge bei mir eintippt, damit wir wenigstens da ein paar mehr Teilnehmer haben. Viele Grüße Andreas | |||||||||||||||||||||||||||
|
|
|