Übungsaufgaben 20.September 2013

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

==  Methoden == 

'''Aufgabe 1'''

Die harmonische Reihe ist definiert als unendliche Summe

$\sum_{k=1}^\infty \frac{1}{k}=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+...$

Implementieren Sie eine Methode, die die harmonische Reihe bis zu einer vorgegebenen Anzahl von Reihenglie- dern berechnet.

'''Aufgabe 2'''

Für ein Seminar muß jeder Teilnehmer eine schriftliche Hausarbeit anfertigen und einen m ̈undlichen Vortrag halten. Dafür sind jeweils maximal 10 Punkte erhältlich. Zur Ermittlung der Gesamtpunktzahl wird die Punktzahl der Hausarbeit mit 3, die des Vortrags mit 2 multipliziert. Das folgende Java-Programm soll die Gesamtpunktzahl eines Studenten berechnen, der für die Hausarbeit 5 Punkte, für den Vortrag 8 Punkte erhalten hat. Was geschieht? Wie kann man den Fehler beheben?
 
 public class SeminarPunkt {
  public static void main (String[] args) 
   int hausarbeit = 5 , vortrag = 8, summe = 0;
   berwertungen(hausarbeit,vortrag,summe);
   System.out.println("erreichtePunkte: " + summe); }
   public static void bewerten(int h, int v, int s) {
    h = h * 3;
    v = v * 2;
    s = h + v;
    retrun; } }

'''Aufgabe 3'''

Ein Mobilfunkanbieter stellt Ihnen 3 Tarife zur Wahl: 

# Tarif 1 kostet 11,75 Euro Grundgebühr im Monat, zusätzlich kostet jede Gespr ̈achsminute 50 Cent.
# Tarif 2 kostet 19,25 Euro Grundgebühr, dafür schlägt die Gesprächsminute aber nur mit 25 Cent zu Buche.

Tarif 3 hat eine monatliche Grundgeb ̈uhr von 22,75 Euro, darin sind 30 Gesprächsminuten pro Monat frei. Erst jede dar ̈uber hinaus gehende Minute kostet dann 0,375 Euro. Schreiben Sie ein Java-Programm, das f ̈ur jeden Tarif die Monatsrechnung (f ̈ur 10 bzw. 20, 30, 40, . . . 100 Minuten Gespräche im Monat) erstellt.

Definieren Sie für jeden Tarif eine eigene Methode.

'''Aufgabe 4'''
Implementieren Sie in Java folgende Methoden! Achten Sie auf Randfälle und nicht korrekte Parameterübergaben!

(1) eine Funktion, die testet, ob eine als Parameter übergebene natürliche Zahl eine Fibonacci-Zahl ist oder nicht (Beispiel: f(8) == true),

(2) eine Prozedur, die die Werte zweier als Parameter übergebener double-Variablen vertauscht (Beispiel: double a=2.0; double b=5.9; f(a, b); Ergebnis: a==5.9; b==2.0;),

(3) eine Funktion, die einen übergebenen double-Wert rundet und als int-Wert zurückliefert (Beispiel: f(-2.6) == 3)

(4) eine Funktion, die die nächst kleinere Primzahl einer als Parameter übergebenen natürlichen Zahl (größer als 2) liefert (Beispiel: f(11) == 7),

(5) eine Funktion, die als Parameter einen int-Wert übergeben bekommt und die überprüft, ob die Ziffer 7 in dem int-Wert vorkommt (Beispiel: f(-2578) == true),

(6) eine Funktion, die als ersten Parameter eine Funktion g:char->int und als zweiten Parameter einen char-Wert zeichen übergeben bekommt und die als Ergebnis den Wert g(zeichen) liefert (Beispiel: public static char pos(char zeichen) {return zeichen - ‘a‘ ;} und f(pos, ‘b‘) == 2),

(7) eine Funktion, die als Parameter einen int-Wert n übergeben bekommt und die als Ergebnis die Summe der Zahlen zwischen 0 und n zurückliefert; ist der Wert des übergebenen Parameters jedoch kleiner als 0, soll die Funktion den Wert false liefern (Beispiel: f(4) = 10, f(-2) == false)

