<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Einführung in die Informatik 1</title>
	<atom:link href="http://info1.blackhc.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://info1.blackhc.net</link>
	<description>Gruppe F1</description>
	<lastBuildDate>Mon, 04 May 2009 22:31:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Vorbei :-)</title>
		<link>http://info1.blackhc.net/2009/02/vorbei/</link>
		<comments>http://info1.blackhc.net/2009/02/vorbei/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 19:44:42 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Off-Topic]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=473</guid>
		<description><![CDATA[Das Semester ist vorbei, die letzte Übung schon vor langer Zeit gehalten und die Klausur korrigiert. Der Blog ist damit &#8220;fertig&#8221; Viel Erfolg weiterhin im Studium.]]></description>
			<content:encoded><![CDATA[<p>Das Semester ist vorbei, die letzte Übung schon vor langer Zeit gehalten und die Klausur korrigiert. Der Blog ist damit &#8220;fertig&#8221; <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Viel Erfolg weiterhin im Studium.</p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/02/vorbei/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blatt 13</title>
		<link>http://info1.blackhc.net/2009/02/blatt-13/</link>
		<comments>http://info1.blackhc.net/2009/02/blatt-13/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 00:41:16 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Tutorübung]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=468</guid>
		<description><![CDATA[Ich habe mal eine kleine PDF erstellt als Zusatz zu den Folien (dann muss man sich nicht so den Kopf verrenken hoffentlich ).. PDF zum Blatt 13]]></description>
			<content:encoded><![CDATA[<p>Ich habe mal eine kleine PDF erstellt als Zusatz zu den Folien (dann muss man sich nicht so den Kopf verrenken hoffentlich <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )..</p>
<p><a href="http://info1.blackhc.net/wp-content/uploads/2009/02/blatt-13.pdf">PDF zum Blatt 13</a></p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/02/blatt-13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zusatz zu Blatt 12</title>
		<link>http://info1.blackhc.net/2009/02/zusatz-zu-blatt-12/</link>
		<comments>http://info1.blackhc.net/2009/02/zusatz-zu-blatt-12/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 00:52:27 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Aufgaben]]></category>
		<category><![CDATA[Tutorübung]]></category>
		<category><![CDATA[Assoziativiät]]></category>
		<category><![CDATA[Blatt 12]]></category>
		<category><![CDATA[Compilerbau]]></category>
		<category><![CDATA[Parser]]></category>
		<category><![CDATA[Zusatzaufgaben]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=460</guid>
		<description><![CDATA[Zwei kleine Zusatzaufgaben um den Nutzen der Evaluationsbäume besser zu verstehen: Zusatzaufgaben Wir haben im Blatt 11 in der 3. Aufgabe einen RPN-Rechner kennengelernt (und auch teilweise entwickelt). Der Rechner kann eigentlich auch nicht mehr als unserer Grammatik vom Blatt 12&#180; und deshalb folgende Aufgabe: Man schreibe den Quellcode vom RPN-Rechner um, damit er auch [...]]]></description>
			<content:encoded><![CDATA[<p>Zwei kleine Zusatzaufgaben um den Nutzen der Evaluationsbäume besser zu verstehen:</p>
<h4>Zusatzaufgaben</h4>
<p>Wir haben im <strong>Blatt 11</strong> in der 3. Aufgabe einen RPN-Rechner kennengelernt (und auch teilweise entwickelt). Der Rechner kann eigentlich auch nicht mehr als unserer Grammatik vom Blatt 12<a class="annotation" title="bzw. umgekehrt :)" href="javascript:;"><strong>&#180;</strong></a> und deshalb folgende Aufgabe:</p>
<p>Man schreibe den Quellcode vom RPN-Rechner um, damit er auch einen Evaluationsbaum ausgibt, der mit den Funktionen vom Blatt 12 ausgewertet werden kann.<br />
Die Musterlösung für den RPN-Rechner vom <strong>Blatt 11</strong> gibt&#8217;s <a href="http://info1.blackhc.net/wp-content/uploads/2009/02/RPNCalc.java">hier</a>.</p>
<p>Damit soll eines deutlich gemacht werden:<br />
<strong>Durch das Verwenden eines Evaluationsbaumes werden die Operationen auf der Struktur von der Repräsentation (RPN oder normaler Ausdruck) entkoppelt.</strong></p>
<p>Folgende Zusatzaufgabe bietet sich auch noch an:</p>
<p>Man füge folgende Methode zu <strong>IArithmetic </strong>hinzu (und implementiere sie entsprechend)<a class="annotation" title="bzw. wir können wieder das Visitor-Pattern benutzen und nur eine neue Visitor-Klasse entwickeln ohne das IArithmetic-Interface zu verwenden" href="javascript:;"><strong>&#180;</strong></a>:</p>
<p style="padding-left: 30px;"><strong>List&lt;String&gt; GetNeededVariables();</strong></p>
<p>Die Funktion soll eine Liste aller Variablennamen zurückliefern, die vom Ausdruck erwartet/benutzt werden.</p>
<h4>Fehler im Übungsblatt</h4>
<p>Wie ich heute erfahren habe<a class="annotation" title="Danke Iwan! :)" href="javascript:;"><strong>&#180;</strong></a> gibt es einen zwar relativ leicht behebaren, aber trotzdem schweren Fehler in der Aufgabenstellung der Aufgabe 1 vom Blatt 12, der offenbar niemandem bisher aufgefallen ist<a class="annotation" title=".. oder ich habe es absolut nicht mitbekommen bisher :-|" href="javascript:;"><strong>&#180;</strong></a>:<br />
Ausdrücke wie zB. <strong>16 &#8211; 4 &#8211; 2</strong> oder<strong> 16 / 4 * 2</strong> werden falsch ausgewertet!</p>
<p>Man kann das selbst einmal ausprobieren und es stellt sich folgende Frage: <strong>Woran liegt das?</strong></p>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_2');">Tipp &#187;</a>
<div class="expandable_text" name="blackhc_expandable_2" id="blackhc_expandable_2" style="display:none">Man male sich den Evaluationsbaum, der erstellt wird, auf.</div>
<p></div>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_3');">Antwort &#187;</a>
<div class="expandable_text" name="blackhc_expandable_3" id="blackhc_expandable_3" style="display:none">Unsere Grammatik ist immer rechtsassoziativ, d.h. sie klammert immer implizit rechtseitig. Das ist bei Operatoren wie <strong>+</strong> und <strong>*</strong> kein Problem, denn diese sind assoziativ, &#8211; und / sind es aber nicht und während wir beim normalen Rechnen immer linksassoziativ arbeiten (das ist die Konvention, deswegen lassen wir solche Klammern normalerweise weg), macht unsere Grammatik genau das umgekehrte, was natürlich zu falschen Ergebnissen führt.</p>
<div id="attachment_461" class="wp-caption aligncenter" style="width: 166px"><a href="http://info1.blackhc.net/wp-content/uploads/2009/02/correctassoc.jpeg"><img class="size-full wp-image-461" title="correctassoc" src="http://info1.blackhc.net/wp-content/uploads/2009/02/correctassoc.jpeg" alt="So sieht der korrekte Evaluationsbaum aus" width="156" height="151" /></a><p class="wp-caption-text">So sieht der korrekte Evaluationsbaum aus</p></div>
<div id="attachment_462" class="wp-caption aligncenter" style="width: 166px"><a href="http://info1.blackhc.net/wp-content/uploads/2009/02/wrongassoc.jpeg"><img class="size-full wp-image-462" title="wrongassoc" src="http://info1.blackhc.net/wp-content/uploads/2009/02/wrongassoc.jpeg" alt="Das ist der falsche Evaluationsbaum, wie er von unserem Parser erstellt wird.." width="156" height="151" /></a><p class="wp-caption-text">Das ist der falsche Evaluationsbaum, wie er von unserem Parser erstellt wird..</p></div>
</div>
<p></div>
<p>Das Problem kann behoben, indem man die Grammatik wie folgt abändert:</p>
<p style="padding-left: 30px;"><strong>&lt;term&gt; ::= &lt;factor&gt; { [’+’ | ’-’] &lt;factor&gt; }*<br />
&lt;factor ::= &lt;atom&gt; { [’*’ | ’/’] &lt;atom&gt; }*<br />
&lt;atom&gt; ::= &lt;const&gt; | &lt;var&gt; | ’(’ &lt;term&gt; ’)’<br />
&lt;const&gt; ::= ’0’ | [’1’-’9’ {’0’-’9’}*]<br />
&lt;var&gt; ::= {’a’-’z’}+</strong></p>
<p>Statt bei <strong>&lt;term&gt;</strong> und <strong>&lt;factor&gt;</strong> rekursiv zu verzweigen, erlaubt man einfach beliebig viele angehängte Additionen und Subtraktionen (Tipp: <strong>While</strong>-Schleifen im Parser-Code <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )</p>
<p>Quizfrage: Wieso können wir nicht die Regeln links assoziativ machen, indem wir zum Beispiel <strong>&lt;term&gt; </strong>ändern zu:</p>
<p style="padding-left: 30px;"><strong>&lt;term&gt; ::= &lt;</strong><strong>term</strong><strong>&gt; { [’+’ | ’-’] &lt;factor&gt; }</strong></p>
<p>Die Änderungen gehen in ANTLR recht schnell und im Parser-Code muss man auch nur 2 Funktionen anpassen und kurz überlegen, wie herum man die Evaluationsknoten miteinander verknüpft, aber es dürfte relativ leicht zu machen sein.</p>
<h4>Link zu einem alten aber sehr gutem Tutorial zum Compiler- und Parser-Bau</h4>
<p><a href="http://www.penguin.cz/~radek/book/lets_build_a_compiler/" target="_blank">http://www.penguin.cz/~radek/book/lets_build_a_compiler/</a></p>
<p>Grüße,<br />
Andreas</p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/02/zusatz-zu-blatt-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blatt 12 (Lexer und Parser)</title>
		<link>http://info1.blackhc.net/2009/01/blatt-12-lexer-und-parser/</link>
		<comments>http://info1.blackhc.net/2009/01/blatt-12-lexer-und-parser/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 19:02:08 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Aufgaben]]></category>
		<category><![CDATA[Off-Topic]]></category>
		<category><![CDATA[Tutorübung]]></category>
		<category><![CDATA[Zur Vorlesung]]></category>
		<category><![CDATA[ANTLR]]></category>
		<category><![CDATA[Blatt 12]]></category>
		<category><![CDATA[Composite Pattern]]></category>
		<category><![CDATA[Exceptions]]></category>
		<category><![CDATA[Lexer]]></category>
		<category><![CDATA[Parser]]></category>
		<category><![CDATA[Vistor Pattern]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=424</guid>
		<description><![CDATA[Heute befasse ich mich schon einmal früher mit dem nächsten Blatt als sonst&#180;. Das liegt einerseits daran, dass das Thema schön ist, und andererseits daran, dass es wahrscheinlich nicht möglich ist, alles sonst so in den 3 Sunden vom Praktikum unterzubringen, dass man den größt-möglichen Nutzen daraus ziehen kann. Vorbereitung und Informationen zu den Aufgaben [...]]]></description>
			<content:encoded><![CDATA[<p>Heute befasse ich mich schon einmal früher mit dem nächsten Blatt als sonst<a class="annotation" title="Donnerstag Nacht ftw :-)" href="javascript:;"><strong>&#180;</strong></a>. Das liegt einerseits daran, dass das Thema schön ist, und andererseits daran, dass es wahrscheinlich nicht möglich ist, alles sonst so in den 3 Sunden vom Praktikum unterzubringen, dass man den größt-möglichen Nutzen daraus ziehen kann.</p>
<h3>Vorbereitung und Informationen zu den Aufgaben</h3>
<p>Bei dem Übungsblatt geht es um das Erstellen eines Parsers und Lexers. (Am besten einmal die Aufgabenstellung überfliegen!)</p>
<p>Die Aufgaben benutzen BNF-Regeln, also macht es auch Sinn, diese kurz zu wiederholen, falls man sich nicht mehr so sicher fühlt.</p>
<p>Wie immer verweise ich auf Wikipedia (die englischen Artikel sind hier eindeutig besser) um die Begriffe zu klären:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Parser" target="_blank" >Parser</a></li>
<li><a href="http://en.wikipedia.org/wiki/Lexical Analysis" target="_blank" >Lexical Analysis</a></li>
<li><a href="http://en.wikipedia.org/wiki/Recursive_descent_parser" target="_blank" >Recursive Descent Parser</a></li>
</ul>
<p>Die einzigen Parser, die man auch ohne weitergehende Studien selber schreiben kann, sind rekursiv-absteigende Parser. Interessanterweise sind sie auch so ziemlich die einzigen Parser, deren Code leicht verständlich und wartbar ist (also insbesondere auch lesbar).</p>
<p>Für alle Typen gibt es sogenannte Parser Generatoren (es gibt auch Lexer Generatoren), die automatisch für einen den Quellcode eines Parsers aus vorgegebenen Regeln (<strong>BNF-Regeln </strong>meistens) erstellen.<br />
Bekannte Beispiele sind <a href="http://en.wikipedia.org/wiki/Yacc" target="_blank" >Yacc</a> (und <a href="http://en.wikipedia.org/wiki/Lex_programming_tool" target="_blank" >Lex</a> für den dazugehörigen Lexer Generator). Beide erstellen unlesbaren Code und um die Funktionsweise zu verstehen (bzw. um zu verstehen wie man von den Regeln auf den erstellten Code kommt) benötigt man fundiertes Wissen über Automatentheorie.</p>
<p>Ein für Anfänger besser geeignetes Tool (das auch Java-Code ausgibt) ist <a href="http://www.antlr.org/">ANTLR</a>. Zu dem Parser (der aber auch sehr mächtig ist) wurde auch ein sehr gutes Buch geschrieben (das sei hier aber nur erwähnt). Meine Beispiele benutzen später auch ANTLR.</p>
<h3>Rekursiv-absteigende Parser</h3>
<p>Rekursiv-absteigende Parser setzen die BNF-Regeln mehr oder weniger direkt in den Quellcode um und benutzen rekursive Aufrufe um die Regeln zu kodieren.</p>
<p>Wir können Exceptions benutzen um Fehler zu propagieren, doch dazu später.</p>
<p>Um die Struktur besser zu verstehen, möchte ich ein primitives (und nicht wirklich funktionierendes) Beispiel anführen:</p>
<p>Beispiel:</p>
<blockquote>
<pre>A ::= B | C
B ::= X Y Z*
C ::= A | C</pre>
</blockquote>
<p>Das würde wie folgt in (Pseudo-)Code umgesetzt werden (dabei besagt der Rückgabewert einer Funktion, ob die Regel gematcht werden konnte oder nicht (dies ist hilfreich bei Alternativen <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ):</p>
<blockquote>
<pre>boolean ruleA() {
  // A ::= B | C
  return ruleB() || ruleC();
}

boolean ruleB() {
  // X
  if( !ruleX() )
    return false;

  // Y
  if( !ruleY() )
    return false;

  //  Z* (null, eines oder mehrere Zs)
  while( ruleZ() )
    ;

  return true;
}

boolean ruleC() {
  // A | C
  return ruleA() || ruleC();
}</pre>
</blockquote>
<p>Man kann folgendes feststellen:</p>
<ul>
<li>Diese Regeln bringen natürlich nichts, weil nie Zeichen (Fachwort: Literale) gematcht werden.</li>
<li>Die Reihenfolge der Abarbeitung von Alternativen ist wichtig für die Programmausführung:<br />
Wäre <strong>C ::= C | A </strong>und würden wir das dann auch so im Quellcode schreiben (<strong>return ruleC() || ruleA()</strong>), würde, wie man unschwer erkennt, sofort eine Endlosschleife enstehen und der Regel A würde niemals Beachtung geschenkt werden.</li>
<li>Die Struktur des Codes entspricht sehr stark der Struktur der Regeln &#8211; Konstrukte wie &#8216;mehr als eines&#8217;, etc. werden durch Schleifen kodiert, Alternativen durch &#8220;VerODERung&#8221; und Sequenzen durch &#8220;VerUNDerung&#8221;</li>
</ul>
<p>Das ist natürlich nur ein Stück davon, wie ein Parser funktioniert (aber der wichtigste Teil, da er die Struktur beschreibt). Wir müssen jetzt &#8220;nur&#8221; noch Zeichen einlesen und &#8220;verbrauchen&#8221; können.</p>
<h3>Lexer</h3>
<p>In der Aufgabe (und allgemein ist es auch so) bekommen wir eine Zeichenkette und müssen aus dieser eine Struktur herausziehen.<br />
Dazu ist es hilfreich die verschiedenen semantischen Einheiten, die man bekommt, anfangs zu  klassifizieren, also zum Beispiel zu sagen: Das hier ist ein Variablenname oder das hier ist eine Zahl usw.</p>
<p>Dann kann man in der Grammatik bzw. im Parser direkt mit den Konzepten Zahl und Variablenname arbeiten anstatt mit irgendwelchen Zeichenregeln ala <strong>{&#8216;a&#8217;-'z&#8217;}+</strong> bzw. statt mit einer Zeichenkette &#8220;x&#8221; oder &#8220;42&#8243; arbeiten zu müssen, haben wir Objekte der Typen <strong>VarToken </strong>(dessen Attribut <strong>name </strong>&#8220;x&#8221; ist) und <strong>ConstToken </strong>(dessen Attribut <strong>value</strong> 42 ist).</p>
<p>Der Lexer übernimmt die Aufgabe dieser Klassifierzung bzw. Zerlegung der Eingabe in ihre semantischen Einheiten:<br />
Während ein <strong>Parser </strong>immer eine Startregel hat und von dort aus beginnt Regeln zu matchen, besteht die Aufgabe eines <strong>Lexers </strong>darin, die sogenannten <strong>Token</strong> zu bestimmen. <strong>Token</strong> sind die semantischen Einheiten, aus denen der Text besteht.</p>
<p>Die Aufgabe des <strong>Lexers </strong>ist also, die Zeichen einzulesen und in einem ersten Schritt zu verschiedenen <strong>Token</strong> zusammenzufassen.</p>
<p>Dieser <strong>Tokenstream </strong>(also <strong>Tokenstrom</strong>) wird dann vom <strong>Parser </strong>weiterverwendet (anstatt der Eingabe). In unserer Aufgabe würde der <strong>Parser </strong>nur Instanzen der Klassen <strong>VarToken</strong>, <strong>OperatorToken</strong>, etc. sehen (siehe <strong>b)</strong>) und mit diesen arbeiten.</p>
<p>Das heißt der Ablauf sieht folgendermaßen aus:</p>
<ol>
<li>Der <strong>Lexer</strong> zerlegt die Eingabe in Tokens und speichert diese in einer Liste (welche Datenstruktur bietet sich da an?
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_9');">Antwort &#187;</a>
<div class="expandable_text" name="blackhc_expandable_9" id="blackhc_expandable_9" style="display:none">Ein Queue ist eigentlich ideal, aber wenn wir bedenken, dass wir möglicherweise auch einmal falsch laufen und dann Tokens zurückstecken müssen, dann muss man sich etwas anderes überlegen &#8211; dazu später vielleicht mehr..</div>
<p></div>
</li>
<li>Der <strong>Parser </strong>bekommt den <strong>Tokenstream</strong> und fängt bei der Startregel an Token zu &#8220;verbauchen&#8221;. Die Startregel verzweigt dann an ihre Unterregeln und diese machen das gleiche<a class="annotation" title="Eine animiertes Beispiel werde ich auf Folie am Freitag vorführen falls es gewünscht wird" href="javascript:;"><strong>&#180;</strong></a>.</li>
</ol>
<p>Keine Angst, ich gehe darauf noch genauer ein.</p>
<h3>Beispiel</h3>
<p>Die Aufgabenstellung unterscheidet nicht zwischen Parserregeln und Lexerregeln, sondern mischt das ganze, deswegen werde ich das jetzt auch zuerst so machen.</p>
<p>Im Folgenden benutze ich Grafiken und Grammatiken, die mit und für ANTLR erstellt wurden (ich werde auch den Code posten, aber keine Sorge, man muss da nicht ganz durchsteigen, sondern erst reicht die Ähnlichkeit mit den BNF-Regeln aus Info1 zu sehen).</p>
<p>Die ANTLR-Grammatik für unsere Aufgabe sieht wie folgt aus:</p>
<blockquote>
<pre>grammar arithmetic;

term 	:	factor ( ('+' | '-') term)?;
factor 	:	atom  ( ('*' | '/') factor)?;
atom	:	CONST | VAR | '(' term ')';

CONST	:	'0' | ('1'..'9' ('0'..'9')*);
VAR 	:	('a'..'z')+;

// eat whitespace
WS	:	(' '|'\n'|'\r'|'\t')+ {$channel=HIDDEN;};</pre>
</blockquote>
<p>Damit können wir einen Ableitungsbaum erstellen &#8211; als Beispiel: 2 * x * (y + 3):</p>
<div id="attachment_439" class="wp-caption aligncenter" style="width: 508px"><a href="http://info1.blackhc.net/wp-content/uploads/2009/01/beispielterm.jpeg"><img class="size-full wp-image-439" title="beispielterm" src="http://info1.blackhc.net/wp-content/uploads/2009/01/beispielterm.jpeg" alt="2 * x * (y + 3) als Ableitungsbaum" width="498" height="484" /></a><p class="wp-caption-text">&quot;2 * x * (y + 3)&quot; als Ableitungsbaum</p></div>
<p>An den Blättern stehen jeweils die Token, die gemacht wurden. &#8220;Root&#8221; ist eine Eigenart von ANTLR und wird immer noch über die Startregel gesetzt.</p>
<p>Ich empfehle, dass man als Übung selber auch einmal versucht den Ableitungsbaum aufzustellen (siehe Teilaufgabe <strong>a)</strong>).</p>
<h3>Lexer, die zweite</h3>
<p>Die Aufgabe in der b) besteht darin, sich zu überlegen, welche Attribute die verschiedenen Token haben sollen (bzw ob überhaupt).</p>
<p>Die verschiedenen Klassen sollen alle IToken implementieren, damit wir später Polymorphie benutzen können und auch alle Token in einer <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html">Queue&lt;IToken&gt;</a> speichern können.</p>
<p>Wir können dann das <a href="http://www.java2s.com/Tutorial/Java/0060__Operators/TheinstanceofKeyword.htm"><strong>instanceof</strong></a> Schlüsselwort benutzen um später festzustellen, mit was für einem Token wir es eigentlich zu tun haben <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<pre>
<pre class="brush: java; title: ; notranslate">
  IToken token = tokenStream.poll();
  if( token instanceof ConstToken ) {
    // ja, token ist ein ConstToken
    ...
</pre>
</pre>
<p>In der <strong>c)</strong> sollen wir dann eine Klasse <strong>Lexer</strong> schreiben, die z.B. eine statische Methode <strong>lex</strong> hat mit der Signatur:</p>
<pre style="padding-left: 30px;">public static Queue&lt;IToken&gt; lex(String expression)</pre>
<p>Diese Methode soll, wie oben schon beschrieben, die Zeichenkette <strong>expression</strong> in eine Folge von Token aufspalten und diese zurückgeben.</p>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_10');">Anmerkung &#187;</a>
<div class="expandable_text" name="blackhc_expandable_10" id="blackhc_expandable_10" style="display:none">Eine andere Möglichkeit wäre es eine Art von just-in-time Lexer zu schreiben, dem man mitteilt, was man erwartet und er versucht, dass dann aus der Eingabe zu parsen. Dann könnten wir aber keine statische Methode und Queue benutzen, sondern müssten ein Lexer-Objekt verwenden. Allgemein sind solche Lexer aber mächtiger, da sie eigentlich schon versteckte Parser sind <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Wer Interesse hat, kann mich in der Übung fragen und wir können dann mal versuchen, so einen Lexer zu implementieren &#8211; dann könnte man sich aber die <strong>b)</strong> komplett sparen ^_^</div>
<p></div>
<h3>Parser, die zweite</h3>
<p>Der Parser benutzt den Lexer um die Tokens zu bekommen und benutzt dann rekursive Funktionen (für jede Regel eine) um die Token zu verarbeiten.</p>
<p>Hätten wir zum Beispiel eine Regel:</p>
<pre style="padding-left: 30px;">&lt;beispielRegel&gt; ::= &lt;const&gt; &lt;term&gt; &lt;const&gt; {&lt;var&gt;}*</pre>
<p>dann könnte der Quellcode zum Parsen der selbigen so aussehen wie gleich im Beispiel.</p>
<p>Dabei ist die Methode Teil der Klasse Parser und der Tokenstream vom Typ Queue&lt;IToken&gt; ist in einem Attribut <strong>private Queue&lt;IToken&gt; tokenStream</strong> gespeichert.<br />
Desweiteren haben wir eine Exception <strong>TokensExpectedException </strong>definiert. Der Rückgabetyp ist hier im Beispiel <strong>void</strong>, könnte aber zum Beispiel vom Typ <strong>int</strong> sein, falls wir vielleicht einen Wert durch den Ausdruck berechnen möchten.</p>
<pre>
<pre class="brush: java; title: ; notranslate">
  private void parseBeispielRegel() throws TokensExpectedException {
    if( tokenStream.peek() instanceof ConstToken ) {
      tokenStream.remove();

      parseTerm();

      if( tokenStream.peek() instanceof ConstToken ) {
        tokenStream.remove();
        while( tokenStream.peek() instanceof VarToken ) {
          tokenStream.remove();
        }
      }
      else {
        // kein 2. const gefunden
        throw new TokensExpectedException( &quot;Const expected&quot; );
      }
    }
    else {
      // kein 1. const gefunden
      throw new TokensExpectedException( &quot;Const expected&quot; );
    }
  }
</pre>
</pre>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_11');">Alternative ohne Exceptions: &#187;</a>
<div class="expandable_text" name="blackhc_expandable_11" id="blackhc_expandable_11" style="display:none">Statt Exceptions speichern wir die Fehlermeldung in einem Attribut <strong>private String errorMessage</strong>, dafür müssen wir aber unseren Rückgabewert hergeben, um der aufrufenden Funktion mitzuteilen, ob etwas schief gegangen ist oder nicht  <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<pre>
<pre class="brush: java; title: ; notranslate">
  private bool parseBeispielRegel() {
    if( tokenStream.peek() instanceof ConstToken ) {
      tokenStream.remove();
      if( tokenStream.peek() instanceof ConstToken ) {
        tokenStream.remove();
        while( tokenStream.peek() instanceof VarToken ) {
          tokenStream.remove();
        }
        return true;
      }
      else {
        // kein 2. const gefunden
        errorMessage = &quot;Const expected&quot;;
        return false;
      }
    }
    else {
      // kein 1. const gefunden
      errorMessage = &quot;Const expected&quot;;
      return false;
    }
  }
</pre>
</pre>
</div>
<p></div>
<h3>Einleitende Aufgabe zur Aufgabe 1 und 2 für&#8217;s Praktikum:</h3>
<p>Wir schreiben zuerst einen Interpreter, also eine Parser, der gleich die Ausdrücke interpretiert und die Werte ausrechnet und als Rückgabewert der &#8220;Regel-Funktionen&#8221; zurückgibt.</p>
<h3>Abstrakter Syntaxbaum</h3>
<p>Auf Wikipedia findet schon einmal eine Definition: [[wikipdia:Abstract_syntax_tree#Abstract Syntax Tree]].</p>
<p>Ziel der Teilaufgaben <strong>d)</strong>, <strong>e)</strong> und <strong>f)</strong> ist es, anstatt die Werte direkt auszuwerten, eine Baumstruktur zu benutzen um die Struktur des geparsten Textes zu speichern. Dieser kann dann getrennt (siehe <strong>Aufgabe 2</strong>) ausgewertet werden und wir brauchen ihn nur einmal zu parsen, selbst wenn wir verschiedene Operationen auf einem Ausdruck ausführen wollen &#8211; z.B. den Wert berechnen oder feststellen, welche Variablen er braucht, etc..</p>
<p>Was für Knotentypen kann dieser Baum haben?</p>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_12');">Hinweis &#187;</a>
<div class="expandable_text" name="blackhc_expandable_12" id="blackhc_expandable_12" style="display:none">Man schaue sich Bild vom Ableitungsbaum oben an und frage sich, was man alles braucht um die gesamte Struktur (also alle Informationen) zu erfassen..</div>
<p></div>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_13');">Antwort &#187;</a>
<div class="expandable_text" name="blackhc_expandable_13" id="blackhc_expandable_13" style="display:none">Wir brauchen einen Knotentyp für jede Operation (+, *, -, /) und natürlich auch für die Werte und Variablen.</div>
<p></div>
<p>In der Teilaufgabe <strong>d)</strong> sollen diese Klassen mit den entsprechenden Attributen und Methoden implementiert werden. Wir implementieren wieder ein Interface &#8211; nämlich IArithmetic &#8211; um eine Baumstruktur zu ermöglichen.</p>
<p>Dazu möchte ich auf <a href="http://en.wikipedia.org/wiki/Composite_pattern" target="_blank" >Composite Pattern</a> verweisen<a class="annotation" title="sowohl die deutsche als auch die englische Version scheinen ziemlich okay zu sein" href="javascript:;"><strong>&#180;</strong></a>, damit man versteht, welche Idee dahinter steckt.</p>
<h2>Tree Walker</h2>
<p>Bei der <strong>Aufgabe 2</strong> geht es darum, einen mit dem Parser erstellten Evaluationsbaum zudurchlaufen und die Ausdrücke auszuwerten um den Wert des gesamtem Ausdruckes zu bestimmen. Dazu fügen wir eine Methode <strong>public int</strong> <strong>evaluate()</strong> zum Interface IArithmetic hinzu und implementieren sie dann für jeden Knotentyp derart, dass der Knotentyp seine Teilausdrücke auswertet und seine Operation darauf anwendet (falls er Teilausdrücke hat und ein Operator ist <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).</p>
<p>Dank Polymorphie und dem Composite Pattern geht das relativ schmerzlos.</p>
<h3>Zusatzaufgabe (oder alternative Aufgabe)</h3>
<p>Statt das Interface nachträglich zu ändern, kann man ein anderes, ebenfalls sehr mächtiges Design Pattern benutzen: das <a href="http://en.wikipedia.org/wiki/Visitor_pattern" target="_blank" >Visitor Pattern</a><a class="annotation" title="also das Besucher Pattern - der Name ist auch Programm" href="javascript:;"><strong>&#180;</strong></a> .</p>
<p>Damit können wir beliebig Operationen auf dem ganzen Baum definieren (wie das Auswerten oder Variablen bestimmen, etc.) ohne mehr als einmal das Interface und die Knotentypen anpassen zu müssen.</p>
<p>Das ist aber wirklich nur eine Zusatzaufgabe, falls noch Zeit bleibt.</p>
<p>Falls ich aber noch Zeit finde, werde ich auch noch Lösungen für alle Aufgaben in ANTLR entwickeln &#8211; es dürften nicht mehr als 100 Zeilen sein, aber mein ANTLR-Wissen ist etwas eingerostet..</p>
<p>Grüße,<br />
Andreas</p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/01/blatt-12-lexer-und-parser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blatt 11 Nachbereitung</title>
		<link>http://info1.blackhc.net/2009/01/blatt-11-nachbereitung/</link>
		<comments>http://info1.blackhc.net/2009/01/blatt-11-nachbereitung/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 22:54:58 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Tutorübung]]></category>
		<category><![CDATA[Blatt 11]]></category>
		<category><![CDATA[Queue]]></category>
		<category><![CDATA[Stack]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=411</guid>
		<description><![CDATA[Ich möchte kuz noch einmal etwas zur Aufgabe posten, bei der es darum ging eine Queue durch 2 Stacks zu implementieren und umgekehrt einen Stack durch Queues. Für ersteres habe ich mich vorhin hingehockt und mal ausprobiert, wie viel Stress es ist eine animierte GIF in GIMP dafür zu erstellen, die das ganze anschaulich zeigt [...]]]></description>
			<content:encoded><![CDATA[<p>Ich möchte kuz noch einmal etwas zur Aufgabe posten, bei der es darum ging eine Queue durch 2 Stacks zu implementieren und umgekehrt einen Stack durch Queues.</p>
<p>Für ersteres habe ich mich vorhin hingehockt und mal ausprobiert, wie viel Stress es ist eine animierte GIF in GIMP dafür zu erstellen, die das ganze anschaulich zeigt &#8211; ich muss sagen, es ist recht viel Stress und deswegen gibt&#8217;s auch nur für die Implementierung einer Queue durch 2 Stacks eine Animation:</p>
<div id="attachment_413" class="wp-caption alignnone" style="width: 610px"><a href="http://info1.blackhc.net/wp-content/uploads/2009/01/1q2s.gif"><img class="size-full wp-image-413" title="1q2s" src="http://info1.blackhc.net/wp-content/uploads/2009/01/1q2s.gif" alt="Implementierung eines Queues durch 2 Stacks" width="600" height="600" /></a><p class="wp-caption-text">Implementierung eines Queues durch 2 Stacks</p></div>
<p>Die Implementierung eines Stacks durch 2 Queues erfolgt ähnlich, nur muss man bei jedem <strong>pop </strong>die Queues umschütten und das letzte Element herausziehen. Das Erstellen einer ähnlichen Skizze, wie der von mir oben, kann hilfreich sein, um sich das klar zu machen.</p>
<p>An sich kann man solche Aufgaben immer so lösen, dass man sich einerseits vorstellt wie das ganze nach außen hin wirken soll (das Interface also) und dann versucht die Funktionalität durch das, was man zur Verfügung hat, auszudrücken.</p>
<p>Soweit zum Blatt 11, wenn&#8217;s dazu noch Fragen gibt &#8211;&gt; Email <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Grüße,<br />
Andreas</p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/01/blatt-11-nachbereitung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blatt 11</title>
		<link>http://info1.blackhc.net/2009/01/blatt-1/</link>
		<comments>http://info1.blackhc.net/2009/01/blatt-1/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 01:03:22 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Tutorübung]]></category>
		<category><![CDATA[Blatt 11]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/2009/01/blatt-10/</guid>
		<description><![CDATA[Anbei das Eclipse-Projekt für die Aufgabe 3: RPNCalc.zip]]></description>
			<content:encoded><![CDATA[<p>Anbei das Eclipse-Projekt für die Aufgabe 3:</p>
<p style="padding-left: 30px;"><a href="http://info1.blackhc.net/wp-content/uploads/2009/01/rpncalc.zip">RPNCalc.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/01/blatt-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interfaces in 10 Minutes</title>
		<link>http://info1.blackhc.net/2009/01/interfaces-in-10-minutes/</link>
		<comments>http://info1.blackhc.net/2009/01/interfaces-in-10-minutes/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 20:33:14 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Off-Topic]]></category>
		<category><![CDATA[Tutorübung]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[foreach]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=399</guid>
		<description><![CDATA[Ich habe mich heute mal drangehockt und ein kleines Eclipse-Projekt geschrieben, das einerseits versucht Interfaces an Beispielen zu erklären (sehr banale Beispiele, die aber mit vielen Kommentaren versetzt sind), aber auch andererseits zeigt (sozusagen im Fortgeschrittenen-Teil), wie man Klassen definiert, die in For each-Schleifen benutzt werden können, also z.B.: Es wird als Bonus auch noch [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mich heute mal drangehockt und ein kleines Eclipse-Projekt geschrieben, das einerseits versucht Interfaces an Beispielen zu erklären (sehr banale Beispiele, die aber mit vielen Kommentaren versetzt sind), aber auch andererseits zeigt (sozusagen im Fortgeschrittenen-Teil), wie man Klassen definiert, die in For each-Schleifen benutzt werden können, also z.B.:</p>
<pre class="brush: java; title: ; notranslate">
MeineKlasse meinObject = new MeineKlasse();

// falls die Klasse sich über integer iterieren lässt
for( int i : meinObject ) {
...
}
</pre>
<p>Es wird als Bonus auch noch gezeigt, wie man auch noch die ersten 10 Fibonacci-Zahlen berechnen könnte <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier ist das Eclipse-Projekt: <a href="http://info1.blackhc.net/wp-content/uploads/2009/01/interfacesin10minutes.zip">Interfaces In 10 Minutes</a></p>
<p>In der readme.txt steht die empfohlene Reihenfolge, in der man sich die Dateien anschauen sollte.</p>
<p>Für Feedback und Anregungen bin ich wie immer offen <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Grüße,<br />
Andreas</p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/01/interfaces-in-10-minutes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blatt 9</title>
		<link>http://info1.blackhc.net/2009/01/blatt-9/</link>
		<comments>http://info1.blackhc.net/2009/01/blatt-9/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 07:30:46 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Tutorübung]]></category>
		<category><![CDATA[Aufgabe 1]]></category>
		<category><![CDATA[Aufgabe 3]]></category>
		<category><![CDATA[Blatt 9]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=391</guid>
		<description><![CDATA[Ich habe für die Aufgabe 1 und Aufgabe 3 Eclipse-Projekte erstellt. Hier sind sie: Eclipse Projekt für Blatt 9 Aufgabe 1 Eclipse Projekt für Blatt 9 Aufgabe 3 Bei der Aufgabe 1 habe ich mir die Freiheit genommen auch noch gleich Testcases zu schreiben Achtung &#187; Mit Aufgabe2/4 habe ich eigentlich Aufgabe 4 gemeint und [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe für die Aufgabe 1 und Aufgabe 3 Eclipse-Projekte erstellt.</p>
<p>Hier sind sie:</p>
<p><a href="http://info1.blackhc.net/wp-content/uploads/2009/01/aufgabe1.zip">Eclipse Projekt für Blatt 9 Aufgabe 1</a></p>
<p><a href="http://info1.blackhc.net/wp-content/uploads/2009/01/aufgabe3.zip">Eclipse Projekt für Blatt 9 Aufgabe 3</a></p>
<p>Bei der Aufgabe 1 habe ich mir die Freiheit genommen auch noch gleich Testcases zu schreiben <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_15');">Achtung &#187;</a>
<div class="expandable_text" name="blackhc_expandable_15" id="blackhc_expandable_15" style="display:none">
<p>Mit Aufgabe2/4 habe ich eigentlich Aufgabe 4 gemeint und die alte Meldung &#8220;null/empty array not caught in &#8230;&#8221; meint eigentlich &#8220;null/empty array not handled in&#8230;&#8221; (im Testcase für Aufgabe 1) &#8211; das ist jetzt verbessert<a class="annotation" title="Ich sollte so spät nichts mehr schreiben...&amp;gt;_&amp;gt;" href="javascript:;"><strong>&#180;</strong></a></div>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2009/01/blatt-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kleine Zusatzaufgabe zur Landau-Notation</title>
		<link>http://info1.blackhc.net/2008/12/kleine-zusatzaufgabe-zur-landau-notation/</link>
		<comments>http://info1.blackhc.net/2008/12/kleine-zusatzaufgabe-zur-landau-notation/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 21:55:24 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Aufgaben]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=362</guid>
		<description><![CDATA[Ich weiß nicht, wer schon alles mit der Landau-Notation vertraut ist (und auch mit der Komplexitätstheorie von Algorithmen). Aber als kleine Zusatzaufgabe&#180; zur Hausaufgabe vom Blatt 6 (weil ich sie gerade korrigiere) folgendes: Welche Laufzeiten (ala O(n), etc.) hat der Primzahltest normalerweise, wenn wir ihn so programmieren wie in der Musterlösung zur 1a)? Fleißaufgabe: Wie [...]]]></description>
			<content:encoded><![CDATA[<p>Ich weiß nicht, wer schon alles mit der Landau-Notation vertraut ist (und auch mit der Komplexitätstheorie von Algorithmen). Aber als kleine Zusatzaufgabe<a class="annotation" title="das heißt nicht unbedingt, dass es eine leichte Zusatzaufgabe ist!" href="javascript:;"><strong>&#180;</strong></a> zur Hausaufgabe vom <strong>Blatt 6</strong> (weil ich sie gerade korrigiere) folgendes:</p>
<p>Welche Laufzeiten (ala <strong>O(n)</strong>, etc.) hat der Primzahltest normalerweise, wenn wir ihn so programmieren wie in der Musterlösung zur 1a)?</p>
<pre>
<pre class="brush: java; title: ; notranslate">
static boolean isPrime(int p ) {
  for( int k = 2 ; k * k &lt;= p ; k++ ) {
    if( p % k == 0 ) {
      return false;
    }
  }
  return true;
}
</pre>
</pre>
<p>Fleißaufgabe:<br />
Wie sieht&#8217;s mit den Laufzeiten der anderen Funktionen aus?</p>
<p>Man kann die Lösung wahrscheinlich leicht mit Google finden, aber es an sich ganz nett da selber einmal darauf zukommen.</p>
<div class="expandable"><a class="expandable_link" href="javascript:blackhc_replacements_togglediv('blackhc_expandable_17');">Hinweis &#187;</a>
<div class="expandable_text" name="blackhc_expandable_17" id="blackhc_expandable_17" style="display:none">Die Aufgabenstellung ist bewusst so schwammig gewählt, damit man sich erst einmal Gedanken darüber machen muss, was genau eigentlich gemessen/beschrieben werden soll <a class="annotation" title=".. die Komplexität in Abhängigkeit von der Datenlänge.." href="javascript:;"><strong>&#180;</strong></a>.</p>
<p>Das Ergebnis ist nicht   $$ \mathbf{ O(n) }$$ und auch nicht   $$ \mathbf{O(\sqrt{x})}$$.
</p></div>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2008/12/kleine-zusatzaufgabe-zur-landau-notation/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Blatt 8, Zusatzaufgaben</title>
		<link>http://info1.blackhc.net/2008/12/blatt-8-zusatzaufgaben/</link>
		<comments>http://info1.blackhc.net/2008/12/blatt-8-zusatzaufgaben/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 07:50:26 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Aufgaben]]></category>
		<category><![CDATA[Tutorübung]]></category>

		<guid isPermaLink="false">http://info1.blackhc.net/?p=356</guid>
		<description><![CDATA[Zum Blatt 8 folgende Zusatzaufgaben: Aufgabe 2: j) Schreiben Sie in der Klasse TimeTable eine Methode public int addTrainArrival( string nameOfTrain, Date arrivalTime ) { &#8230; } welche zur gegebenen Zeit versucht ein freies Gleis für den Zug zu finden und falls dies möglich ist eine TrainConnection mit den Informationen erstellt und hinzugefügt. Die Methode [...]]]></description>
			<content:encoded><![CDATA[<p>Zum <a href="http://www4.in.tum.de/lehre/vorlesungen/info1-ws0809/files/blatt08.pdf" target="_blank">Blatt 8</a> folgende Zusatzaufgaben:</p>
<h3>Aufgabe 2:</h3>
<p><strong>j)</strong> Schreiben Sie in der Klasse <strong>TimeTable </strong>eine Methode</p>
<p><strong>public int addTrainArrival( string nameOfTrain, Date arrivalTime ) { &#8230; }</strong></p>
<p>welche zur gegebenen Zeit versucht ein freies Gleis für den Zug zu finden und falls dies möglich ist eine <strong>TrainConnection</strong> mit den Informationen erstellt und hinzugefügt. Die Methode gibt dies Nummer des Gleises<strong> </strong>zurück, falls ein Gleis gefunden wurde, ansonsten -1.</p>
<p><strong>k) </strong>Schreiben Sie in der Klasse TimeTable eine Methode <strong>optimizeForTransitPassengers</strong>, die die TrainConnections in der TimeTable dahingehend optimiert, dass Passagiere von Zügen, die zu ähnlichen Zeiten ankommen, möglichst wenige Gleise von einem Zug zum nächsten laufen müssen, falls sie umsteigen wollen<a class="annotation" title="es ist also eine gewisse Lokalität der Gleisnummern für Züge gesucht, die zu ähnlichen Zeiten ankommen" href="javascript:;"><strong>&#180;</strong></a>.</p>
<p>Hinweis:</p>
<p>Es ist sinnvoll den Fahrplan um mehr TrainConnections zu erweitern &#8211; am besten mit einer For-Schleife weitere Einträge hinzufügen.</p>
<h3>Aufgabe 3:</h3>
<p><strong>d)</strong> Natürlich die Potenzmenge bestimmen <img src='http://info1.blackhc.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Also:</p>
<p><strong>public staic &lt;S&gt; Set&lt;Set&lt;S&gt;&gt; powerSet( Set&lt;S&gt; s ) {&#8230;}</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://info1.blackhc.net/2008/12/blatt-8-zusatzaufgaben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

