Programmierung I - Java 


Übungsblatt #1 (DO, 13. Oktober) Lösungen
Übungsblatt #2 (DO, 20. Oktober) Lösungen
Übungsblatt #3 (DO, 27. Oktober) Lösungen
Übungsblatt #4 (DO, 3. November) Lösungen
Übungsblatt #5 (DO, 10. November) Lösungen


Übungsblatt #1 (DO, 13. Oktober)


Aufgabe 1:

Gegeben sei folgendes Problem: Berechne die Summe aller ungeraden Zahlen von n bis m. Skizzieren Sie analog wie in der Vorlesung einen Algorithmus

a) in einer (pseudo) Programmiersprache,

b) als Flussdiagramm,

c) als Nassi-Shneidermann-Diagramm.


Aufgabe 2:

Nennen Sie Beispiele, ob und wenn ja wie ein Kochrezept gegen die theoretischer Eigenschaften von Algorithmen (eindeutig, parametrisierbar, ausführbar, Terminierung, Determinismus) verstoßen könnte.


Aufgabe 3:

Diskutieren Sie die Vor- und Nachteile zwischen compilierten Sprachen, Skript sprachen und VM-Sprachen,


Aufgabe 4:

Tippen Sie das in der Vorlesung vorgestellte „Hallo Welt“ Java-Programm ab und lassen es (erfolgreich) laufen. Ändern Sie folgende Dinge im Quelltext ab und beobachten Sie, wie der Compiler reagiert:

- Verdoppeln Sie die Zeile, in der das „Hallo, Welt“ steht.

- Ändern Sie die Einrückung der Zeilen.

- Fügen Sie Leerzeilen ein.

- Fügen Sie weitere Zeichen in die Zeichenkette „Hallo, Welt“ ein.

- Fügen Sie die Zeichen \n in die Zeichenkette ein.

- Nennen Sie die Datei im Explorer um.

- Entfernen Sie eine geschweifte Klammer.


Aufgabe 5:

Versuchen Sie durch verschiedene Veränderungen am Quelltext des „Hallo, Welt“ -Programms mindestens 10 verschiedene Fehlermeldungen des Java-Compilers zu erzeugen.

Wie viele Fehlermeldungen schaffen sie „auf einmal“?


Übungsblatt #2 (DO, 20. Oktober)

Aufgabe 1:

Zeichnen Sie ein Flussdiagramm, welches zu einer gegebenen Jahreszahl year ermittelt, ob es sich um ein Schaltjahr handelt oder nicht. Schaltjahre sind alle durch 4 teilbaren Jahre, die nicht durch 100 teilbar sind. Alle durch 400 teilbaren Jahre sind jedoch wieder Schaltjahre.


Aufgabe 2:

Gegeben sei folgender Regelsatz in EBNF:

A ::= "(" A ")" | A + A | C

B ::= "1" { "0" | "1" } | "0"

C ::= C "*" C | B

a) Konstruieren Sie die zugehörigen Syntaxdiagramme

b) Welche Sätze werden durch A erzeugt?

c) Geben Sie einen Satz an, der nicht von A erzeugt wird.


Aufgabe 3:

Berechnen sie jeweils die Darstellung x einer Zahl im anderen Zahlensystem:

a) 742110 = x2

b) F16 = x2

c) FFFFFFFF16 = x10

d) ABCDEF16 = x10


Aufgabe 4:

Geben Sie eine EBNF an, welche die mathematischen Ausdrücke mit den binären Operatoren +, –, *, / sowie dem unären Operator – (negatives Vorzeichen) beschreibt.


Aufgabe 5:

Erweitern Sie die EBNF aus Aufgabe 4 um

- Klammerungen mit ( und )

- Funktionsaufrufe wie sin(x), cos(x), ln(x), odd(x), even(x)

- Funktionsaufrufe wie rest(x,y) (Divisionsrest), ggT(x,y) (größter gemeinsamer Teiler) und kgV(x,y) (kleinstes gemeinsames Vielfaches)



Übungsblatt #3 (DO, 27. Oktober)


Aufgabe 1:

Beweisen Sie die DeMorganschen Regeln und das Assioziativgesetz durch Aufstellen der Wahrheitswertetabellen.


Aufgabe 2:

Gegeben sei folgendes Problem: Ermittle zu einer gegebenen Zahl n, ob es sich um eine Primzahl handelt (nur durch sich selber und durch 1 teilbar). Skizzieren Sie ein Flussdiagramm, welches dieses Problem löst.


Aufgabe 3:

Der euklidische Algorithmus findet zu zwei Zahlen a und b den größten gemeinsamen Teiler (ggT). Das Prinzip wird auch „gegenseitige Wechselwegnahme“ genannt. In seiner einfachsten Form zieht man so lange die kleinere von der größeren Zahl ab, bis beide Zahlen gleich sind.

a) Probieren Sie dieses Verfahren auf Papier mit den Zahlen 9 und 24 aus.

b) Skizzieren Sie diesen Algorithmus in einer (pseudo) Programmiersprache, bei dem a und b eingegeben werden und als Ergebnis der         ggT ausgegeben wird.

c) Terminiert dieser Algorithmus immer?

