Übungsaufgaben 23.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 ==

'''Aufgabe 1'''

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.

''' Aufgabe 2 '''

Ein Programm zur Bestimmung der Quersumme einer natürlichen Zahl soll geschrieben werden. Schritt für Schritt soll dieses Programm um weitere Funktionen erweitert werden.

# Spalte die einzelnen Ziffern mittels Division und Modulo-Operation ab und addiere sie, um die Quersumme zu bestimmen.
# Gib alle Zahlen von 0 - 1000 aus, welche die Quersumme 15 haben.
# Gib alle Zahlen von 0 - 1000 aus, deren Quersumme ein Vielfaches von 7 ist.
# Welche Quersumme der Zahlen von 0 - 1000 kommt am häufigsten vor? (Tipp: Überlegt Euch, wie viel verschiedene Quersummen vorkommen können, erstellt ein Array dieser Größe und speichert dort die Anzahl der Vorkomnisse)
# Die iterierte Quersumme wird auch Ziffernwurzel genannt (Abk. zw) Beispiel: 47 --> 4 + 7 = 11 --> 1 + 1 = 2, also zw(47)=2
# Schreibt ein Programm, welches die Ziffernwurzel für eine beliebige Zahl bestimmt.
# Das Querprodukt ist wie folgt definiert: 68 = 6 * 8 = 48. Es gibt Zahlen, bei denen die Summe aus Quersumme und Querprodukt wieder die Zahl selbst ergibt Beispiel: 79 = 7 + 9 + 7*9 = 79. Gibt es weitere Zahlen zwischen 0 und 1000 mit dieser Eigenschaft? Wenn ja, welche ? 

'''Aufgabe 3'''

Beim Gesellschaftsspiel "Die Böse Sieben" sitzen die Teilnehmer im Kreis und zählen reihum. Jede Zahl, welche durch 7 teilbar ist oder die 7 als Ziffer enthält, muss übersprungen werden. Schreibe ein Programm, welches für eine beliebige Zahl angibt, ob die nächste übersprungen werden muss oder nicht.

''' Aufgabe 4 '''

4.1. Schreibe eine Klasse Student, die Informationen wie Name, Matrikelnummer etc. über einen Studenten speichert. Erzeuge ein Objekt dieser Klasse und belege die Objektvariablen mit Werten. Lies diese Werte aus den Objektvariablen wieder aus und gib sie auf dem Bildschirm aus.


4.2. Schreibe einen Konstruktor für deine Klasse, der die Objektvariablen des erzeugten Objekts mit Werten füllt. Erzeuge mit Hilfe dieses Konstruktors ein Objekt, lies seine Werte aus und gib sie auf dem Bildschirm aus.


4.3. Erweitere deine Klasse um eine Methode printMe(), die die Daten des Studentenobjekts auf dem Bildschirm ausgibt. Teste deine Methode!


4.4. Lege ein Feld (Array) mit 100 Studentenobjekten an, die verschiedene Matrikelnummern haben und gib alle auf dem Bildschirm aus.


4.5. Das in der vorherigen Aufgabe angelegte Feld ist schon eine Art Studentendatenbank. Schreibe daher eine neue Klasse StudentDatabase, die ein Feld von Studentenobjekten enthält. Die Klasse soll einen Konstruktor haben, dem die Größe des zu erzeugenden Feldes übergeben wird. Implementiere auch eine Methode printMe(), die alle Datensätze ausgeben soll, sowie eine Methode addStudent(), die ein Studentenobjekt mit den zu übergebenen Daten anlegen soll und dieses in die Datenbank einfügen soll.


'''Zusatzaufgabe:''' Erweitere die Studentendatenbank um eine Methode deleteStudent(), die das Studentenobjekt mit der übergebenen Matrikelnummer aus der Datenbank löschen soll. Funktioniert nach dem Löschen einiger Objekte deine Ausgabemethode printMe() noch?


'''Zusatzaufgabe:''' Erweitere die Studentendatenbank um eine Methode numberOfStudents(), die die Anzahl der in der Datenbank gespeicherten Studentenobjekte zurückliefert.


'''Zusatzaufgabe:''' Schreibe Methoden, die statistische Daten über die Studenten ermitteln. Beispiele sind: die Durchschnittsnote, das Durchschnittsalter . . .