Info-Praktikum 1. Aufgabenteil

Aufgaben, Lösungen, Klausuren
Benutzeravatar
Morpheus
Beiträge: 370
Registriert: 31.01.2007 22:12
Name: Tobias
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von Morpheus » 26.04.2007 19:25

hi

kann mir jemand sagen, ob man zur lösung der 1. aufgabe die klasse FunctionalSimulator, die uns ja zur verfügung gestellt wird, noch in irgendeiner form bearbeiten müssen ? oder sollte unsre lösung so aussehen, dass die klasse so wie sie im netz steht verwendet werden kann ?

wäre sehr hilfreich, wenn mir das einer beantworten könnte

thx
The honor is still mine.

Leberwurstbrot
Beiträge: 25
Registriert: 13.01.2007 15:13
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von Leberwurstbrot » 26.04.2007 19:36

So wie ich das verstanden habe sollen wir diese Klasse so lassen wie sie ist und nur die beiden Klassen Signal und Nand programmieren. Die Parameter und Methoden dieser Klassen musst du dir aus der Klasse FuncionalSimulator erschließen.

sook_netaction
Beiträge: 332
Registriert: 21.11.2004 16:49
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von sook_netaction » 26.04.2007 21:47

Richtig. Nur zwei Klassen (Nand und Signal) erzeugen. Dabei eventuell Namensbezeichnungen aus der Klasse FunctionalSimulator beachten. Ansonsten aber so belassen wie sie ist.
Erfolg verführt / Ehrgeiz verblendet / Eitelkeit vernichtet / Erkenntnis kann die Hölle sein


Benutzeravatar
Morpheus
Beiträge: 370
Registriert: 31.01.2007 22:12
Name: Tobias
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von Morpheus » 28.04.2007 10:14

aha, gut danke für die info
The honor is still mine.

andi
Beiträge: 508
Registriert: 10.09.2006 18:17
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von andi » 28.04.2007 11:36

Hab gestern nur mal kurz über den FunctionalSimulator drüber geschaut und bin dabei auf folgendes gestoßen:

Code: Alles auswählen

inv1.setInput(0,i1);
inv1 ist hier eine Instanz der Klasse Nand und gehört zum FunctionalSimulator. Dem zweiten Parameter der Methode wird hier als Parameter i1 übergeben. i1 ist hierbei eine Instanz der Klasse Signal und gehört ebenfalls zum FunctionalSimulator. Da ich von früher noch C/C++ geschädigt bin stellt sich mir nun die Frage: Was wird da übergeben? Bekommt die Methode eine Laufzeitvariable vom Typ Signal mit allen Eigenschaften von i1, oder direkt das Objekt (à la Pointer oder so)?

Leberwurstbrot
Beiträge: 25
Registriert: 13.01.2007 15:13
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von Leberwurstbrot » 28.04.2007 12:15

Die Methode bekommt hier direkt das Objekt übergeben (genauer gesagt die Referenz, die auf das Objekt verweist).
Somit kann das Objekt inv1 (das ein Inverter sein soll) den Wert des Eingangssignals, was es ja als Objekt übergeben bekommen hat, selbst auslesen, da es nun die Methoden des Signals i1 aufrufen kann.

andi
Beiträge: 508
Registriert: 10.09.2006 18:17
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von andi » 28.04.2007 12:55

[quote=Leberwurstbrot]Somit kann das Objekt inv1 (das ein Inverter sein soll) den Wert des Eingangssignals, was es ja als Objekt übergeben bekommen hat, selbst auslesen, da es nun die Methoden des Signals i1 aufrufen kann.[/quote]

Das würde ja (zumindest im statischen Fall) auch funktionieren, wenn die Methode nur mit einer \"Kopie\" des Objekts arbeitet. Wie würde es aussehen, wenn es eine \"Kopie\" wäre? Oder was genau meinst du mit Referenz? Ich kann mich nicht mehr genau erinnern wie es bei C++ war. Ich bilde mir ein, dass man dort ohne spezielle Angabe nur den Inhalt übergeben hat. Wenn man speziell das Objekt meinte musste man den Adressoperator \'&\' benutzen (oder einen Zeiger auf ein adressiertes Objekt) - korrigiert mich wenn das falsch ist.

Noch was:
\"Normale\" Datentypen werden doch wie folgt deklariert (und initialisiert):

Code: Alles auswählen

