Grundlagen der Programmierung 7.1 Vom Problem zum Programm................... 38 7.2 Programmiersprachen.......................... 38 7.3 Erste Schritte.................................. 38 7.4 Entwicklerwerkzeuge.......................... 39 7.5 Datentypen................................... 39 7.6 Programmstrukturen........................... 41 ÜBERBLICK 7
7 Grundlagen der Programmierung Lerninhalte Das Erlernen einer Programmiersprache ist weiterhin die Grundvoraussetzung, um wesentliche Konzepte der Informatik zu verstehen. Im vorliegenden Kapitel erfolgt der Einstieg algorithmisch orientiert. Als Programmiersprache wird aufgrund des hohen Verbreitungsgrads Java verwendet, zur Programmentwicklung wird BlueJ eingesetzt. 7.1 Vom Problem zum Programm Der Einstieg in die Welt der Programmierung erfolgt zunächst anhand eines Gedankenbeispiels, das sich auch noch durch die folgenden Kapitel ziehen wird: dem Sortieren eines Kartenhaufens. Dabei wird im vorliegenden Abschnitt zunächst die Problematik besprochen, ein Beispiel des täglichen Lebens in eine dem Computer verständliche Form zu bringen. Der Lernende wird erneut mit dem bereits aus Kapitel 3 bekannten EVA-Prinzip konfrontiert. Für den Einstieg in die Programmierung bieten sich folgende Aufträge an: Formulieren Sie Aufgaben des täglichen Lebens mit dem EVA-Prinzip. Beispiele: Schreiben einer Klausur, Durchführen einer Kopfrechenaufgabe. Welche Handlungen des täglichen Lebens lassen sich von einem Computer erledigen, welche nicht? 7.2 Programmiersprachen Der Teilabschnitt gibt einen groben Überblick über die wichtigsten Programmiersprachen und führt gleichzeitig eine Klassifizierung durch. Zum Weiterarbeiten: Informieren Sie sich über den Verbreitungsgrad einzelner Programmiersprachen. Hinweis: Unter dem Link http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html findet man eine aufschlussreiche Statistik zur Thematik. Welche Programmiersprachen werden hauptsächlich in der Industrie verwendet? Sprechen Sie mit Informatikern aus Ihrer Verwandtschaft/Ihrem Bekanntenkreis! 7.3 Erste Schritte In diesem Abschnitt sollen die Lernenden anhand des allseits beliebten Hello Word-Einstiegsprogramms zunächst einen Überblick bekommen, welch große Vielfalt an Programmiersprachen den Markt bevölkert. Das Programm Hello World dient dem Programmierer seit jeher dazu, eine neue Programmierumgebung bzw. deren Werkzeuge kennenzulernen. 38
7.4 Entwicklerwerkzeuge Aufgaben (S. 186) 1. Sehen Sie sich auf der Seite http://www2.latech.edu/~acm/helloworld Beispiele zu Hello World in weiteren Programmiersprachen an. 2. Versuchen Sie, einige ausgewählte Hello World-Beispiele in der Lernumgebung zu kompilieren und zu interpretieren. Die meisten dort angewendeten Programmiersprachen lassen sich mit dem Paketmanager Synaptic in der Lernumgebung installieren. Lösungen/didaktische Hinweise 1. Der Link enthält Programmierbeispiele in nahezu allen existierenden Sprachen. Hier bietet sich für die Lernenden ein struktureller Vergleich der Sprachen an. Welche Sprachen erscheinen dem Laien intuitiv einfach, welche sind eher komplex? 2. Hier sollten in jedem Fall die Beispiele zu C/C++ und Java getestet werden. Aber auch Prolog ist als Beispiel einer KI-Sprache interessant. 7.4 Entwicklerwerkzeuge Die Lernenden erhalten in diesem Abschnitt einen Einblick in die für die Programmierung wichtigen Werkzeuge. Dem Unterrichtenden bleibt es dabei freigestellt, ob er zunächst den Umgang mit Editor und Compiler auf der Kommandozeile bespricht (als Editor bietet sich hier joe an) oder gleich die IDE BlueJ verwendet. Die Programmierbeispiele des Buchs sind in BlueJ entwickelt worden, die Quelltexte lassen sich aber auch auf der Kommandozeile kompilieren. Arbeitsaufträge: Testen Sie das Syntaxhighlighting verschiedener Programmquelltexte im Editor gedit. Die Quelltexte diverser Sprachen zum Hello World-Beispiel können wieder von http:// www2.latech.edu/~acm/helloworld entnommen werden. Arbeiten Sie sich anhand eines einfachen Programmbeispiels in die BlueJ-Arbeitsumgebung ein (vgl. Anhang A4). 7.5 Datentypen Die Lernenden sollen verschiedene Datentypen kennenlernen. Im Unterschied zur Mathematik werden Variablen in der Informatik mit aussagekräftigen, selbsterklärenden Bezeichnern versehen. Die Zuordnung einer Variablen zu einem bestimmten Datentyp erfolgt aus Gründen der Speichereffizienz. Ergänzender Arbeitsauftrag: Ändern Sie im Programm Quader die Variablentypen von double auf integer. Welche Probleme ergeben sich dadurch? Die Lernenden sollen an dieser Stelle erfahren, dass die verwendete Java-Bibliotheksfunktion ein bestimmtes Eingabedatenformat erwartet. In diesem Zusammenhang kann auch auf Typecasting und die daraus resultierenden Fehlerquellen eingegangen werden. 39
7 Grundlagen der Programmierung Aufgaben (S. 193) 1. Bauen Sie bewusst einige Fehler in den lauffähigen Quellcode ein und schauen Sie sich die Fehlermeldungen an, die der Compiler darauf ausgibt. 2. Schreiben Sie ein Programm, das den Umfang und die Oberfläche und das Volumen einer Kugel bei vorgegebenem Radius berechnet. Recherchieren Sie ggf. die dafür notwendigen Formeln in der Wikipedia (www.wikipedia.de). Lösungen/didaktische Hinweise 1. Die Lernenden sollen an dieser Stelle merken, dass die Fehlermeldungen z.t. nicht wirklich im Zusammenhang mit dem verursachenden Fehler stehen. In der BlueJ- Umgebung werden die Fehler am unteren Fensterrand des Editors angezeigt. 2. Das folgende Listing zeigt das Java-Programm zur Berechnung des Volumens und der Oberfläche einer Kugel bei vorgegebenem Radius: import java.math.*; /*Import der Mathematikbibliothek*/ public class Kugel public static void main (String args[]) double r; /* r = Radius der Kugel */ Eingabe ein = new Eingabe(); r = ein.readdouble("radius r: "); /* Einlesen von r */ double V = 4.0/3.0*Math.PI*r*r*r; double O = 4.0*Math.PI*r*r; /* Hier erfolgen die Berechnungen von Volumen und Oberfläche */ System.out.println(" Volumen = " + V); /* Ausgabe des Volumens der Kugel*/ System.out.println(" Oberfläche = " + O); /* Ausgabe der Oberfläche der Kugel*/ Listing 7.1: Berechnung von Kugelvolumen und Oberfläche Erläuterung der Aufgabenstellung Sinn der Übung ist zunächst der Transfer des einfachen EVA-Programms zur Berechnung der Kenngrößen eines Quaders auf eine Kugel. Die Schüler sollen dabei insbesondere auch die benötigte Formel durch eine Google-Recherche ausfindig machen, um ihre Recherchekompetenz zu festigen. 40
7.6 Programmstrukturen 7.6 Programmstrukturen In diesem Abschnitt werden die wichtigsten algorithmischen Strukturen vermittelt. Zunächst werden die beiden Standardvarianten zur grafischen Darstellung von Algorithmen besprochen: der PAP und das Nassi-Shneiderman-Diagramm, besser bekannt als Struktogramm. Anhand konkreter Beispiele werden dann die Strukturen Anweisungsfolge, Verzweigung und Schleife besprochen und sowohl in Form eines Struktogramms als auch Programms demonstriert. Im Rahmen des Teilabschnitts ergeben sich vielfältige Programmieraufgaben, deren Lösung nachfolgend vorgestellt wird. Aufgaben (S. 196) 1. Erstellen Sie ein Java-Programm, das einen in Euro eingegebenen Geldbetrag in Dollar umrechnet. 2. Erstellen Sie ein Programm, das zu einem vorgegebenen Nettopreis die Mehrwertsteuer ausrechnet und sowohl den Bruttopreis (Preis inkl. Mehrwertsteuer) als auch die im Preis enthaltene Mehrwertsteuer ausgibt. Orientieren Sie sich bei der Lösung an Listing 7.5. Lösungen 1. Erstellen Sie ein Java-Programm, das einen in Euro eingegebenen Geldbetrag in Dollar umrechnet. import java.math.*; public class Euro_Dollar public static void main (String args[]) double euro, kurs, dollar; /* Eingabe der Variablen */ Eingabe ein = new Eingabe(); euro = ein.readdouble("betrag in Euro: "); /* Einlesen des Euro-Betrags */ kurs = 1.22; /* aktueller Kurs */ dollar = kurs*euro; dollar = Math.round(dollar * 100. ) / 100.; /* Runden des Werts */ System.out.println(euro+" Euro sind " + dollar +" Dollar."); /* Ausgabe des Dollar-Betrags */ Listing 7.2: Umrechnung Euro/Dollar 41
7 Grundlagen der Programmierung 2. Erstellen Sie ein Programm, das zu einem vorgegebenen Nettopreis die Mehrwertsteuer ausrechnet und sowohl den Bruttopreis (Preis inkl. Mehrwertsteuer) als auch die im Preis enthaltene Mehrwertsteuer ausgibt. import java.math.*; public class Mehrwertsteuer public static void main (String args[]) double netto, steuern, brutto, steuersatz; /* Definition der Variablen */ Eingabe ein = new Eingabe(); netto = ein.readdouble("nettobetrag: "); /* Einlesen des Netto-Betrags */ steuersatz = 1.19; /* aktueller Steuersatz */ steuern = netto * steuersatz; brutto = netto + steuern; steuern = Math.round(steuern * 100. ) / 100.; brutto = Math.round(brutto * 100. ) / 100.; /* Runden der Werte */ System.out.println(" Die Steuern betragen " + steuern +" Euro."); /* Ausgabe der Steuern */ System.out.println(" Der Gesamtpreis beträgt " + brutto +" Euro."); /* Ausgabe des Gesamtpreises */ Listing 7.3: Berechnung der Mehrwertsteuer Erläuterung der Aufgabenstellung Auch bei dieser Aufgabe steht der Transfer des Gelernten vom vorgegebenen Beispiel im Vordergrund. 42
7.6 Programmstrukturen Zum Weiterarbeiten 1. Bauen Sie in das Programm aus Listing 7.6 folgenden Fehler ein: Ergänzen Sie in Zeile 16 ein Multiplikationszeichen hinter der Variablen b, sodass die Zeile nunmehr lautet: 16 D = b*b*-4*a*c; 2. Was für Auswirkungen hat diese Ergänzung auf den Programmablauf? 3. Bauen Sie selbst Fehler in das Programm ein und verfolgen Sie die Ausgaben des Compilers. Lösungen/didaktische Hinweise 1. Hier erfahren die Lernenden den Vorzug des Debuggers: Durch das zusätzliche Multiplikationszeichen, das durch einen Tippfehler entstehen könnte, wird die Rechnung zwar formal ausgeführt, liefert aber ein falsches Ergebnis. Ein besonders tückischer Laufzeitfehler, der vom Compiler nicht identifiziert wird. 2. Derartige selbst eingebaute Fehler sind gerade in der Anfangsphase der Programmierung wichtig, um das Spektrum der Compilerfehlermeldungen kennenzulernen. Aufgabe (S. 201) Schreiben Sie ein Java-Programm, das das Notenpunktesystem der gymnasialen Oberstufe (Noten von 00 bis 15) in verbalisierte Form ( ungenügend bis sehr gut ) umwandelt (siehe www.wikipedia.de/punktesystem der gymnasialen Oberstufe). Lösung import java.math.*; public class Punktesystem public static void main (String args[]) int punkte; Eingabe ein = new Eingabe(); System.out.println("Geben Sie Ihre Note ein!"); punkte = ein.readint("note (0-15): "); switch(punkte) case 0: System.out.println("ungenügend"); break; 43
7 Grundlagen der Programmierung case 1: System.out.println("mangelhaft"); break; case 2: System.out.println("mangelhaft"); break; case 3: System.out.println("mangelhaft"); break; case 4: System.out.println("ausreichend"); break; case 5: System.out.println("ausreichend"); break; case 6: System.out.println("ausreichend"); break; case 7: System.out.println("befriedigend"); break; case 8: System.out.println("befriedigend"); break; case 9: System.out.println("befriedigend"); break; case 10: System.out.println("gut"); break; case 11: System.out.println("gut"); break; case 12: System.out.println("gut"); break; case 13: System.out.println("sehr gut"); break; case 14: System.out.println("sehr gut"); break; case 15: System.out.println("sehr gut"); break; default: System.out.println("Die Eingabe ist ungültig."); Erläuterung der Aufgabenstellung Die Aufgabe ist ein relativ einfacher Transfer des im Buch vorgestellten Beispiels zu den Wochentagen. 44
7.6 Programmstrukturen Aufgaben (S. 203) CARL FRIEDRICH GAUSS hat in der oben beschriebenen Anekdote eine Formel entwickelt, mit der sich die Summation einer endlichen Reihe stark vereinfacht. Für die Summe aller natürlichen Zahlen bis zu einer Zahl n gilt: i= 1 1. Beweisen Sie (unterstützt durch eine Wikipedia-Recherche) die Richtigkeit dieser Formel. 2. Ändern Sie das Programm aus Listing 7.8 so ab, dass die Gaußformel zur Berechnung der Reihe verwendet wird. 3. Welchen Vorteil könnte die Anwendung der Gaußformel im Programm bringen? Lösungen/didaktische Hinweise 1. Der Beweis kann direkt aus der Wikipedia übernommen werden. Er basiert auf der vollständigen Induktion. 2. Im Programm ist direkt der folgende Code einzusetzen: int summe = n*(n+1)/2; n n ( n + 1) i = 1+ 2 + 3 +... + n = 2 3. Der Vorteil der Formel ist die direkte Berechnung des Ergebnisses und damit die Reduktion der Rechenschritte im Vergleich zur Iteration. Aufgabe (S. 205) Was geschieht, wenn Sie in Zeile 16 des Listings die Bedingung zum Abbruch der Schleife wie folgt ändern? 16 while (kapital == 2*startkapital) Bedingung: Identität durch doppeltes Gleichheitszeichen Lösung/didaktische Hinweise In diesem Fall prüft die Abfrage gleich am Anfang, ob das verzinste Kapital inklusive Zinseszinsen exakt gleich dem doppelten Startkapital ist, was zu Beginn aber nicht erfüllt sein kann. Die Schleife wird somit nicht betreten, das Programm liefert als Verdopplungszeit 0 Jahre. 45
7 Grundlagen der Programmierung Aufgabe (S. 208) Analysieren Sie folgendes Listing und erläutern Sie, was ausgegeben wird: public class Praefix_Postfix public static void main(string[] args) int i; i = 23; i++; i--; System.out.println(i); System.out.println(i++); System.out.println(++i); // Lösung/didaktische Hinweise Die Lerngruppe sollte hier wirklich angehalten werden, das Programm in Form eines Schreibtischtests zu analysieren und die Analyse hinterher durch Programmierung zu bestätigen. Die Programmausgabe lautet: 23, 23, 25. 46