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. Was ergibt 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1-1.0? Warum ist dies nicht exakt 0.0?

Mathematische Funktionen (10 Minuten)

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

double d = Math.sin( 0.23 );

Die Funktion sin() ist demnach eine Operation 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 );

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

Der Geldberechner

Schreibe ein Programm, welches dazu auffordert, die Anzahl der Münzen zu je einem Cent, zwei Cent, fünf Cent, 10 Cent einzugeben. Berechne den Gesamtbetrag.

Bedingungsoperator *

Wie kann man das Absolute einer Zahl (den positiven Teil) mit dem Bedingungsoperator berechnen? Nenne zwei Möglichkeiten.

double zahl = ....; 
double abs = ? : ; 
System.out.println( abs );

Lösung

Fallunterscheidungen

Alternativen

double x = Math.sin( 0.123456 ); // Zahl ist Überraschung 
if ( ... ) System.out.println( "passt" );

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.

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 und 1 durch Math.random().

double t = Math.random();

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

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.

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 args )
  {
    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:

X O L
+ L X X

= T L T

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.

Augensumme Auszahlung Gewinn
12 4facher Einsatz +1,50 Euro
11 3facher Einsatz +1,00 Eruo
10 2facher Einsatz +0,50 Euro
7,8,9 Einsatz zurück +0,00 Euro
2,3,4,5,6 keine -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.

Lösung

Collatz-Folge **

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

n -> n/2, falls n gerade ist, n -> 3n+1,
falls n ungerade ist. Die Folge ist beendet, wenn 1 erreicht ist.

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

Lösung
Lösung für die Rekursion

Methoden

Funktionen selber programmieren (10 Min)

Fülle die folgenden Zeilen für die Funktion linie(int n) mit Programmcode, sodass eine Linie mit "-" der Länge n gezeichnet wird. Setzte die Methode in eine Klasse LineUtils.

static void linie( int n )
{
}

Setze zunächst eine Test-main()-Funktion in die gleiche Klasse. Setze anschließend die main()-Funktion in eine neue Klasse LineUtilsTest.

Lösung

Funktionen mit primitivem Rückgabewert

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

Lösung

Primzahlen *

Eine Primzahl ist eine Zahl, die nur durch 1 und sich selbst teilbar ist.

  1. Schreibe eine Funktion boolean isPrime(int n), die für eine gegebene, positive ganze Zahl n>=2 feststellt, ob diese Zahl eine Primzahl ist oder nicht.
  2. Rufe die Funktion mit ein paar Testwerten auf und gib auf dem Bildschirm eine Meldung wie "... ist Primzahl" bzw. "... ist keine Primzahl" aus.
  3. Benutze die Funktion isPrime(), um die ersten 100 Primzahlen auszugeben.

Lösung

Überladene Funktionen * (10 Minuten)

Implementiere zwei Linienfunktionen

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

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( 3, "*=" );

Lösung

Funktionen 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 Funktion String abcz(char start, char end).

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

Lösung

JavaDoc

Dokumentiere die Methode abcz() mit einem JavaDoc-Kommentar. Mache anschließend die Klasse und ihre Methode öffentlich (stelle das Schlüsselwort public voran.