Kirjautuminen

Haku

Tehtävät

Koodivinkit: PL/I: Datasettien käsittely

Kirjoittaja: jalski; viimeksi muokattu 01.10.2017.

Tagit: kielen perusteet

Monesti oppilaitosten ohjelmoinnin alkeiskursseilla yhtenä tehtävänä on kirjoittaa ohjelma, mikä toteuttaa yksinkertaisen puhelinluettelon.

PL/I tukee datasettejä suoraan ja yksinkertaisen puhelinluettelon toteuttaminen onkin triviaali tehtävä.

Alla olevassa esimerkkiohjelmassa toteutettuna on tietueiden lisääminen, poistaminen, listaaminen aakkosjärjestyksessä ja hakeminen nimellä. Kaikki muutokset tallentuvat tiedostoon.

*PROCESS MARGINS(1,160) pp(macro) LIBS(SINGLE STATIC);

 puhdb: package;

   dcl ds file record keyed
       env(organization(indexed)
           recsize(36)
           keyloc(1)
          );

   dcl 1 tietue,
         2 nimi char (24),
         2 puh char (12);

   dcl buffer char (30) var;
   dcl quit bit (1) init('0'b);

   dcl (oncode, verify, uppercase) builtin;


   menu: proc options(main);
     /* Jos data-tiedostoa ei ole, niin tehdään se */
     open file(ds) title('/db.dat') direct output;
     close file(ds);

     /* Valikko looppi */
     do while(^quit);
       put file(sysprint) skip edit('< (U)usi, (E)tsi, (L)istaa, (P)oista, (H)eippa >')(A);
       get file(sysin) edit(buffer)(L);

       select(buffer);
         when('u', 'U')
           call add_rec;
         when('e', 'E')
           call find_rec;
         when('l', 'L')
           call list;
         when('p', 'P')
           call del_rec;
         when('h', 'H')
           quit = '1'b;
         otherwise
           iterate;
       end;
     end;
   end menu;


   /* Lisää tietue aliohjelma*/
   add_rec: proc;
     on key(ds)
       begin;
         if oncode=52 then
           do;
             put file(sysprint) skip edit('Tuplana: ', nimi)(A(12),A(24));
             get_action:
               put file(sysprint) skip edit('Korvaa (K/E)?')(A);
               get file(sysin) edit(buffer)(L);
               if verify(buffer,'kKeE') ^= 0 then
                 goto get_action;

               select(buffer);
                 when('k', 'K')
                   rewrite file(ds) from(tietue) key(nimi);
                 otherwise
                   ;
               end;
           end;
       end;

     open file(ds) title('/db.dat') direct update;

     get_name:
       put file(sysprint) skip edit('Anna nimi?')(A);
       get file(sysin) edit(buffer)(L);
       if buffer = '' then goto get_name;
       nimi = uppercase(buffer);

     get_tel:
       put file(sysprint) skip edit('Anna puhelinnumero?')(A);
       get file(sysin) edit(buffer)(L);
       if verify(buffer,' -1234567890') ^= 0 then
         goto get_tel;
       puh = buffer;
       write file(ds) from(tietue) keyfrom(nimi);
       close file(ds);
   end add_rec;


   /* Poista tietue aliohjelma */
   del_rec: proc;
     on key(ds)
       begin;
         if oncode=51 then
           do;
             put file(sysprint) skip edit('Ei löydy: ', buffer)(A(12), A(24));
             put file(sysprint) skip;
           end;
         goto done;
       end;

     get_key:
       put file(sysprint) skip edit('Anna poistettava nimi?')(L);
       get file(sysin) edit(buffer)(L);
       buffer = uppercase(buffer);
       open file(ds) title('/db.dat') direct update;
       delete file(ds) key(buffer);
       put file(sysprint) skip edit('Poistettu: ', buffer)(A(12), A(24));
       put file(sysprint) skip;
     done:
       close file(ds);
   end del_rec;


   /* Etsi tietue aliohjelma */
   find_rec: proc;
     on key(ds)
       begin;
         if oncode=51 then
           do;
             put file(sysprint) skip edit('Ei löydy: ', buffer)(A(12), A(24));
             put file(sysprint) skip;
           end;
         goto done;
       end;

     get_key:
       put file(sysprint) skip edit('Anna etsittävä nimi?')(L);
       get file(sysin) edit(buffer)(L);
       buffer = uppercase(buffer);

       open file(ds) title ('/db.dat') direct update;
       read file(ds) into(tietue) key(buffer);
       put file(sysprint) skip edit(nimi, puh)(A(24), A(12));
       put file(sysprint) skip;
     done:
       close file(ds);
   end find_rec;


   /* Listaa tietueet aliohjelma */
   list: proc;
     dcl eof bit (1) init('0'b);

     on endfile(ds) eof = '1'b;

     open file(ds) title ('/db.dat') sequential input;
     read file(ds) into(tietue);
     do while(^eof);
       put file(sysprint) skip edit(nimi, puh)(A(24), A(12));
       read file(ds) into(tietue);
     end;
     close file(ds);
     put file(sysprint) skip;
   end list;

 end puhdb;

Kommentit

Metabolix [01.10.2017 12:26:44]

Lainaa #

Mielestäni kommentteja saisi olla enemmän, jotta koodia ymmärtäisi myös tuntematta PL/I:tä etukäteen kovin hyvin.

Kirjoita kommentti

Muista lukea keskustelun ohjeet.
Tietoa sivustosta