|
Realizarea unei aplicatii folosind un sistem de calcul presupune parcurgerea, in principiu, a urmatoarelor etape:
Rol Elaborarea unui enunt complet si precis al problemei, tinand cont de conditiile concrete de realizare si executie a aplicatiei
Obiective
Referirea datelor se realizeaza cu ajutorul unor notatii simbolice, numite variabile.
Rezultatul etapei de analiza se numeste specificatia aplicatiei si ea trebuie sa contina:
Lista variabilelor de intrare
Modelul de prelucrare
Descrierea organizarii datelor pe suporturile externe de informatii
Rol Elaborarea algoritmului care realizeaza functia aplicatiei. Adica, conceperea unei liste de comenzi care descrie secventa de operatii pe care le va executa calculatorul pentru rezolvarea problemei.
In cazul problemelor complexe, proiectarea decurge in doua etape:
Descompunerea problemei date in subprobleme;
Construirea algoritmilor de rezolvare a subproblemelor.
In aceste cazuri logica aplicatiei este reprezentata printr-o colectie de algoritmi corelati intr-o structura ierarhica. Aplicatia obtinuta este un sistem de module, fiecare modul rezolvand una din subproblemele in care a fost divizata logica aplicatiei.
Avantajele modularizarii aplicatiilor sunt:
Obiectiv Realizarea algoritmului programului care sa rezolve problema propusa.
Rol Codificarea algoritmilor (programarea) si punerea la punct a aplicatiei.
Obiectiv Obtinerea algoritmilor necesari intocmirii programului care rezolva problema propusa, testarea rezultatelor obtinute si corectarea eventualelor erori de programare.
Rol Efectuarea modificarilor necesare in scopul corectarii unor erori identificate in cursul exploatarii ei sau pentru a o adapta la noile cerinte aparute.
Prelucrarea informatiilor intr-un sistem de calcul se realizeaza prin executia unor operatii simple. Operatiile se aplica asupra unor reprezentari ale informatiilor, numite date. Inlantuirea acestor operatii simple, respectand logica de rezolvare, va conduce la obtinerea rezultatelor dorite.
Algoritmul reprezinta ansamblul de reguli (de calcul) impreuna cu ordinea in care se succed, in vederea solutionarii unui tip de probleme.
Spre exemplu, notand cu N si M doua numere intregi pozitive si cu C cel mai mare divizor comun al lor, atunci algoritmul lui Euclid pentru aflarea celui mai mare divizor comun a doua numere intregi pozitive date poate fi descris astfel:
Modul in care este prezentat acest algoritm este "imperativ"; propozitiile fiind de fapt niste comenzi pe care trebuie sa le execute cineva (omul sau masina). Fiecare comanda a algoritmului specifica o operatie (actiune) ce se aplica datelor.
Parcurgand algoritmul, se poate constata ca pe parcursul executarii operatiilor valorile asociate lui M, N, R (restul impartirii) si C se modifica. Deci putem spune ca acestea sunt variabile, deoarece valoarea lor se modifica prin executia unei operatii.
In pasul 4, al acestui algoritm, valoarea lui R (restul impartirii) se compara cu 0. Aceasta valoare (0) nu se modifica pe parcursul executarii algoritmului; deci se poate spune ca 0 este o constanta.
Pentru a putea urmari mai usor executia acestui algoritm, se poate folosi un tabel in care se vor nota valorile identificatorilor inainte de executia comenzii si comanda ce se va executa:
Valorile asociate identificatorilor
Comanda executata
M
N
R
C
Principalele caracteristici ale unui algoritm sunt:
Descrierea algoritmilor pentru a fi executati folosind un sistem de calcul nu se poate realiza folosind un limbaj natural, datorita in primul rand al faptului ca limbajul natural nu este riguros - diversele formulari ale limbajului putand avea mai multe intelesuri.
Cele mai utilizate procedee de reprezentare a algoritmilor sunt schemele logice si limbajul pseudocod. Principala calitate a acestora este posibilitatea de a evidentia cu claritate succesiunea operatiilor:
Definitii:
Schema logica este un graf orientat in care nodurile sunt inlocuite cu simboluri de diverse forme geometrice, iar arcele sunt sageti care indica ordinea logica (succesiunea) a operatiilor reprezentate de simboluri.
Schema logica este reprezentarea grafica a operatiilor ce se efectueaza asupra datelor intr-un proces de prelucrare automata si a succesiunii acestora.
Avantajele utilizarii schemelor logice sunt:
Principalele simboluri ce se folosesc la intocmirea unor schemelor logice:
La intocmirea schemelor logice se folosesc urmatoarele tipuri de structuri:
Se reprezinta sub forma:
Exista doua tipuri de structuri alternative: de decizie si de selectie multipla.
Se reprezinta sub forma:
Nu Da
Se reprezinta sub forma:
1 2 . n
Se folosesc atunci cand pentru a obtine un rezultat, aceleasi operatii se executa de mai multe ori, deci se executa in mod repetat. Exista trei tipuri de structuri repetitive:
Primele doua tipuri de structuri se folosesc cand nu se cunoaste numarul de iteratii (repetari), dar exista o posibilitate de terminare a structurii. Cel de-al treilea tip de structura se foloseste cand se cunoaste de la inceput numarul de iteratii. Structurile repetitive se mai numesc si cicluri.
Structura se poate reprezenta sub forma:
Da
Nu
Se foloseste cand este posibil ca operatia sa nu se execute niciodata.
Forma grafica de reprezentare a structurii este:
Nu
Nu
Se foloseste ori de cate ori este necesar ca actiunea sa se execute cel putin o data.
Structura repetitiva cu contor, cunoscuta si sub numele de ciclu cu numar cunoscut de pasi, se reprezinta grafic sub forma:
Nu
Da
Se foloseste ori de cate ori se cunoaste de la inceput numarul de repetari.
Pseudocodul foloseste doua tipuri de enunturi:
Pseudocodul nefiind un limbaj de programare, are putine reguli sintactice, deci programatorul are o mai mare libertate de exprimare.
Totusi, pseudocodul are cateva operatii de baza si structuri de control care se folosesc in descrierea algoritmilor.
Fiecare operatie (comanda) este reprezentata printr-un cuvant (sau succesiune de cuvinte), care exprima actiunea ce trebuie executata, insotit, de obicei, de elemente suplimentare, care ii particularizeaza efectul.
Cuvantul care identifica operatia se numeste cuvant cheie si nu se modifica de la o comanda la alta comanda de acelasi tip.
Pentru a le scoate in evidenta, cuvintele cheie vor fi scrise cu majuscule.
Din categoria operatiilor de baza fac parte operatiile: citirea datelor de intrare, scrierea datelor de iesire, atribuirea valorilor si oprirea prelucrarii.
Operatia de citire consta in transferul unei valori de pe un suport extern de informatii intr-o locatie de memorie. Comanda care indica operatia de citire contine cuvantul cheie CITESTE. Avand in vedere ca, in general, originea transferului este cunoscuta, comanda trebuie sa mai precizeze doar numele locatiei (locatiilor) in care se executa transferul.
Forma generala a comenzii este:
CITESTE <variabila>
sau
CITESTE <lista-vriabile>
Exemple:
CITESTE a
CITESTE a, b, c
Operatia de scriere consta in transferul unei valori dintr-o locatie de memorie pe un suport extern de informatii. Comanda pentru o operatie de scriere trebuie sa contina cuvantul cheie SCRIE, urmat de numele locatiei (locatiilor) de unde se transfera.
Formatul general al comenzii este:
SCRIE <variabila>
sau
SCRIE <lista-variabila>
Exemple:
SCRIE a
SCRIE x, y, z
Operatia de atribuire consta din calculul valorii unei expresii si stocarea rezultatului intr-o locatie de memorie. Comanda operatiei de atribuire contine cuvantul cheie ATRIBUIE.
Formatul comenzii este:
ATRIBUIE <variabila> <expresie>
Oprirea executiei comenzilor se realizeaza folosind comanda STOP, a carei format este: STOP
Prelucrarea datelor folosind un sistem de calcul se bazeaza pe inlantuirea efectelor operatiilor in conformitate cu combinatiile (structurile) utilizate de programator in scrierea algoritmilor.
Pentru "disciplinarea" realizarii algoritmilor in scopul scoaterii in evidenta a rationamentelui rezolvarii problemei, programarea structurata[1] foloseste un set redus de tipuri de structuri. Orice algoritm, oricat ar fi el de complex urmeaza a fi realizat printr-o combinatie de structuri din acest set.
Celei trei structuri de baza utilizate in programarea structurata sunt:
secventa - succesiunea a doua sau mai multe operatii;
decizia - alegerea unei operatii din doua alternative posibile;
ciclul cu test initial - repetarea unor operatii atata timp cat o anumita conditie este indeplinita.
Pentru a spori claritatea descrierii algoritmilor, pseudocodul poate include si alte structuri, care insa nu contravin spiritului programarii structurate; au o singura intrare si o singura iesire.
Cel mai simplu tip de structura este secventa, adica scrierea comenzilor una sub alta in ordinea executarii lor.
Exemplu: Dandu-se valorile a, b si c sa se calculeze x1 si x2 astfel
X1=(B*B - 4*A*C)/2
X2=X1+75*c
Algoritmul pentru calcul celor doua valori este:
CITESTE a, b, c
ATRIBUIE x1 (b*b - 4*a*c)/2
ATRIBUIE x2 x1 +75*c
SCRIE x1, x2
STOP
Observatie Daca intr-o secventa apar consecutiv comenzi de acelasi tip, se poate utiliza o notatie simplificata, scriind o singura data cuvantul cheie si inlantuind partile variabile. Spre exemplu, in cazul exemplului prezentat in loc sa se scrie doua comenzi ATRIBUIE, ea se poate scrie o singura data sub forma:
ATRIBUIE x1 (b*b - 4*a*c)/2, x2 x1 +75*c
Operatia de decizie asigura executia uneia din doua alternative posibile. Ea este reprezentata, in general, printr-o comanda de forma:
DACA <conditie> ATUNCI
<secventa 1>
[ALTFEL
<secventa 2>]
Deci inceputul comenzii de decizie este marcat de cuvantul cheie DACA, sfarsitul sau este indicat de semnul . Utilizarea semnului [ (din stanga structurii) si o anumita aliniere a comenzilor incluse, maresc sugestivitatea reprezentarii. Scrierea decalata (indentare) a celor doua <secvente> subliniaza includerea lor in decizie, ca structura de ordin inferioara. Parantezele drepte din formatul structurii indica faptul ca respectiva constructie este optionala.
Modul de executie al comenzii este:
Observatie Daca <secventa 2> nu contine nici o operatie, atunci cuvantul ALTFEL si <secventa 2> poate lipsi, obtinundu-se astfel o structura de decizie cu ramura vida.
Exemplu: Dandu-se trei valori, a, b si c, sa se determine cea mai mare valoare. Algoritmul de determinare a maximului dintre trei valori este:
CITESTE a, b, c
DACA a > b ATUNCI
DACA a > c ATUNCI
SCRIE a
ALTFEL
SCRIE c
ALTFEL
DACA b > c ATUNCI
SCRIE b
ALTFEL
SCRIE c
STOP
Algoritmul de rezolvare pentru o problema nu este unic. Spre exemplu, folosind o variabila auxiliara x, aloritmul anterior poate fi scris si sub forma:
CITESTE a, b, c
DACA a > b ATUNCI
ATRIBUIE x a
ALTFEL
ATRIBUIE c b
DACA c > x ATUNCI
ATRIBUIE x c
SCRIE x
STOP
Reprezinta o extindere a operatiei de decizie. Ea permite alegerea unei alternative din mai multe posibile. Forma generala a comenzii de selectie multipla este:
ALEGE <expresie> DINTRE
<c1>: <secventa 1>
<c2>: <secventa 2>
.
<cn>: <secventa n>
<rest>: <secventa n+1>
unde <c1>, <c2>, . <cn> sunt constante numite etichete si ele folosesc pentru identificarea sceventelor ce urmeaza a fi executate. Eticheta <rest> si <secventa n+1> pot lipsi.
Modul de executie:
Exista situatii cand pentru a ajunge la rezultatul cautat este necesar ca un grup de operatii sa se execute in mod repetat. Spre exemplu, daca vrem sa aflam cel mai mare divizor comun a doua numere folosind algoritmul lui Euclid (vezi pag. 2) este necsar ca secventa de operatii 4, 7, 8, 9, 2, 3 sa se execute de un numar diferit de ori, in functie de valorile lui M si N. Numarul de repetari nu se cunoaste de la inceput; terminarea algoritmului depinde de indeplinirea unei conditii.
Definitie: Combinatia de operatii in care executia unui grup de operatii se executa de mai multe ori se numeste ciclu sau iteratie.
Exista trei tipuri de cicluri si anume:
Reprezentarea unei astfel de operatii compuse se realizeaza folosind o comanda de ciclare, care specifica atat operatiile care se repeta (corpul ciclului) cat si conditia de repetare.
In cazul in care operatiile trebuie sa se execute cel putin o data si nu se cunoaste numarul de repetari, se foloseste ciclul cu test final care are urmatoarea forma generala:
REPETA
<secventa>
PANA CAND <conditie>
Modul de executie al ciclului cu test final este:
Folosind aceasta comanda de ciclare algoritmul lui Euclid se poate scrie astfel:
CITESTE m, n
REPETA
ATRIBUIE c n, r m MOD n
ATRIBUIE m n, n r
PANA r = 0
SCRIE c
STOP
MOD este operatorul impartirii intregi.
Observatie Corpul ciclului (<secventa>) trebuie sa contina operatii care sa modifice rezultatul evaluarii expresiei <conditie> in sensul indeplinirii ei; in caz contrar ciclul se repeta la infinit.
Atunci cand operatiile ciclului nu trebuie sa se execute niciodata si nu se cunoaste numarul de repetari, se va folosi ciclul cu test initial, a carui forma generala este:
CAT TIMP <conditie> EXECUTA <secventa>
Mod de executie:
Observatii
Este posibil ca <secventa> sa nu fie executata niciodata, daca de la inceput nu se indeplineste <conditie>.
In <secventa> trebuie sa existe comenzi care sa determine modificarea rezultatului evaluarii expresiei <conditie> in sensul terminarii ciclarii; in caz contrar operatiile se repeta la infinit.
Cand se cunoaste de la inceput numarul de repetari, cea mai indicata structura este ciclul cu contor. Ciclul cu contor se caracterizeaza prin existenta unei variabile care numara iteratiile executate. Formatul general al unui ciclu cu contor este:
PENTRU <contor>=<val_initiala>, <val_finala>[, <pas>] EXECUTA
<secventa>
unde:
<contor> - este o variabila cu valori intregi care numara iteratiile executate;
<val_initiala> - este valoarea de la care incepe contorizarea;
<val_finala> - este valoarea la care se termina contorizarea.
<pas> - valoarea cu care se incrementeaza sau decrementeaza contorul dupa executia unei iteratii. Daca nu este precizat, se considera 1.
Mod de executie:
Exemplu: Sa se calculeze factorialul unui numar dat.
Algoritmul pentru calculul factorialului unui numar, tinand cont ca n! = 1*2*3*.*n este:
CITESTE n
ATRIBUIE fact 1
PENTRU i = 1, n EXECUTA
fact = fact * i
Intr-un algoritm anumite sectiuni ale acestuia se pot repeta. Pentru a elimina scrierea repetata a acestora, se utilizeaza descrierea separata a lor si marcarea, prin anumite enunturi specifice, locurile din algoritm in care ele ar trebui sa apara.
O astfel de sectiune, evidentiata printr-o descriere separata, de sine statatoare se numeste procedura, iar enuntul care inlocuieste sectiunea in cadrul algoritmului se numeste apel de procedura.
Descrierea unei proceduri trebuie sa specifice secventa de operatii, care constituie corpul procedurii, sa evidentieze clar parametrii acesteia (partea variabila) si sa asocieze procedurii un nume, ce va fi utilizat in toate apelurile de procedura.
Forma generala a descrierii unei proceduri este:
PROCEDURA <nume_procedura> () ESTE
<corp_procedura>
SFARSIT
unde:
<nume_procedura> - este identificatorul (numele) procedurii;
<parametrii> - este o lista de variabile numiti si parametrii formali, care se folosesc pentru a mari gradul de generalitate al procedurii si asigura legatura dintre apelant si apelat. Prin intermediul acetei liste se transmit valorile ce se vor prelucra. Acesti parametrii pot sa lipseasca.
<corp_procedura> - sunt comenzile pe care le va executa procedura.
Apelarea unei proceduri se realizeaza cu enuntul:
EXECUTA <nume_procedura>()
Parametrii care apar in apelul de procedura se numes parametrii efectivi; ei specifica de fiecare data cu ce se inlocuiesc parametrii formali ai procedurii.
Daca procedura calculeaza o singura valoare, se poate utiliza un tip particular de rutina, numit functie. Descrierea unei functii cuprinde: un enunt ce specifica numele functiei si parametrii ei, secventa de operatii care formeaza corpul functiei si cuvantul cheie SFARSIT astfel:
FUNCTIA <nume_functie> (<parametri>) ESTE
<corp_functie>
SFARSIT
Lista parametrilor contine numai parametrii care se transmit functiei, adica parametrii de intrare in functie. Singurul parametru de iesire al functiei este considerat chiar numele functiei, care trebuie sa fie utilizat in secventa de operatii a functiei, <corp_functie>, pentru ca functia sa furnizeze un rezultat atunci cand este apelata.
Si apelul de functie este deosebit fata de apelul de procedura. Pentru a utiliza o functie, apelul acesteia trebuie sa apara intr-o expresie in partea dreapta a semnului egal, ca orice operand. Apelul de functie are forma:
<nume_functie> (<parametri>)
adica numele functiei urmat de parametrii efectivi.
[1] Programarea structurata are la baza o justificare matematica, furnizata de Bohm Jacopini si cunoscuta ca "teorema de structura". Aceasta teorema precizeaza ca orice algoritm avand o intrare si o iesire (un singur punct de inceput si un singur punct de terminare a executiei) poate fi reprezentat ca o combinatie a celor trei structuri de baza.