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.