| HU - Informatik Fachdidaktik |
- Objektorientierte Programmierung im Anfangsunterricht - |
S. Spolwig 05.1 |
|
[Home |
Aktuelles |
Dokumente |
Inhalt | Literatur |
Organisation] |
| Aufgabe 4 Für das Lohnsteuerbüro SO 36 ist ein EDV-System zu entwerfen, das die Daten der Mandanten sowie die der Mitarbeiter verwaltet. Bewegungsdaten (Termine, Abrechnungen u. ä.) werden nicht erfasst.
Lösung 4 - Code in Object Pascal (DELPHI) UNIT uPerson;
(* ******************************************************************** *)
(* K L A S S E : TPerson *)
(* -------------------------------------------------------------------- *)
INTERFACE
(* ========================== Export ================================== *)
uses
uAdresse;
type
TPerson = class (TObject)
protected
Name,
Vorname : string[20];
Geburtstag : string[10];
Geschlecht : string[1]; (* m,w *)
public
Adresse : TAdresse; // die Aggregation/Komposition
constructor Create; virtual;
procedure Init; virtual;
procedure SetName (n: string); virtual;
procedure SetVorName (vn: string); virtual;
procedure SetGeburtstag (gb : string); virtual;
procedure SetGeschlecht (g: string); virtual;
function GetName : string; virtual;
function GetVorName : string; virtual;
function GetGeburtstag : string; virtual;
function GetGeschlecht : string; virtual;
end; (* TPerson *)
(* -------------------- B e s c h r e i b u n g ------------------------- Oberklasse : - (TObject) Bezugsklassen : TAdresse Methoden -------- Create Auftrag: Person und Adresse erzeugen und Initialisieren vorher : - nachher: Person ist erzeugt, alle Datenfelder sind leer. Init Auftrag: Person Initialisieren vorher : ist erzeugt nachher: alle Datenfelder sind leer. Set... Auftrag: Attribut schreiben vorher : Person ist vorhanden. nachher: Attribut ist gesetzt Get... Anfrage: Attribut aus dem Objekt lesen vorher : Person ist vorhanden. nachher: - ----------------------------------------------------------------------- *) IMPLEMENTATION (* ==================================================================== *) constructor TPerson.Create; (* -------------------------------------------------------------------- *) begin inherited Create; // Instanz von geerbtem TObject erzeugen Adresse := TAdresse.Create; // und das Adressobjekt als Komposition miterzeugen Init; end; procedure TPerson.Init; (* -------------------------------------------------------------------- *) begin Name := ''; Vorname := ''; Geburtstag := ''; Geschlecht := chr(0); Adresse.Init; end; procedure TPerson.SetName (n: string); (* -------------------------------------------------------------------- *) begin Name := n; end; function TPerson.GetName : string; (* -------------------------------------------------------------------- *) begin result := Name; end; // ... u.s.w. END. UNIT uSListe; (* ******************************************************************** *) (* K L A S S E : TListe *) (* -------------------------------------------------------------------- *) (* Version : 1.1 *) (* Autor : (c) S. Spolwig, OSZ-Handel I, 10997 Berlin *) (* *) (* Aufgabe : Allgemeine statische Liste zur Verwaltung beliebiger *) (* Objekte. *) (* Zum Bewegen in der Liste ist intern eine Listenmarke *) (* mitgefuehrt, die die jeweils aktuelle Listenposition *) (* bezeichnet. Alle Operationen werden auf der aktuellen*) (* Position ausgefuehrt. *) (* ******************************************************************** *) INTERFACE (* ==================================================================== *) USES uPerson; const MAXLAENGE = 100; type TElement = Tperson; // Elemente sollen Personen sein TListe = class (TObject)
private
Kollektion : array [0..MAXLAENGE + 1] of TElement;
ListenLaenge, // Anzahl der belegten Elemente
AktuellePos : word; // aktives Element oder EoList
public
constructor Create; virtual;
procedure Init; virtual;
// ... und viele andere mehr ...
procedure Sortieren;
end;
(* ----------------- B e s c h r e i b u n g ------------------------- Oberklasse : - (TObject) Bezugsklassen : TPerson Methoden -------- Create Auftrag : Leere L. erzeugen vorher : - nachher : ListenLaenge ist Null, AktuellePos ist 0. Init Auftrag : L. initial. vorher : L. ist vorhanden nachher : ListenLaenge ist Null, AktuellePos ist 0. Sortieren Auftrag : Liste nach Namen durch Tauschen aufsteigend sortieren. vorher : L. ist nicht leer. nachher : L. liegt in sortierter Reihenfolge vor ----------------------------------------------------------------------- *) IMPLEMENTATION (* ==================================================================== *) constructor TListe.Create; (* -------------------------------------------------------------------- *) begin inherited Create; Init; end; procedure TListe.Init;
(* -------------------------------------------------------------------- *)
var i : integer;
begin
for i := 0 to MAXLAENGE +1 do
begin
Kollektion[i] := NIL; // Objekte sind in Delphi Zeiger auf Obj.
end;
ListenLaenge := 0;
AktuellePos := 0;
end;
// ... u..v.a.m. procedure Tauschen (var E1, E2 : TElement); (* ------------------------------------------------------------------ *) (* lokale Prozedur, die NICHT zur Klassendeklaration gehört! *) (* ------------------------------------------------------------------ *) var hilf : TElement; begin hilf:= E1; E1 := E2; E2 := hilf end; procedure TListe.Sortieren; (* ------------------------------------------------------------------ *) (* Auftrag: lineares Sortieren durch Vergleichen und Vertauschen des *) (* nachfolgenden Elements bis nicht mehr getauscht wird. *) (* Endmarke rueckt vor und verkleinert Restfeld *) (* vorher : Kollektion ist initialisiert *) (* nachher: Kollektion ist aufsteigend sortiert *) (* ------------------------------------------------------------------ *) var i, Endmarke : integer; IstFertig: boolean; begin Endmarke := Listenlaenge - 1 ; IstFertig := false; while NOT IstFertig do
begin
IstFertig := true ;
for i := 1 to endmarke do
begin
if Kollektion[i].GetName > Kollektion[i+1].GetName
then
begin
IstFertig := false;
Tauschen (Kollektion[i], Kollektion[i+1]);
end;
end;
Endmarke := Endmarke - 1; // Restfeld verkleinern
end; // while
end;
{ hier noch die nachprüfende Variante
procedure TListe.Sortieren; (* ------------------------------------------------------------------ *) (* Auftrag: lineares Sortieren durch Vergleichen und Vertauschen des *) (* nachfolgenden Elements bis nicht mehr getauscht wird. *) (* Endmarke rueckt vor und verkleinert Restfeld *) (* vorher : Kollektion ist initialisiert *) (* nachher: Kollektion ist aufsteigend sortiert *) (* ------------------------------------------------------------------ *) var i, Endmarke : integer; IstFertig: boolean; begin
Endmarke := Listenlaenge - 1 ;
repeat
IstFertig := true ;
for y := 1 to endmarke do
begin
if Kollektion[i].GetName > Kollektion[i+1].GetName
then
begin
Tauschen (Kollektion[i], Kollektion[i+1]);
IstFertig := false;
end;
end;
Endmarke := Endmarke - 1; // Restfeld verkleinern
until IstFertig;
end;
}
END.
|