Kirjoittaja: jalski
Kirjoitettu: 01.10.2017 – 01.10.2017
Tagit: ohjelmointitavat, koodi näytille, vinkki
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;
Mielestäni kommentteja saisi olla enemmän, jotta koodia ymmärtäisi myös tuntematta PL/I:tä etukäteen kovin hyvin.