Imperatives Programmieren

Variablen und Datentypen

Variablen und Wertebereiche (10 Minuten)

  1. Definiere Variablen unterschiedlichen Typs und weise Werte zu. Teste die Wertebereiche.
  2. Was ist das Ergebnis des Ausdrucks 1000000*1000000? Warum entsteht dieses Ergebnis?
  3. Berechne 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1-1.0 und gib das Ergebnis mit einem einfach System.out.println(...) aus. Warum erscheint nicht exakt 0.0?

Lösung 2 int ist als Datenbereich zu klein, long funktioniert, etwa durch long l = 1000000; System.out.println(l*l);, Lösung 3Ein double kann 0.1 nicht präzise repräsentieren. Eine Ausgabe mit z.B. printf(...) könnte das Ergebnis runden.,

Mathematische Funktionen (10 Minuten)

In Java gibt es eine Klasse java.lang.Math, die wichtige mathematische Methoden bereitstellt. Möchte man den Sinus einer Zahl berechnen, schreibt man etwa:

double d = Math.sin( 0.23 );

Die Methode sin(double) ist demnach ein Angebot der Math-Klasse.

Lösung für das Maximum
Lösung für das Minimum dreier Zahlen

Unübersichtlichkeit vermeiden

Was ist an folgendem Beispiel ungünstig?

double tmp = 2 * ( höhe + breite );
System.out.println( tmp );
tmp = höhe * breite;
System.out.println( tmp );

Lösung a) tmp ist kein guter Name, es handelt sich um Umfang bzw. Fläche.
b) Die Bedeutung einer Variable soll sich nicht ändern.
Im Ergebnis: Besser zwei lokale Variablen.

Ein Eingabedialog *

Mit Hilfe der Klasse javax.swing.JOptionPane kann man einfache Dialogfelder darstellen. Folgendes Programm liefert eine Eingabezeile, die mit Return bestätigt werden kann.

public class Input {
  public static void main( String[] args ) { 
    String s = javax.swing.JOptionPane.showInputDialog( "Bitte Zahl eingeben" ); 
    System.exit( 0 ); 
  }
}

Lösung

Ausdrücke, Operanden und Operatoren

Die Münzmaschine *

Schreibe ein Programm, welches eine Fließkommazahl für einen Geldbetrag fordert. Gib aus, wie viele 2 €, 1 €, 50 Cent, 20 Cent, 10 Cent, 5 Cent, 2 Cent und 1 Cent Münzen verwendet werden müssen, um diesen Betrag mit Münzen auszuzahlen. Wenn etwa die Eingabe 1.59, ist, soll auf der Kommandozeile ausgegeben werden: 1 x 1 €, 1 x 50 Cent, 1 x 5 Cent, 2 x 2 Cent. Setze alle Java-Programme immer in neue Klassen/Dateien.

Lösung

Bedingungsoperator

Eine Variable noOfFiles enthält eine Anzahl Dateien, die Belegung ist >= 0. Es soll eine grammatikalisch korrekte Ausgabe formuliert werden, in Abhängigkeit ob es 0, 1 oder N Dateien gibt, etwa so: "Es gibt 0 Dateien.", "Es gibt 1 Datei.", "Es gibt 99 Dateien." Nutze für die Endung den Bedingungsoperator.

int noOfFiles = 1;  // oder 0, 1, 99, ...
System.out.printf( "Es gibt ...", ... );

Lösung

Fallunterscheidungen

Alternativen

Realisiere eine Eingabe. Bei einer negativen Fließkommazahl soll das Programm "negativ", bei positiven "positiv", oder eben "null" ausgeben. Fülle dazu folgendes Gerüst:

double d = Double.parseDouble( ....JOptionPane... );
if ( ... )
  System.out.println( "negativ/positiv/null" );

Schreibe ein Programm, welches genau dann "passt" ausgibt, wenn sich eine eingegebene Fließkommazahl x echt zwischen 0 und 1 befindet. Man kann Und-Anfragen mit dem &&-Operator formulieren.

Lösung

Der Gerade-/Ungerade-Test

Wie kann man einen Programmabschnitt formulieren, der zu einer Ganzzahl n ausgibt, ob sie gerade oder ungerade ist?

