
Stian Søiland, IT 112, øvingsgruppe 15 (stud.ass. Helle Haugenes)
unit Unit1;
// Har utvidet Oppgave 1 til sirkulær dobbeltlenket liste
// (Dobbeltlenket for morros skyld)
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
hode: figurlistepeker;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Prosedyre for registrering
procedure TForm1.Button1Click(Sender: TObject);
// Prosedyre for å slette eventuell eksisterende liste
procedure slettliste(var hode:figurlistepeker);
// bruker nå to temp-pekere
var temp1,temp2:figurlistepeker;
begin
// Gjennomløper hele den lenkede listen. Er listen tom, gjøres ingenting.
// Til slutt vil hodet være NIL
temp1 := hode;
// endret sløyfestruktur
if hode <> nil then
repeat
begin
temp2 := temp1;
temp1 := temp1^.neste;
dispose(temp2);
end;
// når temp1 er hode, er vi gått igjennom hele den sirkulære listen
// og det er ingen noder igjen i den sirkulære listen
until temp1 = hode;
hode := nil;
end;
// Prosedyre for å registrere figurer
procedure registrer;
begin
Form1.Enabled := False;
Form2.Visible := True;
end;
begin
slettliste(hode);
listbox1.clear;
registrer;
end;
// Prosedyre for å skrive ut listen
procedure TForm1.Button2Click(Sender: TObject);
procedure skrivut(hode:figurlistepeker);
var neste : figurlistepeker;
begin
neste := hode;
// Gjennomløper hele den lenkede listen
listbox1.clear;
// endret sløyfestruktur
if hode <> NIL then
repeat
begin
with neste^ do
begin
case figurtype of
linje: begin
listbox1.items.add('Linje med lengde '
+ FloatToStr(lengde));
end;
trekant: begin
listbox1.items.add('Trekant med høyde '
+ FloatToStr(hoyde) + ' og bredde '
+ FloatToStr(bredde));
end;
firkant: begin
listbox1.items.add('Firkant med høyde '
+ FloatToStr(hoyde) + ' og bredde '
+ FloatToStr(bredde));
end;
sirkel: begin
listbox1.items.add('Sirkel med radius '
+ FloatToStr(radius));
end;
end; // end case
end; // end with
neste := neste^.neste;
end; // end until
until neste = hode;
// Hele den sirkulære listen er skrevet ut, vi er tilbake på begynnelsen
end; // end skrivutprosedyre
begin
skrivut(hode);
end;
// Kjøres ved oppstart for å nullstille den globale variabelen hode
procedure TForm1.FormCreate(Sender: TObject);
begin
hode := nil;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
figurer = (linje,trekant,firkant,sirkel);
figurlistepeker = ^figurlistetype;
figurlistetype = record
// lagt til forrige for sirkulær lenket liste
neste,forrige:figurlistepeker;
case figurtype:figurer of
linje: (lengde:real);
trekant,firkant: (hoyde,bredde:real);
sirkel: (radius:real);
end;
TForm2 = class(TForm)
RadioGroup1: TRadioGroup;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
procedure Reset;
procedure Button1Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
neste: figurlistepeker;
implementation
uses Unit1;
{$R *.DFM}
procedure Tform2.Reset;
begin
RadioGroup1.Itemindex := -1;
Edit1.Visible := False;
Edit2.Visible := False;
Edit1.Text := '';
Edit2.Text := '';
Label1.Visible := False;
Label2.Visible := False;
end;
procedure TForm2.Button1Click(Sender: TObject);
procedure nynode(var hode,neste:figurlistepeker);
var temp:figurlistepeker;
begin
if hode = nil then
begin
new(hode);
neste := hode;
end
else
begin
new(temp);
// lagt til forrige-peker
neste^.neste := temp;
temp^.forrige := neste;
neste := neste^.neste;
end;
// endret fra nil til hode
neste^.neste := hode;
end;
begin
if RadioGroup1.ItemIndex > -1 then
begin
nynode(form1.hode,neste);
with neste^ do
begin
case RadioGroup1.ItemIndex of
0: begin
figurtype := linje;
lengde := StrToFloat(Edit1.text);
end;
1: begin
figurtype := trekant;
hoyde := StrToFloat(Edit1.text);
bredde := StrToFloat(Edit2.text);
end;
2: begin
figurtype := firkant;
hoyde := StrToFloat(Edit1.text);
bredde := StrToFloat(Edit2.text);
end;
3: begin
figurtype := sirkel;
radius := StrToFloat(Edit1.text);
end;
end; // slutt case of
end; // slutt with
reset;
end;
end;
procedure TForm2.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0: begin
Edit2.Visible := False;
Label2.Visible := False;
Label1.Caption := 'Lengde:';
Edit1.Visible := True;
end;
1,2: begin
Label1.Caption := 'Lengde:';
Label2.Visible := True;
Edit2.Visible := True;
end;
3: begin
Edit2.Visible := False;
Label2.Visible := False;
Label1.Caption := 'Radius:';
end;
end;
Edit1.Visible := True;
Label1.Visible := True;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Form2.Visible := False;
Form1.Enabled := True;
reset;
end;
end.