[Progra] Java Fragen

[Progra] Programmierung
[DSAL] Datenstrukturen und Algorithmen
[SWT] Softwaretechnik
[DB] Datenbanken und Informationssysteme

Java Fragen

Beitragvon aRo » 25.02.08 18:07

Hallo!

Ich habe da noch eine Frage zu einer Aufgabe aus einer alten Klausur. (Diplomvorprüfung 18.9.2006) (V-InfSS06).

Aufgabe 4c)

Dort soll ein Baum linearisiert werden und leider kann ich die Lösung nicht nachvollziehen. Vor allem die for-Schleife verstehe ich überhaupt nicht.
Ich hoffe da kann jemand ein paar passende Worte für finden ;)
aRo
 
Beiträge: 311
Registriert: 23.10.07 01:28
Anwendungsfach: Medizin

Beitragvon zorgblaubaer » 25.02.08 18:58

da hätte ich gleich noch eine frage zur aufgabe 4b, selbe klausur.
ich hab das folgendermaßen gelöst:

Code: Alles auswählen
public void loescheBlaetter(Vergleichbar wert){
   loescheBlaetter(this.wurzel,wert);
}

private static void loescheBlaetter(Knoten knot, Vergleichbar value){
   if (knot.links == null){
      if (knot.rechts == null && knot.wert.gleich(value)){
         knot = null;
      } else {
         loescheBlaetter(knot.rechts,value);
      }
   } else if (knot.rechts != null) {
      loescheBlaetter(knot.rechts,value);
      loescheBlaetter(knot.links,value);
   } else {
      loescheBlaetter(knot.links,value);
   }
}


das weicht natürlich stark von der musterlösung ab, da dort nicht void sondern Knoten zurück gegeben wird. kann ich das trotzdem so lösen oder ist das in der klausur grundsätzlich falsch? (oder geht evtl garnicht wie ich mir das vorstelle)
vielen dank ;)
Benutzeravatar
zorgblaubaer
 
Beiträge: 180
Registriert: 05.08.07 20:44
Wohnort: Neuss // Aachen

Beitragvon snifjaku » 25.02.08 18:58

Code: Alles auswählen
33 public static Knoten linearisiere (Knoten current) {
34   if (current == null)
35     return null;
36   else {
37     current.rechts = linearisiere(current.rechts);
38     if (current.links == null)
39       return current;
40     else {
41       Knoten linLinks = linearisiere(current.links);
42       current.links = null;
43       Knoten k;
44       for (k=linLinks; k.rechts!=null; k=k.rechts);
45       k.rechts = current;
46       return linLinks;
47       }
48     }
49 }


Syntax der for-Schleife:
1. Variablenzuweisung: k vom Typ Konten wird linLinks zugewisen
2. Bedingung: die Schleife wird solange ausgeführt, wie k.rechts ungleich NULL ist.
3. Zähler: k wird nach jedem Schleifendurchlauf auf k.rechts gesetzt.

Sinn der for-Schleife:
Am anschaulichsten wird es wenn man einen Baum (z.B. das Beispiel aus der Klausur) aufzeichnet und diesen nach dem Algorithmus verändert ...
Ich versuchs trotzdem mal in Worte zu fassen ...
Die Schleife wird nur dann ausgeführt wenn im linken Teilbaum eines Knoten nur noch ein linearisiere Baum vorhanden ist. Im Beispiel aus der Klausur wären das beim ersten Durchlauf der Knoten -1 mit dem Teilbaum (9, 6). Dieser wird dann durch die Schleife vor den Konten -1 gesetzt. Der rechte Teil von -1 ist dabei bereits linearisiert.
snifjaku
 
Beiträge: 3
Registriert: 25.02.08 18:14

Beitragvon Coolcat » 25.02.08 20:19

@aRo:
Die Methode funktioniert etwas so:
Linearisiere rekursiv den rechten Teilbaum. Gibt es einen linken Teilbaum so berechne rekursiv die Linearisierung und füge ihn rechts an. Der rechte Teilbaum kommt an den letzten Konten der linken Linearisierung. Die Schleife macht nichts anderes als bis zum Ende des "Baums" zu laufen, so dass nach der Schleife k das letzte Element ist.

@zorgblaubaer:
das weicht natürlich stark von der musterlösung ab

Das ist egal, wenn das was du da machst die verlangte Funktionalität hat. Deine Methode funktioniert jedoch nicht, weil die Zuweisung knot = null; wirkungslos bleibt. Damit wird nur die lokale Variable geändert.
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon aRo » 25.02.08 21:51

sorry, ich verstehs immer noch nicht.