(8) eine Funktion, die als ersten Parameter einen int-Wert n und daraufhin n float-Parameter übergeben bekommt, deren Summe geliefert werden soll (Beispiel: f(3, 1.1f, 2.2f, 3.3f) == 6.6f).

(9) eine Funktion, die als ersten Parameter einen float-Wert x (zwischen 0 und 1000) und als zweiten Parameter einen positiven int-Wert n (zwischen 1 und 5) übergeben bekommt. Die Funktion soll den Wert x auf n Nachkommastellen runden (Beispiel: f(2.2576F, 3) == 2.258F)

(10) eine Funktion, die die Summe zweier Uhrzeiten als Ergebnis liefert; Uhrzeiten werden dabei als float-Werte realisiert, wobei die Vorkommastellen die Stunden und die Nachkommastellen die Minuten darstellen (Beispiel: f(22.13f, 3.48f) == 2.01f)

(11) eine Funktion, die die Summe und die Differenz zweier als Parameter übergebener int-Werte zurückliefert (Beispiel: f(4, 3) = (7, 1))

Schreiben Sie ein Programm, das einem Benutzer eine Auswahl zur Ausführung der implementierbaren Funktionen anbietet, anschließend jeweils passende Werte für die aktuellen Parameter einliest, die ausgewählte Funktion aufruft und ein Ergebnis auf dem Bildschirm ausgibt. Achten Sie darauf, dass die Funktionen nur mit zulässigen Werten aufgerufen werden.

== Referenzen und Arrays ==
'''Schreiben Sie eine Klasse, die zwei int-Arrays miteinander vergleicht:'''
 class Arrays {
 public boolean equals(int [] x, int [] y) { ...}
 }

Schreiben Sie dazu ein Programm, das zunächst zwei int-Arrays a und b erzeugt. Das Array a soll mit Zahlen in aufsteigender Reihenfolge beginnend bei 1 initialisiert werden, das Array b mit Zahlen beginnend bei 100 in absteigender Reihenfolge. Erstellen Sie nun eine neues Array c, das eine Kopie des Arrays a darstellt. Erweitern Sie dazu die Klasse Arrays. Vergleichen Sie nun Array a mit Array b und Array a mit Array c.

'''Welche Auswirkungen hat es, wenn man die Referenzen der Arrays statt die Arrays selber
vergleicht?''' Demonstrieren Sie dies mit einem kleinen Programm.

== Objekte und Referenzen auf Objekte ==
'''Aufgabe 1'''

Gegeben Sei folgende Klasse:
 class Circle {
 protected int radius, posX, posY;
 protected boolean filled;
 
 public Circle(int rad, int x, int y, boolean filled) { ... } 
 }

Erweitern Sie diese Klasse, um eine Methode zum Vergleichen von zwei Objekten der Klasse und um einen Konstruktor zur Erzeugung einer Kopie eines Objektes.

Schreiben Sie ein Testprogramm, das Objekte der Klasse Circle erzeugt, kopiert und vergleicht.

'''Aufgabe 2 '''

Wie muss die Klasse Circle erweitert werden, wenn ein Attribut der Form protected int [] fillPattern; dazukommt?

== OOP ==

'''Aufgabe 1'''
Eine Autovermietung vermietet PKW und LKW. Jedes Fahrzeug ist durch das KFZ-Kennzeichen, den KM-Stand und die seit der letzten Inspektion geleisteten KM beschrieben. Bei LKW ist die Nutzlast ein weiteres Merkmal. Zusätzlich gibt es eine Kennzeichnung, ob ein Fahrzeug zur Zeit vermietet ist. Bei Rückgabe eines Fahrzeuges wird aus der Mietdauer (in Tagen) der Rechnungsbetrag und aus der Zahl der gefahrenen Kilometer der aktuelle KM-Stand ermittelt. Außerdem wird kontrolliert, ob eine Inspektion fällig ist. Bei PKW wird alle 30000, bei LKW alle 20000 km eine Inspektion durchgeführt. Der Mietpreis beträgt für PKW 30 Euro pro Tag, für LKW mit einer Nutzlast ̈uber 1800 kg 80 Euro pro Tag, für kleinere LKW 50 Euro pro Tag. PKW werden nach jeder Vermietung gewaschen.