d) Ist dieser Algorithmus determiniert?


Aufgabe 4:

Laden Sie sich den Quelltext für das Programm ReadIntDemo herunter:

http://www.herwig-henseler.de/lehre/java/ws0506/ReadIntDemo.java Kompilieren Sie das Programm und lassen es laufen.

Zeigen Sie im Programm auf:

a) wo sich Kommentare befinden,

b) wo sich Blöcke befinden und wie viele Anweisungen diese jeweils enthalten,

c) wie viele Variablen x es gibt und wo sie überall gültig sind,

d) wo Variablen deklariert werden,

e) wo Variablen ein Wert zugewiesen wird,

f) welche Schreibweise für Klammerungen verwendet wird,

g) wo leere Anweisungen benutzt werden.



Übungsblatt #4 (DO, 3. November)


Aufgabe 1:

Welche Typen sollten die folgenden Variablen jeweils besitzen?

a) Einwohnerzahl

b) Temperatur

c) Stellung eines Lichtschalters

d) KFZ-Kennzeichen

e) Geldbeträge

f) Monatsangabe

g) Die Zahl π

h) Matrikelnummer


Aufgabe 2:

Die Fakultät n! einer natürlichen Zahl n ist definiert als das Produkt aller Zahlen von 1 bis n. Erweitern Sie das Programm ReadIntDemo so, dass es die Fakultät der Zahlen von 1 bis 100 ausgibt. Benutzen Sie dazu einmal den Datentypen int, einmal den Datentypen float und einmal den Datentypen double. Was beobachten Sie?


Aufgabe 3:

Schreiben Sie ein Programm, welchem Sie ihr Geburtsdatum und das aktuelle Datum eingeben können (jeweils in Form von 3 Zahlen: Tag, Monat, Jahr). Das Programm soll nun den Abstand zwischen diesen beiden Tagen ermitteln und ausgeben, wie viele Tage sie bereits leben. Benutzen Sie auch hier als Basis das Programm ReadIntDemo.


Aufgabe 4:

Die Anhänger der Biorhythmus-Lehre glauben, dass das Leben durch drei Rhythmen mit unterschiedlicher Periodendauer bestimmt wird:

_ körperlicher Rhythmus (23 Tage)

_ emotionaler Rhythmus (28 Tage)

_ geistiger Rhythmus (33 Tage)

Bei der Geburt fangen diese Rhythmen mit ihrer ersten Periode positiv an, überqueren nach der halben Periodenlänge die Null–Linie und gehen dann in die negative Phase. Am Ende der Periode erfolgt wieder ein Umschlag in den positiven Bereich. Alle Übergänge, das heißt von positiv zu negativ und umgekehrt sind kritische Tage (also potentiell schlechte Tage).

http://de.wikipedia.org/wiki/Biorhythmus

Lassen Sie das Programm aus Aufgabe 4 ausgeben, ob Ihre Biorhythmen heute günstige oder ungünstige Werte versprechen.



Übungsblatt #5 (DO, 10. November)


Aufgabe 1:

Die Paritätsprüfung dient bei der Datenübertragung zur Erkennung fehlerhaft übertragener Informationen. Wird ein Byte übertragen, so übermittelt in der einfachsten Form der Paritätsprüfung ein zusätzliches Bit, das Paritätsbit. Der Empfänger ermittelt vom übertragenen Byte ebenfalls das Paritätsbit und vergleicht es mit dem empfangenen Paritätsbit. Stimmen diese nicht überein, so war die atenübertragung offenbar fehlerhaft.

Das Paritätsbit einer Bitsequenz ist 1, wenn die Anzahl der Bits mit dem Wert 1 ungerade ist,

sonst ist das Paritätsbit 0 (die sog. Even-Parity).

Schreiben Sie ein Programm, welches für eine einzugebende Zahl das Paritätsbit ermittelt.

Versuchen Sie, ohne die Operatoren / und % auszukommen.


Aufgabe 2:

Schreiben Sie ein Programm, das 10 int-Zahlen einliest und diese dann in umgekehrter Reihenfolge wieder ausgibt. Verwenden Sie zum Speichern der Zahlen ein Array. Schaffen Sie es, Ihr Programm so zu erweitern, dass die Anzahl 10 nicht festgelegt ist, sondern zuerst vom Benutzer eingegeben wird?


Aufgabe 3:

Schreiben Sie ein Programm, das ein float-Array mit 100 Einträgen anlegt. An allen geraden Positionen soll die Zahl 100, an den ungeraden Positionen die Zahl 0,0001 gespeichert werden.

a) Addieren Sie nun alle Zahlen von Position 0 bis 99 zusammen und lassen Sie das Resultat ausgeben.

b) Addieren Sie erst alle Zahlen an geraden Positionen und dann an ungeraden Position zusammen und bilden hinterher die Summe.

c) Warum gibt es einen Unterschied?

d) Was folgern Sie daraus?


Aufgabe 4:

Ersetzen Sie in der Musterlösung (oder in Ihrer eigenen Lösung) zur Aufgabe 3 von Übungsblatt 4 (Abstandsberechnung von Tagen) die switch-Anweisung durch die Verwendung eines Arrays.