Sunteți pe pagina 1din 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 cnd 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.
Cnd eroarea provine din tastare, corec"ia este relativ simpl#, necesitnd doar reintroducerea
datei. Cnd 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 cmp (un cmp respect# propriile sale condi"ii), la nivel de
articol (respectarea unor rela"ii ntre cmpurile aceluia!i articol), la nivelul mai multor articole
(respectarea unor rela"ii ntre cmpurile 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
ct 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 cmp !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 cmpuri. 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 pn# cnd se ob"ine o dat# corect#, fie pn# cnd se
dep#!e!te un num#r prestabilit de reintroduceri.
Cnd un cmp este corect, se trece la introducerea !i validarea urm#torului cmp. Cnd
articolul este corect, se scrie n suportul extern !i se trece la urm#torul articol.
O secven"# de principiu pentru validarea unui cmp dup# mai multe condi"ii este prezentat# n
figura 3.$. Pentru a construi structura repetitiv#, necesar# relu#rii introducerii cmpului, 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 c
1
, c
2
, ... , c
n
), sau 0, n caz contrar.
3.1. Validarea naturii
Datele pot avea urm#toarele naturi: numeric#, alfanumeric#, alfabetic#. n cmpul extern al
datei numerice pot ap#rea semnul, cifrele 0..9, punctul zecimal !i caracterele cu rol de spa"iu. n
cmpul 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 utiliznd
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
camp
$
c
2
c
n
c
ER=0
ER=$
mesaj
eroare 1
ER=$
mesaj
eroare 2
ER=$
mesaj
eroare n
DA
DA
DA
DA NU
NU
NU
NU
Fig. 3.1. Secven"a de validare multicriterial# a unei date
introduse de la tastatur#
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 pn# la furnizarea unei valori corecte, respectiv pn# 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:=$;
END;
Inc(i);
UNTIL (er = 0) OR (i > n);
IF i > n THEN
BEGIN
Write('>> Depasire numar de reluari admis');
RunError($06);
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 $06: 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:=$ 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);
Algoritmi !i programe de prelucrare a fi!ierelor
UNTIL NOT er;
..........................................
Pentru date de tip caracter, valoarea STRING[$] citit# va fi atribuit# variabilei de tip CHAR.
Exemplul 6:
VAR
sex:CHAR;
sexs:STRING[$];
er:BOOLEAN;
BEGIN
REPEAT
er:=FALSE;
Write('Sex: ');
Readln(sexs);
IF sexs[0] <> #$ THEN
BEGIN
er:=TRUE;
Writeln('>> Lungime eronata!')
END
ELSE sex:=sexs[$];
UNTIL NOT er;
..........................................
Pentru date de tip !ir de caractere nu este necesar# alt# prelucrare.
Exemplul 7:
VAR
nume:STRING[30]; er:BOOLEAN;
CONST
l_corecta:$5;
BEGIN
REPEAT
er:=FALSE;
Write('Nume: ');
Readln(nume);
IF Length(nume) <> l_corecta then
BEGIN
er:=TRUE;
Writeln('>> Lungime eronata!')
END
UNTIL NOT er;
..........................................
Poate fi conceput# o solu"ie bazat# pe preluarea datelor prin ReadKey, caracter cu caracter,
astfel nct partea de introducere a valorii unei date s# se realizeze unitar, indiferent de natura acesteia.
Aceast# solu"ie poate fi astfel elaborat#, nct s# se evite situa"ia de !ir de lungime nul#, prin
neacceptarea folosirii tastei ENTER naintea introducerii a cel pu"in unui caracter cu alt# valoare.
Validarea de lungime se folose!te !i pentru verificarea existen"ei unei valori ntr-un cmp. O
dat# se consider# "existent#" dac# n cmpul corespunz#tor ei nu se introduce doar <ENTER>.
Verificarea existen"ei presupune raportarea lungimii datei fa"# de zero.
Algoritmi !i programe de prelucrare a fi!ierelor
Exemplul 8: Verificarea existen"ei !i lungimii unui cmp numeric, cu editare de mesaje de eroare
diferen"iate.
VAR
cod:WORD;
cods:STRING[5];
cod_er:INTEGER;
er:BOOLEAN;
CONST l_corecta=5;
BEGIN
REPEAT
er:=FALSE;
Write('Cod: ');
Readln(cods);
IF Length(cods) = 0 THEN
BEGIN
er:=TRUE;
Writeln('>> Nu ati introdus valoare!')
END
ELSE IF Ord(cods[0]) <> l_corecta THEN
BEGIN
er:=TRUE;
Writeln('>> Lungime eronata!')
END
ELSE Val(cods,cod,cod_er);
UNTIL NOT er;
..........................................
Dac# !irul extern dep#!e!te capacitatea zonei de memorie receptoare are loc trunchiere la
dreapta, cu rezultat imprevizibil, mai ales n cazul introducerii variabilelor numerice. Pentru controlul
acestei situa"ii, se poate folosi procedura SetTextBuf, care stabile!te lungimea maxim# (n caractere)
a !irului introdus de la tastatur#, inhibnd att ecoul pe ecran pentru caracterele n exces, ct !i trans-
ferul acestora n buffer. Procedura este definit# astfel:
SetTextBuf(Var f:TEXT; VAR buf; l:word)
F este un fi!ier text (n particular fi!ierul standard de intrare INPUT). Buf este o zon# tampon
declarat# ca variabil# de tip !ir, de lungime minim# l; l este lungimea datei de introdus, din care doi
octe"i sunt afecta"i secven"ei CR/LF. Pentru ca procedura SetTextBuf s# devin# efectiv# pentru
fi!ierul standard de intrare, terminalul trebuie declarat CRT.
Exemplul 9:
USES Crt;
VAR
an:WORD;
tampon:STRING;
nume:STRING[30];
CONST
l_an=4;
l_nume=30;
BEGIN
SetTextBuf(Input,tampon,l_an+2);
Write('Anul nasterii:'); Readln(an);
SetTextBuf(Input,tampon,l_nume+2);
Write('Nume si prenume:'); Readln(nume);
Algoritmi !i programe de prelucrare a fi!ierelor
.....................................
Exemplul 10:
USES Crt;
VAR
an:WORD;
tampon:STRING;
nume:STRING[30];
fis_crt:TEXT;
CONST
l_an=4;
l_nume=30;
BEGIN
AssignCrt(fis_crt); Reset(fis_crt);
SetTextBuf(fis_crt,tampon,l_an+2);
Write('Anul nasterii: '); Readln(fis_crt,an);
SetTextBuf(fis_crt,tampon,l_nume+2);
Write('Nume si prenume: '); Readln(fis_crt,nume);
.....................................
Close(fis_crt)
END.
3.3. Validarea apartenen#ei la o mul#ime
Verificarea apartenen"ei unei date numerice la o mul"ime prestabilit# de valori se realizeaz# fie
prin expresii cu mul"imi (utiliznd operatorul IN), dac# mul"imea este ordinal# !i se poate defini un
literal de tip SET, fie prin expresii rela"ionale, dac# mul"imea este real# sau nu se poate defini o
constant# SET.
Exemplul 11:
VAR
cod_grupa:WORD;
vb, er:BOOLEAN;
CONST catalog=[20$..250];
BEGIN
REPEAT
er:=FALSE;
Write('Cod grupa: ');
Readln(cod_grupa);
IF NOT(cod_grupa IN catalog) THEN
BEGIN
er:=TRUE;
Writeln('>> Cod grupa eronat !')
END
UNTIL NOT er;
...............................................
Pentru date de tip STRING, verificarea se poate realiza prin c#utarea ntr-o tabel# generat# prin
program (de exemplu, o constant# de tip vector de !iruri).
Exemplul 12:
VAR
Algoritmi !i programe de prelucrare a fi!ierelor
sectie:STRING[$5];
i:BYTE;
vb, er:BOOLEAN;
CONST
nomenclator:ARRAY[$..4] OF STRING[$5] =('INFORMATICA',
'STATISTICA','CIBERNETICA','MATEMATICA');
BEGIN
REPEAT
er:=FALSE;
vb:=FALSE;
Write('Sectia: '); Readln(sectie);
FOR i:=$ TO Length(sectie) DO sectie[i]:=UpCase(sectie[i]);
i:=$;
WHILE (i<=4) AND NOT vb DO
IF sectie = nomenclator[i] THEN vb:=TRUE ELSE i:=i+$;
IF NOT vb THEN
BEGIN
er:=TRUE;
Writeln('>> Sectie inexistenta !')
END
UNTIL NOT er;
................................................
Pentru datele de tip CHAR pot fi folosite expresii cu mul"imi (operatorul IN).
Exemplul 13:
VAR
tip_bursa:CHAR;
vb,er:BOOLEAN;
BEGIN
REPEAT
er:=FALSE;
Write('Tipul bursei ($/2/S/M): ');
Readln(tip_bursa);
IF NOT(tip_bursa IN ['$','2','S','M']) THEN
BEGIN
er:=TRUE;
Writeln('>> Tip bursa eronat !')
END
UNTIL NOT er;
...............................................
END.

S-ar putea să vă placă și