{"id":4011,"date":"2013-01-12T18:28:46","date_gmt":"2013-01-12T17:28:46","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=4011"},"modified":"2023-06-16T08:19:48","modified_gmt":"2023-06-16T06:19:48","slug":"ein-taschenrechner-mit-java-in-der-10-klasse-1","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2013\/01\/ein-taschenrechner-mit-java-in-der-10-klasse-1.htm","title":{"rendered":"Ein Taschenrechner mit Java in der 10. Klasse (1)"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2013\/01\/ein-taschenrechner-mit-java-in-der-10-klasse-1.htm#comments'>7 Kommentare.<\/a>)<\/small> <\/div><p>Mit meiner 10. Klasse habe ich im ersten Halbjahr einen Taschenrechner programmiert, ziemlich bald, als Einstieg in die Algorithmik, die ich daf\u00fcr dieses Jahr vorgezogen habe. Als BlueJ-Projekt sieht der Rechner so aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_bluej_rot.png\" alt=\"taschenrechner_bluej_rot\" width=\"548\" height=\"327\" class=\"alignnone size-full wp-image-4023\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_bluej_rot.png 548w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_bluej_rot-150x89.png 150w\" sizes=\"auto, (max-width: 548px) 100vw, 548px\" \/><\/p>\n<p>Objektorientiert programmieren hei\u00dft, dass man die Programmieraufgabe auf verschiedene, relativ unabh\u00e4ngige Einheiten verteilt. Der Bauplan f\u00fcr diese Einheiten hei\u00dft &#8222;Klasse&#8220;, und eben diese programmiert man.<\/p>\n<hr style=\"width:30%\"\/>\n<p><strong>1. Die Klasse GUI<\/strong><\/p>\n<p>Die Klasse GUI kann ein guter Sch\u00fcler machen. Sie \u00fcbernimmt das, was vom Programm \u00e4u\u00dferlich sichtbar ist. (GUI steht f\u00fcr Graphical User Interface.) Das ist quasi das Plastik-und-Alu-Geh\u00e4use des Rechners. Den hat ein freiwilliger Sch\u00fcler schon gleich am Anfang programmiert, und zwar mit dem <a href=\"http:\/\/www.javaeditor.org\/index.php\/Java-Editor\/de\">Java-Editor<\/a>. Dieses Programm von Gerhard R\u00f6hner ist eigens f\u00fcr Schulen und Sch\u00fcler entwickelt, um leichter diese grafischen Benutzeroberfl\u00e4chen zu erstellen, die in Java, ehrlich gesagt, recht umst\u00e4ndlich sind. <\/p>\n<p>Die Klasse GUI braucht einen Bereich, in dem man die Ergebnisse anzeigen lassen kann (im Java-Editor-JFrame-Projekt: JLabel oder JTextField), und viele Kn\u00f6pfe mit unterschiedlichen Beschriftungen (JButton). Nach diesen Angaben hat ein Sch\u00fcler folgendes Taschenrechner-GUI angelegt, nachdem wir vorher noch ausgemacht hatten, welche Kn\u00f6pfe es geben soll:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_gui_ansicht_leer.png\" alt=\"taschenrechner_gui_ansicht_leer\" width=\"320\" height=\"501\" class=\"alignnone size-full wp-image-4019\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_gui_ansicht_leer.png 320w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_gui_ansicht_leer-95x150.png 95w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/p>\n<p>Ich h\u00e4tte die Kn\u00f6pfe anders platziert und benannt, aber hey, es ist nicht mein Taschenrechner. Und hier ist auch ein Vorteil des objektorientierten Programmierens: Wem dieses GUI nicht gef\u00e4llt, der kann es einfach durch ein anderes, eigenes ersetzen, ohne dass die anderen am Programm beteiligten Klassen ge\u00e4ndert werden m\u00fcssen.<\/p>\n<p>Noch passiert allerdings nichts, wenn man auf die Kn\u00f6pfe dr\u00fcckt. Viel soll auch gar nicht passieren: f\u00fcr das Innenleben des Taschenrechners sind wieder andere Klassen zust\u00e4ndig. Der Taschenrechner muss nur Bescheid geben, welche Taste gedr\u00fcckt ist, und zwar einem Objekt <strong>der Klasse Steuerung.<\/strong> Damit das geht, muss man die mit dem Java-Editor erstellte GUI-Klasse etwas erg\u00e4nzen:<\/p>\n<p>1. Ein GUI-Objekt muss ein Steuerung-Objekt kennen, dem es die Benachrichtigung schicken soll (Referenzattribut auf ein Objekt der Klasse Steuerung); das geht in einer Zeile:<\/p>\n<pre>Steuerung steuerung;<\/pre>\n<p>2. Wenn eine Taste gedr\u00fcckt wird, muss an die Steuerung eine Nachricht gesendet werden. Die Vorarbeit dazu erledigt der Java-Editor, man muss nur &#8211; nach dem TODO-Kommentar &#8211; eine einzige Zeile in jeder Knopfgedr\u00fcckt-Methode erg\u00e4nzen (es gibt f\u00fcr jeden Knopf eine solche Methode):<\/p>\n<pre>private void jButton1_ActionPerformed(ActionEvent evt) {\r\n  \/\/ TODO hier Quelltext einf\u00fcgen\r\n  senden (\"1\");\r\n} \/\/ end of jButton1_ActionPerformed\r\n<\/pre>\n<p>Der Einfachheit halber benutzen alle diese Knopfdruckmethoden die ebenfalls zu erg\u00e4nzende Sendemethode der Klasse GUI:<\/p>\n<pre>void senden(String s) {\r\n  steuerung.empfangen(s);\r\n}<\/pre>\n<p>Das war es fast. Damit das GUI auch Text ausgeben kann, muss man nur diese Methode erg\u00e4nzen:<\/p>\n<pre>void ausgeben(String s) {\r\n  ausgabefeld.setText(s);\r\n}<\/pre>\n<p>Und damit ist die Klasse GUI fertig. Wenn eine Taste gedr\u00fcckt wird, wird eine Nachricht an die verbundene Steuerung geschickt, und wenn man das GUI-Objekt anweist, Text auszugeben, dann macht es das. Mehr erwartet man von einer Taschenrechnerh\u00fclle nicht.<\/p>\n<hr style=\"width:30%\"\/>\n<p><strong>2. Die Klasse Steuerung<\/strong><\/p>\n<p>Diese Klasse sollte man den Sch\u00fclern fertig vorgeben. Sie macht eigentlich gar nicht so viel, ist aber umst\u00e4ndlicher zu programmieren, als man meint. Sie macht zwei Dinge: Erstens nimmt sie in Empfang, welche Nachrichten, also Tastendrucke, vom GUI gesendet werden. Und gleich darauf sagt sie der Steuerung, was diese anzeigen soll. Wenn am Anfang die Taste 1 gedr\u00fcckt wird, soll das GUI  &#8222;1&#8220; anzeigen. Wenn danach die Taste 2 gedr\u00fcckt wird, soll das GUI &#8222;12&#8220; anzeigen. Wenn dann die Mal-Taste gedr\u00fcckt wird, soll das GUI &#8222;*&#8220; anzeigen. (Die bisher eingegebene Zahl 12 muss sich die Steuerung aber merken.) Und so weiter, bis es nach dem Eingeben der zweiten Zahl ans eigentliche Rechnen geht. Dieses Rechnen \u00fcbernimmt dann wieder eine dritte Klasse, n\u00e4mlich die Klasse Calculator.<\/p>\n<p>Die Klasse Steuerung kann man sicher sauberer programmieren, als ich das getan habe. Sie muss sich im Prinzip zwei Zahlen merken k\u00f6nnen, eine erste und eine zweite. Dazu muss sie wissen, ob sie jetzt schon rechnen soll oder erst auf die Eingabe einer zweiten Zahl warten muss. Manchmal muss sie auch schon nach der Eingabe einer einzigen Zahl rechnen, n\u00e4mlich bei allen Operationen mit nur einem Operanden &#8211; Quadratwurzel, Fakult\u00e4t, Betrag und so weiter. <\/p>\n<p>Ein Grund daf\u00fcr, dass die Steuerung so arbeitet, ist folgender: Die Rechenarbeit soll ganz von der Klasse Calculator \u00fcbernommen werden. Denn da schl\u00e4gt die Stunde der Sch\u00fcler.<\/p>\n<hr style=\"width:30%\"\/>\n<p><strong>3. Die Klasse Calculator und Unterklassen dazu<\/strong><\/p>\n<p>Die Klasse Calculator &#8211; beziehungsweise eine eigene Unterklasse dazu &#8211; ist die Klasse, mit der Sch\u00fcler fast ausschlie\u00dflich arbeiten. Sie enth\u00e4lt alle Rechenmethoden, die der Taschenrechner beherrscht. \u00dcber die muss man sich nat\u00fcrlich vorher verst\u00e4ndigen, schon mal, damit es gen\u00fcgend Kn\u00f6pfe daf\u00fcr gibt. Da w\u00e4ren die Grundrechenarten, aber auch Wurzel, Potenzierung, Prozent, Betrag, Kehrwert und was es noch alles gibt. Ich habe auch noch ein paar exotische Sachen erg\u00e4nzt (Collatz, Fibonacci, Primzahltest, gr\u00f6\u00dfter gemeinsamer Teiler), auch wenn wir erst sp\u00e4ter im Schuljahr darauf zur\u00fcckkommen werden:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_calculator.png\" alt=\"taschenrechner_calculator\" width=\"266\" height=\"481\" class=\"alignnone size-full wp-image-4020\" \/><\/p>\n<p>Im Klassendiagramm sind die Methoden alphabetisch sortiert, den Sch\u00fclern muss man eine Liste mit einer anderen Reihenfolge vorgeben! Meine Liste war &#8211; leider erst am Ende der Sequenz &#8211; sortiert nach:<\/p>\n<ul>\n<li>Einfach: Grundrechenarten (addieren, subtrahieren, multiplizieren, dividieren)<\/li>\n<li>Leicht: negation, kehrwert, hochDrei, quadrat, prozent (wobei wir uns erst mal einigen mussten, was diese Prozenttaste bewirken soll)<\/li>\n<li>Mit bedingter Anweisung: betrag<\/li>\n<li>Mit while-Schleife: potenz. modulo, fakultaet, summeVonBis<\/li>\n<\/ul>\n<p>Und so weiter. Die Sch\u00fcler arbeiteten dann in ihrem eigenen Tempo und in ihrer eigenen Geschwindigkeit an diesen Methoden. Denn darum ging es eigentlich vor allem: Einf\u00fchrung in die Algorithmik und Kontrollstruktoren. Nur: ohne den graphischen Taschenrechnerkrimskrams drumherum macht das den Sch\u00fclern viel weniger Spa\u00df. Einige kamen nicht sehr weit \u00fcber die Grundrechenarten hinaus, die meisten kamen bis Fakult\u00e4t\/Potenz, andere schlugen bei Wikipedia nach und fanden L\u00f6sungen f\u00fcr Wurzel und Sinus\/Cosinus heraus. Die hatte ich nur aufgenommen, weil der GUI-Programmierer die vorgegeben hatte. Sp\u00e4ter im Jahr werde ich dann noch auf einige der exotischeren Methoden zur\u00fcckkommen.<\/p>\n<p>(Zur Klasse Taschenrechner: Die Klasse Calculator enth\u00e4lt zwar alle Methoden, aber sie funktionieren noch nicht richtig. Standardm\u00e4\u00dfig kommt dabei immer 99 heraus. Aufgabe der Sch\u00fcler ist es, eine Unterklasse zu Calculator zu programmieren und die Methoden der Oberklasse durch ihre eigenen, verbesserten Methoden zu \u00fcberschreiben. Sinnvoller w\u00e4re es nat\u00fcrlich gewesen, die Klasse Calculator als Interfache anzulegen. Aber dann m\u00fcssten die Sch\u00fcler immer wieder in den Code des Interface, um auszukommentieren, was sie noch nicht verbessert haben. Deshalb habe ich mich f\u00fcr diese eigentlich unelegante L\u00f6sung entschieden.)<\/p>\n<hr style=\"width:30%\"\/>\n<p><strong>4. Der Rest<\/strong><\/p>\n<p>Die Klasse Starter legt je ein Objekt der Klassen GUI, Steuerung und Calculator-Unterklasse an und macht sie miteinander bekannt. Sie enth\u00e4lt au\u00dferdem die main-Methode, mit der man den Taschenrechner auch au\u00dferhalb von BlueJ als echtes kleines Java-Programm unter Windows, Mac oder Linux laufen lassen kann.<\/p>\n<hr style=\"width:30%\"\/>\n<p>Ziel der Sequenz: Einf\u00fchrung in Algorithmik und Programmierung. Daneben schon mal ein Vorgeschmack auf Vererbung und Referenzattribute. Au\u00dferdem sehen die Sch\u00fcler bereits das objektorientierte Prinzip der Arbeitsteilung in Klassen angewendet. Gute Sch\u00fcler k\u00f6nnen sich an ein GUI wagen, alle machen die algorithmisch interessanten Rechenmethoden, und der Verwaltungskram der Steuerung bleibt den Sch\u00fclern verborgen.<\/p>\n<p><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/Taschenrechnerprojekt.zip\">Download des ganzen BlueJ-Projekts mit zwei Arbeitsbl\u00e4ttern dazu.<\/a><\/p>\n<p><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2013\/01\/ein-taschenrechner-mit-java-in-der-10-klasse-2-sequenzdiagramme.htm\">(Fortsetzung morgen.)<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>(7 Kommentare.) Mit meiner 10. Klasse habe ich im ersten Halbjahr einen Taschenrechner programmiert, ziemlich bald, als Einstieg in die Algorithmik, die ich daf\u00fcr dieses Jahr vorgezogen habe. Als BlueJ-Projekt sieht der Rechner so aus: Objektorientiert programmieren hei\u00dft, dass man die Programmieraufgabe auf verschiedene, relativ unabh\u00e4ngige Einheiten verteilt. Der Bauplan f\u00fcr diese Einheiten hei\u00dft &#8222;Klasse&#8220;, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":4012,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,233],"class_list":["post-4011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-programmierprojekte"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/taschenrechner_seq.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/4011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=4011"}],"version-history":[{"count":1,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/4011\/revisions"}],"predecessor-version":[{"id":7123,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/4011\/revisions\/7123"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/4012"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=4011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=4011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=4011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}