Sunteți pe pagina 1din 50

Unitatea de curs 5 ALGORITMI.

REPREZENTAREA ALGORITMILOR Scopul unitii de curs


Prezentarea fundamentali. noiunii de algoritm. Prezentarea unor algoritmi

Obiective operaionale

Dup studiul acestei uniti, cursanii vor avea posibilitatea: s defineasc noiunea de algoritm; s cunoasc algoritmi fundamentali, absolute necesari dezvoltrii programelor; s identifice structurile de control ntr-un algoritm.

Cuprinsul unitii de curs


5.1. Algoritmi 5.2. Reprezentarea algoritmilor 1.3.Abordarea unei probleme n vederea elaborrii algoritmului de rezolvare. Exemple 5.4. Probleme rezolvate 5.5. Pseudocod 5.1. Algoritmi
Noiunea de algoritm este fundamental n informatic (aa cum este n matematic noiunea de mulime). Astfel nct putem ntlni diverse definiii ale algoritmului. De exemplu, Enciclopdia Britannica d urmtoarea definiie: "O procedur sistematic ce produce ntr-un numr finit de pai rspunsul la o ntrebare sau rezolvarea unei probleme". Dicionarul de calculatoare & Internet (editura Teora, 1999) definete algoritmul astfel: "O procedur matematic sau logic de rezolvare a unei probleme. O metod de a gsi rspunsul corect la o problem dificil prin mprirea ei ntr-un anumit numr de etape simple." Caracteristicile unui algoritm sunt: determinism (claritate): succesiunea pailor este precis determinat; finitudine (eficacitate): numrul pailor descrii este finit; generalitate (universalitate): rezolv orice problem din clasa de probleme pentru care a fost elaborat (pentru orice set de date de intrare). Algoritmii se folosesc n orice limbaj, inclusiv n cel natural. O reet de buctrie este un algoritm: "Se amestec 30g drojdie cu o linguri zahr. Se amestec totul cu 4 linguri fin i 4 linguri lapte. Pauz timp de 15 minute. Se amestec totul cu 400g fin i dou pahare lapte timp de 5 minute. Pauz timp de 20 minute. Se unge tava. Se pune amestecul n tav. Se pun fructele peste amestec. Se d la cuptor. Pauz timp de 20 minute. Se scoate din cuptor. Pauz timp de 5 minute. Se taie i se mnnc".
Cuvntul algoritm provine din traducerea n latin (Algoritmi de numero Indorum) a titlului scrierii matematicianului arab Al-Horezmi (Al-Horezmi despre numrarea indian). Abu Abdullah Mohamed Ibn Musa Al-Horezmi (770 840) a fost unul dintre cei mai mari matematicieni ai lumii. A trit n Bagdad, n timpul califului Mamun. A fondat cteva din ramurile matematicii. Este faimos i ca astronom. Cea mai mare realizare a sa o constituie introducerea conceptului de algoritm. O alta de rang asemntor este introducerea cifrei zero. Algoritmii se ntlnesc mereu n viaa obinuit. Acionarea unor dispozitive sau maini se face conform algoritmilor (aps butonul de apel al liftului, atept pn cnd ajunge, deschid uile, intru, nchid uile,

61

comand oprirea urmtoare, atept pn ajung, deschid uile, ies, nchid uile). Chiar i normele de comportare sunt algoritmi (deschid ua slii de ateptare, intru, nchid ua, salut persoanele aflate aici, dac exist un scaun liber, atunci m aez, atept pn mi vine rndul). Precolarii nva algoritmi matematici: ca s adun pe 7 cu 4, folosesc numrtoarea astfel: trec n dreapta 7 bile de pe prima linie, trec n dreapta 4 bile de pe a doua linie, numr cte bile am n total n dreapta. n gimnaziu ne ntlnim cu algoritmul lui Euclid, care stabilete este cel mai mare divizor comun a dou numere naturale. Se observ o diferen fundamental fa de algoritmul precedent: acesta rezolv o clas infinit de probleme (numerele naturale pot fi oricare), pe cnd cel precedent rezolv o singur problem (cum adun pe 7 cu 4, dar nu m nva cum adun pe 2 cu 5). Exist ntotdeauna un algoritm de rezolvare a unei clase finite de probleme. Este varianta exhaustiv de rezolvare, adic o tabel de valori asociat tuturor cazurilor posibile. De exemplu, problema determinrii rezultatului nmulirii a dou numere cel mult egale cu 10 a dus la celebra tabl a nmulirii pe care am nvat-o n clasa a doua. n general, nu este uor a rspunde la problemele care au numr infinit de valori de luat n considerare. De exemplu: "este numrul n (natural) prim ?" sau "care este cel mai mic multiplu comun a dou numere naturale ?". De aceea algoritmii care rezolv astfel de probleme sunt importani i sunt studiai n coal. "Elementele" lui Euclid, aprut n anul 300, conin un algoritm care afl cel mai mare divizor comun a dou numere naturale. Gsirea de algoritmi elegani (simpli i eficieni) este unul din scopurile cercetrii n informatic. Se disting dou tipuri de algoritmi: cei care furnizeaz un rspuns de tipul da/nu se numesc decizionali. Problemele rezolvate de ei se numesc probleme de decizie ("este n prim ?"). Cei care conduc la o valoare numeric se numesc calculaionali. Problemele rezolvate se numesc probleme de calcul ("care este cel mai mic multiplu comun al numerelor a i b ?"). Exist clase de probleme pentru care nu se cunosc algoritmi de rezolvare (mai ales dac se impun restricii asupra metodei acceptate). De exemplu, dou probleme din vremea lui Euclid, care trebuie rezolvate cu ajutorul riglei negradate i al compasului: "s se construiasc un ptrat cu aria egal cu cea a unui cerc dat" i "s se deseneze trisectoarea unui unghi" au fost studiate secole de-a rndul, pn cnd s-a demonstrat c sunt imposibile. La trecerea n secolul al XX-lea, David Hilbert (matematician german) a propus 23 de probleme de rezolvat n urmtoarea sut de ani. A doua problem din list cerea investigarea consistenei axiomelor aritmeticii. Muli matematicieni aveau dubii asupra rezolvrii acestei probleme, pn n 1931, cnd Kurt Gdel (logician austriac) a demonstrat surprinztorul rezultat c exist enunuri aritmetice indecidabile (nu se pot nici afirma i nici nega), deoarece conduc la o procedur decizional infinit (deci nu duc la un algoritm). ntr-un efort fr succes de a afla cel puin care sunt aceste enunuri, Alan Turing (matematician i logician englez) a definit riguros conceptul de algoritm. Descrierea sa pentru caracteristicile eseniale ale unei maini care produce algoritmi (maina Turing) a devenit fundamental pentru informatic. Programele de calculator sunt tipuri speciale de algoritmi. Decidabilitatea i calculabilitatea lor sunt probleme centrale ale scrierii programelor. Verificarea corectitudinii algoritmilor. Dup elaborarea unui algoritm, se trece la verificarea corectitudinii acestuia. Adic, ar trebui parcurs algoritmul pentru orice problem din clasa de probleme pentru care a fost scris, i vzut dac furnizeaz rezultate corecte. Acest lucru este imposibil, dac algoritmul rezolv o clas infinit de probleme. De aceea, se recomand urmtoarele verificri ale algoritmilor simpli: dac se ncheie dup un numr finit de pai (se verific structurile repetitive); dac seleciile s-au construit corect (se verific structurile alternative); dac se asigur valori pentru toate datele folosite (se verific dac tuturor datelor li se atribuie valori). Dup ncheierea cu succes a verificrilor de mai sus, se trece la testul ntregului algoritm, pe diferite seturi de date, de obicei cazuri limit.

