You are on page 1of 8

Algoritmi şi programe de prelucrare a fişierelor

3. VALIDAREA DATELOR

Prin validare se înţelege operaţia de verificare a corectitudinii datelor. O dată se consideră


corectă dacă respectă o serie de condiţii aritmetice sau logice prestabilite. Validarea datelor presupune
precizarea următoarelor elemente: condiţiile de verificare; acţiunile care trebuie executate când data
este corectă sau incorectă; modul de semnalare a erorilor şi structura mesajelor; modul de corecţie a
erorilor; modul de reintroducere a articolelor după corecţia acestora etc.
Când eroarea provine din tastare, corecţia este relativ simplă, necesitând doar reintroducerea
datei. Când eroarea provine din transpunerea greşită în documente sau, mai grav, din neglijenţe de
gestiune şi evidenţă, corecţia este mai dificilă şi necesită abandonarea introducerii unor înregistrări şi
revenirea, după o analiză în sistemul real, pentru adăugarea în fişiere deja create, a articolelor corec-
tate.
Validarea se poate face la nivel de câmp (un câmp respectă propriile sale condiţii), la nivel de
articol (respectarea unor relaţii între câmpurile aceluiaşi articol), la nivelul mai multor articole
(respectarea unor relaţii între câmpurile unor articole diferite, completitudinea pe pachete de
documente, corectitudinea unor totaluri pe pachete etc.), la nivel de fişier (completitudine,
corectitudinea unor totaluri pe fişier etc.). De multe ori, validarea necesită introducerea unor date
redundante, cum ar fi cifrele de control, totalurile de control etc. Mesajele de eroare trebuie proiectate
cât mai clar şi concis. Dacă introducerea se face cu formatare, trebuie rezervată o zonă specială pe
ecran pentru afişarea mesajelor.
În cele ce urmează se va aborda validarea la nivel de câmp şi la nivel de articol. Cele mai
importante validări din aceste categorii se referă la: existenţă, natură, lungime, semn, apartenenţă la o
mulţime sau listă de valori, respectarea unor corelaţii aritmetice sau logice între câmpuri. Dacă o dată
nu îndeplineşte toate condiţiile stabilite, se consideră eronată, se afişează eroare şi se solicită
reintroducerea ei. Introducerea se poate repeta, fie până când se obţine o dată corectă, fie până când se
depăşeşte un număr prestabilit de reintroduceri.
Când un câmp este corect, se trece la introducerea şi validarea următorului câmp. Când
articolul este corect, se scrie în suportul extern şi se trece la următorul articol.
O secvenţă de principiu pentru validarea unui câmp după mai multe condiţii este prezentată în
figura 3.1. Pentru a construi structura repetitivă, necesară reluării introducerii câmpului, se utilizează
o variabilă semafor (booleană) ER, care ia valoarea 1, dacă a fost eroare (nu s-a îndeplinit un criteriu
de validare din mulţimea c1, c2, ... , cn), sau 0, în caz contrar.

3.1. Validarea naturii

Datele pot avea următoarele naturi: numerică, alfanumerică, alfabetică. În câmpul extern al
datei numerice pot apărea semnul, cifrele 0..9, punctul zecimal şi caracterele cu rol de spaţiu. în
câmpul extern al datei alfabetice pot apărea caracterele A..Z, a..z, spaţiul şi, eventual, alte caractere
(de exemplu "-"). Pentru datele numerice şi alfabetice se pot construi proceduri de validare a naturii,
cu toate că limbajul Pascal nu posedă instrucţiuni dedicate unei astfel de operaţii.
♦ Validarea de numericitate se realizează fie direct, prin procedurile de citire, fie utilizând
procedura de conversie Val.
•• Validarea directă prin citire se bazează pe faptul că procedurile Read/Readln generează
eroare şi întrerup execuţia programului, dacă în timpul conversiei şirului introdus de la terminal se
depistează un caracter care nu face parte din mulţimea admisă pentru tipurile numerice.
Întreruperea execuţiei programului este inhibată/activată de directiva de compilare {$I}, iar
apariţia erorii de conversie se depistează cu funcţia IOResult, care returnează valoarea zero, dacă
transferul s-a realizat fără eroare, sau codul de eroare al operaţiei de intrare/ieşire, în caz contrar.
Algoritmi şi programe de prelucrare a fişierelor

ER=0

cam p

NU DA
c1

ER=1
NU DA
c2
m e saj
ER=1 e ro a re 1

NU cn DA m e sa j
e ro are 2

ER=1

m e sa j
e ro are n