Lösung

Falsche Verzweigung

Das folgende Programmstückchen vertauscht den Inhalt der Variablen x und y, wenn x größer als y ist. Stimmt das?

if ( x > y )
  int swap = x; 
  x = y; 
  y = x;

Wozu gehört das else?

Welche Ausgabe erzeugt folgendes Programm:

if ( true ) {
if ( false )
if ( 3!=4 )
;
else
System.out.println( "Klabautermann" );
else
System.out.println( "Pumuckel" );
}

Finde das Ergebnis, ohne das Programm zu übersetzen.

switch-Anweisung

Erfrage vom Anwender eine Eingabe. Ist die Zeichenkette "ja" oder "j" ist, soll "true" auf dem Bildschirm ausgegeben werden, bei "n" oder "nein" soll "false" erscheinen und wenn es keines der genannten Alternativen ist, soll "nicht erkannte Eingabe" erscheinen.

Lösung

Schleifen

while-Schleifen

30 Sternchen soll in einer Reihe stehen. Wir könnten zwar

System.out.println( "*******...*" );

schreiben, doch dann würde die Anpassung von 30 auf eine andere Zahl wieder Zählen erfordern. Wie kann man dies mit einer while-Schleife lösen?

Lösung

Ein mathematisches Phänomen * (10 Min)

Nimm eine beliebige double-Variable t zwischen 0 (inklusiv) und 10 (exklusiv) mit folgender Zeile:

double t = Math.random() * 10;

Multipliziere t mit 2, wenn t < 1. Ziehe 1 ab, wenn t >= 1 ist. Setze diese Berechnung in eine while-Schleife, die endet, wenn t gleich 0 ist.

Lösung

Wie viele Sternchen erzeugt die for-Schleife?

Wie viele Sternchen würden bei den folgenden Programmausschnitten auf dem Bildschirm erscheinen?

for ( int sternchen = 0; sternchen <= 7; sternchen=sternchen+2 )
  System.out.println( "***" );

Beziehungsweise:

for ( int sternchen = 10; sternchen < 0; sternchen++ )
  System.out.println( "**" );

sternchen++ ist eine Abkürzung für sternchen=sternchen+1.

Lösung Es gibt 12 Sternchen in der ersten for-Schleife und keinen Durchlauf in der zweiten Schleife

So nicht von 1 bis 100 * (10 Min)

Folgendes Programm soll die Zahlen zwischen 1 und 100 aufaddieren und das Ergebnis ausgeben. Leider sind einige Fehler im Programm enthalten.

class Sűmme {
  private static int getSum() {
    int j == 0;
    for ( /* int */ i = 0, i <= 1OO, j++ );
      j += i
    ;
  }
  public static void Main( String aarg ) {
    system.out.println( getsum() );
  }
}

Ordne die Fehler in folgende Typen ein: Syntaktische Fehler, Semantische Fehler, Verstoß gegen Styleguide.

for-Schleifen

Schreibe eine Methode, welche die Dekaden des 20. Jahrhunderts ausgibt, also 1900, 1910, ...

Lösung

Geschachtelte Schleifen * (10 Minuten)

Erzeuge folgende Ausgabe:

1
2 2
3 3 3
4 4 4 4
5 5 5 5 5

Optional, wenn Zeit und Lust vorhanden: Die Ausgabe soll zentriert erscheinen.

Lösung

Statt denken rechnen ** (30 Min)

Eine Zeitschrift druckt die folgende Denksportaufgabe ab:

XOL
+LXX

=TLT

Da wir keine Lust zu denken haben, soll ein Programm entwickelt werden, welches durch Ausprobieren aller Möglichkeiten eine Lösung findet.

Mehr dieser schönen Aufgaben liefert Alphametic Puzzles.

Lösung

Ein Würfelspiel *

Wir sollen untersuchen, ob wir bei einem Spiel mit zwei Würfeln gute Chancen auf Gewinn haben. Gespielt wird mit zwei Würfeln mit den Augen 1 bis 6, deren Werte addiert werden. Wir beginnen das Spiel mit 50 Cent. Der Gewinn berechnet sich nach der unten stehenden Auszahlungstabelle.