int Zahl = 10;
Nun kann man auf die Initialisierung aber auch verzichten:

Code: Alles auswählen

int Zahl;
Bei anderen Sprachen wäre der Inhalt von Zahl jetzt nicht vorhersehbar, bei Java ist er ja null. Was ist nun wenn ich bei Objekten die Initialisierung weglasse? Bzw. müsste ich bei Objekten ohne Konstruktor ebenfalls \"new Klasse\" verwenden?

sook_netaction
Beiträge: 332
Registriert: 21.11.2004 16:49
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von sook_netaction » 28.04.2007 13:20

Java schreibt alle Datenfelder von Objekten wenn sie nicht speziell deklariert werden auf Null. Das ist natürlich nicht der feine Stil, da man denken könnte man hat dies vergessen.
Zu den Objektsachen. Mit funktion(parameter1, parameter2,..) werden Variablen übergeben. Hier an der Stelle wird ein Objekt weitergegeben und zwar vom Typ Signal (Klassen entsprechen Datentypen!!). Das hat den Vorteil die Datenfelder des entsprechenden Signals ändern zu können. Also mir scheint es als einfache Referenz (nenne es Zeiger) auf das Objekt. Quasi etwas einfacher als C.
Erfolg verführt / Ehrgeiz verblendet / Eitelkeit vernichtet / Erkenntnis kann die Hölle sein


karnick3l
Beiträge: 36
Registriert: 05.11.2005 09:28
Name: Ron Böhme
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2005
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von karnick3l » 28.04.2007 17:13

Zu dem Referenz-Problem: In Java gibt es keine Zeiger! - Jedenfalls nicht explizit.

Die Speicher-Verwaltung wird einem vom Garbage-Collector abgenommen, was zu Fehlervermeidung führt (im Sommerkurs meinte Hochberger sogar, dass es kaum bessere Möglichkeiten gibt, wenn man lange laufende Progs schreibt, weshalb man auch Garbage-Collectoren unter C++ schreibt, was diese Programme am Ende wieder langsam macht :-/). Jedenfalls kann man nicht mehr so schnell auf nicht mehr Referenzierte Objekte zugreifen. Mit Zeigern konnte man in C/C++ auch rechnen, das ist bei Hardwarenaher Programmierung zwar ein Vorteil den man ausnutzen kann, führt aber in vielen Fällen zu Fehlern und ist damit auch größter Nachteil.

Weil man durch die von Java übernommene Speicherverwaltung nichts mehr mit Zeigern direkt zu tun haben muss, wurden diese abgeschafft. Da Instanzen von Klassen aber immer noch sehr dynamisch sind, werden zum Zugriff auf diese Referenen eingesetzt. Hinter der Fassade sind Referenzen auf Objekte zwar immer noch Zeiger, man kann sie aber wirklich genau so behandeln wie statische Variablen in C/C++ (übrigens gibt es auch Referenzen in C++, die ähnlich funktionieren; das wird für euch aber erst nächstes Jahr interessant, wenn Herr Urbas genauer darauf eingeht).

Was die Initialisierung angeht, die ist in Java genormt, was ein wegfallen lassen der Initialisierung in den meisten Fällen entschärft (aber zugegeben wirklich kein Grund ist, dies aus Boshaftigkeit zu tun). Hier kann ich sehr die ersten Kapitel der online Javabücher (Handbuch der Javaprogrammierung, Java ist auch eine Insel, ...) empfehlen (auch wenn _der_ Stoff zugegebenermaßen recht trocken ist, aber Herr Hochberger hatte nie so tolle Übersichten zu den einfachen Sachen gebracht)

Und noch eins: Falls ihr nicht gleich durch den Quelltext der ersten Stufe durchseht, schaut euch mal die zweite Stufe an. Da sind Implementierungshinweise zu allen von euch zu schreibenden Klassen und Methoden, direkt vor der ersten Nutzung in der vorgegebenen Simulator-Klasse (auch noch zur ersten Stufe, war zumindest letztes Jahr so).

greetz da karnick3l
- Editiert von karnick3l am 28.04.2007, 18:19 -
ganz oder gar nicht - dazwischen gibt\'s nichts

andi
Beiträge: 508
Registriert: 10.09.2006 18:17
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von andi » 29.04.2007 13:15

