Übungen zur Programmierung I - Erstes Semester Wirtschaftsinformatik WS 2019 DHBW Mosbach

Die Seite wird erstellt Helmut Winkler
 
WEITER LESEN
(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