a) Modellieren Sie diese Problemstellung durch geeignete Klassen und Methoden in Java. Falls für eine Aktion keine Details bekannt sind, lassen Sie den Methodenrumpf leer oder geben Sie eine passende Meldung auf den Bildschirm aus.

b) Erweitern Sie das Beispiel: die Autovermietung möchte die Zahl der verfügbaren PKW und die der verfügbaren LKW abrufen k ̈onnen.

'''Aufgabe 2'''

Implementieren Sie in Java eine Klasse Roman, die den Umgang mit römischen Zahlen (mit Werten zwischen 1 und 3999) ermöglicht. Im (für diese Aufgabe definierten) römischen Zahlensystem steht das Symbol I für 1, V für 5, X für 10, L für 50, C für 100, D für 500 und M für 1000. Symbole ergeben hintereinander geschrieben die römische Zahl. Symbole mit größeren Werten stehen dabei normalerweise vor Symbolen mit niedrigeren Werten. Der Wert einer römischen Zahl wird in diesem Fall berechnet durch die Summe der Werte der einzelnen Symbole. Falls ein Symbol mit niedrigerem Wert vor einem Symbol mit höherem Wert erscheint (es darf übrigens jeweils höchstens ein niedrigeres Symbol einem höheren Symbol vorangestellt werden), errechnet sich der Wert dieses Teils der römischen Zahl als die Differenz des höheren und des niedrigeren Wertes. Die Symbole I, X, C und M dürfen bis zu dreimal hintereinander stehen; die Symbole V, L und D kommen immer nur einzeln vor. Die Umrechnung von Dezimalzahlen in römische Zahlen ist übrigens nicht eineindeutig. So lässt sich z.B. die Dezimalzahl 1990 römisch darstellen als MCMXC bzw. MXM. Beispiele:

3999 = MMMCMXCIX

48 = XLVIII

764 = DCCLXIV

1234 = MCCXXXIV

581 = DLXXXI

Implementieren Sie folgende Methoden:

# Konvertieren eines String-Objektes, das eine römische Zahl repräsentiert, in einen int-Wert. Sie können davon ausgehen, dass das String-Objekt eine gültige römische Zahl repräsentiert.
# Konvertieren eines int-Wertes in einen String, der eine römische Zahl repräsentiert 
# Initialisieren einer römischen Zahl mit einem String, der eine römische Zahl repräsentiert (Konstruktor)
# Initialisieren einer römischen Zahl mit einem int-Wert (Konstruktor) 
# Initialisieren einer römischen mit einer bereits existierenden römischen Zahl, d.h. anschließend sind die beiden römischen Zahlen wertegleich (siehe Teilaufgabe (h)) 
# Clonieren einer römischen Zahl, d.h. initialisieren einer neuen römischen Zahl mit einer bereits existierenden römischen Zahl, d.h. anschließend sind die beiden römischen Zahlen wertegleich (siehe Teilaufgabe (h)) 
# Umwandeln einer römischen Zahl in ein String-Objekt (bestehend aus den oben genannten Symbolen) )
# Überprüfen auf Wertegleichheit zweier römischer Zahlen (Überschreiben der von der Klasse Object geerbten Methode equals) 
# Addition zweier römischer Zahlen

== Noch weitere Aufgaben ==

Eine Wetterstation hat für 14 Tage folgende Temperaturwerte aufgenommen.

Tag:         1  2  3  4  5  6  7  8  9 10 11 12 13 14
Temperatur: 12 14  9 12 15 16 15 15 11  8 13 13 15 12

# Speichere die folgende Tabelle mit einem geeigneten Datentyp.
# Schreibe ein Programm, welches die Durchschnittstemperatur für die zwei Wochen bestimmt.
# Schreibe ein Programm, welches die maximale und minimale Temperatur ausgibt.
# Schreibe ein Programm, welches die beiden aufeinanderfolgenden Tage angeben kann, an denen es den größten Temperaturumschwung gab.
# Schreibe ein Programm, welches die Tabelle schön tabellarisch auf der Konsole ausgibt.