A. Consideratii teoretice

Orice program trebuie realizat in asa fel incat el sa poata fi utilizat nu numai de catre proiectant(i), ci si de catre orice alta persoana, nu neaparat cu cunostinte de informatica, dupa un instructaj sumar.

De asemenea, dialogul cu utilizatorul trebuie proiectat de asa maniera incat sa sugereze cat mai bine operatiile care trebuie executate de catre operator. De aceea, o prima cerinta este ca la citirea datelor de intrare sa se afiseze in clar numele lor, astfel incat utilizatorului sa-i fie foarte limpede ce are de tastat. De exemplu, instructiunea:

readln(epsilon);

va fi in mod obligatoriu precedata de:

write('epsilon = ');

Secventa de citire a elementelor unei matrici poate arata in felul urmator:

for i:=1 to nrLinii do
  for j:=1 to nrColoane do
  begin
    write('A[', i:1, ',', j:1, ']');
    readln(A[i,j])
  end;

sau, daca spatiul ocupat pe ecran este considerat prea mare, se pot citi elementele matricei pe linii:

writeln('Dati elementele matricei A pe linii,');
writeln('separate prin spatii:');
for i:=1 to nrLinii do
begin
  for j:=1 to nrColoane do
    read(A[i,j]);
  readln          {citeste sfarsitul de linie}
end;

Acest mod este mai apropiat de modul "natural" e scriere a unei matrici.

De asemenea, revenind la problema consignatiei, de la lucrarea 1, este evident ca selectarea uneia dintre optiunile Achizitionare, Vanzare, Inventar, sau Inchidere, ar fi fost mult mai comoda daca s-ar fi pus la dispozitia utilizatorului un meniu, in genul celor oferite de mediul TurboPASCAL, sarcina utilizatorului fiind sa tasteze prima litera din denumirea optiunii, fie sa deplaseze banda alba de selectie pe optiunea dorita, cu ajutorul tastelor "sageti", dupa care apasa tasta .

Scopul acestei lucrari este scrierea de programe care folosesc facilitatile oferite de tastatura si de lucrul in mod ecran prin unit-ul Crt.


B. Exemple

Pentru a intelege cum se pot utiliza toate tastele existente, inclusiv cele netiparibile, se recomanda rularea urmatorului program:

uses Crt;
var ch: char
begin
  repeat 
    writeln('Apasati o tasta:');
    ch:=ReadKey;
    write('-ati apasat tasta');
    if ord(ch)=0 then
    begin
      ch:=ReadKey;
      write('speciala ')
    end;
    writeln('cu codul ',ord(ch):3)
  until ord(ch)=27
end.

Programul exploateaza modul de lucru cu tastatura al sistemului de operare: la apasarea unei taste alfanumerice se transmite programului apelant codul ASCII tastei respective. Daca se apasa una din tastele speciale (netiparibile), se transmit doua caractere, primul continand caracterul 0 ("Nul"), urmat de "codul de scanare" al tastei respective.

Se recomanda sa se noteze codurile tastelor "sageti", F1..F10, apasate singure sau in combinatie cu <Shift>, <Ctrl> sau <Alt>.


C. Teme

  1. Pe baza datelor culese cu programul de mai sus, sa se rescrie interfata pentru programul de consignatie. Se va construi un meniu orizontal continand cele patru optiuni, care se va afisa pe ecran in prima linie (dupa ce s-a sters ecranul cu ClrScr). Initial, banda de selectie se va muta pe optiunea vecina, daca aceasta exista, restectiv pe cea din capatul opus, daca de exemplu fiind pe prima optiune, se apasa sageata-stanga. Pentru "acivare" se apasa tasta <ENTER> (banda de selectie fiind pe optiunea dorita) sau se apasa prima litera oricarei optiuni.
    Se recomanda ca in structura de meniu, pentru fiecare optiune sa se memoreza pozitia de afisare, textul de afisat si, intr-un camp de tip procedural, rutina care efectueaza actiunea corespunzatoare.

  2. Sa se realizeze o unitate care exporta rutine de lucru cu meniuri orizontale:

    • definire meniu - creeaza o noua variabila de tip "meniu", careia i se precizeaza linia in care va fi afisat;

    • definire optiune - pentru precizarea datelor referitoare la o optiune: numarul de ordine, coloana in care se afiseaza, procedura de apelat in az de selectare;

    • activare meniu - o bucla de repartitie care afiseaza meniul si permite selectarea uneia din optiuni. Din bucla se iese fie la apasarea taastei , fie datorita unei optiuni care dezactiveaza meniul respectiv;

    • dezactivare meniu.

  3. Similar cu problema 2, dar se vor realiza meniuri verticale. Acestea vor fi incadrate intr-un chenar, construit din caracterele:

    chr(179)

    linie verticala

    chr(196)

    linie orizontala

    chr(218)

    colt stanga-sus

    chr(191)

    colt dreapta-sus

    chr(217)

    colt dreapta-jos

    chr(192)

    colt stanga-jos


    In plus, sa se stabileasca o conventie prin care poate fi folosit pentru selectie oricare caracter din string-ul Oprtiune, nu neaparat primul. Acest caracter va fi afisat cu alta culoare, pentru a-l scoate in evidenta.

  4. * Sa se studieze rutinele puse la dispozitie de unit-ul Graph si sa se realizeze un program simplu de desenare. Se traseaza pe ecran un indicator in forma de cruce, care poate fi deplasat cu tastele sageti. Apasarea tastei "J" simuleaza coborarea penitei, si din acel moment deplasarea indicatorului va lasa o "urma" pe ecran. Pentru a ridica "penita" se apasa tasta "S", iar indicatorul poate fi deplasat in ecran fara a trasa vreo linie. Sa se gaseasca o posibilitate ca indicatorul sa poata fi deplasat pe ecran si cu un numar mai mare de pixeli.