5.2. Reprezentarea algoritmilor


Am vzut c un algoritm reprezint un sistem de reguli pentru rezolvarea unei clase de probleme. Dac dorim s rezolvm cu calculatorul o problem din clasa respectiv, este necesar s descriem mai nti algoritmul corespunztor. Doar pentru probleme suficient de simple i, desigur, n urma dobndirii unei experiene n programare, ne putem dispensa de aceast etap. n procesul de asimilare a primelor cunotine de programare i pentru nelegerea unor algoritmi fundamentali este bine s utilizm descrieri explicite ale algoritmilor. Formele de reprezentare ale unui algoritm sunt: - n cuvinte, pe pai; - schema logic; - pseudocod; - alte forme. 62

5.2.1. Scheme logice Schemele, departe de a fi utilizate numai n informatic, sunt un instrument de lucru general, utilizat n chimie, fizic, inginerie, tiine socio-umane, administraie etc. n general, schemele sunt folosite pentru a arta dinamica unui proces, de la iniierea pn la ncheierea sa. Structura schemelor poate fi conceput diferit n domenii diferite, dar n mod obinuit sunt constituite din blocuri (cu forme diverse) conectate prin linii. Ordinea de parcurgere a blocurilor, indicat de obicei prin sgei, trebuie s rezulte clar din schem. Dac este loc, procesul reprezentat este descris n interiorul blocului. Dac nu, se folosesc simboluri explicate n afara schemei. O schem este un desen care permite nelegerea ntregului proces prin urmrirea diferitelor aspecte aprute i nelegerea ordinii i relaiilor ntre aspecte. La sfritul anilor 40, cnd s-a conturat conceptul programului memorat, a devenit clar c scrierea programelor complexe, de mii de instruciuni, nu putea fi realizat fr o metod de planificare i urmrire a etapelor intermediare. Primul care a folosit metoda de descriere logic a etapelor unui program a fost John von Neumann. El a folosit o schem logic pentru a evidenia succesiunea transformrilor datelor de intrare pn cnd se obin datele de ieire. Toi programatorii au preluat acest mod de lucru, preliminar scrierii unui program. American National Standard Institute (ANSI) a publicat un standard al blocurilor folosite n informatic. Cele uzuale sunt: Proces Un grup de instruciuni care realizeaz o procesare (prelucrare) Intrare / ieire Orice operaie a unui dispozitiv de intrare/ieire Decizie Descrie o condiie (expresie logic), n funcie de valoarea creia se alege una din dou alternative de ieire Proces predefinit Un grup de operaii care nu sunt detaliate n schem Terminal nceputul, sfritul sau un punct de ntrerupere a unui program Conector O legtur ctre alt parte a schemei Conector de pagin O legtur ctre o parte a schemei, situat pe alt pagin

Exemple de folosire a acestor blocuri: Variabila x primete valoarea b2 - 4ac. x b*b 4*a*c

63

citete: a,b,c

Se preiau de la dispozitivul de intrare valorile variabilelor a, b i c.

da n

nu

Dac i este mai mic sau egal cu n, atunci se trece la execuia blocului aflat pe sgeata marcat cu "da". Altfel, se execut blocul aflat pe sgeata marcat cu "nu". Acest bloc are dou puncte de ieire.

Se calculeaz valoarea funciei f n 2. f(2)

START

STOP

nceputul i sfritul schemei. Aceste blocuri apar o singur dat ntr-o schem.

1 1

Conectori pe pagin.

2 2 *

2 * *

Conectori ntre pagini. START

Pentru a scrie o schem logic, programatorul trebuie s gndeasc n pai elementari rezolvarea problemei. De obicei, se ncepe cu citirea datelor de intrare. Apoi urmeaz partea de citete: calcule i de decizii care se iau n funcie de rezultatele unor comparaii. ncheierea o constituie a, b scrierea datelor de ieire. Fiecare dintre aceti pai elementari este redat de un bloc standardizat din tabelul de mai sus. n fiecare bloc se plaseaz o descriere a operaiei executate. Alturat este prezentat o schem care citete dou variabile reale a i b i scrie variabila x, calculat astfel: x = -b/a dac a este nenul, sau x = b7 dac a=0. da nu a=0 xb-7 x -b / a

5.2.2. Structuri de control Problema care a aprut era c fiecare programator avea stilul su de lucru i folosea propriul set de reguli pentru descrierea logic a programului. scrie: folosea propria structur Fiecare x (grup de blocuri) pentru a descrie etape din program. De aceea citirea, nelegerea i modificarea structurilor era dificil. Era necesar o uniformizare a metodelor de scriere a unei scheme. Astfel, "arta" programrii trebuia transformat n "tiin". n anul 1964, Corrado 64 STOP

Eveniment 1

Eveniment 2

da

Condi ie

nu

Eveniment 1

Eveniment 2

Condi ie da Eveniment

nu

Bhm i Giuseppe Iacopini au prezentat o lucrare la Congresul Internaional de Lingvistic Algebric i Teoria Automatelor din Israel. n aceast lucrare ei demonstreaz c orice schem logic poate fi scris cu ajutorul a numai trei structuri, numite structuri de control de baz. Acestea sunt: structura secvenial, structura alternativ binar i structura repetitiv condiionat anterior. Structura secvenial Evenimentele descrise n blocuri se execut unul dup altul, n ordinea specificat.

Structura alternativ binar n blocul de decizie este testat condiia nscris. Dac este adevrat, atunci se execut operaia descris n blocul de pe ramura marcat cu "da". Dac nu, atunci se execut operaia descris n blocul de pe ramura marcat cu "nu". Structura repetitiv condiionat anterior

65

Este cea care permite ciclarea n programe. Se testeaz condiia nscris. Dac este adevrat, atunci se execut procesarea descris. Din nou se testeaz condiia. Ct timp condiia este adevrat, se reia procesarea. Dac ns condiia este fals, atunci se ncheie aceast structur. Observm c fiecare din cele trei structuri descrise mai sus are un singur punct de intrare i un singur punct de ieire. Programarea structurat este metoda de programare care folosete numai aceste trei structuri. Acum exist produse software care ajut desenarea schemelor logice. Procesorul de texte Word (sub Windows) are predefinite blocurile standard ale schemelor. Flowchart Maker, ajuns la versiunea 1.3, este un produs pentru Macintosh, destinat exclusiv desenrii schemelor. n afara structurilor de control de baz, mai exist structuri de control auxiliare: structura de control alternativ generalizat, structura de control condiionat posterior i structura repetitiv cu contor. Aceste structuri au fost admise datorit frecventei lor utilizri, dar se arat c pot fi simulate cu ajutorul structurilor de baz.

Structura de control alternativ generalizat Alegerea urmtoarei prelucrri se face n funcie de valoarea unei expresii numite selector. Dac selector este egal cu v1, atunci se execut "Eveniment 1"; dac are valoarea v2, se execut "Eveniment 2" i aa mai departe. =v n =v 1 select or =v 2 Eveniment 1 Eveniment n =v 3 Eveniment 2 Eveniment 3 ...

