Musterlösungen von Studierenden werden allerdings bevorzugt und sollten auch über die Liste verteilt werden (aber bitte auch hier drei Wochen zuwarten, sodass alle Studierenden die Möglichkeit haben, in Ruhe Lösungsversuche zu unternehmen; es gibt nichts Ärgerlicheres als Lösungen vor der Zeit, da dadurch möglicherweise viel Mühe zunichte gemacht wird).
Die LV-Übersicht kann über den folgende URL (2. Abschnitt des gewünschten Semesters) gefunden werden: http://wwwi.wu-wien.ac.at/Studium/.
Die Foliensätze gemeinsam mit dieser Datei finden sich unter: http://wwwi.wu-wien.ac.at/Studium/LVA-Unterlagen/poolv/.
Rony G. Flatscher, Stand: 2003-02-22
Lösungshinweis: Die Formel für die Umrechnung von Celsius in Fahrenheit lautet:
Fahrenheit = Celsius*(9/5)+32
Lösungshinweis: Die Formel für die Umrechnung von Fahrenheit in Celsius lautet:
Celsius = (Fahrenheit-32)*(5/9)
.
Lösungshinweis: Die Formel für die Umrechnung von Celsius in Fahrenheit lautet:
Fahrenheit = Celsius*(9/5)+32
Lösungshinweis: Die Formel für die Umrechnung von Fahrenheit in Celsius lautet:
Celsius = (Fahrenheit-32)*(5/9)
.
Beispielsweise soll der Aufruf euro Ats 65 Dem fünfundsechzig österreichische Schillinge in deutsche Mark umrechnen. Wird keine Zielwährung angegeben, so soll der Betrag in alle Euro-Währungen inklusive dem Euro selbst umgewandelt werden.
Lösungshinweis: die Umrechnungskurse stehen in bezug auf einen Euro seit 1999-01-01 (Drachmen ab 2001-01-01) wie folgt fest:
1 | EUR | 13,760300 | ATS |
1 | EUR | 40,339900 | BEF |
1 | EUR | 1,955830 | DEM |
1 | EUR | 5,945730 | FIM |
1 | EUR | 6,559570 | FRF |
1 | EUR | 0,787564 | IEP |
1 | EUR | 1.936,270000 | ITL |
1 | EUR | 40,339900 | LUF |
1 | EUR | 2,203710 | NLG |
1 | EUR | 200,482000 | PTE |
1 | EUR | 166,386000 | ESP |
1 | EUR | 340,750000 | GRD |
Zusätzlich:
UNBEKANNTE_EINGABE_WAEHRUNG
bzw.
UNBEKANNTE_AUSGABE_WAEHRUNG
, wenn entsprechend unbekannte Währungen
eingegeben werden.
Definieren Sie einen ADT EURO in Object Rexx, der über folgende Attribute und Funktionen/Prozeduren ("Methoden") verfügen soll:
Waehrung
: speichert das Währungskennzeichen, z.B.
ATS.
Land
: speichert die Landesbezeichnung auf Englisch, z.B.
Austria.
Bezeichnung
: speichert die Bezeichnung der Währung
in der entsprechenden Landessprache, z.B.
Schilling.
Umrechnungskurs
: speichert den Waehrungsbetrag, der 1 EUR entspricht
(vgl. Tabelle in Aufgabe 3+4), z.B.
13.7603.
W2E
("Währung-To-Euro"): rechnet den als
Argument erhaltenen Betrag in den Eurobetrag um.
E2W
("Euro-To-Währung"): rechnet den als
Argument erhaltenen Euro-Betrag in den Währungsbetrag um.
Mit Hilfe der Initialisierung von neuen Objekten sollen die Attribute Waehrung
,
Land
, Bezeichnung
und Faktor
ihre Werte erhalten.
In weiterer Folge kann ein derartiges Euro-Objekt zum Umrechnen von Währungen
benutzt werden.
Die Programmanweisungen:
ergeben als Ausgabe:
/* Argumente: "Waehrung", "Land", "Bezeichnung", "Umrechnungskurs" */
o = .euro ~ NEW("ATS", "Austria", "Schilling", 13.7603)
SAY o~Bezeichnung o~umrechnungskurs o~Land o~waehrung
SAY
SAY "100" o~waehrung "sind:" o~w2e(100) "EUR"
SAY "100 EUR sind:" o~e2w(100) o~waehrung
Schilling 13.7603 Austria ATS
100 ATS sind: 7.26728342 EUR
100 EUR sind: 1376.0300 ATS
W2E
und E2W
sind nicht mehr notwendig und sollen deshalb entfernt werden.
EURO
-Objektes gesetzt und die entsprechenden Werte dürfen
jederzeit abgerufen werden: Waehrung
, Land
,
Bezeichnung
und Umrechnungskurs
.
Lösungshinweis: Wenn eine METHOD
-Direktive
vom Interpreter abgearbeitet wird, dann werden immer zwei Methoden in der Klasse angelegt, eine zum Setzen
("Zuweisungsmethode")
von Werten und eine zum Abrufen ("Zugriffsmethode") der gespeicherten Werte.
Beispiel der Definition eines Attributs xyz mit Hilfe einer METHOD
-Direktive :
::METHOD xyz ATTRIBUTE
Der Interpreter legt daraufhin die folgenden beiden Methoden in der Klasse an:
::METHOD XYZ /* Zugriffsmethode, die den im Attribut gespeicherten Wert liefert */
EXPOSE XYZ /* Zugriff auf Attribut herstellen */
RETURN XYZ /* gespeicherten Wert zurückgeben */
::METHOD "XYZ=" /* Zuweisungsmethode, die Attributwert gemäß Argument setzt */
EXPOSE XYZ /* Zugriff auf Attribut herstellen */
USE ARG XYZ /* Argumentwert im Attribut speichern */
Setzen Sie daher die Werte der Attribute in der INIT
-Methode,
definieren Sie keine
Attributmethoden (Methoden-Direktiven mit dem Schlüsselwort ATTRIBUTE
)
und definieren Sie stattdessen selbst nur
die Zugriffsmethode (im obigen Beispiel die xyz
-Methode),
um die gespeicherten Werte abfragen zu lassen.
EURO
-Objekt soll ein Attribut zum Speichern
des Betrages und ein Attribut zum Speichern des entsprechenden
EURO-Betrages vorsehen: wenn ein Betrag im Wert geändert wird, so
soll automatisch der EURO-Betrag berechnet und das Resultat gespeichert werden und
umgekehrt (eine Änderung des EURO-Betrag soll automatisch zur Korrektur
des Betragwertes führen).
Sehen Sie daher zum Speichern der entsprechenden Werte die folgenden zwei neuen Attribute vor:
Betrag
und
Euro_Betrag
.
EURO
-Objektes soll ein optionales
fünftes Argument angegeben werden können, das einen Betrag beinhaltet.
Wird es nicht angegeben, müssen Sie sicherstellen, daß die beiden neuen Attribute
Betrag
und
Euro_Betrag
auf den Wert 0
gesetzt werden.
Lösungshinweis: Definieren Sie sowohl die Zugriffsmethode, die den aktuellen Wert des Attributs zurückgibt, als auch die Zuweisungsmethode, mit der ein Attribut einen Wert zugewiesen erhält, selbst!
Mit Hilfe der Initialisierung von neuen Objekten sollen die Attribute Waehrung
,
Land
, Bezeichnung
, Faktor
und optional Betrag
ihre Werte erhalten.
In weiterer Folge kann ein derartiges Euro-Objekt zum Umrechnen von Währungen
benutzt werden, indem man einfach entweder den Betrag
oder den Euro_Betrag
setzt und anschließend den Wert des jeweils anderen Attributes abfrägt.
Die Programmanweisungen:
ergeben als Ausgabe:
/* Argumente: "Waehrung", "Land", "Bezeichnung", "Umrechnungskurs" */
o = .euro ~ NEW("ATS", "Austria", "Schilling", 13.7603)
SAY o~Bezeichnung o~umrechnungskurs o~Land o~betrag o~waehrung o~euro_betrag "EUR"
SAY
o~betrag = 100
SAY o~betrag o~waehrung "sind:" o~euro_betrag "EUR"
o~euro_betrag = 100
SAY o~euro_betrag "EUR sind:" o~betrag o~waehrung
Schilling 13.7603 Austria 0 ATS 0 EUR
100 ATS sind: 7.26728342 EUR
100 EUR sind: 1376.0300 ATS
Geben Sie zunächst am Ende des Aussortierens an, wieviele Früchte insgesamt im Sack sind sowie wieviele Stück von jeder Frucht darin enthalten sind.
Als Beispiel solle der Sack aus folgendem Inhalt bestehen:
"Apfel",
"Apfel",
"Birne",
"Erdbeere",
"Apfel",
"Banane",
"Zwetschke",
"Zwetschke",
"Banane",
"Apfel",
"Birne",
"Papaya",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Apfel",
"Erdnuss",
"Ananas",
"Banane",
"Zwetschke",
"Birne",
"Birne",
"Zwetschke",
"Zwetschke",
"Banane",
"Apfel",
"Birne",
"Papaya",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Apfel",
"Erdnuss",
"Ananas",
"Banane",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Erdnuss",
"Apfel",
"Erdnuss",
"Ananas",
"Banane",
"Erdnuss",
"Papaya",
"Mango",
"Erdnuss",
"Erdnuss",
"Apfel",
"Erdnuss",
"Ananas",
"Banane",
"Birne"
Aufgrund dieses Inhalts sollen entsprechend der Angabe folgende Ausgaben erfolgen:
Total of fruits in bag: 56
consisting of:
Banane: 7
Erdnuss: 20
Mango: 1
Ananas: 4
Papaya: 3
Erdbeere: 1
Apfel: 9
Birne: 6
Zwetschke: 5
Erstellen Sie ein Programm, das diese Aufgabe erfüllt.
Aufgrund des in Aufgabe 9+10+11 (1) angegebenen Inhalts des Fruchtsacks sollen entsprechend der abgeänderten Angabe folgende Ausgaben erfolgen:
Received Fruits (ordered)
Banane
Birne
Zwetschke
Apfel
Received Fruits (not ordered)
Erdnuss
Mango
Ananas
Papaya
Erdbeere
Received Fruits (ordered)
Apfel: 9
Banane: 7
Birne: 6
Zwetschke: 5
Received Fruits (not ordered)
Erdnuss: 20
Mango: 1
Ananas: 4
Papaya: 3
Erdbeere: 1
Erstellen Sie ein Programm, das diese Aufgabe erfüllt.
"Manager"
"Manager"
umsetzt:
Managed_Objects
verfügbar gemacht werden.
Broadcast
zur
Verfügung, die das empfangende Nachrichtenobjekt an alle gesammelten
Objekte weiterleitet. Als zweites, optionales Argument kann .true
angegeben werden, wodurch sichergestellt wird, daß das Nachrichtenobjekt
synchron weitergeleitet wird, also mit Hilfe der Nachricht SEND
aktiviert wird.
Lösungshinweise:
SEND
aktivieren,
wartet Ihr Programm, bis die Methode des Zielobjekts mit ihrer Abarbeitung fertig
ist ("synchrone" Abarbeitung).
START
aktivieren,
erhält Ihr Programm sofort wieder die Kontrolle und kann daher sofort weiterarbeiten
und dem nächsten gesammelten Objekt die (eine Kopie der erhaltenen) Nachricht
senden (Nebenläufigkeit, "asynchrone" Abarbeitung).
Message
.)
Beispielsprogramm, das diese Managerklasse verwenden soll:
/* pgm_12-1_aha.cmd */
.test~~new("Anton") ~~new("Berta") ~~new("Caesar")
SAY "Before synchroneous broadcast..."
.test~broadcast( .message~new(.nil, "say_info"), .true )
SAY "after synchroneous broadcast."
SAY
SAY "Before Asynchroneous broadcast..."
.test~broadcast( .message~new(.nil, "say_info"))
SAY "after asynchroneous broadcast."
::REQUIRES "pgm_12-1.cmd.html"
/* --------------------------- Test-Class -------------------------------- */
::CLASS test METACLASS Manager
/* --------------------------- Class Methods ----------------------------- */
::METHOD Init CLASS
EXPOSE counter
counter=0
self~init:super
::METHOD count CLASS
EXPOSE counter
counter=counter+1
RETURN counter
/* --------------------------- Instance Methods -------------------------- */
::METHOD Init
EXPOSE name number
USE ARG name
number=self~class~count
self~init:super
::METHOD name ATTRIBUTE
::METHOD say_info
EXPOSE number
SAY " SAY_INFO - name:" self~name "created as #" number
Eine mögliche Ausgabe:
Before synchroneous broadcast...
Manager.Broadcast: invoking messages synchroneously...
SAY_INFO - name: Caesar created as # 3
SAY_INFO - name: Berta created as # 2
SAY_INFO - name: Anton created as # 1
after synchroneous broadcast.
Before Asynchroneous broadcast...
Manager.Broadcast: invoking messages asynchroneously...
after asynchroneous broadcast.
SAY_INFO - name: Caesar created as # 3
SAY_INFO - name: Berta created as # 2
SAY_INFO - name: Anton created as # 1
Erstellen Sie eine entsprechende Metaklasse.