|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7808 (0x1e80)
Types: TextFile
Names: »DOBBELT.PAS«
└─⟦08ea08c61⟧ Bits:30003924 PolyPascal programmer
└─⟦this⟧ »DOBBELT.PAS«
└─⟦092727b26⟧ Bits:30005927 Demoprogrammer til Pascal bog (Jet-80)
└─⟦this⟧ »DOBBELT.PAS«
└─⟦3702e543b⟧ Bits:30003064 Demoprogrammer A-J til Pascal bog
└─⟦this⟧ »DOBBELT.PAS«
PROGRAM dobbelt;
TYPE
str40 = STRING(.40.);
link = ^ post;
post = RECORD
frem, tilbage : link;
navn : str40;
adresse : str40;
END;
VAR
ud, top, bund, pp : link;
ch : CHAR;
PROCEDURE return;
VAR
ch : CHAR;
BEGIN (* return *)
WRITE('Tast <RETURN>: ');
REPEAT
READ(KBD, ch);
UNTIL ch = CHR(13);
WRITELN;
END; (* return *)
PROCEDURE indsaet(VAR foerste, sidste : link; nypost : link);
VAR
foran, kandidat : link;
fundet : BOOLEAN;
BEGIN (* indsaet *)
IF foerste = NIL (* kæden er tom *)
THEN
BEGIN
foerste := nypost;
sidste := nypost;
END
ELSE IF nypost^.navn < foerste^.navn (* før første post *)
THEN
BEGIN
nypost^.frem :=foerste;
foerste^.tilbage := nypost;
foerste :=nypost;
END
ELSE (* find rigtig plads til nypost *)
BEGIN
fundet :=FALSE;
foran := foerste;
kandidat :=foerste^.frem;
WHILE (kandidat <> NIL) AND NOT fundet DO
IF nypost^.navn < kandidat^.navn
THEN fundet := TRUE
ELSE
BEGIN
foran := kandidat;
kandidat := kandidat^.frem;
END;
IF foran <> sidste
THEN
BEGIN
nypost^.frem := kandidat;
nypost^.tilbage := foran;
kandidat^.tilbage := nypost;
foran^.frem :=nypost;
END
ELSE
BEGIN
foran^.frem := nypost;
nypost^.tilbage := foran;
sidste := nypost;
END;
END;
WRITELN;
WRITE(nypost^.navn, ' er nu indsat i kæden. ');
return;
END; (* indsaet *)
PROCEDURE fjern(VAR foerste, sidste : link; glpost : link);
VAR
foran, kandidat : link;
fundet : BOOLEAN;
BEGIN (* fjern *)
IF foerste = NIL (* kæden tom *)
THEN fundet := FALSE
ELSE IF foerste^.navn = glpost^.navn (* fjern post 1 *)
THEN
IF foerste^.frem = NIL
THEN
BEGIN
foerste := NIL;
sidste := NIL;
fundet := TRUE;
END
ELSE
BEGIN
foerste^.frem^.tilbage := NIL;
foerste := foerste^.frem;
fundet := TRUE;
END
ELSE (* Søg efter navnet *)
BEGIN
fundet := FALSE;
foran := foerste;
kandidat := foerste^.frem;
WHILE (kandidat <> NIL) AND NOT fundet DO
IF glpost^.navn = kandidat^.navn
THEN
BEGIN
IF kandidat <> sidste
THEN
BEGIN
foran^.frem := kandidat^.frem;
kandidat^.frem^.tilbage := foran;
END
ELSE
BEGIN
foran^.frem := NIL;
sidste := foran;
END;
fundet := TRUE;
END
ELSE
BEGIN
foran := kandidat;
kandidat := kandidat^.frem;
END;
END;
IF fundet
THEN WRITE(glpost^.navn, ' er slettet fra kæden. ')
ELSE WRITE(glpost^.navn, ' findes ikke i kæden. ');
return;
END; (* fjern *)
PROCEDURE udskrivfrem(foerste : link);
VAR
pp : link;
BEGIN (* udskrivfrem *)
pp := foerste;
WRITELN;
WRITELN('Kæden indeholder følgende personer:');
WRITELN;
WHILE pp <> NIL DO
BEGIN
WRITELN(pp^.navn);
WRITELN(pp^.adresse);
WRITELN;
pp := pp^.frem;
END;
return;
END; (* udskrivfrem *)
PROCEDURE udskrivtilbage(sidste : link);
VAR
pp : link;
BEGIN (* udskrivtilbage *)
pp := sidste;
WRITELN;
WRITELN('Kæden indeholder følgende personer:');
WRITELN;
WHILE pp <> NIL DO
BEGIN
WRITELN(pp^.navn);
WRITELN(pp^.adresse);
WRITELN;
pp := pp^.tilbage;
END;
return;
END; (* udskrivtilbage *)
BEGIN (* dobbelt *)
top := NIL;
bund := NIL;
NEW(ud);
REPEAT
WRITE(CLRHOM);
GOTOXY(10,4); WRITE('SORTERET KÆDE');
GOTOXY(10,7); WRITE('I. Indsæt person i kæden.');
GOTOXY(10,9); WRITE('F. Fjerne person fra kæden.');
GOTOXY(10,11); WRITE('U. Udskrive kæden forfra.');
GOTOXY(10,13); WRITE('B. Udskrive kæden bagfra.');
GOTOXY(10,15); WRITE('A. Afslutte programmet.');
GOTOXY(10,17); WRITE('Tast kommando: ');
REPEAT
READ(KBD, ch);
UNTIL ch IN (.'I', 'i', 'F', 'f', 'U', 'u', 'B', 'b',
'A', 'a'.);
WRITELN(ch);
CASE ch OF
'I', 'i' : BEGIN
NEW(pp);
WRITELN;
WRITE('Navn: '); READLN(pp^.navn);
WRITE('Adresse: '); READLN(pp^.adresse);
pp^.frem := NIL;
pp^.tilbage := NIL;
indsaet(top, bund, pp);
END;
'F', 'f' : BEGIN
WRITELN;
WRITE('Hvem skal fjernes: ');
READLN(ud^.navn);
fjern(top, bund, ud);
END;
'U', 'u' : udskrivfrem(top);
'B', 'b' : udskrivtilbage(bund);
END;
UNTIL ch IN (.'A', 'a'.);
END. (* dobbelt *)
«eof»