program makler; const max = 100; type jahr = 1600..2012; arten = (EFH,MFH,RH,REH,DHH,ETW, Sonstiges); ziffer = '0'..'9'; gueltigeplz = array[1..5] of ziffer; merkmale = (GaesteWC, Garage, Carport, Terrasse, Garten, Balkon, Kamin, Wintergarten, Einbaukueche, Parkett); objekttyp = record verkaeufer: string; plz : gueltigeplz; hausart: arten; zimmer: integer; baujahr: jahr; ausstattung : set of merkmale; preis: real; verhandelbar: boolean; end; objektzeiger = ^element; element = record objekt:objekttyp; next: objektzeiger; end; var liste: objektzeiger; eingabe:integer; function neu:objekttyp; var haus: objekttyp; i:integer; s,m:string; v:char; begin write('Geben Sie den Namen des Verkaeufers ein: '); readln(haus.verkaeufer); write('Nun benoetigen wir die PLZ des Objekts: '); for i:=1 to 5 do read(haus.plz[i]); readln(); write('Bitte geben Sie die Art des Objekts an: '); readln(s); if s= 'EFH' then haus.hausart:=EFH else if s ='MFH' then haus.hausart := MFH else if s ='RH' then haus.hausart := RH else if s ='REH' then haus.hausart := REH else if s ='DHH' then haus.hausart := DHH else if s ='ETW' then haus.hausart := ETW else begin writeln('Diese Hausart gibt es nicht!'); haus.hausart := Sonstiges end; write('Bitte geben Sie die Zimmerzahl an: '); readln(haus.zimmer); write('Bitte geben Sie das Baujahr an: '); readln(haus.baujahr); writeln('Bitte geben Sie jetzt die Ausstattungsmerkmale (nacheinander) an:'); haus.ausstattung := []; i:=1; while (not EOF) do begin write(i,': '); readln(m); if m = 'GaesteWC' then haus.ausstattung := haus.ausstattung +[GaesteWC] else if m='Garage' then haus.ausstattung := haus.ausstattung+[Garage] else if m='Carport' then haus.ausstattung := haus.ausstattung+[Carport] else if m='Garten' then haus.ausstattung := haus.ausstattung+[Garten] else if m='Terrasse' then haus.ausstattung := haus.ausstattung+[Terrasse] else if m='Balkon' then haus.ausstattung := haus.ausstattung+[Balkon] else if m='Wintergarten' then haus.ausstattung := haus.ausstattung+[Wintergarten] else if m='Kamin' then haus.ausstattung := haus.ausstattung+[Kamin] else if m='Einbaukueche' then haus.ausstattung := haus.ausstattung+[Einbaukueche] else if m='Parkett' then haus.ausstattung := haus.ausstattung+[Parkett]; i:=i+1; end; write('Und zum Schluss noch den Preis: '); readln(haus.preis); v:='v'; while (v<>'j') and (v<>'n') do begin write('Ist dieser Preis verhandelbar? (j/n) '); readln(v); end; if v='j' then haus.verhandelbar := true; if v='n' then haus.verhandelbar := false; writeln('Danke fuer Ihre Angaben!'); neu := haus; end; procedure ausgabe(haus: objekttyp); var i:integer; begin writeln('-------------------------------------------------'); writeln('Angaben zum Objekt:'); writeln('Verkaeufer: ',haus.verkaeufer); write('Ort/Lage: '); for i:=1 to 5 do write(haus.plz[i]); writeln; writeln('Art des Objekts: ',haus.hausart,', Baujahr: ',haus.baujahr, ', Zimmeranzahl: ',haus.zimmer); write('Ausstattung: '); if GaesteWC in haus.ausstattung then write('GaesteWC, '); if Garage in haus.ausstattung then write('Garage, '); if Carport in haus.ausstattung then write('Carport, '); if Terrasse in haus.ausstattung then write('Terrasse, '); if Garten in haus.ausstattung then write('Garten, '); if Balkon in haus.ausstattung then write('Balkon, '); if Wintergarten in haus.ausstattung then write('Wintergarten, '); if Kamin in haus.ausstattung then write('Kamin, '); if Einbaukueche in haus.ausstattung then write('Einbaukueche, '); if Parkett in haus.ausstattung then write('Parkett, '); writeln(); write('Verkaufspreis: ',haus.preis:12:2); if haus.verhandelbar then writeln(' Verhandlungsbasis'); if haus.verhandelbar = false then writeln(' Festpreis, nicht verhandelbar'); end; function gleich(plz1,plz2 :gueltigeplz):boolean; begin if(plz1[1]=plz2[1]) AND (plz1[2]=plz2[2]) AND (plz1[3]=plz2[3]) AND (plz1[4]=plz2[4]) AND (plz1[5]=plz2[5]) then gleich:=true else gleich:=false; end; function kleiner(plz1,plz2: gueltigeplz): boolean; begin kleiner:= false; if (plz1[1] NIL) AND ( (kleiner(laufzeiger^.objekt.plz,o.plz)) OR (((gleich(laufzeiger^.objekt.plz,o.plz)) AND (laufzeiger^.objekt.preis < o.preis)))) do begin hilfszeiger := laufzeiger; laufzeiger := laufzeiger^.next; end; if (hilfszeiger^.next <> NIL) then //mittig einfuegen begin neuesElement^.next := laufzeiger; hilfszeiger^.next := neuesElement; end else //laufzeiger=NIL -> hinten anhaengen begin neuesElement^.next := NIL; hilfszeiger^.next:=neuesElement; end; end; writeln('Objekt gespeichert!'); end; procedure alleausgeben; var laufzeiger: objektzeiger; begin writeln('************************************************************'); writeln('Liste aller Maklerobjekte: '); laufzeiger:= liste; while laufzeiger<> NIL do begin ausgabe(laufzeiger^.objekt); writeln('-------------------------------------------------------'); laufzeiger:=laufzeiger^.next; end; end; procedure suche(); var i:integer; gefunden:boolean; plzanfang : array[1..3] of ziffer; laufzeiger:objektzeiger; begin gefunden := false; laufzeiger:=liste; write('Geben Sie die ersten drei Ziffern des PLZ-Bereichs ein: '); for i:=1 to 3 do read(plzanfang[i]); while laufzeiger<>NIL do begin if (plzanfang[1]=laufzeiger^.objekt.plz[1]) AND (plzanfang[2] = laufzeiger^.objekt.plz[2]) AND (plzanfang[3] = laufzeiger^.objekt.plz[3]) then begin gefunden := true; ausgabe(laufzeiger^.objekt); writeln('--------------------------------------------------------'); laufzeiger:=laufzeiger^.next; end else laufzeiger:=laufzeiger^.next; end; if not gefunden then writeln('Leider momentan keine Objekte in diesem Bereich im Angebot'); end; function artgleich(art1:arten; art2:string):boolean; begin artgleich:= false; case art1 of EFH: if art2='EFH' then artgleich:=true; MFH: if art2='MFH' then artgleich:=true; RH: if art2='RH' then artgleich:=true; REH: if art2='REH' then artgleich:=true; DHH: if art2='DHH' then artgleich:=true; ETW: if art2='ETW' then artgleich:=true; Sonstiges: if art2='Sonstiges' then artgleich:=true; end; end; procedure loescheObjekt(name:string;tmpplz:gueltigeplz; art:string); var laufzeiger, hilfszeiger:objektzeiger; geloescht:boolean; begin geloescht :=false; laufzeiger:=liste; hilfszeiger:=laufzeiger; while laufzeiger<>NIL do begin if (laufzeiger^.objekt.verkaeufer=name) AND (gleich(laufzeiger^.objekt.plz, tmpplz)) AND (artgleich(laufzeiger^.objekt.hausart,art)) then begin //richtiges gefunden, nun loeschen if (laufzeiger=hilfszeiger) then //erstes Element muss geloescht werden begin liste:=laufzeiger^.next; dispose(laufzeiger); geloescht:=true; end else //mittleres oder letztes Element loeschen begin hilfszeiger^.next:=laufzeiger^.next; dispose(laufzeiger); geloescht:=true; end; writeln('...und geloescht'); laufzeiger:=NIL; end else begin hilfszeiger:=laufzeiger; laufzeiger:=laufzeiger^.next; end; end; if NOT(geloescht) then writeln('...und leider nicht gefunden!'); end; procedure loeschen; var tmpplz: array[1..5] of ziffer; name,art: string; i:integer; begin writeln('Makler-Objekt soll geloescht werden'); write('Bitte geben Sie dazu den Namen des Verkaeufers ein: '); readln(name); write('Bitte geben Sie die PLZ des Objekts ein: '); for i:=1 to 5 do read(tmpplz[i]); readln; write('Bitte geben Sie die Art des Objekts an: '); readln(art); writeln('Danke fuer die Angaben. Objekt wird gesucht.....'); loescheObjekt(name,tmpplz, art); end; begin //Hauptprogramm: eingabe :=5; while (eingabe <> 0) do begin repeat writeln(); writeln(); writeln('------------- MaklerSoft - Hauptmenue --------------'); writeln('Bitte waehlen Sie:'); writeln('1 -- neues Maklerobjekt anlegen'); writeln('2 -- alle aktuellen Objekte anzeigen'); writeln('3 -- Objekte in PLZ-Bereich suchen'); writeln('4 -- Objekt loeschen'); writeln('0 -- Programm beenden'); write('Ihre Wahl: '); readln(eingabe); until (eingabe>=0) OR (eingabe<=4); case eingabe of 1:einfuegen(neu); 2:alleausgeben; 3:suche; 4:loeschen; end; end; end.