Structura de control condiionat posterior Se execut "Eveniment". Se testeaz condiia nscris. Dac este fals, Eveniment reia atunci se procesarea descris prin "Eveniment". Se testeaz condiia din nou. Ct timp condiia este fals, se reia procesarea. Dac ns condiia este adevrat, atunci se ncheie aceast structur. nu Structura repetitiv cu contor v vi Condi ie

Este o structur pentru care se cunoate numrul de repetiii. Contorul repetiiei este variabila da ntreag v. Contorul primete valoarea iniial vi. Se testeaz dac v este mai mic sau egal cu vf da v (valoarea final). Dac da, atunci se execut "Eveniment", se crete v cu pasul p i se reia vf testul. Se prsete aceast structur dac v este mai mare dect vf. nu 5.2.3. Modularizare v v programatorii au Pe msur ce programele deveneau tot mai lungi i mai complexe, + p neles c era tot mai greu ca de la nceputul scrierii s fie cunoscute toate prelucrrile ce trebuiau efectuate. S-a conturat astfel conceptul de proiectare "top-down", prin care se mprea un program n mai multe pri care ndeplineau fiecare o anumit funciune. Fiecare din aceste pri erau scrise de programatori diferii, care urmreau rezolvarea unei anumite 66 Eveniment

probleme. La nivel central, trebuia coordonat ansamblul, adic trebuia urmrit compatibilitatea transferului de date ntre pri. Prima rezolvare a constat n apariia subprogramelor. Acestea sunt apelate din programul principal pentru a executa o aceeai operaie, de cte ori este nevoie. De exemplu, se poate scrie un subprogram care afl dac un numr este prim sau nu i acest subprogram se apeleaz la nevoie din programul principal. Spre sfritul anilor 60, s-a introdus conceptul de modularizare a programelor, prin care efectiv se descompunea un program n pri mici (module), cu o logic simpl i uor de urmrit. Acest procedeu este asemntor celui descris n continuare. n principiu, se urmrete descompunerea operaiilor ce trebuie executate pn la nivel elementar, cnd se transform direct n instruciuni acceptate de limbajul de programare. Exemplu. S presupunem c avem un robot nzestrat cu brae, picioare i ochi, pe care dorim s-l programm astfel nct s pregteasc o can cu ceai. Deci, sarcina principal (de nivelul 1) este:

1. F-mi o can cu ceai Deocamdat robotul nu poate ndeplini cerina, deoarece el doar recunoate obiectele i ndeplinete comenzi simple, de genul: "pune ceainicul pe plit". De aceea, cerina noastr va fi descompus n comenzi mai simple, de nivelul 2, pe care le punem n ordine: 1. F-mi o can cu ceai

1.1. Fierbe apa

1. 2. Pune ceai n can

1. 3. Pune apa n can

Fiecare din aceste cerine este greu de ndeplinit, astfel nct trebuie descompus, la rndul ei, n altele de nivel inferior (nivelul 3). Majoritatea programelor conin activiti de introducere, prelucrare de date i extragere de rezultate. Proiectnd programul i formnd module, va deveni, n curnd, evident pentru fiecare modul, ce funcie ndeplinete n introducere, prelucrare sau extragere. Iat cum arat ntreaga diagram de tip arbore pentru nivelul 3: 1. F-mi o can cu ceai

1.1. Fierbe apa

1. 2. Pune ceai n can

1. 3. Pune apa n can

1.1.1. Umple ceainicul cu ap

1.1.2 Pune ceainicul pe plit

1.1.3 Ateapt pn fierbe apa

1.2.1
Ia o can de ceai

1.2.2 Pune plicul de ceai

1.3.1. Adu ceainicul la can

1.3.2 Pune apa n can

1.3.3 Amestec totul

5.3. Abordarea unei probleme n vederea elaborrii algoritmului de rezolvare. Exemple


67

