DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦65c4d3749⟧ TextFile

    Length: 7808 (0x1e80)
    Types: TextFile
    Names: »DOBBELT.PAS«

Derivation

└─⟦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« 
└─⟦f983c2ef3⟧ Bits:30004681 Pascal opgaver (Butler)
    └─ ⟦this⟧ »DOBBELT.PAS« 

TextFile

        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»