Übungen zur Programmierung I - Erstes Semester Wirtschaftsinformatik WS 2019 DHBW Mosbach
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
(1) Übungen zur Programmierung I Erstes Semester Wirtschaftsinformatik WS 2019 DHBW Mosbach Prof. Dr. Herbert Neuendorf herbert.neuendorf@mosbach.dhbw.de
(2) Tooling Eclipse Die allernötigsten Features https://www.eclipse.org/ Download → Download Packages : Eclipse IDE 2019-09 : Eclipse IDE for Java Developers https://www.oracle.com/technetwork/java Java SE / JDK - Im Rahmen der Veranstaltung >= JSE 8 Open JDK : https://jdk.java.net/ https://jdk.java.net/13/ Literatur zu Eclipse : T. Künneth: Eclipse - Kennenlernen. Verstehen. Effizient nutzen, Hanser 2018 (4).
(3) Tooling … Open Source JDK Anbieter IBM : AdoptOpenJDK auch 32bit Oracle : Oracle OpenJDK Amazon : Amazon Corretto Microsoft : Zulu Community JDK Red Hat : Red Hat Build of OpenJDK Achtung: Neuer Oracle Technology Network-Lizenzvertrag - Nur für persönliche Nutzung und Entwicklungszwecke kostenfrei - Alle anderen Verwendungszwecke sind nicht mehr kostenfre - Letzte freie Version: Java 8 Update 202 (Januar 2019) Suchmaschine: JDK 8u202 - z.B. www.oracle.com (Registrierung notwendig) OpenJDK (freie Version) https://jdk.java.net (JDK 13) Kollege Dr. Dillinger bietet Dropbox mit diversen JDK 8u202 32-/64-bit Varianten: https://www.dropbox.com/sh/hn5iduqp5exzsw2/AADpxEEhLbfM5EcSQ0aKjECga
(4) Voraussetzungen für Anlegen von Eclipse-Projekten : Eclipse-Projekte liegen als Unterordner in einem sogenannten workspace -Ordner. Dieser sollte nicht im Eclipse-Installationsverzeichnis liegen, sondern an anderem Ort. *) 1. Dort vor Start von Eclipse leeren Ordner anlegen, Name beliebig, z.B. : EclipseProjekte 2. Bei Erststart von Eclipse wird workspace-Ordner abgefragt … … bzw. man kann zu diesem navigieren ("Browse") und ihn auswählen. Alle neuen Projekte und Projektmetadaten werden in diesem Ordner angelegt. Jedes neue Projekt umfasst einen eigenen Unterordner. 3. Öfters verwendet Dateien (z.B. IO.java) in den workspace-Ordner kopieren. Eclipse Auch später ist jederzeit gewünschter workspace-Ordner anwählbar : Dazu im Eclipse-Menü : File → Switch Workspace ... *) Wenn man alte Eclipse-Installation löscht, so sind erstellte Projekte nicht betroffen
(5) Vor Anlegen eines neuen Projekts die alten Projekte schließen. Rechte Maustaste auf geöffnetes Projekt / Kontextmenü → Close Project Eclipse 1. Menü File → New → Java Project 2. Im Wizzard Project name vergeben. Project layout wählen (Next> Keine module-info.java ) Finish Neues Projekt wird im Package Explorer angezeigt - enthält aber noch keine eigenen Klassen 3. Im Package Explorer das Projekt selektieren + rechte Maustaste / Kontextmenü : New → Class 4. Wizzard Name: Modifier: package Superclass: java.lang.Object Which methods stubs would you like to create? public static void main( String[] args ) Finish Quellcodefile Name.java wird Projekt hinzugefügt und erscheint mit main()-Code im Code-Fenster. Generierte Kommentare löschen. Eigenen Code hinzufügen. 5. Optional: Bestehende .java-Files dem Projekt hinzufügen ( zB IO.java !) : Im Package Explorer im Projekt default package selektieren + rechte Maustaste / Kontextmenü : Import ... → General → File System : Next → Browse In Ordner navigieren. Files des Ordners werden angezeigt und File kann selektiert werden. Bei Into folder muss Projektordner eingetragen sein! Finish Kopie des selektierten .java-Files wird erstellt + Projekt hinzugefügt → steht zur Kompilation bereit
(6) Alle Einstellungen : Window → Preferences ... Quellcode-Font : General → Appearance → Colors and Font Eclipse dort : Java → Java Editor Text Font Edit Starttup und Shutdown Verhalten : General → Startup and Shutdown Speicher und Build Verhalten : General → Workspace Ablauf und Start von Programmen : Run/Debug → Launching Einstellen verwendete Java-Version : Java → Installed JRE Java → Compiler Einstellen zur Code-Formattierung, Compilier, Debuggen : Java → Code Style → Formatter Button : Edit ... ? Java → Compiler → Error / Warnings Java → Editor → Content Assist Liefert auf Einstellungsseiten kontextbezogene Erläuterungen Java → Editor → Folding Java → Editor → Typing Sichern & Wiederherstellen von Preference-Einstellungen : File → Export … → General → Preferences : Export all File → Import … → General → Preferences : Import all
(7) Ein-/Ausgabe-Handling - Modernes Vorgehen Klasse Scanner aus Paket java.util Methoden zum Einlesen von String, boolean, byte, short, int, long, float, double - Schema : class Eingaben { public static void main( String[ ] args ) { java.util.Scanner sc = new java.util.Scanner( System.in ); // sc.useLocale( new java.util.Locale( "en" ) ); // *) System.out.print( "Eingabe: " ); String st = sc.next(); System.out.println( st ); Wenn *) unterbleibt, muss bei int b = sc.nextByte(); Eingabe der Kommateil durch " , " short s = sc.nextShort(); getrennt werden. int n = sc.nextInt(); Durch Setzen von *) wird zum long l = sc.nextLong(); Trennen " . " erwartet. float f = sc.nextFloat(); double d = sc.nextDouble(); boolean bl = sc.nextBoolean(); sc.close(); // falls dies unterbleibt nur Warnung } }
(8) Prozedurale Strukturen Programmaufbau Primitive Typen Java-Kontrollstrukturen
(9) Übung 1: Schreiben Sie ein Programm, das Ihren "Body Mass Index" berechnet (BMI) 1.) Legen Sie in Eclipse ein neues Projekt (Name BMI) an und nehmen Sie das File IO.java als physische Kopie in Ihr Projekt auf. Verfahren Sie dazu wie in der Kurzanleitung beschrieben … Kontrollieren Sie, ob auf Ihrem Laufwerk ein entsprechender Projekt Ordner angelegt wurde. 2.) Fügen Sie eine Klasse BodyMassIndex mit main-Methode hinzu. In der main-Methode sollen double-Variablen für Größe [m] und Gewicht [kg] deklariert und mit Werten versehen werden. Mit diesen Werten: double bmi = Gewicht / (Groesse*Groesse) berechnen. Der berechnete Wert soll ausgegeben werden: IO.writeln( " Wert = " + bmi ) ; 3.) Idealwerte liegen im Bereich 20 - 26 ... na ja …
(10) Übung 1: Schreiben Sie ein Programm, das Ihren "Body Mass Index" berechnet (BMI) 4.) Statt die Zahlenwerte "hart" in das Programm zu schreiben, soll die Methode: IO.promptAndReadDouble( "Bitte ... eingeben: " ); der Klasse IO verwendet werden, um von Verwender*innen die Werte beim Lauf des Programms abzufragen. 5.) Fragen Sie mittels der Methode: IO.promptAndReadString( "Bitte Namen eingeben: " ); der Klasse IO den User-Namen ab, und lassen Sie eine Begrüßung ausgeben, die den Namen enthält, bevor die Werte für Gewicht und Größe abgefragt werden. 6.) Gestalten Sie die Ausgaben des Programms ein wenig schöner durch das Einfügen von Rundungen bzw. durch Ausgabe von Leezeilen etc. …
(12) Übung 2: Machen Sie kleine Tests mit den primitiven Java-Datentypen Legen Sie in Eclipse ein neues Projekt inklusive Klasse + main()-Methode an 1.) Welchen Fehler und warum liefert folgendes Coding? Wie lässt sich der Fehler beheben? a) char c1 = 'N' ; short s1 = 'N' ; short s11 = c1; b) int n2 = 100 ; short s2 = 100; char c2 = 100; c2 = n2 ; c2 = s2 ; 2.) Welche Ausgabe liefert jeweils folgendes Coding - und warum? a) double d1 = 0.2; float f1 = 0.2f; IO.writeln( d1==f1 ); b) double d2 = 1E30; double d3 = 1.1; IO.writeln( "Wert m " + (d2 + d3) ); c) float f2 = 1.0f/3; IO.writeln( "Wert " + f2 ); float f22 = (float)(1.0/3); IO.writeln( "Wert " + f22 ); d) double d4 = (1.0f/3); IO.writeln("Wert " + d4); double d44 = 1.0/3; IO.writeln("Wert " + d44);
(13) Übung 2: Machen Sie kleine Tests mit den primitiven Java-Datentypen 3.) Es wird folgende Iteration verwendet: float dy = 1E-10f ; float yn = 1f ; int i = 0 ; while( yn < 10.0 ) { yn = yn + dy ; i++ ; IO.writeln( "Iteration: " + i + " yn = " + yn ) ; } // Zu erwarten ist ein Anwachsen von yn. Wie beurteilen Sie die numerische Korrektheit des Programmfragments ? Änderung ? 4.) Welchen Wert hat die Variable b - warum ? boolean b = true&&false == true&&false ; 5.) Wie könnte man durch ein elementares Programm ermitteln, an welcher Stelle der UC-Tabelle das Zeichen '@' steht ? 6.) Der maximal darstellbare int-Wert lässt sich abgreifen durch Integer.MAX_VALUE . Wie sieht eine Coding-Strecke aus, die damit sicherstellt, dass für int a, b > 0 die Berechnung a + b nur durchgeführt wird, wenn kein Überlauf stattfindet.
(14) Machen Sie kleine Tests mit den primitiven Java-Datentypen Übung 2: 7.) In welchem Zweig landet man durch folgendes Coding: boolean b = false; if( b = false ) { /* … 1 … */ } else{ /* … */ } Könnte einem der analoge Fall auch mit b vom Typ int ( if(x=1) … ) passieren? 8.) Warum liefern die folgenden Operationen das selbe Resultat ? byte a = 4 ; byte b = 16 ; IO.writeln( "Wert = " + (a+b) ) ; IO.writeln( "Wert = " + (a|b) ) ; IO.writeln( "Wert = " + (a^b) ) ; Welches Ergebnis liefert: IO.writeln( "Wert = " + (a&b) ) ;
(16) Übung 3: Machen Sie kleine Tests bezüglich der Java-Kontrollstrukturen 1.) Wie lautet die Ausgabe der Schleife ? Wie interpretiert der Compiler das Coding ? int i = 0 ; while( i
(17) Übung 3: Machen Sie kleine Tests bezüglich der Java-Kontrollstrukturen 4.) Welches der folgenden Konstrukte kompiliert - welches nicht - und wie denkt der Compiler ? ( Die erste und letzte Zeile seien jedes Mal vertreten - aber es wird jeweils entweder die zweite, dritte oder vierte Zeile verwendet. ) int n, a=5 ; // while( a
(18) Switch-Anweisung + Schleife Übung 4: 1.) Verwenden Sie die Switch-Anweisung : In einer ausführbaren Klasse soll innerhalb der main()-Methode vom Verwender eine Zahl zwischen 0 und 9 eingelesen werden. Wenn 0 oder 1 oder 2 oder 3 eingegeben wird, dann geben Sie aus "Bereich Null bis Drei". Wenn 4 oder 5 oder 6 oder 7 eingegeben wird, dann geben Sie aus "Bereich Vier bis Sieben". Wenn 8 oder 9 eingegeben wird, dann geben Sie aus "Bereich Acht bis Neun". Durch den default-Zweig sollen alle anderen Zahleneingaben ≠ [0 .... 9] behandelt werden. 2.) Was passiert, wenn Sie die break-Anweisung vergessen? (Ausprobieren!) 3.) Ergänzen Sie das Programm durch eine geeignete Schleife: Es soll abgefragt werden, ob noch eine Eingabe gewünscht ist. Solange User zustimmt, soll der o.a. Teil erneut durchlaufen werden. Falls nicht, soll sich das Programm beenden. Verwenden Sie zur Userabfrage die Methode IO.promptAndReadChar(…).
(19) Übung 5: Schreiben Sie ein Programm zur Zinseszinsberechnung : Legen Sie ein neues Projekt an, in das Sie auch die Klasse IO.java aufnehmen. Man soll beim Lauf des Programms folgende Werte eingeben können: a) das anzulegende Kapital b) den Zinssatz c) die Laufzeit der Geldanlage (Anzahl der Jahre in denen verzinst wird) Das aktuelle Kapital (inklusive Verzinsung) soll für jedes Jahr ausgegeben werden. Es wird kein Kapital abgezogen, sondern das Kapital inklusive Zinsen der Vorjahre weiterverzinst. Anmerkung 1: Aus einem Kapital K wird nach einem Jahr Verzinsung mit dem Zinssatz z das Kapital: K=K+K*z Dies wiederholt sich mit dem aktuellen Kapitalbestand jedes Zinsjahr aufs Neue. (Der Wert z kennzeichnet hier die Zinsrate – d.h. wenn der Zins 10% beträgt, wäre z = 0.1) Anmerkung 2: Verwenden Sie eine geeignete Schleife. Benutzen Sie (wenn das Programm korrekt arbeitet) die Methode IO.round(…), um die berechneten Geldbeträge auf zwei Kommastellen zu kürzen.
(20) Übung 5b: Schreiben Sie ein Programm zur Rentenberechnung : Für Millionäre oder Aussteiger Legen Sie ein neues Projekt an - oder modifizieren Sie das bestehende Programm. Man soll beim Lauf des Programms folgende Werte eingeben können: a) das anzulegende Kapital b) den Zinssatz c) die Rente, die (am Ende jeden Jahres) aus dem Kapitalstock abgezogen wird. Das aktuelle Kapital (inklusive Verzinsung) soll für jedes Jahr ausgegeben werden. Es wird das aktuelle Kapital jeweils weiterverzinst. Das Programm soll feststellen, wie lange man von dem Anfangskapital leben kann, d.h. nach wie viel Jahren das Kapital durch die regelmäßigen Rentenentnahmen aufgebraucht ist. Verwenden Sie eine geeignete Schleife. Natürlich sollte Rente > Anfangskapital * Zinssatz sein ! (Warum ?)
(21) Übung 6: Harmonische 1.) Berechnen Sie die harmonische Reihe : (IO verwenden) Innerhalb der main-Methode Ihrer ausführbaren Klasse soll die harmonische Reihe 1/n berechnet werden - und zwar zuerst für n = 1 bis 10000. Führen Sie die Berechnung zuerst mit float-Werten (und float-Genauigkeit) durch. Berechnen Sie die Reihe zweimal : a) von "unten nach oben" : 1/1 + 1/2 + 1/3 + ....... + 1/9999 + 1/10000 b) von "oben nach unten" : 1/10000 + 1/9999 + 1/9998 + ......+ 1/2 + 1/1 Geben Sie das Ergebnis aus - und vergleichen Sie die Werte ! 2.) Wiederholen Sie das Ganze mit double-Werten (und -Genauigkeit) ! Was stellen Sie fest ? 3.) Berechnen Sie die harmonische Reihe "von unten nach oben" mit immer größeren Werten n = 1 000 000 , 10 000 000, 100 000 000, … . Was stellen Sie bei float-Genauigkeit fest ?
(22) Übung #1 : Vollkommene Zahlen Eine natürliche Zahl n heisst vollkommen, wenn die Summe aller ihrer Teiler (1 und n eingeschlossen) gleich 2*n ist. Bsp: Die 6 ist vollkommen, denn 1 + 2 + 3 + 6 = 2 * 6 Man bestimme durch ein Programm alle vollkommenen Zahlen
(23) Übung #2 : Iterative Lösung nichtlineare implizite Gleichung durch Relaxations-Methode Lösen sie die folgende Gleichung - d.h. bestimmen Sie den Wert von x, der die Gleichung löst: −x x = 2−e Gehen Sie dazu wie folgt vor : analytisch ist die Gleichung nicht lösbar Starten Sie mit dem Wert von x = 1.0 (auch andere Startwerte liefern korrekte Ergebnisse). Setzen Sie den Wert von x in die rechte Seite der Gleichung ein und nehmen Sie das Ergebnis in x entgegen. Diesen neuen Wert von x setzen Sie wieder in die Gleichung ein … etc. Nach wenigen Iterationen konvergiert der Wert von x gegen das korrekte Ergebnis. Sie könnten die Genauigkeit vorgeben, indem Sie die Iteration abbrechen, wenn der Unterschied zwischen altem und neuen Wert von x unter eine Schranke fällt, z.B. 1E-6. Java-Sprachmittel: Math.exp( ) Math.abs( )
(24) Erschießen Sie π ! Übung 7: Implementieren Sie folgenden Algorithmus zur statistischen Näherung der Kreiszahl Pi: Näherung von Pi mit der sogenannten Monte-Carlo-Methode: Folgende Schritte werden n-mal wiederholt (n soll vom User eingegeben werden) : 1. Mittels der Methode Math.random( ) werden Paare (x,y) von Zufallszahlen im Bereich [0...1] gezogen: double x = Math.random(); 2. Man berechnet dafür den Wert von dist = x*x + y*y 3. Wenn dist
(25) Übung 8 : Ratespiel Programmieren Sie ein Zahlenratespiel Durch die Anweisung : int geheim = (int) ( 100 * Math.random( ) + 1 ); wird eine Zufallszahl zwischen 1 und 100 generiert. Der User des Programms soll versuchen, diese Zahl zu erraten. Programmieren Sie dazu eine Schleife, in der in jedem Schleifendurchlauf : - darüber informiert wird um den wievielten Rateversuch es sich handelt, - ein neuer Rateversuch eingegeben werden kann - mittels IO.promptAndReadInt( … ) - und darüber informiert wird, ob die geratene Zahl zu groß, zu klein oder korrekt ist. Die Schleife soll so lange durchlaufen werden, bis die Zahl erraten ist.
(26) Eine Nacht in MonteCarlo Übung #3 : 1.) Legen Sie ein neues Projekt mit einer ausführbaren Klasse Casino an 2.) Mit der Anweisung: k = (int) (Math.random()*37 ) kann man sich eine ganzzahlige Zufallszahl k im Bereich [0 … 36] verschaffen. Man interpretiere k als als das Ergebnis eines Roulette-Wurfs und simuliere folgendes Spiel: Sie begeben sich mit 10000,-GE Kapital in das Spielkasino und setzen 10,-GE auf Pair, d.h. : - Sie erhalten nach dem nächsten Spiel 20,-GE ausgezahlt, falls k gerade und k ungleich Null ist (Gewinn = doppelter Einsatz im Erfolgsfall); - Falls k = 0 oder ungerade ist, verlieren Sie Ihren Einsatz. Sie machen n Spiele mit folgender Strategie: a) Wenn Sie noch im Besitz von mindestens 10000,-GE sind, und das letzte Spiel gewonnen haben, setzen Sie 10,-GE b) Wenn Sie noch im Besitz von mindestens 10000,-GE sind, aber das letzte Spiel verloren haben, verdoppeln Sie Ihren Einsatz c) Wenn Sie nur noch weniger als 10000,- GE haben, setzen Sie das Doppelte Ihres Gesamtverlustes. Falls Ihr Kapital für den vorgesehenen Einsatz nicht ausreicht, setzen Sie Ihre Restkapital. Falls Sie den erlaubten Höchsteinsatz von 1000,-GE überschreiten würden, setzen Sie 1000,- GE 3.) Geben Sie für jedes Spiel folgende Werte aus : Nr. des Spiels, geworfene Zahl, Kapital vorher, Einsatz, Kapital nachher
(28) Prozedurale Strukturen Java Methoden
(29) Schreiben von Java-Methoden - Einstieg Überarbeiten Sie die bestehenden Projekte. Modularisieren Sie diese, indem Sie Coding aus der main()-Methode auslagern und als separate Methoden zusammenfassen. Diese werden aus main() heraus aufgerufen, mit Werten versorgt - und ihre Rückgabewerte entgegengenommen: Übung Zinsen: public static double zins( double kap, double zs, int n ) Übung 9 : public static int dauer( double kap, double zs, double rente) Übung Harmonische: public static double harmonischDouble( int max ) public static float harmonischFloat( int max ) Übung PI: public static double piSchuss( int n ) Testen Sie die Methoden, indem Sie sie aus main() heraus aufrufen. Setzen Sie Breakpoints und debuggen Sie die Methoden. Springen Sie dabei in das Methodencoding hinein und auch wieder heraus. Kontrollieren Sie den aktuellen Wert von Variablen ... Machen Sie sich mit dem Debugger vertraut !
(30) Java-Methoden Schreiben (und testen) Sie Methoden, mit denen Sie den größten gemeinsamen Teiler zweier ganzer positiver Zahlen ermitteln können : public static int ggTIterativ( int a, int b ) Übung 10 : public static int ggTRekursiv( int a, int b ) Realisieren Sie eine iterative und eine rekursive Variante ! Euklidischer Algorithmus : EUCLID( a,b ) EUCLID_RECURSIVE( a,b ) wenn a = 0 dann return b wenn b = 0 dann return a sonst wenn a = 0 dann return b solange b 0 wenn a > b dann wenn a > b dann a = a - b return EUCLID_RECURSIVE( a - b, b ) sonst b =b-a sonst return a return EUCLID_RECURSIVE (a, b – a )
(32) Java-Methoden Übung #4 : Schreiben Sie Methoden, die nach Primzahlen suchen : public static int countPrimes( int max ) public static boolean isPrime( int n ) Die Methode isPrime ermittelt, ob eine Zahl n eine Primzahl ist – und liefert entsprechend true oder false zurück. Dazu prüft Sie, ob sich die Zahl n durch Zahlen zwischen 2 und n/2 glatt teilen lässt. Wenn dies der Fall ist, dann ist n keine Primzahl. Die Methode countPrimes zählt die Anzahl der Primzahlen im Bereich zwischen 1 und max. Deren Anzahl wird an den Aufrufer zurück gegeben. Dazu verwendet die Methode intern die Methode isPrime. Testen Sie die Methode countPrimes, indem Sie sie aus main() heraus mit Werten aufrufen und das Ergebnis (Zahl der Primzahlen) auf der Konsole ausgeben.
Sie können auch lesen