Also am Anfang haben wir Knoten 3 (ich beziehe mich auf den Baum aus der Klausur) in der Hand. Der ist nicht null, also wird der else Teil ausgeführt. Von 3 der rechte Zeiger zeigt dann auf die Linearisierung des rechten Teilbaums.
Bei der anschließenden If Abfrage kommen wir wieder in den Else Teil.
Dann wird linLinks ermittelt, der doch hier wahrscheinlich die 2 ist, richtig?
Der linke Zeiger von 3 wird auf null gesetzt.
Nun laufe ich von linLinks los bis ich nicht mehr weiter nach rechts kann, was ich hier ja sofort nicht kann. Also müsste die 2 ja dann auf die 3 zeigen. Schließlich wird die 2 zurückgeben.

Tja, ihr merkt schon dass das schon nicht ganz stimmt, was ich da oben verzapft hab. Aber vielleicht seht ihr so besser, wos bei mir hängt :(
aRo
 
Beiträge: 311
Registriert: 23.10.07 01:28
Anwendungsfach: Medizin

Beitragvon Coolcat » 26.02.08 12:42

Dann wird linLinks ermittelt, der doch hier wahrscheinlich die 2 ist, richtig?
links von der 3 ist doch gar keine 2 mehr??
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Chrizzo » 26.02.08 15:12

little question:

was bedeutet das "!"??

[...] while (!res && i < sensors.length){ [...]

wen's interessiert: dritt letzte VD-Klausur
Benutzeravatar
Chrizzo
 
Beiträge: 162
Registriert: 06.11.07 00:27
Wohnort: Mönchengladbach

Beitragvon Neronus » 26.02.08 15:18

Das ist der logische negator
!true == false
!false == true
I would rather write programs to help me write programs than write programs
Neronus
 
Beiträge: 153
Registriert: 13.09.05 22:23

Beitragvon Chrizzo » 26.02.08 15:28

thx
Benutzeravatar
Chrizzo
 
Beiträge: 162
Registriert: 06.11.07 00:27
Wohnort: Mönchengladbach

Beitragvon NightmareVirus » 26.02.08 18:35

es geht um die Vordipl060918.pdf

Aufgabe 2 Verifikation.

In dem Programm fehlt in der While-Schleife ein Semikolon... Verifizieren kann man eigentlich nicht, weil das programm nicht compiliert... Was macht man wenn einem sowas in der Klausur auffällt? Immerhin gibts bei der Verifikation auch Aufgaben bei denen absichtlich falsche Eingaben zugelassen sind, damit beim aufgabenteil b) die Terminierung nicht bewiesen werden kann... :evil:
Benutzeravatar
NightmareVirus
 
Beiträge: 47
Registriert: 09.12.06 20:19

Beitragvon NightmareVirus » 26.02.08 20:07

Code: Alles auswählen
...if (sensors[i] instanceof Alarmsensor){
Alarmsensor alarmSensor = (Alarmsensor) sensors[i];...


Aufgabe zur Datenkapselung, es wird ein Array von Alarmsensorern übergeben, Alarmsensoren können Schocksensoren, Hitzesensoren und Gassensoren sein... das übliche

frage: wieso muss ich die Arraryelemente explizit auf Alarmsensoren casten, wenn ich doch vorher in der if abfrage das ganze schon mit instance of geklärt hab? :roll:
Benutzeravatar
NightmareVirus
 
Beiträge: 47
Registriert: 09.12.06 20:19

Beitragvon HE » 26.02.08 20:35

Weil Java aus dem "if (foo instanceof bar)" nicht schließt, dass im folgenden Schleifenkörper foo unbedingt vom Typ bar ist. Damit der Krams dann auch kompilieren kann, *musst* du Java nochmal den expliziten Cast geben (sonst meckert der halt wegen auf dem allgemeinen Typ nicht definierten Attributen oder Methoden)
Benutzeravatar
HE
 
Beiträge: 453
Registriert: 09.03.07 12:20
Wohnort: Aachen
Studiert seit: WS 06/07
Anwendungsfach: Mathe

Beitragvon theTux » 26.02.08 20:43

NightmareVirus hat geschrieben:Was macht man wenn einem sowas in der Klausur auffällt?

Im Zweifelsfall immer die Aufsicht fragen.
Stur lächeln und... oh, falscher Pinguin.
Benutzeravatar
theTux
 
Beiträge: 577
Registriert: 15.01.06 16:41

Beitragvon Coolcat » 26.02.08 21:29

Verifizieren kann man eigentlich nicht, weil das programm nicht compiliert...

Das ist Pseudocode, kein Java :P
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon aRo » 26.02.08 22:15

Hi!

Noch eine abschließende Frage für heute ;)

In der Vordiplom Klausur 6-03 in der ersten Aufgabe die dritte Ausgabe ist mir nicht ganz klar. Was passiert da?
Also das y Objekt kann auf Z gecasted werden, weil Y auch Z implementiert, richtig?

Eigentlich müsste doch aber die Methode der Klasse X ausgeführt werden, aber warum bleibt dann die Ausgabe gleich?
aRo
 
Beiträge: 311
Registriert: 23.10.07 01:28
Anwendungsfach: Medizin

Nächste

Zurück zu Praktische Informatik