OBSERVATIE:Daca o structura se poate descompune în structuri de acelasi tip, atunci structura respectiva este recursiva.
În mod corespunzator, structurile de date vor putea fi:
-
structuri de date interne , având caracter temporar, deoarece sunt realizate în memoria interna de tip RAM ( volatila );
-
structuri de date externe, care au un caracter relativ permanent, deoarece sunt memorate pe suport extern. Aceste structuri pot curpinde:
-
fisiere de date
-
baze de date
-
banci de date
Din punct de vedere al modului de alocare a zonelor de memorie, structurile de date pot fi grupate astfel:
-
structuri de date statice, la care alocarea zonelor de memorie necesare pastrarii temporare a datelor este facuta în momentul compilarii programului şi ramane aceasi pe toata durata de executie a programului respectiv;
-
structuri de date dinamice, la care alocarea zonelor de memorie se face numai în momenutl executiei programului, la momentul necesar, ele putand fi modificate, eliberate, sau realocate pe toata durata de executie a programului respectiv.
Dupa nivelul de structurare a datelor se poate face gruparea:
-
structura logica, care se referã la modul de ordonare a datelor, la operatorii de prelucrare a datelor;
-
structura fizica, reprezentand modul de implementare, de reprezentare a datelor, pe suport magnetic de date.
Tipuri de structuri de date
Am vazut ca o structura de date reprezintã practic o colectie de date intre care s-au definit o serie de relaţii care duc la un anumit mecanism de selectie şi identificare a datelor.
Aceste relaţii pot fi de tipul:
-
de echivalenta
-
de ordine
-
de ordine totala
-
de preordine
Se numeste tip de structura de date o multime ordonata de date, intre care s-au stabilit anumite relaţii şi care folosesc, pentru realizarea operatiilor un grup de operatori de bazã cu o anumita semantica.
Principalele tipuri de structuri de date ( logice ) sunt:
-
structura punctuala
-
structura liniara
a1 a2 a3 a4
Structurã liniarã simplã
Principalele caracteristici ale acestui tip de structura sunt:
-
cardinalul multimii elementelor initiale este egal cu 1
-
cardinalul multimii elementelor terminale este egal cu maxim 1
-
orice element neterminal are un succesor imediat unic
-
primul element nu are predecesori
-
ultimul element nu are succesori
-
relatiile stabilite intre date sunt de tip 1 la 1
-
daca exista un cuplu în relatie de forma ( u, v ), unde v este ultimul element al structurii, iar u este primul element, atunci structura se numeste structura liniara inelara sau circulara.
-
intre date se stabilesc relaţii de tipul 1 la 1
-
structura liniara se numeste structura liniara cu elemente structurate arborescent, daca componentele ei sunt structuri arborescente
-
structura liniara se numeste structura liniara cu elemente structurate retea, daca componentele ei sunt structuri de tip retea
-
structura arborescenta, sau descendenta, sau ierarhica este definita atunci cand intre elementele colectiei de date exista o relatie de ordine.
Arbori binari
Datorita specificului lor, arborii binari admit o reprezentare grafica simetrica, axa de simetrie trecand prin radacina arborelui. De aceea, subarborii unui element oarecare sunt denumiti subarbore stang, şi respectiv subarbore drept, functie de pozitia relativa a acestora fata de elementul respectiv.
Astfel pentru arborii binari s-au identificat şi s-au descris 3 modalitati de parcurgere a elementelor arborelui denumite:
-
parcurgere în preordine
-
parcurgere în inordine
-
parcurgere în finordine ( postordine )
-
structura retea, definita atunci cand intre elementele colectiei de date exista o relatie de preordine. Ea are urmatoarele caracteristici:
-
este practic un graf care are, intre doua noduri, legaturi budirectionale;
-
exista unul sau mai multe noduri initiale (cardinalul miltimii este egal sau mai mare cu 1);
-
exista unul sau mai multe noduri finale (cardinalul mltimii nodurilor finale este egal sau mai mare cu 1);
-
orice nod poate avea mai multi predecesori, el putand fi predecesorul propriului predecesor. Atunci apar în retea cicluri. Un ciclu se defineste atunci cand nodul initial este acelasi cu nodul final;
-
intre elementele structurii de tip retea se regasesc relaţii de tip m la n.
-
Structura relationara este formata din mai multe tabele de date elementare, numite tablori sau relaţii, obtinute prin metoda normalizarii, pentru a asigura conditiile de integritate şi unicitate a datelor şi a elimina astfel nomaliile la actualizari.
-
Despre acest tip de structura vom invata mai mult la S.G.B.D.-uri, adica la sisteme de gestiune a bazelor de date, special realizate pentru operatii cu colectii de date memorate pe suporti externi.
-
Informatii despre cantitatile de produse finite care trebuie realizate
-
Informatii despre structura produselor finite respective.
Fisierul se defineste ca o multime de date omogene din punct de vedere al semnificatiei lor şi al cerintelor de prelucrare. Aceasta multime este organizata ca o lista liniara, cu elemente structurale arborescente.
Bazã de date se defineste ca o colectie de date aflate în interdependenta, memorata pe suport impreuna cu descrierea datelor şi a relatiilor dintre ele.
Banca de date reprezintã un sistem de organizare şi prelucrare respectiv tele-prelucrare a datelor constituit din:
-
bazã de date
-
un sistem de programe pentru gestiunea datelor.
Structuri de date interne
Cele mai frecvent utilizate structuri statice de date sunt:
-
masive (tablouri )
-
articole ( inregistrari logice )
Limbajele de programare permit implementarea acestor structuri statice de date.
Masivul reprezintã o structura de date omogena cu una, doua sau n dimensiuni. Masivul cu o dimensiune se numeste în mod uzual vector, iar cu doua matrice.
Exemplu:
Fie vectorul X cu elementele x1, x2, x3, ... ,xn un tablou unidimensional cu n elemente componente de acelasi tip.
În memoria interna el va fi memorat astfel:
X
1 2 .... n
Adresa Adresa Adresa Adresa
de de de de
bazã bazã+1 bazã+2*1 bazã+(n-1)*1
Reprezentarea elementelor unui vector în memoria interna
Articole.Fisiere de date
Articolul sau inregistrarea logica reprezintã o structura de date interna, eterogena de tipul „ structura arborescenta „.
Un articol este format din campuri de date care se identifica în mod unic printr-un identificator sau nume asociat.
Fisierul de date este format din articole sau inregistrari logice care descriu aceleasi entitati şi formeaza o colectie de date omogene din punct de vedere al semnificatiei şi al cerintelor de prelucrare.
Metodele de organizare a fisierelor definesc regulile care stau la bazã constituirii articolelor în fisiere şi se stabilesc la operatia de creare a fisierelor. Astfel fisierele pot avea:
-
Organizare secventiala care memoreaza articolele de date secvential în ordinea introducerilor iar accesul la articole poate fi doar secvential.
-
Organizare secvential-indexata care presupune crearea fisierului de date cu articolele ordonate crescator dupa valoarea unui camp de date numit cheie de indexare.
-
Organizare directa care presupune memorarea şi apoi identificarea articolelor printr-o cheie care poate fi un camp de date, sau nu, dar a carei valoare se asociaza fiecarui articol în parte.
Metodele de acces la articolele unui fisier stabilesc modalitatile prin care se localizeaza un articol în fisierul de date.
Tipuri de acces:
-
Acces secvential
-
Acces direct
Programare orientata spre obiecte
Programare orientata spre obiecte reprezintã un stil de programare nou, care utilizeaza concepte şi constructii noi, modalitati noi de structurare a datelor, de tratare a colectiilor de date şi programare.
La programarea orientata spre obiecte procedurile de prelucrare şi datele sunt incapsulate în obiecte, asupra carora se aplica mesaje care modeleaza comportamentul sistemului.
Date şi expresii
Asupra datelor elementare sau memorate în structuri de date statice sau dinamice, interne sau externe, în cadrul prelucrarii atutomate, se pot aplica diferiti operatori, rezultand astfel constructii sintactice denumite expresii.
Expresiile sunt deci grupuri alcatuite din operanzi şi operatori. Din evaluarea unei expresii rezultã o valoare, care reprezintã rezultatul ei.
Operatorii pot fi grupati în:
-
operatori aritmetici
-
operatori logici
-
operatori de comparare
-
operatori pe siruri de caractere
Toate limbajele de programare permit implementarea acestor tipuri de operatori şi constructia unor tipuri de expresii corespunzatoare.
În toate limbajele de programare, operatorii aritmetici au reprezentarea:
+ pentru adunare
- pentru scadere
* pentru inmultire
/ pentru impartire
^n pentru ridicarea la putere n
( ) pentru gruparea operatiilor şi schimbarea ordinii normale de executie a acestora.
Este permisa includerea unor paranteze în altele, ordinea de desfacere a acestora fiind dinspre interior spre exterior.
CAPITOLUL 3
Grafuri
Definitii, tipuri
Notiunile de algoritm şi schema logica pot fi definite, explicate şi mai ales foarte des utilizate în legatura cu elemente de teoria grafurilor.
Se umeste graf neorientat o pereche ordonata G = ( X, U ), unde X este o multime finita şi nevida de elemente numite noduri ( varfuri ), iar U este o multime de perechi neordonate de elemente distincte ale lui X, numite muchii.
Se numeste lant intr-un graf G = ( X, U ) o succesiune de muchii de forma [i1,i2], [i2,i3],...,[în-1,în], notata prescurtat prin [i1,i2,...în]
Un lant în care muchiile sunt diferite doua cate doua se numeste ciclu.
Un varf care este extre,otatea imeo somgire ,icjoo se mi,este varf terminal.
Doua varfuri unite printr-o muchie se numesc varfuri adiacente.
Un graf orientat este o pereche ordonata G = ( X, U ), deosebirea fata de graful neorientat constand în faptul ca elementele lui U sunt perechi ordonate de varfuri numite arce. În cazul grafurilor orientate, notiunile de lant şi ciclu isi au corespondent în notiunile de drum şi circuit.
Arbori
Se numeste arbore un graf neorientat, conex,
OBSERVATIE: Intr-un arbore cu nvarfuri, exista cel putin doua varfuri terminale.
Se poate demonstra, cu privire la grafuri, teorema:
Fie G un graf neorientat, cu n1 varfuri. Urmatoarele afirmatii sunt echivalente:
1. G este un arbore;
2. G are n-1 muchii şi nu contine cicluri;
3. G are n-1 muchii şi este conex;
4. Orice doua varfuri din G sunt unite printr-un unic lant.
Se numeste arbore binar un arbore orientat, în care fiecare varf are cel mult doi descendenti, facandu-se insa distinctia intre descendetul stang şi cel drept al fiecarui varf.
Se numeste arbore de sortare un arbore binar cu proprietatile:
-
INF(i) INF(j) pentru orice varf j din subarborele stang al lui i;
-
INF(i) INF(j) pentru orice varf j din subarborele drept al lui i.
CAPITOLUL 4
Algoritmi definire
Notiunea de algoritm, preluata din matematica, este fundamentala în activitatea de programare a calculatoarelor electronice.
Programarea este practic activitatea prin care se concepe şi se realizeaza programul pentru rezolvarea unei probleme, cu ajutorul calculatorului electronic.
Un program reprezintã o succesiune de instructiuni şi comenzi apartinand unui/unor limbaje de programare ( Pascal, Basic, C, Java ) care conduc la solutionarea problemei formulate.
Daca ne referim la activitatea de programare, vom identifica în cadrul acestea etapele:
-
formularea problemei
-
elaborarea, identificarea şi descrierea algoritmului de rezolvare
-
scrierea programului
-
programul trebuie sa fie bun, simplu şi eficient.
-
testarea programului
-
realizarea, completarea şi definitivarea documentatiei programului
-
exploatarea curenta
Notiunea de algoritmi
Cuvantul algoritm este de origine araba, derivand din numele matematicianului Abu Ja`far Mohammed ibn Musa al-Kahowarizmi.
Cunoscuta cu aproape 2000 ani I.H., notiunea de algoritm a devenit una din notiunile centrale ale matematicii actuale.
Sunt mai multe tipuri de algoritmi, cum ar fi:
-
algoritmul impartirii a doua numere
-
algoritmul extragerii radacinii patrate a unui numar
-
algoritmul rezolvarii ecuatiei de gradul II
S-a demonstrat apoi ca nu orice problema poate fi rezolvata alcatuind un algoritm de rezolvare a acesteia.
Se spune ca o problema este decidabila daca exista un algoritm pentru rezolvarea ei.
De exemplu, problema gasirii solutiilor unei ecuatii diofantice de gradul I de forma:
ax+by=c a,b,c sunt numere intregi, este decidabila.
CAPITOLUL 5
Limbaje de prezentare a algoritmilor ( pseudocod )
Descrierea in practica a algoritmilor in limbaj natural sau cu ajutorul schemelor logice prezinta unele dezavataje. Astfel, prima este prea detaliata pentru gustul programatorilor si de aceea nu este acceptata decat in cazuri speciale, in care trebuie sa sustina in fata unor nespecialisti in informatica, solutia adoptata.
Practica acceptata si alte metode de descriere, dintre care in ultima vreme s-au impus limbajele de prezentare a algoritmilor, numite si pseudocod.
Unele notatii folosite la descrierea algoritmilor
Formulele folosite in matematica si in tehnica sunt date pentru cazul general, aparand in ele atat numele unor cantitati variabile, cat si a unor constante.
In pseudocod subprogramele au urmatoarea forma generala:
ANTET
Secventa de instructiuni
END
ANTET poate fi de forma:
PROGRAM nume_program
PROCEDURE nume_procedura
FUNCTIE nume_functie
Apelul subprogramelor se face prin referirea de forma:
Nume ( lista_parametrii ) sau prin intermediul unui cuvant cheie cum ar fi cuvantul CALL:
CALL nume_procedura ( lista_parametrii )
Exista posibilitatea reluarii repetate a unui pas sau grup de mai multi pasi in interiorul unui aloritm; aceste procee repetitive pot fi definite ca iterative sau recursive.
Iterativitatea este procesul prin care rezultatul este obtinut prin executia repetata a uui set de operatii, de fiecare data cu alte valori de intrare.
Recursivitatea reprezinta un proces repetitiv prin care rezultatul de la un anumit pas se determina pe baza unuia sau mai multor rezultate obtinute in pasii anteriori.
Scheme logice
Schema logica este o forma de prezentare a algoritmului si a modului de lucru al acestuia sub forma grafica, folosind diferite simboluri grafice.
Se stie ca in practica programarii se acorda o importanta deosebita realizarii schemelor logice in perioada de debut, astfel ca dupa o anumita experienta in domeniu, se incearca tot mai des renuntarea la aceasta importanta etapa a proiectarii.
Figurile geometrice folosite la realizarea schemelor logice se numesc simboluri sau blocuri.
Principiile ralizarii schemelor logice:
-
orice schema logica incepe cu blocul START
-
dupa START, daca e necesar si daca sunt date de intrare, se citesc datele de intrare.
-
Dupa terminarea activitatii unui bloc de prelucrare, incepe activitatea blocului imediat urmator.
-
Dupa terminarea activitatii unui bloc de decizie isi incepe activitatea blocul conectat la iesirea corespunzatoare conditiei adevarate, in cazul unui bloc simplu, cu doua iesiri, se executa blocul conectat la DA daca este adevarata conditia specificata si blocul conectat la NU in caz contrar.
-
Schema logica isi inceteaza activitatea la blocul STOP.
Schemele logice pot aparea, functie de gradul lor de dificultate, fiind:
-
scheme logice simple
-
scheme logice ramificate
-
scheme loice cu cicluri
-
scheme logice cu cicluri ierarhizate
CAPITOLUL 6
Structuri fundamentale ale algoritmilor
Structura secvenţialã sau liniarã desemneazã una sau mai multe operaţii ce se executã una dupã cealaltã, în mod liniar (secvenţial).
Structura alternativãdesemneazã execuţia unei secvenţe de operaţii S1 sau a alteia S2, în funcţie de îndeplinirea sau nu a unei condiţii.
Structurile alternative sunt de mai multe tipuri:
-
Structura IF – THEN – ELSE, selecteazã succesiunea operaţiilor ce urmeazã a fi executate, funcţie de valoarea logicã de ,,adevãr” sau ,,fals” pe care o are în momentul respectiv condiţia specificatã. Dacã este adevãratã condiţia se urmeazã calea specificatã de ramura DA, altfel se urmeazã calea NU.
-
Blocul are deci o intrare şi douã ieşiri, corespunzãtoare celor douã valori logice posibile pentru o expresie logicã (Adevarat şi fals, Da şi Nu)
-
S tructura IF – THEN numitã şi selecţia simplã, este practic o formã particularã a selecţiei IF – THEN – ELSE, în care blocul de pe ramura Nu este vid.
-
În mod asemãnãtor se poate construi şi selecţia IF – ELSE, cu precizarea cã în acest caz blocul vid va fi cel de pe ramura Da.
-
Practic, în ambele forme particulare, se testeazã condiţia logicã şi se specificã doar succesiunea de operaţii ce trebuie efectuate pe una dintre ramuri. Pe ramura cu bloc vid nu se executã nimic.
-
Structura CASE – OF selecteazãuna dintre mai multe ramuri, în funcţie de valoarea unui selector. De aceea structura de acest tip se mai numeşte selecţie multiplã.
Structura repetitivã sau iteraţia indicã repetarea unei operaţii sau secvenţe de operaţii S, atâta timp cât este îndeplinitã o anumitã conditie.
În funcţie de momentul în care se face testarea condiţiei specificate, structurile repetitive sunt de mai multe tipuri:
-
Condiţia poate fi testatã anterior execuţiei secvenţei de comenzi S şi atunci avem o structurã de tip WHILE – DO
-
C ondiţia se testeazã posterior execuţiei secvenţei de comenzi S şi atunci avem o structurã de tip DO – UNTIL
Structura repetitivã mai poate fi analizatã şi din punct de vedere al numãrului de reluãri. Din acest punct de vedere, o structurã poate fi:
-
fãrã numãrãtor, cãci nu se cunoaşte de la început numãrul de reluãri. Aşa este cazul structurii de tip WHILE, indiferent de tipul ei.
-
cu numãrãtor, atunci când se ştie sau se poate calcula automat numãrul de reluãri. Aşa e cazul structurii repetitive de tip DO – FOR
P entru a evita ciclarea la infinit a structurilor repetitive, programatorul trebuie sã aigure negarea condiţiei pentru a permite ieşirea din structurile WHILE – DO şi DO – UNTIL.
Se observã cã diferenţa esenţialã între cele douã structuri constã în faptul cã DO – UNTIL executã S cel puţin o datã, în timp ce WHILE – DO poate sã nu-l execute pe S deloc, dacã la intrarea în structurã condiţia este deja falsã.
Programarea structuratã beneficiazã şi de un puternic suport teoretic constând într-o construcşie de principii, termeni şi teoreme matematice specifice.
Teorema de structurã Bohm şi Jacopini spune:
-
Orice schemã logicã este echivalentã cu o schemã logicã structuratã
-
Dacã o organigramã cuprinde o mulţime F de acţiuni şi o mulţime P de predicate, astfel încât organigrama sã fie structuratã şi sã fie echivalentã cu cea iniţialã.
-
Corolarul ,,de sus în jos”: Un program structurat este echivalent cu un program scris sub una din urmãtoarele forme:
P=Secvenţial(f,g)
P=Alternativ(p,f,g)
P=Repetitiv(p,f)
Unde p este un predicat al lui P, iar f şi g sunt secvenţe structuratesau funcţii ale programului.
Teorema de corectitudine:
Corectitudinea unui program structurat poate fi verificatã prin examinarea fiecãrui nod din arborescenţa sa. Dacã fiecare nod se verificã local, se spune cã programul structurat este corect.
CAPITOLUL 7
Evaluarea corectitudinii algoritmilor
Un program realizat trebuie sã fie corect, clar, sigur în funcţionare, uşor de modificat, portabil, eficient, însoţit de o documentaţie corespunzãtoare. Existã numeroase tehnici de verificare şi validare a algoritmilor, adresate în general practicienilor, dar şi uşor accesibile unui începãtor în programare.
Dintre acestea amintim:
-
testarea programelor şi depanarea programelor
-
verificarea formalizatã a programelor
-
cea mai slabã precondiţie
-
cea mai tare postcondiţie
-
instrucţiuni generalizate
-
sintaxa expresiilor logice
Acţiunea de testare a programelor se deosebeşte de celelalte faze prin care trec acestea (proiectare, programare, documentaţie, etc.) prin caracterul ei în aparenţã “demolator”. Astfel, în timp ce alte faze au o esenţã constructivã, testarea are în aparenţã un caracter distructiv, deoarece scopul ei este de a pune în evidenţã proasta funcţionare a programului, de a gãsi hibele aeestuia şi nu pãrţile sale bune. Din punct de vedere psihologic, programatorul însuşi trebuie sã adopte în aceastã etapã 0 atitudine “duşmãnoasã” faţã de propriul program, pentru a putea gãsi defectele acestuia,
Analizând problema mai atent, realizãm de fapt cã scopul testãrii este în realitate tot constructiv, acela de a pune în funcţiune un program care sã funcţioneze la parametri prevãzuţi.
Se ştie cã, într-un algoritm de calcul şi deci, într-un program, este oricând posibilã prezenţa unei/unor erori, oricât de precisä şi laborioasã ar fi metodologia de elaborare. Proeesul de detectare şi apoi de eliminare a erorilor unui algoritm/program are douã componente, numite:
• verificare
• validare
Aceste douà aetivitãţi ar trebui sã earacterizeze practic toate etapele prin care trece un program, de la formularea cerinţei de rezolvare a unei probleme, la analiza acesteia, la identificarea şi apoi descrierea algoritmului de rezolvare a problemei, a codificãrii datelor şi validarea rezultatelor obţinute.
Aceasta deoarece tot mai mulţi specia1işti din diferite domenii aratã cã aceastã activitate de testare şi validare nu este specificã doar activitäţii de programare, ci se întâ1neşte pretutindeni, acolo unde se produce sau construieşte ceva; existã în acest sens controale efectuate la nivelul fiecärei operaţii sau grup de operaţii, dupã cum existã şi un control final, produsului finit, pentru realizarea recepţiei lui finale.
În acest sens, activitatea de verificare şi validare a unui produs program urmãreşte în principal, urmàtoarele:
• descoperirea defectelor programului
• certificarea faptului cã programul va funcţiona corect în condiţii de exploatare curentã.
Testarea programului rãmâne metoda de bazã pentru verificarea corectitudinii unui program, succesul ei fiind condiţionat în primul rând de experienţa programatorului, de complexitatea şi completitudinea setului de date folosite în procesul testãrii, de analiza riguroasã, atentã a rezultatelor obţinute în urma fiecãrui test.
Prin testarea programului se înţelege deci executarea programului respectiv cu scopul de a descoperi o anomalie sau eroare. Ea se bazeazã pe construirea unor eşantioane de date de intrare care sã conducã la depistarea unor erori în functionarea programului, într-un timp cât mai scurt şi cu efort cât mai mic.
Practic, pornind de la nişte date de test construite de el, programatorul aşteaptã sã obţinã la final sau pe parcurs, anumite rezultate. Dacä acestea sunt corecte, complete sau în formatul aşteptat avem cel putin o eroare în execuţia programuiui. Putem spune cã succesul testãrii depinde de “arta” programatorului de a-şi construi setul de date de test.
Trebuie sä precizãm insã faptul cã relevanţa testului depinde de numãrul eşantioane1or de date de test, dar mai ales de calitatea datelor alese. În acest sens, au apãrut, în ultimul timp, o serie de metode de elaborare a datelor de test, care ajutã programatorul, oferindu-i posibilitatea de a aborda sistematic activitatea de testare a programelor, cu o probabilitate crescutã de depistare a erorilor.
Aceste metode pot fi denumite:
• testarea funcţionalã sau metoda cutiei negre, care presupune construirea datelor de test astfel încât sã permita testarea fiecãrei funcţiuni a programului;
• testarea structuralã sau rnetoda cutiei transparente, care presupune construirea datelor de test astfel încât toate pãrţile programului sã poatã fi testate.
Succesul activitãţii de testare constã deci în conceperea unor date de intrare prin prelucrarea cãrora defectele algoritmului şi deci şi a programului sã fie puse în evidenţã prin observarea şi analiza rezultatelor obţinute.
De aceea el este în mare mãsura dependent de experienţa şi îndemânarea programatorului, de abilitatea lui de a-şi construi datele de test cât mai complete, complexe, cuprinzãtoare din punct de vedere al situaţiilor sau valorilor de excepţie ce pot apare în execuţia curectã a programului.
Testarea unui program trebuie sã se finalizeze, pentru a fi utilã, cu semnalarea erorii şi localizarea ei. De aceea, testarea programului este urmatã de depanarea lui.
Depanarea unui program constã în localizarea erorii, determinarea naturii sale şi corectitudinea ei. Ea se poate face în mod:
Depanarea simbolicã, o altã metodã de depanare, este mai uşor de utilizat, deoarece oferã posibilitatea de a urmãri executarea programului la nivel de limbaj sursã. Limbajele de programare oferã, în ultimile lor versiuni, un depanator simbolic integrat, care permite depanarea uşoarã, plãcutã şi eficientã a programelor prin urmãtoarele operaţii:
• executarea pas cu pas a programului (un pas inseamnã de fapt o instrucţiune executabilã);
• observarea, în timpul execuţiei, a valorilor unor variabile sau expresii specificate de programator (care apar într-o fereasträ specialã - Watch Window);
• specificarea unor puncte de suspendare a execuţiei programului;
• modificarea valorilor unor variabile.
În activitatea de testare şi depanare a programelor, erorile datorate variabilelor neinitializate sunt greu de semnalat şi de localizat, mai ales atunci când aparent totul funcţioneazã corect. În acest sens amintim variabila cu rol de indice (numãrãtor) care asigurã parcurgerea elementelor unui vector. Aceasta trebuie iniţializatã cu poziţia primului element din şir care trebuie prelucrat şi apoi testatä şi comparatã valoarea ei cu cea finalã. Deasemenea, expresia care stabileşte dacã un ciclu se executã sau nu trebuie astfel formulatã sau initializatã încât sã asigure sau nu prima execuţie, aşa cum necesitã algoritmul de prelucrare descris. În acest sens, trebuie sã facem precizarea cä adeseori, suntem nevoiţi sã facem noi, prin program, iniţializarea variabilei care controleazã execuţia ciclului, pentru a asigura execuţia lui pentru prima datã. Este vorba de ciclul cu testarea iniţialã a condiţiei, la care reluarea ulterioarã va fi hotãrâtã de valoarea pe care respectiva variabilã o primeşte, în timpul execuţiei programului, în cadrul ciclului. Deci, ciclul cu testarea iniţialã a condiţiei trebuie sã fie bine analizat, verificat şi testat din punctul de vedere al expresiei care-i controleazã reluarea.
Practica a dovedit, în timp, cã oricât de numeroase ar fi testele efectuate asupra unor programe foarte complexe, ele nu pot garanta funcţionarea corectã a acestora. Ele rãmân deosebit de utile pentru semnalarea multora dintre erori şi deasemenea pentru familiarizarea programatorului cu algoritmul, cu modul sãu de lucru.
Proprietatea P se numeşte precondiţie sau proprietate finalã, iar proprietatea Q postcondiţie san proprietate finalã.
Practica a dovedit cä existã situaţii când pentru un algoritm A şi o postcondiţie datã, nu intereseazã o precondiţie oarecare, ci se cautã “ cea mai bunã” precondiţie care rezolvã algoritmul dat.
Fie secvenţa de comenzi, care calculeazã factorialul unui numãr >=2:
(n>=2)
f:=1;
i:=1;
while i
begin
i:=i+1;
f:=f*i
end
(f=n!)
Se poate observa factorialul este calculat corect şi dacã n porneşte de la valoarea 1 (n>=1). Deci, precondiţia n>=2 poate fi inlocuitã cu n>=1 care se considerä o precondiţie mai bunã, care descrie o mulţime de date iniţiale mai cuprinzãtoare, obtinutã prin adãugarea valorii 1.
O analizã mai atentã a algoritmului aratã cã precondiţia n>=1 poate fi inlocuitã cu n>0 consideratä o precondiţie mai bunã, care atestã capacitatea algoritmului de a calcula factorialul oricãrui numãr natural, mulţimea datelor initiale fiind din nou mãritã prin adãugarea valorii 0 (0!=1).
Dostları ilə paylaş: |