n continuare, se vor expune etapele rezolvrii a dou probleme. Datele de intrare (DI) i datele de ieire (DE) se deduc din formulrile problemelor. Aceste date vor fi precizate explicit dup ce se dau indicaiile necesare pentru realizarea schemei logice (idei pentru gsirea algoritmului sau modul de organizare a datelor). De asemenea, vor fi precizate, acolo unde apar, datele intermediare (sau variabilele de lucru, VL), adic acele date care nu sunt nici de intrare, nici de ieire, dar sunt necesare pentru descrierea algoritmului. Anumite variabile poart denumiri specifice, care deriv din rolul lor. Printre acestea, vom regsi pe parcursul lucrrii: contorii (variabilele contor). Denumirea vine din limba englez (to count = a numra) i deci rolul lor este de "a numra" (elementele cu o anumit proprietate, paii dintr-o structur repetitiv etc.); variabilele indicator. n englez, se numesc "flag variables" (flag = steag). O astfel de variabil poate lua dou valori (de obicei 1 sau 0, true sau false, dar orice pereche de valori distincte se poate folosi), astfel nct indic o situaie printr-o valoare i situaia contrar prin cealalt valoare. De exemplu, 1 nseamn c vectorul este ordonat, 0 nseamn c nu este ordonat; sau: true nseamn c o funcie f ntoarce valori ntregi, false nseamn c f ntoarce valori nentregi. Semnificaia valorilor unei variabile indicator, precum i rolul su, trebuie precizate de programator. Exemplul 1. Se d n4, numr natural. S se scrie descompunerea sa n factori primi. Mai nti vom analiza problema i astfel vom remarca ce variabile sunt necesare pentru descrierea unui algoritm care s o rezolve. Se consider numrul natural n cel puin egal cu 4, ntruct cazurile n=1, n=2, n=3 sunt banale i n plus, considerarea lor ar complica inutil algoritmul (deseori astfel de cazuri particulare ale datelor de intrare presupun teste suplimentare i un tratament special). tim c n admite o descompunere de forma n = d 1p1 d 2p2 ... d rpr unde di, i=1,2,,r sunt divizorii primi ai lui n i pi sunt puterile la care acetia apar. Vom propune o variant de rezolvare n care, dup ce se gsete o pereche (di,pi) format din divizor i putere, aceast pereche este imediat afiat. Aceasta nseamn c sunt suficiente dou variabile, pe care le vom numi d (divizor) i p (putere), ce vor pstra pe rnd divizorii lui n i puterile corespunztoare. S analizm acum schema logic propus mai jos. Astfel, dup citirea lui n, variabila d se iniializeaz cu 2, cel mai mic divizor prim posibil (a iniializa o variabil nseamn a-i atribui, ntr-un proces de prelucrare, o prim valoare; aceast prim valoare se alege cu grij, analiznd procesul ce urmeaz a fi dezvoltat). Urmeaz un proces repetitiv (remarcm sgeata care se ntoarce n punctul (1). Astfel, atta timp ct valoarea variabilei n se menine mai mare dect 1, se repet urmtoarea secven de prelucrri: variabila p primete valoarea 0. Ideea este ca abia atunci cnd d se gsete c este divizor al lui n, valoarea lui p s devin 1; un nou proces repetitiv. Ct timp n se mparte exact la d, se repet secvena urmtoare: - n se mparte la d; - p crete cu 1. La acest pas se determin puterea la care divizorul d apare n n; dac p este mai mare dect 0, se afieaz, n blocul de ieire marcat cu (2), valorile variabilelor d (divizorul) i p (puterea la care apare d n descompunerea lui n). Dac p nu este mai mare dect 0, atunci d nu divide n i se merge la (3); dac divizorul testat a fost 2, atunci se va cerceta d=3. Altfel, variabila d se crete cu 2, cci tim c numerele prime sunt impare (cu excepia lui 2). Practic, se vor cerceta cazurile d=2, apoi d=3, 5, 7, (pn unde este cazul). Atunci cnd testul (1) devine fals (ceea ce nseamn c n=1) ne oprim, descompunerea fiind afiat. n final, nu dispunem n memorie de toi divizorii lui n iar valoarea lui n este alterat (n=1). Dac dorim s pstrm divizorii pentru prelucrri ulterioare, este necesar s abordm altfel problema. De exemplu, am putea: s folosim un tablou n care s memorm divizorii i puterile lor, n locaii succesive. Bunoar, pentru n=175=5271, ieirea ar putea fi vectorul desc, desc = (5 2 7 1), sau 68

s folosim dou tablouri, n primul s memorm divizorii iar n al doilea, pe poziii corespondente, puterile la care acetia apar. Pentru cazul de mai sus, ieirea ar fi vectorii d i p, d = (5 7), p = (2 1).

Observm c exist mai multe posibiliti de a rezolva o problem (corespunztor necesitilor de prelucrare a datelor respective) i c rmne la alegerea programatorului s propun forma n care s fie furnizate rezultatele.

DI: variabila n VL: DE: variabilele d, p.

START

Citete: n

(1) d2 da n>1 p0 da

nu

n0(mod d) nu

nn/d pp+1 (2) da scrie: divizor,d, putere,p

p1

nu

(3)

da d=2 d3

nu

dd+2

69

STOP

Cum putem verifica dac am construit o schem logic corect (i deci, un algoritm corect) pentru o problem propus? nti se verific structurile repetitive, pentru a nu cicla la infinit. Apoi se verific structurile alternative, s furnizeze corect alegeri. Apoi se verific dac toate variabilele folosite primesc valori pe parcursul schemei. Dac toate verificrile indic o schem corect, se trece la testul de birou. Aceasta este o metod simpl, ce folosete un tablou n care se plaseaz, pe coloane, toate variabilele ce apar n schema logic. Se aleg valori convenabile pentru datele de intrare - convenabile n sensul c, pentru aceste date, vom rezolva problema: - direct; - urmrind, de la START la STOP, toi paii indicai de schema logic i vom compara rezultatele obinute prin cele dou metode. Relund procesul pentru mai multe seturi de date de intrare, vom observa dac algoritmul propus este corect (dac pentru mcar un set de valori de intrare, rspunsul furnizat de schem nu coincide cu cel gsit direct, nseamn c exist erori de logic i acestea trebuie corectate). Pentru problema analizat aici, fie urmtorul tablou: n 98 49 49 49 49 49 7 1 1 d 2 2 3 3 5 7 7 7 9 p 0 1 1 0 0 0 1 2 2 Observaii se scriu 2 (d) i 1 (p) revenire n (1) p primete din nou valoarea 0

se scriu 7 (d) i 2 (p) stop, n nu este > 1

Urmrii liniile tabloului de mai sus, urmnd pas cu pas operaiile indicate de schema logic pentru n = 98. Se vede c se obine un rezultat corect (descompunerea 98 = 2 172). Pentru orice valoare n 4, rspunsul este corect. Este bine de tiut c un astfel de tablou de variaie a variabilelor ne poate ajuta n construcia unui algoritm. S presupunem c am elaborat o form a unui algoritm, pentru o problem dat, dar nu suntem siguri dac este corect. Vom testa algoritmul pe un set de date de intrare convenabil alese, folosind metoda de verificare de mai sus. n tabloul respectiv, vom observa dac iniializrile sunt corecte, cum se modific variabilele, cum se termin algoritmul i aceste informaii (n caz c algoritmul este incorect) sunt foarte utile pentru a realiza modificrile necesare. Practic, ntr-un astfel de tablou "se vede" cum lucreaz algoritmul. Exemplul 2. Se dau dou matrice A = (ai j) 1 i n ,1 j m i B = (bi j) 1 i n ,1 j m cu elemente reale (n 10, m 10). S se calculeze matricea C = (ci j) 1 i n ,1 j m , C = A + B. Datele de intrare ale problemei sunt: numrul de linii (n) i numrul de coloane (m) precum i elementele matricelor A i B. Blocul de citire precedat de marcajul (0) descrie citirea variabilelor de intrare ntr-un mod condensat. S observm c, de fapt, citirea celor dou tablouri A i B implic citirea a 2 + 2mn numere (valoarea lui n, valoarea lui m, cele mn elemente ale lui A i cele mn elemente ale lui B), deci este vorba tot de un proces repetitiv, analog celui descris mai jos pentru algoritmul propriu-zis (adunarea matricelor). Se convine s se descrie n acest mod condensat citirea tablourilor pentru a nu complica n mod inutil i pentru economie de spaiu. Cum procedeul de calcul al sumei a dou matrice este bine cunoscut (se adun elementele de pe aceleai poziii), rmne s analizm, n cele ce urmeaz, modul n care descriem (din punct de vedere algoritmic) acest procedeu foarte simplu. S considerm scrierea uzual a celor dou matrice: 70

a 11 a A = 21 a n1

a 12 a 22 a n2

a 1m a 2m a nm

b11 b12 b 22 b B = 21 b n1 b n 2

b1m b 2m b nm

tim c se adun elementele liniei 1 din A cu elementele liniei 1 din B (a 11 cu b11, a12 cu b12,,a1m cu b1m), apoi elementele liniei 2 din A cu elementele liniei 2 din B i tot aa pn la linia n inclusiv. Se observ deci c se compun dou procese repetitive (primul: se prelucreaz n linii i al doilea: o prelucrare implic m adunri). Pentru descrierea corespunztoare vom folosi: - o variabil i care s conin, pe rnd, indicii liniilor (1,2,,n); - o variabil j care s conin, pe rnd, indicii coloanelor (1,2,,m). START DI: matricele A,B VL: contorii i, j DE: matricea C (0) citete: n,m,(ai j) 1 i n ,1 j m (bi j) 1 i n ,1 j m (1) i1 (2) da (3) j 1 (4) da (5) ci j ai j + bi j (6) jj+1 nu j m nu in

(7) ii+1

(8) scrie: 71 (ci j) 1 i n ,1 j m

STOP

Urmrind acum schema logic i fcnd referire la conectorii plasai convenabil, putem descrie cele dou procese repetitive imbricate (al doilea inclus n primul) astfel: (1) iniializeaz i cu 1 (se acceseaz astfel primele linii din A i B); (2) dac i este mai mic sau cel mult egal cu n, atunci: (3) iniializm j cu 1 (se acceseaz astfel primul element de pe linia i, i fiind acum fixat); (4) dac j este mai mic sau cel mult egal cu m, atunci: (5) calculm ci j ca fiind egal cu ai j + bi j; (6) cretem indicele de coloan cu 1 (trecem la urmtorul element de pe linia i) i salt napoi la testul (4); (7) dac j este mai mare dect m, aceasta nseamn c am prelucrat toate elementele liniilor i din A, respectiv B i trebuie s trecem la liniile i+1; dac i este mai mare dect n, aceasta nseamn c am prelucrat toate liniile i suma este realizat. Urmeaz: (8) afiarea elementelor tabloului C i Stop.S observm c blocul de scriere din final conine, de fapt, tot o scriere condensat. Este aceeai convenie, ca i pentru citirea tablourilor. Pentru a nelege mai bine modul n care se modific variabilele n aceast schem logic i faptul c prin paii descrii se acceseaz, ntr-adevr, toate perechile de elemente de pe poziii corespunztoare din A i B, sugerm s se considere un tablou de variaie a variabilelor, dup exemplul din problema precedent, pentru un caz foarte simplu, cum ar fi: n = 2, m = 3.

72

5.4. Probleme rezolvate


Problema 1 Se dau variabilele reale a, b, c. S se calculeze i s se scrie media lor aritmetic. Rezolvare DI: variabilele a, b, c VL: DE: variabila x START

citete: a, b, c

x (a+b+c)/3 scrie: x

STOP Problema 2 Se dau variabilele reale a i b. S se interschimbe aceste valori, astfel ca n a s se afle valoarea citit n b, iar n b s se afle valoarea citit n a. S se scrie noile valori. Rezolvare Este necesar o variabil auxiliar aux, cu rol de depozit temporar. Prin analogie, pentru a START interschimba coninutul a dou pahare (a i b), avem nevoie de un al treilea pahar (aux) n care, la nceput, s transferm coninutul unuia din cele dou: aux a. n paharul gol (a) aducem coninutul celui plin (b): a b. n cel rmas gol (b) aducem coninutul celui de-al treilea (aux): b aux. citete: a, b DI: variabilele a, b VL: variabila aux DE: variabilele a, b aux a ab b aux

scrie: a, b 73 STOP

Problema 3 S se rezolve, n mulimea numerelor reale, ecuaia de gradul I: ax+b=0, cu a i b numere reale. Rezolvare: Observm c nu se precizeaz condiia: a 0. Algoritmul trebuie s se termine corect pentru orice valori reale ale coeficienilor a i b, ceea ce conduce la analiza descris n urmtoarea schem logic. DI: variabilele a, b VL: DE: variabila x. START

citete: a, b

da

a=0 nu scrie: imposibil

nu

da scrie: identitate : 0 = 0

b=0

x -b / a

scrie: x

STOP

74

Problema 4 S se rezolve, n mulimea numerelor reale, ecuaia de gradul al II-lea: ax 2+bx+c=0, cu a, b, c numere reale. Rezolvare: Este necesar o discuie. Dac a=0, atunci se rezolv ecuaia de gradul I: bx+c=0. Dac a0, atunci se calculeaz =b2-4ac. Ecuaia are 2 soluii distincte (x1 i x2) dac >0. Ecuaia are o soluie dubl (x) dac =0. Ecuaia nu are soluii reale dac <0. DI: variabilele a, b, c VL: variabila d DE: variabilele x,x1,x2 START

citete: a,b,c

da a=0 da 0 da c= 0 nu x -c / b da b= nu

nu

d b*b - 4*a*c

d>0 da

nu nu d=0 scrie: ecuai a nu are soluii reale

scrie: identi tate 0 = 0

scrie: impos ibil scrie: solui aecuai eide gradul I,x

x1(-b+)/(2*a) x2(-b-)/(2*a)

x -b/(2*a) scrie: x1=,x 1,x2=, x2

scrie: soluie dubl,x

STOP

75

Problema 5 Se d numrul natural n. S se afieze pe monitor n rnduri, astfel: pe rndul i s fie numerele naturale de la 1 la i. Rezolvare: DI: variabila n VL: contorul i DE: contorul j

START citete : n

i1

da in j1 nu

da

ji nu

scrie: j

jj+1 ii+1 STOP

76

Problema 6 S se afieze toate valorile posibile ale expresiei E = ntregi care satisfac: 1 A, B, C, D 6. Rezolvare: DI: VL: contorii A,B,C,D DE: variabila E A + 2B , dac A, B, C, D sunt numere 3C + D + 1 START

A1 da A 6 B1 da B 6 C1 da C 6 D1 nu nu nu

da D 6
E (A+2*B)/(3*C+D+1)

nu scrie: E

D D+1 C C+1 77 B B+1 A A+1 STOP

Problema 7 S se scrie primii 40 de termeni ai irului lui Fibonacci. Rezolvare: irul este definit astfel: a1=1, a2=1, an+2= an+1+ an pentru n 1. Se vor folosi trei variabile pentru calculul termenului curent al irului: x pentru an, y pentru an+1 , z pentru an+2. DI: VL: contorul i, variabilele x, y DE: variabila z START

x1 y1 z2 scrie: x,y,z

i4 da i 40 xy yz zx+y nu

scrie: z

ii+1

STOP 78

Observaie. Aceast soluie folosete un numr minim de variabile (trei pentru calculul termenilor irului i variabila contor i pentru numrarea lor), dar nu dispunem, la un moment dat, dect de ultimii trei termeni din ir. Dac dorim s pstrm toi termenii calculai ai irului, este necesar un vector. Tem. Realizai o schem logic pentru aceast a doua soluie, cu afiarea tuturor termenilor calculai la final. Problema 8 Se dau a i b, dou numere naturale nenule. S se afle cmmdc(a, b). Rezolvare: Soluia I. Calculul celui mai mare divizor comun se va realiza prin algoritmul lui Euclid, al mpririlor succesive. Ultimul rest nenul va fi cmmdc(a,b). Vom observa ce variabile de lucru sunt necesare considernd un caz particular. De exemplu, pentru cmmdc(210,12) realizm urmtoarele mpriri: D C R 210 = 12 x 17 + 6 12 = 6 x 2 + 0 n schem, a reprezint dempritul, b reprezint mpritorul, iar r reprezint restul. Ctul nu intereseaz. Transferul indicat prin sgei se realizeaz n schem n blocul etichetat cu (1). Se observ c ultimul rest nenul este pstrat n variabila b. DI: variabilele a, b VL: variabila r DE: variabila b START

citete: a, b

r a b*[a/b]

da r>0 ab br r a b*[a/b] nu

(1)

scrie: b

STOP 79

Soluia II. Calculul celui mai mare divizor comun prin scderi repetate. i aceast schem, ca i cea precedent, distruge valorile citite ale variabilelor a i b. n finalul schemei, valoarea aflat n variabila a este egal cu cea din b i este egal cu cmmdc(a,b). Dac ulterior calculului celui mai mare divizor comun, sunt necesare valorile variabilelor a i b, acestea se pstreaz n variabile auxiliare. DI: variabilele a, b VL: DE: variabila a START

citete: a, b

da a b da nu nu

a >b

aa-b

bb-a

scrie: a

STOP

80

Problema 9 Se d n 4, numr natural. S se scrie descompunerea sa n factori primi. Rezolvare: DI: variabila n VL: DE: variabilele d, p START

citete: n

d2 da n>1 p0 da

nu

n0(mod d) nu

nn/d pp+1

da scrie: divizor,d, putere,p

p1

nu

da d=2 d3 81

nu

dd+2

STOP

Problema 10 Se dau variabila real x i variabila real strict pozitiv eps. S se afle, n variabila s, valoarea ex cu aproximaia eps. Pentru calculul aproximativ al lui ex, se folosete dezvoltarea n serie Taylor a valorii funciei n vecintatea originii: x x2 xn e x = 1+ + + ... + + ... 1! 2! n! putem scrie: ex = t0 + t1 ++ tn + Rn(x) i se demonstreaz c |Rn(x)| < |tn| pentru 0<2|x| n. Rezult c eroarea eps de calcul aproximativ a valorii lui ex se realizeaz din momentul n care |tn| < eps. Rezolvare: Se folosete variabila auxiliar t, n care se va calcula termenul curent al sumei. Observm c relaia dintre doi termeni alturai este: START x n +1 x xn x = = tn tn+1= deci termenii sumei se obin din aproape n aproape i (n + 1)! (n + 1) n! n +1 apoi se adun tot din aproape n aproape. Observm c n aceast schem logic nu se cunoate numrul de repetiii ale blocului (1). citete: DI: variabilele x i eps VL: contorul i, variabila t DE: variabila s x, eps

t1 s1 i1

(1)

t t*x / i ss+t ii+1

|t| <eps da scrie: s

nu

STOP 82

Tem. Realizai o schem logic pentru calculul cu aproximaia eps a valorii funciei sinus ntrun punct x real.

Problema 11 Se dau numerele naturale nenule n i k. S se afle, n variabila c, valoarea elemente luate cte k). Rezolvare: Folosim formula
k Cn = k C n (combinri de n

n n 1 n 2 n k +1 ... 1 2 3 k

DI: variabilele n i k VL: contorul i DE: variabila c

START

citete: n, k

da kn c1

nu

i1

da ik scrie: c c * (n-i+1) / i nu imposibil

ii+1

scrie: c

83

STOP

Problema 12 Se d vectorul a = (ai ) elementelor vectorului. Rezolvare: DI: vectorul a VL: contorul i DE: variabila s

1 i n

(n 10), cu elemente reale. S se afle, n variabila s, suma

START

citete: n,(ai ) 1 i n

s0

i1

da in s s + ai

nu

ii+1

scrie: s

STOP

84

Observaie. n aceast schem este marcat cu linie subire grupul de blocuri care genereaz instruciunea repetitiv "for". Cu linie punctat groas este marcat instruciunea care se repet la fiecare pas.

Problema 13 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale. S se afle, n variabila x, valoarea mediei aritmetice a componentelor vectorului a. Rezolvare: DI: vectorul a VL: contorul i DE: variabila x

START

citete: n,(ai ) 1 i n

x0

i1

da in x x + ai

nu

ii+1

xx/n

scrie: x

STOP

85

Problema 14 Se d un vector a = (a i ) vectorului a. Rezolvare:

1 i n

(n 10), cu elemente reale. S se afle, n variabila x, norma

tim c norma vectorului a este a = Rezult urmtorul algoritm: DI: vectorul a VL: contorul i DE: variabila x

2 2 a12 + a 2 + ... + a n .

START

citete: n,(ai ) 1 i n

x0

i1

da in xx+

nu

ii+1

scrie: x

STOP

86

Problema 15 Se dau 2 vectori a = (ai ) 1 i n i b = (b i ) 1 i n (n 10), fiecare cu elemente reale. S se afle, n variabila x, valoarea produsului lor scalar. Rezolvare: tim c <a,b>= a1b1 + a2b2 + + anbn este valoarea produsului scalar. Rezult urmtorul algoritm: DI: vectorii a, b VL: contorul i START DE: variabila x

citete: n,(ai ) 1 i n ,(bi ) 1 i n

x0

i1

da in x x + ai * bi

nu

ii+1

scrie: x

STOP

87

Problema 16 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale. S se determine valoarea x = max (a1,a2,,an). Rezolvare: Variabila x se iniializeaz cu a1. Se parcurge apoi vectorul a ncepnd cu a2 i dac se ntlnesc valori mai mari dect x, acestea se trec n x. DI: vectorul a VL: contorul i DE: variabila x START

citete: n,(ai ) 1 i n

x a1

i2

da in da ai x ai x< nu nu

ii+1 scrie: x

STOP Tem. Realizai o schem logic pentru calculul minimului a n numere i alta care s determine simultan minimul i maximul a n numere.

88

Problema 17 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale. S se afle: n variabila x numrul elementelor pozitive, n variabila y numrul elementelor nule i n variabila z numrul elementelor negative ale vectorului a. Rezolvare: DI: vectorul a VL: contorul i DE: contorii x, y, z START

citete: n, (ai ) 1 i n

x0 y0 z0

i1

da

in nu

da

ai 0 nu

nu

da 0 y y+1

ai =

x x+1

zz+1

ii+1

scrie: x, y, z

STOP 89

Problema 18 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale. Se d variabila x real. S se afle, n variabila c, de cte ori apare x n vectorul a. Rezolvare: Variabila c se iniializeaz cu 0, deoarece exist cazuri n care ea rmne 0 i dup ncheierea algoritmului (cazurile n care x nu apare deloc n vectorul a). Se parcurge vectorul a, iar contorul c se actualizeaz (prin adugarea unei uniti) ori de cte ori se gsete n a un element egal cu x. DI: vectorul a, variabila x. VL: contorul i. DE: contorul c START

citete: x, n, (ai ) 1 i n

c0

i1

da

in nu

da

ai = x

nu

c c+1

ii+1

scrie: c

STOP

90

Problema 19 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale, sortat cresctor. Se d x, un numr real. Fr a testa toate elementele vectorului, s se afle poziia pe care apare x n vector. Dac nu apare, s se scrie un mesaj corespunztor. Rezolvare: Metoda folosit se numete cutarea binar. Se noteaz cu li (limita inferioar) i ls (limita superioar) poziiile ntre care se caut valoarea x (iniial li=1 i ls=n). Comparndu-se x cu elementul aflat la egal distan de li i ls, se poate afla n ce jumtate a intervalului [li,ls] sunt anse s fie x; se actualizeaz li sau ls corespunztor, apoi se repet procedeul pn la gsirea lui x sau pn cnd li>ls. START DI: vectorul a, variabila x VL: variabilele li,ls DE: variabila m citete: x, n, (ai ) 1 i n x > an sau x < a1 nu

da

scrie: x,nu este n ir

li 1 ls n m [(li+ls)/2]

da i

x am li ls

da

x> am

nu

nu

li m + 1

ls m - 1

m [(li+ls)/2] da scrie: x,este pe poziia, m x= am nu

scrie: x,nu este n ir

STOP 91

Problema 20 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale. S se ordoneze cresctor acest vector. Rezolvare: Soluia I. Metoda folosit se numete sortare prin metoda bulelor (bubble-sort) i const n parcurgerea repetat a vectorului n scopul comparrii elementului curent cu urmtorul i interschimbarea acestora cnd este cazul. Pentru ca algoritmul s se opreasc, vom folosi un contor k. Acesta numr cte interschimbri facem la fiecare parcurgere. Cnd ajungem la sfritul vectorului i k a rmas 0, nseamn c vectorul este sortat. DI: vectorul a VL: contorii i,k; START variabila aux DE: vectorul a citete: n,(ai ) 1 i n

k0

i1 da i n -1 da ai+1 < ai nu nu

aux ai ai ai+1 ai+1 aux kk+1

ii+1

nu k=0 da scrie: (ai ) 1 i n 92 STOP

Soluia II. Metoda folosit se numete sortare prin selecie direct. Pentru fiecare poziie i, de la prima pn la penultima, se aduce minimul elementelor a[i], a[i+1], , a[n] pe locul i, i acel numr va rmne definitiv acolo. Aducerea minimului se face prin compararea lui a[i] cu toate elementele de dup el i interschimbarea valorilor de fiecare dat cnd se gsete un numr mai mic dect a[i]. Este necesar o variabil auxiliar (aux) pentru interschimbarea variabilelor, atunci cnd este cazul. START DI: vectorul a VL: contorii i, j, variabila aux DE: vectorul a citete: n,(ai ) 1 i n

i1

da

in -1

ji+1 nu da da aj < ai aux ai ai aj aj aux nu

jn nu

jj+1

ii+1

scrie: (ai ) 1 i n 93 STOP

Soluia III. Metoda folosit se numete sortare prin numrare. Se folosete un vector auxiliar k = (ki) 1 i n, ki reprezint numrul elementelor vectorului a care sunt mai mici dect ai. Se folosete un vector de ieire b n care se descarc elementele lui a astfel: deoarece sunt k i elemente mai mici dect ai, ai ocup poziia ki +1. DI: vectorul a VL: contorii i, j, vectorul k DE: vectorul b START

citete: n,(ai ) 1 i n

i1 da in ki 0 nu

ii+1

i1

da

i n-1

ji+1 nu da da ai < aj kj kj + 1 nu ki ki + 1 nu

jn

jj+1

i 94 i + 1 1

i1 da in ai nu

ii+1

scrie: (bi ) 1 i n

STOP

95

Problema 21 Se d vectorul a = (ai ) 1 i n (n 10), cu elemente reale. S se transforme vectorul, astfel nct ordinea elementelor s fie: an, an-1, a2, a1. Rezolvare: Este necesar o variabil auxiliar (aux) pentru interschimbarea variabilelor egal deprtate de capete. Operaiunea se execut numai pn la jumtatea vectorului, calculat cu expresia [n/2]. DI: vectorul a VL: contorul i, variabila aux DE: vectorul a

START

citete: n, (ai ) 1 i n

i1

da aux ai ai an-i+1 an-i+1 aux

i [n/2]

nu

ii+1

scrie: (ai ) 1 i n

STOP

Exemple. 1. Pentru vectorul a = (1 5 3 7 2), unde n=5, deci impar, se vor interschimba 1 cu 2 i 5 cu 7, iar a3 rmne pe loc ([5/2]=2). Rezult a = (2 7 3 5 1). 2. Pentru vectorul a = (10 4 2 9), unde n = 4, deci par, exist exact [4/2]=2 perechi ale cror elemente i schimb locul. Rezult a = (9 2 4 10).

96

Problema 22 Se dau coeficienii reali ai unui polinom de gradul n (n 10): a0 , a1,an-1,an. Se d x real. S se afle (n variabila p) valoarea n punctul x a polinomului P(X)= anXn+ an-1Xn-1++a1X+a0. Rezolvare: Soluia I Se folosete scrierea: P(X)=(((anX+ an-1)X+ an-2)X+ a1)X+a0 Exemplu: 3X4-5X3+2X2+9X-5=(((3X-5)X+2)X+9)X-5

97

citete: x, n, (ai ) 0 i n

p an

i1

in p p*x + an-i

ii+1

DI: vectorul a, variabila x VL: contorul i DE: variabila p START

da

nu

98

START scrie: p citete: x, n, (ai ) 0 i n

STOP

p a0

e0 1

i1 Soluia II Se folosete un vector auxiliar e = (ei) 0 i n , calculat cu relaia de recuren ei = ei-1x, e0 =1 (de fapt ei este xi). da DI: vectorul a, variabila x in VL: contorul i, vectorul e DE: variabila p ei x*ei - 1 nu

p p + ei*ai

ii+1

99

scrie: p nu STOP

Observaie. Aceast soluie folosete vectorul suplimentar e care nu realizeaz nici o mbuntire a algoritmului (dimpotriv, l lungete). Soluia I este mai bun dect Soluia II. Soluia III Se folosete variabila auxiliar putere, n care la pasul i se calculeaz xi. Variabila se iniializeaz cu 1 i la fiecare pas valoarea sa se nmulete cu x. DI: vectorul a, variabila x VL: contorul i, variabila putere DE: variabila p

START

citete: x, n, (ai ) 0 i n

p a0 100 putere 1 scrie: n i da p i **1 p puterei p +xa+ putere iSTOP nu i putere 1

Problema 23 Se d o matrice ptratic A = (ai j) 1 i n ,1 j n cu elemente reale (n 10). S se afle, n variabila x, suma elementelor de pe diagonala principal. Rezolvare: Aceast sum este a11 + a22 ++ ann DI: matricea A VL: contorul i DE: variabila x

START

citete: n,(ai j) 1 i n ,1 j n

x0

i1

da 101 x x + ai i ii+1

in

scrie: STOP x

nu

START

citete: n,(ai j) 1 i n ,1 j n

i2

da

j1 nu da
1 i n ,1 j n

Problema 24 Se d o matrice ptratic A = (ai j) singur variabil auxiliar, aux.

ji1 S se transpun matricea folosind o (n 10).

aux ai j ai j aj i Rezolvare: nu Variabila auxiliar (aux) este necesar ipentru a realiza interschimbarea elementelor ai j i aj i . aj aux DI: matricea A VL: contorii i, j, variabila aux DE: matricea A jj+1

ii+1 102 scrie: (ai j) 1 i n ,1 j n

STOP

in

START citete: n,m,(ai j) 1 i n ,1 j m (bj ) 1 j m x0

i1 da i n y0 j1 da j Problema 25 m 10, m 10). Se d un vector b = Se d o matrice A = (ai j) da i n ,1 j m cu elemente reale (n 1 (bj ) 1 j m, cu elemente reale. S se afle dac b este una din liniile lui A. nu nu ai j = Rezolvare: b Se folosete o variabil indicator x. j Ea se iniializeaz cu y +1 modificat dac n y 0 i este timpul parcurgerii matricei A se gsesc toate elementele unei linii din A, egale cu cele corespondente din b. Pentru fiecare linie se numr n y elementele corespondente egale. Dac y este m la sfritul parcurgerii unei linii, nseamn c j j + 1da toate cele m elemente sunt identice cu cele din nu y= vectorul b. m DI: matricea A,vectorul b VL: contorii i, j, y, variabila indicator x x1 103 ii+1 1 nu

DE: -

1 da x=0 scrie: b nu este linie n A nu scrie: b este linie n A

STOP 104

Tem. Scriei un algoritm care se oprete imediat dup gsirea primei linii din A, egale cu vectorul b (dac exist o astfel de linie). Algoritmul s fie de tip structurat.

START citete: n,m,p, (ai k) 1 i n ,1 k m (bk j) 1 k m ,1 j p i1

da

in

j 1 nu da ci j 0 nu k1 Problema 26 Se dau dou matrice Ada (ai k) 1 i k,1 k m i B = (bk j) 1 k m ,1 j p cu elemente reale = n (n 10, m 10, p 10). S se afle m matricea C = (ci j) 1 i n ,1 j p , C = A B. Rezolvare: c c + ai k* bk j DI: matricelei jA,B i j VL: contorii i, j, k DE: matricea C kk+1

jp

nu

jj+1 ii+1

105

scrie: (ci j) 1 i n ,1 j p

STOP

Problema 27 Se d o matrice ptratic A = (ai j) 1 i n ,1 j n cu elemente reale (n 10). S se afle dac A este simetric fa de diagonala principal. START Rezolvare: Se folosete o variabil indicator x. Ea se iniializeaz cu 0 i este modificat dac n timpul parcurgerii citete: matricei A se gsesc elemente n,(ai j) 1 i n ,1 j n simetrice neegale. DI: matricea A VL: contorii i, j, variabila indicator x x0 DE: i1 106

da

in1 nu

ji+1

da

jn nu

da
i

ai j aj

nu

x1

jj+1 ii+1

da x=0 scrie: A este simetric

nu

scrie: A este nesimetric

STOP

5.5. Pseudocod
Ca o alternativ la etapa de desenare a schemelor logice, unii programatori prefer descrierea algoritmului prin pseudocod. Acesta este un limbaj simbolic, situat ntre limbajul natural (limba utilizat n comunicarea obinuit ntre oameni, de exemplu limba englez, francez sau romn) i limbajul de programare, obinut prin introducerea unor reguli specifice limbajelor de programare n limbajul natural. Avantajul pseudocodului fa de schema logic este economia timpului necesar executrii desenelor i ncadrrii lor n pagin. Dezavantajul este nelegerea mai dificil a evoluiei proceselor, pentru c este necesar o atenie mai mare n urmrirea ordinii lor. De exemplu, pentru algoritmii genetici (a se vedea 6.3), pseudocodul este foarte simplu: i := 0 initpopulation P(0) evaluate P(0) seteaz numrul generaiilor la 0 iniializeaz n mod aleator o populaie de indivizi se atribuie o msur fiecrui individ din populaie 107

while (not done) do i := i + 1 select P(i) from P(i-1) recombine P(i) mutate P(i)

ct timp condiia de oprire nu este satisfcut, se va realiza succesiunea de operaii descris dup do crete cu o unitate numrul generaiilor selecteaz o subpopulaie pentru reproducie realizeaz recombinarea genelor prinilor selectai n P(i) realizeaz mutaii n P(i)

Pentru algoritmii matematici uzuali, limbajul pseudocod folosete urmtoarele propoziii standard: Atribuire se calculeaz valoarea membrului drept; variabila v primete valoarea calculat prin expresie Intrare / ieire orice operaie a unui dispozitiv de intrare/ieire Terminal nceputul, respectiv sfritul unui program

v := expresie read lista write lista algorithm nume stop

Expresie desemneaz o expresie valid (aritmetic sau logic). Se determin valoarea acestei expresii. Variabilei aflate n membrul stng i se atribuie valoarea calculat. Observm aici diferena ntre egalitatea matematic v = expresie (care este o propoziie adevrat sau fals) i atribuirea din informatic v := expresie, care indic o dubl aciune: calculul expresiei i asignarea (atribuirea) valorii obinute variabilei v. Exemple: x := b*b-4*a*c a :=(x1+x2)*(y1+y2) Lista desemneaz o list de variabile care se vor citi sau se vor scrie. Separatorul obiectelor din list este caracterul , (virgul). Exemple: read x,y,t,s write ai Nume precizeaz numele pe care utilizatorul dorete s l dea algoritmului descris. Exemplu: algorithm produs Structurile utilizate n pseudocod sunt: structura liniar, structurile alternative, structurile repetitive. Structura liniar Prelucrrile sunt executate n ordinea scris. Avantajul folosirii acestei structuri este c toate prelucrrile "strnse" ntr-o astfel de structur sunt percepute ca o singur entitate. Acolo unde sintaxa limbajului nu permite dect o instruciune, dar sunt necesare mai multe prelucrri, acestea sunt incluse ntr-o astfel de structur. begin prelucrare_1 prelucrare_2 . . prelucrare_n end

Structurile alternative - Structura alternativ binar if conditie Este testat condiia nscris. Dac este then prelucrare_1 adevrat, atunci se execut prelucrare_1. else prelucrare_2 Dac nu, atunci se execut prelucrare_2. n endif ambele cazuri se continu cu prelucrarea de dup endif. Este posibil ca una din prelucrri s lipseasc (n una din alternative nu este necesar nici o prelucrare). Se obine structura pseudoalternativ (structura alternativ cu ramur vid). 108

- Structura alternativ generalizat Alegerea urmtoarei prelucrri se face n funcie de valoarea variabilei v, numit selector. Dac v este egal cu v1, atunci se execut prelucrare_1; dac v este egal cu v2, atunci se execut prelucrare_2 i aa mai departe. n toate cazurile se continu cu prelucrarea de dup endselect.

select v from v1 : prelucrare_1 v2 : prelucrare_2 . . vn : prelucrare_n endselect

Structurile repetitive while condiie - Structura repetitiv de tip "while" do prelucrare Se testeaz condiia nscris. Dac este endwhile adevrat, atunci se execut prelucrare. Apoi se reiau paii de mai sus, care se repet pn cnd condiie devine fals. n acest moment se prsete structura i se continu cu prelucrarea de dup endwhile. - Structura repetitiv de tip "repeat" repeat prelucrare Se execut prelucrare. Se testeaz condiia until condiie endrepeat nscris. Dac este fals, atunci se reiau paii de mai sus, care se repet pn cnd condiie devine adevrat. n acest moment se prsete structura i se continu cu prelucrarea de dup endrepeat. - Structura repetitiv de tip "for" Este o structur controlat de o variabil v numit for v := vi, vf, p contor. Contorul se iniializeaz cu valoarea iniial do prelucrare vi. Se testeaz dac v nu depete valoarea final endfor vf. Dac nu, atunci se execut prelucrare i v crete cu valoarea p a pasului. Se reia testul de depire a domeniului (domeniul lui v este intervalul [vi, vf]). n momentul depirii domeniului, se prsete structura i se continu cu prelucrarea de dup endfor. Exemplul 1. Secvena pseudocod care realizeaz citirea a dou variabile reale a i b i scrierea variabilei x, calculat astfel: x = -b/a dac a este nenul, sau x = b7 dac a=0. algorithm calcul begin read a,b if a=0 then x:=b7 else x:=-b/a endif write x end Exemplul 2. Secvena pseudocod pentru rezolvarea ecuaiei de gradul al II-lea: algorithm ecuatie begin read a,b,c if a=0 then if b=0 then if c=0 then write 'identitate' else write 'imposibil' endif else begin x:=-c/b write 'solutie unica',x end endif else begin d:=b*b-4*a*c 109

endif end

if d>0 then begin x1:=(-b+ d)/(2*a) x2:=(-b- d)/(2*a) write x1,x2 end else if d=0 then begin x:=-b/(2*a) write 'solutie dubla',x end else write 'ecuatia nu are soluii reale' endif endif end

Exemplul 3. Secvena pseudocod pentru sortarea unui vector folosind metoda seleciei directe: algorithm sortare begin read n for i:=1,n,1 do read a[i] endfor for i:=1,n-1,1 do for j:=i+1,n,1 do if a[i]>a[j] then begin aux:=a[i] a[i]:=a[j] a[j]:=aux end endif endfor endfor for i:=1,n,1 do write a[i] endfor end Pentru a uura citirea, se decaleaz spre dreapta prelucrrile ce compun structuri de rang superior. Cnd sunt necesare cel puin dou prelucrri acolo unde sintaxa structurii nu permite dect una, cele dou se introduc ntr-o structur liniar (begin end).

110