AugensummeAuszahlungGewinn
124facher Einsatz+1,50 Euro
113facher Einsatz+1,00 Eruo
102facher Einsatz+0,50 Euro
7,8,9Einsatz zurück+0,00 Euro
2,3,4,5,6keine-0,50 Euro

Lohnt es sich, an diesem Spiel teilzunehmen? Simuliere in einer Schleife (etwa mit 1.000 Durchläufen), ob man auf Dauer gewinnt oder eher verliert. Die Würfelsumme kann man mit Zufallszahlen simulieren. Gib das erwirtschaftete oder verlorene Geld am Ende aus.

Falls man verliert, kann man die Qualität der Zufallszahlen anzweifeln. Würfe 10000000 mal und merke, welche Augenzahl wie oft gewürfelt wird. Sind die Zahlen im Prinzip gleichverteilt?

Lösung

Methoden

Methoden selber programmieren

Lege eine neue Klasse LineUtils an. Setze in die Klasse eine statische Methode linie(), die eine Linie aus zehn Minus-Zeichen schreibt. Setze zunächst eine main(...)-Methode in die gleiche Klasse.

Verschiebe anschließend die main(...)-Methode in eine neue Klasse LineUtilsTest.

Lösung

Methoden mit Parametern/Argumenten

Modifiziere die Methode, in dem ein Parameter eingeführt wird. Die Methode linie(int n) soll eine Linie mit "-"-Zeichen der Länge n zeichnen.

static void linie( int n ) {
}

Lösung

Methoden mit primitivem Rückgabewert

Schreibe eine Methode, die den Durchschnitt zweier Zahlen zurückgibt. Der Rückgabewert wird mit return-Wert eingeleitet. Wähle einen passenden Datentyp aus.

Lösung

Von Inch in cm

Deklariere eine neue Klasse MetricConversions. Ihr soll zwei statische Methoden gegeben werden: Eine, die von Zentimeter in Inch umrechnet, und eine, die von Inch in cm umrechnet.

Collatz-Folge **

Eine Collatz-Folge (bekannt auch als Syracuse-Problem, Kakutani-Poblem, Hasse-Algorithmus und Ulam-Problem) von Lothar Collatz, 1937 ist definiert durch

Beginnt man etwa mit n = 7, durchläuft der Algorithmus die folgenden Zahlen:

Programmieraufgaben:

Lösung
Lösung für die Rekursion

Überladene Methoden * (10 Minuten)

Implementiere zwei Linienmethoden

Die erste Methode gibt Linien gegebener Länge aus Minuszeichen aus. Bei der zweiten lässt sich das Füllzeichen angeben. Kann die erste Methode die zweite nutzen?

Setze eine Methode hinzu, die noch weiter parametrisiert, in dem sie vor der Linie einen Start-String und nach der Linie einen End-String setzt.

Wie sieht dann die "Weiterleitung" intern aus?

Bei Lust und Laune: Implementiere linie(int len, String s), die Strings nebeneinander setzt. Mit s.length() bekommt man die Länge eines Strings s und mit s.charAt(int index) an ein Zeichen an der Stelle index; der Index beginnt bei 0. Beachte die korrekte Länge, zum Beispiel beim Aufruf von

linie( 5, "*=" );    // ist das Ergebnis *=*=*

Lösung

Methoden mit einer Referenz als Rückgabewert * (30 Minuten)

Erzeuge eine Zeichenkette, die alle Zeichen im Alphabet erzeugt ("ABCDEF....Z"). Ändere dazu die nicht so schlaue Lösung ab. Wieso sollte sie überhaupt dumm sein?

static String abcz() {
  String s;
  s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  return s;
}

Erweitere die Implementierung durch eine Methode String abcz(char start, char end).

Schreibe eine Methode String abcz(char start, int anz), die ab start dann anz Zeichen liefert.

Lösung

Javadoc

Dokumentiere die Methoden line(...) mit einem Javadoc-Kommentar. Mache anschließend die Klasse und ihre Methode öffentlich (stelle das Schlüsselwort public voran). Rufe anschließend das Javadoc-Tool auf.