[quote=karnick3l]Hinter der Fassade sind Referenzen auf Objekte zwar immer noch Zeiger, man kann sie aber wirklich genau so behandeln wie statische Variablen in C/C++ (übrigens gibt es auch Referenzen in C++, die ähnlich funktionieren; das wird für euch aber erst nächstes Jahr interessant, wenn Herr Urbas genauer darauf eingeht).[/quote]

So ungefähr hab ich mir das auch vorgestellt. Nur wäre es bei dem Parameterproblem immernoch der kleine aber sehr entscheidende Unterschied, dass wenn ich an eine Methode eine Variable als Parameter übergebe, und ich diese innerhalb der Methode ändere, ich nur den Wert des Parameters innerhalb der Methode selbst ändere und nicht den eigentlichen Parameter (,oder?). Bei übergebenen Objekten, wenn ich das jetzt richtig verstanden habe, ist das also anders und das Verändern des Objektes innerhalb der Methode bewirkt tatsächlich eine Änderung des Übergebenen Parameters. Also als fiktives Beispiel:

Code: Alles auswählen

int summand1=3, summand2=5, summe=0;
...
Summiere(summand1, summand2, summe);
...
public void Summiere(int su1, int su2, int su)
{
   su = su1 + su2;
}
summe hätte nach dem Aufruf von Summiere immernoch den Wert 0. Im Gegensatz zu:

Code: Alles auswählen

MySummand Summand1=new MySummand(3), Summand2=new MySummand(5);
MySumme Summe=new MySumme(0);
...
Summiere(Summand1, Summand2, Summe);
...
public void Summiere(MySummand Su1, MySummand Su2, MySumme Su)
{
   Su.wert = Su1.wert + Su2.wert;
}
Hier stünde im Objekt Summe tatsächlich der \'wert\' 8?

Und was mache ich wenn ich bei einem Methodenaufruf mehr als eine Variable ändern will? Ich kann ja mit \"return\" nur eine zurückgeben.

[quote]Was die Initialisierung angeht, die ist in Java genormt, was ein wegfallen lassen der Initialisierung in den meisten Fällen entschärft (aber zugegeben wirklich kein Grund ist, dies aus Boshaftigkeit zu tun). Hier kann ich sehr die ersten Kapitel der online Javabücher (Handbuch der Javaprogrammierung, Java ist auch eine Insel, ...) empfehlen (auch wenn _der_ Stoff zugegebenermaßen recht trocken ist, aber Herr Hochberger hatte nie so tolle Übersichten zu den einfachen Sachen gebracht)[/quote]

