<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-395734929939336689</id><updated>2011-11-27T17:52:19.270+01:00</updated><category term='ruby'/><category term='POS1-3'/><category term='Python'/><category term='Go'/><category term='User Interface'/><category term='System'/><category term='Programmiersprachen'/><category term='POS1-1'/><category term='C'/><category term='.Net'/><category term='CVS'/><category term='Lösung'/><category term='Java'/><category term='RoboCup'/><category term='Objective C'/><category term='PR2'/><category term='netbeans'/><category term='GUI'/><category term='C#'/><category term='C++'/><category term='android'/><category term='iPhone'/><category term='Web-Entwicklung'/><category term='POS1-2'/><category term='groovy'/><category term='Linux'/><category term='Informatik'/><category term='Links'/><category term='Fehler'/><category term='PR5'/><category term='eclipse'/><category term='vim'/><category term='PR3'/><category term='allgemeines'/><category term='Robotik'/><category term='Aufgabe'/><title type='text'>Programmieren mit Harald R. Haberstroh</title><subtitle type='html'>Alle möglichen Themen zu Programmieren, hauptsächlich jedoch Themen aus dem Programmierunterricht. Programmierbeispiele, Tipps usw.
Sprachen: C, Java, Python, C++, C#, Ruby, PHP</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default?start-index=101&amp;max-results=100'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>244</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5535825929097894088</id><published>2011-10-10T11:14:00.001+02:00</published><updated>2011-10-10T11:14:56.724+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Java -&gt; Python (POS1: 2B)</title><content type='html'>Wandeln Sie folgendes Java-Programm in ein Python Programm um:&lt;pre class="prettyprint"&gt;&lt;br /&gt;public class Dreiecksbestimmung {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;      dreiecksbestimmung(3.0, 4.0, 5.0);&lt;br /&gt;      dreiecksbestimmung(3.0, 3.0, 3.0);&lt;br /&gt;      dreiecksbestimmung(3.0, 3.0, 5.0);&lt;br /&gt;      dreiecksbestimmung(3.0, 4.5, 5.0);&lt;br /&gt;      dreiecksbestimmung(1.0, 2.0, 3.0);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void dreiecksbestimmung(double a, double b, double c) {&lt;br /&gt;      System.out.printf("a = %.2f, b = %.2f, c = %.2f: ", a, b, c);&lt;br /&gt;      if (dreieck(a, b, c)) {&lt;br /&gt;        if (gleichseitig(a, b, c)) {&lt;br /&gt;          System.out.print("gleichseitiges ");&lt;br /&gt;        } else if (gleichschenkelig(a, b, c)) {&lt;br /&gt;          System.out.print("gleichschenkeliges ");&lt;br /&gt;        }&lt;br /&gt;        if (rechtwinkelig(a, b, c)) {&lt;br /&gt;          System.out.print("rechtwinkeliges ");&lt;br /&gt;        }&lt;br /&gt;        System.out.println("Dreieck");&lt;br /&gt;      } else {&lt;br /&gt;        System.out.println("kein gültiges Dreieck");&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static boolean rechtwinkelig(double a, double b, double c) {&lt;br /&gt;      double a2 = a * a;&lt;br /&gt;      double b2 = b * b;&lt;br /&gt;      double c2 = c * c;&lt;br /&gt;      return a2 + b2 == c2 || a2 + c2 == b2 || b2 + c2 == a2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static boolean gleichschenkelig(double a, double b, double c) {&lt;br /&gt;      return a == b || a == c || b == c;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static boolean gleichseitig(double a, double b, double c) {&lt;br /&gt;      return a == b &amp;&amp; b == c;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static boolean dreieck(double a, double b, double c) {&lt;br /&gt;      return a + b &gt; c &amp;&amp; a + c &gt; b &amp;&amp; b + c &gt; a;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Ergänzen Sie Ihr Programm um geeignete Doc-Strings und Kommentare!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5535825929097894088?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5535825929097894088/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/10/java-python-pos1-2b.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5535825929097894088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5535825929097894088'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/10/java-python-pos1-2b.html' title='Java -&gt; Python (POS1: 2B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-755099159596924276</id><published>2011-10-05T11:15:00.001+02:00</published><updated>2011-10-05T11:15:36.722+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-3'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Abgaben am CVS (POS1: 2., 3. Klassen)</title><content type='html'>&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Nennen Sie Projekte&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;code style="color: blue;"&gt;&lt;i&gt;klasse&lt;/i&gt;-&lt;i&gt;name&lt;/i&gt;-projekt&lt;/code&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;, wobei&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;klasse&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;"2a" für 2AHIF, "2c" für 2CHIF, "3b" für 3BHIF usw. und &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;name&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;Ihr Familienname sein soll (bei Namensgleichheit machen Sie bitte&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;code style="color: blue;"&gt;&lt;i&gt;klasse&lt;/i&gt;-&lt;i&gt;name-vorname&lt;/i&gt;-projekt&lt;/code&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;daraus). Checken Sie die Projekte am CVS (cvs.htlwrn.ac.at, Pfad /cvs/&lt;i&gt;user&lt;/i&gt; - &lt;i&gt;user&lt;/i&gt; ist Ihr Login) ein.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Den Source Code müssen Sie auch in gedruckter Form abliefern. Dieses Listing sollte dann etwa so aussehen:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;a href="http://3.bp.blogspot.com/_gmjWOaOfpfo/TLgIn5VarmI/AAAAAAAAEXo/evpuUWiQV3M/s1600/listing.png" imageanchor="1" style="color: #336699; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="448" src="http://3.bp.blogspot.com/_gmjWOaOfpfo/TLgIn5VarmI/AAAAAAAAEXo/evpuUWiQV3M/s640/listing.png" style="border-bottom-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(255, 255, 255); border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 13px;"&gt;Das Listing sollte folgende Eigenschaften aufweisen:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: Verdana, Arial, sans-serif; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;li&gt;Autor und Dateiname ist sofort ersichtlich&lt;/li&gt;&lt;li&gt;Seitennummern werden gedruckt&lt;/li&gt;&lt;li&gt;Syntax-Hilighting: Schlüsselworte, Kommentare usw. sollten unterschiedlich formatiert sein&lt;/li&gt;&lt;li&gt;Querformat mit&amp;nbsp;&lt;b&gt;zwei Spalten&lt;/b&gt;, um Papier zu sparen (Zwei Seiten auf eine drucken)&lt;/li&gt;&lt;li&gt;Es muss ein "fixed font" (z.B.&amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Courier&lt;/span&gt;&lt;/i&gt;)&amp;nbsp;verwendet werden, d.h.&amp;nbsp;&lt;b&gt;jedes Zeichen&lt;/b&gt;&amp;nbsp;hat die&amp;nbsp;&lt;b&gt;selbe Breite&lt;/b&gt;&amp;nbsp;(ausgenommen String-Konstante)&lt;/li&gt;&lt;li&gt;Optional sollen Zeilennummern gedruckt werden (siehe Beispiele unten).&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Beispiel mit Zeilennummern:&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gmjWOaOfpfo/TLgL8k5PQII/AAAAAAAAEXs/Fp_LEtxJmqU/s1600/listing-linenums.png" imageanchor="1" style="color: #336699; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="443" src="http://2.bp.blogspot.com/_gmjWOaOfpfo/TLgL8k5PQII/AAAAAAAAEXs/Fp_LEtxJmqU/s640/listing-linenums.png" style="border-bottom-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(255, 255, 255); border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Beispiel mit Zeilennummern, nur jede 5. Zeile bekommt eine Nummer:&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gmjWOaOfpfo/TLgMK50URiI/AAAAAAAAEXw/GkJzc9Xplhs/s1600/listing-linenums5.png" imageanchor="1" style="color: #336699; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="456" src="http://4.bp.blogspot.com/_gmjWOaOfpfo/TLgMK50URiI/AAAAAAAAEXw/GkJzc9Xplhs/s640/listing-linenums5.png" style="border-bottom-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(255, 255, 255); border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Unter Linux können Sie den Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt;&amp;nbsp;(&lt;b&gt;A&lt;/b&gt;SCII to&amp;nbsp;&lt;b&gt;P&lt;/b&gt;ost&lt;b&gt;S&lt;/b&gt;cript,&amp;nbsp;&lt;b&gt;2&lt;/b&gt;&amp;nbsp;= two = to, daher&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt;) verwenden.&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Beispiele&lt;/b&gt;:&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;pre class="prettyprint" style="border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;span class="pln" style="color: black;"&gt;a2ps &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Phpg1&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; dreieck&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;py&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Die Datei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;dreieck.py&lt;/code&gt;&amp;nbsp;wird auf dem Drucker&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;hpg1&lt;/code&gt;&amp;nbsp;ohne Zeilennummern gedruckt.&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;pre class="prettyprint" style="border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;span class="pln" style="color: black;"&gt;a2ps &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;--&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;line&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;numbers&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Phpg2&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; dreieck&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;py newprog&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;py&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Die Dateien&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;dreieck.py&lt;/code&gt;&amp;nbsp;und&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;newprog.py&lt;/code&gt;&amp;nbsp;werden am Drucker&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;hpg2&lt;/code&gt;&amp;nbsp;mit Zeilennummern gedruckt.&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;pre class="prettyprint" style="border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;span class="pln" style="color: black;"&gt;a2ps &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;--&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;line&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;numbers&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;5&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Phpg3&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; dreieck&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;py newprog&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;py&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Die Dateien&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;dreieck.py&lt;/code&gt;&amp;nbsp;und&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;newprog.py&lt;/code&gt;&amp;nbsp;werden am Drucker&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;hpg3&lt;/code&gt;&amp;nbsp;mit Zeilennummern gedruckt, wobei nur jede fünfte Zeilennummer gedruckt wird.&lt;/div&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Weitere Optionen zu&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt;&amp;nbsp;finden Sie in der&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man&lt;/code&gt;-Page (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man a2ps&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;Die meisten&amp;nbsp;&lt;b&gt;IDE&lt;/b&gt;s (z.B.&amp;nbsp;&lt;i&gt;eclipse&lt;/i&gt;&amp;nbsp;oder&amp;nbsp;&lt;i&gt;netbeans&lt;/i&gt;) und viele Editoren bieten ähnliche Möglichkeiten, jedoch passt bei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt;&amp;nbsp;der Ausdruck praktisch immer, abgesehen davon, dass&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt;&amp;nbsp;nur ASCII-versteht und damit Probleme mit Umlauten hat. Sind Umlaute im Source Code (nur in Kommentaren erlaubt), so kann man mit dem Tool &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;iconv&lt;/code&gt; das Encoding für &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt; anpassen. Obiges Beispiel würde dann so aussehen:&lt;/div&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;pre class="prettyprint" style="border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;span class="pln" style="color: black;"&gt;iconv -f utf8 -t latin1 dreieck.py -o - | a2ps --stdin=dreieck.py &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;--&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;line&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;numbers&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;5&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Phpg3&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="pln" style="color: black;"&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt; benötigt noch einen Titel für stdin (Option &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;--stdin=title&lt;/code&gt;), weil die Standardausgabe von &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;iconv&lt;/code&gt; von &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a2ps&lt;/code&gt; gelesen wird.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="line-height: 1.3em; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-755099159596924276?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/755099159596924276/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/10/abgaben-am-cvs-pos1-2-3-klassen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/755099159596924276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/755099159596924276'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/10/abgaben-am-cvs-pos1-2-3-klassen.html' title='Abgaben am CVS (POS1: 2., 3. Klassen)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gmjWOaOfpfo/TLgIn5VarmI/AAAAAAAAEXo/evpuUWiQV3M/s72-c/listing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-6065952433858640448</id><published>2011-10-01T16:30:00.001+02:00</published><updated>2011-10-02T10:44:50.176+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='Informatik'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Überlauf mit C-Datentypen in Python</title><content type='html'>Wenn man z.B. ganze Zahlen mit nur einem Byte (8bit) darstellen will, so hat man den Bereich -128 (-2&lt;sup&gt;8 - 1&lt;/sup&gt;) bis +127 (2&lt;sup&gt;8 - 1&lt;/sup&gt; - 1) zur Verfügung, weil üblicherweise die negativen Zahlen im Zweierkomplement dargestellt werden. Hat eine ein Byte große Variable var den Wert 127, so entspricht das binär 01111111&lt;sub&gt;2&lt;/sub&gt;. Zählt man 1 dazu, so erhält man binär 10000000&lt;sub&gt;2&lt;/sub&gt;. Dieser Wert entspricht aber der Zahl -128&lt;sub&gt;10&lt;/sub&gt;.&lt;br /&gt;-1&lt;sub&gt;10&lt;/sub&gt; entspricht der binären Zahl 11111111&lt;sub&gt;2&lt;/sub&gt; im Zweierkomplement (ansonsten wäre es 2&lt;sup&gt;8&lt;/sup&gt; - 1 also 255). Zählt man zu 11111111&lt;sub&gt;2&lt;/sub&gt; 1 dazu, erhält man 100000000&lt;sub&gt;2&lt;/sub&gt;. Da der Einser ganz vorne die 9. Stelle wäre, die in 8bit nicht mehr dargestellt werden kann, so fliegt sie raus und wir bekommen 00000000&lt;sub&gt;2&lt;/sub&gt;, also 0.&lt;br /&gt;Das folgende Bespiel zeigt die Verwendung eines C-Datentypen für ein Byte, wo tatsächlich immer nur 8bit verwendet werden. Allerdings kann man nicht unmittelbar mit den Werten rechnen, da diese Werte sonst einfach in den entsprechenden Python-Typ &lt;b&gt;int&lt;/b&gt; umgewandelt werden würde und es nicht zu einem Überlauf käme.&lt;pre class="prettyprint"&gt;import ctypes # see help(ctypes)&lt;br /&gt;&lt;br /&gt;def inc(var):&lt;br /&gt;    """increment var by one"""&lt;br /&gt;    return type(var)(var.value + 1)&lt;br /&gt;&lt;br /&gt;def dec(var):&lt;br /&gt;    """decrement var by one"""&lt;br /&gt;    return type(var)(var.value - 1)&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    var = ctypes.c_byte(126) # var = 126 - one byte&lt;br /&gt;    var = inc(var)           # var = 127&lt;br /&gt;    print(var.value)&lt;br /&gt;    var = inc(var)           # var = -128 (10000000 binary)&lt;br /&gt;    print(var.value)&lt;br /&gt;    &lt;br /&gt;    var = ctypes.c_byte(-1)  # var = -1 - one byte (11111111 binary)&lt;br /&gt;    var = inc(var)           # var = 0&lt;br /&gt;    print(var.value)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Im folgenden Video wird das auch ganz schön erklärt:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/OBpz7Apk6S0/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/OBpz7Apk6S0&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/OBpz7Apk6S0&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-6065952433858640448?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/6065952433858640448/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/10/uberlauf-mit-c-datentypen-in-python.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6065952433858640448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6065952433858640448'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/10/uberlauf-mit-c-datentypen-in-python.html' title='Überlauf mit C-Datentypen in Python'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-4020601021548461237</id><published>2011-09-29T09:23:00.000+02:00</published><updated>2011-09-29T09:23:10.001+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>vim Übung</title><content type='html'>&lt;p&gt;Legen Sie eine Datei mit ihren Initialen und Extension &lt;code&gt;.txt&lt;/code&gt; an&lt;br /&gt;Bsp:&lt;/p&gt; &lt;pre&gt;  rr.txt&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Einfügen von 5 Zeilen mit beliebigem Text&lt;/p&gt; &lt;p&gt;Einfügen von &lt;code&gt;&lt;q&gt;Asterix&lt;/q&gt;&lt;/code&gt; als eigene Zeile &lt;strong&gt;nach&lt;/strong&gt; der &lt;strong&gt;4. Zeile&lt;/strong&gt;  &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Positionieren&lt;/strong&gt; auf 3. Zeile&lt;/p&gt; &lt;p&gt;Am Ende der Zeile das wort &lt;code&gt;&lt;q&gt;xyyz&lt;/q&gt;&lt;/code&gt; einfügen&lt;/p&gt; &lt;p&gt;Kopieren der 3. Zeile&lt;/p&gt; &lt;p&gt;Einfügen dieser Zeile &lt;strong&gt;85 mal&lt;/strong&gt; nach der 5. Zeile&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Suchen&lt;/strong&gt; nach String &lt;code&gt;&lt;q&gt;rix&lt;/q&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Schalten Sie die Zeilennummerierung ein&lt;/p&gt; &lt;p&gt;Gehe zu Zeile 70&lt;/p&gt; &lt;p&gt;Lösche 10 Zeilen&lt;/p&gt; &lt;p&gt;Kopiere Zeilen 13-45 in eine neue Datei mit Namen &lt;code&gt;'partrr.txt'&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Alle Zeichen &lt;code&gt;'y'&lt;/code&gt; durch &lt;code&gt;'§'&lt;/code&gt; ersetzen&lt;/p&gt; &lt;p&gt;Einfügen der Zeilen 5-10 aus der Datei &lt;code&gt;'partrr.txt'&lt;/code&gt; nach der letzten Zeile&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-4020601021548461237?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/4020601021548461237/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/09/vim-ubung.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4020601021548461237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4020601021548461237'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/09/vim-ubung.html' title='vim Übung'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-6191676238628349265</id><published>2011-09-29T09:22:00.000+02:00</published><updated>2011-09-29T12:47:09.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>vim Einführung</title><content type='html'>Bitte lesen Sie die &lt;a href="http://edvowww.htlwrn.ac.at/cgi-bin/programmierblog.cgi/2007/09/11#vim-intro-3"&gt;Vim-Einführung&lt;/a&gt; und bearbeiten Sie die Fragen auf dem alten Blog.&lt;br /&gt;&lt;br /&gt;Bearbeiten Sie auch die Übungsbeispiele &lt;a href="http://edvowww.htlwrn.ac.at/cgi-bin/programmierblog.cgi/2007/09/13#vim-uebung"&gt;vim - Übung&lt;/a&gt; und &lt;a href="http://edvowww.htlwrn.ac.at/cgi-bin/programmierblog.cgi/2007/09/20#vim-uebung-2"&gt;vim - Übung 2&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Vim&lt;/strong&gt; ist ein hervorragender Editor mit Syntaxhervorhebung und Vergleichsfunktionen, mehreren Darstellungsfenstern und vielen anderen nützlichen Funktionen. Leider ist der Einstieg damit nicht immer ganz leicht, da vim eine Weiterentwicklung des Editors &lt;strong&gt;vi&lt;/strong&gt; ist, den es bereits in den 80er Jahren gab, wo Benutzerfreundlichkeit noch eine andere Bedeutung hatte als heute. Weiterhin erscheint vim im unkonfigurierten Zustand zunächst erstmal sehr langweilig und es ist mühselig eine passende Konfiguration zu erstellen.&lt;/p&gt; &lt;p&gt;Der &lt;strong&gt;vi&lt;/strong&gt; ist praktisch auf jedem Linux-System verfügbar und kann von der Shell (Terminal) aus verwendet werden. Daher ist es praktisch, wenn man den vi(m) beherrscht, wenn man einen Server (z.B. Web-Server) über das Internet warten muss. Die wichtigsten Funkionen kann man &lt;strong&gt;probieren&lt;/strong&gt; und &lt;strong&gt;üben&lt;/strong&gt; mit &lt;code&gt;vimtutor&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Weitere Dokumentation finden Sie hier:&lt;br /&gt;&lt;a href="http://de.linwiki.org/index.php/Vim"&gt;vim Kurzreferenz auf  LinWiKi&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.vim.org/"&gt;vim Homepage www.vim.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://edvowww.htlwrn.ac.at/HP/blosxom/vim/vimqrc.pdf"&gt;vim Quick Reference Card (2 Seiten)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Wir verwenden eine spezielle Konfigurationsdatei für den &lt;strong&gt;vim&lt;/strong&gt;. Im Laufe dieses Schuljahres werden wir Ihnen diese Datei (eigentlich eine überarbeitete Version, denn die bisherige Version ist hauptsächlich für C-Programmierung eingerichtet) zur Verfügung stellen. Also, bleiben Sie dran oder suchen Sie auf &lt;a href="http://www.vim.org/scripts/index.php"&gt;www.vim.org/scripts&lt;/a&gt; nach passenden Scripts für den &lt;strong&gt;vim&lt;/strong&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-6191676238628349265?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/6191676238628349265/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/09/vim-einfugen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6191676238628349265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6191676238628349265'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/09/vim-einfugen.html' title='vim Einführung'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-530799855272056976</id><published>2011-09-29T09:18:00.001+02:00</published><updated>2011-09-29T09:18:54.638+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><title type='text'>Bash (Shell) (POS1: 2B)</title><content type='html'>&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;Das Betriebssystem, in unserem Falle Linux, stellt eine Schnittstelle zwischen Anwendungsprogrammen und der Hardware (Tastatur, Bildschirm, Maus, Festplatten, Netzwerk,...) dar. Das Betriebssystem ist also eine virtuelle Maschine mit einfachen Aufrufen zur Bedienung der Hardware.&lt;/span&gt;&lt;br /&gt;Eine Shell ist nun ein Anwendungsprogramm, welches Eingaben vom Benutzer in geeignete Betriebssystemaufrufe umsetzt und ggf. andere Programme aufruft (d.h. das Betriebssystem mit einem bestimmten Aufruf das Programm starten lässt).&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_gmjWOaOfpfo/SrYZxqgHlUI/AAAAAAAACgU/dmVBbiSkMPg/s1600-h/shell.png" style="color: #336699;"&gt;&lt;img alt="Darstellung Shell - schalenförmig über Betriebssystem über Hardware" border="0" id="BLOGGER_PHOTO_ID_5383518745581294914" src="http://2.bp.blogspot.com/_gmjWOaOfpfo/SrYZxqgHlUI/AAAAAAAACgU/dmVBbiSkMPg/s320/shell.png" style="border-bottom-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(255, 255, 255); border-top-style: solid; border-top-width: 1px; cursor: pointer; display: block; height: 205px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;Auch andere Betriebssysteme haben zur Bedienung Shells: Unter Windows NT/2000/XP gibt es &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;CMD.EXE&lt;/code&gt;.&lt;br /&gt;Die&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;bash&lt;/code&gt;&amp;nbsp;ist ein Interpreter mit einer&amp;nbsp;&lt;strong&gt;&lt;q&gt;vollständigen Programmiersprache&lt;/q&gt;&lt;/strong&gt;. Es können damit&amp;nbsp;&lt;q&gt;on-the-fly&lt;/q&gt;&amp;nbsp;kleine Programme mit Schleifen, Abfragen etc. erstellt werden, ohne dass man einen Editor dazu bemühen muss.&lt;br /&gt;Da die Eingabe über die Tastatur speziell bei langen Pfadnamen (255 Zeichen für einen Dateinamen!) sehr mühsam und fehleranfällig ist, bietet die bash einige nützliche Features (einige dieser Features gibt es erstmals auch in der Shell von Windows XP):&lt;br /&gt;&lt;h4&gt;Ergänzung der Kommandozeile&lt;/h4&gt;Kommandos oder Pfade brauchen nicht vollständig eingetippt werden. Meist genügen wenige Buchstaben, die dann durch Drücken der Taste&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;TAB&lt;/code&gt;&amp;nbsp;(Tabulator) auf den richtigen Pfad (das richtige Kommando) ergänzt werden. Falls der Pfad nicht eindeutig ergänzt werden kann, werden alle Möglichkeiten durch neuerliches Drücken von&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;TAB&lt;/code&gt;&amp;nbsp;angezeigt. Pfade werden immer zum nächsten Directory ergänzt oder zumindest soweit sie eindeutig sind.&lt;br /&gt;&lt;h4&gt;&lt;q&gt;History&lt;/q&gt;&lt;/h4&gt;Die letzten Befehle können mit den Cursor-Tasten ausgewählt und editiert werden.&lt;br /&gt;Mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;!!&lt;/code&gt;&amp;nbsp;wird der letzte Befehl ausgeführt, mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;!-2&lt;/code&gt;&amp;nbsp;wird der vorletzte mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;!-3&lt;/code&gt;&amp;nbsp;der vorvorletzte usw. ausgeführt. Mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;!15&lt;/code&gt;&amp;nbsp;wird der 15. Befehl ausgeführt.&lt;br /&gt;Mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;!string&lt;/code&gt;&amp;nbsp;wird der letzte Befehl, der mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;string&lt;/code&gt;&amp;nbsp;begonnen hat, ausgeführt.&lt;br /&gt;Mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;!?string?&lt;/code&gt;&amp;nbsp;wird der letzte Befehl, der&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;string&lt;/code&gt;&amp;nbsp;enthält ausgeführt.&lt;br /&gt;Mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;sup&gt;string1^string2&lt;/sup&gt;&lt;/code&gt;&amp;nbsp;wird das letzte Kommando ausgeführt, wobei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;string1&lt;/code&gt;&amp;nbsp;durch&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;string2&lt;/code&gt;ersetzt wird.&lt;br /&gt;Der Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;history&lt;/code&gt;&amp;nbsp;zeigt eine Liste der letzten Kommandos (mit deren Nummer) an.&lt;br /&gt;Durch Drücken von&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;^r&lt;/code&gt;&amp;nbsp;(&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;Strg+R&lt;/code&gt;) kommt man in den Kommando-Suchmmodus, d.h. es wird das letzte Kommando angezeigt, welches die im folgenden getippten Buchstaben enthält. Mit weiteren&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;^r&lt;/code&gt;&amp;nbsp;kommt man zum nächsten Befehl, der die Buchstaben enthält. Mit Enter wird der Befehl ausgeführt, mit den Links- und Rechts-Pfeiltasten kann der gewählte Befehl editiert werden.&lt;br /&gt;Weiteres siehe unter&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man bash&lt;/code&gt;.&lt;br /&gt;&lt;h5&gt;Beispiele (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 11px;"&gt;$&lt;/code&gt;&amp;nbsp;stellt den Prompt dar, alles hinter&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 11px;"&gt;#&lt;/code&gt;&amp;nbsp;gilt als Kommentar):&lt;/h5&gt;&lt;pre&gt;$ vim Telegramme.c                    # editieren&lt;br /&gt;$ gcc -o telegramme Telegramme.c      # compilieren&lt;br /&gt;$ telegramme                          # ausführen&lt;br /&gt;$ !v                                  # Wiederholung von vim&lt;br /&gt;$ !gc                                 # neuerliches compilieren&lt;br /&gt;$ !t                                  # Aufruf von telegramme&lt;/pre&gt;&lt;h4&gt;Job-Control&lt;/h4&gt;Ein laufendes Programm kann mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;^z&lt;/code&gt;&amp;nbsp;(&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;Strg-Z&lt;/code&gt;) unterbrochen werden. Danach kann mit der &lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;bash&lt;/code&gt;&amp;nbsp;weitergearbeitet werden. mit dem Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;fg&lt;/code&gt;&amp;nbsp;kann das letzte unterbrochene Programm wieder fortgesetzt werden.&lt;br /&gt;Es können auch mehrere Programme unterbrochen werden (z.B.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;vim&lt;/code&gt;&amp;nbsp;wird unterbrochen,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man fprintf&lt;/code&gt;&amp;nbsp;aufgerufen, dieses Kommando wird unterbrochen usw.). Die unterbrochenen Programme können mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;jobs&lt;/code&gt;&amp;nbsp;aufgelistet werden. Ein bestimmtes gestopptes (unterbrochenes) Programm mit der Job-Nummer&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;2&lt;/code&gt;&amp;nbsp;kann mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;fg %2&lt;/code&gt;&amp;nbsp;wieder in den&amp;nbsp;&lt;q&gt;Vordergrund&lt;/q&gt;&amp;nbsp;gebracht werden.&lt;br /&gt;Mit diesen Möglichkeiten kann leicht zwischen mehreren Programmen hin- und hergeschaltet werden.&lt;br /&gt;Programme, die vermutlich länger ohne Eingaben vom Benutzer laufen werden, können durch Anhängen von&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&amp;amp;&lt;/code&gt;&amp;nbsp;als Hintergrundprozesse gestartet werden. Ein Hintergrundprozess kann ebenfalls mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;fg&lt;/code&gt;&amp;nbsp;wieder in den Vordergrund gebracht werden.&lt;br /&gt;&lt;strong&gt;Beispiel:&lt;/strong&gt;&amp;nbsp;es sollen alle C-Files gesucht werden und die Namen (Pfade) in einer Liste gespeichert werden ($ ist der Prompt, wird also nicht eingegeben):&lt;br /&gt;&lt;pre&gt;$ find / -name '*.c' -print &amp;gt; c-files.txt &amp;amp;&lt;br /&gt;[1] 3751                                                   # Job-Nummer und Prozess-ID wird angezeigt&lt;br /&gt;$ vim Telegramme.c&lt;br /&gt;[1]+ Done find . -name '*.c' -print &amp;gt;c-files.txt           # Benachrichtigung, dass Kommando fertig&lt;br /&gt;$ less c-files.txt                                         # Anzeigen des Files&lt;/pre&gt;Obiges Kommando könnte mittels&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;kill %1&lt;/code&gt;&amp;nbsp;oder&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;kill 3751&lt;/code&gt;&amp;nbsp;(&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;kill&lt;/code&gt;&amp;nbsp;und Prozess-ID) vorzeitig abgebrochen werden.&lt;br /&gt;Programme im&amp;nbsp;&lt;q&gt;Vordergrund&lt;/q&gt;&amp;nbsp;können mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;^c&lt;/code&gt;&amp;nbsp;(&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;Strg+C&lt;/code&gt;) abgebrochen werden.&lt;br /&gt;&lt;h4&gt;Befehlssyntax&lt;/h4&gt;Generell sind Unix-Kommandos wie folgt aufgebaut:&lt;br /&gt;&lt;pre&gt;$ cmd [optionen] [argument]...&lt;/pre&gt;Die eckigen Klammern&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;[ ]&lt;/code&gt;&amp;nbsp;zeigen an, dass dieser Teil optional ist. Die drei Punkte&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;...&lt;/code&gt;bedeuten, dass der Teil davor mehrfach vorhanden sein kann.&lt;br /&gt;Prinzipiell können immer mehrere Parameter angegeben werden. Optionen beginnen immer mit einem Minus (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-&lt;/code&gt;) und werden von einem Buchstaben gefolgt. Mehrere Optionen können zusammengefasst werden. z.B.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls -a -l&lt;/code&gt;&amp;nbsp;kann auch als&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls -al&lt;/code&gt;&amp;nbsp;eingegeben werden.&lt;br /&gt;Viele (neuere, GNU-) Programme erlauben auch&amp;nbsp;&lt;q&gt;lange&lt;/q&gt;&amp;nbsp;Optionen, d.h. ganze Wörter zur Bezeichnung einer Option. Solche Optionen beginnen mit zwei Minus (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;–&lt;/code&gt;). Das Kommando&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;find&lt;/code&gt;ist hier eine Ausnahme (s.o.).&lt;br /&gt;&lt;strong&gt;Beispiel:&lt;/strong&gt;&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls -l&lt;/code&gt;&amp;nbsp;und&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls –format=long&lt;/code&gt;&amp;nbsp;geben beide den Inhalt des Verzeichnisses im langen Format aus.&lt;br /&gt;Generell sind Wildcards und&amp;nbsp;&lt;a href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" style="color: #336699;"&gt;reguläre Ausdrücke&lt;/a&gt;&amp;nbsp;als Argumente möglich (die Shell erweitert reguläre Ausdrücke auf Listen von Parametern, d.h. das Kommando wird dann mit einer Liste aller passenden Files aufgerufen).&lt;br /&gt;&lt;h4&gt;Wildcards&lt;/h4&gt;&lt;strong&gt;Wildcards&lt;/strong&gt;&amp;nbsp;sind Ersetzungsmuster, die von der Shell ersetzt werden. Wenn Sie z.B. alle Dateien auflisten wollen, die mit einem&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;'a'&lt;/code&gt;&amp;nbsp;beginnen, dann geben Sie&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;echo a*&lt;/code&gt;&amp;nbsp;ein. Es werden dann Dateien der Art&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a&lt;/code&gt;,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a1&lt;/code&gt;,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;abc&lt;/code&gt;,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;alloc.c&lt;/code&gt;&amp;nbsp;aufgelistet, falls sie existieren. Der&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;'*'&lt;/code&gt;&amp;nbsp;steht für&lt;em&gt;kein&lt;/em&gt;,&amp;nbsp;&lt;em&gt;ein&lt;/em&gt;&amp;nbsp;oder&amp;nbsp;&lt;em&gt;mehrere&lt;/em&gt;&amp;nbsp;beliebige Zeichen. Wenn Sie Dateien suchen, die ein&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;'z'&lt;/code&gt;&amp;nbsp;enthalten, dann geben Sie&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;echo *z*&lt;/code&gt;&amp;nbsp;ein. Tatsächlich&amp;nbsp;&lt;strong&gt;ändert&lt;/strong&gt;&amp;nbsp;aber die Shell die&amp;nbsp;&lt;strong&gt;Parameterliste&lt;/strong&gt;&amp;nbsp;für den Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;echo&lt;/code&gt;, d.h. die Shell erzeugt eine Liste von Dateinamen, auf die das Muster zutrifft und ruft dann erst&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;echo&lt;/code&gt;&amp;nbsp;auf.&lt;br /&gt;Nehmen Sie an, das aktuelle Verzeichnis enthielte folgende Dateien:&lt;br /&gt;&lt;pre&gt;a.c zahlen.c anz.c anz.h anz hello.c a.out&lt;/pre&gt;Wenn Sie nun&lt;br /&gt;&lt;pre&gt;echo *z*&lt;/pre&gt;eingeben, erzeugt die Shell folgenden Aufruf&lt;br /&gt;&lt;pre&gt;echo zahlen.c anz.c anz.h&lt;/pre&gt;und führt den Befehl aus.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;echo&lt;/code&gt;&amp;nbsp;braucht sich nicht darum zu kümmern!&lt;br /&gt;Die Shell versteht noch andere Musterangaben. Beispielsweise:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;[aeiou]*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;alle Dateien, die mit einem Selbstlaut beginnen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;[0-9a-h]*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;alle Dateien, die mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;0&lt;/code&gt;&amp;nbsp;bis&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;9&lt;/code&gt;&amp;nbsp;oder&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;a&lt;/code&gt;&amp;nbsp;bis&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;h&lt;/code&gt;&amp;nbsp;beginnen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;??&lt;/code&gt;&lt;/td&gt;&lt;td&gt;alle Dateien, die aus genau 2 Zeichen bestehen (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;?&lt;/code&gt;&amp;nbsp;steht für ein Zeichen)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;*.[^ch]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;alle Dateien, die nicht mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;.c&lt;/code&gt;&amp;nbsp;oder&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;.h&lt;/code&gt;&amp;nbsp;enden&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;strong&gt;\*&lt;/strong&gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;alle Dateien, die einen Stern enthalten&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Mehr dazu unter&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man bash&lt;/code&gt;.&lt;br /&gt;&lt;h4&gt;Abkürzungen&lt;/h4&gt;&lt;strong&gt;Tilde&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;~&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;~/&lt;/code&gt;&amp;nbsp;ist eine Abkürzung für das Home-Verzeichnis des angemeldeten Benutzers (meist&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;/home/user&lt;/code&gt;, wenn&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;user&lt;/code&gt;&amp;nbsp;der Loginname).&lt;br /&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;~user/&lt;/code&gt;&amp;nbsp;ist die Abkürzung für das Homeverzeichnis des Users&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;user&lt;/code&gt;.&lt;br /&gt;&lt;strong&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;alias&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;Mit dem Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;alias&lt;/code&gt;&amp;nbsp;können selbst Abkürzungen zu längeren Befehlen gemacht werden:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;alias md="mkdir"&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;md&lt;/code&gt;&amp;nbsp;ist nun eine Kurzversion von&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;mkdir&lt;/code&gt;&amp;nbsp;(MaKe DIRectory)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Sie können mehrere immer wieder verwendete Abkürzungen in der Datei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;.bashrc&lt;/code&gt;&amp;nbsp;speichern.&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;.bashrc&lt;/code&gt;&amp;nbsp;ist eine Datei, die automatisch beim Starten einer&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;bash&lt;/code&gt;&amp;nbsp;interpretiert (ausgeführt) wird.&lt;br /&gt;Der Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;alias&lt;/code&gt;&amp;nbsp;ohne Argumente gibt die Liste der derzeit aktiven Abkürzungen aus.&lt;br /&gt;&lt;h4&gt;Shell-Variable&lt;/h4&gt;Da die&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;bash&lt;/code&gt;&amp;nbsp;eine vollständige Programmiersprache ist, gibt es natürlich auch Variable. Diese Variable werden nicht nur für die Programmierung eingesetzt sondern auch für die Konfiguration.&lt;br /&gt;Shell-Variable werden üblicherweise in Großbuchstaben geschrieben (Groß-/Kleinschreibung ist entscheidend).&lt;br /&gt;Für die interaktive Verwendung wird normalerweise das Kommando&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;export&lt;/code&gt;&amp;nbsp;verwendet:&lt;br /&gt;&lt;pre&gt;export PATH=~/bin:$PATH&lt;/pre&gt;Mit obigem Befehl wird der Suchpfad, das sind diejenigen Verzeichnisse, in denen ein Programm oder ein Kommando gespeichert ist, geändert. Es wird der Pfad&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;~/bin&lt;/code&gt;&amp;nbsp;vorne angefügt.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;$PATH&lt;/code&gt;&amp;nbsp;liefert den Inhalt der Variable&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;PATH&lt;/code&gt;&amp;nbsp;(es erfolgt reine Textersetzung).&lt;br /&gt;Einige Variable sind schon vordefiniert:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;$HOME&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Homeverzeichnis&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;$SHELL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;die verwendete Shell&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h4&gt;Ein-/Ausgabeumlenkung&lt;/h4&gt;Die Ausgabe von Kommandos kann mit dem Größerzeichen (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&amp;gt;&lt;/code&gt;) in eine Datei umgelenkt werden. Z.B.:&lt;br /&gt;&lt;pre&gt;ls -l /usr/bin &amp;gt; ls.txt&lt;/pre&gt;Die Datei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls.txt&lt;/code&gt;&amp;nbsp;wird erzeugt und die Ausgabe von&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls&lt;/code&gt;&amp;nbsp;darin gespeichert.&lt;br /&gt;Verwendet man zwei Größerzeichen (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&amp;gt;&amp;gt;&lt;/code&gt;), so wird die Ausgabe an die angegebene Datei angehängt.&lt;br /&gt;Umgekehrt kann auch die Eingabe für ein Programm aus einer Datei erfolgen, indem man das Kleinerzeichen verwendet:&lt;br /&gt;&lt;pre&gt;grep &lt;q&gt;^d&lt;/q&gt; &amp;lt;eingabedatei&lt;/pre&gt;Diese Varianten können kombiniert werden.&lt;br /&gt;&lt;pre&gt;kommando parameter… &amp;lt;eingabedatei&amp;gt;ausgabedatei&lt;/pre&gt;Oft werden Kommandos direkt kombiniert, indem die Ausgabe eines Programms direkt in die Eingabe des nächsten Programms&amp;nbsp;&lt;q&gt;gepumpt&lt;/q&gt;&amp;nbsp;wird. Die Programme werden mit einer&amp;nbsp;&lt;strong&gt;pipe&lt;/strong&gt;(pipeline) verbunden. Das dafür nötige Zeichen ist der senkrechte Strich (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;|&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;ls -l | grep &lt;q&gt;^d&lt;/q&gt;&lt;/pre&gt;Obiger Befehl gibt alle Verzeichnisse aus, da&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;grep&lt;/code&gt;&amp;nbsp;mit dem Parameter&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;q&gt;^d&lt;/q&gt;&lt;/code&gt;&amp;nbsp;alle Zeilen, die mit einem&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;'d'&lt;/code&gt;&amp;nbsp;beginnen, ausgibt.&lt;br /&gt;Es können beliebig viele Programme mit pipes verbunden werden, es entsteht dadurch eine richtige Verarbeitungskette. Ist die Ausgabe sehr lange, so könnte im obigen Beispiel noch&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;less&lt;/code&gt;&amp;nbsp;verwendet werden, um in der Ausgabe blättern zu können.&lt;br /&gt;&lt;pre&gt;ls -l | grep &lt;q&gt;^d&lt;/q&gt; | less&lt;/pre&gt;Auf diese Weise lassen sich komplexe Aufgaben einfach und effizient erledigen.&lt;br /&gt;Dabei ist zu beachten, dass die Shell hier einige Arbeit übernimmt: bei der Eingabeumlenkung öffnet die Shell die Datei zum Lesen und&amp;nbsp;&lt;q&gt;tippt&lt;/q&gt;&amp;nbsp;die Zeilen ein. Bei der Ausgabeumlenkung öffnet die Shell die Datei zum Schreiben und verschiebt die Ausgabe in diese Datei. Die pipe kann man sich als temporäre Datei vorstellen, in die das eine Programm schreibt und aus der das nächste Programm liest, wenngleich der Mechanismus natürlich effizienter gelöst ist.&lt;br /&gt;&lt;h4&gt;Wichtige Kommandos&lt;/h4&gt;Fast alle Befehle oder Programme erlauben die Option&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-h&lt;/code&gt;,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-help&lt;/code&gt;&amp;nbsp;(ein Minus) oder&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;–help&lt;/code&gt;&amp;nbsp;(zwei Minus) und geben dann eine Kurzhilfe aus.&lt;br /&gt;&lt;pre&gt;ls [optionen] [path]...&lt;/pre&gt;Anzeigen des Inhalts von Verzeichnissen. Die wichtigsten Optionen sind:&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-l&lt;/code&gt;&amp;nbsp;um alle Informationen (langes Format) anzuzeigen,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-a&lt;/code&gt;&amp;nbsp;um alle Dateien anzuzeigen (auch die versteckten)&lt;br /&gt;&lt;pre&gt;cp src... dest&lt;/pre&gt;Kopieren von Dateien. Hat&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;cp&lt;/code&gt;&amp;nbsp;mehr als zwei Parameter, so muss der letzte Parameter ein Verzeichnis sein.&lt;br /&gt;Mit der Option&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-r&lt;/code&gt;&amp;nbsp;können rekursiv ganze Verzeichnisbäume kopiert werden.&lt;br /&gt;&lt;pre&gt;mv src... dest&lt;/pre&gt;Umbenennen/Verschieben von Dateien (move). Hat&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;mv&lt;/code&gt;&amp;nbsp;mehr als zwei Parameter, so muss der letzte Parameter ein Verzeichnis sein.&lt;br /&gt;&lt;pre&gt;rm list...&lt;/pre&gt;Löschen von Dateien (remove).&lt;br /&gt;Mit der Option&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-r&lt;/code&gt;&amp;nbsp;können rekursiv ganze Verzeichnisbäume gelöscht werden (&lt;strong&gt;VORSICHT&lt;/strong&gt;:&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;rm -rf *&lt;/code&gt;&amp;nbsp;löscht alles innerhalb und unterhalb des aktuellen Verzeichnises).&lt;br /&gt;&lt;pre&gt;mkdir list...&lt;/pre&gt;Erstellen von Verzeichnissen.&lt;br /&gt;&lt;pre&gt;cd [path]&lt;/pre&gt;Wechsel in das angegebene Verzeichnis. Wird kein Parameter angegeben, so wird ins Home-Verzeichnis gewechselt.&lt;br /&gt;&lt;pre&gt;rmdir list...&lt;/pre&gt;Löschen von Verzeichnissen (nur leere Verzeichnisse).&lt;br /&gt;&lt;pre&gt;cat [list...]&lt;/pre&gt;Ausgeben der angegebenen Dateien (die angegebenen Dateien werden auf diese Weise verkettet, da sie unmittelbar hintereinander ausgegeben werden)&lt;br /&gt;&lt;pre&gt;less [list...]&lt;/pre&gt;Seitenweise Ausgabe der angegebenen Dateien&lt;br /&gt;&lt;pre&gt;tar czf archiv.tgz list...&lt;/pre&gt;Ein komprimiertes Archiv mit dem Namen&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;archiv.tgz&lt;/code&gt;&amp;nbsp;aus den Dateien/Verzeichnissen list… erzeugen&lt;br /&gt;&lt;pre&gt;tar xzf archiv.tgz&lt;/pre&gt;Das Archiv wieder auspacken&lt;br /&gt;&lt;pre&gt;tar tzf archiv.tgz&lt;/pre&gt;Den Inhalt des Archivs ausgeben.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;tar&lt;/code&gt;&amp;nbsp;bietet noch viel mehr Optionen und Möglichkeiten und war ursprünglich ein Programm zur Datensicherung auf Bänder (tape archiver).&lt;br /&gt;&lt;pre&gt;file list...&lt;/pre&gt;gibt die Dateitypen aus. Unter UNIX haben die Datei-Endungen nicht die Bedeutung wie unter Windows, oft kann die Endung beliebig gewählt werden. Das Programm&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;file&lt;/code&gt;&amp;nbsp;öffnet nun die angegebenen Dateien und versucht aufgrund des Inhalts den Typ zu ermitteln.&lt;br /&gt;&lt;pre&gt;touch list...&lt;/pre&gt;ändert die Zugriffszeit der angegebenen Dateien oder erzeugt diese, wenn sie nicht existieren (Dateien mit der Länge 0).&lt;br /&gt;&lt;pre&gt;grep suchbegriff [list...]&lt;/pre&gt;Sucht den Suchbegriff in den gegebenen Dateien oder Standardeingabe (Eintippen oder Eingabeumlenkung). Wenn nur der Dateiname gesucht ist, der den Suchbegriff enthält, dann ist die Option&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-l&lt;/code&gt;&amp;nbsp;anzugeben. Der Suchbegriff kann aus regulären Ausdrücken bestehen, wodurch man komplexe Suchmuster angeben kann. Zu beachten ist allerdings, dass viele Sonderzeichen für reguläre Ausdrücke, eine spezielle Bedeutung in der Shell haben. Sie müssen daher maskiert werden, z.B. mit vorangestelltem&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;\&lt;/code&gt;&amp;nbsp;oder unter einfache Hochkomma (&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;'&lt;/code&gt;). Mehr dazu unter&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man grep&lt;/code&gt;&amp;nbsp;bzw.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man bash&lt;/code&gt;.&lt;br /&gt;&lt;pre&gt;ps&lt;/pre&gt;Prozessstatus, listet alle Prozesse auf, die in dieser Shell gestartet wurden.&lt;br /&gt;&lt;pre&gt;ps axu&lt;/pre&gt;listet alle Prozesse, aller User plus Zusatzinformationen auf. Die erste Spalte enthält den Usernamen, die zweite Spalte die Prozess-ID (PID) und die letzte Spalte den genauen Befehl.&lt;br /&gt;&lt;pre&gt;kill [signal] pid...&lt;/pre&gt;Schickt den angegebenen Prozessen das TERM-Signal (Terminieren). Die wichtigen Signale sind:&lt;br /&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-TERM&lt;/code&gt;,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;-KILL&lt;/code&gt;&amp;nbsp;(tötet den Prozess auf alle Fälle)&lt;br /&gt;&lt;pre&gt;killall [signal] name...&lt;/pre&gt;Schickt den angegebenen Prozessen das TERM-Signal (Terminieren). Die Prozesse werden durch den Befehlsnamen name (aufgerufenes Kommando) ausgewählt.&lt;br /&gt;Will man z.B. alle mozilla-Prozesse killen, gibt man&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;killall mozilla&lt;/code&gt;&amp;nbsp;ein.&lt;br /&gt;&lt;pre&gt;sort [list...]&lt;/pre&gt;gibt die Zeilen der angegebenen Dateien sortiert aus (bzw. die Zeilen der Standardeingabe).&lt;br /&gt;&lt;pre&gt;uniq [eingabedatei] [ausgabedatei]&lt;/pre&gt;löscht doppelte Zeilen aus einer sortierten Eingabe.&lt;br /&gt;&lt;h4&gt;Fortgeschrittenes&lt;/h4&gt;Es gibt mehrere Möglichkeiten, aus der Ausgabe eines Programms Argumente für die Kommandozeile zu machen.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Backticks:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=""&gt;$ ls `echo $HOME`&lt;/pre&gt;Hier wird zunächst der Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;echo $HOME&lt;/code&gt;&amp;nbsp;ausgeführt und dessen Ausgabe wird zum Argument des Befehls&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls&lt;/code&gt;&amp;nbsp;(das Home-Verzeichnis wird aufgelistet).&lt;/li&gt;&lt;li&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;xargs&lt;/code&gt;&lt;br /&gt;Das ist ein Programm, das von der Standardeingabe zeilenweise liest und jede Zeile als ein Kommandozeilenargument an das&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;xargs&lt;/code&gt;&amp;nbsp;übergebene Programm übergibt. Obiges Beispiel kann man also auch so schreiben:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint="&gt;echo $HOME|xargs ls&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;Hilfe&lt;/h4&gt;UNIX-Systeme werden normalerweise mit ausführlicher Online-Dokumentation ausgeliefert. Die Standarddokumentation entspricht den gedruckten Handbüchern und ist in mehrere Abschnitte eingeteilt:&lt;br /&gt;&lt;strong&gt;1&lt;/strong&gt;&amp;nbsp;Ausführbare Programme oder Shellbefehle&lt;br /&gt;&lt;strong&gt;2&lt;/strong&gt;&amp;nbsp;Systemaufrufe (Kernelfunktionen)&lt;br /&gt;&lt;strong&gt;3&lt;/strong&gt;&amp;nbsp;Bibliotheksaufrufe (Funktionen in System-Bibliotheken)&lt;br /&gt;&lt;strong&gt;4&lt;/strong&gt;&amp;nbsp;Spezielle Dateien (gewöhnlich in&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;/dev&lt;/code&gt;)&lt;br /&gt;&lt;strong&gt;5&lt;/strong&gt;&amp;nbsp;Dateiformate und Konventionen, z. B.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;/etc/passwd&lt;/code&gt;&lt;br /&gt;&lt;strong&gt;6&lt;/strong&gt;&amp;nbsp;Spiele&lt;br /&gt;&lt;strong&gt;7&lt;/strong&gt;&amp;nbsp;Makropakete und Konventionen, z. B. man(7), groff(7)&lt;br /&gt;&lt;strong&gt;8&lt;/strong&gt;&amp;nbsp;Systemadministrationsbefehle (in der Regel nur für root)&lt;br /&gt;&lt;strong&gt;9&lt;/strong&gt;&amp;nbsp;Kernelroutinen [Nicht Standard]&lt;br /&gt;&lt;strong&gt;n&lt;/strong&gt;&amp;nbsp;neu [veraltet]&lt;br /&gt;&lt;strong&gt;l&lt;/strong&gt;&amp;nbsp;lokal [veraltet]&lt;br /&gt;&lt;strong&gt;p&lt;/strong&gt;&amp;nbsp;öffentlich [veraltet]&lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt;&amp;nbsp;alt [veraltet]&lt;br /&gt;Zu jedem Befehl (Thema) gibt es eine Seite (können auch mehrere Seiten sein) mit dem Namen des Befehls (Themas). Will man eine bestimmte Seite des Manuals lesen, so verwendet man den Befehl&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man&lt;/code&gt;&amp;nbsp;(manual):&lt;br /&gt;&lt;pre&gt;man [abschnitt] seite&lt;/pre&gt;Wird abschnitt weggelassen, so zeigt&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man&lt;/code&gt;&amp;nbsp;die passende Seite mit der niedrigsten Abschnittsnummer an. Oft gibt es zu einem Thema in mehreren Abschnitten eine Seite. Dann muss der gewünschte Abschnitt angegeben werden.&lt;br /&gt;&lt;strong&gt;Beispiele:&lt;/strong&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man man&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hilfe zu&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man bash&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hilfe zur&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;bash&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man tar&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hilfe zu&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;tar&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man printf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hilfe zu&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;printf&lt;/code&gt;&amp;nbsp;der Shell&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man 3 printf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Meist will man aber Hilfe zur C-Funktion&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;printf&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Oft weiß man nicht genau, welche Manualseite man braucht. Mit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;man -k schlüsselwort&lt;/code&gt; kann man nach Schlüsselworten suchen lassen. Die Ausgabe ist eine Liste der Befehle, auf die das Schlüsselwort zutrifft.&lt;br /&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;apropos schlüsselwort&lt;/code&gt;&amp;nbsp;sucht nach Schlüsselworten in der Indexdatenbank der Manualseiten.&lt;br /&gt;Für GNU-Programme hat sich die Dokumentation im info-Format eingebürgert:&lt;br /&gt;&lt;pre&gt;info seite&lt;/pre&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;kdehelp&lt;/code&gt;&amp;nbsp;bietet Zugriff auf all diese Informationen sowie den Hilfetexten des KDE-Desktops.&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;kdehelp&lt;/code&gt;&amp;nbsp;ist auch über einen Menüpunkt des KDE-Menüs erreichbar. Bei neueren KDE-Versionen heißt das Programm&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;khelpcenter&lt;/code&gt;.&lt;br /&gt;&lt;h4&gt;Weitere Informationen&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://http//www.selflinux.org/selflinux/html/bash_basic.html" style="color: #336699;"&gt;Einführung in die Bourne Again Shell (bash)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://docs.google.com/viewer?url=http%3A%2F%2Fwww.selflinux.org%2Fselflinux-devel%2Fpdf%2Fbash_basic.pdf" style="color: #336699;"&gt;Einführung in die Bourne Again Shell (bash) (pdf)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bin-bash.de/" style="color: #336699;"&gt;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;/bin/bash&lt;/code&gt;&amp;nbsp;- Treffpunkt für Linux-Shelluser&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Fragen&lt;/h4&gt;1. Was ist eine Shell?&lt;br /&gt;2. Geben Sie Beispiele verschiedener Shells!&lt;br /&gt;3. Wie wird die Eingabe von langen Pfaden bei der bash erleichtert?&lt;br /&gt;4. Welche Möglichkeiten gibt es frühere Befehle wieder zu verwenden? Nennen Sie 3 Arten!&lt;br /&gt;5. Wie können in einer Shell mehrere Programme so gestartet werden, dass sie gleichzeitig laufen?&lt;br /&gt;6. Wie funktioniert Job-Control? Was ist der Zweck?&lt;br /&gt;7. Was sind Shell-Variable? Nennen Sie zwei Beispiele für die Verwendung!&lt;br /&gt;8. Wie sieht die allgemeine Befehlssyntax aus?&lt;br /&gt;9. Welche Bedeutung hat das Symbol&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;~&lt;/code&gt;&amp;nbsp;?&lt;br /&gt;10. Was können Sie tun, damit Sie statt&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;ls&lt;/code&gt;&amp;nbsp;das Kommandos&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;dir&lt;/code&gt;&amp;nbsp;verwenden können?&lt;br /&gt;11. Was müssen Sie tun, damit&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;dir&lt;/code&gt;&amp;nbsp;auch beim nächsten Mal wieder funktioniert?&lt;br /&gt;12. Was können Sie tun, wenn ein Programm keine Dateien lesen/schreiben kann, Sie aber mit diesem Programm dennoch Dateien bearbeiten wollen?&lt;br /&gt;13. Sie haben 3 Dateien&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;adr1&lt;/code&gt;,&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;adr2&lt;/code&gt;&amp;nbsp;und&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;adr3&lt;/code&gt;, welche Zeilen mit Namen und e-Mail-Adressen enthalten. Eine Zeile hat die Form&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;name vorname email&lt;/code&gt;. Die Einträge sind nicht sortiert. Manche Namen kommen nur in einer Datei vor, andere in mehreren Dateien. Geben Sie die Kommandozeile an, die alle 3 Dateien verknüpft, sortiert, die doppelten Namen löscht und in die Datei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;adr&lt;/code&gt;&amp;nbsp;ausgibt. Welcher Mechanismus muss hier verwendet werden?&lt;br /&gt;14. Sie haben ein Programm&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;myprog&lt;/code&gt;&amp;nbsp;gestartet, welches hängen geblieben ist. Welche Möglichkeiten haben Sie, das Programm zu beenden?&lt;br /&gt;15. Sie wollen wissen, welche C- oder Java-Datei im aktuellen Verzeichnis die Funktion&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;longjmp&lt;/code&gt;&amp;nbsp;enthält. Geben Sie das Kommando an! Was passiert hier genau?&lt;br /&gt;16. Sie wissen nicht genau, wie Befehl zum Archivieren/Zippen von Dateien heißt. Wie finden Sie die Information?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-530799855272056976?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/530799855272056976/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/09/bash-shell-pos1-2b.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/530799855272056976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/530799855272056976'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/09/bash-shell-pos1-2b.html' title='Bash (Shell) (POS1: 2B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gmjWOaOfpfo/SrYZxqgHlUI/AAAAAAAACgU/dmVBbiSkMPg/s72-c/shell.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5538513926255699617</id><published>2011-09-20T12:29:00.002+02:00</published><updated>2011-09-20T12:29:41.471+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='User Interface'/><title type='text'>Commandline resurrected</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WJI3bq8uq4A/TnhNViiXYnI/AAAAAAAAFqM/wqk8nBy4mQQ/s1600/CLI-Terminal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://4.bp.blogspot.com/-WJI3bq8uq4A/TnhNViiXYnI/AAAAAAAAFqM/wqk8nBy4mQQ/s320/CLI-Terminal.png" width="128" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Am Anfang war die Kommandozeile&lt;/b&gt;&lt;br /&gt;Das stimmt natürlich nicht ganz, denn davor gab es Programme durch Verdraten der Computer-Hardware, dann "Schreibmaschinen", mit denen man &lt;a href="http://de.wikipedia.org/wiki/Lochkarte"&gt;Lochkarten&lt;/a&gt;/Lochstreifen stanzen konnte, welche dann über ein Lesegerät in den Computer gelangten.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-t_nzJ9QwlKI/TnhP2G7GlbI/AAAAAAAAFqQ/Y4moe_nStcw/s1600/IBM-029+Lochkartenstanzer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-t_nzJ9QwlKI/TnhP2G7GlbI/AAAAAAAAFqQ/Y4moe_nStcw/s320/IBM-029+Lochkartenstanzer.jpg" width="299" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Ausgabe erfolgte über Endlos-Drucker.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_sLXLemPTUM/TnhP7E-PvnI/AAAAAAAAFqY/9Rd_lIl7jp0/s1600/Zeilendrucker_Honeywell.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-_sLXLemPTUM/TnhP7E-PvnI/AAAAAAAAFqY/9Rd_lIl7jp0/s320/Zeilendrucker_Honeywell.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Zur Datenspeicherung gab es Wieder Lochkarten oder Magnetbänder:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LPjAlBI0ImU/TnhP7n6wOSI/AAAAAAAAFqc/a_N1o2n6_2Q/s1600/IBM-711+Lochkartenleser-+Stanzer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://3.bp.blogspot.com/-LPjAlBI0ImU/TnhP7n6wOSI/AAAAAAAAFqc/a_N1o2n6_2Q/s320/IBM-711+Lochkartenleser-+Stanzer.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Natürlich gab es noch verschiedenste Ein- und Ausgabegeräte, aber das Wesentliche an der Arbeit mit Computern war damals, dass es nur "&lt;a href="http://de.wikipedia.org/wiki/Stapelverarbeitung"&gt;Stapelverarbeitung&lt;/a&gt;" (Batch Processing) gab (bis Anfang der 70er-Jahre, in Schulen etwas länger - bis Anfang der 80er).Der große Fortschritt waren dann Fernschreiber/Teletypes, mit denen man interaktiv am Computer arbeiten konnte. Das waren quasi Schreibmaschinen mit eingebautem Drucker. Aus dieser Zeit stammt die Kommandozeile. Der Computer druckte einen "Prompt" aus und wartete dann auf eine Eingabezeile, die er dann verarbeitete und das Ergebnis oder die Fehlermeldungen ausdruckte.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--qAsZOcuFu8/TnhP6kSLzDI/AAAAAAAAFqU/-TspDRze8XU/s1600/teletypeclose.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/--qAsZOcuFu8/TnhP6kSLzDI/AAAAAAAAFqU/-TspDRze8XU/s320/teletypeclose.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Natürlich wartete der Computer die meiste Zeit auf Eingaben. Daher wurde aus dem Batch Processing ein Multi Processing, d.h. mehrere Terminals wurden an den Computer angeschlossen und mehrere Programme konnten (scheinbar) gleichzeitig laufen.&lt;br /&gt;Aus den Teletypes entwickelten sich echte Terminals (Bildschirm und Tastatur).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UDJRgtEGFrU/TnhU4qdHq6I/AAAAAAAAFqk/xG7aLOl8WGY/s1600/220px-Televideo925Terminal.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="189" width="220" src="http://4.bp.blogspot.com/-UDJRgtEGFrU/TnhU4qdHq6I/AAAAAAAAFqk/xG7aLOl8WGY/s320/220px-Televideo925Terminal.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Man arbeitete immer mit einer &lt;a href="http://en.wikipedia.org/wiki/Read-eval-print_loop"&gt;Read-eval-print loop&lt;/a&gt; (REPL). Der Computer las einen Befehl ein, führte ihn aus, gab das Ergebnis aus und wartete auf die nächste Eingabe (wieder zurück zum Lesen).&lt;br /&gt;Um effizient zu arbeiten, musste man ziemlich viele Kommandos auswendig wissen (übrigens funktionierten damals Texteditoren auch mit einer Kommandozeile, z.B. &lt;a href="http://de.wikipedia.org/wiki/EDLIN"&gt;edlin&lt;/a&gt; unter DOS oder &lt;a href="http://de.wikipedia.org/wiki/Ed"&gt;ed&lt;/a&gt; unter Unix). Die Kommandos bestanden oft nur aus wenigen Buchstaben. Jedenfalls nichts für Anfänger oder Personen, die nur ab und zu einen Computer bedienen wollten.&lt;br /&gt;Durch Menü-Bedienung wurde es langsam aber sicher auch für "Laien" möglich Computer zu bedienen. Viele elektronische Geräten können über Menüs bedient werden. Die Menüführung war der Tod der Kommandozeile.&lt;br /&gt;Auch in &lt;a href="http://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che"&gt;grafischen Benutzeroberflächen&lt;/a&gt; (GUI) gibt es jede Menge Menüs oder andere Dialoge, bei denen man etwas auswählen kann und nicht Befehle auswendig wissen muss. Durch &lt;a href="http://de.wikipedia.org/wiki/Tastenkombination"&gt;Shortcuts&lt;/a&gt; (Tastenkombinationen) kann man als geübter Benutzer trotzdem relativ flink arbeiten. Manche User verwenden aber immer noch gerne Commandline Interfaces, weil sie damit schneller arbeiten können. Dazu gibt es auf praktisch allen Systemen &lt;a href="http://de.wikipedia.org/wiki/Terminalemulation"&gt;Terminal-Emulatoren&lt;/a&gt;.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hBKZcGBKJqM/TnhaceoYXLI/AAAAAAAAFqs/8pgih3OJ_S4/s1600/Terminal%2BEmulator.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="218" width="320" src="http://4.bp.blogspot.com/-hBKZcGBKJqM/TnhaceoYXLI/AAAAAAAAFqs/8pgih3OJ_S4/s320/Terminal%2BEmulator.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Im Prinzip werden moderne Systeme immer noch großteils mit Menüs bedient, aber je mehr Funktionen, desto mehr Einträge gibt es. Es wird also selbst für geübte Benutzer teilweise ziemlich mühsam, zumal man oft zur Maus greifen muss.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-N7LT8EoDSrY/TnhbirB3HgI/AAAAAAAAFq0/FgKEUK7_vc4/s1600/office_menue_datei.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="320" width="187" src="http://4.bp.blogspot.com/-N7LT8EoDSrY/TnhbirB3HgI/AAAAAAAAFq0/FgKEUK7_vc4/s320/office_menue_datei.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Optionen (Einstellungen) sind oft ziemlich umfangreich, viele Tabs, Radio-Knöpfe usw.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bu4g7Qhu5vs/TnhcI2n4c1I/AAAAAAAAFq8/rc68mnLXBD8/s1600/blocked_links_optionen.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="320" width="276" src="http://2.bp.blogspot.com/-bu4g7Qhu5vs/TnhcI2n4c1I/AAAAAAAAFq8/rc68mnLXBD8/s320/blocked_links_optionen.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/"&gt;eclipse&lt;/a&gt; hat so viele Einstellungsmöglichkeiten, dass im Optionendialog schon lange eine Suchfunktion integriert ist:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CTxH1WIL4FE/TnhdKC7J0MI/AAAAAAAAFrE/4_2TkI8pdm0/s1600/eclipse-klammerung-1407.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="279" width="320" src="http://4.bp.blogspot.com/-CTxH1WIL4FE/TnhdKC7J0MI/AAAAAAAAFrE/4_2TkI8pdm0/s320/eclipse-klammerung-1407.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Auch das Windows-Menü oder KDE-Menü hat seit einigen Jahren eine integrierte Suchfunktion, sodass man z.B. [Alt]+[F1]ecl[Enter] (KDE) drücken muss, um Eclipse zu starten. Unter Windows muss man die Windows-Taste drücken und z.B. "not" eingeben um Notepad aufzurufen. Ist der Befehl noch nicht eindeutig, so werden mögliche Alternativen angezeigt.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-J5H_OIbXSD4/TnhgbwtId8I/AAAAAAAAFrM/IfC1OyFWOPk/s1600/menu.jpeg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="320" width="238" src="http://2.bp.blogspot.com/-J5H_OIbXSD4/TnhgbwtId8I/AAAAAAAAFrM/IfC1OyFWOPk/s320/menu.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Übrigens gibt es so eine Art Mini-Kommandozeile ([Alt]+[F2]) schon seit es &lt;a href="http://de.wikipedia.org/wiki/KDE"&gt;KDE&lt;/a&gt; gibt (1996), also lange bevor so etwas unter Windows existierte.&lt;br /&gt;Bei &lt;b&gt;Mobiltelefonen&lt;/b&gt; hat sich auch die Menüführung schon lange durchgesetzt. Selbst bei Smartphones ist es noch so, wenn man die vielen Anwendungs-Icons als Menü betrachtet:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bGPuAAaTvZ0/TnhjIJEFjXI/AAAAAAAAFrU/3q7AfnLJySE/s1600/iPhoneNexusOne.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="271" width="320" src="http://4.bp.blogspot.com/-bGPuAAaTvZ0/TnhjIJEFjXI/AAAAAAAAFrU/3q7AfnLJySE/s320/iPhoneNexusOne.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Man muss oft einige Zeit "herumswipen", um die richtige App zu finden. Ich weiß nicht, ob es das beim iPhone gibt, aber bei Andorid kann man einfach den Such-Button drücken und dann ein paar Buchstaben tippen und man bekommt die passenden Anwendungen nebst Kontakten angezeigt.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-w7qxSfxVRQs/Tnhk-caXWxI/AAAAAAAAFrc/PFTzEfyQ_pY/s1600/Search-Box-on-Android.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="320" width="184" src="http://3.bp.blogspot.com/-w7qxSfxVRQs/Tnhk-caXWxI/AAAAAAAAFrc/PFTzEfyQ_pY/s320/Search-Box-on-Android.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das geht oft viel schneller als "Swipen".&lt;br /&gt;Im übrigen verwenden die meisten im Browser eine Art Kommandozeile, wenn sie oben Fragmente eines URLs eingeben. Der Browser schlägt sinnvolle Ergänzungen vor oder man ruft gleich die (Google-)Suchfunktion damit auf. Geht meist viel schneller als Bookmarks.&lt;br /&gt;&lt;br /&gt;Natürlich unterscheidet sich diese neue Form der Kommandozeile von der ursprünglichen: man muss nicht alle "Befehle" auswendig wissen, man braucht nur etwas über das Kommando oder die Funktion wissen und das eingeben. Meist findet das System dann die gewünschte Funktion. &lt;br /&gt;&lt;br /&gt;In eclipse wäre das dann so, dass ich, um den Sourcecode schön zu formatieren nicht im (Kontext-)Menü suchen muss oder mir das Tastenkürzel dafür (und für viele andere Funktionen) merken muss, sondern &lt;b&gt;nur ein&lt;/b&gt; Tastenkürzel - z.B. [Strg]+[F1] - und dann brauche ich nur einfach tippen, was ich will: "format", "build", "class" (für neue Klasse anlegen, das geht aber auch jetzt schon auf anderem Weg) usw. Meist müsste ich gar nicht alles tippen.&lt;br /&gt;Diese neue Form der Kommandozeile ist sowohl für Anfänger und Personen, die selten ein bestimmtes Programm verwenden, als auch für Power User, die alles mit der Tastatur bedienen wollen. Ich bin nur gespannt, wann sich so etwas noch allgemeiner durchsetzen wird.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Die Kommandozeile ist wiederauferstanden!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5538513926255699617?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5538513926255699617/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/09/commandline-resurrected.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5538513926255699617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5538513926255699617'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/09/commandline-resurrected.html' title='Commandline resurrected'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-WJI3bq8uq4A/TnhNViiXYnI/AAAAAAAAFqM/wqk8nBy4mQQ/s72-c/CLI-Terminal.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-4394409836431670437</id><published>2011-06-07T10:19:00.000+02:00</published><updated>2011-06-07T10:19:22.271+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><title type='text'>Programmierrichtlinien haben doch Sinn (III)</title><content type='html'>Das Stück&lt;br /&gt;&lt;pre class="prettyprint linenums:219"&gt;                int recNo = 0;&lt;br /&gt;                while((rf.length()-rf.getFilePointer())&gt;recordlen)&lt;br /&gt;                {&lt;br /&gt;                int i = 0;&lt;br /&gt;                String[] recordfields = new String[fields.size()];&lt;br /&gt;                deleted = rf.readShort();&lt;br /&gt;                for(Field field:fields)&lt;br /&gt;                {&lt;br /&gt;                    buf = new byte[field.fieldlen];&lt;br /&gt;                    if(field.datentyp=='F' || field.datentyp=='C')&lt;br /&gt;                    {&lt;br /&gt;                        rf.read(buf, 0, field.fieldlen);&lt;br /&gt;                        recordfields[i] = new String(buf,"ISO-8859-1").trim();&lt;br /&gt;                    }&lt;br /&gt;                    else if(field.datentyp == 'V')&lt;br /&gt;                    {&lt;br /&gt;                        rf.read(buf, 0, field.fieldlen);&lt;br /&gt;                        recordfields[i] = new String(buf,"ISO-8859-1").trim();&lt;br /&gt;                    }&lt;br /&gt;                    i++;&lt;br /&gt;                }&lt;br /&gt;                records.add(new DataRecord(recNo,fields.size(),deleted));&lt;br /&gt;                records.get(records.size()-1).setFields(recordfields);&lt;br /&gt;                recNo++;&lt;br /&gt;                }&lt;br /&gt;&lt;/pre&gt;wäre viel lesbarer, wenn man richtig einrückt. Es geht ganz einfach! &lt;code&gt;Strg+Shift+F&lt;/code&gt; in Netbeans oder Eclipse.&lt;br /&gt;&lt;pre class="prettyprint linenums:219"&gt;                int recNo = 0;&lt;br /&gt;                while ((rf.length() - rf.getFilePointer()) &gt; recordlen) {&lt;br /&gt;                    int i = 0;&lt;br /&gt;                    String[] recordfields = new String[fields.size()];&lt;br /&gt;                    deleted = rf.readShort();&lt;br /&gt;                    for (Field field : fields) {&lt;br /&gt;                        buf = new byte[field.fieldlen];&lt;br /&gt;                        if (field.datentyp == 'F' || field.datentyp == 'C') {&lt;br /&gt;                            rf.read(buf, 0, field.fieldlen);&lt;br /&gt;                            recordfields[i] = new String(buf, "ISO-8859-1").trim();&lt;br /&gt;                        } else if (field.datentyp == 'V') {&lt;br /&gt;                            rf.read(buf, 0, field.fieldlen);&lt;br /&gt;                            recordfields[i] = new String(buf, "ISO-8859-1").trim();&lt;br /&gt;                        }&lt;br /&gt;                        i++;&lt;br /&gt;                    }&lt;br /&gt;                    records.add(new DataRecord(recNo, fields.size(), deleted));&lt;br /&gt;                    records.get(records.size() - 1).setFields(recordfields);&lt;br /&gt;                    recNo++;&lt;br /&gt;                }&lt;br /&gt;&lt;/pre&gt;Selbst wenn man in der Konsole mit vim arbeitet, kann man die Zeilen mit &lt;code&gt;V&lt;/code&gt; und den Cursortasten markieren und anschließend &lt;code&gt;=&lt;/code&gt; (ist-gleich) drücken.&lt;br&gt;&lt;br /&gt;Was ist da so schwierig dran?&lt;br&gt;&lt;br /&gt;Hilft beim Einarbeiten in den Source Code immens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-4394409836431670437?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/4394409836431670437/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/programmierrichtlinien-haben-doch-sinn_07.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4394409836431670437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4394409836431670437'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/programmierrichtlinien-haben-doch-sinn_07.html' title='Programmierrichtlinien haben doch Sinn (III)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-4465560609498456769</id><published>2011-06-07T09:28:00.001+02:00</published><updated>2011-06-07T09:49:50.602+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fehler'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><title type='text'>Fehlerbehandlung</title><content type='html'>Bei folgendem Code-Stück sieht man nur die Ausgabe&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;RemoteException&lt;br /&gt;&lt;/pre&gt;sonst nichts. Keine weitere Information, um dem Problem auf die Schliche zu kommen.&lt;br /&gt;&lt;pre class="prettyprint linenums:18"&gt;public class Server {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        try {&lt;br /&gt;            LocateRegistry.createRegistry(1099);&lt;br /&gt;            System.out.println("RMI-Registry erfolgreich gestartet");&lt;br /&gt;        } catch (RemoteException ex) {&lt;br /&gt;            System.out.println("Fehler beim Starten der Registry: " + ex);&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;            DB db = new Data("fahrten.db");&lt;br /&gt;            //System.out.println(((Data)db).records.size());&lt;br /&gt;            DB d = (DB) UnicastRemoteObject.exportObject(db, 1099);&lt;br /&gt;            System.out.println("1xx");&lt;br /&gt;            Naming.rebind("Data", d);&lt;br /&gt;            System.out.println("2xx");&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;            Header he = ((Data)db).getHeader();&lt;br /&gt;            Header h = (Header) UnicastRemoteObject.exportObject(he, 1099);&lt;br /&gt;            Naming.rebind("Header", h);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            System.out.println("Alles gebunden");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        } catch (RemoteException ex) {&lt;br /&gt;            System.err.println("RemoteException");&lt;br /&gt;        } catch (MalformedURLException ex) {&lt;br /&gt;            System.err.println("MalformedURLException");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Ein einfaches &lt;code class="prettyprint"&gt;System.err.println("RemoteException: " + ex.getMessage());&lt;/code&gt; liefert schon etwas mehr hilfreiche Information;&lt;br /&gt;&lt;pre&gt;RemoteException: remote object implements illegal remote interface; nested exception is: &lt;br /&gt;        java.lang.IllegalArgumentException: illegal remote method encountered: public abstract int data.Header.length()&lt;br /&gt;&lt;/pre&gt;In der Klasse Data findet man&lt;br /&gt;&lt;pre class="prettyprint linenums:25"&gt;public class Data implements DB, Serializable {&lt;br /&gt;&lt;br /&gt;    private final int MAGIC_COOKIE = 4223;&lt;br /&gt;    private Header header;&lt;br /&gt;    private String fileName="";&lt;br /&gt;    private ArrayList&lt;integer&gt; lockedRecNo;&lt;br /&gt;    private int DataOffset; //166&lt;br /&gt;&lt;/integer&gt;&lt;/pre&gt;Wenn man weiter sucht, findet man für Header das Interface&lt;br /&gt;&lt;pre class="prettyprint linenums:16"&gt;public interface Header extends Remote {&lt;br /&gt;    public Field getField(int fID);&lt;br /&gt;&lt;br /&gt;    public int length();&lt;br /&gt;&lt;br /&gt;    public void addField(Field f);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Es fehlt schlicht und ergreifend die &lt;b&gt;Implementierung&lt;/b&gt; zu Header. Das &lt;b&gt;kann nicht&lt;/b&gt; funktionieren!&lt;br /&gt;&lt;br /&gt;Die Implementierung muss &lt;code class="prettyprint"&gt;UnicastRemoteObject&lt;/code&gt; erweitern, in Data sollte man statt &lt;code class="prettyprint"&gt;private Header header;&lt;/code&gt; direkt die Implementierung verwenden: &lt;code class="prettyprint"&gt;private Fields header;&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Die Implementierung von Fields beginnt etwa so:&lt;br /&gt;&lt;pre class="prettyprint linenums:15"&gt;public class Fields extends UnicastRemoteObject implements Header, Serializable {&lt;br /&gt;&lt;br /&gt;    private ArrayList&lt;field&gt; felder;&lt;br /&gt;&lt;br /&gt;    public Fields() throws RemoteException {&lt;br /&gt;        felder = new ArrayList&lt;field&gt;(0);&lt;br /&gt;    }&lt;br /&gt;...&lt;br /&gt;&lt;/field&gt;&lt;/field&gt;&lt;/pre&gt;Unser Server sollte dann etwa so aussehen (ob das dann funktioniert, sei dahingestellt, aber die Exceptions sind geklärt):&lt;br /&gt;&lt;pre class="prettyprint linenums:19"&gt;public class Server {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        DB db = null;&lt;br /&gt;        try {&lt;br /&gt;            db = new Data("fahrten.db");&lt;br /&gt;        } catch (RemoteException ex) {&lt;br /&gt;            System.err.println("RemoteException (new Data()): " + ex.getMessage());&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;            LocateRegistry.createRegistry(1099);&lt;br /&gt;            System.out.println("RMI-Registry erfolgreich gestartet");&lt;br /&gt;        } catch (RemoteException ex) {&lt;br /&gt;            System.out.println("Fehler beim Starten der Registry: " + ex);&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;            DB d = (DB) UnicastRemoteObject.exportObject(db, 1099);&lt;br /&gt;            Naming.rebind("Data", d);&lt;br /&gt;        } catch (RemoteException ex) {&lt;br /&gt;            System.err.println("RemoteException (rebind(Data)): " + ex.getMessage());&lt;br /&gt;        } catch (MalformedURLException ex) {&lt;br /&gt;            System.err.println("MalformedURLException: " + ex.getMessage());&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;            Fields he = (Fields) ((Data) db).getHeader();&lt;br /&gt;            Header h = (Header) UnicastRemoteObject.exportObject(he, 1099);&lt;br /&gt;            try {&lt;br /&gt;                Naming.rebind("Header", (Fields) h);&lt;br /&gt;            } catch (MalformedURLException ex) {&lt;br /&gt;                System.err.println("MalformedURLException (rebind(Header)): " + ex.getMessage());&lt;br /&gt;            }&lt;br /&gt;        } catch (RemoteException ex) {&lt;br /&gt;            System.err.println("RemoteException: " + ex.getMessage());&lt;br /&gt;        }&lt;br /&gt;        System.out.println("Alles gebunden");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Der langen Rede kurzer Sinn:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Für den Programmierer &lt;b&gt;muss&lt;/b&gt; möglichst &lt;b&gt;viel Information&lt;/b&gt; bereitgestellt werden. Für den Anwender hilft diese Information nichts und man muss einfache Fehlermeldungen anbieten (das ist hier auf dieser Ebene sowieso nicht möglich, denn die Software ist noch weit davon entfernt, einem Endanwender seine Dienste anzubieten).&lt;br /&gt;Sinnvoll wäre es, die Exceptions zu loggen.&lt;br /&gt;&lt;pre class="prettyprint"&gt;Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;&lt;/pre&gt;Am schlimmsten sind jedoch solche Konstrukte:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint linenums:94"&gt;try {&lt;br /&gt;                    while(true) {&lt;br /&gt;                        records.add(read(nr));&lt;br /&gt;                        nr++;&lt;br /&gt;                    }&lt;br /&gt;                } catch (RemoteException ex) {&lt;br /&gt;                } catch (RecordNotFoundException ex) {&lt;br /&gt;                }&lt;br /&gt;&lt;/pre&gt;Fehler sind praktisch unauffindbar. Auch nicht mit dem Debugger, weil man nicht einmal einen Breakpoint setzen kann, um die Variable &lt;code&gt;ex&lt;/code&gt; zu inspizieren (die enthält ja Infos zur Exception).&lt;br /&gt;Nachsatz: das alles kostet mich Stunden, die ich sinnvoller verbringen könnte. Einfach den Kandidaten durchfallen lassen, denn die Unit-Tests sind zu 93% (&lt;b&gt;einer von dreizehn&lt;/b&gt; hat funktioniert) schief gegangen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QDSdhTdDCKg/Te3X1eyWn0I/AAAAAAAAFUY/X8BIkEwZS80/s1600/fehler.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="http://3.bp.blogspot.com/-QDSdhTdDCKg/Te3X1eyWn0I/AAAAAAAAFUY/X8BIkEwZS80/s640/fehler.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-4465560609498456769?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/4465560609498456769/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/fehlerbehandlung.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4465560609498456769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4465560609498456769'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/fehlerbehandlung.html' title='Fehlerbehandlung'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-QDSdhTdDCKg/Te3X1eyWn0I/AAAAAAAAFUY/X8BIkEwZS80/s72-c/fehler.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5055649400321577040</id><published>2011-06-06T18:58:00.001+02:00</published><updated>2011-06-06T19:28:43.760+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PR2'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='PR3'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><title type='text'>Listings - Source Code drucken</title><content type='html'>Es sollte m.E. doch möglich sein, Listings in der folgenden - lesbaren - Form zu erzeugen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-A0Xsd2Ds3mw/Te0CI00XxyI/AAAAAAAAFT8/tfIfuhdFlrU/s1600/listing-gut.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="451" src="http://2.bp.blogspot.com/-A0Xsd2Ds3mw/Te0CI00XxyI/AAAAAAAAFT8/tfIfuhdFlrU/s640/listing-gut.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Die Schrift ist leserlich, die Zeilen richtig eingerückt, Dateiname und Autor etc. sind ersichtlich (Ich gebe zu, dieses Bild ist schlecht...). Verwendet wurde &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;recode&lt;/span&gt; und &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;a2ps&lt;/span&gt; unter Linux.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Wichtig ist auch, dass man allgemeine &lt;b&gt;&lt;a href="http://programmierblog.blogspot.com/search?q=programmierrichtlinien"&gt;Programmierrichtlinien&lt;/a&gt;&lt;/b&gt; befolgt.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Aber mit &lt;b&gt;Office&lt;/b&gt; kann man auch sehr schöne Listings erzeugen:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VGq1O1UsTVc/Te0GOkAI9nI/AAAAAAAAFUI/TmZMdulM-p8/s1600/listing-gut-office.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="448" src="http://4.bp.blogspot.com/-VGq1O1UsTVc/Te0GOkAI9nI/AAAAAAAAFUI/TmZMdulM-p8/s640/listing-gut-office.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Man muss nur Kopf- und Fußzeilen einrichten, die Schrift auf &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Courier New&lt;/span&gt; (9 oder 10pt) oder eine andere mit fixer Breite und dann zwei Seiten auf eine drucken.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Ähnliches gibt es schon unter&amp;nbsp;&lt;a href="http://programmierblog.blogspot.com/2010/10/listings-source-code-drucken.html"&gt;Listings (Source-Code drucken)&lt;/a&gt;&amp;nbsp;zu lesen.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Stattdessen bekommt man so etwas.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-itgAgZvF_7k/Te0CNRJIYQI/AAAAAAAAFUA/eqDdKiNc7FE/s1600/listing-gro%25C3%259F-schei%25C3%259Fe.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://2.bp.blogspot.com/-itgAgZvF_7k/Te0CNRJIYQI/AAAAAAAAFUA/eqDdKiNc7FE/s640/listing-gro%25C3%259F-schei%25C3%259Fe.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Der Sourcecode ist unmöglich zu lesen, weil die Einrückung bald die dargestellte Zeilenlänge erreicht. Die Schriftgröße ist aber zumindest OK.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Schlimm ist aber das folgende Listing, da würden 4 Code-Seiten auf einem Blatt Platz haben. Trotzdem sind es aber nur 2 Seiten pro Blatt. Die Schrift ist unleserlich klein.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ofRvm3THgY4/Te0CPAPBYMI/AAAAAAAAFUE/vJWcSZJBRnM/s1600/listing-mini.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://4.bp.blogspot.com/-ofRvm3THgY4/Te0CPAPBYMI/AAAAAAAAFUE/vJWcSZJBRnM/s640/listing-mini.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Das ist eine Zumutung!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5055649400321577040?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5055649400321577040/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/listings-source-code-drucken.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5055649400321577040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5055649400321577040'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/listings-source-code-drucken.html' title='Listings - Source Code drucken'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-A0Xsd2Ds3mw/Te0CI00XxyI/AAAAAAAAFT8/tfIfuhdFlrU/s72-c/listing-gut.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3219308971247505545</id><published>2011-06-06T13:00:00.001+02:00</published><updated>2011-06-06T13:08:26.351+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fehler'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Autoboxing in Java</title><content type='html'>&lt;p&gt;Folgendes Beispiel zeigt ein Problem beim Autoboxing in Java. Der Autor des Code-Fragments will &lt;code class="prettyprint"&gt;int&lt;/code&gt;-Werte in der &lt;code class="prettyprint"&gt;LinkedList&lt;integer&gt; lockedRecords&lt;/code&gt; speichern. Das funktioniert beim Speichern in Zeile 16 auch super, weil der &lt;code class="prettyprint"&gt;int&lt;/code&gt;-Wert &lt;code class="prettyprint"&gt;recNo&lt;/code&gt; automatisch in ein &lt;code class="prettyprint"&gt;Integer&lt;/code&gt;-Objekt gepackt wird.&lt;br /&gt;&lt;pre class="prettyprint linenums"&gt;LinkedList&amp;lt;Integer&gt; lockedRecords = new LinkedList&amp;lt;Integer&gt;();&lt;br /&gt;&lt;br /&gt;    public long lock(int recNo) throws RemoteException,&lt;br /&gt;            RecordNotFoundException {&lt;br /&gt;        long lockCookie = 0;&lt;br /&gt;        if(existsRec(recNo)){&lt;br /&gt;            synchronized(records.get(recNo)){&lt;br /&gt;                while(lockedRecords.contains(recNo)){&lt;br /&gt;                    try {&lt;br /&gt;                        records.get(recNo).wait();&lt;br /&gt;                    } catch (InterruptedException ex) {&lt;br /&gt;                        System.err.println("Lock Interrupted!");&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                if(existsRec(recNo)){&lt;br /&gt;                    lockedRecords.add(recNo);&lt;br /&gt;                    boolean lock_getted = true;&lt;br /&gt;                    lockCookie = lockedRecords.size() -1;&lt;br /&gt;                    return lockCookie;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }else{&lt;br /&gt;            throw new RecordNotFoundException();&lt;br /&gt;        }&lt;br /&gt;        return lockCookie;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void unlock(int recNo, long lockCookie) throws RemoteException,&lt;br /&gt;            RecordNotFoundException, SecurityException {&lt;br /&gt;        if(recNo &gt; 0 &amp;&amp; recNo &lt; records.size()){&lt;br /&gt;            if(lockCookie &gt;= 0 &amp;&amp; lockCookie &lt; lockedRecords.size()&lt;br /&gt;                    &amp;&amp; lockedRecords.contains((int)lockCookie)){&lt;br /&gt;                synchronized(records.get(recNo)){&lt;br /&gt;                    lockedRecords.remove(recNo);&lt;br /&gt;                    records.get(recNo).notifyAll();&lt;br /&gt;                }&lt;br /&gt;            }else{&lt;br /&gt;                throw new SecurityException();&lt;br /&gt;            }&lt;br /&gt;        }else{&lt;br /&gt;            throw new RecordNotFoundException();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;code class="prettyprint"&gt;unlock()&lt;/code&gt; stürzt (praktisch) immer in Zeile 34 ab! Und zwar mit einer &lt;code class="prettyprint"&gt;IndexOutOfBoundsException&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Warum?&lt;/p&gt;&lt;p&gt;Die Klasse &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html"&gt;&lt;code class="prettyprint"&gt;LinkedList&lt;/code&gt;&lt;/a&gt; (sowie viele andere Klassen des Java Collection Frameworks) besitzt &lt;b&gt;zwei&lt;/b&gt; &lt;code class="prettyprint"&gt;remove()&lt;/code&gt;-Methoden:&lt;ol&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;E remove(int index)&lt;/code&gt;, welche das Element mit dem Index &lt;i&gt;index&lt;/i&gt; entfernt und eine &lt;code class="prettyprint"&gt;IndexOutOfBoundsException&lt;/code&gt; wirft, wenn der Index nicht existiert.&lt;/li&gt;&lt;li&gt;boolean remove(Object o)&lt;/code&gt;, welche das entsprechende Objekt entfernt, falls es existiert (und in diesem Fall &lt;code&gt;true&lt;/code&gt; liefert).&lt;/li&gt;&lt;/ol&gt;Ein &lt;code class="prettyprint"&gt;int&lt;/code&gt;-Parameter wird &lt;b&gt;nicht&lt;/b&gt; automatisch in ein &lt;code class="prettyprint"&gt;Integer&lt;/code&gt;-Objekt verpackt, da zuerst die zu &lt;code class="prettyprint"&gt;int&lt;/code&gt; passende Methode verwendet wird! &lt;code class="prettyprint"&gt;E remove(int index)&lt;/code&gt; wirft aber eine &lt;code class="prettyprint"&gt;IndexOutOfBoundsException&lt;/code&gt;, wenn der &lt;code class=pretyprint"&gt;int recNo&lt;/code&gt; kein gültiger Index ist. Das wäre eher zufällig passend.&lt;/p&gt;&lt;p&gt;Autoboxing ist also im Allgemeinen sehr praktisch, kann aber zu unerwarteten Problemen führen.&lt;/p&gt;&lt;p&gt;Übrigens ist eine Lösung mit Verwendung von &lt;code class="prettyprint"&gt;Integer&lt;/code&gt; nicht zielführend, da beim Autoboxing nur bei kleinen Werten tatsächlich dasselbe Objekt verwendet wird:&lt;pre class="prettyprint"&gt;Integer i1 = 23;&lt;br /&gt;Integer i2 = 23;&lt;br /&gt;Integer i3 = 2132321423;&lt;br /&gt;Integer i4 = 2132321423;&lt;br /&gt;System.out.println(i1 == i2);&lt;br /&gt;System.out.println(i1.equals(i2));&lt;br /&gt;System.out.println(i3 == i4);&lt;br /&gt;System.out.println(i3.equals(i4));&lt;br /&gt;&lt;/pre&gt;liefert:&lt;pre class="prettyprint"&gt;true&lt;br /&gt;true&lt;br /&gt;false&lt;br /&gt;true&lt;/pre&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3219308971247505545?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3219308971247505545/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/autoboxing-in-java.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3219308971247505545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3219308971247505545'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/autoboxing-in-java.html' title='Autoboxing in Java'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5036579427522072858</id><published>2011-06-04T12:19:00.000+02:00</published><updated>2011-06-04T12:19:27.144+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fehler'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><title type='text'>Programmierrichtlinien haben doch Sinn (II)</title><content type='html'>Noch ein Bonmot, diesmal eine Endlosschleife:&lt;br /&gt;&lt;pre class="prettyprint linenums"&gt;    public int[] find(String[] criteria) throws RemoteException {&lt;br /&gt;        ArrayList&lt;Integer&gt; erg = new ArrayList&lt;Integer&gt;();&lt;br /&gt;        for(int i=0; i&lt; records.size();i++){&lt;br /&gt;            boolean match=true;&lt;br /&gt;            if(criteria != null){&lt;br /&gt;                for(int j=0; j&lt; criteria.length;i++){&lt;br /&gt;                    if(criteria[j] != null){&lt;br /&gt;                        if(!records.get(i).getField(j).contains(criteria[j])){&lt;br /&gt;                            match=false;&lt;br /&gt;                            break;&lt;br /&gt;                        }  }  }  }&lt;br /&gt;            &lt;br /&gt;            if(records.get(i).isDeleted()){&lt;br /&gt;                match=false;&lt;br /&gt;            }&lt;br /&gt;            if(match){&lt;br /&gt;                erg.add(i);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        int[] back = new int[erg.size()];&lt;br /&gt;        for(int i=0; i&lt; erg.size();i++){&lt;br /&gt;            back[i]=(int)erg.get(i);&lt;br /&gt;        }&lt;br /&gt;        return back;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;Wo ist der Fehler? (Abgesehen von den schlecht formatierten schließenden Klammern in Zeile 11)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5036579427522072858?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5036579427522072858/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/programmierrichtlinien-haben-doch-sinn_04.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5036579427522072858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5036579427522072858'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/programmierrichtlinien-haben-doch-sinn_04.html' title='Programmierrichtlinien haben doch Sinn (II)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-6410439303433104495</id><published>2011-06-02T17:49:00.000+02:00</published><updated>2011-06-02T17:49:28.075+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fehler'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><title type='text'>Programmierrichtlinien haben doch Sinn</title><content type='html'>&lt;p&gt;Eine Stunde Fehlersuche! Suche in einem fremden Code, der gewisse Anforderungen erfüllen muss. Der Unit-Test für eine Methode, die einen CSV-String liefern ist fehlgeschlagen. Das Feld an der Position 5 war immer leer. Der Test erwartete den String &lt;code&gt;"42995";"47.01708,16.93225";"20.73708,29.96312";" 196";"201105132101";" 405";"9634090160";"O"&lt;/code&gt;, die Methode lieferte jedoch &lt;code&gt;42995;"47.01708,16.93225";"20.73708,29.96312"; 196;201105132101;"";9634090160;"O"&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;OK, dieser "Fehler" war schnell gefunden. Die Methode hielt sich besser an das CSV-Format (nur Strings sind in Hochkomma eingeschlossen, Zahlen nicht) als mein Test. Das war schnell korrigiert und nun lieferte die Methode alles als String:&lt;br /&gt;&lt;code&gt;"42995";"47.01708,16.93225";"20.73708,29.96312";" 196";"201105132101";"";"9634090160";"O"&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Fast richtig. Das ist ein wirklicher Fehler. Durchforsten und Debuggen hat ergeben, dass dieses Feld schon beim Lesen immer leer wird. Der Code dazu ist folgender (das Leerzeichen bei den Bedingungen "kleiner als" habe ich für den Blog hinzugefügt, damit da nicht ein ungültiges HTML-Tag ensteht, grundsätzlich erschwert das Fehlen solcher Leerzeichen das Lesen des Codes):&lt;br /&gt;&lt;pre class="prettyprint linenums"&gt;public Data(String fn) throws FileNotFoundException, IOException{&lt;br /&gt;        fileName=fn;&lt;br /&gt;&lt;br /&gt;        rf = new RandomAccessFile(fn, "rw");&lt;br /&gt;            int mC=rf.readInt();&lt;br /&gt;            if(mC==4223){&lt;br /&gt;                int dataOffset=0;&lt;br /&gt;                short count=0;&lt;br /&gt;&lt;br /&gt;                dataOffset=rf.readInt();&lt;br /&gt;                firstDataOffset=dataOffset;&lt;br /&gt;                count=rf.readShort();&lt;br /&gt;                information = new Header(count);&lt;br /&gt;                for(int i=0;i&lt; count;i++){&lt;br /&gt;                    short fNameLength = rf.readShort();&lt;br /&gt;                    byte[] roughData = new byte[fNameLength];&lt;br /&gt;                    rf.read(roughData/*, (int)rf.getFilePointer(), fNameLength*/);&lt;br /&gt;&lt;br /&gt;                    String fieldName = new String(roughData,"ISO-8859-1");&lt;br /&gt;                    short fDescLength = rf.readShort();&lt;br /&gt;                    roughData = new byte[fDescLength];&lt;br /&gt;                    rf.read(roughData/*, (int)rf.getFilePointer(), fDescLength*/);&lt;br /&gt;                    String fieldDescription = new String(roughData,"ISO-8859-1");&lt;br /&gt;&lt;br /&gt;                    char type = (char)rf.readByte();&lt;br /&gt;&lt;br /&gt;                    short fDataLength = rf.readShort();&lt;br /&gt;&lt;br /&gt;                    Field f = new Field(fNameLength, fieldName, fDescLength, fieldDescription, type, fDataLength);&lt;br /&gt;&lt;br /&gt;                    information.setHeaderField(i, f);&lt;br /&gt;                }&lt;br /&gt;                records = new ArrayList&lt;Record&gt;();&lt;br /&gt;                while(dataOffset&lt; rf.length()){&lt;br /&gt;                    short flag = rf.readShort();&lt;br /&gt;                    String[] data = new String[information.getLength()];&lt;br /&gt;                    for(int i=0;i&lt; data.length;i++){&lt;br /&gt;                        int readLen = information.getField(i).length;&lt;br /&gt;                        byte[] roughData = new byte[readLen];&lt;br /&gt;                        rf.read(roughData/*, dataOffset, readLen*/);&lt;br /&gt;                        switch(information.getField(i).type){&lt;br /&gt;                            case'f':&lt;br /&gt;                            case'F':&lt;br /&gt;                                data[i] = new String(roughData,"ISO-8859-1");&lt;br /&gt;                                break;&lt;br /&gt;                            case'v':&lt;br /&gt;                            case'V':&lt;br /&gt;                                StringBuilder sb = new StringBuilder();&lt;br /&gt;                                for(int j=0;i&lt; readLen &amp;&amp; (char)roughData[j]!='\0';j++){&lt;br /&gt;                                    sb.append((char)roughData[j]);&lt;br /&gt;                                }&lt;br /&gt;                                data[i] = sb.toString();&lt;br /&gt;                                break;&lt;br /&gt;                            case'c':&lt;br /&gt;                            case'C':&lt;br /&gt;                                byte[] d = new byte[1];&lt;br /&gt;                                d[0]=roughData[0];&lt;br /&gt;                                data[i] = new String(d);&lt;br /&gt;                                break;&lt;br /&gt;                        }&lt;br /&gt;                        dataOffset+=(2+readLen);&lt;br /&gt;                    }&lt;br /&gt;                    if(flag==0){&lt;br /&gt;                        records.add(new RecordData(data, true, information));&lt;br /&gt;                    }else{&lt;br /&gt;                        records.add(new RecordData(data, false, information));&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;                rf.close();&lt;br /&gt;                information.recAnz = records.size();&lt;br /&gt;            }else{&lt;br /&gt;                throw new FileNotFoundException("Keine DB-Datei");&lt;br /&gt;            } &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;Soviel konnte ich aufgrund der Rahmenbedingungen auch gleich herausfinden: das Feld mit Index 5 ist ein "V"-Feld, daher ist der Code ab Zeile 48 relevant. Der schaut eigentlich richtig aus.Erstaunlich ist jedoch, dass die "V"-Felder davor korrekt waren, das "F"-Feld auch. Aber das fehlerhafte "V"-Feld ist gleich nach dem ersten "F"-Feld. Daher war meine Hypothese: das "F"-Feld "erzeugt" den Fehler. Aber die Zeilen 44 und 45 sind korrekt.&lt;/p&gt;&lt;p&gt;Also nächste Hypothese: das Lesen der Daten ist fehlerhaft! Zeilen 38 bis 40. Aber die sind m.E. korrekt. Vielleicht wurde der Dateiheader falsch gelesen (dort sind die Feldlängen und Feldtypen spezifiziert). &lt;/p&gt;&lt;p&gt;Zeilen 5 bis 32. Aber auch dort ist nichts verdächtiges. Es ist schon zum Verzweifeln! Alles schaut richtig aus und trotzdem schlägt der Test fehl (zu Recht, denn das Ergebnis &lt;b&gt;ist&lt;/b&gt; falsch).&lt;/p&gt;&lt;p&gt;Jetzt ist einmal Zurücklehnen angesagt. Das ganze mal von der Entfernung betrachten.Breakpoint auf Zeile 48 setzen und schauen, was sich tut.&lt;/p&gt;&lt;p&gt;Erst beim &lt;b&gt;5.&lt;/b&gt; Feld (0-basiert) tritt der Fehler auf. Die Schleife wird sofort verlassen, obwohl &lt;code class="prettyprint"&gt;roughData&lt;/code&gt; tatsächlich mehr als 0 Bytes enthält, &lt;b&gt;5&lt;/b&gt;, um genau zu sein. &lt;code class="prettyprint"&gt;readLen&lt;/code&gt; enthält sogar den richtigen Wert. Wie so zum Teufel ist dann die Bedingung &lt;code class="prettyprint"&gt;j &lt; readLen &amp;&amp; roughData[j] != 0&lt;/code&gt; nicht erfüllt (das Casten auf &lt;code class="prettyprint"&gt;(char)&lt;/code&gt; hatte ich schon entfernt, weil &lt;code class="prettyprint"&gt;'\0'&lt;/code&gt; tatsächlich den Wert &lt;code class="prettyprint"&gt;0&lt;/code&gt; hat)?&lt;/p&gt;&lt;p&gt;Ich habe bei dem Ausdruck Leerzeichen eingebaut, die im Original nicht waren. Jetzt fällt es wie Schuppen aus den &lt;strike&gt;Haaren&lt;/strike&gt;Augen! Im Original auf Zeile 49 steht &lt;code class="prettyprint"&gt;i &lt; roughData &amp;&amp; roughData[j] != 0&lt;/code&gt;. &lt;b&gt;i&lt;/b&gt; statt &lt;b&gt;j&lt;/b&gt; - optisch fast nicht zu unterscheiden!&lt;/p&gt;&lt;p&gt;&lt;b&gt;i&lt;/b&gt; zählt die Felder, &lt;b&gt;j&lt;/b&gt; die einzelnen Bytes in einem Feld. Daher ist ab dem Feld 5, welches eine Länge von 5 hat, der erste Teil der Bedingung &lt;b&gt;nicht&lt;/b&gt; mehr erfüllt und es wird ein leerer String erzeugt.&lt;/p&gt;&lt;p&gt;Ja, Programmieranfängern wird immer gepredigt: &lt;b&gt;"sprechende" Namen verwenden!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Das hätte geholfen! Statt &lt;code class="prettyprint"&gt;i&lt;/code&gt; könnte man z.B. &lt;code class="prettyprint"&gt;fieldno&lt;/code&gt; verwenden und statt &lt;code class="prettyprint"&gt;j&lt;/code&gt; wäre &lt;code class="prettyprint"&gt;byteno&lt;/code&gt; angebracht.Damit wäre der Fehler &lt;b&gt;nie&lt;/b&gt; passiert! Die Schleife hätte gleich falsch ausgesehen:&lt;pre class="prettyprint"&gt;for(int byteno=0;fieldno&lt; readLen &amp;&amp; roughData[byteno]!=0;byteno++){&lt;br /&gt;    sb.append((char)roughData[byteno]);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Wenn dann noch Leerzeichen dazwischen sind, springt der Fehler sofort ins Auge, denn warum wird in der Schleife einmal &lt;code class="prettyprint"&gt;fieldno&lt;/code&gt; und einmal &lt;code class="prettyprint"&gt;byteno&lt;/code&gt; verwendet?&lt;/p&gt;&lt;p&gt;Selbst wenn man in kurzen Schleifen &lt;b&gt;i&lt;/b&gt; und &lt;b&gt;j&lt;/b&gt; als Laufvariable erlaubt, dann müsste aber in der äußeren Schleife immer noch ein "sprechender" Name verwendet werden. Das stäche auch ins Auge (die Leerzeichen verbessern das auch noch!):&lt;pre class="prettyprint"&gt;for (int i = 0; fieldno &lt; readLen &amp;&amp; roughData[i] != 0; i++){&lt;br /&gt;    sb.append((char)roughData[byteno]);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Wenn schon kurze Laufvariable, dann besser &lt;b&gt;nie&lt;/b&gt; &lt;b&gt;i&lt;/b&gt; und &lt;b&gt;j&lt;/b&gt; gemeinsam verwenden sondern "unterschiedlichere" Buchstaben wie &lt;b&gt;i&lt;/b&gt; und &lt;b&gt;k&lt;/b&gt; oder &lt;b&gt;i&lt;/b&gt; und &lt;b&gt;m&lt;/b&gt;. Die kann man nicht so leicht verwechseln!&lt;/p&gt;&lt;p&gt;Die Variante mit "sprechenden" Namen für Schleifen, die länger als ein paar Zeilen sind, und kurze Laufvariable für kurze Schleifen (Dreizeiler) ist die beste Möglichkeit, dann das Beispiel mit &lt;b&gt;i&lt;/b&gt; und &lt;b&gt;fieldno&lt;/b&gt; schaut gleich irgendwie falsch aus. Zumindest schaut man sich so etwas gleich näher an.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Leerzeichen und sprechende Namen bringen's!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Siehe auch &lt;a href="http://programmierblog.blogspot.com/2008/12/programmierrichtlinen-allgemein.html"&gt;Programmierrichtlinien allgemein&lt;/a&gt;. Dort steht leider nichts über die Verwendung von Leerzeichen.&lt;/p&gt;&lt;p&gt;Java Guidelines findet man z.B. hier: &lt;a href="http://www.oracle.com/technetwork/java/codeconv-138413.html"&gt;http://www.oracle.com/technetwork/java/codeconv-138413.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Google findet auch etwas: &lt;a href="http://lmgtfy.com/?q=Java+coding+conventions"&gt;www.google.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-6410439303433104495?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/6410439303433104495/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/programmierrichtlinien-haben-doch-sinn.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6410439303433104495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6410439303433104495'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/programmierrichtlinien-haben-doch-sinn.html' title='Programmierrichtlinien haben doch Sinn'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3812297356498975761</id><published>2011-06-01T14:39:00.001+02:00</published><updated>2011-06-03T08:10:37.647+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Aufgaben zu verketteten Listen und binären Bäumen (POS1: 2A, 2C)</title><content type='html'>Arbeiten Sie die folgenden Beiträge durch:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2010/03/verkettete-listen.html"&gt;Verkettete Listen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2010/03/aufgaben-zu-verketteten-listen.html"&gt;Aufgaben zu verketteten Listen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2010/04/aufgabe-verkettete-listen-partner.html"&gt;Aufgabe Verkettete Listen - Partner finden für Tanzkurs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2010/05/beispielprojekt-zu-binaren-baumen.html"&gt;Beispielprojekt zu binären Bäumen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2010/04/worthaufigkeiten-mit-binarem-baum.html"&gt;Worthäufigkeiten mit binärem Baum ermitteln&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3812297356498975761?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3812297356498975761/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/06/aufgaben-zu-verketteten-listen-und.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3812297356498975761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3812297356498975761'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/06/aufgaben-zu-verketteten-listen-und.html' title='Aufgaben zu verketteten Listen und binären Bäumen (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3317860002824797211</id><published>2011-05-17T15:13:00.000+02:00</published><updated>2011-05-17T15:13:43.630+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Aufgaben zu Collections in Java (POS1: 2A, 2C)</title><content type='html'>&lt;b&gt;Vorarbeiten&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Arbeiten Sie die Beispiele im Buch Kapitel 12 durch. Sie finden den Sourcecode dazu unter&amp;nbsp;&lt;code&gt;/home/teachers/hp/public/pos1-2/kap12&lt;/code&gt; (unter der Linux-Umgebung!).&lt;/li&gt;&lt;li&gt;Machen Sie die Übung 12.8.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Beispielprojekt zu Java-Collections, Import von Projekten in Eclipse&lt;/b&gt;&lt;br /&gt;Die Datei&amp;nbsp;&lt;a href="http://programmieren.googlecode.com/files/java-collections_1_1.zip"&gt;java-collections_1_1.zip&lt;/a&gt;&amp;nbsp;enthält ein Eclipse-Projekt mit einem Beispiel zur Verwendung der &lt;a href="http://openbook.galileocomputing.de/javainsel8/javainsel_12_001.htm#mj3dcfd3844ce986918953340f9a14e031"&gt;Java-Collection-API&lt;/a&gt;.&lt;br /&gt;Im Package &lt;code class="prettyprint"&gt;simple&lt;/code&gt; finden Sie ein Beispiel zur Ermittlung der Worthäufigkeiten wobei im &lt;code class="prettyprint"&gt;main&lt;/code&gt; nur ein Aufruf mit fixen Testdaten (Array) vorhanden ist.&lt;br /&gt;Das Package &lt;code class="prettyprint"&gt;step&lt;/code&gt;1 zeigt die Vorarbeiten zu dem Programm &lt;b&gt;hauf&lt;/b&gt; mit einer eigenen Datenstruktur &lt;code class="prettyprint"&gt;Data&lt;/code&gt;, in der ein Wort und die Häufigkeit gespeichert wird. Zusätzlich implementiert &lt;code class="prettyprint"&gt;Data&lt;/code&gt; das Interface &lt;code class="prettyprint"&gt;Comparable&lt;/code&gt; um eine natürliche Sortierung nach dem Wort zu ermöglichen. Das Interface &lt;code class="prettyprint"&gt;Comparator&lt;/code&gt; wird implementiert, um nach Häufigkeiten zu sortieren. Um auch nach Häufigkeiten absteigend zu sortieren, enthält die Datei &lt;code class="prettyprint"&gt;Data.java&lt;/code&gt; noch eine Klasse &lt;code class="prettyprint"&gt;DataHaufUmgekehrt&lt;/code&gt;, welche ebenfalls &lt;code class="prettyprint"&gt;Comparator&lt;/code&gt; implementiert.&lt;br /&gt;Im folgenden der Ausschnitt mit dem &lt;code class="prettyprint"&gt;main&lt;/code&gt;, welches zeigt, wie man sortiert:&lt;br /&gt;&lt;pre class="prettyprint"&gt;public static void main(String[] args) {&lt;br /&gt;    Data[] worte = new Data[] { new Data("das", 12), new Data("Haus", 3),&lt;br /&gt;        new Data("Text", 23), new Data("Punkt", 2), new Data("Testdaten", 12) };&lt;br /&gt;    System.out.println("unsortiert");&lt;br /&gt;    for (Data d : worte) {&lt;br /&gt;      System.out.println("  " + d);&lt;br /&gt;    }&lt;br /&gt;    Arrays.sort(worte);&lt;br /&gt;    System.out.println("sortiert nach Wort");&lt;br /&gt;    for (Data d : worte) {&lt;br /&gt;      System.out.println("  " + d);&lt;br /&gt;    }&lt;br /&gt;    Arrays.sort(worte, new Data());&lt;br /&gt;    System.out.println("sortiert nach Anzahl");&lt;br /&gt;    for (Data d : worte) {&lt;br /&gt;      System.out.println("  " + d);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    Arrays.sort(worte, new DataHaufUmgekehrt());&lt;br /&gt;    System.out.println("sortiert nach Anzahl absteigend");&lt;br /&gt;    for (Data d : worte) {&lt;br /&gt;      System.out.println("  " + d);&lt;br /&gt;    }&lt;br /&gt;  }&lt;/pre&gt;&lt;br /&gt;Im Paket &lt;code class="prettyprint"&gt;step2&lt;/code&gt; wird dann das Beispiel ausgebaut, sodass in der Klasse &lt;code class="prettyprint"&gt;Hauf&lt;/code&gt; zwei Varianten von Maps zum Speichern der Worthäufigkeiten verwendet werden. Eine &lt;code class="prettyprint"&gt;HashMap&lt;/code&gt; und eine &lt;code class="prettyprint"&gt;TreeMap&lt;/code&gt;. Für die &lt;code class="prettyprint"&gt;HashMap&lt;/code&gt; muss die Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt; zusätzlich noch die Methoden &lt;code class="prettyprint"&gt;equals()&lt;/code&gt; und &lt;code class="prettyprint"&gt;hashCode()&lt;/code&gt; implementieren (überschreiben).&lt;br /&gt;Im &lt;code class="prettyprint"&gt;main&lt;/code&gt; von &lt;code class="prettyprint"&gt;Hauf&lt;/code&gt; werden dann Worte aus der Standardeingabe gelesen und in den zwei Maps gespeichert.&lt;br /&gt;&lt;br /&gt;Die Datei&amp;nbsp;&lt;a href="http://programmieren.googlecode.com/files/java-collections_1_1.zip"&gt;java-collections_1_1.zip&lt;/a&gt;&amp;nbsp;kann nach dem Download direkt in Eclipse importiert werden:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gmjWOaOfpfo/S_zCjfIVdvI/AAAAAAAADfo/oXOUTnq8z2g/s1600/eclipse-import.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_gmjWOaOfpfo/S_zCjfIVdvI/AAAAAAAADfo/oXOUTnq8z2g/s320/eclipse-import.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Man wählt dann die Datei aus:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_gmjWOaOfpfo/S_zCwFD3ebI/AAAAAAAADfw/BbO0gx2PnBE/s1600/eclipse-import1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gmjWOaOfpfo/S_zCwFD3ebI/AAAAAAAADfw/BbO0gx2PnBE/s320/eclipse-import1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Man erhält dann folgendes Projekt:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_gmjWOaOfpfo/S_zC4cnqjFI/AAAAAAAADf4/nVKpsre2fTY/s1600/eclipse-import2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gmjWOaOfpfo/S_zC4cnqjFI/AAAAAAAADf4/nVKpsre2fTY/s320/eclipse-import2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Erweiterung&lt;/b&gt;&lt;br /&gt;Erweitern Sie das Projekt so, dass die Worthäufigkeiten in Dateien ermittelt werden können.&lt;br /&gt;Aufruf: &lt;code&gt;java Hauf [-h] [-o ausgabe] files...&lt;/code&gt;&lt;br /&gt;Es sollen also keine, eine (&lt;code&gt;stdin&lt;/code&gt;) oder mehrere Dateien verarbeitet werden können. Optional erfolgt die Ausgabe in eine Datei (Option &lt;code&gt;-o&lt;/code&gt;). &lt;code&gt;-h&lt;/code&gt; soll eine kurze Hilfe ausgeben.&lt;br /&gt;Wird mehr als eine Datei angegeben, so sollen für jede Datei die häufigsten 10 Worte ausgegeben werden (Ausgabe Dateiname, dann die 10 häufigsten Worte) und zum Schluss die Gesamthäufigkeiten &lt;b&gt;aller&lt;/b&gt; Worte in &lt;b&gt;allen&lt;/b&gt; Dateien.&lt;br /&gt;&lt;br /&gt;Nennen Sie das Projekt &lt;code&gt;collectionhauf&lt;/code&gt; (&lt;code&gt;klasse-name-collectionhauf&lt;/code&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3317860002824797211?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3317860002824797211/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/05/aufgaben-zu-collections-in-java-pos1-2a.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3317860002824797211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3317860002824797211'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/05/aufgaben-zu-collections-in-java-pos1-2a.html' title='Aufgaben zu Collections in Java (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gmjWOaOfpfo/S_zCjfIVdvI/AAAAAAAADfo/oXOUTnq8z2g/s72-c/eclipse-import.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1936492617750457032</id><published>2011-05-04T16:06:00.000+02:00</published><updated>2011-05-04T16:06:13.939+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><title type='text'>Aufgabe: Interfaces (POS1: 2A, 2C)</title><content type='html'>&lt;b&gt;Aufgabe 1:&lt;/b&gt;&lt;br /&gt;Implementieren Sie folgendes Interface, sodass Sie Speicher-Objekte für beliebig viele &lt;code class="prettyprint"&gt;int&lt;/code&gt;-Werte haben können. Schreiben Sie ein passendes Testprogramm.&lt;br /&gt;&lt;pre class="prettyprint"&gt;/**&lt;br /&gt; * Container für int-Werte.&lt;br /&gt; * &lt;br /&gt; * @author Harald R. Haberstroh (hp)&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public interface IntContainerI {&lt;br /&gt;    /**&lt;br /&gt;     * Aufnehmen eines neuen Elements.&lt;br /&gt;     * &lt;br /&gt;     * @param element&lt;br /&gt;     *            neues Element, das aufgenommen werden muss (hinten)&lt;br /&gt;     */&lt;br /&gt;    public void add(int element);&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Liefern eines Elements.&lt;br /&gt;     * &lt;br /&gt;     * @param index&lt;br /&gt;     *            gesuchtes Element&lt;br /&gt;     * @return Element an dieser Stelle&lt;br /&gt;     */&lt;br /&gt;    public int get(int index);&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Ganzen Container als Array.&lt;br /&gt;     * &lt;br /&gt;     * @return liefert alle gespeicherten Elemente als Array&lt;br /&gt;     */&lt;br /&gt;    public int[] getArray();&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Ändern eines Elements.&lt;br /&gt;     * &lt;br /&gt;     * @param index&lt;br /&gt;     *            Indes des Elements, das geändert werden soll&lt;br /&gt;     * @param value&lt;br /&gt;     *            neuer Wert&lt;br /&gt;     */&lt;br /&gt;    public void set(int index, int value);&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Anzahl der gespeicherten Elemente liefern (Größe)&lt;br /&gt;     * &lt;br /&gt;     * @return Größe des Containers (Anzahl der Elemente).&lt;br /&gt;     */&lt;br /&gt;    public int size();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Aufgabe 2:&lt;/b&gt;&lt;br /&gt;Ändern Sie das Interface so, dass beliebige Objekte verwendet werden können. Nennen Sie das Interface &lt;code class="prettyprint"&gt;ContainerI&lt;/code&gt;. Schreiben Sie eine Klasse, die das Interface implementiert und programmieren Sie passende Tests, um die neue Klasse zu testen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1936492617750457032?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1936492617750457032/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/05/aufgabe-interfaces-pos1-2a-2c.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1936492617750457032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1936492617750457032'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/05/aufgabe-interfaces-pos1-2a-2c.html' title='Aufgabe: Interfaces (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-6742204407969628513</id><published>2011-04-27T22:20:00.000+02:00</published><updated>2011-04-27T22:20:55.634+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><title type='text'>Beispiele zu Gleitkommadarstellung (POS1: 1B)</title><content type='html'>Hier finden Sie ein paar Übungsbeispiele zu Gleitkommazahlen sowie die dazugehörige Lösung. Zunächst Konvertierung von Dezimalzahlen in Gleitkommazahlen. Es sind die Zahlen immer alle drei Formate zu bestimmen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-f4CxsZO-wp4/Tbhrb1RViAI/AAAAAAAAFTA/h3o6j89aDkQ/s1600/gleitkommazahlen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://1.bp.blogspot.com/-f4CxsZO-wp4/Tbhrb1RViAI/AAAAAAAAFTA/h3o6j89aDkQ/s640/gleitkommazahlen.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;-0,15087890625&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;Nachkommateil:&lt;br /&gt;0.15087891 | 0&lt;br /&gt;0.30175781 | 0&lt;br /&gt;0.60351562 | 1&lt;br /&gt;0.20703125 | 0&lt;br /&gt;0.41406250 | 0&lt;br /&gt;0.82812500 | 1&lt;br /&gt;0.65625000 | 1&lt;br /&gt;0.31250000 | 0&lt;br /&gt;0.62500000 | 1&lt;br /&gt;0.25000000 | 0&lt;br /&gt;0.50000000 | 1&lt;br /&gt;Gesamt: 1 ,00100110101                (die 1 steht für das Vorzeichen -)&lt;br /&gt;Mantisse wäre: 1001101010&lt;br /&gt;Exponent wäre: -2&lt;br /&gt;Exponent umwandeln:&lt;br /&gt;         2 | 0&lt;br /&gt;         1 | 1&lt;br /&gt;Exponent unbeschränkt positiv: 10&lt;br /&gt;Exponent mit führenden Nullen: 0010&lt;br /&gt;Zweierkomplement:&lt;br /&gt;   Einerkomplement:            1101&lt;br /&gt;                                  1&lt;br /&gt;   Zweierkomplement:           1110&lt;br /&gt;Exponent: 1110, Vorzeichen: 1&lt;br /&gt;&lt;br /&gt;vm m  m  m  m  m  m  m  m  m  m  ve e  e  e  e  &lt;br /&gt;1  1  0  0  1  1  0  1  0  1  0  1  1  1  1  0 &lt;br /&gt;&lt;br /&gt;vm ve e  e  e  e  m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;1  1  1  1  1  0  1  0  0  1  1  0  1  0  1  0 &lt;br /&gt;&lt;br /&gt;ve e  e  e  e  vm m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;1  1  1  1  0  1  1  0  0  1  1  0  1  0  1  0 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;33&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;ganzzahliger Teil:&lt;br /&gt;        33 | 1&lt;br /&gt;        16 | 0&lt;br /&gt;         8 | 0&lt;br /&gt;         4 | 0&lt;br /&gt;         2 | 0&lt;br /&gt;         1 | 1&lt;br /&gt;Nachkommateil:&lt;br /&gt;Gesamt: 0 100001,                (die 0 steht für das Vorzeichen + - beachte den Abstand)&lt;br /&gt;Mantisse wäre: 1000010000&lt;br /&gt;Exponent wäre: 6&lt;br /&gt;Exponent umwandeln:&lt;br /&gt;         6 | 0&lt;br /&gt;         3 | 1&lt;br /&gt;         1 | 1&lt;br /&gt;Exponent unbeschränkt positiv: 110&lt;br /&gt;Exponent: 0110, Vorzeichen: 0&lt;br /&gt;&lt;br /&gt;vm m  m  m  m  m  m  m  m  m  m  ve e  e  e  e  &lt;br /&gt;0  1  0  0  0  0  1  0  0  0  0  0  0  1  1  0 &lt;br /&gt;&lt;br /&gt;vm ve e  e  e  e  m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  0  0  1  1  0  1  0  0  0  0  1  0  0  0  0 &lt;br /&gt;&lt;br /&gt;ve e  e  e  e  vm m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  0  1  1  0  0  1  0  0  0  0  1  0  0  0  0 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;470,171875&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;ganzzahliger Teil:&lt;br /&gt;       470 | 0&lt;br /&gt;       235 | 1&lt;br /&gt;       117 | 1&lt;br /&gt;        58 | 0&lt;br /&gt;        29 | 1&lt;br /&gt;        14 | 0&lt;br /&gt;         7 | 1&lt;br /&gt;         3 | 1&lt;br /&gt;         1 | 1&lt;br /&gt;Nachkommateil:&lt;br /&gt;0.17187500 | 0&lt;br /&gt;0.34375000 | 0&lt;br /&gt;0.68750000 | 1&lt;br /&gt;0.37500000 | 0&lt;br /&gt;0.75000000 | 1&lt;br /&gt;0.50000000 | 1&lt;br /&gt;Gesamt: 0 111010110,001011&lt;br /&gt;Mantisse wäre: 1110101100&lt;br /&gt;Exponent wäre: 9&lt;br /&gt;Exponent umwandeln:&lt;br /&gt;         9 | 1&lt;br /&gt;         4 | 0&lt;br /&gt;         2 | 0&lt;br /&gt;         1 | 1&lt;br /&gt;Exponent unbeschränkt positiv: 1001&lt;br /&gt;Exponent: 1001, Vorzeichen: 0&lt;br /&gt;&lt;br /&gt;vm m  m  m  m  m  m  m  m  m  m  ve e  e  e  e  &lt;br /&gt;0  1  1  1  0  1  0  1  1  0  0  0  1  0  0  1 &lt;br /&gt;&lt;br /&gt;vm ve e  e  e  e  m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  0  1  0  0  1  1  1  1  0  1  0  1  1  0  0 &lt;br /&gt;&lt;br /&gt;ve e  e  e  e  vm m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  1  0  0  1  0  1  1  1  0  1  0  1  1  0  0 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;-17,2145&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;ganzzahliger Teil:&lt;br /&gt;        17 | 1&lt;br /&gt;         8 | 0&lt;br /&gt;         4 | 0&lt;br /&gt;         2 | 0&lt;br /&gt;         1 | 1&lt;br /&gt;Nachkommateil:&lt;br /&gt;0.21450000 | 0&lt;br /&gt;0.42900000 | 0&lt;br /&gt;0.85800000 | 1&lt;br /&gt;0.71600000 | 1&lt;br /&gt;0.43200000 | 0&lt;br /&gt;0.86400000 | 1&lt;br /&gt;0.72800000 | 1&lt;br /&gt;0.45600000 | 0&lt;br /&gt;0.91200000 | 1&lt;br /&gt;0.82400000 | 1&lt;br /&gt;0.64800000 | 1&lt;br /&gt;0.29600000 | 0&lt;br /&gt;0.59200000 | 1&lt;br /&gt;0.18400000 | 0&lt;br /&gt;0.36800000 | 0&lt;br /&gt;0.73600000 | 1&lt;br /&gt;0.47200000 | 0&lt;br /&gt;0.94400000 | 1&lt;br /&gt;Gesamt: 1 10001,001101101110100101&lt;br /&gt;Mantisse wäre: 1000100110&lt;br /&gt;Exponent wäre: 5&lt;br /&gt;Exponent umwandeln:&lt;br /&gt;         5 | 1&lt;br /&gt;         2 | 0&lt;br /&gt;         1 | 1&lt;br /&gt;Exponent unbeschränkt positiv: 101&lt;br /&gt;Exponent: 0101, Vorzeichen: 0&lt;br /&gt;&lt;br /&gt;vm m  m  m  m  m  m  m  m  m  m  ve e  e  e  e  &lt;br /&gt;1  1  0  0  0  1  0  0  1  1  0  0  0  1  0  1 &lt;br /&gt;&lt;br /&gt;vm ve e  e  e  e  m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;1  0  0  1  0  1  1  0  0  0  1  0  0  1  1  0 &lt;br /&gt;&lt;br /&gt;ve e  e  e  e  vm m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  0  1  0  1  1  1  0  0  0  1  0  0  1  1  0 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;-0,015625&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;ganzzahliger Teil:&lt;br /&gt;Nachkommateil:&lt;br /&gt;0.01562500 | 0&lt;br /&gt;0.03125000 | 0&lt;br /&gt;0.06250000 | 0&lt;br /&gt;0.12500000 | 0&lt;br /&gt;0.25000000 | 0&lt;br /&gt;0.50000000 | 1&lt;br /&gt;Gesamt: 1 ,000001&lt;br /&gt;Mantisse wäre: 1000000000&lt;br /&gt;Exponent wäre: -5&lt;br /&gt;Exponent umwandeln:&lt;br /&gt;         5 | 1&lt;br /&gt;         2 | 0&lt;br /&gt;         1 | 1&lt;br /&gt;Exponent unbeschränkt positiv: 101&lt;br /&gt;Exponent mit führenden Nullen: 0101&lt;br /&gt;Zweierkomplement:&lt;br /&gt;   Einerkomplement:            1010&lt;br /&gt;                                  1&lt;br /&gt;   Zweierkomplement:           1011&lt;br /&gt;Exponent: 1011, Vorzeichen: 1&lt;br /&gt;&lt;br /&gt;vm m  m  m  m  m  m  m  m  m  m  ve e  e  e  e  &lt;br /&gt;1  1  0  0  0  0  0  0  0  0  0  1  1  0  1  1 &lt;br /&gt;&lt;br /&gt;vm ve e  e  e  e  m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;1  1  1  0  1  1  1  0  0  0  0  0  0  0  0  0 &lt;br /&gt;&lt;br /&gt;ve e  e  e  e  vm m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;1  1  0  1  1  1  1  0  0  0  0  0  0  0  0  0 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;12739&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;ganzzahliger Teil:&lt;br /&gt;     12739 | 1&lt;br /&gt;      6369 | 1&lt;br /&gt;      3184 | 0&lt;br /&gt;      1592 | 0&lt;br /&gt;       796 | 0&lt;br /&gt;       398 | 0&lt;br /&gt;       199 | 1&lt;br /&gt;        99 | 1&lt;br /&gt;        49 | 1&lt;br /&gt;        24 | 0&lt;br /&gt;        12 | 0&lt;br /&gt;         6 | 0&lt;br /&gt;         3 | 1&lt;br /&gt;         1 | 1&lt;br /&gt;Nachkommateil:&lt;br /&gt;Gesamt: 0 11000111000011,&lt;br /&gt;Mantisse wäre: 1100011100&lt;br /&gt;Exponent wäre: 14&lt;br /&gt;Exponent umwandeln:&lt;br /&gt;        14 | 0&lt;br /&gt;         7 | 1&lt;br /&gt;         3 | 1&lt;br /&gt;         1 | 1&lt;br /&gt;Exponent unbeschränkt positiv: 1110&lt;br /&gt;Exponent: 1110, Vorzeichen: 0&lt;br /&gt;&lt;br /&gt;vm m  m  m  m  m  m  m  m  m  m  ve e  e  e  e  &lt;br /&gt;0  1  1  0  0  0  1  1  1  0  0  0  1  1  1  0 &lt;br /&gt;&lt;br /&gt;vm ve e  e  e  e  m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  0  1  1  1  0  1  1  0  0  0  1  1  1  0  0 &lt;br /&gt;&lt;br /&gt;ve e  e  e  e  vm m  m  m  m  m  m  m  m  m  m  &lt;br /&gt;0  1  1  1  0  0  1  1  0  0  0  1  1  1  0  0 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Zurückrechnen&lt;/h3&gt;Gegeben sind die Zahlen im 2. Format, &lt;i&gt;m = 9&lt;/i&gt; und &lt;i&gt;e = 3&lt;/i&gt;:&lt;br /&gt;&lt;code&gt;&lt;b&gt;0  0  1  0  1  1  1  1  1  1  0  0  0  0&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;Beide Vorzeichen positiv&lt;br /&gt;Mantisse: 111110000&lt;sub&gt;2&lt;/sub&gt;&lt;br /&gt;positiver Exponent: 101&lt;sub&gt;2&lt;/sub&gt; = 5&lt;sub&gt;10&lt;/sub&gt;&lt;br /&gt;Zahl in normierter Gleitkommadarstellung: 0,11111&lt;sub&gt;2&lt;/sub&gt; * 2&lt;sup&gt;5&lt;/sup&gt; = 11111&lt;sub&gt;2&lt;/sub&gt;&lt;br /&gt;Ergebnis: &lt;b&gt;31&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;1  0  1  1  1  1  1  0  0  1  0  1  0  1&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;Vorzeichen der Mantisse negativ, daher ist die Zahl negativ&lt;br /&gt;Mantisse: 110010101&lt;sub&gt;2&lt;/sub&gt;&lt;br /&gt;positiver Exponent: 111&lt;sub&gt;2&lt;/sub&gt; = 7&lt;sub&gt;10&lt;/sub&gt;&lt;br /&gt;Zahl in normierter Gleitkommadarstellung: -0,110010101&lt;sub&gt;2&lt;/sub&gt; * 2&lt;sup&gt;7&lt;/sup&gt; = 1100101,01&lt;sub&gt;2&lt;/sub&gt;&lt;br /&gt;Ergebnis: &lt;b&gt;-101,25&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;1  1  1  1  0  1  0  0  1  1  0  1  0  1&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;beide Vorzeichen negativ, daher ist die Zahl negativ und der Exponent negativ&lt;br /&gt;negative Mantisse: -100110101&lt;sub&gt;2&lt;/sub&gt;&lt;br /&gt;negativer Exponent, daher Zweierkomplement des Exponenten: 010&lt;sub&gt;2&lt;/sub&gt; = -2&lt;sub&gt;10&lt;/sub&gt;&lt;br /&gt;Zahl in normierter Gleitkommadarstellung: -0,100110101&lt;sub&gt;2&lt;/sub&gt; * 2&lt;sup&gt;-2&lt;/sup&gt; = 0,00100110101&lt;sub&gt;2&lt;/sub&gt;&lt;br /&gt;Ergebnis: &lt;b&gt;-0.15087890625&lt;/b&gt;&lt;br /&gt;(Vergleichen Sie das mit dem Ergebnis des Beispiels ganz oben!)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Zahlenbereich&lt;/h3&gt;Die Formel aus der Schulübung:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dXlwQoxGwCM/Tbh4totpveI/AAAAAAAAFTE/MyFQ0QjIlOQ/s1600/zahlenbereich.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://4.bp.blogspot.com/-dXlwQoxGwCM/Tbh4totpveI/AAAAAAAAFTE/MyFQ0QjIlOQ/s640/zahlenbereich.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Eingesetzt für &lt;i&gt;B = 2&lt;/i&gt; (Binärsystem), &lt;i&gt;m = 10&lt;/i&gt; (von ganz oben) und &lt;i&gt;e = 4&lt;/i&gt; (von ganz oben):&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5xPxnobwJeo/Tbh6DgcYWvI/AAAAAAAAFTM/5i49fApdMdA/s1600/zahlenbereich1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://3.bp.blogspot.com/-5xPxnobwJeo/Tbh6DgcYWvI/AAAAAAAAFTM/5i49fApdMdA/s400/zahlenbereich1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-6742204407969628513?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/6742204407969628513/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/beispiele-zu-gleitkommadarstellung-pos1.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6742204407969628513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6742204407969628513'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/beispiele-zu-gleitkommadarstellung-pos1.html' title='Beispiele zu Gleitkommadarstellung (POS1: 1B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-f4CxsZO-wp4/Tbhrb1RViAI/AAAAAAAAFTA/h3o6j89aDkQ/s72-c/gleitkommazahlen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-4193144773123351798</id><published>2011-04-27T14:02:00.001+02:00</published><updated>2011-04-27T14:07:26.038+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><title type='text'>Aufgabe zu Vererbung in Java (POS1: 2A, 2C)</title><content type='html'>Implementieren Sie die Klassen aus dem Buch Kapitel 7.&lt;br /&gt;Machen Sie die Übung 7.10 (Seite 87).&lt;br /&gt;Zeichnen Sie zu Übung 7.10 das passende UML-Klassendiagramm.&lt;br /&gt;&lt;br /&gt;Sehen Sie sich auch die folgenden Einträge an:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2009/05/vererbung.html"&gt;Vererbung&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programmierblog.blogspot.com/2009/12/objektorientiertes-programmieren.html"&gt;Objektorientiertes Programmieren&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-4193144773123351798?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/4193144773123351798/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/aufgabe-zu-vererbung-in-java-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4193144773123351798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4193144773123351798'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/aufgabe-zu-vererbung-in-java-pos1-2a-2c.html' title='Aufgabe zu Vererbung in Java (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-4771363783774621570</id><published>2011-04-20T16:19:00.000+02:00</published><updated>2011-04-20T16:19:35.715+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><title type='text'>Locking- und Updateprobleme mit RMI (PR: 5A, 5B)</title><content type='html'>Da bei normalen "Remote-Objekten" immer ganze Objekte übertragen werden, hat man echtes Call-By-Value. Man arbeitet also mit Kopien von Objekten. Das gilt sowohl für Objekte, die an eine Methode eines Remote-Objekts übergeben werden als auch für Objekte als Returnwerte. &lt;br /&gt;Normalerweise werden innerhalb einer JVM Objekte immer als Referenz übergeben bzw. zurückgegeben. Über RMI werden die Objekte immer serialisiert und komplett übertragen.&lt;br /&gt;Das wirkt sich bei unserem "Data-Beispiel" so aus, dass Updates erst "sichtbar" werden, wenn die Daten auch wieder von der Datei geladen werden. Sollte das Locking direkt in der Record-Implementierung erfolgen, so muss man bedenken, dass auch immer ein &lt;code class="prettyprint"&gt;Record&lt;/code&gt;-Objekt übertragen wird und der Client mit einer Kopie arbeitet. Damit bekommt er immer den Lock!&lt;br /&gt;&lt;b&gt;Abhilfe?&lt;/b&gt;&lt;br /&gt;Man darf dem Client &lt;b&gt;nur Referenzen&lt;/b&gt; zur Verfügung stellen. Nur der Server arbeitet mit den "echten" Objekten. - Klar, und wie geht das?&lt;br /&gt;Das herauszufinden war nicht einfach, die Java-Dokumentation von Sun (Oracle) schweigt sch diesbezüglich aus, zumindest was direkte Lösungsvorschläge und Beispielcode angeht.&lt;br /&gt;&lt;br /&gt;Grundsätzliche Erklärung und Beispiele zur Funktionsweise von RMI hilft etwas: &lt;a href="http://java.sun.com/developer/onlineTraining/rmi/RMI.html"&gt;jGuru: Remote Method Invocation (RMI)&lt;/a&gt; aber die letzte zündende Idee bekommt man durch &lt;a href="http://www.jiang925.com/content/how-return-object-and-return-object-reference-java-rmi"&gt;How to return object and return object reference in Java RMI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Der Unterschied liegt in der Klassendefinition. Wenn die Klasse eine Unterklasse von &lt;code class="prettyprint"&gt;UnicastRemoteObject&lt;/code&gt; ist, so ist sie damit RMI-fähig (kann RMI-Service anbieten). In diesem Fall wird also eine Referenz zurückgegeben werden. Wenn die Klasse nur &lt;code class="prettyprint"&gt;Serializable&lt;/code&gt; implementiert, so ist die Klasse nicht für RMI-Aufrufe geeignet (kein RMI-Service) und es wird das Objekt zurückgegeben werden.&lt;br /&gt;&lt;br /&gt;Ein Beispiel wird in Kürze geliefert.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-4771363783774621570?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/4771363783774621570/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/locking-und-updateprobleme-mit-rmi-pr.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4771363783774621570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4771363783774621570'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/locking-und-updateprobleme-mit-rmi-pr.html' title='Locking- und Updateprobleme mit RMI (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-610939543337901610</id><published>2011-04-15T09:19:00.001+02:00</published><updated>2011-04-15T09:20:52.936+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><title type='text'>Serialisierungsprobleme mit RMI (PR: 5A, 5B)</title><content type='html'>&lt;b&gt;R&lt;/b&gt;emote &lt;b&gt;M&lt;/b&gt;ethod &lt;b&gt;I&lt;/b&gt;nvocation funktioniert nur für Objekte, welche serialisiert werden können (die also das Interface &lt;code class="prettyprint"&gt;Serializable&lt;/code&gt; implementieren). Wird innerhalb eines Objekts, welches über RMI gebunden werden soll, eine Referenz auf ein nicht serialisierbares Objekt benötigt, so bekommt man immer eine Exception der Art (z.B. für &lt;code class="prettyprint"&gt;RandomAccessFile&lt;/code&gt;):&lt;br /&gt;&lt;pre class="prettyprint"&gt;sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)&lt;br /&gt;java.rmi.Naming.rebind(Naming.java:177)&lt;br /&gt;rmi.Server.run(Server.java:43)&lt;br /&gt;rmi.Server.main(Server.java:68)&lt;br /&gt;error marshalling arguments; nested exception is: &lt;br /&gt; java.io.NotSerializableException: java.io.RandomAccessFile&lt;br /&gt;&lt;/pre&gt;&lt;code class="prettyprint"&gt;RandomAccessFile&lt;/code&gt; ist nicht serialisierbar, weil der innere Zustand so eines Objekts von der Laufzeitumgebung (Betriebssystem, Dateisystem, etc.) abhängt. Eine Referenz auf ein &lt;code class="prettyprint"&gt;RandomAccessFile&lt;/code&gt;-Objekt muss als &lt;code class="prettyprint"&gt;transient&lt;/code&gt; deklariert werden. Wenn nötig, dann muss der Zustand selbst gespeichert bzw. wiederhergestellt werden, z.B. in Form des Dateinamens und der Position innerhalb der Datei.&lt;br /&gt;Dazu kann man die Methoden des Interfaces &lt;code class="prettyprint"&gt;Serializable&lt;/code&gt; implementieren:&lt;br /&gt;&lt;pre class="prettyprint"&gt;private void writeObject(java.io.ObjectOutputStream out)&lt;br /&gt;    throws IOException&lt;br /&gt;private void readObject(java.io.ObjectInputStream in)&lt;br /&gt;    throws IOException, ClassNotFoundException;&lt;br /&gt;private void readObjectNoData() &lt;br /&gt;    throws ObjectStreamException;&lt;br /&gt;&lt;/pre&gt;Für die Zwecke der &lt;code class="prettyprint"&gt;Data&lt;/code&gt;-Klasse genügen die ersten beiden Methoden. Folgender Ausschnitt aus der &lt;code class="prettyprint"&gt;Data&lt;/code&gt;-Klasse soll dies verdeutlichen:&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class Data implements DB, Header, Serializable {&lt;br /&gt;&lt;br /&gt;    private static final long serialVersionUID = -8958941842720498616L;&lt;br /&gt;    private transient RandomAccessFile database;&lt;br /&gt;    private String filename;&lt;br /&gt;    private transient Logger log = Logger.getLogger(LOGURL);&lt;br /&gt;    private DBHeader header;&lt;br /&gt;    private TreeMap&lt;Integer, DataRecord&gt; data;&lt;br /&gt;    private int lastDeleted = -1; // zuletzt gelöschter Datensatz&lt;br /&gt;&lt;br /&gt;    private void writeObject(ObjectOutputStream stream) throws IOException {&lt;br /&gt;        stream.defaultWriteObject();&lt;br /&gt;        stream.writeLong(database.getFilePointer());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void readObject(ObjectInputStream stream) throws IOException {&lt;br /&gt;        try {&lt;br /&gt;            stream.defaultReadObject();&lt;br /&gt;        } catch (ClassNotFoundException e) {&lt;br /&gt;            String msg = "Unable to find class";&lt;br /&gt;            if (e.getMessage() != null)&lt;br /&gt;                msg += ": " + e.getMessage();&lt;br /&gt;            throw new IOException(msg);&lt;br /&gt;        }&lt;br /&gt;        database = new RandomAccessFile(filename, "rw");&lt;br /&gt;        database.seek(stream.readLong());&lt;br /&gt;        log = Logger.getLogger(LOGURL);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;//... weiterer Code entfernt&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Hier ist auch der Logger transient, da auch der Logger vom Dateisystem abhängt und nicht serialisiert werden kann.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-610939543337901610?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/610939543337901610/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/serialisierungsprobleme-mit-rmi-pr-5a.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/610939543337901610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/610939543337901610'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/serialisierungsprobleme-mit-rmi-pr-5a.html' title='Serialisierungsprobleme mit RMI (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-7166263654316057486</id><published>2011-04-13T13:44:00.000+02:00</published><updated>2011-04-13T13:44:54.089+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Package für Data, Header, Record (PR: 5A, 5B)</title><content type='html'>Verwenden Sie unbedingt das &lt;b&gt;Package &lt;code class="prettyprint"&gt;data&lt;/code&gt;&lt;/b&gt; für die Klassen und Interfaces &lt;code class="prettyprint"&gt;DB&lt;/code&gt;, &lt;code class="prettyprint"&gt;Data&lt;/code&gt;, &lt;code class="prettyprint"&gt;Header&lt;/code&gt; und &lt;code class="prettyprint"&gt;Record&lt;/code&gt;. Nur so kann der Datenteil automatisch getestet werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-7166263654316057486?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/7166263654316057486/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/package-fur-data-header-record-pr-5a-5b.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7166263654316057486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7166263654316057486'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/package-fur-data-header-record-pr-5a-5b.html' title='Package für Data, Header, Record (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5679766579514552196</id><published>2011-04-12T19:45:00.000+02:00</published><updated>2011-04-12T19:45:44.775+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Refactoring Data - Interface Record (PR: 5A, 5B)</title><content type='html'>Um einfacher automatisch testen zu können, soll das Interface &lt;code class="prettyprint"&gt;Record&lt;/code&gt; (anstatt einer Klasse &lt;code class="prettyprint"&gt;Record&lt;/code&gt;) bei der Datenklasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt; verwendet werden.&lt;br /&gt;&lt;pre class="prettyprint"&gt;package data;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * RuD-Übung 2011&lt;br /&gt; *&lt;br /&gt; * data.Record.java&lt;br /&gt; * @author (c) 2011, Harald R. Haberstroh&lt;br /&gt; * 1.3.2011&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;import java.rmi.Remote;&lt;br /&gt;import java.rmi.RemoteException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author Harald R. Haberstroh (hh)&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public interface Record extends Remote {&lt;br /&gt;    /**&lt;br /&gt;     * @return Anzahl der Felder dieses Datensatzes z.B. 8&lt;br /&gt;     */&lt;br /&gt;    public int getCntFields() throws RemoteException;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @return liefert alle Felder verkettet in einen String mit ';' getrennt&lt;br /&gt;     *         z.B.&lt;br /&gt;     *         "12;49.82012,17.260019;47.81497,16.260409;523;201102131510;67;2345121269;O"&lt;br /&gt;     *         Strings sind unter Hochkomma zu setzen. z.B.&lt;br /&gt;     *         "\"wlr1\";\"Werk Laderoboter 1\";\"   50\";\"   50\""&lt;br /&gt;     */&lt;br /&gt;    public String getCsvString() throws RemoteException;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Setzt die Felder auf die gegebenen Strings. Gegebenenfalls sind die&lt;br /&gt;     * Strings abzuschneiden. Die Anzahl der Strings stimmt beim Aufruf von&lt;br /&gt;     * setFields() auf alle Fälle mit getCntFields() überein (Prüfung braucht&lt;br /&gt;     * nicht zu erfolgen).&lt;br /&gt;     * &lt;br /&gt;     * @param fields&lt;br /&gt;     *            Array mit den Feldwerten.&lt;br /&gt;     * @throws RemoteException&lt;br /&gt;     */&lt;br /&gt;    public void setFields(String[] fields) throws RemoteException;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Damit kann per JUnit-Test ganz einfach der Inhalt eines Datensatzes und die Anzahl der Felder geprüft werden.&lt;br /&gt;Überdies wird hier &lt;b&gt;Refactoring&lt;/b&gt; geübt, da das Programm (die Klassen) entsprechend angepasst werden müssen (Ihre &lt;code class="prettyprint"&gt;Record&lt;/code&gt;-Klasse muss umbenannt werden und eben das gegebene Interface implementieren).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5679766579514552196?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5679766579514552196/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/refactoring-data-interface-record-pr-5a.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5679766579514552196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5679766579514552196'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/refactoring-data-interface-record-pr-5a.html' title='Refactoring Data - Interface Record (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2037164069863811540</id><published>2011-04-11T22:08:00.000+02:00</published><updated>2011-04-11T22:08:54.350+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RoboCup'/><category scheme='http://www.blogger.com/atom/ns#' term='Robotik'/><title type='text'>RoboCupJunior 2011 in Wels</title><content type='html'>Heuer sind wir mit 3 Teams zu diesem Bewerb gefahren und haben bei einem Bewerb sogar den dritten Platz erreicht. Hier ein paar Eindrücke:&lt;br /&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=de&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FHarald.Haberstroh%2Falbumid%2F5594379336654764961%3Falt%3Drss%26kind%3Dphoto%26hl%3Dde" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;br /&gt;Die ersten Bilder zeigen das Zimmer, die Vorbesprechung am Abend des Anreisetags und ein paar Bilder von Wels. Dann gibt es jede Menge Eindrücke vom Bewerb.&lt;br /&gt;Weitere Informationen gibt es unter &lt;a href="http://robocupjunior.at/"&gt;robocupjunior.at&lt;/a&gt; und &lt;a href="http://www.robo4you.at/"&gt;www.robo4you.at&lt;/a&gt; (diese Seite ist noch im Entstehen).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2037164069863811540?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2037164069863811540/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/robocupjunior-2011-in-wels.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2037164069863811540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2037164069863811540'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/robocupjunior-2011-in-wels.html' title='RoboCupJunior 2011 in Wels'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-698489870352009731</id><published>2011-04-08T08:36:00.001+02:00</published><updated>2011-04-08T09:07:48.765+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Aufgabe Gruppenwechsel Ski (POS1: 2A, 2C)</title><content type='html'>Schreiben Sie eine Java-Klasse &lt;code&gt;Grw.java&lt;/code&gt;, welches aus dem Datenbestand &lt;a href="http://edvowww.htlwrn.ac.at/HP/blosxom/java/beispiele/ski.csv"&gt;ski.csv&lt;/a&gt; die beigelegte Statistik erzeugt.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Ausschnitt csv-Datei ski.csv als Bild" src="http://edvowww.htlwrn.ac.at/HP/blosxom/java/beispiele/ski-csv.png" /&gt;&lt;br /&gt;&lt;br /&gt;Lesen Sie die &lt;code&gt;csv&lt;/code&gt; -Datei zeilenweise und erstellen Sie aus jeder Zeile ein Objekt einer Klasse &lt;code&gt;SkiDaten&lt;/code&gt;, die alle notwendigen Attribute (Klasse, Name, Geb.Datum,....) enthält.&lt;br /&gt;Nennen Sie das Projekt &lt;code&gt;grwski&lt;/code&gt; (also insgesamt z.B. &lt;code&gt;2ad-haberstroh-grwski&lt;/code&gt;). &lt;br /&gt;Sollte eine neue Sortierung des Sätze notwendig sein, bitte mit OpenOffice Calc oder Excel sortieren. 1-er Kandidaten sortieren bitte mit eigenem Sortprogramm.&lt;br /&gt;INFO: es handelt sich um einen &lt;b&gt;zweistufigen&lt;/b&gt; Gruppenwechsel mit den Gruppen&lt;br /&gt;&lt;pre&gt;KLASSE und GESCHL&lt;br /&gt;&lt;/pre&gt;und einer Gesamtdarstellung des Durchschnitts!&lt;br /&gt;Eine Einführung in den Gruppenwechsel finden Sie in der Datei &lt;a href="http://edvowww.htlwrn.ac.at/HP/blosxom/java/beispiele/gruppenwechsel.pdf"&gt;gruppenwechsel.pdf&lt;/a&gt;&lt;br /&gt;Aufruf des Programms:&lt;br /&gt;&lt;pre&gt;java Grw [-h | -o ausgabedat] [-d] eingabedatei&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Die Option &lt;code&gt;-d&lt;/code&gt; bewirkt die Ausgabe der Detailzeilen, ohne &lt;code&gt;-d&lt;/code&gt; nur Summenzeilen ausgeben!&lt;br /&gt;Beispiel Statistik:&lt;br /&gt;&lt;pre&gt;------------------------------------------------------------------&lt;br /&gt;STATISTIK zum Schuelerrennen der HTL am SKIKURS 2006 in OBERTAUERN&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;AMINGER                   Georg                            0.02&lt;br /&gt;ELIAS                     Thomas                           0.97&lt;br /&gt;GALAVICS                  Marcus                           0.15&lt;br /&gt;GALLAUNER                 Alexander                        0.26&lt;br /&gt;HECHER                    Markus                           0.58&lt;br /&gt;HERMANN                   Gregor                           0.65&lt;br /&gt;KAMPER                    Raphael                          0.55&lt;br /&gt;KRIVOKUCA                 Milan                            7.73&lt;br /&gt;MOSER                     Christoph                        2.34&lt;br /&gt;NEPOLA                    René                             0.14&lt;br /&gt;PRIELER                   Stefan                           0.63&lt;br /&gt;RECHBERGER                Christian                        3.11&lt;br /&gt;RIEGLER                   Mario                            0.87&lt;br /&gt;SCHNEEBERGER              Joerg                            1.22&lt;br /&gt;SENN                      Bernhard                         0.65&lt;br /&gt;WIESSNER                  Maximilian                       1.61&lt;br /&gt;ZENZ                      Markus                           2.04&lt;br /&gt;&lt;br /&gt;die durchschnittliche Zeitdifferenz bei den MAENNERN betraegt:  1.38&lt;br /&gt;&lt;br /&gt;die KLASSE 2AHDV   erreichte eine Durchschnittsdifferenz von  1.38 Sekunden&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CMUND                     Katharina                        2.81&lt;br /&gt;HARATHER                  Alice                            1.87&lt;br /&gt;KONLECHNER                Viktoria                         0.39&lt;br /&gt;RIEGER                    Jennifer                         0.63&lt;br /&gt;RINNHOFER                 Elisabeth                        1.65&lt;br /&gt;...........................................................&lt;br /&gt;&lt;br /&gt;...........................................................&lt;br /&gt;REICHHART                 Thomas                           0.30&lt;br /&gt;RIEDER                    Dominik                          1.07&lt;br /&gt;SCHERMANN                 Georg                            0.85&lt;br /&gt;STANGL                    Stefan                           1.48&lt;br /&gt;STAUFER                   Andreas                          0.47&lt;br /&gt;&lt;br /&gt;die durchschnittliche Zeitdifferenz bei den MAENNERN betraegt:  2.38&lt;br /&gt;&lt;br /&gt;die KLASSE 3CHDV   erreichte eine Durchschnittsdifferenz von  2.36 Sekunden&lt;br /&gt;************************************************GESAMT-Differenz :  1.93&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Achtung:&lt;/b&gt; Die obige Ausgabe stellt nur einen Ausschnitt dar (Aufruf mit Option &lt;code&gt;-d&lt;/code&gt;) und es wurde die vorletzte Zeile (Hüpfner) gelöscht, da dort extrem abweichende Zeiten vorkommen (die Schülerin ist scheinbar gestürzt). Die Gesamt-Different würde mit dieser Zeile &lt;code&gt;11,37&lt;/code&gt; Sekunden betragen.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Binäres Dateiformat für Eingabe&lt;/h3&gt;&lt;br /&gt;Erstellen Sie ein neues Programm so, dass sie statt der CSV-Eingabedatei auch eine Datei im binären Datenformat verwenden können. Die Daten sind wie folgt gespeichert (C-Datentypen):&lt;br /&gt;&lt;pre class="prettyprint"&gt;typedef struct umsatz {&lt;br /&gt;    char artikel[25];&lt;br /&gt;    char verkaeufer[25];&lt;br /&gt;    int  vkpreis;&lt;br /&gt;    int  monat; &lt;br /&gt;} umsatz_t;&lt;/pre&gt;Dabei ist &lt;code&gt;char artikel[25]&lt;/code&gt; ein maximal 24-Zeichen langer String, bei dem jedes Zeichen (ASCII) als ein Byte gespeichert wird. Das Ende des Strings wird durch das Zeichen &lt;code&gt;'\0'&lt;/code&gt; abgeschlossen (das hat tatsächlich den Wert &lt;code&gt;0&lt;/code&gt;). D.h. es müssen bis zu 25 Bytes gelesen werden, wobei nur die Zeichen bis exklusive &lt;code&gt;'\0'&lt;/code&gt; (direkt) in Java-&lt;code&gt;char&lt;/code&gt;s umgewandelt werden können (verwenden Sie z.B. &lt;code class="prettyprint"&gt;RandomAccessFile.read(byte[] buf)&lt;/code&gt;).&lt;br /&gt;&lt;code&gt;int&lt;/code&gt; entspricht einem 32-Bit-Integer und passt zum Java-Typ &lt;code&gt;int&lt;/code&gt;.&lt;br /&gt;Die passende Datei mit Testdaten finden Sie hier: &lt;a href="http://edvowww.htlwrn.ac.at/HP/blosxom/java/beispiele/daten.dat"&gt;daten.dat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Den Inhalt dieser Datei kann man &lt;b&gt;nur&lt;/b&gt; mit einem Programm öffnen, das die Daten binär lesen kann und sinnvoll, z.B. im Hexadezimalsystem, anzeigen kann. &lt;code&gt;khexedit&lt;/code&gt; oder das Konsolenprogramm &lt;code&gt;hexdump&lt;/code&gt; eignen sich dafür.&lt;br /&gt;&lt;br /&gt;Die Ausgabe von &lt;code&gt;hexdump&lt;/code&gt; könnte so aussehen (gekürzt):&lt;br /&gt;&lt;pre class="prettyprint shell"&gt;hp@L211 $ hexdump -C daten.dat &lt;br /&gt;00000000  50 72 6f 64 30 31 00 01  4c 00 ba 01 e5 e2 e6 b7  |Prod01..L.......|&lt;br /&gt;00000010  00 00 00 00 e4 98 04 08  28 4d 61 69 65 72 00 08  |........(Maier..|&lt;br /&gt;00000020  a0 fc f5 b7 dc e9 b9 bf  48 e9 b9 bf f1 86 04 08  |........H.......|&lt;br /&gt;00000030  90 8b f8 b7 dc 00 00 00  01 00 00 00 50 72 6f 64  |............Prod|&lt;br /&gt;00000040  30 32 00 01 4c 00 ba 01  e5 e2 e6 b7 00 00 00 00  |02..L...........|&lt;br /&gt;00000050  e4 98 04 08 28 4d 61 69  65 72 00 08 a0 fc f5 b7  |....(Maier......|&lt;br /&gt;00000060  dc e9 b9 bf 48 e9 b9 bf  f1 86 04 08 90 8b f8 b7  |....H...........|&lt;br /&gt;00000070  90 01 00 00 02 00 00 00  50 72 6f 64 30 33 00 01  |........Prod03..|&lt;br /&gt;00000080  4c 00 ba 01 e5 e2 e6 b7  00 00 00 00 e4 98 04 08  |L...............|&lt;br /&gt;00000090  28 48 75 62 65 72 00 08  a0 fc f5 b7 dc e9 b9 bf  |(Huber..........|&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es soll wieder ein 2-stufiger Gruppenwechsel programmiert werden (Artikel und Verkäufer).&lt;br /&gt;Zum Vergleich können Sie die Daten auch im CSV-Format verwenden: &lt;a href="http://edvowww.htlwrn.ac.at/HP/blosxom/java/beispiele/daten.csv"&gt;daten.csv&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Versuchen Sie, die beiden Varianten, jene mit den Ski-Daten und jene mit den (binären) Umsatzdaten, so zu gestalten, dass nur geringe Teile unterschiedlich sind (am Besten austauschbare Klassen mit gleichem Namen für die Daten und für die Formatierung). Der Hauptalgorithmus bleibt ja gleich.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-698489870352009731?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/698489870352009731/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/aufgabe-gruppenwechsel-ski-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/698489870352009731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/698489870352009731'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/aufgabe-gruppenwechsel-ski-pos1-2a-2c.html' title='Aufgabe Gruppenwechsel Ski (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1764719123022858730</id><published>2011-04-06T15:13:00.000+02:00</published><updated>2011-04-06T15:13:33.382+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>GUI für RMI-Client (PR: 5A, 5B)</title><content type='html'>Erstellen Sie für den Client unserer RMI-Client/Server-Anwendung eine grafische Oberfläche, welche den Inhalt der Datenbank (evtl als Ausschnitt) in einer JTable darstellt. Es soll möglich sein, einzelne Werte zu ändern, Zeilen zu löschen, neue Zeilen einzufügen und zu Suchen (eigener Dialog). Bei der Suche sind nur die gefundenen Datensätze anzuzeigen.&lt;br /&gt;Das GUI könnte (minimal, die Funktionen zum Löschen, Einfügen und Suchen sind in "Edit" versteckt) etwa so aussehen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cA9W03p6HkI/TZxm0gUWmJI/AAAAAAAAEfw/H8mLWS9EDKQ/s1600/ClientGUI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://1.bp.blogspot.com/-cA9W03p6HkI/TZxm0gUWmJI/AAAAAAAAEfw/H8mLWS9EDKQ/s400/ClientGUI.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1764719123022858730?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1764719123022858730/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/gui-fur-rmi-client-pr-5a-5b.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1764719123022858730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1764719123022858730'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/gui-fur-rmi-client-pr-5a-5b.html' title='GUI für RMI-Client (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-cA9W03p6HkI/TZxm0gUWmJI/AAAAAAAAEfw/H8mLWS9EDKQ/s72-c/ClientGUI.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-9069312419743139077</id><published>2011-04-06T12:48:00.016+02:00</published><updated>2011-04-06T14:35:41.183+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><title type='text'>Aufrufstack (Call Stack) (POS1: 2A, 2C)</title><content type='html'>Jede Laufzeitumgebung eines Programms muss beim Aufruf von Funktionen oder Methoden folgende Informationen verwalten:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Parameter&lt;/li&gt;&lt;li&gt;Rücksprungadresse (wohin kehrt Funktion zurück?)&lt;/li&gt;&lt;li&gt;lokale Variable&lt;/li&gt;&lt;li&gt;Objektreferenz (&lt;code&gt;this&lt;/code&gt;- oder &lt;code&gt;self&lt;/code&gt;-Referenz zum Objekt zu dem die Methode gehört)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Die Objektreferenz wird nur für objektorientierte Sprachen benötigt. Sie ist meist versteckt. In Python muss sie beim Erstellen der Klasse explizit angegeben werden (&lt;code&gt;self&lt;/code&gt;). Bei einem Aufruf &lt;code&gt;objekt.methode(...)&lt;/code&gt; wird intern dann etwas wie &lt;code&gt;methode(objekt, ...)&lt;/code&gt; erzeugt (&lt;code&gt;...&lt;/code&gt; stellt die Parameter der Methode dar).&lt;/div&gt;&lt;div&gt;Oben genannte Informationen werden auf einem &lt;a href="http://de.wikipedia.org/wiki/Stapelspeicher"&gt;Stack&lt;/a&gt; abgelegt, dem Aufrufstack oder &lt;a href="http://en.wikipedia.org/wiki/Call_stack"&gt;Call Stack&lt;/a&gt;. Je nach Implementierung können noch weitere Informationen dazukommen.&lt;br /&gt;Beispiele zur Darstellung finden Sie hier: &lt;a href="http://programmierblog.blogspot.com/2009/12/aufrufstack.html"&gt;Aufrufstack&lt;/a&gt;&amp;nbsp;und &lt;a href="http://programmierblog.blogspot.com/2009/12/aufrufstack-losung.html"&gt;Lösung zum Aufrufstack&lt;/a&gt;&amp;nbsp;(dieses Beispiel verwendet praktisch keine Objektreferenzen, d.h. Objekte werden nicht dargestellt).&lt;br /&gt;&lt;br /&gt;Im Folgenden finden Sie ein einfaches Beispiel mit zwei Klassen:&lt;/div&gt;&lt;pre class="prettyprint linenums"&gt;public class Bar {&lt;br /&gt;    private Foo[] bars = new Foo[2];&lt;br /&gt;    private int n = 0;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Bar o = new Bar();&lt;br /&gt;        for (int i = 0; i &amp;lt; 6; i++) {&lt;br /&gt;            Foo m = new Foo("" + i);&lt;br /&gt;            o.add(m);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    public void add(Foo m) {&lt;br /&gt;        bars[n] = m;&lt;br /&gt;        n++;&lt;br /&gt;        if (n == bars.length) {&lt;br /&gt;            for (int i = 0; i &amp;lt; bars.length; i++) {&lt;br /&gt;                System.out.println(bars[i].getName());&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="prettyprint linenums"&gt;public class Foo {&lt;br /&gt;    private String name;&lt;br /&gt;    public Foo() {&lt;br /&gt;        this("no name");&lt;br /&gt;    }&lt;br /&gt;    public Foo(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;    public String getName() {&lt;br /&gt;        return "Foo [name=" + name + "]";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Die Aufgabenstellung wäre: &lt;b&gt;zeichnen Sie den Aufrufstack und den Heap, wenn das Programm die Zeile 10 in der Klasse &lt;code class="prettyprint"&gt;Foo&lt;/code&gt; erreicht. Das Programm soll dabei mit folgendem Aufruf gestartet worden sein: &lt;code&gt;java Bar test&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;Bei der folgenden Darstellung werden Strings wie primitive Werte dargestellt, also direkt bei der Variable. Richtigerweise sind Strings aber Objekte.&lt;br /&gt;Die Darstellung zeigt den Speicher schematisch für die Zeilen Bar:8, Bar:14 und die gesuchte Zeile Foo:10.&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.haberstroh.at/images/aufrufstack.swf" pluginspage=" http://www.macromedia.com/go/getflashplayer" height="400" width="600"&gt;&lt;/embed&gt;&lt;br /&gt;Clicken für weiteres Bild...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-9069312419743139077?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/9069312419743139077/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/04/aufrufstack-call-stack-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/9069312419743139077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/9069312419743139077'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/04/aufrufstack-call-stack-pos1-2a-2c.html' title='Aufrufstack (Call Stack) (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1509571465252990016</id><published>2011-03-31T21:58:00.000+02:00</published><updated>2011-03-31T21:58:01.762+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robotik'/><title type='text'>Quadcopter spielen Tennis</title><content type='html'>&lt;object height="270" width="480"&gt;&lt;param name="movie" value="http://video.golem.de/player/videoplayer.swf?id=4584&amp;autoPl=false"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="AllowScriptAccess" value="always"&gt;&lt;embed src="http://video.golem.de/player/videoplayer.swf?id=4584&amp;autoPl=false" type="application/x-shockwave-flash" allowfullscreen="true" AllowScriptAccess="always" width="480" height="270"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="font-family: verdana,sans-serif; font-size: 0.8em; text-align: center; width: 480px;"&gt;&lt;a href="http://video.golem.de/wissenschaft/4584/quadrocopter-spielen-tennis.html"&gt;Video: Quadrocopter spielen Tennis&lt;/a&gt;&amp;nbsp;(0:59)&lt;/div&gt;Coole Sache, diese &lt;a href="http://de.wikipedia.org/wiki/Quadrocopter"&gt;Quad(ro)copter&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1509571465252990016?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1509571465252990016/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/quadcopter-spielen-tennis.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1509571465252990016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1509571465252990016'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/quadcopter-spielen-tennis.html' title='Quadcopter spielen Tennis'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1684382101418084473</id><published>2011-03-23T14:55:00.000+01:00</published><updated>2011-03-23T14:55:11.975+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Literaturverwaltung - RandomAccessFile (POS1: 2A, 2C)</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Jemand will Zeitschriftenartikel, Bücher und Internet-Links für seine Recherchen verwalten. Schreiben Sie dazu eine Java-Klasse (plus eventuelle Hilfsklassen), welche es ermöglicht diese Daten in einer&amp;nbsp;&lt;span style="font-weight: bold;"&gt;RandomAccess&lt;/span&gt;-Datei zu speichern. Folgende Daten sollen in der Klasse&amp;nbsp;&lt;code class="prettyprint"&gt;Eintrag&lt;/code&gt;&amp;nbsp;erfasst werden:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;autor -&amp;nbsp;&lt;code class="prettyprint"&gt;String(100)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;titel -&amp;nbsp;&lt;code class="prettyprint"&gt;String(100)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;erscheinungsjahr -&amp;nbsp;&lt;code class="prettyprint"&gt;int&lt;/code&gt;&lt;/li&gt;&lt;li&gt;verlag -&amp;nbsp;&lt;code class="prettyprint"&gt;String(30)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;zeitschrift -&amp;nbsp;&lt;code class="prettyprint"&gt;String(30)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;seiten -&amp;nbsp;&lt;code class="prettyprint"&gt;String(10)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;link -&amp;nbsp;&lt;code class="prettyprint"&gt;String(60)&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code class="prettyprint"&gt;String(100)&lt;/code&gt;&amp;nbsp;bedeutet, dass dafür maximal 100 (genau 100) Zeichen gespeichert werden soll. Sie können das so implementieren, dass kürzere Strings hinten mit Leerzeichen gefüllt werden. Längere Strings müssen abgeschnitten werden. Für eine eventuelle Anzeige/Ausgabe müssen aber die Füllzeichen entfernt werden. Die Klasse&amp;nbsp;&lt;code class="prettyprint"&gt;Eintrag&lt;/code&gt;&amp;nbsp;ist mit entsprechenden Getter- und Setter-Methoden auszustatten (die bei den Strings das Abschneiden und Auffüllen bewerkstelligen).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Die Klasse&amp;nbsp;&lt;code class="prettyprint"&gt;Literatur&lt;/code&gt;&amp;nbsp;für die Verwaltung der Datensätze soll folgende Methoden bereitstellen:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;public void neuerEintrag(Eintrag eintrag)&lt;/code&gt;&amp;nbsp;- fügt einen neuen Eintrag in die Datei ein.&lt;/li&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;public Eintrag lese(int nummer)&lt;/code&gt;&amp;nbsp;- liefert den Eintrag an der Stelle&amp;nbsp;&lt;code class="prettyprint"&gt;nummer&lt;/code&gt;&amp;nbsp;oder&amp;nbsp;&lt;code class="prettyprint"&gt;null&lt;/code&gt;, falls dieser Eintrag nicht existiert.&lt;/li&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;public void loescheEintrag(int nummer)&lt;/code&gt;&amp;nbsp;- löscht den Eintrag an der Stelle&amp;nbsp;&lt;code class="prettyprint"&gt;nummer&lt;/code&gt;&amp;nbsp;(tut nichts, wenn es den Eintrag nicht gibt).&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Der Konstruktor der Klasse Literatur soll eine geöffnete RandomAccess-Datei als Parameter haben:&lt;/div&gt;&lt;pre class="prettyprint" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;public Literatur(RandomAccessFile file)&lt;br /&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Implementieren Sie das&amp;nbsp;&lt;span style="font-weight: bold;"&gt;Löschen&lt;/span&gt;&amp;nbsp;so, dass der jeweilige Eintrag als gelöscht&amp;nbsp;&lt;span style="font-weight: bold;"&gt;markiert&lt;/span&gt;&amp;nbsp;wird (zusätzliches Feld) und diese Änderung in der Datei gespeichert wird. Der Datensatz ist also physisch noch in der Datei. Bei der Methode&amp;nbsp;&lt;code class="prettyprint"&gt;lese()&lt;/code&gt;&amp;nbsp;muss also im Falle eines gelöschten Eintrags&amp;nbsp;&lt;code class="prettyprint"&gt;null&lt;/code&gt;&amp;nbsp;geliefert werden.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Umgekehrt muss bei&amp;nbsp;&lt;code class="prettyprint"&gt;neuerEintrag()&lt;/code&gt;&amp;nbsp;zunächst ein gelöschter Eintrag gesucht werden. Wird ein solcher gefunden, so wird er durch den neuen ersetzt (Lösch-Markierung muss wieder zurückgesetzt werden). Wird kein gelöschter Datensatz gefunden, so ist der neue an die Datei anzuhängen.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Schreiben Sie ein kleines Testprogramm zum Testen Ihrer Klassen.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-style: italic;"&gt;Anmerkung&lt;/span&gt;: Die Daten sind für eine echte Anwendung nicht ausreichend und müssten unterteilt werden, da es z.B. mehrere Autoren für einen Artikel gibt.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-weight: bold;"&gt;Hinweis&lt;/span&gt;:&amp;nbsp;&lt;a href="http://programmieren.googlecode.com/files/LiteraturTest.java"&gt;&lt;span style="font-weight: bold;"&gt;hier&lt;/span&gt;&lt;/a&gt;&amp;nbsp;finden Sie eine Testklasse zum Testen der Klasse&amp;nbsp;&lt;code class="prettyprint"&gt;Literatur&lt;/code&gt;. Die Klasse&amp;nbsp;&lt;code class="prettyprint"&gt;Literatur&lt;/code&gt;&amp;nbsp;muss wie diese Testklasse im Package&amp;nbsp;&lt;code class="prettyprint"&gt;literatur&lt;/code&gt;&amp;nbsp;sein. Weiters muss die Library für JUnit 3 angegeben werden. Diese Testklasse trifft gewissen Annahmen zur Implementierung von&amp;nbsp;&lt;code class="prettyprint"&gt;Literatur&lt;/code&gt;&amp;nbsp;und&amp;nbsp;&lt;code class="prettyprint"&gt;Eintrag&lt;/code&gt;. Bitte passen Sie entweder die Testklasse an Ihre Implementierung an oder Sie ändern Ihre&amp;nbsp;&lt;code class="prettyprint"&gt;Literatur&lt;/code&gt;&amp;nbsp;bzw.&amp;nbsp;&lt;code class="prettyprint"&gt;Eintrag&lt;/code&gt;-Klassen entsprechend (z.B. nimmt der Test an, dass es eine&amp;nbsp;&lt;code class="prettyprint"&gt;read()&lt;/code&gt;&amp;nbsp;und eine&amp;nbsp;&lt;code class="prettyprint"&gt;write()&lt;/code&gt;-Methode gibt, die einen Datensatz (&lt;span style="font-style: italic;"&gt;"in sich hinein"&lt;/span&gt;) liest bzw. einen Datensatz (&lt;span style="font-style: italic;"&gt;"sich selbst"&lt;/span&gt;) schreibt (jeweils an die Position, die in&amp;nbsp;&lt;code class="prettyprint"&gt;Literatur&lt;/code&gt;&amp;nbsp;bestimmt wurde).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Ihre Klasse Eintrag könnte etwa so beginnen:&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class Eintrag {&lt;br /&gt;&lt;br /&gt;  // Feldlängen&lt;br /&gt;  private final static int autorLen = 100;&lt;br /&gt;  private final static int titelLen = 100;&lt;br /&gt;  private final static int verlagLen = 30;&lt;br /&gt;  private final static int zeitschriftLen = 30;&lt;br /&gt;  private final static int seitenLen = 10;&lt;br /&gt;  private final static int linkLen = 60;&lt;br /&gt;&lt;br /&gt;  // Felder&lt;br /&gt;  private String autor;&lt;br /&gt;  private String titel;&lt;br /&gt;  private int erscheinungsjahr;&lt;br /&gt;  private String verlag;&lt;br /&gt;  private String zeitschrift;&lt;br /&gt;  private String seiten;&lt;br /&gt;  private String link;&lt;br /&gt;&lt;br /&gt;  // gelöscht?&lt;br /&gt;  private boolean istGeloescht = false;&lt;br /&gt;&lt;/pre&gt;Da eine fixe Datensatzlänge gefordert ist, müssen Sie die Länge ermitteln, indem Sie die Längen der einzelnen Felder zusammenzählen. Wir schätzen für &lt;code class="prettyprint"&gt;Boolean&lt;/code&gt; die Länge von &lt;code class="prettyprint"&gt;int&lt;/code&gt; (bestimmt mit Hilfe der Wrapperklasse &lt;code class="prettyprint"&gt;Integer&lt;/code&gt; und der Konstante &lt;code class="prettyprint"&gt;SIZE&lt;/code&gt;, welche die Länge in Bits angibt).&lt;br /&gt;&lt;pre class="prettyprint"&gt;public static int eintragLen() {&lt;br /&gt;    int len = Integer.SIZE&lt;br /&gt;        / 8&lt;br /&gt;        + (autorLen + titelLen + verlagLen + zeitschriftLen + seitenLen + linkLen)&lt;br /&gt;        * 3 + 6 * Long.SIZE / 8 + Integer.SIZE / 8;&lt;br /&gt;    return len;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;Der Faktor &lt;b&gt;3&lt;/b&gt; entsteht durch die Verwendung der &lt;b&gt;&lt;a href="http://de.wikipedia.org/wiki/UTF-8"&gt;UTF-8&lt;/a&gt;&lt;/b&gt;-Kodierung. &lt;b&gt;UTF-8&lt;/b&gt; ist eine Kodierung des &lt;b&gt;&lt;a href="http://de.wikipedia.org/wiki/Unicode"&gt;Unicodes&lt;/a&gt;&lt;/b&gt; und speichert alle Zeichen des &lt;b&gt;ASCII&lt;/b&gt;-Codes auch in der selben Kodierung wie ASCII, daher werden dann für andere Zeichen 2, 3 bzw. 4 Bytes verwendet (Unicode verwendete in den ersteren Versionen 16 Bit, in Java werden daher Zeichen mit 16 Bit kodiert). Um ganz sicher zu sein, müsste man den Faktor 4 verwenden. &lt;code class="prettyprint"&gt;Long.SIZE / 8&lt;/code&gt; ist die Längeninformation, die in jedem String-Objekt gespeichert ist.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Strings werden mit &lt;code class="prettyprint"&gt;file.writeUTF(string);&lt;/code&gt; geschrieben bzw. mit &lt;code class="prettyprint"&gt;string = file.readUTF();&lt;/code&gt; gelesen.&lt;br /&gt;&lt;pre class="prettyprint"&gt;public void write(RandomAccessFile out) throws IOException {&lt;br /&gt;    out.writeBoolean(istGeloescht);&lt;br /&gt;    out.writeUTF(autor);&lt;br /&gt;    out.writeUTF(link);&lt;br /&gt;    out.writeUTF(seiten);&lt;br /&gt;    out.writeUTF(titel);&lt;br /&gt;    out.writeUTF(verlag);&lt;br /&gt;    out.writeUTF(zeitschrift);&lt;br /&gt;    out.writeInt(erscheinungsjahr);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void read(RandomAccessFile in) throws IOException, EOFException {&lt;br /&gt;    istGeloescht = in.readBoolean();&lt;br /&gt;    autor = in.readUTF();&lt;br /&gt;    link = in.readUTF();&lt;br /&gt;    seiten = in.readUTF();&lt;br /&gt;    titel = in.readUTF();&lt;br /&gt;    verlag = in.readUTF();&lt;br /&gt;    zeitschrift = in.readUTF();&lt;br /&gt;    erscheinungsjahr = in.readInt();&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Die String-Felder müssen natürlich auf eine fixe Länge gebracht werden, d.h. zu lange Strings müssen abgeschnitten, zu kurze evtl. verlängert werden. Dies erledigt man am Besten in den Setter- bzw. Getter-Methoden.&lt;br /&gt;Das Lesen eines Datensatzes in der Klasse &lt;code class="prettyprint"&gt;Literatur&lt;/code&gt; könnte etwa so funktionieren:&lt;br /&gt;&lt;pre class="prettyprint"&gt;public Eintrag lese(int nummer) throws IOException {&lt;br /&gt;    long pos = nummer * Eintrag.eintragLen();&lt;br /&gt;    if (pos &amp;lt; file.length()) {&lt;br /&gt;      file.seek(pos);&lt;br /&gt;      Eintrag eintrag = new Eintrag();&lt;br /&gt;      eintrag.read(file);&lt;br /&gt;      if (!eintrag.istGeloescht()) {&lt;br /&gt;        return eintrag;&lt;br /&gt;      } else {&lt;br /&gt;        return null; // gelöschter Eintrag gilt als nicht vorhanden&lt;br /&gt;      }&lt;br /&gt;    } else {&lt;br /&gt;      return null; // über die Dateilänge hinaus&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;Vervollständigen Sie mit diesen Informationen Ihre Klassen.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-weight: bold;"&gt;Nennen&lt;/span&gt;&amp;nbsp;Sie das Projekt&amp;nbsp;&lt;code&gt;klasse-name-literatur&lt;/code&gt;&amp;nbsp;(&lt;code&gt;klasse&lt;/code&gt;&amp;nbsp;... 2a, 2b, 2c,&amp;nbsp;&lt;code&gt;name&lt;/code&gt;&amp;nbsp;... Ihr Familienname), z.B.&amp;nbsp;&lt;code&gt;2a-haberstroh-literatur&lt;/code&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1684382101418084473?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1684382101418084473/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/literaturverwaltung-randomaccessfile.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1684382101418084473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1684382101418084473'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/literaturverwaltung-randomaccessfile.html' title='Literaturverwaltung - RandomAccessFile (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-6713221540691066402</id><published>2011-03-18T08:46:00.000+01:00</published><updated>2011-03-18T08:46:24.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Experimente mit Queues (POS1-2: 2A, 2C, PR: 5A, 5B)</title><content type='html'>Implementieren Sie im Package &lt;code class="prettyprint"&gt;ringbuffer&lt;/code&gt; eine Klasse &lt;code class="prettyprint"&gt;Queue&lt;/code&gt; für Integer-Werte. Implementieren Sie die &lt;code class="prettyprint"&gt;Queue&lt;/code&gt; in Form eines &lt;a href="http://de.wikipedia.org/wiki/Warteschlange_(Datenstruktur)"&gt;Ringpuffers&lt;/a&gt;. Es soll die Exception &lt;code class="prettyprint"&gt;QueueFullException&lt;/code&gt; geworfen werden, wenn der Ringpuffer voll ist und die Exception &lt;code class="prettyprint"&gt;QueueEmptyException&lt;/code&gt;, wenn der Ringpuffer leer ist.&lt;br /&gt;Als Testklasse verwenden Sie bitte die folgende Klasse &lt;code class="prettyprint"&gt;QueueTest&lt;/code&gt;, welche zwei Threads erzeugt. Einen Sender, der zufällige "Nachrichten" (Integerwerte) in die Warteschlange steckt und einen Empfänger, der Werte aus der Warteschlange entnimmt. Beide geben jeweils die gesendete bzw. gelesene Nachricht aus. Beide Threads haben unterschiedliche zufällige Wartezeiten.&lt;br /&gt;Experimentieren Sie mit unterschiedlichen Wartezeiten, sodass die Queue (Ringpuffer) voll bzw. leer werden kann. Was passiert?&lt;br /&gt;Wenn die Queue nicht synchronisiert wird, was kann passieren? Können Sie das Verhalten in Experimenten nachweisen?&lt;br /&gt;Bauen Sie entsprechendes &lt;code class="prettyprint"&gt;synchronized&lt;/code&gt; in Ihre Queue ein (5. Klasse). Was muss synchronisiert werden?&lt;br /&gt;&lt;b&gt;Source Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/**&lt;br /&gt; * java-queue: ringbuffer.QueueTest.java&lt;br /&gt; * &lt;br /&gt; * 17.03.2011, Harald R. Haberstroh&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package ringbuffer;&lt;br /&gt;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Testen der Queue mit 2 Threads.&lt;br /&gt; * &lt;br /&gt; * @author Harald R. Haberstroh (hp)&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public class QueueTest extends Thread {&lt;br /&gt;  private final static int MAXRUNS = 20;&lt;br /&gt;  private Queue messages;&lt;br /&gt;  private Random rnd = new Random();&lt;br /&gt;&lt;br /&gt;  public QueueTest(String name, Queue messages) {&lt;br /&gt;    super(name);&lt;br /&gt;    this.messages = messages;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void run() {&lt;br /&gt;    if (getName().equalsIgnoreCase("Sender")) {&lt;br /&gt;      for (int i = 0; i &lt; MAXRUNS; i++) {&lt;br /&gt;        int msg = rnd.nextInt(100);&lt;br /&gt;        long sleepTime = (long) rnd.nextInt(500) + 500; // 500-1000ms&lt;br /&gt;        try {&lt;br /&gt;          System.out.println(getName() + " sending " + msg);&lt;br /&gt;          messages.put(msg);&lt;br /&gt;        } catch (QueueFullException e) {&lt;br /&gt;          System.err.println(getName() + ":Oops - Queue full");&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;          sleep(sleepTime);&lt;br /&gt;        } catch (InterruptedException e) {&lt;br /&gt;          System.err.println(getName() + ":Oops - interrupted");&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    } else { // Receiver&lt;br /&gt;      setName("                    " + getName()); // Einrückung&lt;br /&gt;      for (int i = 0; i &lt; MAXRUNS || !messages.isEmpty(); i++) {&lt;br /&gt;        long sleepTime = (long) rnd.nextInt(900) + 600; // 900-1500ms&lt;br /&gt;        try {&lt;br /&gt;          if (!messages.isEmpty()) {&lt;br /&gt;            System.out.println(getName() + " read " + messages.get());&lt;br /&gt;          }&lt;br /&gt;        } catch (QueueEmptyException e) {&lt;br /&gt;          System.err.println(getName() + ": Oops - Queue empty");&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;          sleep(sleepTime);&lt;br /&gt;        } catch (InterruptedException e) {&lt;br /&gt;          System.err.println(getName() + ":Oops - interrupted");&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    System.out.println(getName() + " finished");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String toString() {&lt;br /&gt;    return getName();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * @param args&lt;br /&gt;   */&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    Queue messages = new Queue();&lt;br /&gt;    QueueTest sender = new QueueTest("Sender", messages);&lt;br /&gt;    QueueTest receiver = new QueueTest("Receiver", messages);&lt;br /&gt;    sender.start();&lt;br /&gt;    receiver.start();&lt;br /&gt;    try {&lt;br /&gt;      sender.join();&lt;br /&gt;      receiver.join();&lt;br /&gt;    } catch (InterruptedException e) {&lt;br /&gt;      System.err.println(e.getLocalizedMessage());&lt;br /&gt;    }&lt;br /&gt;    System.out.println(".... all finished ....");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Beispielausgabe bei Standardeinstellung&lt;/b&gt;&lt;pre&gt;Sender sending 73&lt;br /&gt;Sender sending 46&lt;br /&gt;                    Receiver read 73&lt;br /&gt;Sender sending 63&lt;br /&gt;                    Receiver read 46&lt;br /&gt;Sender sending 11&lt;br /&gt;                    Receiver read 63&lt;br /&gt;Sender sending 89&lt;br /&gt;Sender sending 21&lt;br /&gt;                    Receiver read 11&lt;br /&gt;Sender sending 99&lt;br /&gt;                    Receiver read 89&lt;br /&gt;Sender sending 79&lt;br /&gt;Sender sending 41&lt;br /&gt;                    Receiver read 21&lt;br /&gt;Sender sending 17&lt;br /&gt;                    Receiver read 99&lt;br /&gt;Sender sending 92&lt;br /&gt;                    Receiver read 79&lt;br /&gt;Sender sending 89&lt;br /&gt;                    Receiver read 41&lt;br /&gt;Sender sending 52&lt;br /&gt;                    Receiver read 17&lt;br /&gt;Sender sending 60&lt;br /&gt;                    Receiver read 92&lt;br /&gt;Sender sending 25&lt;br /&gt;                    Receiver read 89&lt;br /&gt;Sender sending 82&lt;br /&gt;Sender sending 60&lt;br /&gt;                    Receiver read 52&lt;br /&gt;Sender sending 13&lt;br /&gt;Sender sending 34&lt;br /&gt;                    Receiver read 60&lt;br /&gt;Sender sending 10&lt;br /&gt;                    Receiver read 25&lt;br /&gt;Sender finished&lt;br /&gt;                    Receiver read 82&lt;br /&gt;                    Receiver read 60&lt;br /&gt;                    Receiver read 13&lt;br /&gt;                    Receiver read 34&lt;br /&gt;                    Receiver read 10&lt;br /&gt;                    Receiver finished&lt;br /&gt;.... all finished ....&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-6713221540691066402?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/6713221540691066402/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/experimente-mit-queues-pos1-2-2a-2c-pr.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6713221540691066402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6713221540691066402'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/experimente-mit-queues-pos1-2-2a-2c-pr.html' title='Experimente mit Queues (POS1-2: 2A, 2C, PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2472070591207931678</id><published>2011-03-16T13:08:00.001+01:00</published><updated>2011-03-16T13:08:21.478+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>RMI-Client/Server mit Java (PR: 5A, 5B)</title><content type='html'>Schreiben Sie eine Klasse &lt;code class="prettyprint"&gt;Server&lt;/code&gt;, welche über &lt;b&gt;RMI&lt;/b&gt; folgende Objekte bereitstellt: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;rmi://localhost/Data&lt;/code&gt; (implementiert Interface &lt;code class="prettyprint"&gt;DB&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;rmi://localhost/Header&lt;/code&gt; (implementiert Interface &lt;code class="prettyprint"&gt;Header&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;code&gt;localhost&lt;/code&gt; kann natürlich (theoretisch) jede beliebige IP-Adresse bzw. jeder beliebige Hostname sein, wenn unter dieser Adresse ein RMI-Server erreichbar ist.&lt;br /&gt;&lt;br /&gt;Die zu öffnende Datei soll als Parameter der Kommandozeile angegeben werden. Aufruf:&lt;br /&gt;&lt;code class="prettyprint"&gt;  java Server dateiname&lt;/code&gt;&lt;br /&gt;Also z.B.:&lt;br /&gt;&lt;code class="prettyprint"&gt;  java Server machines.db&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Schreiben Sie weiters eine Klasse &lt;code class="prettyprint"&gt;Client&lt;/code&gt;, welche über &lt;b&gt;RMI&lt;/b&gt; die vom &lt;code class="prettyprint"&gt;Server&lt;/code&gt; bereitgestellten Objekte verwendet, um einfache "Datenbank"-Zugriffe zu machen. Beim Aufruf soll über einen optionalen Kommandozeilenparameter die Adresse des Servers angegeben werden. Wird kein Parameter angegeben, so ist &lt;code&gt;localhost&lt;/code&gt; zu verwenden. Aufruf:&lt;br /&gt;&lt;code class="prettyprint"&gt;  java Client [hostaddress]&lt;/code&gt;&lt;br /&gt;Also z.B.:&lt;br /&gt;&lt;code class="prettyprint"&gt;  java Client&lt;/code&gt;&lt;br /&gt;oder&lt;br /&gt;&lt;code class="prettyprint"&gt;  java Client 127.0.0.1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;Client&lt;/code&gt; soll einfach den Inhalt der Datenbank ausgeben (nur nicht gelöschte Datensätze). Die Spaltenüberschriften sind entsprechend der Informationen aus der Datei (über &lt;code class="prettyprint"&gt;Header&lt;/code&gt;) ausgeben. Zeilen müssen gemäß der Feldlängen formatiert sein.&lt;br /&gt;&lt;br /&gt;In weiterer Folge soll der Client &lt;b&gt;eine&lt;/b&gt; Minute lang zufällige Datensätze auswählen und ausgeben (falls diese existieren). Zwischen zwei Zugriffen soll eine zufällige Zeit zwischen 1 und 5 Sekunden liegen (d.h. es werden mindestens 12 und höchstens 60 weitere Zeilen ausgegeben).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2472070591207931678?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2472070591207931678/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/rmi-clientserver-mit-java-pr-5a-5b.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2472070591207931678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2472070591207931678'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/rmi-clientserver-mit-java-pr-5a-5b.html' title='RMI-Client/Server mit Java (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-6003449699610109027</id><published>2011-03-16T13:08:00.000+01:00</published><updated>2011-03-16T13:08:05.807+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Binärdateien bearbeiten mit Java - Zusatz für Client (PR: 5A, 5B)</title><content type='html'>Wie unter "&lt;a href="http://programmierblog.blogspot.com/2011/03/binardateien-bearbeiten-mit-java-pr-5a.html"&gt;Binärdateien bearbeiten mit Java (PR: 5A, 5B)&lt;/a&gt;" beschrieben, ist in der Binärdatei auch die Feldbeschreibung enthalten. An Server bzw. in der Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt; wird aber nur die Typ bzw. Längeninformation benötigt. Implementieren Sie das Interface &lt;code class="prettyprint"&gt;Header&lt;/code&gt; (entweder eigene Klasse oder Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt;), um die nötigen Informationen für den Client, der ja die Daten darstellen soll, bereitzustellen.&lt;br /&gt;&lt;pre class="prettyprint"&gt;package data;&lt;br /&gt;/**&lt;br /&gt; * RuD-Übung 2011&lt;br /&gt; *&lt;br /&gt; * data.Header.java&lt;br /&gt; * @author (c) 2011, Harald R. Haberstroh&lt;br /&gt; * 16.3.2011&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;import java.rmi.Remote;&lt;br /&gt;import java.rmi.RemoteException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author Harald R. Haberstroh (hh)&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public interface Header extends Remote {&lt;br /&gt;  /**&lt;br /&gt;   * Liefert die Anzahl der Felder.&lt;br /&gt;   *&lt;br /&gt;   * @return Anzahl der Felder&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public int getNumFields() throws RemoteException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Liefert den Feldnamen zur gegebenen Feldnummer&lt;br /&gt;   * &lt;br /&gt;   * @param fieldNo&lt;br /&gt;   *          Nummer Feldes.&lt;br /&gt;   * @return Feldname&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public String getFieldName(int fieldNo) throws RemoteException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Liefert die Beschreibung des Feldes zur gegebenen Feldnummer&lt;br /&gt;   * &lt;br /&gt;   * @param fieldNo&lt;br /&gt;   *          Nummer Feldes.&lt;br /&gt;   * @return Feldbeschreibung&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public String getFieldDesc(int fieldNo) throws RemoteException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Liefert den Typ des Feldes zur gegebenen Feldnummer.&lt;br /&gt;   * 'F'...fix, 'V'...Variabel, 'C'...Zeichen&lt;br /&gt;   * &lt;br /&gt;   * @param fieldNo&lt;br /&gt;   *          Nummer Feldes.&lt;br /&gt;   * @return Typ des Feldes ('F', 'V' oder 'C')&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public char getFieldType(int fieldNo) throws RemoteException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Liefert die (maximale) Länge des Feldes zur gegebenen Feldnummer.&lt;br /&gt;   * &lt;br /&gt;   * @param fieldNo&lt;br /&gt;   *          Nummer Feldes.&lt;br /&gt;   * @return (maximale) Feldlänge&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public int getFieldLen(int fieldNo) throws RemoteException;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-6003449699610109027?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/6003449699610109027/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/binardateien-bearbeiten-mit-java-zusatz.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6003449699610109027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/6003449699610109027'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/binardateien-bearbeiten-mit-java-zusatz.html' title='Binärdateien bearbeiten mit Java - Zusatz für Client (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2561054306449409915</id><published>2011-03-10T08:37:00.001+01:00</published><updated>2011-03-10T14:47:00.204+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Lösung'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Lösungen zu "Übungsbeispiele zu Sequenzen, Schleifen und Funktionen in Python" (POS1: 1B)</title><content type='html'>Hier mögliche Lösungen zu der Aufgabe &lt;a href="http://programmierblog.blogspot.com/2011/03/ubungsbeispiele-zu-sequenzen-schleifen.html"&gt;"Übungsbeispiele zu Sequenzen, Schleifen und Funktionen in Python (POS1: 1B)"&lt;/a&gt;. Einige der Aufgaben enthalten Suchaufgaben. Die Funktionen dazu sind teilweise nicht "strukturiert" programmiert, das heißt, dass sie in diesen Fällen nicht nur ein &lt;code class="prettyprint"&gt;return&lt;/code&gt; sondern mehrere Ausgänge haben. Um das zu verdeutlichen, beachten Sie folgendes Beispiel:&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isint(string):&lt;br /&gt;    """prüft, ob der String eine ganze Zahl ist (Vorzeichen optional, &lt;br /&gt;    nur Ziffern).&lt;br /&gt;    Prüfe nur Ziffernbereich."""&lt;br /&gt;    if len(string) &amp;gt; 0:&lt;br /&gt;        if string[0] == '+' or string[0] == '-':&lt;br /&gt;            for c in string[1:]:&lt;br /&gt;                if c &amp;lt; '0' or c &amp;gt; '9':&lt;br /&gt;                    return False&lt;br /&gt;        else:&lt;br /&gt;            for c in string:&lt;br /&gt;                if c &amp;lt; '0' or c &amp;gt; '9':&lt;br /&gt;                    return False&lt;br /&gt;    else:&lt;br /&gt;        return False&lt;br /&gt;    return True&lt;br /&gt;&lt;/pre&gt;Hier erfolgt ein &lt;code class="prettyprint"&gt;return False&lt;/code&gt; aus den Schleifen über den String &lt;code class="prettyprint"&gt;string&lt;/code&gt;, sobald ein Fehler gefunden wurde. Das vereinfacht den Algorithmus, widerspricht aber der strukturierten Programmierung, die bei Funkionen nur einen Ausgang erlaubt (bei Schleifen gilt das auch, die Schleife verlässt man nur durch die Schleifenbedingung, &lt;b&gt;nicht&lt;/b&gt; durch &lt;code class="prettyprint"&gt;break&lt;/code&gt; oder eben &lt;code class="prettyprint"&gt;return&lt;/code&gt;). Beim Debuggen größerer Systeme ist es von Vorteil, wenn man sich darauf verlassen kann, dass jede Funktion nur einen Ausgang hat, denn man braucht dann nur diesen einen beobachten und nicht mehrere.&lt;br /&gt;Bei obigem Beispiel müsste man &lt;code class="prettyprint"&gt;while&lt;/code&gt;-Schleifen verwenden:&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isint(string):&lt;br /&gt;    """prüft, ob der String eine ganze Zahl ist (Vorzeichen optional, &lt;br /&gt;    nur Ziffern).&lt;br /&gt;    Prüfe nur Ziffernbereich."""&lt;br /&gt;    ok = True&lt;br /&gt;    if len(string) &gt; 0:&lt;br /&gt;        if string[0] == '+' or string[0] == '-':&lt;br /&gt;            i = 1&lt;br /&gt;            while ok and i &lt; len(string):&lt;br /&gt;                if string[i] &lt; '0' or string[i] &gt; '9':&lt;br /&gt;                    ok = False&lt;br /&gt;                i += 1&lt;br /&gt;        else:&lt;br /&gt;            i = 0&lt;br /&gt;            while ok and i &lt; len(string):&lt;br /&gt;                if string[i] &lt; '0' or string[i] &gt; '9':&lt;br /&gt;                    ok = False&lt;br /&gt;                i += 1&lt;br /&gt;    else:&lt;br /&gt;        ok = False&lt;br /&gt;    return ok&lt;br /&gt;&lt;/pre&gt;Diese Variante könne man noch "vereinfachen", weil sich die beiden Zweige mit oder ohne Vorzeichen nur im Startwert der Laufvariable &lt;code class="prettyprint"&gt;i&lt;/code&gt; unterscheiden:&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isint(string):&lt;br /&gt;    """prüft, ob der String eine ganze Zahl ist (Vorzeichen optional, &lt;br /&gt;    nur Ziffern).&lt;br /&gt;    Prüfe nur Ziffernbereich."""&lt;br /&gt;    ok = True&lt;br /&gt;    if len(string) &gt; 0:&lt;br /&gt;        if string[0] == '+' or string[0] == '-':&lt;br /&gt;            i = 1&lt;br /&gt;        else:&lt;br /&gt;            i = 0&lt;br /&gt;        while ok and i &lt; len(string):&lt;br /&gt;            if string[i] &lt; '0' or string[i] &gt; '9':&lt;br /&gt;                ok = False&lt;br /&gt;            i += 1&lt;br /&gt;    else:&lt;br /&gt;        ok = False&lt;br /&gt;    return ok&lt;br /&gt;&lt;/pre&gt;Die "nicht strukturierte" Variante ist aber bei weitem schneller entwickelt und durch die automatischen Tests ist auch sichergestellt, dass sie funktioniert.&lt;br /&gt;&lt;br /&gt;Die Tests verwenden &lt;code class="prettyprint"&gt;assert()&lt;/code&gt;, um die Ergebnisse mit den erwarteten Ergebnissen zu vergleichen. &lt;code class="prettyprint"&gt;assert()&lt;/code&gt; bricht das Programm auf der Stelle ab, wenn die Bedingung nicht erfüllt ist. Dadurch hat man die Möglichkeit, den Fehler einzugrenzen. Passt die Bedingung, so läuft das Programm einfach weiter.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;"""&lt;br /&gt;author: Haberstroh, Harald&lt;br /&gt;matnr:  d09666&lt;br /&gt;file:   sequenzenbeispiele.py&lt;br /&gt;desc:   Beispiele einfacher Funktionen mit Sequenzen (vgl. Programmierblog)&lt;br /&gt;        Einige Funktionen bauen auf den anderen auf.&lt;br /&gt;        &lt;br /&gt;        Zu jeder Funktion (ausgenommen Hilfsfunktion) gibt es eine Testfunktion&lt;br /&gt;        die die jeweilige Funktion mit Testwerten prüft.&lt;br /&gt;        &lt;br /&gt;        Die Funktion assert() prüft den Wahrheitswert des Parameters. Ist dieser&lt;br /&gt;        True, so läuft das Programm einfach weiter. Ist er jedoch False, wird&lt;br /&gt;        das Programm mit einer Fehlermeldung und Zeilennummer abgebrochen.&lt;br /&gt;        Man kann dadurch feststellen, welcher Test nicht funktioniert hat.&lt;br /&gt;date:   7.3.2011&lt;br /&gt;class:  Lehrer&lt;br /&gt;catnr:  33&lt;br /&gt;"""&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def isint(string):&lt;br /&gt;    """prüft, ob der String eine ganze Zahl ist (Vorzeichen optional, &lt;br /&gt;    nur Ziffern).&lt;br /&gt;    Prüfe nur Ziffernbereich."""&lt;br /&gt;    if len(string) &gt; 0:&lt;br /&gt;        if string[0] == '+' or string[0] == '-':&lt;br /&gt;            for c in string[1:]:&lt;br /&gt;                if c &lt; '0' or c &gt; '9':&lt;br /&gt;                    return False&lt;br /&gt;        else:&lt;br /&gt;            for c in string:&lt;br /&gt;                if c &lt; '0' or c &gt; '9':&lt;br /&gt;                    return False&lt;br /&gt;    else:&lt;br /&gt;        return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def test_isint():&lt;br /&gt;    assert(isint("") == False)&lt;br /&gt;    assert(isint("a") == False)&lt;br /&gt;    assert(isint("1a") == False)&lt;br /&gt;    assert(isint("a1") == False)&lt;br /&gt;    assert(isint("1+1") == False)&lt;br /&gt;    assert(isint("1+") == False)&lt;br /&gt;    assert(isint("1") == True)&lt;br /&gt;    assert(isint("+1") == True)&lt;br /&gt;    assert(isint("-1") == True)&lt;br /&gt;    assert(isint("11212") == True)&lt;br /&gt;    assert(isint("-11212") == True)&lt;br /&gt;    assert(isint("+11212") == True)&lt;br /&gt;    print("test_isint() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def isintb(string, basis):&lt;br /&gt;    """prüft, ob der String eine ganze Zahl zur Basis basis ist (Vorzeichen&lt;br /&gt;    optional, nur Ziffern).&lt;br /&gt;    Baue String mit gültigen Zeichen zusammen und prüfe dann, ob jedes&lt;br /&gt;    Zeichen in diesem String vorkommt."""&lt;br /&gt;    if basis &gt; 1:&lt;br /&gt;        gueltig = "" # "Liste" der gültigen Zeichen für geg. Basis&lt;br /&gt;        if basis &gt; 10: # Ziffern und Buchstaben (immer groß und klein)&lt;br /&gt;            for z in range(10):&lt;br /&gt;                gueltig += chr(z + ord('0'))&lt;br /&gt;            for z in range(basis - 10):&lt;br /&gt;                gueltig += chr(z + ord('a')) # Kleinbuchstabe&lt;br /&gt;                gueltig += chr(z + ord('A')) # Großbuchstabe&lt;br /&gt;        else: # nur Ziffern&lt;br /&gt;            for z in range(basis):&lt;br /&gt;                gueltig += chr(z + ord('0'))&lt;br /&gt;        if len(string) &gt; 0:&lt;br /&gt;            if string[0] == '+' or string[0] == '-': # Vorzeichen&lt;br /&gt;                for c in string[1:]:&lt;br /&gt;                    if c not in gueltig:&lt;br /&gt;                        return False&lt;br /&gt;            else:&lt;br /&gt;                for c in string:&lt;br /&gt;                    if c not in gueltig:&lt;br /&gt;                        return False&lt;br /&gt;        else:&lt;br /&gt;            return False&lt;br /&gt;    else:&lt;br /&gt;        return False&lt;br /&gt;    return True # alles OK&lt;br /&gt;&lt;br /&gt;def test_isintb():&lt;br /&gt;    assert(isintb("", 2) == False)&lt;br /&gt;    assert(isintb("a", 2) == False)&lt;br /&gt;    assert(isintb("1a", 2) == False)&lt;br /&gt;    assert(isintb("a1", 2) == False)&lt;br /&gt;    assert(isintb("1+1", 2) == False)&lt;br /&gt;    assert(isintb("1+", 2) == False)&lt;br /&gt;    assert(isintb("1", 2) == True)&lt;br /&gt;    assert(isintb("+1", 2) == True)&lt;br /&gt;    assert(isintb("-1", 2) == True)&lt;br /&gt;    assert(isintb("11212", 2) == False)&lt;br /&gt;    assert(isintb("-11212", 2) == False)&lt;br /&gt;    assert(isintb("+11212", 2) == False)&lt;br /&gt;    assert(isintb("11212", 3) == True)&lt;br /&gt;    assert(isintb("-11212", 3) == True)&lt;br /&gt;    assert(isintb("+11212", 3) == True)&lt;br /&gt;    assert(isintb("aBCdeF", 16) == True)&lt;br /&gt;    assert(isintb("-aBCdeF", 16) == True)&lt;br /&gt;    assert(isintb("+aBCdeF", 16) == True)&lt;br /&gt;    print("test_isintb() ok")&lt;br /&gt;    &lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;&lt;br /&gt;def sumdigits(zahl):&lt;br /&gt;    """Berechnet die Ziffernsumme aus der gegebenen Zahl (int)"""&lt;br /&gt;    sum = 0&lt;br /&gt;    while zahl != 0:&lt;br /&gt;        sum += zahl % 10 # Rest ist immer Einerstelle&lt;br /&gt;        zahl = zahl // 10&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;def test_sumdigits():&lt;br /&gt;    assert(sumdigits(0) == 0)&lt;br /&gt;    assert(sumdigits(1) == 1)&lt;br /&gt;    assert(sumdigits(7) == 7)&lt;br /&gt;    assert(sumdigits(10) == 1)&lt;br /&gt;    assert(sumdigits(11) == 2)&lt;br /&gt;    assert(sumdigits(123) == 6)&lt;br /&gt;    assert(sumdigits(1010) == 2)&lt;br /&gt;    print("test_sumdigits() ok")&lt;br /&gt;    &lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def wert_der_ziffer(ziffer):&lt;br /&gt;    """liefert den Wert der Ziffer ziffer (0..9, bzw. A, B, C, ...)"""&lt;br /&gt;    if ord(ziffer) &lt;= ord("9"):&lt;br /&gt;        wert = ord(ziffer) - ord("0")&lt;br /&gt;    else:&lt;br /&gt;        wert = ord(ziffer) - ord("A") + 10&lt;br /&gt;    return wert&lt;br /&gt;&lt;br /&gt;def horner(zahl, basis):&lt;br /&gt;    """berechnet Dezimalzahl aus zahl (String) zur Basis basis.&lt;br /&gt;    liefert Zahl. Hornerschema!"""&lt;br /&gt;    dez = 0&lt;br /&gt;    for ziffer in zahl:&lt;br /&gt;        dez *= basis&lt;br /&gt;        dez += wert_der_ziffer(ziffer)&lt;br /&gt;    return dez&lt;br /&gt;&lt;br /&gt;def test_horner():&lt;br /&gt;    assert(horner("", 10) == 0)&lt;br /&gt;    assert(horner("1", 10) == 1)&lt;br /&gt;    assert(horner("12", 10) == 12)&lt;br /&gt;    assert(horner("123", 10) == 123)&lt;br /&gt;    assert(horner("1", 2) == 1)&lt;br /&gt;    assert(horner("10", 2) == 2)&lt;br /&gt;    assert(horner("11", 2) == 3)&lt;br /&gt;    assert(horner("4", 16) == 4)&lt;br /&gt;    assert(horner("A", 16) == 10)&lt;br /&gt;    assert(horner("10", 16) == 16)&lt;br /&gt;    print("test_horner() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def isipv4(string):&lt;br /&gt;    """Prüft, ob der gegebene String eine IPv4-Adresse enthält.&lt;br /&gt;    IPv4-Adressen sind 4 Zahlen zwischen 0 und 255, die durch einen&lt;br /&gt;    Punkt getrennt sind.&lt;br /&gt;    Beispiele: 127.0.0.1, 193.170.149.129, 81.200.64.185&lt;br /&gt;    Ungültige: 81.2010.64.185, 123.23.12, 127,0,0,1"""&lt;br /&gt;    zahl = ""&lt;br /&gt;    anzpunkte = 0&lt;br /&gt;    anzziffer = 0&lt;br /&gt;    for z in string:&lt;br /&gt;        if '0' &lt;= z &lt;= '9': &lt;br /&gt;            zahl += z&lt;br /&gt;            anzziffer += 1&lt;br /&gt;        elif z == '.' and anzziffer &gt; 0: # mindestens 1 Ziffer vor Zahl&lt;br /&gt;            if not (0 &lt;= horner(zahl, 10) &lt;= 255):&lt;br /&gt;                return False&lt;br /&gt;            zahl = "" # neu beginnen&lt;br /&gt;            anzziffer = 0&lt;br /&gt;            anzpunkte += 1&lt;br /&gt;        else:&lt;br /&gt;            return False&lt;br /&gt;    if anzpunkte == 3 and anzziffer &gt; 0: # nach 3. Punkt eine Zahl!&lt;br /&gt;        if not (0 &lt;= horner(zahl, 10) &lt;= 255):&lt;br /&gt;            return False&lt;br /&gt;        return True&lt;br /&gt;    else:&lt;br /&gt;        return False&lt;br /&gt;&lt;br /&gt;def test_isipv4():&lt;br /&gt;    assert(isipv4("127.0.0.1"))&lt;br /&gt;    assert(isipv4("193.170.149.129"))&lt;br /&gt;    assert(isipv4("81.200.64.185"))&lt;br /&gt;    assert(not isipv4(""))&lt;br /&gt;    assert(not isipv4("81.2010.64.185"))&lt;br /&gt;    assert(not isipv4("123.23.12"))&lt;br /&gt;    assert(not isipv4("123.23.12."))&lt;br /&gt;    assert(not isipv4("123.23.12.3.3"))&lt;br /&gt;    assert(not isipv4("123.23.12.3."))&lt;br /&gt;    assert(not isipv4("127,0,0,1"))&lt;br /&gt;    print("test_isipv4() ok")&lt;br /&gt;    &lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def anz_zahlen(string):&lt;br /&gt;    """ermittelt die Anzahl der ganzen Zahlen im String"""&lt;br /&gt;    anzahl = 0&lt;br /&gt;    in_zahl = False&lt;br /&gt;    for zeichen in string:&lt;br /&gt;        if zeichen in "0123456789":&lt;br /&gt;            if not in_zahl:&lt;br /&gt;                anzahl += 1&lt;br /&gt;                in_zahl = True&lt;br /&gt;        else:&lt;br /&gt;            in_zahl = False&lt;br /&gt;    return anzahl&lt;br /&gt;&lt;br /&gt;def test_anz_zahlen():&lt;br /&gt;    string = "das ist eine Zahl 123 und noch eine 1 und noch eine 3213x23123"&lt;br /&gt;    assert(4 == anz_zahlen(string))&lt;br /&gt;    assert(0 == anz_zahlen("keine"))&lt;br /&gt;    assert(1 == anz_zahlen("eine Zahl 123"))&lt;br /&gt;    assert(2 == anz_zahlen("zwei 23 und 324"))&lt;br /&gt;    assert(3 == anz_zahlen("drei 23 34 22"))&lt;br /&gt;    assert(4 == anz_zahlen("vier 234 234 234 45"))&lt;br /&gt;    assert(5 == anz_zahlen("5 234 234 234 45"))&lt;br /&gt;    print("test_anz_zahlen() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def sum_zahlen(string):&lt;br /&gt;    """ermittelt die Summe der ganzen Zahlen im String. Eine Zahl&lt;br /&gt;    ist eine ununterbrochene Folge von Ziffern.&lt;br /&gt;    Beispiel: sum_zahlen("x 34 3 12k33 44 hallo 23") liefert 149"""&lt;br /&gt;    summe = 0&lt;br /&gt;    zahl = ""&lt;br /&gt;    for zeichen in string:&lt;br /&gt;        if zeichen in "0123456789":&lt;br /&gt;            zahl += zeichen&lt;br /&gt;        else:&lt;br /&gt;            summe += horner(zahl, 10) # umrechnen und dazuzählen&lt;br /&gt;            zahl = "" # neu beginnen&lt;br /&gt;    if len(zahl) &gt; 0: # zuletzt war Zahl, daher dazurechnen&lt;br /&gt;        summe += horner(zahl, 10)&lt;br /&gt;    return summe&lt;br /&gt;&lt;br /&gt;def test_sum_zahlen():&lt;br /&gt;    string = "das ist eine Zahl 123 und noch eine 1 und noch eine 3213x23123"&lt;br /&gt;    assert(26460 == sum_zahlen(string))&lt;br /&gt;    assert(0 == sum_zahlen("keine"))&lt;br /&gt;    assert(123 == sum_zahlen("eine Zahl 123"))&lt;br /&gt;    assert(347 == sum_zahlen("zwei 23 und 324"))&lt;br /&gt;    assert(79 == sum_zahlen("drei 23 34 22"))&lt;br /&gt;    assert(747 == sum_zahlen("vier 234 234 234 45"))&lt;br /&gt;    assert(752 == sum_zahlen("5 234 234 234 45"))&lt;br /&gt;    print("test_sum_zahlen() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def iskonto(string):&lt;br /&gt;    """Prüft, ob der String eine gültige Kontonummer enthält. Dabei&lt;br /&gt;    gelten folgende Regeln:&lt;br /&gt;    1. genau 9 Ziffern (es dürfen Leerzeichen dazwischen sein&lt;br /&gt;    2. die letzte Ziffer ist eine Prüfziffer und es gilt&lt;br /&gt;       Die Kontonummer ist genau 9 Stellen lang und ist dann richtig, &lt;br /&gt;       wenn die folgendermaßen gebildete Summe auf Null endet:&lt;br /&gt;       Ziffern mit ungeradem Index werden addiert(=Teilsumme1);&lt;br /&gt;       Ziffern mit geradem Index werden verdoppelt und das jeweilige &lt;br /&gt;       Produkt addiert, wenn es einstellig ist, andernfalls wird die&lt;br /&gt;       Quersumme des Produkts addiert(=Teilsumme2);&lt;br /&gt;       Summe= teilsumme1 + Teilsumme2&lt;br /&gt;    Beispiel:&lt;br /&gt;       123456782 1+    3+    5+      7+     2  = 18 Teilsumme1&lt;br /&gt;                   2*2+  4*2+  (1+2)+  (1+6)   = 22 Teilsumme2&lt;br /&gt;                               6*2=12  8*2=16&lt;br /&gt;                                               ------&lt;br /&gt;                                                 40 Summe mod 10= Null&lt;br /&gt;    Beispiele für Kontonummern:&lt;br /&gt;       697199107 richtige Kontonummer&lt;br /&gt;       723016689 richtige Kontonummer&lt;br /&gt;       723016699 falsche Kontonummer&lt;br /&gt;    """&lt;br /&gt;    # entferne alle Leerzeichen (sind ja erlaubt)&lt;br /&gt;    kontonummer = ""&lt;br /&gt;    for c in string:&lt;br /&gt;        if '0' &lt;= c &lt;= '9':&lt;br /&gt;            kontonummer += c&lt;br /&gt;        elif c != ' ':&lt;br /&gt;            return False # nur Ziffern und Leerzeichen erlaubt!&lt;br /&gt;    if len(kontonummer) != 9:&lt;br /&gt;        return False&lt;br /&gt;    &lt;br /&gt;    summe = 0 # alles in einer Summe, aufteilen ist nicht nötig&lt;br /&gt;    for i in range(len(kontonummer)):&lt;br /&gt;        ziffer = ord(kontonummer[i]) - ord('0')&lt;br /&gt;        if (1 + i) % 2 == 1: # ungerade&lt;br /&gt;            summe += ziffer&lt;br /&gt;        else: # gerade&lt;br /&gt;            doppelt = ziffer * 2&lt;br /&gt;            if doppelt &gt;= 10: # Zwei Ziffern&lt;br /&gt;                summe += doppelt % 10 # Einer&lt;br /&gt;                summe += doppelt // 10 # Zehner&lt;br /&gt;            else: # immer noch eine Ziffer&lt;br /&gt;                summe += doppelt&lt;br /&gt;    return summe % 10 == 0 # Summe muss durch 10 teilbar sein&lt;br /&gt;&lt;br /&gt;def test_iskonto():&lt;br /&gt;    assert(not iskonto(""))&lt;br /&gt;    assert(not iskonto("a"))&lt;br /&gt;    assert(not iskonto("69719a9107"))&lt;br /&gt;    assert(not iskonto("69719917"))&lt;br /&gt;    assert(not iskonto("723016699"))&lt;br /&gt;    assert(iskonto("723016689"))&lt;br /&gt;    assert(iskonto("697199107"))&lt;br /&gt;    assert(iskonto("123456782"))&lt;br /&gt;    assert(iskonto("12 345 6782"))&lt;br /&gt;    print("test_iskonto() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def reverse_s(string):&lt;br /&gt;    """liefert String in umgekehrter Reihenfolge zurück"""&lt;br /&gt;    s = ""&lt;br /&gt;    for c in string:&lt;br /&gt;        s = c + s&lt;br /&gt;    return s&lt;br /&gt;&lt;br /&gt;def test_reverse_s():&lt;br /&gt;    assert("" == reverse_s(""))&lt;br /&gt;    assert("a" == reverse_s("a"))&lt;br /&gt;    assert("ba" == reverse_s("ab"))&lt;br /&gt;    assert("abc" == reverse_s("cba"))&lt;br /&gt;    print("test_reverse() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def toupper(string):&lt;br /&gt;    """liefert String in Großbuchstaben zurück"""&lt;br /&gt;    s = ""&lt;br /&gt;    for c in string:&lt;br /&gt;        if 'a' &lt;= c &lt;= 'z':&lt;br /&gt;            s += chr(ord(c) - ord('a') + ord('A'))&lt;br /&gt;        elif c == 'ä':&lt;br /&gt;            s += 'Ä'&lt;br /&gt;        elif c == 'ö':&lt;br /&gt;            s += 'Ö'&lt;br /&gt;        elif c == 'ü':&lt;br /&gt;            s += 'Ü'&lt;br /&gt;        else:&lt;br /&gt;            s += c&lt;br /&gt;    return s&lt;br /&gt;&lt;br /&gt;def test_toupper():&lt;br /&gt;    assert("" == toupper(""))&lt;br /&gt;    assert("A" == toupper("a"))&lt;br /&gt;    assert("AB" == toupper("ab"))&lt;br /&gt;    assert("ÄBC" == toupper("äbc"))&lt;br /&gt;    assert("A" == toupper("a"))&lt;br /&gt;    assert("AB" == toupper("Ab"))&lt;br /&gt;    assert("ÄBC" == toupper("äBc"))&lt;br /&gt;    print("test_toupper() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def tolower(string):&lt;br /&gt;    """liefert String in Kleinbuchstaben zurück"""&lt;br /&gt;    pass&lt;br /&gt;    s = ""&lt;br /&gt;    for c in string:&lt;br /&gt;        if 'A' &lt;= c &lt;= 'Z':&lt;br /&gt;            s += chr(ord(c) - ord('A') + ord('a'))&lt;br /&gt;        elif c == 'Ä':&lt;br /&gt;            s += 'ä'&lt;br /&gt;        elif c == 'Ö':&lt;br /&gt;            s += 'ö'&lt;br /&gt;        elif c == 'Ü':&lt;br /&gt;            s += 'ü'&lt;br /&gt;        else:&lt;br /&gt;            s += c&lt;br /&gt;    return s&lt;br /&gt;&lt;br /&gt;def test_tolower():&lt;br /&gt;    assert("" == tolower(""))&lt;br /&gt;    assert("a" == tolower("A"))&lt;br /&gt;    assert("ab" == tolower("AB"))&lt;br /&gt;    assert("äbc" == tolower("ÄBC"))&lt;br /&gt;    assert("a" == tolower("A"))&lt;br /&gt;    assert("ab" == tolower("Ab"))&lt;br /&gt;    assert("äbc" == tolower("äBc"))&lt;br /&gt;    print("test_tolower() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def isupper(string):&lt;br /&gt;    """prüft, ob String nur Großbuchstaben enthält"""&lt;br /&gt;    for c in string:&lt;br /&gt;        if 'a' &lt;= c &lt;= 'z' or c in "äöü": # ein Kleinbuchstabe&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def test_isupper():&lt;br /&gt;    assert(isupper(""))&lt;br /&gt;    assert(isupper("A"))&lt;br /&gt;    assert(isupper("AEÄÖ"))&lt;br /&gt;    assert(not isupper("a"))&lt;br /&gt;    assert(not isupper("abcö"))&lt;br /&gt;    assert(not isupper("AbC"))&lt;br /&gt;    print("test_isupper() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def islower(string):&lt;br /&gt;    """prüft, ob String nur Kleinbuchstaben enthält"""&lt;br /&gt;    for c in string:&lt;br /&gt;        if 'A' &lt;= c &lt;= 'Z' or c in "ÄÖÜ": # ein Großbuchstab&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def test_islower():&lt;br /&gt;    assert(islower(""))&lt;br /&gt;    assert(islower("a"))&lt;br /&gt;    assert(islower("aeöä"))&lt;br /&gt;    assert(not islower("A"))&lt;br /&gt;    assert(not islower("ABCÖ"))&lt;br /&gt;    assert(not islower("AbC"))&lt;br /&gt;    print("test_islower() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def ispalindrom(string):&lt;br /&gt;    """Prüft, ob der String ein Palindrom ist (von vorne und hinten&lt;br /&gt;    gelesen gleich)."""&lt;br /&gt;    for i in range(len(string)):&lt;br /&gt;        if string[i] != string[-1 - i]:&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def test_ispalindrom():&lt;br /&gt;    assert(ispalindrom(""))&lt;br /&gt;    assert(ispalindrom("a"))&lt;br /&gt;    assert(ispalindrom("aa"))&lt;br /&gt;    assert(ispalindrom("aba"))&lt;br /&gt;    assert(ispalindrom("abba"))&lt;br /&gt;    assert(not ispalindrom("ab"))&lt;br /&gt;    assert(not ispalindrom("abb"))&lt;br /&gt;    assert(not ispalindrom("abab"))&lt;br /&gt;    print("test_ispalindrom() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def ispalindrom_l(liste):&lt;br /&gt;    """Prüft, ob die Liste von vorne und hinten gelesen gleich ist."""&lt;br /&gt;    return ispalindrom(liste) # sollte äquivalent sein!&lt;br /&gt;&lt;br /&gt;def test_ispalindrom_l():&lt;br /&gt;    assert(ispalindrom_l([]))&lt;br /&gt;    assert(ispalindrom_l([1]))&lt;br /&gt;    assert(ispalindrom_l([1, 1]))&lt;br /&gt;    assert(ispalindrom_l([1, 2, 1]))&lt;br /&gt;    assert(ispalindrom_l([1, 2, 2, 1]))&lt;br /&gt;    assert(not ispalindrom_l([1, 2]))&lt;br /&gt;    assert(not ispalindrom_l([1, 2, 2]))&lt;br /&gt;    assert(not ispalindrom_l([1, 2, 1, 2]))&lt;br /&gt;    print("test_ispalindrom_l() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def reverse_l(liste):&lt;br /&gt;    """liefert die Liste in umgekehrter Reihenfolge zurück"""&lt;br /&gt;    l = []&lt;br /&gt;    for e in liste:&lt;br /&gt;        l = [e] + l&lt;br /&gt;    return l&lt;br /&gt;&lt;br /&gt;def test_reverse_l():&lt;br /&gt;    assert([] == reverse_l([]))&lt;br /&gt;    assert([1] == reverse_l([1]))&lt;br /&gt;    assert([1, 2] == reverse_l([2, 1]))&lt;br /&gt;    assert([1, 2, 3] == reverse_l([3, 2, 1]))&lt;br /&gt;    print("test_reverse_l() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def sum(liste):&lt;br /&gt;    """liefert die Summe aller Zahlen in der Liste"""&lt;br /&gt;    summe = 0&lt;br /&gt;    for e in liste:&lt;br /&gt;        summe += e&lt;br /&gt;    return summe&lt;br /&gt;&lt;br /&gt;def test_sum():&lt;br /&gt;    assert(0 == sum([]))&lt;br /&gt;    assert(12 == sum([12]))&lt;br /&gt;    assert(12 == sum([4, 8]))&lt;br /&gt;    assert(12 == sum([4, 4, 4]))&lt;br /&gt;    print("test_sum() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def mittelwert(liste):&lt;br /&gt;    """liefert den Mittelwert (Durchschnitt) aller Zahlen in der Liste"""&lt;br /&gt;    if len(liste) &gt; 0:&lt;br /&gt;        return sum(liste) / len(liste)&lt;br /&gt;    else:&lt;br /&gt;        return 0&lt;br /&gt;&lt;br /&gt;def test_mittelwert():&lt;br /&gt;    assert(0 == mittelwert([]))&lt;br /&gt;    assert(1 == mittelwert([1]))&lt;br /&gt;    assert(1.5 == mittelwert([1, 2]))&lt;br /&gt;    assert(2 == mittelwert([2, 2, 2]))&lt;br /&gt;    assert(2 == mittelwert([1, 2, 3]))    &lt;br /&gt;    print("test_mittelwert() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def rmdups(liste):&lt;br /&gt;    """(ReMove DUPlicates) liefert Liste, aus der alle Vielfachen entfernt&lt;br /&gt;    (hintereinander).&lt;br /&gt;    Beispiele: [1, 2, 2, 2, 5, 2, 3, 2, 2, 23] -&gt; [1, 2, 5, 2, 3, 2, 23]&lt;br /&gt;               [99, 99, 23, 99, 99, 12, 2] -&gt; [99, 23, 99, 12, 2]&lt;br /&gt;               [] -&gt; []&lt;br /&gt;               [1, 2, 4, 10] -&gt; [1, 2, 4, 10]"""&lt;br /&gt;    if len(liste) &gt; 0:&lt;br /&gt;        ret = [liste[0]]&lt;br /&gt;        for e in liste:&lt;br /&gt;            if ret[-1] != e: # letztes Element ungleich?&lt;br /&gt;                ret.append(e)&lt;br /&gt;        return ret&lt;br /&gt;    else:&lt;br /&gt;        return liste&lt;br /&gt;&lt;br /&gt;def test_rmdups():&lt;br /&gt;    assert([1, 2, 5, 2, 3, 2, 23] == rmdups([1, 2, 2, 2, 5, 2, 3, 2, 2, 23]))&lt;br /&gt;    assert([99, 23, 99, 12, 2] == rmdups([99, 99, 23, 99, 99, 12, 2]))&lt;br /&gt;    assert([] == rmdups([]))&lt;br /&gt;    assert([1, 2, 4, 10] == rmdups([1, 2, 4, 10]))&lt;br /&gt;    print("test_rmdups() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def isin(item, liste):&lt;br /&gt;    """ist item in liste enthalten?"""&lt;br /&gt;    for e in liste:&lt;br /&gt;        if item == e:&lt;br /&gt;            return True&lt;br /&gt;    return False&lt;br /&gt;&lt;br /&gt;def rmalldups(liste):&lt;br /&gt;    """(ReMove ALL DUPlicates) liefert Liste, aus der alle Vielfachen&lt;br /&gt;    entfernt (müssen nicht hintereinander stehen).&lt;br /&gt;    Beispiele: [1, 2, 2, 2, 5, 2, 3, 2, 2, 23] -&gt; [1, 2, 5, 3, 23]&lt;br /&gt;               [99, 99, 23, 99, 99, 12, 2] -&gt; [99, 23, 12, 2]&lt;br /&gt;               [] -&gt; []&lt;br /&gt;               [1, 2, 4, 10] -&gt; [1, 2, 4, 10]"""&lt;br /&gt;    if len(liste) &gt; 0:&lt;br /&gt;        ret = [liste[0]]&lt;br /&gt;        for e in liste:&lt;br /&gt;#            if e not in ret: # schon vorhanden?&lt;br /&gt;            if not isin(e, ret):&lt;br /&gt;                ret.append(e)&lt;br /&gt;        return ret&lt;br /&gt;    else:&lt;br /&gt;        return liste&lt;br /&gt;&lt;br /&gt;def test_rmalldups():&lt;br /&gt;    assert([] == rmalldups([]))&lt;br /&gt;    assert([1, 2, 5, 3, 23] == rmalldups([1, 2, 2, 2, 5, 2, 3, 2, 2, 23]))&lt;br /&gt;    assert([99, 23, 12, 2] == rmalldups([99, 99, 23, 99, 99, 12, 2]))&lt;br /&gt;    assert([1, 2, 4, 10] == rmalldups([1, 2, 4, 10]))&lt;br /&gt;    print("test_rmalldups() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def binsearch(liste, such):&lt;br /&gt;    """liefert den Index von such in der sortierten Liste liste oder -1,&lt;br /&gt;    wenn such in liste nicht vorkommt. Es ist die binäre Suche anzuwenden!&lt;br /&gt;    """&lt;br /&gt;    first = 0&lt;br /&gt;    last = len(liste) - 1&lt;br /&gt;    mid = (last - first) // 2 + first&lt;br /&gt;    #print(first, mid, last)&lt;br /&gt;    while len(liste) &gt; 0 and first &lt;= last:&lt;br /&gt;        if such &lt; liste[mid]:&lt;br /&gt;            last =  mid - 1&lt;br /&gt;        elif such &gt; liste[mid]:&lt;br /&gt;            first = mid + 1&lt;br /&gt;        else:&lt;br /&gt;            return mid #index found&lt;br /&gt;        mid = (last - first) // 2 + first&lt;br /&gt;        #print(first, mid, last)&lt;br /&gt;    return -1 # not found&lt;br /&gt;&lt;br /&gt;def test_binsearch():&lt;br /&gt;    """static tests"""&lt;br /&gt;    assert(binsearch([], 1) == -1)&lt;br /&gt;    assert(binsearch([1], 2) == -1)&lt;br /&gt;    assert(binsearch([1], 0) == -1)&lt;br /&gt;    assert(binsearch([1], 1) == 0)&lt;br /&gt;    assert(binsearch([1,3], 0) == -1)&lt;br /&gt;    assert(binsearch([1,3], 2) == -1)&lt;br /&gt;    assert(binsearch([1,3], 1) == 0)&lt;br /&gt;    assert(binsearch([1,3], 3) == 1)&lt;br /&gt;    assert(binsearch([1,3], 4) == -1)&lt;br /&gt;    assert(binsearch([1,3,5], 2) == -1)&lt;br /&gt;    assert(binsearch([1,3,5], 4) == -1)&lt;br /&gt;    assert(binsearch([1,3,5], 1) == 0)&lt;br /&gt;    assert(binsearch([1,3,5], 3) == 1)&lt;br /&gt;    assert(binsearch([1,3,5], 5) == 2)&lt;br /&gt;    assert(binsearch([1,3,5], 6) == -1)&lt;br /&gt;    assert(binsearch([1,3,5,7], 0) == -1)&lt;br /&gt;    assert(binsearch([1,3,5,7], 1) == 0)&lt;br /&gt;    assert(binsearch([1,3,5,7], 3) == 1)&lt;br /&gt;    assert(binsearch([1,3,5,7], 5) == 2)&lt;br /&gt;    assert(binsearch([1,3,5,7], 7) == 3)&lt;br /&gt;    assert(binsearch([1,3,5,7], 9) == -1)&lt;br /&gt;    assert(binsearch([1,3,5,7], 2) == -1)&lt;br /&gt;    assert(binsearch([1,3,5,7], 4) == -1)&lt;br /&gt;    assert(binsearch([1,3,5,7], 6) == -1)&lt;br /&gt;    import random&lt;br /&gt;    for i in range(25):&lt;br /&gt;        liste = [random.randint(0, 100) for i in range(100)]&lt;br /&gt;        liste.sort()&lt;br /&gt;        num = random.randint(0, 100)&lt;br /&gt;        if num in liste:&lt;br /&gt;            if binsearch(liste, num) &lt; 0:&lt;br /&gt;                print(liste)&lt;br /&gt;                print("%d should be found in list" % num)&lt;br /&gt;                assert(binsearch(liste, num) &gt;= 0)&lt;br /&gt;        else:&lt;br /&gt;            if binsearch(liste, num) &gt;= 0:&lt;br /&gt;                print(liste)&lt;br /&gt;                print("%d should not be found in list" % num)&lt;br /&gt;                assert(binsearch(liste, num) &lt; 0)&lt;br /&gt;    print("test_binsearch() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def sumteilbar(liste, teiler):&lt;br /&gt;    """Berechnet die Summe aller durch teiler teilbaren Zahlen der Liste"""&lt;br /&gt;    summe = 0&lt;br /&gt;    for e in liste:&lt;br /&gt;        if e % teiler == 0:&lt;br /&gt;            summe += e&lt;br /&gt;    return summe&lt;br /&gt;&lt;br /&gt;def test_sumteilbar():&lt;br /&gt;    assert(0 == sumteilbar([], 2))&lt;br /&gt;    assert(0 == sumteilbar([1], 2))&lt;br /&gt;    assert(0 == sumteilbar([1, 3], 2))&lt;br /&gt;    assert(0 == sumteilbar([1, 3, 23], 2))&lt;br /&gt;    assert(2 == sumteilbar([2], 2))&lt;br /&gt;    assert(2 == sumteilbar([1, 2], 2))&lt;br /&gt;    assert(2 == sumteilbar([1, 2, 23], 2))&lt;br /&gt;    assert(32 == sumteilbar([1, 8, 24], 2))&lt;br /&gt;    assert(27 == sumteilbar([3, 8, 24], 3))&lt;br /&gt;    print("test_sumteilbar() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def issorted(liste):&lt;br /&gt;    """Prüft, ob die Liste sortiert ist, d.h. ob e1 &lt;= e2 &lt;= e3 &lt;= ... &lt;= en&lt;br /&gt;    e1, e2, ... en sind die n Elemente der Liste mit Länge n"""&lt;br /&gt;    for i in range(len(liste) - 1):&lt;br /&gt;        if liste[i] &gt; liste[i + 1]:&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def test_issorted():&lt;br /&gt;    assert(issorted([]))&lt;br /&gt;    assert(issorted([1]))&lt;br /&gt;    assert(issorted([1, 1]))&lt;br /&gt;    assert(issorted([1, 3, 3, 4]))&lt;br /&gt;    assert(not issorted([1, 0]))&lt;br /&gt;    assert(not issorted([1, 2, 1]))&lt;br /&gt;    print("test_issorted() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def printlxl(liste1, liste2):&lt;br /&gt;    """gibt eine Multiplikationstabelle der beiden Listen aus.&lt;br /&gt;    Zum Beispiel:&lt;br /&gt;       a = [1, 2, 4, 5]&lt;br /&gt;       b = [3, 2, 2]&lt;br /&gt;       printlxl(a, b) gibt dann folgendes aus:&lt;br /&gt;         3   2   2 &lt;br /&gt;         6   4   4 &lt;br /&gt;        12   8   8 &lt;br /&gt;        15  10  10 &lt;br /&gt;    Die erste Liste bestimmt die Anzahl der Zeilen, die zweite die Anzahl &lt;br /&gt;    der Spalten. Es wird immer ein Element der ersten Liste mit einem der&lt;br /&gt;    zweiten Liste multipliziert.&lt;br /&gt;    """&lt;br /&gt;    erg = lxl(liste1, liste2)&lt;br /&gt;    for zeile in erg:&lt;br /&gt;        for spalte in zeile:&lt;br /&gt;            print("%4d" % spalte, end = "")&lt;br /&gt;        print()&lt;br /&gt;&lt;br /&gt;def test_printlxl():&lt;br /&gt;    a = [1, 2, 4, 5]&lt;br /&gt;    b = [3, 2, 2]&lt;br /&gt;    printlxl(a, b)&lt;br /&gt;    print("test_printlxl() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;def lxl(liste1, liste2):&lt;br /&gt;    """liefert eine Multiplikationstabelle der beiden Listen (Liste von &lt;br /&gt;    Listen).&lt;br /&gt;    Zum Beispiel:&lt;br /&gt;       a = [1, 2, 4, 5]&lt;br /&gt;       b = [3, 2, 2]&lt;br /&gt;       lxl(a, b) liefert folgende Liste zurück:&lt;br /&gt;       [[3, 2, 2], [6, 4, 4], [12, 8, 8], [15, 10, 10]]&lt;br /&gt;       übersichtlich formatiert:&lt;br /&gt;       [[3, 2, 2], &lt;br /&gt;        [6, 4, 4], &lt;br /&gt;        [12, 8, 8], &lt;br /&gt;        [15, 10, 10]]&lt;br /&gt;    Die erste Liste bestimmt die Anzahl der "Zeilen", die zweite die Anzahl &lt;br /&gt;    der "Spalten". Es wird immer ein Element der ersten Liste mit einem der&lt;br /&gt;    zweiten Liste multipliziert.&lt;br /&gt;    """&lt;br /&gt;    erg = []&lt;br /&gt;    if len(liste2) &gt; 0:&lt;br /&gt;        for a in liste1:&lt;br /&gt;            zeile = []&lt;br /&gt;            for b in liste2:&lt;br /&gt;                zeile.append(a * b)&lt;br /&gt;            erg.append(zeile)&lt;br /&gt;    return erg&lt;br /&gt;&lt;br /&gt;def test_1x1():&lt;br /&gt;    a = [1, 2, 4, 5]&lt;br /&gt;    b = [3, 2, 2]&lt;br /&gt;    assert([[3, 2, 2], [6, 4, 4], [12, 8, 8], [15, 10, 10]] == lxl(a, b))&lt;br /&gt;    assert([] == lxl([], []))&lt;br /&gt;    assert([] == lxl([], [1, 2]))&lt;br /&gt;    assert([] == lxl([1, 2], []))&lt;br /&gt;    print("test_1x1() ok")&lt;br /&gt;&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;# Testaufrufe:&lt;br /&gt;test_isint()&lt;br /&gt;test_isintb()&lt;br /&gt;test_sumdigits()&lt;br /&gt;test_horner()&lt;br /&gt;test_isipv4()&lt;br /&gt;test_anz_zahlen()&lt;br /&gt;test_sum_zahlen()&lt;br /&gt;test_iskonto()&lt;br /&gt;test_reverse_s()&lt;br /&gt;test_toupper()&lt;br /&gt;test_tolower()&lt;br /&gt;test_isupper()&lt;br /&gt;test_islower()&lt;br /&gt;test_ispalindrom()&lt;br /&gt;test_ispalindrom_l()&lt;br /&gt;test_reverse_l()&lt;br /&gt;test_sum()&lt;br /&gt;test_mittelwert()&lt;br /&gt;test_rmdups()&lt;br /&gt;test_rmalldups()&lt;br /&gt;test_binsearch()&lt;br /&gt;test_sumteilbar()&lt;br /&gt;test_issorted()&lt;br /&gt;test_printlxl()&lt;br /&gt;test_1x1()&lt;/pre&gt;&lt;br /&gt;Die Funktionen &lt;code class="prettyprint"&gt;isupper()&lt;/code&gt; und &lt;code class="prettyprint"&gt;islower()&lt;/code&gt; sind eigentlich nicht korrekt, denn liefert z.B. &lt;code class="prettyprint"&gt;isupper("A4C")&lt;/code&gt; &lt;code class="prettyprint"&gt;True&lt;/code&gt;. Man müsste also eher schreiben:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isupper(string):&lt;br /&gt;    """prüft, ob String nur Großbuchstaben enthält"""&lt;br /&gt;    for c in string:&lt;br /&gt;        if not ('A' &lt;= c &lt;= 'Z' or c in "ÄÖÜ"):&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2561054306449409915?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2561054306449409915/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/losungen-zu-ubungsbeispiele-zu.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2561054306449409915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2561054306449409915'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/losungen-zu-ubungsbeispiele-zu.html' title='Lösungen zu &quot;Übungsbeispiele zu Sequenzen, Schleifen und Funktionen in Python&quot; (POS1: 1B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-7150861829953396565</id><published>2011-03-06T21:34:00.001+01:00</published><updated>2011-03-07T12:59:15.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Übungsbeispiele zu Sequenzen, Schleifen und Funktionen in Python (POS1: 1B)</title><content type='html'>Hier finden Sie eine Reihe von Aufgabenstellungen als Übung zur nächsten praktischen Arbeit.&lt;br /&gt;Gegeben sind minimale Funktionsrümpfe mit der Aufgabenstellung als &lt;a href="http://en.wikipedia.org/wiki/Docstring"&gt;DocString&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Die Funktionen sind &lt;b&gt;ohne&lt;/b&gt; Standardmethoden bzw. Funktionen zu implementieren (ausgenommen die Funktion &lt;code class="prettyprint"&gt;len()&lt;/code&gt;). Sollte es eine Standardfunktion zur Lösung der Aufgabe geben, verwenden Sie diese, um das Ergebnis zu prüfen. Bereiche (&lt;code class="prettyprint"&gt;[von:bis]&lt;/code&gt;) dürfen verwendet werden, sofern sie benötigt werden.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isint(string)&lt;br /&gt;    """prüft, ob der String eine ganze Zahl ist (Vorzeichen optional, &lt;br /&gt;    nur Ziffern)"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isintb(string, basis)&lt;br /&gt;    """prüft, ob der String eine ganze Zahl zur Basis basis ist (Vorzeichen&lt;br /&gt;    optional, nur Ziffern)"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isnum(string)&lt;br /&gt;    """prüft, ob der String eine Zahl ist (Vorzeichen optional, Ziffern und&lt;br /&gt;    Komma)"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def horner(zahl, basis):&lt;br /&gt;    """berechnet Dezimalzahl aus zahl (String) zur Basis basis.&lt;br /&gt;    liefert Zahl."""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def sumdigits(zahl):&lt;br /&gt;    """Berechnet die Ziffernsumme aus der gegebenen Zahl (int)"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def sumdigits_s(string):&lt;br /&gt;    """Berechnet die Ziffernsumme aus der gegebenen Zahl (str), wenn&lt;br /&gt;    es überhaupt eine Zahl ist. Liefert -1, wenn keine gültige Zahl"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isipv4(string):&lt;br /&gt;    """Prüft, ob der gegebene String eine IPv4-Adresse enthält.&lt;br /&gt;    IPv4-Adressen sind 4 Zahlen zwischen 0 und 255, die durch einen&lt;br /&gt;    Punkt getrennt sind.&lt;br /&gt;    Beispiele: 127.0.0.1, 193.170.149.129, 81.200.64.185&lt;br /&gt;    Ungültige: 81.2010.64.185, 123.23.12, 127,0,0,1"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def anz_vokale(string):&lt;br /&gt;    """Zähle die Selbstlaute im String und liefere Anzahl zurück"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def anz_zahlen(string):&lt;br /&gt;    """ermittelt die Anzahl der ganzen Zahlen im String. Eine Zahl&lt;br /&gt;    ist eine ununterbrochene Folge von Ziffern.&lt;br /&gt;    Beispiel: anz_zahlen("x 34 3 12k33 44 hallo 23") liefert 6"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def sum_zahlen(string):&lt;br /&gt;    """ermittelt die Summe der ganzen Zahlen im String. Eine Zahl&lt;br /&gt;    ist eine ununterbrochene Folge von Ziffern.&lt;br /&gt;    Beispiel: anz_zahlen("x 34 3 12k33 44 hallo 23") liefert 149"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def iskonto(string):&lt;br /&gt;    """Prüft, ob der String eine gültige Kontonummer enthält. Dabei&lt;br /&gt;    gelten folgende Regeln:&lt;br /&gt;    1. genau 9 Ziffern (es dürfen Leerzeichen dazwischen sein&lt;br /&gt;    2. die letzte Ziffer ist eine Prüfziffer und es gilt&lt;br /&gt;       Die Kontonummer ist genau 9 Stellen lang und ist dann richtig, &lt;br /&gt;       wenn die folgendermaßen gebildete Summe auf Null endet:&lt;br /&gt;       Ziffern mit ungeradem Index werden addiert(=Teilsumme1);&lt;br /&gt;       Ziffern mit geradem Index werden verdoppelt und das jeweilige &lt;br /&gt;       Produkt addiert, wenn es einstellig ist, andernfalls wird die&lt;br /&gt;       Quersumme des Produkts addiert(=Teilsumme2);&lt;br /&gt;       Summe= teilsumme1 + Teilsumme2&lt;br /&gt;    Beispiel:&lt;br /&gt;       123456782 1+    3+    5+      7+     2  = 18 Teilsumme1&lt;br /&gt;                   2*2+  4*2+  (1+2)+  (1+6)   = 22 Teilsumme2&lt;br /&gt;                               6*2=12  8*2=16&lt;br /&gt;                                               ------&lt;br /&gt;                                                 40 Summe mod 10= Null&lt;br /&gt;    Beispiele für Kontonummern:&lt;br /&gt;       697199107 richtige Kontonummer&lt;br /&gt;       723016699 falsche Kontonummer&lt;br /&gt;    """&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def reverse_s(string):&lt;br /&gt;    """liefert String in umgekehrter Reihenfolge zurück"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def toupper(string):&lt;br /&gt;    """liefert String in Großbuchstaben zurück"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def tolower(string):&lt;br /&gt;    """liefert String in Kleinbuchstaben zurück"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def isupper(string):&lt;br /&gt;    """prüft, ob String nur Großbuchstaben enthält"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def islower(string):&lt;br /&gt;    """prüft, ob String nur Kleinbuchstaben enthält"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def ispalindrom(string):&lt;br /&gt;    """Prüft, ob der String ein Palindrom ist (von vorne und hinten&lt;br /&gt;    gelesen gleich)."""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def ispalindrom_l(liste):&lt;br /&gt;    """Prüft, ob die Liste von vorne und hinten gelesen gleich ist."""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def reverse_l(liste):&lt;br /&gt;    """liefert die Liste in umgekehrter Reihenfolge zurück"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def sum(liste):&lt;br /&gt;    """liefert die Summe aller Zahlen in der Liste"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def mittelwert(liste):&lt;br /&gt;    """liefert den Mittelwert (Durchschnitt) aller Zahlen in der Liste"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def rmdups(liste):&lt;br /&gt;    """(ReMove DUPlicates) liefert Liste, aus der alle Vielfachen entfernt&lt;br /&gt;    (hintereinander).&lt;br /&gt;    Beispiele: [1, 2, 2, 2, 5, 2, 3, 2, 2, 23] -&amp;gt; [1, 2, 5, 2, 3, 2, 23]&lt;br /&gt;               [99, 99, 23, 99, 99, 12, 2] -&amp;gt; [99, 23, 99, 12, 2]&lt;br /&gt;               [] -&amp;gt; []&lt;br /&gt;               [1, 2, 4, 10] -&amp;gt; [1, 2, 4, 10]"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def rmalldups(liste):&lt;br /&gt;    """(ReMove ALL DUPlicates) liefert Liste, aus der alle Vielfachen&lt;br /&gt;    entfernt (müssen nicht hintereinander stehen).&lt;br /&gt;    Beispiele: [1, 2, 2, 2, 5, 2, 3, 2, 2, 23] -&amp;gt; [1, 2, 5, 3, 23]&lt;br /&gt;               [99, 99, 23, 99, 99, 12, 2] -&amp;gt; [99, 23, 12, 2]&lt;br /&gt;               [] -&amp;gt; []&lt;br /&gt;               [1, 2, 4, 10] -&amp;gt; [1, 2, 4, 10]"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def binsearch(liste, such):&lt;br /&gt;    """liefert den Index von such in der sortierten Liste liste oder -1,&lt;br /&gt;    wenn such in liste nicht vorkommt. Es ist die binäre Suche anzuwenden!&lt;br /&gt;    """&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def sumdigits(zahl):&lt;br /&gt;    """Berechnet die Ziffernsumme aus der gegebenen Zahl (int)"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def sumteilbar(liste, teiler):&lt;br /&gt;    """Berechnet die Summe aller durch teiler teilbaren Zahlen der Liste"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def issorted(liste):&lt;br /&gt;    """Prüft, ob die Liste sortiert ist, d.h. ob e1 &amp;lt;= e2 &amp;lt;= e3 &amp;lt;= ... &amp;lt;= en&lt;br /&gt;    e1, e2, ... en sind die n Elemente der Liste mit Länge n"""&lt;br /&gt;    pass&lt;/pre&gt;&lt;pre class="prettyprint"&gt;def printlxl(liste1, liste2):&lt;br /&gt;    """gibt eine Multiplikationstabelle der beiden Listen aus.&lt;br /&gt;    Zum Beispiel:&lt;br /&gt;       a = [1, 2, 4, 5]&lt;br /&gt;       b = [3, 2, 2]&lt;br /&gt;       printlxl(a, b) gibt dann folgendes aus:&lt;br /&gt;         3   2   2 &lt;br /&gt;         6   4   4 &lt;br /&gt;        12   8   8 &lt;br /&gt;        15  10  10 &lt;br /&gt;    Die erste Liste bestimmt die Anzahl der Zeilen, die zweite die Anzahl &lt;br /&gt;    der Spalten. Es wird immer ein Element der ersten Liste mit einem der&lt;br /&gt;    zweiten Liste multipliziert.&lt;br /&gt;    """&lt;br /&gt;    pass&lt;/pre&gt;&lt;pre class="prettyprint"&gt;def lxl(liste1, liste2):&lt;br /&gt;    """liefert eine Multiplikationstabelle der beiden Listen (Liste von &lt;br /&gt;    Listen).&lt;br /&gt;    Zum Beispiel:&lt;br /&gt;       a = [1, 2, 4, 5]&lt;br /&gt;       b = [3, 2, 2]&lt;br /&gt;       lxl(a, b) liefert folgende Liste zurück:&lt;br /&gt;       [[3, 2, 2], [6, 4, 4], [12, 8, 8], [15, 10, 10]]&lt;br /&gt;       übersichtlich formatiert:&lt;br /&gt;       [[3, 2, 2], &lt;br /&gt;        [6, 4, 4], &lt;br /&gt;        [12, 8, 8], &lt;br /&gt;        [15, 10, 10]]&lt;br /&gt;    Die erste Liste bestimmt die Anzahl der "Zeilen", die zweite die Anzahl &lt;br /&gt;    der "Spalten". Es wird immer ein Element der ersten Liste mit einem der&lt;br /&gt;    zweiten Liste multipliziert.&lt;br /&gt;    """&lt;br /&gt;    pass&lt;/pre&gt;&lt;br /&gt;Schreiben Sie zu den Funktionen jeweils passende Testprogramme.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-7150861829953396565?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/7150861829953396565/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/ubungsbeispiele-zu-sequenzen-schleifen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7150861829953396565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7150861829953396565'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/ubungsbeispiele-zu-sequenzen-schleifen.html' title='Übungsbeispiele zu Sequenzen, Schleifen und Funktionen in Python (POS1: 1B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1286540784074613792</id><published>2011-03-04T14:14:00.000+01:00</published><updated>2011-03-04T14:14:32.185+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robotik'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>SAR (ROB: 2C)</title><content type='html'>&lt;a href="http://de.wikipedia.org/wiki/Search_and_Rescue"&gt;SAR&lt;/a&gt; steht normalerweise für "Search and Rescue" - hier soll es "Search and Remove" heißen.&lt;br /&gt;Ein Roboter soll in einem hellen rechteckigen Feld, das mit einer schwarzen Linie umgeben ist, einen Klotz finden und auf einer dunklen (schwarzen) Fläche in einem der Ecken abstellen. Das Feld sieht etwa so aus:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-P9GRQGI1DWE/TXDlBDIwxPI/AAAAAAAAEe0/TMdIsM_ao6I/s1600/SAR.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="https://lh5.googleusercontent.com/-P9GRQGI1DWE/TXDlBDIwxPI/AAAAAAAAEe0/TMdIsM_ao6I/s640/SAR.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Finden Sie eine geeignete Strategie, den Klotz aufzuspüren.&lt;br /&gt;Wie kann der Klotz transportiert werden?&lt;br /&gt;Wie findet man die markierte Ecke (Fläche) zum Ablegen?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1286540784074613792?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1286540784074613792/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/sar-rob-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1286540784074613792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1286540784074613792'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/sar-rob-2c.html' title='SAR (ROB: 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-P9GRQGI1DWE/TXDlBDIwxPI/AAAAAAAAEe0/TMdIsM_ao6I/s72-c/SAR.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3867523102614366138</id><published>2011-03-04T10:26:00.000+01:00</published><updated>2011-03-04T10:26:36.528+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Java Übungen und Aufgabe (POS1: 2A, 2C)</title><content type='html'>&lt;h3&gt;Klassen, Objekte&lt;/h3&gt;Erzeugen Sie eine Klasse &lt;code class="prettyprint"&gt;SomeMaths&lt;/code&gt;, welche eine statische Konstante &lt;code class="prettyprint"&gt;PI&lt;/code&gt; enthält sowie eine statische Methode &lt;code class="prettyprint"&gt;double getSquare(double x)&lt;/code&gt;, welche das Quadrat von &lt;code class="prettyprint"&gt;x&lt;/code&gt; liefert.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Erstellen Sie weiters eine Klasse &lt;code class="prettyprint"&gt;Circle&lt;/code&gt;, welche eine Kreis simuliert. &lt;code class="prettyprint"&gt;Circle&lt;/code&gt; hat ein Attribut &lt;code class="prettyprint"&gt;radius&lt;/code&gt; sowie die Methoden &lt;code class="prettyprint"&gt;getCircumference()&lt;/code&gt;, welche den Umfang liefert, und &lt;code class="prettyprint"&gt;getArea()&lt;/code&gt;, welche die Fläche berechnet. Die Methoden sollen sich der Konstante &lt;code class="prettyprint"&gt;PI&lt;/code&gt; und der Methode &lt;code class="prettyprint"&gt;getSquare()&lt;/code&gt; von &lt;code class="prettyprint"&gt;SomeMaths&lt;/code&gt; bedienen.&lt;br /&gt;Eine dritte Klasse &lt;code class="prettyprint"&gt;CircleExercise&lt;/code&gt; soll im &lt;code class="prettyprint"&gt;main()&lt;/code&gt; drei Kreise vom Typ &lt;code class="prettyprint"&gt;Circle&lt;/code&gt; erzeugen und jeweils den Radius, den Umfang und die Fläche ausgeben.&lt;br /&gt;Das UML-Diagramm sieht etwa so aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-jE2ms7TM4Y0/TXCbHgjFzUI/AAAAAAAAEek/CUQVjhL-68w/s1600/CircleExercise.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="https://lh4.googleusercontent.com/-jE2ms7TM4Y0/TXCbHgjFzUI/AAAAAAAAEek/CUQVjhL-68w/s640/CircleExercise.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Arrays&lt;/h3&gt;Erzeugen Sie eine Klasse &lt;code class="prettyprint"&gt;DreieckArray&lt;/code&gt;, welche ein privates zweidimensionales Array &lt;code class="prettyprint"&gt;feld&lt;/code&gt; für Integers enthält. Dieses Feld soll "dreieckig" sein und mit folgenden Werten initialisiert werden:&lt;br /&gt;&lt;pre&gt;1&lt;br /&gt;1 1&lt;br /&gt;1 2 1&lt;br /&gt;1 3 3 1&lt;br /&gt;1 4 6 4 1&lt;br /&gt;1 5 10 10 5 1&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/--KQjtaN8utY/TXCfnkGS1yI/AAAAAAAAEew/d8B5JmeBI4I/s1600/2-dim-Array+%25282%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="https://lh5.googleusercontent.com/--KQjtaN8utY/TXCfnkGS1yI/AAAAAAAAEew/d8B5JmeBI4I/s400/2-dim-Array+%25282%2529.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Die Methoden sind public und sollen folgendes tun:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;code class="prettyprint"&gt;void create(int zeilen, int spalten)&lt;/code&gt; soll ein neues Feld mit den gegebenen Zeilen und Spalten erzeugen (rechteckig).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;code class="prettyprint"&gt;int[][] getArray()&lt;/code&gt; soll das Feld zurückliefern.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;code class="prettyprint"&gt;int[] summen()&lt;/code&gt; soll ein eindimensionales Feld mit den Zeilensummen liefern.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;code class="prettyprint"&gt;boolean set(int zeile, int spalte, int wert)&lt;/code&gt; soll den Wert an der gegebenen Stelle im Feld feld setzen und bei erfolg true zurückliefern. Bei ungültigen Indizes soll false zurückgeliefert werden.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Schreiben Sie eine Klasse &lt;code class="prettyprint"&gt;TestDreieckArray&lt;/code&gt;, in der zwei Objekte von DreieckArray in der Methode &lt;code class="prettyprint"&gt;main()&lt;/code&gt; angelegt werden. Machen Sie zum Testen passende Aufrufe der Methoden (z.B. gültige und ungültige &lt;code class="prettyprint"&gt;set()&lt;/code&gt; usw.).&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Streams, Strings&lt;/h3&gt;Schreiben Sie eine Klasse &lt;code class="prettyprint"&gt;ReadFile&lt;/code&gt;, welche eine eine auf der Kommandozeile angegebene Datei öffnet und in einen String einliest. Verwenden Sie dazu drei Methoden&amp;nbsp;&lt;code class="prettyprint"&gt;String liesString(InputStream fileInputStream)&lt;/code&gt;, &lt;code class="prettyprint"&gt;String &amp;nbsp;liesStringBuffer(InputStream fileInputStream)&lt;/code&gt; und&amp;nbsp;&lt;code class="prettyprint"&gt;String liesStringBuilder(InputStream fileInputStream)&lt;/code&gt; und messen Sie die Zeiten, die mit den einzelnen Methoden benötigt werden um die Datei zu lesen.&lt;br /&gt;Von der Datei soll jeweils mit &lt;code class="prettyprint"&gt;read()&lt;/code&gt; ein Zeichen gelesen werden. Die Methode &lt;code class="prettyprint"&gt;liesString()&lt;/code&gt; hängt das gelesene Zeichen jeweils an einen String an, die Methode &lt;code class="prettyprint"&gt;liesStringBuffer()&lt;/code&gt; verwendet einen &lt;code class="prettyprint"&gt;StringBuffer&lt;/code&gt; und &lt;code class="prettyprint"&gt;liesStringBuilder()&lt;/code&gt; verwendet einen &lt;code class="prettyprint"&gt;StringBuilder&lt;/code&gt;. Das gelesene Zeichen wird dann immer mit &lt;code class="prettyprint"&gt;append()&lt;/code&gt; an den &lt;code class="prettyprint"&gt;StringBuffer&lt;/code&gt; bzw. &lt;code class="prettyprint"&gt;StringBuilder&lt;/code&gt; angehängt.&lt;br /&gt;Testen Sie mit unterschiedlich großen Dateien (kleine, mittlere, große, ganz große). Sie werden unterschiedliche Zeiten messen bei den verschiedenen Methoden. Erklären Sie die Unterschiede!&lt;br /&gt;Verwenden Sie &lt;code class="prettyprint"&gt;System.currentTimeMillis()&lt;/code&gt; (liefert &lt;code class="prettyprint"&gt;long&lt;/code&gt;), um die aktuelle Zeit in &lt;i&gt;ms&lt;/i&gt; zu erhalten.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Random, Calendar, Kommandozeile, Streams&lt;/h3&gt;Es sollen Testdaten der Form&lt;br /&gt;&lt;pre&gt;Datum Von-Zeit Bis-Zeit&lt;br /&gt;Datum Von-Zeit Bis-Zeit&lt;br /&gt;...&lt;/pre&gt;erzeugt werden. Wobei ein Datum die Form &lt;code&gt;JJJJ-MM-TT&lt;/code&gt; und Von-Zeit und Bis-Zeit die Form &lt;code&gt;HH:MM&lt;/code&gt; haben soll. Weiters sollen folgende Bedingungen erfüllt sein:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Verwenden Sie &lt;code class="prettyprint"&gt;java.util.Random&lt;/code&gt; um die Testdaten zu bekommen.&lt;/li&gt;&lt;li&gt;Bis-Zeit soll immer nach Von-Zeit kommen (also später)&lt;/li&gt;&lt;li&gt;Eine Zeile mit Datum, Von-Zeit und Bis-Zeit soll immer nach jenem Zeitbereich der vorhergehenden Zeile kommen (die Zeiten sind also sortiert).&lt;/li&gt;&lt;li&gt;Zwischen zwei Zeilen sollen nicht mehr als 36 Stunden liegen (Bis-Zeit bis Von-Zeit)&lt;/li&gt;&lt;/ul&gt;Beispiel:&lt;br /&gt;&lt;pre&gt;2011-03-04 10:24 10:45&lt;br /&gt;2011-03-04 11:33 12:56&lt;br /&gt;2011-03-05 12:33 17:23&lt;/pre&gt;&lt;br /&gt;Das Programm soll folgendermaßen aufgerufen werden:&lt;br /&gt;&lt;pre&gt;java CalenderTest [-h] [startdatum] [startzeit] [datei] anzahl&lt;br /&gt;   -h         ... Ausgabe dieser Hilfe und Ende&lt;br /&gt;   startdatum ... JJJJ-MM-TT (optional)&lt;br /&gt;   startzeit  ... HH:MM (optional)&lt;br /&gt;   datei      ... Name der Ausgabedatei (optional)&lt;br /&gt;   anzahl     ... Anzahl der zu erzeugenden Zeilen&lt;br /&gt;&lt;/pre&gt;Wird kein &lt;code&gt;startdatum&lt;/code&gt; angegeben, so ist der heutige Tag als Startwert zu verwenden.&lt;br /&gt;Wird kein &lt;code&gt;startzeit&lt;/code&gt; angegeben, so ist die aktuelle Uhrzeit als Startwert zu verwenden. Diese Startwerte sind in der ersten Ausgabezeile zu sehen.&lt;br /&gt;Wenn kein Dateiname &lt;code&gt;datei&lt;/code&gt; angegeben, so ist die Standardausgabe zu verwenden.&lt;br /&gt;Die Anzahl der zu erzeugenden Zeilen muss mindestens 1 sein!&lt;br /&gt;&lt;br /&gt;Fehlermeldungen sind auf &lt;code class="prettyprint"&gt;System.err&lt;/code&gt; auszugeben.&lt;br /&gt;&lt;br /&gt;Nennen Sie das Projekt &lt;code&gt;calendertest&lt;/code&gt; (&lt;code&gt;klasse-name-calendertest&lt;/code&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3867523102614366138?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3867523102614366138/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/java-ubungen-und-aufgabe-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3867523102614366138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3867523102614366138'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/java-ubungen-und-aufgabe-pos1-2a-2c.html' title='Java Übungen und Aufgabe (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-jE2ms7TM4Y0/TXCbHgjFzUI/AAAAAAAAEek/CUQVjhL-68w/s72-c/CircleExercise.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3867602131105803293</id><published>2011-03-02T14:43:00.000+01:00</published><updated>2011-03-02T14:43:15.244+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Prüfen Sie Ihr Wissen (POS1: 2A, 2C)</title><content type='html'>Sie finden an dieser Stelle eine Reihe von Fragen und Aufgaben, die Sie etwa Mitte des zweiten Jahrgangs Informatik beantworten bzw. lösen können sollten.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Theorie&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Was ist ein Dictionary in Python?&lt;/li&gt;&lt;li&gt;Was bedeutet der Begriff "Sequenz" in Python? Geben Sie einige Beispiele.&lt;/li&gt;&lt;li&gt;Wie wird eine Funktion in Python definiert?&lt;/li&gt;&lt;li&gt;Welche Arten der Parameterübergabe gibt es in Python?&lt;/li&gt;&lt;li&gt;Wie kann eine Python-Funktion mehr als einen Wert (Parameter) ändern bzw. zurückliefern?&lt;/li&gt;&lt;li&gt;Geben Sie ein Beispiel für eine kürzest mögliche Funktion in Python an!&lt;/li&gt;&lt;li&gt;Was ist eine Variable?&lt;/li&gt;&lt;li&gt;Was versteht man unter "Duck Typing"?&lt;/li&gt;&lt;li&gt;Wie werden in Python for-Schleifen gebildet?&lt;/li&gt;&lt;li&gt;Was ist ein Python-Modul? Wofür werden Module verwendet?&lt;/li&gt;&lt;li&gt;Wie kann eine (Text-)Datei gelesen werden?&lt;/li&gt;&lt;li&gt;Wie kann man in Python Kommandozeilenparameter auswerten?&lt;/li&gt;&lt;li&gt;Welche Grunddatentypen kennen Sie? Geben Sie auch den Speicherbedarf und den Wertebereich an.&lt;/li&gt;&lt;li&gt;Was versteht man unter den Eigenschaften eines Objekts? Wie spiegelt sich das in einer Klasse wieder?&lt;/li&gt;&lt;li&gt;Welche Kontrollstrukturen kennen Sie?&lt;/li&gt;&lt;li&gt;Was ist ein Array?&lt;/li&gt;&lt;li&gt;Geben Sie ein Beispiel eines eindimensionalen Arrays in Java an.&lt;/li&gt;&lt;li&gt;Wie kann man ein eindimensionales Array in Java initialisieren?&lt;/li&gt;&lt;li&gt;Geben Sie ein Beispiel eines zweidimensionalen Arrays in Java an.&lt;/li&gt;&lt;li&gt;Wie kann man ein zweidimensionales Array in Java initialisieren?&lt;/li&gt;&lt;li&gt;Kann man in Java ein zweidimensionales Array definieren, welches "nicht rechteckig" (rechteckig bedeutet hier: alle Zeilen gleich lang) ist?&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um alle Elemente eines eindimensionalen Arrays zu ermitteln, die ein bestimmtes Kriterium (z.B. ist größer als ein bestimmter Wert) erfüllen.&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um alle Elemente eines zweidimensionalen Arrays zu ermitteln, die ein bestimmtes Kriterium erfüllen.&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Maximum aller Werte eines eindimensionalen Arrays zu ermitteln.&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Minimum aller Werte eines eindimensionalen Arrays zu ermitteln.&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Maximum aller Werte eines zweidimensionalen Arrays zu ermitteln.&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Minimum aller Werte eines zweidimensionalen Arrays zu ermitteln.&lt;/li&gt;&lt;li&gt;Was ist eine Funktion? Geben Sie ein Beispiel in Java inklusive der Verwendung der Funktion.&lt;/li&gt;&lt;li&gt;Was ist eine Methode? Geben Sie ein Beispiel in Java inklusive der Verwendung der Funktion.&lt;/li&gt;&lt;li&gt;Was ist der Unterschied zwischen einer Variable eines Grunddatentyps und einer Variable vom Typ einer Klasse?&lt;/li&gt;&lt;li&gt;Was ist eine Klasse?&lt;/li&gt;&lt;li&gt;Was ist ein Objekt? Erklären Sie den Zusammenhang zwischen Objekt und Klasse.&lt;/li&gt;&lt;li&gt;Was sind Strings?&lt;/li&gt;&lt;li&gt;Wie kann man Strings vergleichen?&lt;/li&gt;&lt;li&gt;Wozu benötigt man Kommentare?&lt;/li&gt;&lt;li&gt;Wozu benötigt man Programmierrichtlinien?&lt;/li&gt;&lt;li&gt;Vergleichen Sie Java mit Python.&lt;/li&gt;&lt;li&gt;Woran soll Sie die Geschichte "Shlemiel the Painter" erinnern?&lt;/li&gt;&lt;li&gt;Was muss grundsätzlich (ohne Programmdetails) gemacht werden, um von einer Datei zu lesen?&lt;/li&gt;&lt;li&gt;Was muss grundsätzlich (ohne Programmdetails) gemacht werden, um in eine Datei zu schreiben?&lt;/li&gt;&lt;li&gt;Geben Sie einen Algorithmus (ohne Programmdetails) an, um alle Zeilen einer Textdatei zu ermitteln, die ein bestimmtes Kriterium (z.B. enthält einen bestimmten String) erfüllen.&lt;/li&gt;&lt;li&gt;Welche Arten von Programm(ier)fehlern kennen Sie? Wie findet man diese Fehler?&lt;/li&gt;&lt;li&gt;Wieviele&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pln" style="color: black;"&gt;main&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;()&lt;/span&gt;&lt;/code&gt;-Methoden muss eine Java-Klasse besitzen?&lt;/li&gt;&lt;li&gt;Wieviele&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pln" style="color: black;"&gt;main&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;()&lt;/span&gt;&lt;/code&gt;-Methoden kann eine Java-Klasse maximal haben?&lt;/li&gt;&lt;li&gt;Wieviele Klassen können in einer einzelnen Java-Datei implementiert werden?&lt;/li&gt;&lt;li&gt;Welchen Wert hat die Variable&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pln" style="color: black;"&gt;einInteger&lt;/span&gt;&lt;/code&gt;? Begründen Sie Ihre Antwort!&lt;pre class="prettyprint" style="border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; einInteger &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Integer&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;MAX_VALUE &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;+&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Was versteht man unter impliziter bzw. expliziter Typumwandlung? Nennen Sie jeweils mindestens ein Beispiel.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Praxis:&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;In&amp;nbsp;&lt;span style="font-weight: bold;"&gt;diesem Blog&lt;/span&gt;&amp;nbsp;und auch im&amp;nbsp;&lt;a href="http://edvowww.htlwrn.ac.at/programmierblog" style="color: #336699;"&gt;alten Blog&lt;/a&gt;&amp;nbsp;gibt es bereits eine Reihe von Aufgaben. Vergleichen Sie Ihre Lösungen mit jenen Ihrer MitschülerInnen.&lt;br /&gt;Hier noch ein paar "&lt;span style="font-style: italic;"&gt;Grundübungen&lt;/span&gt;":&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Erstellen Sie ein Pythonprogramm, welches das Maximum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten&amp;nbsp;&lt;code class="prettyprint lang-py" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pun" style="color: #666600;"&gt;[-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;23&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;32&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;89&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;100&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;99&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]&lt;/span&gt;&lt;/code&gt;. Finden Sie weitere Beispieltestdaten.&lt;/li&gt;&lt;li&gt;Erstellen Sie ein Pythonprogramm, welches das Minimum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten&amp;nbsp;&lt;code class="prettyprint lang-py" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pun" style="color: #666600;"&gt;[&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;23&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;32&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;89&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;100&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;99&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]&lt;/span&gt;&lt;/code&gt;. Finden Sie weitere Beispieltestdaten.&lt;/li&gt;&lt;li&gt;Erstellen Sie ein Javaprogramm, welches das Maximum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten&amp;nbsp;&lt;code class="prettyprint lang-py" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pun" style="color: #666600;"&gt;[-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;23&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;32&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;89&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;100&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;99&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]&lt;/span&gt;&lt;/code&gt;. Finden Sie weitere Beispieltestdaten.&lt;/li&gt;&lt;li&gt;Erstellen Sie ein Javaprogramm, welches das Minimum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten&amp;nbsp;&lt;code class="prettyprint lang-py" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pun" style="color: #666600;"&gt;[&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;23&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;32&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;89&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;100&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;99&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]&lt;/span&gt;&lt;/code&gt;. Finden Sie weitere Beispieltestdaten.&lt;/li&gt;&lt;li&gt;Erstellen Sie ein Pythonprogramm, welches die Häufigkeit von Elementen einer Sequenz (Liste) ermittelt. Definieren Sie dazu eine Testsequenz mit folgenden Werten&amp;nbsp;&lt;code class="prettyprint lang-py" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pun" style="color: #666600;"&gt;[&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;3&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;4&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;10&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;3&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;4&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;10&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]&lt;/span&gt;&lt;/code&gt;&amp;nbsp;bzw.&amp;nbsp;&lt;code class="prettyprint lang-py" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pun" style="color: #666600;"&gt;[&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"hallo"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"du"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"test"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"du"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"Maus"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"test"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"Test"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]&lt;/span&gt;&lt;/code&gt;. Das Ergebnis soll eine Liste von unterschiedlichen Werten sein und wie oft sie vorkommen.&lt;/li&gt;&lt;li&gt;Betrachten Sie die Methode&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="pln" style="color: black;"&gt;dividiere&lt;/span&gt;&lt;/code&gt;&amp;nbsp;im folgenden Programm. lässt sich das Programm übersetzen? Falls nicht, dann korrigieren Sie die Fehler:&lt;br /&gt;&lt;pre class="prettyprint" style="border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;class&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;DivisionApp&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;static&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;void&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; main&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;[]&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; args&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; ergebnis &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; dividiere&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;40&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;5&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;System&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;out&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;println&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"Ergebnis: "&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;+&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; ergebnis&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;static&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; dividiere&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; divident&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; divisor&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;if&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;divisor &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;0&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;return&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; divident &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;/&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; divisor&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Folgende Ausgabe soll erzeugt werden:&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;3&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;5&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;7&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;9&lt;/span&gt;&lt;/code&gt;. Lösen Sie die Aufgabe&lt;ul&gt;&lt;li&gt;mithilfe einer&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;while&lt;/span&gt;&lt;/code&gt;-Schleife&lt;/li&gt;&lt;li&gt;mithilfe einer&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;do&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;while&lt;/span&gt;&lt;/code&gt;-Schleife&lt;/li&gt;&lt;li&gt;mithilfe einer&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;for&lt;/span&gt;&lt;/code&gt;-Schleife und des Modulo-Operators&lt;/li&gt;&lt;li&gt;mithilfe einer&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;for&lt;/span&gt;&lt;/code&gt;-Schleife ohne den Modulo-Operator&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Folgende Ausgabe soll erzeugt werden:&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="lit" style="color: #006666;"&gt;1&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;2&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;4&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;7&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;11&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;16&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;22&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;29&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;37&lt;/span&gt;&lt;/code&gt;. Lösen Sie die Aufgabe&lt;ul&gt;&lt;li&gt;mithilfe einer&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;do&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;-&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;while&lt;/span&gt;&lt;/code&gt;-Schleife&lt;/li&gt;&lt;li&gt;mithilfe einer&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;for&lt;/span&gt;&lt;/code&gt;-Schleife&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Schreiben Sie ein Java-Programm, welches mithilfe eines Stacks folgende Werte in umgekehrter Reihenfolge ausgibt:&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="lit" style="color: #006666;"&gt;23&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;21&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;20&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;18&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;17&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;13&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;11&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;5&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Schreiben Sie ein Java-Programm, welches mithilfe einer Queue folgende Werte in derselben Reihenfolge ausgibt:&amp;nbsp;&lt;code class="prettyprint" style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;&lt;span class="lit" style="color: #006666;"&gt;23&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;21&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;20&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;18&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;17&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;13&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;11&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;5&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Schreiben Sie auf Basis der letzten beiden Beispiele Programme, die Strings statt der Integer-Werte verwenden können.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3867602131105803293?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3867602131105803293/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/prufen-sie-ihr-wissen-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3867602131105803293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3867602131105803293'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/prufen-sie-ihr-wissen-pos1-2a-2c.html' title='Prüfen Sie Ihr Wissen (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-4746894882734947280</id><published>2011-03-02T14:11:00.000+01:00</published><updated>2011-03-02T14:11:05.503+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Klammerprüfung mittels Stack (POS1: 2A, 2C)</title><content type='html'>Schreiben Sie ein Java-Programm, welches zeichenweise von der Standardeingabe liest und prüft, ob die eingegebenen Klammern eine gültige Klammerung mit&amp;nbsp;&lt;code&gt;([{}])&lt;/code&gt;&amp;nbsp;ergeben.&lt;br /&gt;Beispiele für korrekte Klammerung:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;()([])[[([])]]{}&lt;br /&gt;x{abc(sdf(c))asd}asx&lt;br /&gt;()&lt;br /&gt;[]&lt;br /&gt;((()))&lt;br /&gt;{{{(())}}}&lt;/pre&gt;&lt;br /&gt;Beispiele für falsche Klammerung:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(()&lt;br /&gt;[])&lt;br /&gt;(([)])&lt;/pre&gt;&lt;br /&gt;Das Programm soll nur ausgeben, ob die Klammerung korrekt ist. Das Programm soll alle Klammern bis&amp;nbsp;&lt;code&gt;EOF&lt;/code&gt;&amp;nbsp;prüfen (bei den Beispielen oben ist jeweils eine Zeile eine Eingabe!).&lt;br /&gt;Verwenden Sie für die Implementierung einen (selbstprogrammierten) Stack (eigene Klasse):&lt;br /&gt;&lt;pre&gt;void push(char elem);   // Element oben auf Stack&lt;br /&gt;char pop();             // oberstes Element&lt;br /&gt;boolean isEmpty();      // false wenn nicht leer&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;Erweiterung um Programmargumente und Dateien&lt;/h4&gt;&lt;br /&gt;Erweitern Sie das Programm so, dass eine Hilfe ausgegeben werden kann, mehrere Eingabedateien und optional eine Ausgabedatei angegeben werden kann. Eine Eingabedatei entspricht einem Klammerausdruck (der natürlich aus mehreren Zeilen bestehen kann). Wird keine Eingabedatei angegeben, so ist von&amp;nbsp;&lt;code&gt;stdin&lt;/code&gt;&amp;nbsp;zu lesen.&lt;br /&gt;&lt;br /&gt;Aufruf:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;java Klammer [-h|-o out] [eingabedateien...]&lt;br /&gt;  -h             ... Hilfe&lt;br /&gt;  -o out         ... Ausgabe in die Datei out&lt;br /&gt;  eingabedateien ... optional mehrere Eingabedateien&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;Detaillierte Fehlermeldungen&lt;/h4&gt;&lt;br /&gt;Erweitern Sie das Programm um die Ausgabe einer detaillierten Fehlermeldung. Welcher Fehler wurde gefunden? Wo wurde der Fehler gefunden (Zeile/Spalte)?&lt;br /&gt;&lt;strong&gt;mögliche Fehler&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;q&gt;falsche Klammer-Zu&lt;/q&gt;&lt;br /&gt;&lt;q&gt;zu viele Klammern-Zu&lt;/q&gt;&lt;br /&gt;&lt;q&gt;zu wenig Klammern-Zu&lt;/q&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-4746894882734947280?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/4746894882734947280/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/klammerprufung-mittels-stack-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4746894882734947280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/4746894882734947280'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/klammerprufung-mittels-stack-pos1-2a-2c.html' title='Klammerprüfung mittels Stack (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2831549687113316638</id><published>2011-03-01T20:06:00.002+01:00</published><updated>2011-03-03T15:55:10.561+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Binärdateien bearbeiten mit Java (PR: 5A, 5B)</title><content type='html'>Entwickeln Sie sie eine Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt;, die das Interface &lt;code class="prettyprint"&gt;DB&lt;/code&gt; implementiert. Die Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt; soll die Methoden&amp;nbsp;zum Bearbeiten (Lesen, Schreiben) binärer Dateien nach dem unten beschriebenen Datenformat bereitstellen.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;package data;&lt;br /&gt;/**&lt;br /&gt; * RuD-Übung 2011&lt;br /&gt; *&lt;br /&gt; * data.DB.java&lt;br /&gt; * @author (c) 2011, Harald R. Haberstroh&lt;br /&gt; * 1.3.2011&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import java.rmi.Remote;&lt;br /&gt;import java.rmi.RemoteException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author Harald R. Haberstroh (hh)&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public interface DB extends Remote {&lt;br /&gt;  /**&lt;br /&gt;   * Sperre den gegebenen Datensatz. Ist der Datensatz bereits gesperrt, dann&lt;br /&gt;   * wait().&lt;br /&gt;   * &lt;br /&gt;   * @param recNo&lt;br /&gt;   *          Nummer des zu sperrenden Datensatzes.&lt;br /&gt;   * @return Sperr-Identifikation.&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   * @throws RecordNotFoundException&lt;br /&gt;   *           ungültige Datensatznummer&lt;br /&gt;   */&lt;br /&gt;  public long lock(int recNo) throws RemoteException, RecordNotFoundException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Hebe Sperre wieder auf. notify().&lt;br /&gt;   * &lt;br /&gt;   * @param recNo&lt;br /&gt;   *          Nummer des gesperrten Datensatzes&lt;br /&gt;   * @param lockCookie&lt;br /&gt;   *          Sperr-Identfikation.&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   * @throws RecordNotFoundException&lt;br /&gt;   *           ungültige Datensatznummer&lt;br /&gt;   * @throws SecurityException&lt;br /&gt;   *           ungültiges lockCookie oder nicht gelockt&lt;br /&gt;   */&lt;br /&gt;  public void unlock(int recNo, long lockCookie) throws RemoteException,&lt;br /&gt;      RecordNotFoundException, SecurityException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * lege neuen Datensatz an.&lt;br /&gt;   * &lt;br /&gt;   * @param record&lt;br /&gt;   *          Neuer Datensatz&lt;br /&gt;   * @return Nummer des neuen Datensatzes&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public int create(Record record) throws RemoteException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * lösche Datensatz. Sperre wird aufgehoben, notify();&lt;br /&gt;   * &lt;br /&gt;   * @param recNo&lt;br /&gt;   *          Nummer des Datensatzes.&lt;br /&gt;   * @param lockCookie&lt;br /&gt;   *          Sperr-Identfikation.&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   * @throws RecordNotFoundException&lt;br /&gt;   *           ungültige Datensatznummer&lt;br /&gt;   * @throws SecurityException&lt;br /&gt;   *           ungültiges lockCookie oder nicht gelockt&lt;br /&gt;   */&lt;br /&gt;  public void delete(int recNo, long lockCookie) throws RemoteException,&lt;br /&gt;      RecordNotFoundException, SecurityException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * ändere Datensatz (überschreibe mit dem gegebenen Datensatz).&lt;br /&gt;   * &lt;br /&gt;   * @param record&lt;br /&gt;   *          neuer Datensatz&lt;br /&gt;   * @param recNo&lt;br /&gt;   *          Nummer des gesperrten Datensatzes&lt;br /&gt;   * @param lockCookie&lt;br /&gt;   *          Sperr-Identfikation.&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   * @throws RecordNotFoundException&lt;br /&gt;   *           ungültige Datensatznummer&lt;br /&gt;   * @throws SecurityException&lt;br /&gt;   *           ungültiges lockCookie oder nicht gelockt&lt;br /&gt;   */&lt;br /&gt;  public void update(Record record, int recNo, long lockCookie)&lt;br /&gt;      throws RemoteException, RecordNotFoundException, SecurityException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * suche Datensätze.&lt;br /&gt;   * &lt;br /&gt;   * @param criteria&lt;br /&gt;   *          String-Array mit Kriterien, null matcht alles, sonst&lt;br /&gt;   *          Stringrepräsentation des Suchkriteriums (entspricht den Daten in&lt;br /&gt;   *          Record).&lt;br /&gt;   * @return Array von Recordnummern&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   */&lt;br /&gt;  public int[] find(String[] criteria) throws RemoteException;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * lese Datensatz.&lt;br /&gt;   * &lt;br /&gt;   * @param recNo&lt;br /&gt;   *          Nummer des zu lesenden Datensatzes.&lt;br /&gt;   * @return Record&lt;br /&gt;   * @throws RemoteException&lt;br /&gt;   * @throws RecordNotFoundException&lt;br /&gt;   *           Datensatz existiert nicht.&lt;br /&gt;   */&lt;br /&gt;  public Record read(int recNo) throws RemoteException, RecordNotFoundException;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Die Klasse Data muss zusätzlich einen Konstruktor &lt;code class="prettyprint"&gt;Data(String dateiname)&lt;/code&gt; bereitstellen, der die Datei dateiname (z.B. &lt;code class="prettyprint"&gt;"machines.db"&lt;/code&gt;) öffnet und zur Bearbeitung mit den im Interface &lt;code class="prettyprint"&gt;DB&lt;/code&gt; definierten Methoden bereitstellt. Der Konstruktor muss die nötigen Exceptions werfen, wenn die Datei nicht geöffnet werden kann.&lt;br /&gt;Der Parameter &lt;code class="prettyprint"&gt;String[] criteria&lt;/code&gt; der Methode &lt;code class="prettyprint"&gt;find()&lt;/code&gt; enthält das Suchkriterium, wobei jedem Feld ein String zugeordnet ist. Soll also nur nach einem Namen (siehe unten) gesucht werden, so muss &lt;code class="prettyprint"&gt;criteria[1]&lt;/code&gt; den gesuchten Namen (bzw. einen Teil davon) enthalten. Alle anderen Elemente des Arrays müssen dann &lt;code class="prettyprint"&gt;null&lt;/code&gt; sein. Soll nach mehreren Kriterien selektiert werden, so sind die entsprechenden Felder mit Werten zu belegen.&lt;br /&gt;&lt;code class="prettyprint"&gt;find()&lt;/code&gt; liefert dann ein Array mit den Indizes der passenden Datensätze.&lt;br /&gt;Die Datensatznummer &lt;code class="prettyprint"&gt;recNo&lt;/code&gt; ist immer der Index innerhalb der Datei!&lt;br /&gt;Gelöschte Datensätze werden einfach als gelöscht markiert (s.u.) und müssen beim Anlegen neuer Datensätze zuerst verwendet werden (erst wenn kein gelöschter Datensatz existiert, wird die Datei vergrößert).&lt;br /&gt;&lt;code class="prettyprint"&gt;RecordNotFoundException&lt;/code&gt; wird immer dann geworfen, wenn &lt;code class="prettyprint"&gt;recNo&lt;/code&gt; auf einen gelöschten Datensatz weist oder, wenn der Datensatz gar nicht existiert. Lösen Sie das Problem, dass nur mit der einfachen  &lt;code class="prettyprint"&gt;RecordNotFoundException&lt;/code&gt; das Dateiende nicht ermittelt werden kann, in geeigneter Weise.&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;Record&lt;/code&gt; muss in geeigneter Weise implementiert werden.&lt;br /&gt;&lt;br /&gt;Datensätze sollen gesperrt werden können (die Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt; kann von mehreren parallelen Threads verwendet werden). Dazu soll die Methode &lt;code class="prettyprint"&gt;lock()&lt;/code&gt; eine (beliebige) dem Datensatz zuordenbare Zahl (Lockcookie bzw. Sperr-Identifikation) liefern und den Satz sperren. Die Methoden, die eine Sperre benötigen müssen dann anhand dieses Lockcookies überprüfen, ob der Datensatz gesperrt ist und die entsprechende Operation ausführen. Ist der Datensatz nicht gesperrt oder das Lockcookie ungültig, so ist eine &lt;code class="prettyprint"&gt;SecurityException&lt;/code&gt; zu werfen. Die Methode &lt;code class="prettyprint"&gt;unlock()&lt;/code&gt; hebt die Sperre wieder auf. Nach einem  &lt;code class="prettyprint"&gt;delete()&lt;/code&gt; braucht man (kann man) kein &lt;code class="prettyprint"&gt;unlock()&lt;/code&gt; machen.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Datenformat&lt;/h3&gt;&lt;br /&gt;Die Strings sind kodiert mit dem Encoding &lt;b&gt;ISO-8859-1&lt;/b&gt;, d.h. jedes Zeichen ist einem Byte kodiert und es sind nur ASCII-Zeichen sowie die westeuropäischen Erweiterungen erlaubt. Es gibt Strings fixer Länge (werden mit Leerzeichen aufgefüllt) und Strings variabler Länge (werden wie C-Strings mit &lt;code&gt;'\0'&lt;/code&gt; abgeschlossen) mit einer Obergrenze.&lt;br /&gt;Die Datei mit den (Test-)Daten hat folgendes Format:&lt;br /&gt;Die Datei beginnt mit einem &lt;b&gt;Header&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;4 Bytes Magic Cookie, Wert 4242&lt;br /&gt;4 Offset in Bytes zu den eigentlichen Daten&lt;br /&gt;2 Bytes Anzahl Felder pro Datensatz&lt;br /&gt;Pro Feld gibt es folgenden Eintrag:&lt;br /&gt;2 Bytes Länge Feldname&lt;br /&gt;n Bytes Feldname&lt;br /&gt;2 Bytes Länge Feldbeschreibung&lt;br /&gt;n Bytes Feldbeschreibung für die Tabellenansicht&lt;br /&gt;1 Byte  Datentyp: 'F' ... fix, 'V' ... variabel, 'C' ... ein Zeichen&lt;br /&gt;2 Bytes Feldlänge&lt;br /&gt;Nach den Feldbeschreibungen, d.h. ab dem Offset, finden sich die eigentlichen Datensätze gemäß der Beschreibungen im Header:&lt;br /&gt;2 Bytes Flag Gelöscht (== 0 ... gelöscht, != 0 ... aktiv)&lt;br /&gt;n Bytes Daten gemäß der Datensatzbeschreibung&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Testdatei machines.db&lt;/h3&gt;&lt;br /&gt;Diese Datei enthält nur die Geräte (und deren grafische Koordinaten):&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col width="28*"&gt;&lt;/col&gt;  &lt;col width="55*"&gt;&lt;/col&gt;  &lt;col width="32*"&gt;&lt;/col&gt;  &lt;col width="58*"&gt;&lt;/col&gt;  &lt;col width="83*"&gt;&lt;/col&gt;  &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr valign="TOP"&gt;   &lt;td width="11%"&gt;&lt;b&gt;Feldname&lt;/b&gt;&lt;/td&gt;   &lt;td width="21%"&gt;&lt;b&gt;Feldbeschreibung&lt;/b&gt;&lt;/td&gt;   &lt;td width="13%"&gt;&lt;b&gt;(maximale) Länge&lt;/b&gt;&lt;/td&gt;   &lt;td width="23%"&gt;&lt;b&gt;Typ&lt;/b&gt;&lt;/td&gt;   &lt;td width="32%"&gt;&lt;b&gt;Bemerkung&lt;/b&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr valign="TOP"&gt;   &lt;td width="11%"&gt;id&lt;/td&gt;   &lt;td width="21%"&gt;Geräte-Id&lt;/td&gt;   &lt;td width="13%"&gt;10&lt;/td&gt;   &lt;td width="23%"&gt;String &lt;code&gt;'\0' &lt;/code&gt;terminiert&lt;/td&gt;   &lt;td width="32%"&gt;z.B. &lt;code&gt;"z23"&lt;/code&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr valign="TOP"&gt;   &lt;td width="11%"&gt;name&lt;/td&gt;   &lt;td width="21%"&gt;Gerätename&lt;/td&gt;   &lt;td sdnum="3079;" sdval="100" width="13%"&gt;100&lt;/td&gt;   &lt;td width="23%"&gt;String &lt;code&gt;'\0' &lt;/code&gt;terminiert&lt;/td&gt;   &lt;td width="32%"&gt;Gerätebeschreibung, z.B. &lt;code&gt;"Laderoboter Halle B"&lt;/code&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr valign="TOP"&gt;   &lt;td width="11%"&gt;x&lt;/td&gt;   &lt;td width="21%"&gt;x&lt;/td&gt;   &lt;td width="13%"&gt;5&lt;/td&gt;   &lt;td width="23%"&gt;String fixe Länge&lt;/td&gt;   &lt;td width="32%"&gt;z.B. &lt;code&gt;"   50"&lt;/code&gt; (vorne mit Leerzeichen    aufgefüllt)&lt;/td&gt;  &lt;/tr&gt;&lt;tr valign="TOP"&gt;   &lt;td width="11%"&gt;y&lt;/td&gt;   &lt;td width="21%"&gt;y&lt;/td&gt;   &lt;td width="13%"&gt;5&lt;/td&gt;   &lt;td width="23%"&gt;String fixe Länge&lt;/td&gt;   &lt;td width="32%"&gt;z.B. &lt;code&gt;"  200"&lt;/code&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Testen der Klasse Data&lt;/h3&gt;&lt;br /&gt;Schreiben Sie passende Tests um die Klasse &lt;code class="prettyprint"&gt;Data&lt;/code&gt; zu testen. Der erste Test soll einfach die Datei &lt;code&gt;machines.db&lt;/code&gt; in lesbarer Form auf der Konsole ausgeben.&lt;br /&gt;Die weiteren Tests sollen natürlich die gesamte Funktionalität und das Locking testen.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Downloads&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interface &lt;a href="https://docs.google.com/uc?id=0B9Zs9kdcx6ifNjM0MzAzYTctYTM4Ni00ZWI1LTlmMzAtNGE2ZGRlMzQ1MzU2&amp;amp;export=download&amp;amp;authkey=CMj_q50E&amp;amp;hl=de"&gt;DB.java&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Testdatei &lt;a href="https://docs.google.com/uc?id=0B9Zs9kdcx6ifMDJlMWM4OTgtZTU1NS00MDRmLThjYWEtNzE3ZTJhOTU4OGJm&amp;amp;export=download&amp;amp;authkey=CLKW_YYC&amp;amp;hl=de"&gt;machines.db&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Abgabe&lt;/h3&gt;&lt;br /&gt;Nennen Sie das Projekt &lt;code&gt;klasse-&lt;i&gt;name&lt;/i&gt;-data&lt;/code&gt; also z.B. &lt;code&gt;5ad-meier-data&lt;/code&gt; und checken Sie es am CVS ein. Termin wird noch bekanntgegeben.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Wie geht's weiter&lt;/h3&gt;&lt;br /&gt;Die Datenklasse soll dann später in einem Client-/Server-System zum Einsatz kommen, wo mehrere grafische Clients eine Binärdatei bearbeiten sollen. Die Angabe dazu folgt...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2831549687113316638?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2831549687113316638/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/03/binardateien-bearbeiten-mit-java-pr-5a.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2831549687113316638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2831549687113316638'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/03/binardateien-bearbeiten-mit-java-pr-5a.html' title='Binärdateien bearbeiten mit Java (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5109758556174819190</id><published>2011-02-23T11:43:00.000+01:00</published><updated>2011-02-23T11:43:24.417+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><title type='text'>Schwerpunkt Programmieren (PR: 5A, 5B)</title><content type='html'>Der letztmögliche Abgabetermin für die Ausarbeitung ist der 8. April 2011, damit noch genügend Zeit bleibt, die Ausarbeitung zu besprechen.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/JavaFX"&gt;JavaFX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/"&gt;eclipse&lt;/a&gt; plugins schreiben&lt;/li&gt;&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/Funktionale_Programmierung"&gt;Funktionale Programmierung&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/Logische_Programmierung"&gt;Logikbasierte Programmierung&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/Objective-C"&gt;Objective C&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Algorithmen für &lt;a href="http://de.wikipedia.org/wiki/Textsuche"&gt;Textsuche&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/Closure"&gt;Closures&lt;/a&gt; - Definition, Verwendung, Beispiele (Programmiersprachen)&lt;/li&gt;&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/Garbage_Collection"&gt;Garbage Collector&lt;/a&gt; - Algorithmen und Implementierung&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Zu allen Themen gibt es Informationen im Internet. Die Links zur Wikipedia sind nur allererste Einstiege, da dort selbst oft die Qualität in Frage gestellt wird.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Ein wichtiger Aspekt beim Schwerpunktthema ist natürlich die eigene Recherche und das Erarbeiten in ein völlig neues Gebiet.&lt;/div&gt;&lt;div&gt;Ausarbeitung in etwa 10 bis 20 Seiten plus Sourcecode mit Beispielen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Weitere Literatur:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Steve Holzner: &lt;a href="http://books.google.at/books?id=cGYMActRiakC&amp;amp;printsec=frontcover&amp;amp;dq=Eclipse+Cookbook&amp;amp;hl=de&amp;amp;ei=3OFkTYb5LYKq8APtjMW9Bw&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=book-thumbnail&amp;amp;resnum=1&amp;amp;ved=0CDUQ6wEwAA#v=onepage&amp;amp;q&amp;amp;f=false"&gt;Eclipse Cookbook&lt;/a&gt; (O'Reilly)&lt;/li&gt;&lt;li&gt;Rechenberg, Pomberger (Hrsg.): &lt;a href="http://books.google.at/books?id=N4V2q941AD8C&amp;amp;printsec=frontcover&amp;amp;dq=Informatik+Handbuch&amp;amp;hl=de&amp;amp;ei=h-FkTbKCB4S38QPC-5DfBg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=book-thumbnail&amp;amp;resnum=1&amp;amp;ved=0CDgQ6wEwAA#v=onepage&amp;amp;q&amp;amp;f=false"&gt;Informatik Handbuch&lt;/a&gt; (Hanser)&lt;/li&gt;&lt;li&gt;Hans Werner Lang: &lt;a href="http://books.google.at/books?id=OW7LwewTKVQC&amp;amp;printsec=frontcover&amp;amp;dq=Hans+Werner+Lang:+Algorithmen+in+Java&amp;amp;hl=de&amp;amp;ei=UuFkTY-EOMG74gawoqCuBg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1&amp;amp;ved=0CDgQ6AEwAA#v=onepage&amp;amp;q&amp;amp;f=false"&gt;Algorithmen in Java&lt;/a&gt; (Oldenbourg)&lt;/li&gt;&lt;li&gt;Robert Sedgewick: &lt;a href="http://books.google.at/books?id=hX7BBXnFtxoC&amp;amp;printsec=frontcover&amp;amp;dq=Robert+Sedgewick:+Algorithmen+in+C&amp;amp;hl=de&amp;amp;ei=JuFkTaGaCoWj8QPah_HDBg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1&amp;amp;ved=0CCwQ6AEwAA#v=onepage&amp;amp;q&amp;amp;f=false"&gt;Algorithmen in C&lt;/a&gt; (Addison-Wesley)&lt;/li&gt;&lt;li&gt;Alfred V. Aho, Jeffrey D. Ullman: &lt;a href="http://books.google.at/books?id=-uVHAAAACAAJ&amp;amp;dq=inauthor:%22Alfred+V.+Aho%22&amp;amp;hl=de&amp;amp;ei=-eBkTY_5F4eq8QOY-5ytBg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=3&amp;amp;ved=0CDoQ6AEwAg"&gt;Informatik - Datenstrukturen und Konzepte der Abstraktion&lt;/a&gt; (Thomson Publishing)&lt;/li&gt;&lt;li&gt;Christian Wagenknecht: &lt;a href="http://books.google.at/books?id=7yMDhSa6g2UC&amp;amp;printsec=frontcover&amp;amp;dq=programmierparadigmen&amp;amp;hl=de&amp;amp;ei=HNFkTcuRFMmJ4gbR8O2qBg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1&amp;amp;ved=0CCkQ6AEwAA#v=onepage&amp;amp;q&amp;amp;f=false"&gt;Programmierparadigmen (Teubner)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Links:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hilfe zu Eclipse:&amp;nbsp;&lt;a href="http://help.eclipse.org/helios/index.jsp"&gt;http://help.eclipse.org/helios/index.jsp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;JavaFX:&amp;nbsp;&lt;a href="http://www.javafx.com/"&gt;http://www.javafx.com/&lt;/a&gt;,&amp;nbsp;&lt;a href="http://download.oracle.com/javafx/tutorials.html"&gt;http://download.oracle.com/javafx/tutorials.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Weitere Informationen, sobald ich welche habe, gibt es dann hier.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5109758556174819190?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5109758556174819190/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/02/schwerpunkt-programmieren-pr-5a-5b.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5109758556174819190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5109758556174819190'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/02/schwerpunkt-programmieren-pr-5a-5b.html' title='Schwerpunkt Programmieren (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-7547666415729991484</id><published>2011-01-27T16:07:00.000+01:00</published><updated>2011-01-27T16:07:32.451+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python -&gt; Java (POS1: 2A, 2C)</title><content type='html'>Schreiben Sie folgendes Pythonprogramm in Java um (ergänzen Sie den fehlenden Header):&lt;br /&gt;&lt;pre class="prettyprint"&gt;from sys import argv, stderr, stdin, stdout&lt;br /&gt;&lt;br /&gt;def count(inStream):&lt;br /&gt;  anz = 0&lt;br /&gt;  imWort = False&lt;br /&gt;  zeichen = inStream.read(1)&lt;br /&gt;  eof = zeichen == ""&lt;br /&gt;  while not eof:&lt;br /&gt;    if imWort:&lt;br /&gt;      if " \n\t".find(zeichen) &amp;gt;= 0:&lt;br /&gt;        imWort = False&lt;br /&gt;    else:&lt;br /&gt;      if " \n\t".find(zeichen) == -1:&lt;br /&gt;        imWort = True&lt;br /&gt;        anz = anz + 1      &lt;br /&gt;    zeichen = inStream.read(1)&lt;br /&gt;    eof = zeichen == ""&lt;br /&gt;  return anz&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;  outStream = stdout&lt;br /&gt;  if len(argv) == 1:&lt;br /&gt;    inStream = stdin&lt;br /&gt;  elif len(argv) &amp;gt;= 2:&lt;br /&gt;    inStream = open(argv[1], "r")&lt;br /&gt;  if len(argv) == 3:&lt;br /&gt;    outStream = open(argv[2], "w")&lt;br /&gt;  anz = count(inStream)&lt;br /&gt;  ausgabe = "Anzahl = %d\n" % anz&lt;br /&gt;  outStream.write(ausgabe)&lt;br /&gt;&lt;/pre&gt;Was macht das Programm?&lt;br /&gt;Was kann man über die Einhaltung Programmierrichtlinien bei diesem Programm sagen (abgesehen vom fehlenden Header)?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-7547666415729991484?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/7547666415729991484/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/python-java-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7547666415729991484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7547666415729991484'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/python-java-pos1-2a-2c.html' title='Python -&gt; Java (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2711246118594945890</id><published>2011-01-27T15:37:00.001+01:00</published><updated>2011-01-27T15:39:02.531+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Zählen von Zeichen aus einer Menge (POS1: 2A, 2C)</title><content type='html'>&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;Schreiben Sie ein Java-Programm, das aus der Eingabe (Dateien oder&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;stdin&lt;/code&gt;) die Zeichen aus einer Menge von Zeichen zählt. Die Menge der Zeichen wird als Kommandozeilenargument angegeben. Weitere Argumente sind die Dateien, die gelesen werden. Ist nur ein Parameter angegeben, so soll aus stdin gelesen werden. Kein Parameter ergibt eine Fehlermeldung. Groß-/Kleinschreibung ist&amp;nbsp;&lt;strong&gt;nicht&lt;/strong&gt;&amp;nbsp;zu berücksichtigen.&lt;/span&gt;&lt;br /&gt;Aufrufbeispiele (die Startklasse ist in diesem Beispiel&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;Count&lt;/code&gt;):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;~/workspace/count/bin &amp;gt; java Count aeiou file1.txt file2.txt&lt;br /&gt;a -&amp;gt; 23&lt;br /&gt;e -&amp;gt; 30&lt;br /&gt;i -&amp;gt; 14&lt;br /&gt;o -&amp;gt; 12&lt;br /&gt;u -&amp;gt; 17&lt;br /&gt;~/workspace/count/bin &amp;gt; java Count&lt;br /&gt;Fehler: mindestens die Menge der Zeichen angeben!&lt;br /&gt;~/workspace/count/bin &amp;gt; java Count -h&lt;br /&gt;Bestimmen der Häufigkeiten einer Menge von Zeichen.&lt;br /&gt;Aufruf: java Count [-h] zeichenmenge [dateien...]&lt;br /&gt;~/workspace/count/bin &amp;gt; java Count abc&lt;br /&gt;das ist der Text. Beispiel&lt;br /&gt;zweite Zeile.&lt;br /&gt;^D&lt;br /&gt;a -&amp;gt; 1&lt;br /&gt;b -&amp;gt; 1&lt;br /&gt;c -&amp;gt; 0&lt;br /&gt;~/workspace/count/bin &amp;gt;&lt;/pre&gt;Nennen Sie das Projekt&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;count&lt;/code&gt;&amp;nbsp;(dann natürlich&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;klasse-familienname-java-count&lt;/code&gt;), wobei&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;name&lt;/code&gt;&amp;nbsp;Ihr Familienname und&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;klasse&lt;/code&gt;&amp;nbsp;Ihre Klasse ist (z.B.&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;2ad-haberstroh-java-count&lt;/code&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2711246118594945890?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2711246118594945890/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/zahlen-von-zeichen-aus-einer-menge-pos1.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2711246118594945890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2711246118594945890'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/zahlen-von-zeichen-aus-einer-menge-pos1.html' title='Zählen von Zeichen aus einer Menge (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2029001090539115259</id><published>2011-01-22T12:28:00.001+01:00</published><updated>2011-01-24T08:52:55.918+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lösung'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Ermittle die Top-10 der Worte in einem Text (POS1: 2A, 2C)</title><content type='html'>&lt;h3&gt;Aufgabe 1&lt;/h3&gt;Schreiben Sie eine Funktion &lt;code class="prettyprint"&gt;hauf(string)&lt;/code&gt;, welche die 10 häufigsten Worte im String string ermittelt und als Liste von Tupeln der Art &lt;code class="prettyprint"&gt;(wort, anzahl)&lt;/code&gt; zurück liefert (Länge der Liste ist &lt;= 10). Die Liste muss so sortiert sein, dass das Häufigste Wort ganz am Anfang ist. Haben Worte die selben Häufigkeiten, so haben diese alphabetisch sortiert zu sein.&lt;h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aufgabe 2&lt;/h3&gt;Schreiben Sie eine Funktion &lt;code class="prettyprint"&gt;histogramm(liste, weite = 60)&lt;/code&gt;, welche aus der übergebenen Liste ein Histogramm erzeugt und als String zurück liefert. Eine „Zeile“ soll so aussehen:&lt;br /&gt;&lt;pre class="prettyprint"&gt;das            123 ************&lt;br /&gt;&lt;/pre&gt;Wobei für das Wort 14 Zeichen, die Anzahl 3 Zeichen vorgesehen werden müssen. Dahinter ist eine Anzahl Sternchen, die der Anzahl bezogen auf das Maximum (höchste Anzahl in der Liste) und der Weite entspricht (&lt;code class="prettyprint"&gt;round(anzahl / max * weite)&lt;/code&gt;).&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;Aufgabe 3&lt;/h3&gt;Schreiben Sie eine Funktion &lt;code class="prettyprint"&gt;main()&lt;/code&gt;,  welche alle auf der Kommandozeile angegebenen Dateien öffnet und die Gesamthäufigkeiten ermittelt (also &lt;code class="prettyprint"&gt;hauf()&lt;/code&gt; mit dem gesamten gelesenen Text aufruft) und mit den ermittelten Daten das Histogramm ausgibt.&lt;br /&gt;Sind keine Dateien angegeben, so ist von stdin zu lesen (bis &lt;code class="prettyprint"&gt;EOF&lt;/code&gt;).&lt;br /&gt;Beispielaufruf mit den Testdaten vom /vorgabe-Verzeichnis:&lt;br /&gt;&lt;pre&gt;hp@l111~/workspace/python$ python3 haufdiagramm.py testdaten.txt&lt;br /&gt;der            89 ************************************************************&lt;br /&gt;die            61 *****************************************&lt;br /&gt;und            43 *****************************&lt;br /&gt;Histogramm     40 ***************************&lt;br /&gt;in             28 *******************&lt;br /&gt;für            17 ***********&lt;br /&gt;ist            17 ***********&lt;br /&gt;den            16 ***********&lt;br /&gt;das            15 **********&lt;br /&gt;ein            14 *********&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Mögliche Lösung&lt;/h3&gt;Ich werde die einzelnen Funktionen erklären:&lt;br /&gt;&lt;pre class="prettyprint"&gt;import sys&lt;br /&gt;&lt;/pre&gt;Dieser Import wird für die Kommandozeilenargumente benötigt.&lt;br /&gt;&lt;br /&gt;Folgende Funktion ermittelt die Wort-Häufigkeiten, sortiert das Ergebnis nach Häufigkeit und liefert die ersten 10 Elemente.&lt;br /&gt;&lt;pre class="prettyprint"&gt;def hauf(string):&lt;br /&gt;    """ermittelt die 10 häufigsten Worte in 'string' und liefert Liste mit &lt;br /&gt;    Tupel (wort, anzahl)"""&lt;br /&gt;    dict = {}&lt;br /&gt;    for wort in string.split():&lt;br /&gt;&lt;/pre&gt;&lt;code class="prettyprint"&gt;split()&lt;/code&gt; ohne Parameter zerlegt einen String in eine Liste von "Worten", wobei ein "Wort" eine Folge von Zeichen ohne Leerzeichen, Tabulator und Zeilenumbruch ist. Mit anderen Worten Leerzeichen, Tabulatoren und Zeilenumbrüche sind die Trenner.&lt;br /&gt;&lt;pre class="prettyprint"&gt;        wort = wort.rstrip('.,;?!")') # Satzzeichen entfernen&lt;br /&gt;        wort = wort.lstrip('"(') # Hochkomma und Klammer dürfen vorne stehen&lt;br /&gt;&lt;/pre&gt;&lt;code class="prettyprint"&gt;lstrip()&lt;/code&gt; und &lt;code class="prettyprint"&gt;rstrip()&lt;/code&gt; entfernen alle Zeichen in Klammer &lt;b&gt;l&lt;/b&gt;links bzw. &lt;b&gt;r&lt;/b&gt;echts. In unserem Fall alle Satzzeichen, die unmittelbar vor einem Wort bzw. nach einem Wort stehen dürfen.&lt;br /&gt;Die beiden Zeilen könnte man natürlich auch zusammenfassen zu: &lt;code class="prettyprint"&gt;wort = wort.rstrip('.,;?!")').lstrip('"(')&lt;/code&gt;.&lt;br /&gt;Die folgende erste Zeile prüft, ob der String auch tatsächlich ein Wort ist (nur Buchstaben).&lt;br /&gt;&lt;pre class="prettyprint"&gt;        if wort.isalpha():&lt;br /&gt;            if wort in dict:&lt;br /&gt;                dict[wort] += 1&lt;br /&gt;            else:&lt;br /&gt;                dict[wort] = 1&lt;br /&gt;&lt;/pre&gt;Obige 4 letzte Zeilen prüfen zunächst, ob das Wort bereits im Dictionary enthalten ist. Wenn ja, dann wird die gespeicherte Anzahl erhöht, wenn nein, dann wird unter diesem Wort eine &lt;code&gt;1&lt;/code&gt; gespeichert.&lt;br /&gt;&lt;pre class="prettyprint"&gt;        l = list(dict.items())&lt;br /&gt;&lt;/pre&gt;Erzeugt eine Liste mit Tupeln &lt;code class="prettyprint"&gt;(wort, anzahl)&lt;/code&gt; aus dem Dictionary.&lt;br /&gt;&lt;pre class="prettyprint"&gt;        l.sort(key=lambda x: (-x[1], x[0]))&lt;br /&gt;&lt;/pre&gt;&lt;code class="prettyprint"&gt;sort()&lt;/code&gt; sortiert eine Liste nach der natürlichen Reihenfolge. Mit dem Parameter &lt;code class="prettyprint"&gt;key&lt;/code&gt; kann eine Funktion übergeben werden, anhand deren Returnwert sortiert werden soll. Die Funktion wird jeweils mit einem Listenelement aufgerufen. Man könnte also eine Funktion schreiben, die jeweils das zweite Element des Tupels (die Liste besteht in diesem Fall ja aus Tupeln der Art &lt;code class="prettyprint"&gt;(wort, anzahl)&lt;/code&gt;) zurückliefert. Da absteigend sortiert werden soll, muss entweder der Wert mit &lt;code&gt;-1&lt;/code&gt; multipliziert werden (&lt;code class="prettyprint"&gt;-[x1]&lt;/code&gt;) oder man muss beim Sortieren &lt;code class="prettyprint"&gt;sort(reverse=True)&lt;/code&gt; aufrufen. Den Namen dieser Funktion übergibt man dann per &lt;code class="prettyprint"&gt;key=sortfunktion&lt;/code&gt;.&lt;br /&gt;Diese Funktion könnte so aussehen: &lt;code class="prettyprint"&gt;def sortierfunktion(x):return (-x[1], x[0])&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;lambda x:&lt;/code&gt; definiert eine anonyme Funktion (Funktion ohne Namen) mit dem Parameter &lt;code&gt;x&lt;/code&gt;, die gleich an Ort und Stelle definiert und übergeben werden kann.&lt;br /&gt;&lt;pre class="prettyprint"&gt;    l = l[0:10]&lt;br /&gt;    return l&lt;br /&gt;&lt;/pre&gt;Die letzten beiden Zeilen schneiden die ersten 10 Elemente der Liste aus und liefern sie zurück.&lt;br /&gt;Das könnte man auch nur mit einer Anweisung machen: &lt;code class="prettyprint"&gt;return l[:10]&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def stars(num, max, width):&lt;br /&gt;    """liefert String mit so vielen Sternen, wie num / max * width"""&lt;br /&gt;    return "*" * round(num / max * width)&lt;br /&gt;&lt;/pre&gt;Dazu braucht man nicht allzu viel sagen.&lt;br /&gt;&lt;br /&gt;Die folgende Funktion erzeugt das in Aufgabe 2 geforderte &lt;a href="http://de.wikipedia.org/wiki/Histogramm"&gt;Histogramm&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Um einen passenden Maßstab für die geforderte Weite &lt;code class="prettyprint"&gt;weite=60&lt;/code&gt; zu finden, wird das Maximum der Werte ermittelt. Das muss natürlich das zweite Element des ersten Tupels der Liste sein, wenn überhaupt Tupel in der Liste sind.&lt;br /&gt;&lt;pre class="prettyprint"&gt;def histogramm(liste, weite=60):&lt;br /&gt;    """erzeugt Histogramm und liefert es zurück"""&lt;br /&gt;    if len(liste) &gt; 0:&lt;br /&gt;        max = liste[0][1]&lt;br /&gt;    ret = ""&lt;br /&gt;    for wort, anzahl in liste:&lt;br /&gt;&lt;/pre&gt;Diese Schleife geht jedes Tupel der Liste durch, wobei die Tupel gleich in &lt;code class="prettyprint"&gt;wort&lt;/code&gt; und &lt;code class="prettyprint"&gt;anzahl&lt;/code&gt; "ausgepackt" wird.&lt;br /&gt;&lt;pre class="prettyprint"&gt;        ret += "%-14s%3d %s\n" % (wort, anzahl, stars(anzahl, max, weite))&lt;br /&gt;&lt;/pre&gt;Hier wird jede Zeile an den String &lt;code class="prettyprint"&gt;ret&lt;/code&gt; angehängt, wobei &lt;i&gt;Stringformatierung&lt;/i&gt; angewendet wird.&lt;br /&gt;&lt;pre class="prettyprint"&gt;    return ret&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Die folgenden beiden Funktionen dient nur zum Testen mit fixen Strings und liefert einen String mit vorgegebenen Anzahlen von Worten.&lt;br /&gt;&lt;pre class="prettyprint"&gt;def teststr():&lt;br /&gt;    """liefert Testeingabe"""&lt;br /&gt;    s = "Häufigkeit " * 50 + "das " * 123 + "die, " * 100 + "Haus " * 40&lt;br /&gt;    s += "Maus " * 38 + "Koffer " * 34 + "Kilogramm " * 22 + "Punkt " * 18&lt;br /&gt;    s += "Genau " * 16 + "Zehn " * 10&lt;br /&gt;    s += "nichts " * 5 + "23 " * 50 + "ziemlich " * 3&lt;br /&gt;    return s &lt;br /&gt;&lt;br /&gt;def test():&lt;br /&gt;    """Testen..."""&lt;br /&gt;    liste = hauf(teststr())&lt;br /&gt;    print(histogramm(liste, 12.3))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Diese Funktion prüft, ob überhaupt Kommandozeilenargumente vorhanden sind. Gibt es welche, so werden alle Argumente als Dateien zum Lesen geöffnet und mit &lt;code class="prettyprint"&gt;read()&lt;/code&gt; komplett gelesen und an den String &lt;code class="prettyprint"&gt;eingabe&lt;/code&gt; angehängt.&lt;br /&gt;Gibt es keine Dateinamen auf der Kommandozeile, so wird mittels &lt;code class="prettyprint"&gt;eingabe = sys.stdin.read()&lt;/code&gt; von der Standardeingabe gelesen.&lt;br /&gt;Die letzte Zeile ruft die beiden Hauptfunktionen auf und gibt das Ergebnis aus.&lt;br /&gt;Es &lt;b&gt;fehlt&lt;/b&gt; allerdings noch die Überprüfung, ob eine Datei überhaupt existiert bzw. geöffnet werden kann. Diesen Teil möge der Leser selber ergänzen.&lt;br /&gt;&lt;pre class="prettyprint"&gt;def main():&lt;br /&gt;    """öffnet Datei oder liest von stdin"""&lt;br /&gt;    if len(sys.argv) &gt; 1:&lt;br /&gt;        eingabe = ""&lt;br /&gt;        for arg in sys.argv[1:]:&lt;br /&gt;            f = open(arg)&lt;br /&gt;            eingabe += " " + f.read()&lt;br /&gt;            f.close()&lt;br /&gt;    else:&lt;br /&gt;        eingabe = sys.stdin.read()&lt;br /&gt;    print(histogramm(hauf(eingabe)))&lt;br /&gt;    &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Die folgenden Zeilen dienen zum Aufrufen der Funktion &lt;code class="prettyprint"&gt;main()&lt;/code&gt; (bzw. &lt;code class="prettyprint"&gt;test()&lt;/code&gt; zum Testen), sofern dieses Script als Programm aufgerufen wurde.&lt;br /&gt;&lt;pre class="prettyprint"&gt;if __name__ == '__main__':&lt;br /&gt;#    test()&lt;br /&gt;    main()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Vollständiges Programm (ohne Header)&lt;/h3&gt;&lt;pre class="prettyprint"&gt;import sys&lt;br /&gt;&lt;br /&gt;def hauf(string):&lt;br /&gt;    """ermittelt die 10 häufigsten Worte in 'string' und liefert Liste mit &lt;br /&gt;    Tupel (wort, anzahl)"""&lt;br /&gt;    dict = {}&lt;br /&gt;    for wort in string.split():&lt;br /&gt;        wort = wort.rstrip('.,;?!")') # Satzzeichen entfernen&lt;br /&gt;        wort = wort.lstrip('"(') # Hochkomma und Klammer dürfen vorne stehen&lt;br /&gt;        if wort.isalpha():&lt;br /&gt;            if wort in dict:&lt;br /&gt;                dict[wort] += 1&lt;br /&gt;            else:&lt;br /&gt;                dict[wort] = 1&lt;br /&gt;    l = list(dict.items())&lt;br /&gt;    l.sort(key=lambda x: (-x[1], x[0]))&lt;br /&gt;    l = l[0:10]&lt;br /&gt;    return l&lt;br /&gt;&lt;br /&gt;def stars(num, max, width):&lt;br /&gt;    """liefert String mit so vielen Sternen, wie num / max * width"""&lt;br /&gt;    return "*" * round(num / max * width)&lt;br /&gt;&lt;br /&gt;def histogramm(liste, weite=60):&lt;br /&gt;    """erzeugt Histogramm und liefert es zurück"""&lt;br /&gt;    if len(liste) &gt; 0:&lt;br /&gt;        max = liste[0][1]&lt;br /&gt;    ret = ""&lt;br /&gt;    for wort, anzahl in liste:&lt;br /&gt;        ret += "%-14s%3d %s\n" % (wort, anzahl, stars(anzahl, max, weite))&lt;br /&gt;    return ret&lt;br /&gt;&lt;br /&gt;def teststr():&lt;br /&gt;    """liefert Testeingabe"""&lt;br /&gt;    s = "Häufigkeit " * 50 + "das " * 123 + "die, " * 100 + "Haus " * 40&lt;br /&gt;    s += "Maus " * 38 + "Koffer " * 34 + "Kilogramm " * 22 + "Punkt " * 18&lt;br /&gt;    s += "Genau " * 16 + "Zehn " * 10&lt;br /&gt;    s += "nichts " * 5 + "23 " * 50 + "ziemlich " * 3&lt;br /&gt;    return s &lt;br /&gt;&lt;br /&gt;def test():&lt;br /&gt;    """Testen..."""&lt;br /&gt;    liste = hauf(teststr())&lt;br /&gt;    print(histogramm(liste, 12.3))&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;    """öffnet Datei oder liest von stdin"""&lt;br /&gt;    if len(sys.argv) &gt; 1:&lt;br /&gt;        eingabe = ""&lt;br /&gt;        for arg in sys.argv[1:]:&lt;br /&gt;            f = open(arg)&lt;br /&gt;            eingabe += " " + f.read()&lt;br /&gt;            f.close()&lt;br /&gt;    else:&lt;br /&gt;        eingabe = sys.stdin.read()&lt;br /&gt;    print(histogramm(hauf(eingabe)))&lt;br /&gt;    &lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;#    test()&lt;br /&gt;    main()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2029001090539115259?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2029001090539115259/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/ermittle-die-top-10-der-worte-in-einem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2029001090539115259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2029001090539115259'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/ermittle-die-top-10-der-worte-in-einem.html' title='Ermittle die Top-10 der Worte in einem Text (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1623203862497718080</id><published>2011-01-14T12:32:00.000+01:00</published><updated>2011-01-14T12:32:17.442+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Lösung'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Ganze Zahlen zählen (Schleife, Sequenzen, Funktionen POS1: 1BHIF)</title><content type='html'>Schreiben Sie ein Programm anzzahlen.py, welches eine Zeile einliest und in dieser Zeile zähle, wieviele ganze Zahlen vorkommen. Jedes Zeichen, das keine Ziffer ist, gilt als nicht zu einer Zahl gehörend.&lt;br /&gt;Beispiel:&lt;br /&gt;&lt;b&gt;Eingabe&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;das ist eine Zahl 123 und noch eine 1 und noch zwei 3213x23123&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Ausgabe&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;4 Zahlen gefunden.&lt;br /&gt;&lt;/pre&gt;Das Programm soll richtige Sätze ausgeben, also "Keine Zahlen gefunden.", wenn in der Eingabe keine Zahlen sind oder "Eine Zahl gefunden.", wenn eine Zahl in der Eingabe war. Ab 4 soll dann die Zahl ausgegeben werden, z.B. "6 Zahlen gefunden."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mögliche Lösung&lt;/b&gt;:&lt;br /&gt;&lt;pre class="prettyprint"&gt;"""&lt;br /&gt;author: Haberstroh, Harald&lt;br /&gt;matnr:  d09666&lt;br /&gt;file:   anzzahlen.py&lt;br /&gt;desc:   Zähle ganze Zahlen&lt;br /&gt;        Beispiel:&lt;br /&gt;            das ist eine Zahl 123 und noch eine 1 und noch zwei 3213x23123&lt;br /&gt;        Ausgabe:&lt;br /&gt;            4 Zahlen gefunden&lt;br /&gt;date:   14.1.2011&lt;br /&gt;class:  Lehrer&lt;br /&gt;catnr:  33&lt;br /&gt;"""&lt;br /&gt;#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----&lt;br /&gt;&lt;br /&gt;def anz_zahlen(string):&lt;br /&gt;    """ermittelt die Anzahl der ganzen Zahlen im String"""&lt;br /&gt;    anzahl = 0&lt;br /&gt;    in_zahl = False&lt;br /&gt;    for zeichen in string:&lt;br /&gt;        if zeichen in "0123456789":&lt;br /&gt;            if not in_zahl:&lt;br /&gt;                anzahl += 1&lt;br /&gt;                in_zahl = True&lt;br /&gt;        else:&lt;br /&gt;            in_zahl = False&lt;br /&gt;    return anzahl&lt;br /&gt;&lt;br /&gt;def ausgabe(anzahl):&lt;br /&gt;    """gibt deutschen Satz aus mit Anzahl"""&lt;br /&gt;    if anzahl == 0:&lt;br /&gt;        print("Keine Zahl gefunden.")&lt;br /&gt;    elif anzahl == 1:&lt;br /&gt;        print("Eine Zahl gefunden.")&lt;br /&gt;    elif anzahl == 2:&lt;br /&gt;        print("Zwei Zahlen gefunden.")&lt;br /&gt;    elif anzahl == 3:&lt;br /&gt;        print("Drei Zahlen gefunden.")&lt;br /&gt;    else:&lt;br /&gt;        print(anzahl, "Zahlen gefunden.")&lt;br /&gt;        &lt;br /&gt;def main():&lt;br /&gt;    """EVA Eingave Verarbeitung Ausgabe - das Hauptprogramm"""&lt;br /&gt;    string = input("&gt; ")&lt;br /&gt;    anzahl = anz_zahlen(string)&lt;br /&gt;    ausgabe(anzahl)&lt;br /&gt;&lt;br /&gt;def test():&lt;br /&gt;    """Testen von anz_zahlen() und ausgabe()"""&lt;br /&gt;    string = "das ist eine Zahl 123 und noch eine 1 und noch eine 3213x23123"&lt;br /&gt;    anzahl = anz_zahlen(string)&lt;br /&gt;    ausgabe(anzahl)&lt;br /&gt;    ausgabe(anz_zahlen("keine"))&lt;br /&gt;    ausgabe(anz_zahlen("eine Zahl 123"))&lt;br /&gt;    ausgabe(anz_zahlen("zwei 23 und 324"))&lt;br /&gt;    ausgabe(anz_zahlen("drei 23 34 22"))&lt;br /&gt;    ausgabe(anz_zahlen("vier 234 234 234 45"))&lt;br /&gt;    ausgabe(anz_zahlen("5 234 234 234 45"))&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    main()&lt;br /&gt;#    test()&lt;br /&gt;&lt;/pre&gt;Beachten Sie, dass ich hier eine eigene Funktion &lt;code&gt;test()&lt;/code&gt; gemacht habe, um viele Testfälle immer wieder leicht probieren zu können. Statt &lt;code&gt;main()&lt;/code&gt; muss dann nur &lt;code&gt;test()&lt;/code&gt; aufgerufen werden.&lt;br /&gt;Das Programm wäre auch ohne die Funktion &lt;code&gt;test()&lt;/code&gt; fertig und korrekt. &lt;code&gt;test()&lt;/code&gt; half nur bei der Entwicklung bei der Fehlersuche.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1623203862497718080?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1623203862497718080/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/ganze-zahlen-zahlen-schleife-sequenzen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1623203862497718080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1623203862497718080'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/ganze-zahlen-zahlen-schleife-sequenzen.html' title='Ganze Zahlen zählen (Schleife, Sequenzen, Funktionen POS1: 1BHIF)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-804062530229343549</id><published>2011-01-13T15:58:00.002+01:00</published><updated>2011-01-20T15:48:37.718+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Beispiele zeichenweise Bearbeitung, Java (POS-1: 2A, 2C)</title><content type='html'>&lt;h4&gt;Anzahl der Strings in der Eingabe ermitteln&lt;/h4&gt;&lt;p&gt;Schreiben Sie ein Programm, welches die Anzahl der Strings in der Eingabe ermittelt. Strings sind beliebige Zeichenketten zwischen Hochkomma (z.B. &lt;code&gt;&lt;q&gt;ein string&lt;/q&gt;&lt;/code&gt;). Verwenden Sie Schalter zum Erkennen von Strings (Zustand "InString", wenn man innerhalb eines Strings ist und "OutString", wenn gerade kein String gelesen wird).&lt;/p&gt;&lt;h4&gt;Anzahl der Zahlen ermitteln&lt;/h4&gt;&lt;p&gt;Schreiben Sie ein Programm, welches die Anzahl der Zahlen in der Eingabe ermittelt (ganze Zahlen, müssen durch Leerzeichen, Tabulatoren oder Zeilenumbrüchen von anderen Eingaben getrennt sein).&lt;/p&gt;&lt;h4&gt;Ziffern zählen&lt;/h4&gt;&lt;p&gt;Schreiben Sie ein Java-Programm, welches die Anzahl der Ziffern in der Standardeingabe ermittelt und ausgibt.&lt;/p&gt;&lt;h4&gt;Vokale zählen&lt;/h4&gt;&lt;p&gt;Schreiben Sie ein Java-Programm, welches die Anzahl der Vokale in der Standardeingabe ermittelt und ausgibt.&lt;/p&gt;&lt;h4&gt;Zeichen, Worte und Zeilen zählen&lt;/h4&gt;&lt;p&gt;Schreiben Sie ein Java-Programm, welches die Anzahl der Zeichen, Worte und Zeilen in der Standardeingabe ermittelt und ausgibt.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-804062530229343549?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/804062530229343549/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/beispiele-zeichenweise-bearbeitung-java.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/804062530229343549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/804062530229343549'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/beispiele-zeichenweise-bearbeitung-java.html' title='Beispiele zeichenweise Bearbeitung, Java (POS-1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-2202654151262413111</id><published>2011-01-12T14:04:00.001+01:00</published><updated>2011-01-12T14:35:19.213+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Java Einführung (POS1: 2A, 2C)</title><content type='html'>Schreiben Sie ein einfaches Java Programm, welches "Hello World" ausgibt. Nennen Sie das Programm Hello.java.&lt;br /&gt;Verwenden Sie dazu einen Texteditor und übersetzen Sie das Programm auf der Kommandozeile.&lt;br /&gt;Schreiben Sie ein einfaches Java-Programm, welches das kleine Einmaleins ausgibt. Welchen Namen könnte das Programm haben?&lt;br /&gt;&lt;pre&gt;  X    1    2    3    4    5    6    7    8    9   10  &lt;br /&gt;  1    1    2    3    4    5    6    7    8    9   10&lt;br /&gt;  2    2    4    6    8   10   12   14   16   18   20&lt;br /&gt;  3    3    6    9   12   15   18   21   24   27   30&lt;br /&gt;  4    4    8   12   16   20   24   28   32   36   40&lt;br /&gt;  5    5   10   15   20   25   30   35   40   45   50&lt;br /&gt;  6    6   12   18   24   30   36   42   48   54   60&lt;br /&gt;  7    7   14   21   28   35   42   49   56   63   70&lt;br /&gt;  8    8   16   24   32   40   48   56   64   72   80&lt;br /&gt;  9    9   18   27   36   45   54   63   72   81   90&lt;br /&gt; 10   10   20   30   40   50   60   70   80   90  100&lt;br /&gt;&lt;/pre&gt;Verwenden Sie wieder einen Texteditor und den Java-Compiler auf der Kommandozeile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-2202654151262413111?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/2202654151262413111/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/java-einfuhrung-pos1-2a-2c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2202654151262413111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/2202654151262413111'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/java-einfuhrung-pos1-2a-2c.html' title='Java Einführung (POS1: 2A, 2C)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-7860929326768056741</id><published>2011-01-10T17:19:00.000+01:00</published><updated>2011-01-10T17:19:50.070+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective C'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Go'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmiersprachen'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>TIOBE-Index: Python ist Programmiersprache 2010</title><content type='html'>Die Programmiersprache Python konnte unter den im &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;TIOBE&lt;/a&gt;-Index gelisteten Sprachen im vergangenen Jahr den größten Zuwachs verzeichnen. Den zweitgrößten Zuwachs hatte &lt;a href="http://de.wikipedia.org/wiki/Objective-C"&gt;Objective-C&lt;/a&gt; wegen iPhone- und iPad-Entwicklung. Objective-C galt daher lange Zeit als Kandidat für die Sprache des Jahres 2010.&lt;br /&gt;Detaillierte Informationen gibt es &lt;a href="http://www.heise.de/newsticker/meldung/TIOBE-Index-Python-ist-Programmiersprache-2010-1166165.html"&gt;hier&lt;/a&gt; und &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gmjWOaOfpfo/TSsxIKJuzfI/AAAAAAAAEeE/Z5uUDH97vyU/s1600/tiobe.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_gmjWOaOfpfo/TSsxIKJuzfI/AAAAAAAAEeE/Z5uUDH97vyU/s1600/tiobe.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-7860929326768056741?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/7860929326768056741/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2011/01/tiobe-index-python-ist.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7860929326768056741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7860929326768056741'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2011/01/tiobe-index-python-ist.html' title='TIOBE-Index: Python ist Programmiersprache 2010'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gmjWOaOfpfo/TSsxIKJuzfI/AAAAAAAAEeE/Z5uUDH97vyU/s72-c/tiobe.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-8463521544207064903</id><published>2010-12-15T12:20:00.000+01:00</published><updated>2010-12-15T12:20:07.622+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><title type='text'>Dynamische Speicherverwaltung in C (PR: 5A, 5B)</title><content type='html'>Implementieren Sie eine einfache dynamische Speicherverwaltung, die nach dem in der folgenden Skizze gezeigten Prinzip funktioniert. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gmjWOaOfpfo/TQii1J7roEI/AAAAAAAAEdg/F2Pofwh5LHM/s1600/DynSpei2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gmjWOaOfpfo/TQii1J7roEI/AAAAAAAAEdg/F2Pofwh5LHM/s1600/DynSpei2.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Diese Speicherverwaltung soll es ermöglichen, Speicher in beliebiger Reihenfolge zu allozieren und wieder freizugeben.  Siehe auch  &lt;a href="http://edvowww.htlwrn.ac.at/HP/PR2/DynSpei.html"&gt;Dynamische Speicherverwaltung&lt;/a&gt; &lt;br /&gt;Schreiben Sie ein Modul &lt;code&gt;heap&lt;/code&gt; für die Speicherverwaltung  selbst, welches folgende Funktionen enthält (exportiert): &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;void *halloc(size_t size);&lt;/code&gt; zum Anfordern von       Speicher der Größe &lt;code&gt;size&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;void hfree(void *p);&lt;/code&gt; zum Freigeben des Speichers,       auf den der Zeigern &lt;code&gt;p&lt;/code&gt; zeigt.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Erstellen Sie eine weitere Version des Moduls &lt;code&gt;heap&lt;/code&gt;, welches bei jedem Aufruf von &lt;code&gt;halloc()&lt;/code&gt; bzw.  &lt;code&gt;hfree()&lt;/code&gt; den &lt;b&gt;gesamten&lt;/b&gt; Speicher in lesbarer Form auf &lt;code&gt;stderr&lt;/code&gt; ausgibt, damit man das Allozieren der Speicherblöcke sehen kann (die Größe des Heaps sollte dabei eher &lt;b&gt;klein&lt;/b&gt; gewählt werden!). &lt;br /&gt;Schreiben Sie weiters ein Modul, welches Ihre Speicherverwaltung testet durch Anfordern von Speicher, belegen und lesen des allozierten Speichers und wieder Freigeben des Speichers in verschiedenen Varianten. &lt;br /&gt;Erstellen Sie dazu eine Liste von Testfällen und beschreiben Sie das Ergebnis der Tests (die Speicherauszüge bekommen Sie mit obiger Variante des Moduls). &lt;br /&gt;&lt;b&gt;Beispiele von Testfällen:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;n.&lt;/i&gt; Test: allozieren eines Strings der Länge &lt;code&gt;HEAPSIZE - sizeof(heap_t)&lt;/code&gt;, füllen des Strings mit lauter &lt;code&gt;'A'&lt;/code&gt; und ausgeben des Strings. &lt;b&gt;OK&lt;/b&gt;&lt;br /&gt;&lt;i&gt;n+1.&lt;/i&gt; Test: freigeben des Speichers aus Test &lt;i&gt;n&lt;/i&gt;. &lt;b&gt;OK&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zu jedem Test ist anzugeben, ob der Test erfolgreich war. Falls ein Test nicht erfolgreich war, so ist festzustellen, warum und ggf. der Fehler zu beheben. Wird am Programm etwas verändert, so müssen &lt;b&gt;alle Tests noch einmal gemacht werden!&lt;/b&gt; &lt;br /&gt;Schreiben Sie ein passendes &lt;b&gt;Makefile&lt;/b&gt;, mit dem man alternativ die normale Variante von &lt;code&gt;heap&lt;/code&gt; und die Testvariante von &lt;code&gt;heap&lt;/code&gt; erzeugen kann! &lt;br /&gt;Organisieren Sie sich in &lt;b&gt;Kleingruppen&lt;/b&gt; und versuchen Sie die einzelnen Funktionen gemeinsam zu entwerfen und zu programmieren. Welche Hilfsfunktionen braucht z.B. das &lt;code&gt;halloc()&lt;/code&gt;? &lt;br /&gt;Erweitern Sie die Speicherverwaltung um eine "Garbage Collection", die freie Speicherbereiche, die hintereinanderliegen zusammenfasst. &lt;br /&gt;Erstellen Sie eine geeignete Verzeichnisstruktur und verwenden Sie &lt;code&gt;&lt;b&gt;CVS&lt;/b&gt;&lt;/code&gt;. &lt;br /&gt;Tauschen Sie die Module mit anderen Gruppen aus (das müßte ganz einfach sein, da die Schnittstellen immer gleich sind (s.o.). &lt;br /&gt;&lt;b&gt;Abgabe:&lt;/b&gt;&lt;br /&gt;Nennen Sie das Projekt&amp;nbsp;&lt;code&gt;5ad-&lt;i&gt;name&lt;/i&gt;-heap&lt;/code&gt; bzw. &lt;code&gt;5bd-&lt;i&gt;name&lt;/i&gt;-heap&lt;/code&gt; und checken Sie es ein.&lt;br /&gt;Beantworten Sie weiters folgende Fragen (die Antworten müssen in der Datei &lt;code&gt;heap.txt&lt;/code&gt; gespeichert werden): &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Was passiert, wenn man einen String der Länge &lt;i&gt;n&lt;/i&gt;    alloziert und einen String der Länge &lt;i&gt;n&lt;/i&gt; speichert?&lt;/li&gt;&lt;li&gt;Was passiert, wenn man einen String der Länge &lt;i&gt;n&lt;/i&gt;    alloziert und einen String der Länge &lt;i&gt;n + 1&lt;/i&gt; speichert?&lt;/li&gt;&lt;li&gt;Sie allozieren einen String der Länge 11 und speichern    &lt;code&gt;"0123456789"&lt;/code&gt; und geben den String wieder frei. Danach    allozieren Sie einen String der Länge 20 und geben diesen String    aus. Was passiert? (die Speicheranforderungen bzw. die Freigabe    muss unmittelbar hintereinander erfolgen).&lt;/li&gt;&lt;li&gt;Welche Speicheranforderungen benötigen mehr Speicher - 10    Strings der Länge 100 oder 100 Strings der Länge 10? Begründen Sie    die Antwort.&lt;/li&gt;&lt;li&gt;Wie könnten Sie im Modul &lt;code&gt;heap&lt;/code&gt; sicherstellen, dass    bei einem Aufruf von &lt;code&gt;hfree(p);&lt;/code&gt; der Parameter    &lt;code&gt;p&lt;/code&gt; tatsächlich auf einen mit &lt;code&gt;halloc()&lt;/code&gt;    allozierten Speicherbereich zeigt?&lt;/li&gt;&lt;/ol&gt;&lt;code&gt;heap.txt&lt;/code&gt; muss auch die Liste der Testfälle mit ihren Ergebnissen enthalten.  &lt;br /&gt;Geben Sie einen Ausdruck der ausgearbeiteten Fragen ab!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-8463521544207064903?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/8463521544207064903/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/12/dynamische-speicherverwaltung-in-c-pr.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/8463521544207064903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/8463521544207064903'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/12/dynamische-speicherverwaltung-in-c-pr.html' title='Dynamische Speicherverwaltung in C (PR: 5A, 5B)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gmjWOaOfpfo/TQii1J7roEI/AAAAAAAAEdg/F2Pofwh5LHM/s72-c/DynSpei2.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1115329628334220449</id><published>2010-12-10T09:45:00.000+01:00</published><updated>2010-12-10T09:45:52.783+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Diagramm erstellen (POS1: 2AHIF, 2CHIF)</title><content type='html'>Erstellen Sie ein Python-Programm zum Darstellen von Daten in einem Diagramm. Die Daten stammen aus einer Textdatei mit Zeilen mit Datum und Wert. Zum Beispiel:&lt;br /&gt;&lt;pre&gt;10.9.2010 70&lt;br /&gt;11.10.2010 36&lt;br /&gt;10.11.2010 50&lt;br /&gt;11.11.2010 70&lt;br /&gt;1.12.2010 30&lt;br /&gt;&lt;/pre&gt;Auf der X-Achse soll das Datum aufgetragen werden und auf der Y-Achse der jeweilige Wert.&lt;br /&gt;&lt;br /&gt;Wählen Sie einen passenden Maßstab. Das erste Datum soll der Null-Punkt auf der X-Achse sein.&lt;br /&gt;Verwenden Sie die Turtle-Grafik (&lt;code&gt;from turtle import *&lt;/code&gt;). Hilfe zur Turtle-Grafik finden Sie in einer Python-Konsole mit:&lt;br /&gt;&lt;pre&gt;import turtle&lt;br /&gt;help(turtle)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Damit Sie passende Testdaten bekommen, schreiben Sie auch einen Testdatengenerator, der 3 Parameter auf der Kommandozeile hat:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Name der Datei&lt;/li&gt;&lt;li&gt;Anfangsdatum&lt;/li&gt;&lt;li&gt;Anzahl der Datensätze&lt;/li&gt;&lt;/ol&gt;Die Datumswerte generierern Sie so, dass, beginnend mit dem Anfangsdatum, immer eine zufällige Anzahl von Tagen zwischen 1 und 31 dazugezählt werden soll. Die Werte sollen zufällige ganze Zahlen zwischen 0 und 100 (inclusive) sein.&lt;br /&gt;&lt;br /&gt;Nennen Sie das Projekt &lt;code&gt;2x-name-python-diagramm&lt;/code&gt;, den Testdatengenerator &lt;code&gt;testdaten.py&lt;/code&gt; und das Diagramm &lt;code&gt;diagramm.py&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1115329628334220449?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1115329628334220449/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/12/diagramm-erstellen-pos1-2ahif-2chif.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1115329628334220449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1115329628334220449'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/12/diagramm-erstellen-pos1-2ahif-2chif.html' title='Diagramm erstellen (POS1: 2AHIF, 2CHIF)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-5928655172300397839</id><published>2010-12-03T12:27:00.002+01:00</published><updated>2010-12-03T12:27:58.902+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Wurzelberechnung (POS1: 1BHIF)</title><content type='html'>Man kann die Wurzel einer Zahl berechnen mit folgender Formel&lt;br /&gt;&lt;br /&gt;x&lt;sub&gt;n&lt;/sub&gt; = (x&lt;sub&gt;n-1&lt;/sub&gt; + a / x&lt;sub&gt;n-1&lt;/sub&gt;) / 2&lt;br /&gt;&lt;br /&gt;Man beginnt damit, dass a und x&lt;sub&gt;0&lt;/sub&gt; gleich der Zahl, aus der man die Wurzel ziehen will, setzt und x&lt;sub&gt;1&lt;/sub&gt; berechnet. Dann berechnet man x&lt;sub&gt;2&lt;/sub&gt; usw. bis sich die beiden letzten Werte nur mehr gering unterscheiden (z.B. die Differenz kleiner 0,0000001 ist).&lt;br /&gt;&lt;br /&gt;Schreiben Sie eine Funktion &lt;code class="prettyprint"&gt;wurzel(zahl, genauigkeit)&lt;/code&gt;, welche nach obiger Methode die Wurzel berechnet.&lt;br /&gt;&lt;br /&gt;Erstellen Sie ein Programm &lt;code&gt;wurzel.py&lt;/code&gt;, welche eine Tabelle der Wurzeln der Zahlen 1 bis 20 bei den Genauigkeiten 0.01, 0.0001 sowie 0.0000001 ausgibt:&lt;br /&gt;&lt;pre&gt; 1:  1.0000000  1.0000000  1.0000000&lt;br /&gt; 2:  1.4142157  1.4142136  1.4142136&lt;br /&gt; 3:  1.7320508  1.7320508  1.7320508&lt;br /&gt; 4:  2.0000001  2.0000000  2.0000000&lt;br /&gt; 5:  2.2360689  2.2360680  2.2360680&lt;br /&gt; 6:  2.4494944  2.4494897  2.4494897&lt;br /&gt; 7:  2.6457670  2.6457513  2.6457513&lt;br /&gt; 8:  2.8284271  2.8284271  2.8284271&lt;br /&gt; 9:  3.0000000  3.0000000  3.0000000&lt;br /&gt;10:  3.1622777  3.1622777  3.1622777&lt;br /&gt;11:  3.3166248  3.3166248  3.3166248&lt;br /&gt;12:  3.4641017  3.4641016  3.4641016&lt;br /&gt;13:  3.6055514  3.6055513  3.6055513&lt;br /&gt;14:  3.7416576  3.7416574  3.7416574&lt;br /&gt;15:  3.8729837  3.8729833  3.8729833&lt;br /&gt;16:  4.0000006  4.0000000  4.0000000&lt;br /&gt;17:  4.1231067  4.1231056  4.1231056&lt;br /&gt;18:  4.2426425  4.2426407  4.2426407&lt;br /&gt;19:  4.3589018  4.3588989  4.3588989&lt;br /&gt;20:  4.4721402  4.4721360  4.4721360&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-5928655172300397839?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/5928655172300397839/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/12/wurzelberechnung.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5928655172300397839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/5928655172300397839'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/12/wurzelberechnung.html' title='Wurzelberechnung (POS1: 1BHIF)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-8949910210589545229</id><published>2010-12-03T10:30:00.003+01:00</published><updated>2010-12-03T12:06:56.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Lösung'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Musterlösung zu Übungsbeispiele für Python vom 1.12.2010 (POS1: 1BHIF)</title><content type='html'>Prüfen, ob durch die Angabe dreier Längen ein Dreieck gegeben ist.&lt;br /&gt;Zwei Seiten müssen immer länger als die dritte sein. Man muss dies für alle Möglichkeiten prüfen, denn z.B.&lt;br /&gt;a = 3, b = 4, c = 1&lt;br /&gt;Da stimmt zwar a + b &amp;gt; c (7 &amp;gt; 1) und b + c &amp;gt; a (4 &amp;gt; 3), jedoch nicht a + c &amp;gt; b (4 == 4)!&lt;br /&gt;Bei der Lösung wird eine Schleife verwendet.&lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_dreieck(a, b, c):&lt;br /&gt;    """liefert True, wenn durch a, b und c ein gültiges Dreieck definiert&lt;br /&gt;    ist"""&lt;br /&gt;    i = 3&lt;br /&gt;    while i &amp;gt; 0:&lt;br /&gt;        if a + b &amp;lt;= c:&lt;br /&gt;            return False # kein Dreieck&lt;br /&gt;        a, b, c = b, c, a&lt;br /&gt;        i = i - 1&lt;br /&gt;    return True&lt;br /&gt;&lt;/pre&gt;Man könnte das Problem natürlich auch durch logische Verknüpfung der Prüfungen lösen: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_dreieck(a, b, c):&lt;br /&gt;    """liefert True, wenn durch a, b und c ein gültiges Dreieck definiert&lt;br /&gt;    ist"""&lt;br /&gt;    if a + b &amp;gt; c and b + c &amp;gt; a and c + a &amp;gt; b:&lt;br /&gt;        ret = True&lt;br /&gt;    else:&lt;br /&gt;        ret = False&lt;br /&gt;    return ret&lt;br /&gt;&lt;/pre&gt;Oder gleich so: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_dreieck(a, b, c):&lt;br /&gt;    """liefert True, wenn durch a, b und c ein gültiges Dreieck definiert&lt;br /&gt;    ist"""&lt;br /&gt;    return a + b &amp;gt; c and b + c &amp;gt; a and c + a &amp;gt; b&lt;br /&gt;&lt;/pre&gt;Bei der zweiten Aufgabe soll geprüft werden, ob durch zwei Seiten und einem Winkel ein Quadrat gegeben ist. Die beiden Seiten müssen gleich lang sein (und größer 0) und der Winkel 90°: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_quadrat(a, b, w):&lt;br /&gt;    """liefert True, wenn durch a und b sowie dem Winkel w ein &lt;br /&gt;    Quadrat definiert ist"""&lt;br /&gt;    quadrat = False&lt;br /&gt;    if a &amp;gt; 0:&lt;br /&gt;        if a == b:&lt;br /&gt;            if w == 90:&lt;br /&gt;                quadrat = True&lt;br /&gt;    # else entfällt, da die Variable quadrat schon mit False vorbelegt ist.&lt;br /&gt;    return quadrat&lt;br /&gt;&lt;/pre&gt;Oder wieder kürzer mit logischer Verknüpfung: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_quadrat(a, b, w):&lt;br /&gt;    """liefert True, wenn durch a und b sowie dem Winkel w ein &lt;br /&gt;    Quadrat definiert ist"""&lt;br /&gt;    return a == b and w == 90 and a &amp;gt; 0&lt;br /&gt;&lt;/pre&gt;Die Schaltjahrprüfung könnte so erfolgen: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_schaltjahr(jahr):&lt;br /&gt;    """liefert True, wenn das gegebene Jahr ein Schaltjahr ist.&lt;br /&gt;    Seit Ende 1582 gilt der Gregorianische Kalender, bei dem folgende Regel&lt;br /&gt;    für die Schaltjahrbestimmung anzuwenden sind:&lt;br /&gt;        In allen Jahren, deren Jahreszahl durch vier teilbar ist, ist der &lt;br /&gt;        29. Februar ein Schalttag und damit ist dieses Jahr ein Schaltjahr.&lt;br /&gt;        Eine Ausnahme bilden allerdings die vollen Jahrhundertjahre 1700, &lt;br /&gt;        1800, 1900 usw., auch Säkularjahre genannt. Hiervon erhalten nur &lt;br /&gt;        diejenigen einen Schalttag, deren Jahreszahl durch 400 teilbar ist. &lt;br /&gt;        Jedes vierte Säkularjahr ist somit ein Schaltjahr.&lt;br /&gt;    Für alle Jahre &amp;lt;= 1582 liefert die Funktion False, weil da das&lt;br /&gt;    Schaltjahr nicht definiert ist, sonst gilt obige Regel."""&lt;br /&gt;    if jahr &amp;lt;= 1582:&lt;br /&gt;        schaltjahr = False&lt;br /&gt;    elif jahr % 400 == 0:&lt;br /&gt;        schaltjahr = True&lt;br /&gt;    elif jahr % 100 == 0:&lt;br /&gt;        schaltjahr = False&lt;br /&gt;    elif jahr % 4 == 0:&lt;br /&gt;        schaltjahr = True&lt;br /&gt;    else:&lt;br /&gt;        schaltjahr = False&lt;br /&gt;    return schaltjahr&lt;br /&gt;&lt;/pre&gt;Jahre bis 1582 können keine Schaltjahre sein, da der Gregorianische Kalender erst im Jahr 1582 definiert wurde. Zum Test der Schaltjahrprüfung noch ein paar Worte, aber zunächst die Testfunktion, die ein paar Jahreszahlen prüft, von denen man weiß, dass sie kein Schaltjahr sind sowie Zahlen, bei denen bekannt ist, dass sie Schaltjahre sind: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def test_ist_schaltjahr():&lt;br /&gt;    for jahr in (1000, 1580, 1581, 1582, 1900, 1999, 2003):&lt;br /&gt;        assert not ist_schaltjahr(jahr)&lt;br /&gt;    for jahr in (1996, 2000, 2004):&lt;br /&gt;        assert ist_schaltjahr(jahr)&lt;br /&gt;    print("ist_schaltjahr ok")&lt;br /&gt;&lt;/pre&gt;Die Anweisung &lt;code&gt;assert&lt;/code&gt; ist für Programmierer und dient zum Prüfen der Bedingung, die gleich dahinter folgt, gedacht. Zum Beispiel: &lt;br /&gt;&lt;pre class="prettyprint"&gt;assert 3 &amp;lt; 4&lt;br /&gt;&lt;/pre&gt;Die Bedingung ist wahr, daher läuft das Programm weiter. Ist die Bedingung hingegen falsch, so wird das Programm mit einer Fehlermeldung abgebrochen: &lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; assert 3 &amp;gt; 4&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;pyshell#0&gt;", line 1, in &lt;module&gt;&lt;br /&gt;    assert 3 &amp;gt; 4&lt;br /&gt;AssertionError&lt;br /&gt;&lt;/module&gt;&lt;/pyshell#0&gt;&lt;/pre&gt;Zusätzlich kann ein Text als Fehlermeldung angegeben werden: &lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; assert 3 &amp;gt; 4, "3 ist nicht größer als 4"&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;pyshell#1&gt;", line 1, in &lt;module&gt;&lt;br /&gt;    assert 3 &amp;gt; 4, "3 ist nicht größer als 4"&lt;br /&gt;AssertionError: 3 ist nicht größer als 4&lt;br /&gt;&lt;/module&gt;&lt;/pyshell#1&gt;&lt;/pre&gt;Angewendet auf obige Testfunktion bedeutet das, dass immer, wenn &lt;code class="prettyprint"&gt;assert not ist_schaltjahr(jahr)&lt;/code&gt; die Funktion &lt;code class="prettyprint"&gt;ist_schaltjahr(jahr)&lt;/code&gt; den Wert &lt;codeclass="prettyprint"&gt;False leifern muss und wenn &lt;code class="prettyprint"&gt;assert ist_schaltjahr(jahr)&lt;/code&gt; steht, &lt;code class="prettyprint"&gt;True&lt;/code&gt; geleifert werden muss, damit das Programm nicht abgebrochen wird. Der nächste Punkt ist die &lt;code class="prettyprint"&gt;for jahr in (1000, 1580, 1581, 1582, 1900, 1999, 2003):&lt;/code&gt;-Zeile. Die Variable &lt;code class="prettyprint"&gt;jahr&lt;/code&gt; bekommt der Reihe nach die Werte 1000, 1580, 1581, 1582, 1900, 1999, 2003 und der eingerückte Code-Block (die eine Zeile) wird ausgeführt. Das ist die &lt;code class="prettyprint"&gt;for&lt;/code&gt;-Schleife, welche im Buch im Kapitel 7 auch erklärt wird. Die Funktion &lt;code class="prettyprint"&gt;test_ist_schaltjahr()&lt;/code&gt; prüft also zunächst ein paar Jahre, die kein Schaltjahr sind und ein paar Schaltjahre.  Die Fibonaccizahlen können wie folgt ermittelt werden: &lt;/codeclass="prettyprint"&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def fib(n):&lt;br /&gt;    """liefert die Fibonaccizahl zu n. Die Zahlen sind wie definiert:&lt;br /&gt;        fib(0) -&amp;gt; 0&lt;br /&gt;        fib(1) -&amp;gt; 1&lt;br /&gt;        fib(2) -&amp;gt; 1&lt;br /&gt;        fib(3) -&amp;gt; 2&lt;br /&gt;        fib(4) -&amp;gt; 3&lt;br /&gt;        fib(5) -&amp;gt; 5&lt;br /&gt;        fib(6) -&amp;gt; 8&lt;br /&gt;        ...&lt;br /&gt;        fib(10) -&amp;gt; 55&lt;br /&gt;        ...&lt;br /&gt;        fib(15) -&amp;gt; 610"""&lt;br /&gt;    f = 0&lt;br /&gt;    a = 0&lt;br /&gt;    b = 1&lt;br /&gt;    i = 0&lt;br /&gt;    while i &amp;lt; n:&lt;br /&gt;        f = a + b&lt;br /&gt;        b, a = a, f&lt;br /&gt;        i += 1&lt;br /&gt;    return f&lt;br /&gt;&lt;/pre&gt;Für n = 0 und n = 1 sind die (Anfangs-)Werte vordefiniert. &lt;code class="prettyprint"&gt;fib(0) = 0&lt;/code&gt; und &lt;code class="prettyprint"&gt;fib(1) = 1&lt;/code&gt;. Danach gilt die Regel, dass die n. Fibonaccizahl die Summe der beiden Vorgänger ist, also &lt;code class="prettyprint"&gt;fib(n - 1) + fib(n - 2)&lt;/code&gt; (Siehe dazu auch Wikipedia: &lt;a href="http://de.wikipedia.org/wiki/Fibonacci-Folge#Definition_der_Fibonacci-Folge"&gt;Fibonacci-Folge&lt;/a&gt;). Die Variable &lt;code&gt;f&lt;/code&gt; hat immer den Wert der aktuellen Fibonaccizahl und ist daher mit 0 initialisiert. Die Variable a und b haben immer den Wert der beiden Vorgänger. Sie können das leicht sehen, wenn Sie &lt;code class="prettyprint"&gt;print(...)&lt;/code&gt;-Anweisungen einfügen und sich dadurch den Ablauf der Berechnung anzeigen lassen: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def fib(n):&lt;br /&gt;    """liefert die Fibonaccizahl zu n."""&lt;br /&gt;    f = 0&lt;br /&gt;    a = 0&lt;br /&gt;    b = 1&lt;br /&gt;    i = 0&lt;br /&gt;    while i &amp;lt; n:&lt;br /&gt;        f = a + b&lt;br /&gt;        print(i, ":  f =", f, "a =", a, "b =", b) # Testausgabe&lt;br /&gt;        b, a = a, f&lt;br /&gt;        i += 1&lt;br /&gt;    return f&lt;br /&gt;&lt;br /&gt;print(fib(10))&lt;br /&gt;&lt;/pre&gt;..gibt dann folgendes aus: &lt;br /&gt;&lt;pre&gt;0 :  f = 1 a = 0 b = 1&lt;br /&gt;1 :  f = 1 a = 1 b = 0&lt;br /&gt;2 :  f = 2 a = 1 b = 1&lt;br /&gt;3 :  f = 3 a = 2 b = 1&lt;br /&gt;4 :  f = 5 a = 3 b = 2&lt;br /&gt;5 :  f = 8 a = 5 b = 3&lt;br /&gt;6 :  f = 13 a = 8 b = 5&lt;br /&gt;7 :  f = 21 a = 13 b = 8&lt;br /&gt;8 :  f = 34 a = 21 b = 13&lt;br /&gt;9 :  f = 55 a = 34 b = 21&lt;br /&gt;55&lt;br /&gt;&lt;/pre&gt;Die Ausgabe einer Tabelle mithilfe der Funktion &lt;code class="prettyprint"&gt;fib()&lt;/code&gt; ist einfach (oder doch etwas kompliziert, weil die eckigen Klammern dazukommen): &lt;br /&gt;&lt;pre class="prettyprint"&gt;def fibtab(n):&lt;br /&gt;    """erzeugt eine Tabelle der Fibonaccizahlen bis inclusive n.&lt;br /&gt;    z.B. gibt fibtab(10) folgendes aus:&lt;br /&gt;        [0, 1, 1, 2, 3, 5, 8]&lt;br /&gt;    oder fibtab(100):&lt;br /&gt;        [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]&lt;br /&gt;    Hinweis:&lt;br /&gt;        verwenden Sie als Zeilenumbruch ", " beim print, also&lt;br /&gt;            print(wert, end=', ')&lt;br /&gt;        außer natürlich beim letzten Wert, hier ist "]" gefordert.&lt;br /&gt;    """&lt;br /&gt;    i = 0&lt;br /&gt;    print("[", end = "")&lt;br /&gt;    f = fib(i)&lt;br /&gt;    while f &amp;lt;= n:&lt;br /&gt;        print(f, end = "")&lt;br /&gt;        i += 1&lt;br /&gt;        f = fib(i)&lt;br /&gt;        if f &amp;gt; n:&lt;br /&gt;            print("]")&lt;br /&gt;        else:&lt;br /&gt;            print(", ", end = "")&lt;br /&gt;&lt;/pre&gt;Wir müssen sicherstellen, dass zunächst &lt;code class="prettyprint"&gt;"["&lt;/code&gt; ohne Zeilenumbruch ausgegeben wird. Die Funktion &lt;code class="prettyprint"&gt;print(...)&lt;/code&gt; hat einen optionalen Parameter &lt;code class="prettyprint"&gt;end&lt;/code&gt;, der angibt, was zum Schluss ausgegeben werden soll. Standardmäßig ist das &lt;code class="prettyprint"&gt;"\n"&lt;/code&gt;, was einen Zeilenumbruch bewirkt. Setzt man den Wert &lt;code class="prettyprint"&gt;end = ""&lt;/code&gt;, so wird ein Leerstring, also nichts, ausgegeben. In der Schleife muss man noch prüfen, ob man das Ende erreicht hat und in diesem Fall &lt;code class="prettyprint"&gt;"]"&lt;/code&gt; (mit Zeilenumbruch) ausgibt. Im Normalfall wird ein Komma ohne Zeilenumbruch ausgegeben (letzte Zeile). &lt;b&gt;Beachte&lt;/b&gt;n Sie, dass der Parameter &lt;code&gt;n&lt;/code&gt; hier die Grenze der Fibonaccizahl angibt und nicht die wievielte (wie bei &lt;code class="prettyprint"&gt;fib(n)&lt;/code&gt;).  Die Lösung zum Beispiel, die Summe der Vielfachen von 3 und 5 kleiner als ein Maximum: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def sum_3_5(max):&lt;br /&gt;    """&lt;br /&gt;    bilde Summe der Vielfachen von 3 und 5 kleiner als max.&lt;br /&gt;    Beispielsweise liefert sum_3_5(10) 23, weil&lt;br /&gt;        die Vielfachen von 3 &amp;lt; 10 sind&lt;br /&gt;            3 + 6 + 9 = 18&lt;br /&gt;        die Vielfachen von 5 &amp;lt; 10 sind&lt;br /&gt;            5&lt;br /&gt;        18 + 5 = 23&lt;br /&gt;    sum_3_5(20) liefert 78, weil&lt;br /&gt;        3+  6+9+   12+15+18=63&lt;br /&gt;          5+    10+        =15 (15 ist in obiger Liste schon enthalten!)&lt;br /&gt;    sum_3_5(25) liefert 143, weil&lt;br /&gt;        3+  6+9+   12+   18+   21+24=93 (Vielfache von 5 stehen darunter)&lt;br /&gt;          5+    10+   15+   20      =50&lt;br /&gt;    sum_3_5(100) liefert 2318 (ohne Beweis)&lt;br /&gt;    """&lt;br /&gt;    summe = 0&lt;br /&gt;    i = 0&lt;br /&gt;    while i &amp;lt; max:&lt;br /&gt;        if i % 5 == 0:&lt;br /&gt;            summe += i&lt;br /&gt;        elif i % 3 == 0:&lt;br /&gt;            summe += i&lt;br /&gt;        i += 1&lt;br /&gt;    return summe&lt;br /&gt;&lt;/pre&gt;Die Laufvariable &lt;code&gt;i&lt;/code&gt; wird immer dann zur &lt;code&gt;summe&lt;/code&gt; dazugezählt, wenn sie durch 5 teilbar ist oder wenn sie durch 3 teilbar ist. Der Operator &lt;code&gt;%&lt;/code&gt; berechnet den Rest der Division. Ist der Rest 0, so ist die erste durch die zweite Zahl teilbar.  Das Beispiel zum finden des nächstkleineren bzw. gleichen Quadrats kann so mit einer Probiermethode gelöst werden: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def minquad(zahl):&lt;br /&gt;    """finde die nächstkleinere oder gleichgroße ganze Zahl, die eine &lt;br /&gt;    Quadratzahl ist. Beispiele:&lt;br /&gt;        minquad(16) -&amp;gt; 16 (weil 4 * 4 = 16 &amp;lt;= 16)&lt;br /&gt;        minquad(24) -&amp;gt; 24 (weil 4 * 4 = 16 &amp;lt;= 14)&lt;br /&gt;        minquad(25) -&amp;gt; 25 (weil 5 * 5 = 25 &amp;lt;= 25)&lt;br /&gt;        minquad(26) -&amp;gt; 25 (weil 5 * 5 = 25 &amp;lt;= 26)&lt;br /&gt;    """&lt;br /&gt;    i = 0&lt;br /&gt;    mq = 0&lt;br /&gt;    while i ** 2 &amp;lt;= zahl:&lt;br /&gt;        mq = i ** 2&lt;br /&gt;        i += 1&lt;br /&gt;    return mq&lt;br /&gt;&lt;/pre&gt;&lt;code class="prettyprint"&gt;i ** 2&lt;/code&gt; bedeutet i&lt;sup&gt;2&lt;/sup&gt;. Man könnte natürlich auch &lt;code class="prettyprint"&gt;i * i&lt;/code&gt; schreiben. Diese Funktion prüft einfach sukzessive alle Quadrate, bis eines gefunden wurde, das größer als die gegebene Zahl ist. Der Wert &lt;b&gt;davor&lt;/b&gt; (die Variable &lt;code class="prettyprint"&gt;mq&lt;/code&gt;) ist natürlich das Ergebnis, weil das der größte Wert war, für den die Bedingung gilt. Es geht natürlich schneller und einfacher, wenn man sich eine Formel überlegt:  &lt;br /&gt;&lt;pre class="prettyprint"&gt;from math import sqrt&lt;br /&gt;from math import floor&lt;br /&gt;def minquad(zahl):&lt;br /&gt;    """finde die nächstkleinere oder gleichgroße ganze Zahl, die eine &lt;br /&gt;    Quadratzahl ist. Beispiele:&lt;br /&gt;        minquad(16) -&amp;gt; 16 (weil 4 * 4 = 16 &amp;lt;= 16)&lt;br /&gt;        minquad(24) -&amp;gt; 16 (weil 4 * 4 = 16 &amp;lt;= 24)&lt;br /&gt;        minquad(25) -&amp;gt; 25 (weil 5 * 5 = 25 &amp;lt;= 25)&lt;br /&gt;        minquad(26) -&amp;gt; 25 (weil 5 * 5 = 25 &amp;lt;= 26)&lt;br /&gt;    """&lt;br /&gt;    return int(floor(sqrt(zahl))) ** 2&lt;br /&gt;&lt;/pre&gt;Die Funktion &lt;code class="prettyprint"&gt;floor(x)&lt;/code&gt; liefert die nächstkleinere ganze Zahl zu x (bei positiven Zahlen schneidet dir Funktion die Nachkommastellen der übergebenen Zahl ab). Z.B: &lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from math import floor&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; floor(3.14)&lt;br /&gt;3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; floor(3)&lt;br /&gt;3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; floor(-3.14)&lt;br /&gt;-4&lt;br /&gt;&lt;/pre&gt;Wenn man die nächstkleinere ganze Zahl der Wurzel quadriert, hat man das gewünschte Ergebnis.  Die Turtle-Funktion zum Dreieckzeichnen könnte wie folgt aussehen und braucht nicht weiter erklärt werden: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def dreieck(a, w):&lt;br /&gt;    """zeichnet ein gleichseitiges Dreieck der Seitenlänge a, gedreht um&lt;br /&gt;    den Winkel w. w = 0 bedeutet, dass die eine Seite horizional ist. w = 90&lt;br /&gt;    bedeutet, dass das Dreieck nach LINKS um 90° gedreht ist, d.h. eine Seite&lt;br /&gt;    ist vertikal.&lt;br /&gt;    Das Dreieck soll rechts neben des angegebenen Punktes gezeichnet werden.&lt;br /&gt;    """&lt;br /&gt;    # nehme an Turtle sieht nach oben (wie auch beim Starten)&lt;br /&gt;    right(90 - w)&lt;br /&gt;    pendown()&lt;br /&gt;    for i in range(3):&lt;br /&gt;        forward(a)&lt;br /&gt;        left(120)&lt;br /&gt;    penup()&lt;br /&gt;    left(90 - w)&lt;br /&gt;&lt;/pre&gt;Um ein Dreieck an eine bestimmte Position zu setzen, kann zusätzlich die Funktion &lt;code class="prettyprint"&gt;setpos(x, y)&lt;/code&gt;, welche die Turtle an die Postion x,y setzt, verwendet werden: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def dreieck_an_pos(a, w, x, y):&lt;br /&gt;    """zeichnet ein Dreieck mit Hilfe der Funktion dreieck(a, w) an der &lt;br /&gt;    Position x, y."""&lt;br /&gt;    penup()&lt;br /&gt;    setpos(x, y)&lt;br /&gt;    dreieck(a, w)&lt;br /&gt;&lt;/pre&gt;Abgesehen von den Turtle-Funktionen können Sie die Funktionen direkt auf der Website &lt;a href="http://codepad.org/"&gt;http://codepad.org&lt;/a&gt; testen. Dort können Sie auch andere Programmiersprachen probieren. Die Python-Version ist leider nicht aktuell, daher könnte es sein, dass einiges doch nicht direkt so funktioniert. Diese einfachen Beispiele funktionieren aber.&lt;br /&gt;Hier ist zu &lt;code class="prettyprint"&gt;minquad(zahl)&lt;/code&gt; zu sehen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gmjWOaOfpfo/TPgTiMOakqI/AAAAAAAAEdc/8SV_3qRR3zA/s1600/codepad.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="289" src="http://1.bp.blogspot.com/_gmjWOaOfpfo/TPgTiMOakqI/AAAAAAAAEdc/8SV_3qRR3zA/s640/codepad.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gmjWOaOfpfo/TPgThsdLj6I/AAAAAAAAEdY/XoMjv1by1Fw/s1600/codepad1.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="588" src="http://4.bp.blogspot.com/_gmjWOaOfpfo/TPgThsdLj6I/AAAAAAAAEdY/XoMjv1by1Fw/s640/codepad1.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-8949910210589545229?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/8949910210589545229/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/12/musterlosung-zu-ubungsbeispiele-fur.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/8949910210589545229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/8949910210589545229'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/12/musterlosung-zu-ubungsbeispiele-fur.html' title='Musterlösung zu Übungsbeispiele für Python vom 1.12.2010 (POS1: 1BHIF)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gmjWOaOfpfo/TPgTiMOakqI/AAAAAAAAEdc/8SV_3qRR3zA/s72-c/codepad.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3006451960325053006</id><published>2010-12-02T12:20:00.001+01:00</published><updated>2010-12-02T15:29:18.158+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='Lösung'/><title type='text'>Datum in C selbst gebastelt</title><content type='html'>Datumsberechnungen sind immer wieder eine Quelle großer langwieriger, fehleranfälliger Programmteile. Vor allem in Sprachen, die solche Datumsoperationen nicht unterstützen. Sie sind auch immer wieder geeignet, Programmieren zu üben. Hier die Musterlösung zu einem einfachen Kalenderprogramm in C, bei dem ein Großteil der Datumsfunktionen selbstgestrickt sind. Viel Spaß damit!&lt;br /&gt;&lt;b&gt;Verwendung:&lt;/b&gt;&lt;br /&gt;Ohne Parameter gibt es einfach das aktuelle Monat mit Markierung &lt;code&gt;&amp;lt; 2&amp;gt;&lt;/code&gt; für den heutigen Tag und &lt;code&gt;: 8:&lt;/code&gt; als Markierung für österreichische Feiertage. Danach wird die Liste der Feiertage ausgegeben.&lt;br /&gt;&lt;pre&gt;$ ./cal &lt;br /&gt;Dezember 2010&lt;br /&gt;&lt;br /&gt;    Montag       6  13  20  27     &lt;br /&gt;  Dienstag       7  14  21  28     &lt;br /&gt;  Mittwoch   1 : 8: 15  22  29     &lt;br /&gt;Donnerstag &lt; 2&gt;  9  16  23  30     &lt;br /&gt;   Freitag   3  10  17 :24::31:    &lt;br /&gt;   Samstag   4  11  18 :25:        &lt;br /&gt;   Sonntag : 5::12::19::26:    &lt;br /&gt;&lt;br /&gt; 5.12. 2. Advent&lt;br /&gt; 8.12. Maria Empfängnis&lt;br /&gt;12.12. 3. Advent&lt;br /&gt;19.12. 4. Advent&lt;br /&gt;24.12. Heiligabend&lt;br /&gt;25.12. Christtag&lt;br /&gt;26.12. Stefanitag&lt;br /&gt;31.12. Silvester :-)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here comes the Source...&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/*&lt;br /&gt; * File:    cal.c&lt;br /&gt; *&lt;br /&gt; * Zweck:   Kalenderprogramm&lt;br /&gt; *          ...für ein gegebenes Monat.&lt;br /&gt; *          mit/ohne argc/argv&lt;br /&gt; *&lt;br /&gt; * Autor:   Harald Haberstroh&lt;br /&gt; *&lt;br /&gt; * Algorithmus:&lt;br /&gt; *&lt;br /&gt; * History: 2002-09-29&lt;br /&gt; *          2003-10-15, Feiertage + Argumente von main()&lt;br /&gt; *          2004-11-05, Liste der Feiertage&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;/*--------------------------- includes ------------------------------*/&lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;#include &amp;lt;string.h&gt;&lt;br /&gt;#include &amp;lt;stdlib.h&gt;&lt;br /&gt;#include &amp;lt;assert.h&gt;&lt;br /&gt;#include &amp;lt;time.h&gt;&lt;br /&gt;&lt;br /&gt;/*--------------------------- defines -------------------------------*/&lt;br /&gt;#define  WOCHENTAG   3                 /* Wochentag des 1.1.1582 */&lt;br /&gt;#define  MONTAG 0&lt;br /&gt;#define  DIENSTAG 1&lt;br /&gt;#define  MITTWOCH 2&lt;br /&gt;#define  DONNERSTAG 3&lt;br /&gt;#define  FREITAG 4&lt;br /&gt;#define  SAMSTAG 5&lt;br /&gt;#define  SONNTAG 6&lt;br /&gt;&lt;br /&gt;/*--------------------------- typedefs ------------------------------*/&lt;br /&gt;&lt;br /&gt;/*--------------------------- globals -------------------------------*/&lt;br /&gt;enum {&lt;br /&gt;   KEIN = 0,&lt;br /&gt;   NEUJAHR,&lt;br /&gt;   HL3KOENIGE,&lt;br /&gt;   ASCHERMITTWOCH,&lt;br /&gt;   PALMSONNTAG,&lt;br /&gt;   KARFREITAG,&lt;br /&gt;   OSTERSONNTAG,&lt;br /&gt;   OSTERMONTAG,&lt;br /&gt;   STAATSFEIERTAG,&lt;br /&gt;   MUTTERTAG,&lt;br /&gt;   PFINGSTSONNTAG,&lt;br /&gt;   PFINGSTMONTAG,&lt;br /&gt;   DREIFALTIGKEITSSONNTAG,&lt;br /&gt;   FRONLEICHNAM,&lt;br /&gt;   MARIAHIMMELFAHRT,&lt;br /&gt;   NATIONALFEIERTAG,&lt;br /&gt;   REFORMATIONSTAG,&lt;br /&gt;   ALLERHEILIGEN,&lt;br /&gt;   ALLERSEELEN,&lt;br /&gt;   MARIAEMPFAENGNIS,&lt;br /&gt;   ADVENT1,&lt;br /&gt;   ADVENT2,&lt;br /&gt;   ADVENT3,&lt;br /&gt;   ADVENT4,&lt;br /&gt;   HEILIGABEND,&lt;br /&gt;   CHRISTIANI,&lt;br /&gt;   STEFANI,&lt;br /&gt;   SILVESTER&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*-------------------------- prototypes -----------------------------*/&lt;br /&gt;void printFeiertage(int jahr, int monat);&lt;br /&gt;int tagemonat( int jahr, int monat );&lt;br /&gt;int sonntag( int jahr, int monat, int tag );&lt;br /&gt;void tag2datum( int tagzahl, int *jahr, int *monat, int *tag );&lt;br /&gt;void ostern( int jahr, int *monat, int *tag );&lt;br /&gt;int feiertag(int jahr, int monat, int tag);&lt;br /&gt;int anzProMonat(int jahr, int monat);&lt;br /&gt;void printcal(int start, int anz, int heute, int monat, int jahr);&lt;br /&gt;int schaltjahr( int Jahr );&lt;br /&gt;int Anzahl_Tage( int Jahr, int Monat, int Tag );&lt;br /&gt;&lt;br /&gt;/*----------------------------- main --------------------------------*/&lt;br /&gt;int main( int argc, char *argv[] )&lt;br /&gt;{&lt;br /&gt;   int tage, tag, monat, jahr, start;&lt;br /&gt;   struct tm *zeit;&lt;br /&gt;   time_t   sec;&lt;br /&gt;&lt;br /&gt;   if (argc == 2 &amp;&amp; strcmp(argv[1], "-i") == 0)&lt;br /&gt;   {                                   /* interaktiv */&lt;br /&gt;      printf("Jahr&gt; ");scanf("%d", &amp;jahr);&lt;br /&gt;      printf("Monat&gt; ");scanf("%d", &amp;monat);&lt;br /&gt;      printf("Tag (0 für kein bestimmter)&gt; ");scanf("%d", &amp;tag);&lt;br /&gt;      if (tag == 0)&lt;br /&gt;      {&lt;br /&gt;         tag = 1;&lt;br /&gt;         if (1 &lt;= monat &amp;&amp; monat &lt;= 12 &amp;&amp;&lt;br /&gt;             1582 &lt; jahr &amp;&amp; jahr &lt; 3000)&lt;br /&gt;         {&lt;br /&gt;            tage = Anzahl_Tage( jahr, monat, 1);&lt;br /&gt;            start = (tage + WOCHENTAG) % 7;&lt;br /&gt;            printcal(start, anzProMonat(jahr, monat), 0, monat, jahr);&lt;br /&gt;            return 0;&lt;br /&gt;         }&lt;br /&gt;         else&lt;br /&gt;         {&lt;br /&gt;            fprintf(stderr, "Monat zwischen 1 und 12 und Jahr zwischen "&lt;br /&gt;                            "1583 und 2999\n");&lt;br /&gt;            return 2;&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      if (1 &lt;= monat &amp;&amp; monat &lt;= 12 &amp;&amp;&lt;br /&gt;          1582 &lt; jahr &amp;&amp; jahr &lt; 3000 &amp;&amp;&lt;br /&gt;          1 &lt;= tag &amp;&amp; tag &lt;= anzProMonat(jahr,monat))&lt;br /&gt;      {&lt;br /&gt;         tage = Anzahl_Tage( jahr, monat, 1);&lt;br /&gt;         start = (tage + WOCHENTAG) % 7;&lt;br /&gt;         printcal(start, anzProMonat(jahr, monat), tag, monat, jahr);&lt;br /&gt;         return 0;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;         fprintf(stderr, "Monat zwischen 1 und 12 und Jahr zwischen "&lt;br /&gt;                         "1583 und 2999\n"&lt;br /&gt;                         "[Tag zwischen 1 und Anzahl für dieses Monat]\n");&lt;br /&gt;         return 2;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   else if (argc == 3)                      /* Monat, Jahr */&lt;br /&gt;   {&lt;br /&gt;      monat = atoi(argv[1]);&lt;br /&gt;      jahr = atoi(argv[2]);&lt;br /&gt;      tag = 1;&lt;br /&gt;      if (1 &lt;= monat &amp;&amp; monat &lt;= 12 &amp;&amp;&lt;br /&gt;          1582 &lt; jahr &amp;&amp; jahr &lt; 3000)&lt;br /&gt;      {&lt;br /&gt;         tage = Anzahl_Tage( jahr, monat, 1);&lt;br /&gt;         start = (tage + WOCHENTAG) % 7;&lt;br /&gt;         printcal(start, anzProMonat(jahr, monat), 0, monat, jahr);&lt;br /&gt;         return 0;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;         fprintf(stderr, "Monat zwischen 1 und 12 und Jahr zwischen "&lt;br /&gt;                         "1583 und 2999\n");&lt;br /&gt;         return 2;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   else if (argc == 4)                 /* ganzes Datum */&lt;br /&gt;   {&lt;br /&gt;      monat = atoi(argv[2]);&lt;br /&gt;      jahr = atoi(argv[3]);&lt;br /&gt;      tag = atoi(argv[1]);&lt;br /&gt;      if (1 &lt;= monat &amp;&amp; monat &lt;= 12 &amp;&amp;&lt;br /&gt;          1582 &lt; jahr &amp;&amp; jahr &lt; 3000 &amp;&amp;&lt;br /&gt;          1 &lt;= tag &amp;&amp; tag &lt;= anzProMonat(jahr,monat))&lt;br /&gt;      {&lt;br /&gt;         tage = Anzahl_Tage( jahr, monat, 1);&lt;br /&gt;         start = (tage + WOCHENTAG) % 7;&lt;br /&gt;         printcal(start, anzProMonat(jahr, monat), tag, monat, jahr);&lt;br /&gt;         return 0;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;         fprintf(stderr, "Monat zwischen 1 und 12 und Jahr zwischen "&lt;br /&gt;                         "1583 und 2999\n"&lt;br /&gt;                         "[Tag zwischen 1 und Anzahl für dieses Monat]\n");&lt;br /&gt;         return 2;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   else if (argc == 1)                 /* aktuelles Monat */&lt;br /&gt;   {&lt;br /&gt;      time(&amp;sec);&lt;br /&gt;      zeit = localtime(&amp;sec);&lt;br /&gt;      tag = zeit-&gt;tm_mday;&lt;br /&gt;      monat = zeit-&gt;tm_mon + 1;&lt;br /&gt;      jahr = zeit-&gt;tm_year + 1900;&lt;br /&gt;      tage = Anzahl_Tage( jahr, monat, 1);&lt;br /&gt;      start = (tage + WOCHENTAG) % 7;&lt;br /&gt;      printcal(start, anzProMonat(jahr, monat), tag, monat, jahr);&lt;br /&gt;      return 0;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;      fprintf(stderr, "Aufruf:\n%s [[tag] monat jahr]\n", argv[0]);&lt;br /&gt;      return 1;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*-------------------------- functions ------------------------------*/&lt;br /&gt;/** Kalender ausgeben&lt;br /&gt; *  start ... Wochentag des 1. dieses Monats&lt;br /&gt; *  anz   ... Anzahl der Tage dieses Monats&lt;br /&gt; *  heute ... Datum des heutigen Tages, 0, falls in einem anderen Monat&lt;br /&gt; *  monat ... Monat (1..12)&lt;br /&gt; *  jahr&lt;br /&gt; */&lt;br /&gt;void printcal(int start, int anz, int heute, int monat, int jahr)&lt;br /&gt;{&lt;br /&gt;   char *tage[] = { "Montag", "Dienstag", "Mittwoch", "Donnerstag",&lt;br /&gt;                    "Freitag", "Samstag", "Sonntag" };&lt;br /&gt;   char *monate[] = { "Jänner", "Februar", "März", "April",&lt;br /&gt;                      "Mai", "Juni", "Juli", "August",&lt;br /&gt;                      "September", "Oktober", "November", "Dezember" };&lt;br /&gt;   int i;&lt;br /&gt;   int tag;&lt;br /&gt;&lt;br /&gt;   printf("%s %d\n\n", monate[monat-1], jahr);&lt;br /&gt;   for (i = 0; i &lt; 7; i++)&lt;br /&gt;   {&lt;br /&gt;      printf("%10s ", tage[i]);&lt;br /&gt;      for (tag = i + 1 - start; tag &lt; anz + 7 + start; tag += 7)&lt;br /&gt;         if (tag == heute &amp;&amp; feiertag(jahr, monat, tag)&lt;br /&gt;               &amp;&amp; tag &gt;= 1 &amp;&amp; tag &lt;= anz)&lt;br /&gt;            printf("[%2d]", tag);&lt;br /&gt;         else if (tag == heute &amp;&amp; tag &gt;= 1 &amp;&amp; tag &lt;= anz)&lt;br /&gt;            printf("&lt;%2d&gt;", tag);&lt;br /&gt;         else if (feiertag(jahr, monat, tag) &amp;&amp; tag &gt;= 1 &amp;&amp; tag &lt;= anz)&lt;br /&gt;            printf(":%2d:", tag);&lt;br /&gt;         else if (tag &gt;= 1 &amp;&amp; tag &lt;= anz)&lt;br /&gt;            printf("%3d ", tag);&lt;br /&gt;         else&lt;br /&gt;            printf("    ");&lt;br /&gt;      printf("\n");&lt;br /&gt;   }&lt;br /&gt;   printf("\n");&lt;br /&gt;   printFeiertage(jahr, monat);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Function schaltjahr&lt;br /&gt; *&lt;br /&gt; * Zweck:   Liefert 1, wenn angegebenes Jahr ein Schaltjahr ist&lt;br /&gt; *&lt;br /&gt; * Algorithmus:&lt;br /&gt; *          ab 1582 gilt folgende Regel für Schaltjahre:&lt;br /&gt; *             Ist die Jahreszahl durch 400 teilbar oder&lt;br /&gt; *             ist die Jahreszahl durch 4 teilbar aber nicht durch 100&lt;br /&gt; *             dann ist das Jahr ein Schaltjahr&lt;br /&gt; *&lt;br /&gt; * Parameter:&lt;br /&gt; *       IN: Jahr&lt;br /&gt; *      OUT:&lt;br /&gt; *&lt;br /&gt; * Return-Wert: 1 ... Schaltjahr&lt;br /&gt; *              0 ... sonst&lt;br /&gt; */&lt;br /&gt;int schaltjahr( int Jahr )&lt;br /&gt;{&lt;br /&gt;   if ( Jahr % 400 == 0 )&lt;br /&gt;      return 1;&lt;br /&gt;   else if ( Jahr % 100 == 0 )&lt;br /&gt;      return 0;&lt;br /&gt;   else if ( Jahr % 4 == 0 )&lt;br /&gt;      return 1;&lt;br /&gt;   else &lt;br /&gt;      return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int anzProMonat(int jahr, int monat)&lt;br /&gt;{&lt;br /&gt;   switch(monat)&lt;br /&gt;   {&lt;br /&gt;      case 2:&lt;br /&gt;         return 28 + schaltjahr(jahr);&lt;br /&gt;         break;&lt;br /&gt;      case 4:&lt;br /&gt;      case 6:&lt;br /&gt;      case 9:&lt;br /&gt;      case 11:&lt;br /&gt;         return 30;&lt;br /&gt;         break;&lt;br /&gt;      default:&lt;br /&gt;         return 31;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Function Anzahl_Tage&lt;br /&gt; *&lt;br /&gt; * Zweck:    Bestimmt die Anzahl der Tage ab 1.1.1582&lt;br /&gt; *&lt;br /&gt; * Algorithmus:&lt;br /&gt; *           Tag + Anzahl Tage für Monate + Anzahl Tage für Jahre&lt;br /&gt; *&lt;br /&gt; * Parameter:&lt;br /&gt; *       IN: Jahr, Monat, Tag&lt;br /&gt; *      OUT:&lt;br /&gt; *&lt;br /&gt; * Return-Wert: Anzahl der Tage ab 1.1.1582&lt;br /&gt; */&lt;br /&gt;int Anzahl_Tage( int Jahr, int Monat, int Tag )&lt;br /&gt;{&lt;br /&gt;   int   j;&lt;br /&gt;   int   m;&lt;br /&gt;   int   tage = Tag; /* Monatstag */&lt;br /&gt;&lt;br /&gt;   /*&lt;br /&gt;    * Tage für Jahre berechnen&lt;br /&gt;    */&lt;br /&gt;   for ( j = 1582; j &lt; Jahr; j++ )&lt;br /&gt;      tage += 365 + schaltjahr( j );&lt;br /&gt;&lt;br /&gt;   /*&lt;br /&gt;    * Tage für Monate berechnen&lt;br /&gt;    */&lt;br /&gt;   for ( m = 1; m &lt; Monat; m++ )&lt;br /&gt;      switch( m )&lt;br /&gt;      {&lt;br /&gt;         case 2:&lt;br /&gt;            tage += 28 + schaltjahr( Jahr );&lt;br /&gt;            break;&lt;br /&gt;         case 4:&lt;br /&gt;         case 6:&lt;br /&gt;         case 9:&lt;br /&gt;         case 11:&lt;br /&gt;            tage += 30;&lt;br /&gt;            break;&lt;br /&gt;         default:&lt;br /&gt;            tage += 31;&lt;br /&gt;      }&lt;br /&gt;   return( tage );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/** Bestimmt Feiertag.&lt;br /&gt; *  @param jahr&lt;br /&gt; *  @param monat&lt;br /&gt; *  @param tag&lt;br /&gt; *  @return Nummer des Feiertags, 0 sonst&lt;br /&gt; */&lt;br /&gt;int feiertag(int jahr, int monat, int tag)&lt;br /&gt;{&lt;br /&gt;   int tagzahl, j, m, t;&lt;br /&gt;   ostern(jahr, &amp;m, &amp;t);&lt;br /&gt;   tagzahl = Anzahl_Tage(jahr, m, t);&lt;br /&gt;   &lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Ostern */&lt;br /&gt;      return OSTERSONNTAG;&lt;br /&gt;   tag2datum(tagzahl + 1, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Ostern */&lt;br /&gt;      return OSTERMONTAG;&lt;br /&gt;   tag2datum(tagzahl - 46, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Aschermittwoch */&lt;br /&gt;      return ASCHERMITTWOCH;&lt;br /&gt;   tag2datum(tagzahl - 7, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Palmsonntag */&lt;br /&gt;      return PALMSONNTAG;&lt;br /&gt;   tag2datum(tagzahl - 2, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Karfreitag */&lt;br /&gt;      return KARFREITAG;&lt;br /&gt;   tag2datum(tagzahl + 49, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Pfingstsonntag */&lt;br /&gt;      return PFINGSTSONNTAG;&lt;br /&gt;   tag2datum(tagzahl + 50, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Pfingstmontag */&lt;br /&gt;      return PFINGSTMONTAG;&lt;br /&gt;   tag2datum(tagzahl + 56, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Dreifaltigkeitssonntag */&lt;br /&gt;      return DREIFALTIGKEITSSONNTAG;&lt;br /&gt;   tag2datum(tagzahl + 60, &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == m &amp;&amp; tag == t)         /* Fronleichnam */&lt;br /&gt;      return FRONLEICHNAM;&lt;br /&gt;&lt;br /&gt;   if (monat == 1 &amp;&amp; tag == 1)         /* Neujahr */&lt;br /&gt;      return NEUJAHR;&lt;br /&gt;   if (monat == 1 &amp;&amp; tag == 6)         /* Heilige 3 Könige */&lt;br /&gt;      return HL3KOENIGE;&lt;br /&gt;   if (monat == 5 &amp;&amp; tag == 1)         /* Staatsfeiertag */&lt;br /&gt;      return STAATSFEIERTAG;&lt;br /&gt;   tag2datum(sonntag(jahr, 5, 13), &amp;j, &amp;m, &amp;t);&lt;br /&gt;   if (monat == 5 &amp;&amp; tag == t)         /* Muttertag FIXME */&lt;br /&gt;      return MUTTERTAG;&lt;br /&gt;   if (monat == 8 &amp;&amp; tag == 15)        /* Mariahimmelfahrt */&lt;br /&gt;      return MARIAHIMMELFAHRT;&lt;br /&gt;   if (monat == 10 &amp;&amp; tag == 26)       /* Nationalfeiertag */&lt;br /&gt;      return NATIONALFEIERTAG;&lt;br /&gt;   if (monat == 10 &amp;&amp; tag == 31)       /* Reformationstag */&lt;br /&gt;      return REFORMATIONSTAG;&lt;br /&gt;   if (monat == 11 &amp;&amp; tag == 1)        /* Allerheiligen */&lt;br /&gt;      return ALLERHEILIGEN;&lt;br /&gt;   if (monat == 11 &amp;&amp; tag == 2)        /* Allersselen */&lt;br /&gt;      return ALLERSEELEN;&lt;br /&gt;   if (monat == 11)&lt;br /&gt;   {&lt;br /&gt;      if (sonntag(jahr, 12, 24) == Anzahl_Tage(jahr, 12, 24))&lt;br /&gt;         tagzahl = sonntag(jahr, 12, 24) - 21;&lt;br /&gt;      else&lt;br /&gt;         tagzahl = sonntag(jahr, 12, 24) - 28;&lt;br /&gt;      tag2datum(tagzahl, &amp;j, &amp;m, &amp;t);&lt;br /&gt;      if (tag == t &amp;&amp; m == 11)         /* 1. Advent */&lt;br /&gt;         return ADVENT1;&lt;br /&gt;   }&lt;br /&gt;   if (monat == 12)&lt;br /&gt;   {&lt;br /&gt;      if (tag == 8)                    /* Maria Emfängnis */&lt;br /&gt;         return MARIAEMPFAENGNIS;&lt;br /&gt;&lt;br /&gt;      if (sonntag(jahr, 12, 24) == Anzahl_Tage(jahr, 12, 24))&lt;br /&gt;         tagzahl = sonntag(jahr, 12, 24) - 21;&lt;br /&gt;      else&lt;br /&gt;         tagzahl = sonntag(jahr, 12, 24) - 28;&lt;br /&gt;      tag2datum(tagzahl, &amp;j, &amp;m, &amp;t);&lt;br /&gt;      if (tag == t &amp;&amp; m == 12)         /* 1. Advent */&lt;br /&gt;         return ADVENT1;&lt;br /&gt;      tag2datum(tagzahl+7, &amp;j, &amp;m, &amp;t);&lt;br /&gt;      if (tag == t)                    /* 2. Advent */&lt;br /&gt;         return ADVENT2;&lt;br /&gt;      tag2datum(tagzahl+14, &amp;j, &amp;m, &amp;t);&lt;br /&gt;      if (tag == t)                    /* 3. Advent */&lt;br /&gt;         return ADVENT3;&lt;br /&gt;      tag2datum(tagzahl+21, &amp;j, &amp;m, &amp;t);&lt;br /&gt;      if (tag == t)                    /* 4. Advent */&lt;br /&gt;         return ADVENT4;&lt;br /&gt;      if (tag == 24)                   /* Hl. Abend */&lt;br /&gt;         return HEILIGABEND;&lt;br /&gt;      if (tag == 25)                   /* Christiani */&lt;br /&gt;         return CHRISTIANI;&lt;br /&gt;      if (tag == 26)                   /* Stefanitag */&lt;br /&gt;         return STEFANI;&lt;br /&gt;      if (tag == 31)                   /* Silvester :-) */&lt;br /&gt;         return SILVESTER;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return KEIN;                        /* Kein Feiertag */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ostern( int jahr, int *monat, int *tag )&lt;br /&gt;{&lt;br /&gt;   int a = jahr % 19;&lt;br /&gt;   int b = jahr / 100;&lt;br /&gt;   int c = jahr % 100;&lt;br /&gt;   int d = b / 4;&lt;br /&gt;   int e = b % 4;&lt;br /&gt;   int f = ( b + 8 ) / 25;&lt;br /&gt;   int g = ( b - f + 1 ) / 3;&lt;br /&gt;   int h = ( 19 * a + b - d - g + 15 ) % 30;&lt;br /&gt;   int i = c / 4;&lt;br /&gt;   int k = c % 4;&lt;br /&gt;   int l = ( 32 + 2 * e + 2 * i -h -k ) % 7;&lt;br /&gt;   int m = ( a + 11 * h + 22 * l ) / 451;&lt;br /&gt;   int p = ( h + l - 7 * m + 114 ) % 31;&lt;br /&gt;&lt;br /&gt;   *monat = ( h + l - 7 * m + 114 ) / 31;&lt;br /&gt;   *tag = p + 1;&lt;br /&gt;}&lt;br /&gt;void tag2datum( int tagzahl, int *jahr, int *monat, int *tag )&lt;br /&gt;{&lt;br /&gt;   /*&lt;br /&gt;    * Jahr berechnen&lt;br /&gt;    */&lt;br /&gt;   *jahr = 1582;&lt;br /&gt;   while ( tagzahl &gt; 365 + schaltjahr( *jahr ) )&lt;br /&gt;   {&lt;br /&gt;      tagzahl -= 365 + schaltjahr( *jahr );&lt;br /&gt;      (*jahr)++;&lt;br /&gt;   }&lt;br /&gt;   /*&lt;br /&gt;    * Monat&lt;br /&gt;    */&lt;br /&gt;   for ( *monat = 1; tagzahl &gt; tagemonat( *jahr, *monat ); (*monat)++ )&lt;br /&gt;      tagzahl -= tagemonat( *jahr, *monat );&lt;br /&gt;   /*&lt;br /&gt;    * Tag&lt;br /&gt;    */&lt;br /&gt;   *tag = tagzahl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int sonntag( int jahr, int monat, int tag )&lt;br /&gt;{&lt;br /&gt;   int tagzahl = Anzahl_Tage( jahr, monat, tag );&lt;br /&gt;   int wt = ( DONNERSTAG + tagzahl ) % 7;&lt;br /&gt;   if ( wt == SONNTAG ) /* bereits Sonntag */&lt;br /&gt;      return tagzahl;&lt;br /&gt;   else&lt;br /&gt;      return tagzahl + ( SONNTAG - wt );&lt;br /&gt;}&lt;br /&gt;int tagemonat( int jahr, int monat )&lt;br /&gt;{&lt;br /&gt;   switch( monat )&lt;br /&gt;   {&lt;br /&gt;      case 2:&lt;br /&gt;         return 28 + schaltjahr( jahr );&lt;br /&gt;         break;&lt;br /&gt;      case 4:&lt;br /&gt;      case 6:&lt;br /&gt;      case 9:&lt;br /&gt;      case 11:&lt;br /&gt;         return 30;&lt;br /&gt;         break;&lt;br /&gt;      default:&lt;br /&gt;         return 31;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/** gib eine Liste der Feiertage aus.&lt;br /&gt; *  @param jahr IN&lt;br /&gt; *  @param monat OUT&lt;br /&gt; */&lt;br /&gt;void printFeiertage(int jahr, int monat)&lt;br /&gt;{&lt;br /&gt;   int i;&lt;br /&gt;   char *bez = "";&lt;br /&gt;   for (i = 1; i &lt;= tagemonat(jahr, monat); i++)&lt;br /&gt;   {&lt;br /&gt;      bez = "";&lt;br /&gt;      switch (feiertag(jahr, monat, i))&lt;br /&gt;      {&lt;br /&gt;         case NEUJAHR:&lt;br /&gt;            bez = "Neujahr";&lt;br /&gt;            break;&lt;br /&gt;         case HL3KOENIGE:&lt;br /&gt;            bez = "Heilige Dreikönige";&lt;br /&gt;            break;&lt;br /&gt;         case ASCHERMITTWOCH:&lt;br /&gt;            bez = "Aschermittwoch";&lt;br /&gt;            break;&lt;br /&gt;         case PALMSONNTAG:&lt;br /&gt;            bez = "Palmsonntag";&lt;br /&gt;            break;&lt;br /&gt;         case KARFREITAG:&lt;br /&gt;            bez = "Karfreitag";&lt;br /&gt;            break;&lt;br /&gt;         case OSTERSONNTAG:&lt;br /&gt;            bez = "Ostersonntag";&lt;br /&gt;            break;&lt;br /&gt;         case OSTERMONTAG:&lt;br /&gt;            bez = "Ostermontag";&lt;br /&gt;            break;&lt;br /&gt;         case STAATSFEIERTAG:&lt;br /&gt;            bez = "Staatsfeiertag";&lt;br /&gt;            break;&lt;br /&gt;         case MUTTERTAG:&lt;br /&gt;            bez = "Muttertag";&lt;br /&gt;            break;&lt;br /&gt;         case PFINGSTSONNTAG:&lt;br /&gt;            bez = "Pfingstsonntag";&lt;br /&gt;            break;&lt;br /&gt;         case PFINGSTMONTAG:&lt;br /&gt;            bez = "Pfingstmontag";&lt;br /&gt;            break;&lt;br /&gt;         case DREIFALTIGKEITSSONNTAG:&lt;br /&gt;            bez = "Dreifaltigkeitssonntag";&lt;br /&gt;            break;&lt;br /&gt;         case FRONLEICHNAM:&lt;br /&gt;            bez = "Fronleichnam";&lt;br /&gt;            break;&lt;br /&gt;         case MARIAHIMMELFAHRT:&lt;br /&gt;            bez = "Maria Himmelfahrt";&lt;br /&gt;            break;&lt;br /&gt;         case NATIONALFEIERTAG:&lt;br /&gt;            bez = "Nationalfeiertag";&lt;br /&gt;            break;&lt;br /&gt;         case REFORMATIONSTAG:&lt;br /&gt;            bez = "Reformationstag";&lt;br /&gt;            break;&lt;br /&gt;         case ALLERHEILIGEN:&lt;br /&gt;            bez = "Allerheiligen";&lt;br /&gt;            break;&lt;br /&gt;         case ALLERSEELEN:&lt;br /&gt;            bez = "Allerseelen";&lt;br /&gt;            break;&lt;br /&gt;         case MARIAEMPFAENGNIS:&lt;br /&gt;            bez = "Maria Empfängnis";&lt;br /&gt;            break;&lt;br /&gt;         case ADVENT1:&lt;br /&gt;            bez = "1. Advent";&lt;br /&gt;            break;&lt;br /&gt;         case ADVENT2:&lt;br /&gt;            bez = "2. Advent";&lt;br /&gt;            break;&lt;br /&gt;         case ADVENT3:&lt;br /&gt;            bez = "3. Advent";&lt;br /&gt;            break;&lt;br /&gt;         case ADVENT4:&lt;br /&gt;            bez = "4. Advent";&lt;br /&gt;            break;&lt;br /&gt;         case HEILIGABEND:&lt;br /&gt;            bez = "Heiligabend";&lt;br /&gt;            break;&lt;br /&gt;         case CHRISTIANI:&lt;br /&gt;            bez = "Christtag";&lt;br /&gt;            break;&lt;br /&gt;         case STEFANI:&lt;br /&gt;            bez = "Stefanitag";&lt;br /&gt;            break;&lt;br /&gt;         case SILVESTER:&lt;br /&gt;            bez = "Silvester :-)";&lt;br /&gt;            break;&lt;br /&gt;      }&lt;br /&gt;      if (strlen(bez) &gt; 0)&lt;br /&gt;         printf("%2d.%d. %s\n", i, monat, bez);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3006451960325053006?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3006451960325053006/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/12/datum-in-c-selbst-gebastelt.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3006451960325053006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3006451960325053006'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/12/datum-in-c-selbst-gebastelt.html' title='Datum in C selbst gebastelt'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-8402448869948675343</id><published>2010-12-01T15:12:00.001+01:00</published><updated>2010-12-02T22:40:41.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Übungsbeispiele für Python (POS1: 1BHIF)</title><content type='html'>Vervollständigen Sie die folgenden Funktionsdefinitionen und schreiben Sie passende Testaufrufe.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;def ist_dreieck(a, b, c):&lt;br /&gt;    """liefert True, wenn durch a, b und c ein gültiges Dreieck definiert&lt;br /&gt;    ist"""&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def ist_quadrat(a, b, w):&lt;br /&gt;    """liefert True, wenn durch a und b sowie dem Winkel w ein &lt;br /&gt;    Quadrat definiert ist"""&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def ist_schaltjahr(jahr):&lt;br /&gt;    """liefert True, wenn das gegebene Jahr ein Schaltjahr ist.&lt;br /&gt;    Seit Ende 1582 gilt der Gregorianische Kalender, bei dem folgende &lt;br /&gt;    Regel für die Schaltjahrbestimmung anzuwenden sind:&lt;br /&gt;        In allen Jahren, deren Jahreszahl durch vier teilbar ist, ist&lt;br /&gt;        der 29. Februar ein Schalttag und damit ist dieses Jahr ein &lt;br /&gt;        Schaltjahr.&lt;br /&gt;        Eine Ausnahme bilden allerdings die vollen Jahrhundertjahre 1700, &lt;br /&gt;        1800, 1900 usw., auch Säkularjahre genannt. Hiervon erhalten nur &lt;br /&gt;        diejenigen einen Schalttag, deren Jahreszahl durch 400 teilbar&lt;br /&gt;        ist. Jedes vierte Säkularjahr ist somit ein Schaltjahr.&lt;br /&gt;    Für alle Jahre &amp;lt;= 1582 liefert die Funktion False, weil da das&lt;br /&gt;    Schaltjahr nicht definiert ist, sonst gilt obige Regel."""&lt;br /&gt;    return False&lt;br /&gt;&lt;br /&gt;def fib(n):&lt;br /&gt;    """liefert die Fibonaccizahl zu n. Die Zahlen sind wie definiert:&lt;br /&gt;        fib(0) -&amp;gt; 0&lt;br /&gt;        fib(1) -&amp;gt; 1&lt;br /&gt;        fib(2) -&amp;gt; 1&lt;br /&gt;        fib(3) -&amp;gt; 2&lt;br /&gt;        fib(4) -&amp;gt; 3&lt;br /&gt;        fib(5) -&amp;gt; 5&lt;br /&gt;        fib(6) -&amp;gt; 8&lt;br /&gt;        ...&lt;br /&gt;        fib(10) -&amp;gt; 55&lt;br /&gt;        ...&lt;br /&gt;        fib(15) -&amp;gt; 610"""&lt;br /&gt;    return 1&lt;br /&gt;&lt;br /&gt;def fibtab(n):&lt;br /&gt;    """erzeugt eine Tabelle der Fibonaccizahlen bis inclusive n.&lt;br /&gt;    z.B. gibt fibtab(10) folgendes aus:&lt;br /&gt;        [0, 1, 1, 2, 3, 5, 8]&lt;br /&gt;    oder fibtab(100):&lt;br /&gt;        [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]&lt;br /&gt;    Hinweis:&lt;br /&gt;        verwenden Sie als Zeilenumbruch ", " beim print, also&lt;br /&gt;            print(wert, end=', ')&lt;br /&gt;        außer natürlich beim letzten Wert, hier ist "]" gefordert.&lt;br /&gt;    """&lt;br /&gt;    print("[0, 1, 1, 2, 3, 5, 8]")&lt;br /&gt;&lt;br /&gt;def sum_3_5(max):&lt;br /&gt;    """&lt;br /&gt;    bilde Summe der Vielfachen von 3 und 5 kleiner als max.&lt;br /&gt;    Beispielsweise liefert sum_3_5(10) 23, weil&lt;br /&gt;        die Vielfachen von 3 &amp;lt; 10 sind&lt;br /&gt;            3 + 6 + 9 = 18&lt;br /&gt;        die Vielfachen von 5 &amp;lt; 10 sind&lt;br /&gt;            5&lt;br /&gt;        18 + 5 = 23&lt;br /&gt;    sum_3_5(20) liefert 78, weil&lt;br /&gt;        3+  6+9+   12+15+18=63&lt;br /&gt;          5+    10+        =15 (15 ist in obiger Liste schon enthalten!)&lt;br /&gt;    sum_3_5(25) liefert 143, weil&lt;br /&gt;        3+  6+9+   12+   18+   21+24=93 (Vielfache von 5 stehen darunter)&lt;br /&gt;          5+    10+   15+   20+     =50&lt;br /&gt;    sum_3_5(100) liefert 2318 (ohne Beweis)&lt;br /&gt;    """&lt;br /&gt;    return 23&lt;br /&gt;&lt;br /&gt;def minquad(zahl):&lt;br /&gt;    """finde die nächstkleinere oder gleichgroße ganze Zahl, die eine &lt;br /&gt;    Quadratzahl ist. Beispiele:&lt;br /&gt;        minquad(16) -&amp;gt; 16 (weil 4 * 4 = 16 &amp;lt;= 16)&lt;br /&gt;        minquad(24) -&amp;gt; 16 (weil 4 * 4 = 16 &amp;lt;= 24)&lt;br /&gt;        minquad(25) -&amp;gt; 25 (weil 5 * 5 = 25 &amp;lt;= 25)&lt;br /&gt;        minquad(26) -&amp;gt; 25 (weil 5 * 5 = 25 &amp;lt;= 26)&lt;br /&gt;    """&lt;br /&gt;    return zahl&lt;br /&gt;&lt;br /&gt;def dreieck(a, w):&lt;br /&gt;    """zeichnet ein gleichseitiges Dreieck der Seitenlänge a, gedreht um&lt;br /&gt;    den Winkel w. w = 0 bedeutet, dass die eine Seite horizional ist. &lt;br /&gt;    w = 90 bedeutet, dass das Dreieck nach LINKS um 90° gedreht ist, d.h.&lt;br /&gt;    eine Seite ist vertikal.&lt;br /&gt;    Das Dreieck soll rechts neben des angegebenen Punktes gezeichnet&lt;br /&gt;    werden.&lt;br /&gt;    """&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;def dreieck_an_pos(a, w, x, y):&lt;br /&gt;    """zeichnet ein Dreieck mit Hilfe der Funktion dreieck(a, w) an der &lt;br /&gt;    Position x, y."""&lt;br /&gt;    pass&lt;br /&gt;&lt;/pre&gt;Hier folgt ein Beispielaufruf für die Schaltjahrfunktion: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def test_ist_schaltjahr():&lt;br /&gt;    for jahr in (1000, 1581, 1582, 1900, 1999, 2003):&lt;br /&gt;        assert not ist_schaltjahr(jahr)&lt;br /&gt;    for jahr in (1996, 2000, 2004):&lt;br /&gt;        assert ist_schaltjahr(jahr)&lt;br /&gt;    print("ist_schaltjahr ok")&lt;br /&gt;&lt;/pre&gt;Sollte &lt;code&gt;ist_schaltjahr()&lt;/code&gt; richtig implementiert sein, dann müsste "&lt;code&gt;ist_schaltjahr ok&lt;/code&gt;" ausgegeben werden. Andernfalls wird das Programm bei einer der &lt;code&gt;assert&lt;/code&gt;-Anweisungen abgebrochen werden. &lt;code&gt;assert&lt;/code&gt; verwendet man als Programmierer um Bedingungen zu prüfen, die, falls sie nicht erfüllt sind, auf einen Programmierfehler hinweisen. Als Bedingung kann alles rechts neben dem &lt;code&gt;assert&lt;/code&gt; stehen, das &lt;code&gt;True&lt;/code&gt; ("alles ok") oder &lt;code&gt;False&lt;/code&gt; liefert. Die Testaufrufe für alle Funktionen sollten dann etwa so zusammengefasst werden: &lt;br /&gt;&lt;pre class="prettyprint"&gt;def main():&lt;br /&gt;    """Hauptprogamm zum Testen aller Funktionen"""&lt;br /&gt;    test_ist_dreieck()&lt;br /&gt;    test_ist_quadrat()&lt;br /&gt;    test_ist_schaltjahr()&lt;br /&gt;    test_fib()&lt;br /&gt;    test_sum_3_5()&lt;br /&gt;    test_minquad()&lt;br /&gt;    test_dreieck()&lt;br /&gt;    test_dreieck_an_pos()&lt;br /&gt;&lt;/pre&gt;Dieses &lt;code&gt;main()&lt;/code&gt; muss natürlich auch erst aufgerufen werden (keine Einrückung): &lt;br /&gt;&lt;pre class="prettyprint"&gt;main()&lt;br /&gt;&lt;/pre&gt;Wenn Sie das Programm laufen lassen, dann sieht sie Ausgabe, wenn alles funktioniert (sinngemäß)  so aus: &lt;br /&gt;&lt;pre&gt;ist_dreieck ok&lt;br /&gt;ist_quadrat ok&lt;br /&gt;ist_schaltjahr ok&lt;br /&gt;fib ok&lt;br /&gt;sum_3_5 ok&lt;br /&gt;minquad ok&lt;br /&gt;&lt;/pre&gt;Die Funktionen &lt;code&gt;test_dreieck()&lt;/code&gt; sowie &lt;code&gt;test_dreieck_an_pos()&lt;/code&gt; bewirken eine Zeichnung der folgenden Art (je nach Aufrufe):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gmjWOaOfpfo/TPZW12QRJ1I/AAAAAAAAEdU/C0hOcgVp1Sg/s1600/dreicke.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://3.bp.blogspot.com/_gmjWOaOfpfo/TPZW12QRJ1I/AAAAAAAAEdU/C0hOcgVp1Sg/s320/dreicke.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Hier waren es die Aufrufe:&lt;br /&gt;&lt;pre class="prettyprint"&gt;def test_dreieck():&lt;br /&gt;    reset()&lt;br /&gt;    dreieck(60, 0)&lt;br /&gt;    dreieck(60, 90)&lt;br /&gt;    dreieck(60, -60)&lt;br /&gt;&lt;br /&gt;def test_dreieck_an_pos():&lt;br /&gt;    dreieck_an_pos(70, 0, 50, 50)&lt;br /&gt;    dreieck_an_pos(70, 180, -50, -50)&lt;br /&gt;&lt;/pre&gt;Es ist also "optische Kontrolle" nötig.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-8402448869948675343?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/8402448869948675343/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/12/ubungsbeispiele-fur-python-pos1-1bhif.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/8402448869948675343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/8402448869948675343'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/12/ubungsbeispiele-fur-python-pos1-1bhif.html' title='Übungsbeispiele für Python (POS1: 1BHIF)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gmjWOaOfpfo/TPZW12QRJ1I/AAAAAAAAEdU/C0hOcgVp1Sg/s72-c/dreicke.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-7671055981194823490</id><published>2010-11-26T11:13:00.000+01:00</published><updated>2010-11-26T11:13:44.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Multiple-Choice-Tests bearbeiten</title><content type='html'>&lt;b&gt;Optionale Aufgabe (freiwillig)!&lt;/b&gt;&lt;br /&gt;Schreiben Sie ein Programm, das eine Datenstruktur, mit der man Multiple-Choice-Tests erzeugen kann, aus einer Textdatei erstellt. Das Format der Textdatei soll anhand eines Beispiels gezeigt werden:&lt;br /&gt;&lt;pre&gt;Das ist der einleitende Text, der einfach in einen String Namens "einleitung"&lt;br /&gt;gelesen werden soll. Mit allen Zeichen und Zeilenumbrüchen. Diese Einleitung&lt;br /&gt;endet mit zwei leeren Zeilen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Das ist die erste Frage. Der Text dieser Frage kann sich auch über mehrere&lt;br /&gt;Zeilen erstrecken. Allerdings soll so ein Text ohne die Zeilenumbrüche&lt;br /&gt;übernommen werden (Zeilenümbrüche durch Leerzeichen ersetzen). Die weiteren&lt;br /&gt;Informationen sind durch mindestens zwei Leerzeichen eingerückt gleich nach&lt;br /&gt;diesem Text. Optional darf eine Leerzeile stehen.&lt;br /&gt;&lt;br /&gt;  Optionaler Text, der wie die Einleitung mit allen Umbrüchen so übernommen&lt;br /&gt;  werden soll, wie er in der Datei ist, jedoch ohne die Einrückung. Alle&lt;br /&gt;  weiteren Informationen kommen wieder eingerückt, optional mit einer &lt;br /&gt;  Leerzeile abgetrennt. Die Punkte für diese Frage sind in runde Klammern&lt;br /&gt;  zu setzen (am Anfang der Zeile mit Einrückung). Gibt es keine Punkte,&lt;br /&gt;  so ist 1 zu verwenden.&lt;br /&gt;  Optional kann in { } eine Zahl &amp;gt; 0 und &amp;lt;= 1 angegeben werden, welche&lt;br /&gt;  als "Faktor" zu interpretieren ist. Wieder nur mit passender Einrückung.&lt;br /&gt;  (Der Faktor soll angeben, welcher Anteil an richtigen und falschen&lt;br /&gt;  Antworten dann bei der Erzeugung der Tests verwendet werden soll, 0.5 &lt;br /&gt;  bedeutet die Hälfte).&lt;br /&gt;  (2)&lt;br /&gt;  {0.75}&lt;br /&gt;&lt;br /&gt;  [X] Das ist eine richtige Antwort.&lt;br /&gt;  [ ] Das ist eine falsche Antwort.&lt;br /&gt;&lt;br /&gt;  [X] Das ist eine richtige Antwort, die sich&lt;br /&gt;      über mehrere Zeilen erstrecken kann.&lt;br /&gt;  [ ] Das ist eine falsche Antwort, die sich&lt;br /&gt;      über mehrere Zeilen erstrecken kann.&lt;br /&gt;      Die Einrückung ist wieder wesentlich. Die&lt;br /&gt;      Zeilenumbrüche und die Einrückung sind&lt;br /&gt;      zu entfernen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Das ist die nächste Frage, sie wird mit zwei Leerzeilen von der &lt;br /&gt;vorigen abgetrennt. Es muss keine weitere Information angegeben&lt;br /&gt;sein. In diesem Fall wäre es eine 1-Punkte-Frage ohne Auswahl-&lt;br /&gt;möglichkeiten, also eine direkt zu beantwortende Frage.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Die Dritte Frage. Ist nun eine 1-Punkte Frage ohne Faktor und&lt;br /&gt;ohne Text.&lt;br /&gt;  [ ] Falsche Lösung.&lt;br /&gt;  [X] Richtige Lösung.&lt;br /&gt;  [ ] Falsche Lösung.&lt;br /&gt;&lt;/pre&gt;Am Ende der Datei brauchen natürlich keine Leerzeilen mehr sein.  Das Programm soll solche Dateien einlesen und folgende Variable setzen: &lt;code class="prettyprint"&gt;einleitung&lt;/code&gt; mit dem einleitenden Text. &lt;code class="prettyprint"&gt;fragen&lt;/code&gt;, einer Liste von Fragen. Jede Frage ist ein Dictionary mit folgenden Schlüssel und Werten:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;"frage"&lt;/code&gt; mit dem Text der Frage.&lt;/li&gt;&lt;li&gt;&lt;code&gt;"text"&lt;/code&gt; mit dem optionalen Text (oder eben nicht).&lt;/li&gt;&lt;li&gt;&lt;code&gt;"punkte"&lt;/code&gt; mit den gelesenen Punkten oder 1.&lt;/li&gt;&lt;li&gt;&lt;code&gt;"faktor"&lt;/code&gt; mit dem gelesenen Faktor (oder gar nicht).&lt;/li&gt;&lt;li&gt;&lt;code&gt;"richtig"&lt;/code&gt; mit einer Liste der richtigen Antworten (ohne &lt;code&gt;"[X]"&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;code&gt;"falsch"&lt;/code&gt; mit einer Liste der richtigen Antworten (ohne &lt;code&gt;"[ ]"&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-7671055981194823490?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/7671055981194823490/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/11/multiple-choice-tests-bearbeiten.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7671055981194823490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/7671055981194823490'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/11/multiple-choice-tests-bearbeiten.html' title='Multiple-Choice-Tests bearbeiten'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-1109207789594285145</id><published>2010-11-12T07:33:00.004+01:00</published><updated>2010-12-01T14:35:41.658+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Aufgabe'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Verwalten einer Hitliste (POS1: 2AHIF, 2CHIF)</title><content type='html'>Erstellen Sie ein Pythonprogramm, welches Musik-Charts verwalten kann. Das Use Case Diagramm zeigt die möglichen Anwendungsfälle.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gmjWOaOfpfo/TNzfIlRb3YI/AAAAAAAAEcg/Rp3i4ILKiDc/s1600/Charts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_gmjWOaOfpfo/TNzfIlRb3YI/AAAAAAAAEcg/Rp3i4ILKiDc/s640/Charts.png" width="596" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;Songs eingeben&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Titel und Interpret sind einzugeben.&lt;/div&gt;&lt;h4&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=395734929939336689&amp;amp;postID=1109207789594285145" id="VotingErfassen"&gt;&lt;/a&gt;Voting erfassen&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Zu einem bestimmten Titel soll die Anzahl der Stimmen (das Voting) eingegeben werden. Die Auswahl des Titels könnte z.B. über eine Suche erfolgen.&lt;/div&gt;&lt;h4&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=395734929939336689&amp;amp;postID=1109207789594285145" id="HitlisteAusgeben"&gt;&lt;/a&gt;Hitliste ausgeben&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Die Liste der Songs (Titel, Interpret, Voting) soll in der Reihenfolge des Votings (mehr Stimmen zuerst) ausgegeben werden.&lt;/div&gt;&lt;h4&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=395734929939336689&amp;amp;postID=1109207789594285145" id="SongsAusDateiLesen"&gt;&lt;/a&gt;Songs aus Datei lesen&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Die Liste der Songs (Titel, Interpret -&amp;nbsp;&lt;strong&gt;ohne&lt;/strong&gt;&amp;nbsp;Voting) soll aus einer Datei gelesen werden. Das Dateiformat kann beliebig gewählt werden. z.B. Zeilen in der Form&amp;nbsp;&lt;code style="color: blue; font-size: 12px;"&gt;Titel;Interpret&lt;/code&gt;.&lt;/div&gt;&lt;h4&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=395734929939336689&amp;amp;postID=1109207789594285145" id="SongsInDateiSpeichern"&gt;&lt;/a&gt;Songs in Datei speichern&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Die Liste der Songs (Titel, Interpret -&amp;nbsp;&lt;strong&gt;ohne&lt;/strong&gt;&amp;nbsp;Voting) soll in einer Datei gespeichert werden. Dateiformat wie oben.&lt;/div&gt;&lt;h4&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=395734929939336689&amp;amp;postID=1109207789594285145" id="HitlisteSpeichern"&gt;&lt;/a&gt;Hitliste speichern&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Die Hitliste (Titel, Interpret&amp;nbsp;&lt;strong&gt;und&lt;/strong&gt;&amp;nbsp;Voting) soll in einer Datei gespeichert werden. Das Dateiformat kann beliebig gewählt werden. z.B. Zeilen in der Form&amp;nbsp;&lt;code style="color: blue; font-size: 12px;"&gt;Titel;Interpret;Voting&lt;/code&gt;.&lt;/div&gt;&lt;h4&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=395734929939336689&amp;amp;postID=1109207789594285145" id="HitlisteLaden"&gt;&lt;/a&gt;Hitliste laden&lt;/h4&gt;&lt;div style="margin-top: 0px;"&gt;Die Hitliste (Titel, Interpret&amp;nbsp;&lt;strong&gt;und&lt;/strong&gt;&amp;nbsp;Voting) soll aus einer Datei gelesen werden. Das Dateiformat wie oben.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Beispielsitzung&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;b&gt;$&lt;/b&gt; python charts.py&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 1&lt;br /&gt;Titel&amp;gt;&amp;gt;&amp;gt; Peter Gunn&lt;br /&gt;Interpret&amp;gt;&amp;gt;&amp;gt; Emerson, Lake &amp;amp; Palmer&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 1&lt;br /&gt;Titel&amp;gt;&amp;gt;&amp;gt; Haitian Fight Song&lt;br /&gt;Interpret&amp;gt;&amp;gt;&amp;gt; Charles Mingus&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 5&lt;br /&gt;Dateiname [songs.txt] &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 4&lt;br /&gt;Dateiname [songs.txt] &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 3&lt;br /&gt;Peter Gunn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Emerson, Lake &amp;amp; Palmer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Haitian Fight Song &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Charles Mingus &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Gamma Ray &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Birth Control &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Spectrum &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Billy Cobham &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Take Five &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dave Brubek &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Overnite Sensation &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Frank Zappa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Sing, Sing, Sing &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Gene Krupa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Bahamut &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Hazmat Modine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Cantaloupe Island &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Herbie Hankock &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Blue Train &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; John Coltraine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;North Carolina &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Les McCann &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Pressure &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Mary Broadcast Band &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Mile Stones &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Miles Davis &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 2&lt;br /&gt;Titel (oder Teil)&amp;gt;&amp;gt;&amp;gt; Peter&lt;br /&gt;Voting für Peter Gunn &amp;gt;&amp;gt;&amp;gt; 23&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 3&lt;br /&gt;Peter Gunn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Emerson, Lake &amp;amp; Palmer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 23&lt;br /&gt;Haitian Fight Song &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Charles Mingus &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Gamma Ray &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Birth Control &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Spectrum &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Billy Cobham &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Take Five &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dave Brubek &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Overnite Sensation &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Frank Zappa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Sing, Sing, Sing &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Gene Krupa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Bahamut &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Hazmat Modine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Cantaloupe Island &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Herbie Hankock &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Blue Train &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; John Coltraine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;North Carolina &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Les McCann &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Pressure &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Mary Broadcast Band &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Mile Stones &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Miles Davis &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 2&lt;br /&gt;Titel (oder Teil)&amp;gt;&amp;gt;&amp;gt; Gamm&lt;br /&gt;Voting für Gamma Ray &amp;gt;&amp;gt;&amp;gt; 25&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 3&lt;br /&gt;Gamma Ray &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Birth Control &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;25&lt;br /&gt;Peter Gunn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Emerson, Lake &amp;amp; Palmer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 23&lt;br /&gt;Haitian Fight Song &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Charles Mingus &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Spectrum &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Billy Cobham &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Take Five &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dave Brubek &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Overnite Sensation &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Frank Zappa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Sing, Sing, Sing &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Gene Krupa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Bahamut &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Hazmat Modine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Cantaloupe Island &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Herbie Hankock &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Blue Train &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; John Coltraine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;North Carolina &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Les McCann &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;Pressure &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Mary Broadcast Band &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;Mile Stones &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Miles Davis &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 7&lt;br /&gt;Dateiname [charts.txt] &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;0 Ende&lt;br /&gt;1 Songs eingeben&lt;br /&gt;2 Voting erfassen&lt;br /&gt;3 Hitliste&lt;br /&gt;4 Songs aus Datei lesen&lt;br /&gt;5 Songs in Datei speichern&lt;br /&gt;6 Hitliste aus Datei lesen&lt;br /&gt;7 Hitliste in Datei speichern&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 0&lt;br /&gt;&lt;b&gt;$&lt;/b&gt; &lt;/pre&gt;&lt;div style="margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4&gt;Abgabe&lt;/h4&gt;Nennen Sie das Projekt&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;2&lt;i&gt;x&lt;/i&gt;-&lt;i&gt;name&lt;/i&gt;-python-charts&lt;/code&gt;, wobei&amp;nbsp;&lt;i&gt;x&lt;/i&gt;&amp;nbsp;"a" für 2AHIF und "c" für 2CHIF und&amp;nbsp;&lt;i&gt;name&lt;/i&gt;&amp;nbsp;Ihr Familienname sein soll (bei Namensgleichheit machen Sie bitte&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;2&lt;i&gt;x&lt;/i&gt;-&lt;i&gt;name-vorname&lt;/i&gt;-python-charts&lt;/code&gt;&amp;nbsp;daraus). Das Programm selbst soll&amp;nbsp;&lt;code style="color: blue; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 13px;"&gt;charts.py&lt;/code&gt;&amp;nbsp;heißen.&lt;br /&gt;&lt;div style="margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;br /&gt;&lt;b&gt;Erzeugen&lt;/b&gt;&amp;nbsp;Sie Testdaten (Dateien mit Songs und Hitlisten), sodass das Programm nach dem Auschecken direkt getestet werden kann.&lt;br /&gt;&lt;br /&gt;Checken Sie das Projekt am CVS ein und "commiten" Sie Ihre letzte Version.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-1109207789594285145?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/1109207789594285145/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/11/verwalten-einer-hitliste-pos1-2ad-2cd.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1109207789594285145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/1109207789594285145'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/11/verwalten-einer-hitliste-pos1-2ad-2cd.html' title='Verwalten einer Hitliste (POS1: 2AHIF, 2CHIF)'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gmjWOaOfpfo/TNzfIlRb3YI/AAAAAAAAEcg/Rp3i4ILKiDc/s72-c/Charts.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-3566967873466014058</id><published>2010-11-11T16:00:00.001+01:00</published><updated>2010-11-11T16:03:14.999+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PR5'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-1'/><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Code-Kata</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gmjWOaOfpfo/TNwDZfKzoBI/AAAAAAAAEcY/BGt3_3cmvds/s1600/karatedo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gmjWOaOfpfo/TNwDZfKzoBI/AAAAAAAAEcY/BGt3_3cmvds/s1600/karatedo.gif" /&gt;&lt;/a&gt;&lt;/div&gt;Beim &lt;a href="http://de.wikipedia.org/wiki/"&gt;Karate&lt;/a&gt; (z.B.&amp;nbsp;&lt;a href="http://www.doshinkan.or.at/honbudojo_vienna/deutsch/HombuDojo.html"&gt;Karatedo Doshinkan&lt;/a&gt;) gibt es &lt;a href="http://www.doshinkan.or.at/honbudojo_vienna/deutsch/training.html#kata"&gt;Kata&lt;/a&gt;&amp;nbsp;(dt. "Form", siehe auch&amp;nbsp;&lt;a href="http://de.wikipedia.org/wiki/Kata_(Karate)"&gt;Kata auf Wikipedia&lt;/a&gt;), eine spezielle Übungsform, bei der man als Training gegen einen oder mehrere (vorgestellte) Gegner kämpft. Dabei ist der Bewegungsablauf aber stilisiert und fix vorgegeben. Das oftmalige Wiederholen der Bewegungsabläufe in Form von Kata ist unerlässlich für den persönlichen Fortschritt. Denn nur Übung macht den Meister.&lt;br /&gt;&lt;br /&gt;Auch Programmieren beherrscht man nur durch ständiges Training. Nur durch Üben wird man auch hier zum Meister. Aber nicht nur durch den Kampf (Programmieren für das Geschäft) sondern auch durch Katas. Diese Idee für's Programmieren hat &lt;a href="http://pragdave.pragprog.com/"&gt;Dave Thomas&lt;/a&gt; von den &lt;a href="http://www.pragprog.com/"&gt;Pragmatischen Programmieren&lt;/a&gt; (meines Wissens) erstmalig aufgegriffen und publiziert: &lt;a href="http://codekata.pragprog.com/"&gt;Code Kata&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sehr empfehlenswert für alle, die Programmieren meistern wollen.&lt;br /&gt;&lt;br /&gt;Die Idee der Code Kata fasziniert und berührt mich besonders, da ich selber jahrelang &lt;img border="0" style="vertical-align:middle;" src="http://2.bp.blogspot.com/_gmjWOaOfpfo/TNwEa9p3U1I/AAAAAAAAEcc/7bSKmuAgZeA/s1600/doshinkan.gif" /&gt; trainiert habe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/395734929939336689-3566967873466014058?l=programmierblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmierblog.blogspot.com/feeds/3566967873466014058/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://programmierblog.blogspot.com/2010/11/code-kata.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3566967873466014058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/395734929939336689/posts/default/3566967873466014058'/><link rel='alternate' type='text/html' href='http://programmierblog.blogspot.com/2010/11/code-kata.html' title='Code-Kata'/><author><name>Harald R. Haberstroh</name><uri>http://www.blogger.com/profile/18419691497498350689</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_gmjWOaOfpfo/SWW3UjOTsZI/AAAAAAAAAJ8/_HgYDWmkHg4/S220/harald1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gmjWOaOfpfo/TNwDZfKzoBI/AAAAAAAAEcY/BGt3_3cmvds/s72-c/karatedo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-395734929939336689.post-536357704403943825</id><published>2010-11-08T16:12:00.000+01:00</published><updated>2010-11-08T16:12:29.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='allgemeines'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='POS1-2'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Hinweise zum Theorietest POS1 2. Klasse (POS1: 2AHIF, 2CHIF)</title><content type='html'>Bitte beachten Sie folgende Punkte für den Theorietest (wie die traurige Erfahrung zeigt):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In Python gibt es&amp;nbsp;&lt;b&gt;nur&lt;/b&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;and&lt;/span&gt;,&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;or&lt;/span&gt;&amp;nbsp;und&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;not&lt;/span&gt;, nicht jedoch&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;,&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;||&lt;/span&gt;&amp;nbsp;bzw.&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;!&lt;/span&gt;&amp;nbsp;(ausgenommen&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;!=&lt;/span&gt;&amp;nbsp;für ungleich).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Globale&lt;/b&gt;&amp;nbsp;Variable können gelesen aber nicht verändert werden, ausgenommen man definiert die Variable explizit mit&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;global&lt;/span&gt;. Das bedeutet, dass eine Variable lokal definiert wird, sobald man eine Zuweisung an diese Variable (vor einer lesenden Verwendung) macht.&lt;/li&gt;&lt;li&gt;Ein Aufruf einer Funktion mit Returnwert in Form einer Subroutine (also nicht in einem Ausdruck) gibt natürlich den Returnwert&amp;nbsp;&lt;b&gt;nicht&lt;/b&gt;&amp;nbsp;aus (den sieht man nur bei interaktiver Verwendung, weil in diesem Fall&amp;nbsp;&lt;b&gt;jeder Wert&lt;/b&gt;&amp;nbsp;angezeigt wird).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Oktale&lt;/b&gt;&amp;nbsp;Konstante werden in python2.x nur mit führender&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;0&lt;/span&gt;&amp;nbsp;(Null, z.B.&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;023 == 19&lt;/span&gt;), in python3.x mit führendem&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;0o&lt;/span&gt;&amp;nbsp;(Null gefolgt von kleinem&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;o&lt;/span&gt;, z.B.&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;0o23 == 19&lt;/span&gt;) gekennzeichnet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;python3.x&lt;/b&gt;&amp;nbsp;erlaubt von Haus aus&amp;nbsp;&lt;b&gt;Unicode&lt;/b&gt;&amp;nbsp;(z.B. für Umlaute), bei&amp;nbsp;&lt;b&gt;python2.x&lt;/b&gt;&amp;nbsp;muss man ein&amp;nbsp;&lt;b&gt;coding&lt;/b&gt;&amp;nbsp;angeben.&lt;/li&gt;&lt;li&gt;Ein&amp;nbsp;&lt;b&gt;Index&lt;/b&gt;&amp;nbsp;beginnt immer bei&lt;b&gt;&amp;nbsp;0&lt;/b&gt;! (bei Strings, Listen, Mengen usw.)&lt;/li&gt;&lt;li&gt;Wenn bei einem "slice" die Obergrenze größer als die Anzahl der Elemente ist, macht das nichts. Z.B.&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;"hallo"[1:23]&lt;/span&gt;&amp;nbsp;liefert&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;"allo"&lt;/span&gt;, wie auch&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;"hallo"[1:]&lt;/span&gt;&amp;nbsp;oder&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;"hallo"[1:5]&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Parameter an eine Python-Funktion: es müssen immer mindestens soviele Parameter beim Aufruf angegeben werden als fixe Parameter vorgegeben sind (ohne Default). Das funktioniert auch, wenn man die Parameter als variable Liste (eigentlich Dictionary) übergibt, wenn das Dictionary die passenden Namen der Parameter als Schlüssel hat, die richtige Anzahl und beim Aufruf mit einem oder zwei * gekennzeichnet ist. Schauen Sie ins Skriptum ab Seite 38 nach.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;1/0&lt;/span&gt;&amp;nbsp;ist in&amp;nbsp;&lt;b&gt;keiner&lt;/b&gt;&amp;nbsp;Sprache definiert,&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;1/3 == 0&lt;/span&gt;&amp;nbsp;in&amp;nbsp;&lt;b&gt;python2.x&lt;/b&gt;&amp;nbsp;aber&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;1/3 != 0&lt;/span&gt;&amp;nbsp;(weil 0.3333333333...) in&amp;nbsp;&lt;b&gt;python3.x&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Shellvariable&lt;/b&gt;&amp;nbsp;werden mit&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'courier new', monospace;"&gt;$&lt;/span&gt;&amp;nbsp;gekennzeichnet mit Ausnahme, die Variable steht links 
