Info 1 Aufgabensammlung

Werbung
Info 1 Aufgabensammlung
2003 by Andreas Scholz
[email protected]
Die folgenden Aufgaben und Lösungen sind natürlich ohne Garantie auf Richtigkeit bzw.
Relevanz für die Klausur.
Und immer daran denken:
Behauptung:
Jedes Programm lässt sich um mindestens eine Anweisung
kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die
nicht funktioniert...
I: UML
Aufgabe 1
Modellieren Sie folgende Aussage in einem UML Klassendiagramm:
„Ein Verzeichnis enthält Dateien oder andere Verzeichnisse. Eine Datei besitzt
einen Namen und eine Größe. Ein Verzeichnis besitzt ebenfalls einem Namen,
außerdem ist in ihm die Anzahl der enthaltenen Dateien und Verzeichnisse
gespeichert.“
Lösung:
Wichtig sind folgende Punkte:
- Es ist sinnvoll den Namen in Element zu definieren da alle abgeleiteten
Klassen ein Name-Attribut besitzen
- Man muss hier unbedingt das Kompositionsmuster verwenden!
Wir können folgendes Klassendiagramm aus dem Text extrahieren:
Aufgabe 2
Erstellen sie ein Objektdiagramm basierend auf dem obigen Klassendiagramm das
folgende Struktur repräsentiert:
root/files/test.txt (20 Bytes)
root/files/hallo.txt (50 Bytes)
root/files/temp/trash.txt (1200 Bytes)
root/foo.exe (60 Bytes)
dabei sollen folgende Regeln gelten:
- root ist das Wurzelverzeichnis
- / trennt Verzeichnisnamen (wie in Unix)
- bei Dateien ist in Klammern die Größe angegeben
Lösung:
Wichtig sind folgende Punkte:
- Alle Attribute müssen einen Wert haben
- Es darf auf keiner Assoziation eine * Kardinalität vorkommen
- Die Namen der Objekte sind frei wählbar (man kann sie auch weglassen, der :
muss aber immer dastehen)
- Unterstreichen nicht vergessen
II. Java Programmierung
Aufgabe 3
Implementieren Sie die Funktion
double[][] MatrizenMultiplikation(double [][] A, double[][] B)
die die Matrizenmultiplikation A*B für quadratische Matrizen berechnet und als
Ergebnis zurückgibt. Verwenden sie einen Multiplikationsalgorithmus Ihrer Wahl.
Lösung:
double[][] MatrizenMultiplikation(double [][] A, double[][] B) {
double[][] erg=new double[A.length][A.length];
for(int i=0;i<A.length;i++){
for(int j=0;j<A[i].length;j++){
for(int k=0;k<A[i].length;k++){
erg[i][j]+=A[i][k]*B[k][j];
}
}
}
return erg;
}
Matrizenmultiplikation ist die Standardaufgabe zum Üben von Schleifen (weil man gleich 3
braucht), kann also gut sein dass sie in der Klausur drankommt
Am einfachsten ist wohl obiger Zeile*Spalte Algorithmus
Aufgabe 4
Schreiben sie folgende for-Schleife in eine while und eine do-while Schleife um
for(int i=0;i<n;i++)
System.out.println(i*i+"\t");
Lösung:
int i=0;
while(i<n){
System.out.println(i*i+"\t");
i++;
}
int j=0;
if(n>0){
do{
System.out.println(j*j+"\t");
j++;
}while(j<n);
}
zur Übung welche Schleifenstrukturen es in Java gibt
Aufgabe 5
a) Erklären Sie den Unterschied zwischen dem == Operator und der equals
Funktion in Bezug auf die Klasse Integer in Java, betrachten Sie dazu
folgendes Codestück:
Integer i1=new Integer(5);
Integer i2=new Integer(5);
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
//Ausgabe I
//Ausgabe II
b) Geben Sie an welche Ausgabe in den kommentierten Zeilen erzeugt wird
Lösung:
a) Der == Operator vergleicht die Referenzen der 2 Integer-Klassen die equals
Methode den Wert der beiden Integer
b) Ausgabe I: false
Ausgabe II: true
Bei Wertevergleich mit == immer aufpassen
Aufgabe 6
a) Erstellen Sie die Java Klasse Adressbuch basierend auf folgendem
Klassendiagramm (verwenden sie eine Reihung, keine verkettete Liste)
Implementieren Sie dabei die Methode void Sort() die die Adressen mittels
BubbleSort nach Nachnamen sortiert, Sie können dabei davon ausgehen das
die Reihung die die Bücher enthält immer voll gefüllt ist.
Implementieren Sie außerdem, die Methode void Print() die alle Adressen
sortiert nach Nachnamen in der Form: „Vorname, Nachname“ ausgibt, auch
hier können Sie davon ausgehen dass die Reihung komplett gefüllt ist.
b) Geben Sie an welche (sinnvollen) Methoden noch implementiert werden
müssten damit man die Klasse verwenden kann
Lösung:
a)
public class Adressbuch{
private Adresse[] adressen;
void Sort(){
Adresse speicher;
for(int i=0;i<adressen.length;i++){
for(int j=0;j<adressen.length-1;j++){
if(adressen[j].GetNachName().compareTo(
adressen[j+1].GetNachName())>0){
speicher=adressen[j];
adressen[j]=adressen[j+1];
adressen[j+1]=speicher;
}
}
}
}
void Print(){
Sort();
for(int i=0;i<adressen.length;i++){
System.out.println(adressen[i].GetVorName()+
", "+adressen[i].GetNachName());
}
}
}
b) Fehlende sinnvolle Methoden:
- Konstuktor
- Eine Add(Adresse a) – Methode zum hinzufügen von Adressen
III. Markov-Algorithmen
Aufgabe 7
a) Schreiben Sie einen Markov-Algorithmus der in beliebigen Wörtern über
dem Alphabet {a,b} (d.h. die Wörter bestehen nur aus a’s und b’s) jedes
zweite Vorkommen von a durch c ersetzt.
b) Führen Sie Ihren Algorithmus für das Beispiel aba durch
Lösungsidee:
Wir speichern in einem Schiffchen mit ob wir eine gerade oder ungerade Anzahl
an a’s gelesen haben und ersetzen bei einer geraden Anzahl das a durch ein c
Lösung:
a)
T={a,b,c,g,u}
1.
2.
3.
4.
5.
6.
7.
ua -> ag
ga -> cu
gb -> bg
ub-> bu
g ->. epsilon
u ->. epsilon
epsilon -> u
b)
aba -(7)-> uaba -(1)-> agba -(3)-> abga -(2)-> abcu -(6)-> abc
(normalerweise steht die Nummer auf dem Strich)
Herunterladen