Bedeutet das also, dass wenn ich ein Objekt nur deklariere (also ohne \"new MyObject([..])\") und dann benutze, dass die Datenfelder des Objekts zwar \"genullt\" sind, aber eventuelle Voreinstellungen durch den Konstruktor nicht vorgenommen wurden und ich das Objekt dennoch frei verwenden kann?

sook_netaction
Beiträge: 332
Registriert: 21.11.2004 16:49
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von sook_netaction » 30.04.2007 16:40

[quote]Bedeutet das also, dass wenn ich ein Objekt nur deklariere (also ohne \"new MyObject([..])\") und dann benutze[/quote]
Wie soll das funktionieren? Mit new Klassenname erzeugst du ja erst dein Objekt?!
Erfolg verführt / Ehrgeiz verblendet / Eitelkeit vernichtet / Erkenntnis kann die Hölle sein


Benutzeravatar
rayman
Beiträge: 76
Registriert: 16.01.2006 20:06
Name: Robert Rasche
Geschlecht: männlich
Studienrichtung: Informationssystemtechnik
Matrikel: 2007
Angestrebter Abschluss: Dipl-Ing.

Info-Praktikum 1. Aufgabenteil

Beitrag von rayman » 30.04.2007 16:53

[quote]Bedeutet das also, dass wenn ich ein Objekt nur deklariere (also ohne \"new MyObject([..])\") und dann benutze, dass die Datenfelder des Objekts zwar \"genullt\" sind, aber eventuelle Voreinstellungen durch den Konstruktor nicht vorgenommen wurden und ich das Objekt dennoch frei verwenden kann?[/quote]

nein. Wenn du eine Variable für ein Objekt anlegst, z.B.

Code: Alles auswählen

Object myObject;
passiert nichts. Die Variable wird dann einfach mit einem NULL-Pointer initialisiert. Da ist kein Objekt da, was Datenfelder haben könnte, die initialisiert werden.
Erst mit dem \"new\" wird wirklich ein Objekt gemacht. Eine Referenz davon kommt dann in die Variable (s.a.o.).

Code: Alles auswählen

Object myObject = new Auto(\'gelb\');
Es spielt keine Rolle, ob etwas egal, belanglos oder unerheblich ist.

SPO
Beiträge: 86
Registriert: 09.02.2007 13:52

Info-Praktikum 1. Aufgabenteil

Beitrag von SPO » 09.05.2007 13:52

Bin ich der einzige, oder gibt es noch mehrere, die absolut keine Ahnung haben, was man da machen soll?Ja sicher, 2 klassen basteln, leichter gesagt als getan.......

andi
Beiträge: 508
Registriert: 10.09.2006 18:17
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von andi » 09.05.2007 13:57

Nein, da bist du sicher nicht der Einzige.

Benutzeravatar
Morpheus
Beiträge: 370
Registriert: 31.01.2007 22:12
Name: Tobias
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von Morpheus » 09.05.2007 14:45

ist nicht allzu schwer, okay, leicher gesagt. ich versuch euch mal zu erklären was man im 1.teil machen muss

zuerstmal schaut ihr euch die klasse die uns gegeben wurde an, den functionalsimulator. dort seht ihr, dass die zwei klassen nand und signal gebraucht werden, damit das ding läuft.
da seht ihr auch, welche parameter an den konstruktor der klassen übergeben werden, anzahl der eingänge eines nands und der name des signals. jetzt wisst ihr schonmal was die konstruktoren der klassen an die instanzfelder weiterreichen müssen.
dann habt ihr auch noch ein paar methoden die ihr implementieren müsst, z.b. setInput und setOutput. dort werden den nands ein und ausgangssignale zugeordnet. das müsst ihr jetzt irgendwie mit dem instanzfeld des nands verbinden(inputs am besten über array, größe kennt ihr aus anzahl der eingänge)
naja und desweiteren muss auch ein signal wissen, wo es angeschlossen ist an welches nand, also muss beim setOutput auf dem signal eine methode aufgerufen werden, die dem signal mitteilt, dass dieses spezielle nand ein neuer ausgang ist, am besten über arraylist. dann noch ein paar interne methoden wie die simulation des nands mit allen eingängen und die rückgabe des werts des signals, und schon seid ihr fertig. versucht euch so reinzudenken:
was bekommt Signal oder Nand vom Konstruktor
welche methoden werden zusätzlich aufgerufen
was bedeutet das für das instanzfeld der klasse
kann man das so schon berechnen ? wie läuft die berechnung ab ? --> erste antwort ist logischerweise nein, wär zu einfach
der entscheidende einfall wäre dann noch, dass wenn setValue auf einem Signal aufgerufen wird, alle Gatter ihre werte neu berechnen müssen woran das signal dran hängt, die ändern ihre ausgangssignale über setValue, damit ändern sich wieder alle gatter die da dran hängen und....so geht das weiter bis alles stimmt
The honor is still mine.

SPO
Beiträge: 86
Registriert: 09.02.2007 13:52

Info-Praktikum 1. Aufgabenteil

Beitrag von SPO » 09.05.2007 16:55

auf jedenfall schonma danke, ich werd deine tipps befolgen und dann ma sehen was bei rauskommt, mein problem is, dass ich vorher pascal programmiert hab, ich weiß, wie ich manche probleme in pascal lösen würde, aber in java sieht das anders aus. Naja ma sehen, probieren, probieren, probieren

Benutzeravatar
spazz
Beiträge: 61
Registriert: 29.09.2006 10:13
Name: Peter
Geschlecht: männlich
Studienrichtung: Mechatronik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von spazz » 10.05.2007 06:50

Soweit ich weiß...
[quote=andi]Hab gestern nur mal kurz über den FunctionalSimulator drüber geschaut und bin dabei auf folgendes gestoßen:

Code: Alles auswählen

inv1.setInput(0,i1);
[/quote]
0 ist ein Integer und i1 soll die Bezeichnung des Signals sein, also String.

Edit: :( ..und int is ne Klasse, ja klar! Omfg, da hab ich wohl im Halbschlaf, Wassermangel und unter sonstigen Einflüssen Stuss gepostet. Warum gibts keinen Sekundenschlaferkennungssystem für den Computer?
- Editiert von spazz am 13.05.2007, 08:53 -
Ein Atom ist winzig, doch für seine Bewohner sind seine Ausmaße \"unendliche Weiten\".

andi
Beiträge: 508
Registriert: 10.09.2006 18:17
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von andi » 10.05.2007 10:05

Ne. ;-)

Radu
Beiträge: 173
Registriert: 24.10.2006 12:41
Name: Mathias
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: DD Neustadt

Info-Praktikum 1. Aufgabenteil

Beitrag von Radu » 10.05.2007 10:56

Hmm, ich denke \"i1\" ist vom Typ/von der Klasse \"Signal\".
\"0\" ist int und bezeichnet die Senke, an der das Signal im Nand ankommt.

andi
Beiträge: 508
Registriert: 10.09.2006 18:17
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von andi » 10.05.2007 11:19

Ähm, habt ihr den Thread überhaupt mal gelesen? :disappoint:

Radu
Beiträge: 173
Registriert: 24.10.2006 12:41
Name: Mathias
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: DD Neustadt

Info-Praktikum 1. Aufgabenteil

Beitrag von Radu » 10.05.2007 11:29


Benutzeravatar
Morpheus
Beiträge: 370
Registriert: 31.01.2007 22:12
Name: Tobias
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Info-Praktikum 1. Aufgabenteil

Beitrag von Morpheus » 10.05.2007 14:27

keine ahnung was hier mit der senke bezeichnet, wenns den eingang meint ist\'s richtig.
informatiker beginnen eben bei 0 zu zählen, deswegen ist der erste eingang eben \"0\"
erleichtert aber dann auch die arbeit mit dem array, sonst müsste man da noch n bissl schauen wie man das mit for oder iterator durchläuft...im endeffekt alles +1 aber naja, sind so kleine späße an die man sich gewöhnen muss

und das i1 vom setInput sollte dann an die stelle, dem int wert, in dem array Signal[] Inputs gelegt werden.
mit Input[int] = i1; innerhalb der setInput methode
dann sollte da noch nen i1.addOutput als mehtode kommen, um dem i1 mitteilen, dass es grad irgendwo angeschlossen wurde
The honor is still mine.

Tank
Beiträge: 238
Registriert: 24.10.2006 18:48
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2006

Info-Praktikum 1. Aufgabenteil

Beitrag von Tank » 10.05.2007 16:10

mit senke bezeichnet man den ausgang

inv1.setInput(0,i1);

dadurch fasst euer setinput den integer und das objekt ab
damit kann die methode den wert manipulieren des objektes

wenn methode setInput(zahl,objekt)
dann kann die methode
objekt.wert = 5 (private/public fehlern mit ner minimethode umgehen )

so im groben

Radu
Beiträge: 173
Registriert: 24.10.2006 12:41
Name: Mathias
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2006
Angestrebter Abschluss: Dipl-Ing.
Wohnort: DD Neustadt

Info-Praktikum 1. Aufgabenteil

Beitrag von Radu » 10.05.2007 17:00

Ich meinte mit Senke den Eingang des Nand - Und dachte, Senke ist das Gegenteil von Quelle...

aber is ja auch egal - Ihr wisst schon, was ich meine ;-)

tharon
Beiträge: 23
Registriert: 05.12.2006 20:28

Info-Praktikum 1. Aufgabenteil

Beitrag von tharon » 10.05.2007 22:44

[quote]import java.util.ArrayList;

public class Signal {
private String name;
private boolean wert;
private ArrayList gatterliste;

public Signal(String n) {
this.name = n;
gatterliste = new ArrayList ();
}

public void setValue (boolean value) {
this.wert = value;
int i = 0;
while (i < gatterliste.size()) {
((Nand)gatterliste.get(i)).berechnen();
i++;
}
}
public void setVerbindung (Nand n) {
gatterliste.add(n);
}
public boolean getValue (){
return wert;
}
public String getName (){
return name;
}
}[/quote]

kann mir wer bitte mal genau erklären wie was das \"(Nand)\" bei (Nand)gatterliste.get(i)).berechnen(); bedeutet? also mir ist klar dass der aus der i\'ten stelle der arraylist das objekt rausholt und dann die methode berechnen aufruft... aber echt kein plan


just btw... das quelltext kommt von den lösungen ausm netaction forum!

Gesperrt

Zurück zu „1. und 2. Semester“