NU
ER=0

DA

F ig . 3 .1 . S ec v en ţa d e v alid a re m u lticrite ria lă a u ne i d ate


in tro d u se d e la tastatu ră

Exemplul 1:
VAR
cod:WORD;
er:BOOLEAN;
BEGIN
REPEAT
er:=FALSE;
Write('Cod: ');
{$I-} Readln(cod); {$I+}
IF IOResult <> 0 THEN
BEGIN
er:=TRUE;
Writeln('>> Cod nenumeric !')
END
UNTIL NOT er;
…………………………………….

Exemplul 2: Să se realizeze un program pentru introducerea cu validare a unei valori numerice, cu


reluarea până la furnizarea unei valori corecte, respectiv până la depăşirea unui număr limită de
reluări.

PROGRAM Valid;
Algoritmi şi programe de prelucrare a fişierelor
VAR
n,i,er: BYTE;
x: REAL;
BEGIN
Write('Numar maxim admis de reluari:');
ReadLn(n);
i:=0;
REPEAT
er:=0;
Write('x:');
{$I-} ReadLn(x); {$I+}
IF IOResult <> 0 THEN
BEGIN
Write('Valoare nenumerica');
er:=1;
END;
Inc(i);
UNTIL (er = 0) OR (i > n);
IF i > n THEN
BEGIN
Write('>> Depasire numar de reluari admis');
RunError(106);
END;
END.

Soluţia propusă (care încalcă, totuşi, principiile programării structurate, mai ales pentru
programe complexe) conduce la întreruperea forţată prin apelul RunError, la depăşirea numărului
admis de repetări, cu mesajul de eroare corespunzător codului dat ca parametru:
Runtime error 106: Invalid numeric format

•• Validarea prin conversii proprii presupune introducerea datei numerice într-o variabilă de
tip STRING, urmată de conversia cu procedura Val definită în unit-ul System şi care se apelează
astfel:
VAL(s,n,cod_er);
S este variabila de tip STRING care va fi convertită, n este variabila numerică în care se va
depune rezultatul conversiei, iar cod_er este o variabilă de tip INTEGER care va conţine valoarea 0,
dacă conversia din ASCII în binar s-a realizat fără eroare, sau poziţia în cadrul şirului a caracterului
care nu a putut fi convertit (caz în care valoarea lui n nu se modifică).. După execuţie se testează
parametrul cod_er al acesteia.

Exemplul 3:
VAR
cod:WORD;
cods:STRING[5];
cod_er:INTEGER;
er:BOOLEAN;
BEGIN
REPEAT
er:=FALSE;
Write('Cod: '); Readln(cods);
Val(cods,cod,cod_er);
IF cod_er <> 0 THEN
Algoritmi şi programe de prelucrare a fişierelor
BEGIN
er:=TRUE;
Writeln('>> Cod nenumeric !')
END
UNTIL NOT er;
………………………………………….
♦ Validarea naturii alfabetice se realizează prin verificarea naturii fiecărui caracter din şirul
citit (prin expresii relaţionale sau prin expresii cu mulţimi).

Exemplul 4:
VAR
nume:STRING[30];
er:Boolean;
CONST alfabet=['A'..'Z','a'..'z',' ','-'];
BEGIN
REPEAT
er:=FALSE;
Write('Nume: ');
Readln(nume);
FOR i:=1 TO Length(nume) DO
IF NOT(nume[i] IN alfabet) THEN er:=TRUE;
IF er THEN Writeln('>> Data nealfabetica !')
UNTIL NOT er;
...............................................

3.2. Validarea lungimii

Lungimea şirului extern introdus de la tastatură se poate determina numai dacă citirea se face
în variabile STRING. După introducere, se testează lungimea şirului efectiv, determinată prin funcţia
Length sau preluată din octetul zero. Dacă lungimea nu îndeplineşte condiţia impusă (de regulă, să fie
egală cu o valoare prestabilită) data se consideră eronată. Dacă data este corectă, se va proceda astfel:
• Pentru date numerice, valoarea STRING va fi convertită cu procedura Val.

Exemplul 5:
VAR
cod:WORD;
cods:STRING[5];
cod_er:INTEGER;
er:BOOLEAN;
CONST
l_corecta=5;
BEGIN
REPEAT
er:=FALSE;
Write('Cod: ');
Readln(cods);
IF Ord(cods[0)] <> l_corecta THEN
BEGIN
er:=TRUE;
Writeln('>> Lungime eronata!')
END
ELSE Val(cods,cod,cod_er);

You might also like