A. Considerații teoretice
B. Exemple
În permanență, lista de mașini se va păstra ordonată după denumire, capacitatea cilindrică, anul de fabricație și prețul de vânzare.
În prima fază se face definirea variabilelor globale și o descriere schematică a programului.
program Consignatie; const ContInitial = 100000.00 nMax = 100; {numarul maxim de masini din depozit} type masina = record Denumire: string[30]; CapCil: integer; AnFabr: integer; PretAch, PretVz: real end; var Optiune: char; Depozit: array [1..nMax] of masina; Cont: real; Beneficiu: real; procedure Initializare; begin NrMasiniInDepozit := 0; Beneficiu := 0; Cont := ContInitial end; {Initializare} procedure AfisareMeniu; begin writeln; writeln('Tastati:'); writeln('A - Achizitionare'); writeln('V - Vanzare'); writeln('I - Inventar'); writeln('T - Inchidere') end; {Afisarea meniului} procedure Achizitie; begin writeln('Inventar...') end; {Achizitie} procedure Vanzare; begin writeln('Vanzare...') end; {Vanzare} procedure Inventar; begin writeln('Inventar...') end; {Inventar} begin {Programul Principal} Initializare; repeat AfiseazaMeniu; write('Optiunea: '); readln(Optiune); case Optiune of 'a', 'A': Achizitie; 'v', 'V': Vanzare; 'i', 'I': Inventar end until Optiune in ['T', 't']; writeln; end.
Următorul pas constă în detalierea fiecărei proceduri, folosind aceeași tehnică. Se șterg instrucțiunile care afișează numele procedurii și se detaliază fiecare procedură în parte. De exemplu:
procedure CitesteDatele(var oMasina: masina); begin writeln('Citire date') end; {CitesteDatele} procedure IntroduInDdepozit(var oMasina: masina); begin writeln('Introducere in depozit') end; {IntroducereInDepozit} procedure Achizitie; var oMasina: masina; begin if NrMasini = 100 then writeln('Nu mai avem spatiu de depozitare...') else begin write('Pretul: '); readln(oMasina.PretAch); if oMasina.PretAch > Cont then writeln('Nu avem suficienti bani...') else begin CitesteDatele(oMasina); IntroduInDepozit(oMasina) end end end; {Achizitie}
procedure ListeazaMasini; begin writeln('Lista masini') end; {ListeazaMasini} procedure VindeMasina(var pozitie: integer); begin writeln('Vinde Masina') end; {VindeMasina} procedure Vanzare; var pozitia: integer; begin ListeazaMasini; write('Doriti masina nr.: '); readln(pozitia); if (pozitia < 1) or (pozitia > NrMasiniInDepozit) then writeln('Nu avem...') else VindeMasina(pozitia) end; {Vanzare}
C. Teme
I m
inserția unui text după linia m
D m n
ștergerea liniilor de la m la n
R m n
înlocuirea liniilor de la m la n
E
terminarea procesului de editare
m și n sunt numere zecimale, iar textele care trebuiesc inserate urmează imediat comenzilor I sau R. Ele se termină printr-o linie goală.
program editor; {fisierele se vor deschide si inchide o singura data} var fin, fout: text; fname, line: string; pos: longint; {pozitia in fisierul de intrare - numarul ultimei linii prelucrate de ultima comanda executata} m, n: longint; {parametrii comenzii} c: char; {comanda} procedure ins(m: longint); var i: longint; begin {copiaza, nemodificate, liniile ramase dupa ultima comanda, pana la pozitia de inserare} for i := pos+1 to m do if not eof(fin) then begin readln(fin, line); writeln(fout, line) end; {inserarea propriuzisa} readln(line); while line <> '' do begin writeln(fout, line); readln(line) end; pos := m {ultima linie prelucrata} end; procedure del(m, n: longint); var i: longint; begin {copiaza, nemodificate, liniile ramase dupa ultima comanda, pana la pozitia de stergere} ............... for i := m to n do if not eof(fin) then readln(fin, line); {stergere prin necopiere} pos := n {ultima linie prelucrata} end; ............... begin {programul principal} ............... case c of ............... 'R' : begin {inlocuire} readln(m, n); {inlocuire = stergere + inserare} del(m, n); ins(n) end; 'E' : begin {terminare} readln; {citeste CR+LF din buffer} {copiaza, nemodificate, liniile ramase dupa ultima comanda, pana la sfarsitul fisierului} copy_to_end end; ............... end ............... end.