Sunteți pe pagina 1din 14

Algoritmi si structuri de date (14.10.

2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

EVALUARE: - lucrare scris din partea de Algoritmi (~ n s pt mna a 8-a) => nota1 - lucrare scris din partea de Structuri de date (n sesiunea de iarn ) => nota2 - teme pentru acas => nota_teme Nota final (calculat doar dac nota1#5 $i nota2#5): 40%*nota1 + 40%*nota2 + 20%*nota_teme. BIBLIOGRAFIE (partea de Algoritmi): 1. Donald Knuth, Arta program rii calculatoarelor, vol.1 Algoritmi fundamentali, Editura Teora, 1999 (traducere). 2. Donald Knuth, Arta program rii calculatoarelor, vol.2 Algoritmi seminumerici, Editura Teora, 2000 (traducere). 3. T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introducere n algoritmi, Editura Libris Agora, 2001 (traducere). 4. Leon Livovshi, Horia Georgescu, Sinteza #i analiza algoritmilor, Editura 'tiintific $i enciclopedic , 1986. 5. R. Andonie, I. Gabarcea, Algoritmi fundamentali. O perspectiva C++, Editura Libris, 1995. 6. Doina Logof tu, Algoritmi fundamentali n C++. Aplica&ii, Editura Polirom, 2007. 7. Marin Popa, Mariana Popa, Elemente de algoritmi #i limbaje de programare, Editura Universit )ii din Bucure$ti, 2005. 8. Octavian P tr $coiu, Gheorghe Marian, Nicolae Mitroi, Elemente de grafuri, combinatoric , metode, algoritmi #i programe, Editura All, Bucure$ti, 1994. 9. Gheorghe Barbu, Ion V duva, Mircea Bolo$teanu, Bazele Informaticii, Editura Tehnic , Bucure$ti, 1997. 10. Viorel P un, Algoritmic #i programarea calculatoarelor. Limbajul C++. Editura Universit )ii din Pite$ti, 2003. 11. Ghe. Barbu, Viorel P un, Calculatoare personale #i programare n C/C++, Editura Didactic $i Pedagogic , Bucure$ti, 2005. 12. Iorga, V., Chiri !, P., Stratan, C., Opincaru, C., Programare n C/C++. Culegere de probleme. Editura Niculescu, Bucure$ti, 2003. 13. B. P tru), Aplica&ii n C #i C++, Editura Teora, 2000. 14. D.H. Logof tu, C++. Probleme rezolvate #i algoritmi, Editura Polirom, 2001. 15. O. Catrina, Iuliana Cojocaru, Turbo C++, Editura Teora, 1993. 16. V. Petrovici, F. Goicea, Programare n limbajul C, Editura Tehnic , 1993. 17. V. Cristea, C.Giumale, E. Kalisz, A. P noiu, Limbajul C standard, Editura Teora, 1992.

ALGORITMI. METODE DE DESCRIERE A ALGORITMILOR 1.1 Scurt istoric n secolul al IX-lea d.Hr., un matematician persan, Abu Abdullah Muhammed bin Musa al-Khwarizmi a scris o lucrare despre efectuarea calculelor numerice ntr-o manier algebric , Liber algorithmi, unde algorithm provine de la al-Khwarizmi ceea ce nseamn din ora$ul Kwarizm, azi ora$ul Kiwa din Uzbechistan. Acest autor, ca $i al)i matematicieni ai evului mediu n)elegeau prin algoritm o regul pe baz c reia se pot efectua calcule matematice.

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

Mult vreme conceptul de algoritm r mne cu o ntrebuin)are destul de restrns chiar $i n matematic . C tre sfr$itul secolului al XIX-lea (1886-1888) Kronecker $i Dedekind introduc n matematic func)iile recursive n care conceptul de algoritm este strns legat de cel de recursivitate. Abia n secolul XX, n deceniile 3 $i 4, prin lucr rile matematicienilor Skolem, Ackerman, Sudan, Gdel, Church, Kleene, Turing $i al)ii, teoria algoritmilor $i recursivit )ii se constituie ca atare. Ast zi, ca rezultat al conexiunii dintre algoritm $i calculator, gndirea algoritmic s-a transformat dintr-un instrument matematic particular, ntr-o modalitate fundamental de abordare a problemelor din diverse domenii, folosit pentru a descrie ntr-o manier ordonat activit )i care constau n parcurgerea unei succesiuni de pa$i (cum este de exemplu utilizarea unui telefon public sau realizarea unei re)ete gastronomice). Algoritmul este considerat no)iunea fundamental a informaticii. n informatic!, prin algoritm se poate n elege o metod! prin care se descriu pa$ii necesari pentru rezolvarea unei clase de probleme, metod! care se poate implementa pe calculator prin intermediul unui limbaj de programare. Defini&ii alternative n linii mari, despre un algoritm se pot afirma urm toarele: Un algoritm este o mul)ime de reguli ce se pot aplica n cadrul procesului de construc)ie a solu)iei $i pot fi executate fi de mn , fie de o ma$in . Un algoritm este o secven) de pa$i care transform mul)imea datelor de intrare n datele de ie$ire (rezultatele dorite). Un algoritm este o secven) de opera)ii executate cu date ce trebuie organizate n structuri de date. Un algoritm este abstractizarea unui program care trebuie executat pe o ma$in fizic (model de calcul). Un algoritm pentru o problem dat este o mul)ime de instruc)iuni care garanteaz g sirea unei solu)ii corecte pentru orice instan) a problemei, ntr-un num r finit de pa$i. 1.2 Generalit! i despre algoritmi n matematic exist o serie de algoritmi: cel al rezolv rii ecua)iei de gradul doi, algoritmul lui Eratostene (pentru generarea numerelor prime mai mici dect o anumit valoare), schema lui Horner (pentru determinarea ctului $i restului mp r)irii unui polinom la un binom), etc. Solu ia problemei se ob ine prin execu ia algoritmului. Algoritmul poate fi executat pe o ma$in! formal! (n faza de proiectare $i analiz ) sau pe o ma$in! fizic! (calculator) dup ce a fost codificat ntr-un limbaj de programare. Spre deosebire de un program, care depinde de un limbaj de programare, un algoritm este o entitate matematic care este independent de ma$ina pe care va fi executat. Studiul algoritmilor presupune: Elaborarea algoritmilor. Are ca scop identificarea unei solu)ii de rezolvare a problemei practice. Exprimarea algoritmilor. Presupune prezentarea algoritmilor ntr-un limbaj abstract, bine definit, astfel nct s avem o form clar $i concis a solu)iei identificate. Algoritmii pot fi exprima)i $i n limbaje de programare. Validarea #i analiza algoritmilor. nseamn revizuirea algoritmilor pentru a vedea dac ntr-adev r, acestia produc rezultatele dorite pentru problema analizat $i identificarea eficien)ei acestor algoritmi Testarea algoritmilor. Presupune rularea programelor aferente algoritmilor $i depanarea acestora. 2

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

Un algoritm trebuie s posede urm toarele propriet! i: Finitudine. Un algoritm trebuie s admit o descriere finit $i fiecare dintre prelucr rile pe care le con)ine trebuie s poate fi executat n timp finit. Prin intermediul algoritmilor nu pot fi prelucrate structuri infinite. Corectitudinea. Este proprietatea algoritmului de a furniza o solu)ie corect a problemei date. Generalitate. Un algoritm destinat rezolv rii unei (clase de) probleme trebuie s permit ob)inerea rezultatului pentru orice date de intrare $i nu numai pentru date particulare de intrare. Rigurozitate / claritate. Pa$ii algoritmului trebuie specifica)i riguros, f r ambiguit )i. n orice etap a execu)iei algoritmului trebuie s se $tie exact care este urm toarea etap ce va fi executat . Eficien a. Algoritmii pot fi efectiv utiliza)i doar dac folosesc resurse de calcul n volum acceptabil. Prin resurse de calcul se n)elege volumul de memorie $i timpul necesar pentru execu)ie. Exemple: 1. Nu orice problem poate fi rezolvat algoritmic. Consider m un num r natural n $i urm toarele dou probleme: (i) s se construiasc mul)imea divizorilor lui n; (ii) s se construiasc mul)imea multiplilor lui n. Pentru rezolvarea primei probleme se poate elabora u$or un algoritm, n schimb pentru a doua problem nu se poate scrie un algoritm atta timp ct nu se cunoa$te un criteriu de oprire a prelucr rilor. 2. Un algoritm trebuie s func&ioneze pentru orice date de intrare. S consider m problema ordon rii cresc toare a $irului de valori: (2 1 4 3 5). O modalitate de ordonare ar fi urm toarea: se compar primul element cu al doilea, iar dac nu se afl n ordinea bun se interschimb , adic $i schimb locul (n felul acesta se ob)ine (1 2 4 3 5)); pentru $irul astfel transformat se compar al doilea element cu al treilea $i dac nu se afl n ordinea dorit se interschimb (la aceast etap $irul r mne neschimbat); se continu procedeul pn penultimul element se compar cu ultimul. n felul acesta se ob)ine (1 2 3 4 5). De$i metoda descris mai sus a permis ordonarea cresc toare a $irului (2 1 4 3 5) ea nu poate fi considerat un algoritm de sortare ntruct dac este aplicat $irului (3 2 1 4 5) conduce la (2 1 3 4 5). 3. Un algoritm trebuie s se opreasc . Se consider urm toarea secven) de prelucr ri: Pas 1. Atribuie variabilei x valoarea 1; Pas 2. M re$te valoarea lui x cu 2; Pas 3. Dac x este egal cu 100 atunci se opre$te prelucrarea, altfel se reia de la Pas 2. Este u$or de observat c x nu va lua niciodat valoarea 100, deci succesiunea de prelucr ri nu se termin niciodat . Din acest motiv nu poate fi considerat un algoritm corect. 4. Prelucr rile dintr-un algoritm trebuie s fie neambigue. Consider m urm toarea secven) de prelucr ri: Pas 1. Atribuie variabilei x valoarea 0; Pas 2. Fie se m re$te x cu 1 fie se mic$oreaz x cu 1; Pas 3. Dac 10 * x * 10 se reia de la Pasul 2, altfel se opre$te algoritmul. Att timp ct nu se stabile$te un criteriu dup care se decide dac x se m re$te sau se mic$oreaz secven)a de mai sus nu poate fi considerat un algoritm. Ambiguitatea poate fi evitat prin utilizarea unui limbaj riguros de descriere a algoritmilor. S consider m c Pas 2 anterior se nlocuie$te cu: Pas 2. Se arunc o moned . Dac se ob)ine cap se m re$te x cu 1, iar dac se ob)ine pajur se mic$oreaz x cu 1;

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

n acest caz specificarea prelucr rilor nu mai este ambigu chiar dac la execu)ii diferite se ob)in rezultate diferite. Ce se poate spune despre finitudinea acestui algoritm? Dac s-ar ob)ine alternativ cap respectiv pajur , prelucrarea ar putea fi infinit . Exist ns $i posibilitatea s se ob)in de 11 ori la rnd cap (sau pajur ), caz n care procesul s-ar opri dup 11 repet ri ale pasului 2. Att timp ct $ansa ca algoritmul s se termine este nenul algoritmul poate fi considerat corect (n cazul prezentat mai sus este vorba despre un algoritm aleator). 5. Un algoritm trebuie s se opreasc dup un interval rezonabil de timp. S consider m c rezolvarea unei probleme implic prelucrarea a n date $i c num rul de prelucr ri T(n) depinde de n. Presupunem c timpul de execu)ie a unei prelucr ri este 103 s $i c problema are dimensiunea n = 100. Dac se folose$te un algoritm caracterizat prin T(n) = n atunci timpul de execu)ie va fi 100103 = 101 secunde. Dac , ns se folose$te un algoritm caracterizat prin T(n) = 2n atunci timpul de execu)ie va fi de aproximativ 1019 ani. Algoritmii pot fi descri$i (reprezenta&i) n mai multe moduri, folosind: schema logic , care constituie un mod sugestiv (intuitiv) de reprezentare a unui algoritm, utiliznd simboluri cu o semnifica)ie bine precizat ; pseudocod, care se remarc prin simplitatea $i naturale)ea sa, fiind de asemenea un limbaj cu reguli sintactice foarte simple ce permit exprimarea neambigu a ordinii de execu)ie a pa$ilor, etc. un limbaj de programare ca Pascal, C/C++, Java, etc.

ns un algoritm poate fi reprezentat n orice limbaj, pornind de la limbajul natural pn la limbajul de asamblare al unui calculator specific. De altfel, limbajele de programare pot fi considerate exemple de limbaje algoritmice.

1.3 Descrierea algoritmilor folosind pseudocodul Pseudocodul reprezint o nota)ie textual ce permite exprimarea logicii programelor ntr-un mod oarecum formalizat f r a fi necesare totu$i reguli de sintax riguroase ca n limbajele de programare. Nu exist nici o definire formal sau unic a formei pe care trebuie s o aib un pseudocod. n principiu, n orice pseudocod se folosesc dou tipuri de propozi)ii: a) propozi&ii standard prin care se exprim opera)ii ce pot fi transcrise direct ntr-un limbaj de programare, fiecare propozi)ie ncepnd cu un verb care exprim ct mai fidel opera)ia descris ; b) propozi&ii nestandard prin care se exprim opera)ii ce urmeaz a fi detaliate ulterior, de exemplu: * se citesc datele de intrare * se afi$eaz meniul pe ecran unde caracterul * este folosit pentru a marca nceputul propozi)iilor de acest tip. n continuare prezent m un exemplu de pseudocod pe care-l vom folosi mai departe $i echivalentele n C/C++. Opera)iile standard ale pseudocodului sunt descrise mai jos. 1. Comanda de citire. Citirea const n transferul de valori de pe mediul de intrare n loca)iile de memorie ale calculatorului $i are sintaxa:
Pseudocod: C: C++: citeste lista_de_variabile int scanf(control, par1, par2, ); cin>>var1>>var2;

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

unde control: con)ine texte $i specificatori de format, par1, par2, reprezint adresele receptoare ale datelor (adrese de variabile), iar var1, var2, reprezint variabilele n care se memoreaz datele de intrare. 2. Comanda de scriere. Scrierea sau afi$area const n transferul valorii unor variabile din memorie pe mediul de ie$ire, sau valoarea unor expresii $i are forma:
Pseudocod: C: C++: scrie lista_de_expresii int printf(control, par1, par2, ); cout<<var1<<var2;

unde control reprezint un $ir de caractere care con)ine textul de afi$at $i specificatori de format, par1, par2, sunt expresiile, valorile care se scriu conform specificatorilor de format prezenti n parametrul de control. 3. Comanda de atribuire. Opera)ia de atribuire const n calculul unei expresii $i asocierea acestei valori unei variabile, conform sintaxei:
Pseudocod: C/C++: variabila expresie variabila = expresie;

4. Secven&a. Secven)a desemneaz un grup de comenzi scrise una dup alta, executate secven)ial $i delimitate grafic. Efectul execu)iei unei comenzi dintr-o secven) depinde de pozi)ia sa. Sintaxa acestor secven)e este:
Pseudocod: comanda1 comanda2 ... comandan C/C++: { comanda1 comanda2 ... comandan
}

5. Decizia este o comanda ce specific alternative. Sintaxa comenzii este:


Pseudocod: daca conditie atunci secventa1 altfel secventa2 C/C++: if (conditie) secventa1; else secventa2;

alegerea pentru execu)ie a uneia dintre dou

A secven)a 1

condi)ie

F secven)a 2

unde conditie poate fi o variabil logic , o expresie rela)ional sau logic . Modul de execu)ie al deciziei este urm torul: se evalueaz condi)ia $i dac este adev rat se execut secventa1, n caz contrar se execut secventa2. n cazul n care cuvntul altfel lipse$te, se folose$te forma simplificat : 5

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1 Pseudocod: daca conditie atunci secventa C/C++: if (conditie) secventa;

ASD_01

condi)ie

secven)a

6. Selec&ia reprezint o extindere a opera)iei de decizie, permi)nd alegerea unei variante din mai multe posibile. Forma general este:
Pseudocod: alege expresie dintre c1: secventa1 c2: secventa2 ........... cn: secventan rest: secventan+1 C/C++: switch (expresie) { case c1: secventa1; <break;> case c2: secventa2; <break;> ... case cn: secventan; <break;> <default: secventan+1;> }

unde c1, c2, , cn se numesc etichete $i se folosesc la identificarea secven)elor. Eticheta rest $i secventan+1 sunt op)ionale. Modul de execu)ie este urm torul: se evalueaz expresia; se caut eticheta avnd valoarea egal cu valoarea expresiei $i este selectat secven)a corespunz toare; dac nici o etichet nu are valoarea expresiei, atunci este selectat secventan+1; se execut secven)a selectat dup care se trece la comanda urm toare selec)iei. Break poate lipsi. n cazul n care acesta lipse$te, se vor executa toate instruc)iunile care urmeaz dup selec)ia corespunz toare n jos. Default poate lipsi. 7. Cicluri #i itera&ii. n rezolvarea problemelor apare deseori situa)ia n care o anumit secven) urmeaz a se relua de mai multe ori; o astfel de combina)ie se nume$te ciclu. Pentru reprezentarea ei se folose$te o comand de ciclare ce specific att grupul de instruc)iuni ce se repet ct $i condi)ia de repetare. Exist trei tipuri de cicluri: ciclul cu test final, ciclul cu test ini)ial $i ciclul cu contor. 7.1 Ciclul cu test final. Testul pentru repetarea calculelor se face dup execu)ia grupului de comenzi care trebuie repetate. n pseudocod, dac condi)ia nu este ndeplinit (fals ) se reia execu)ia secven)ei, iar dac condi)ia este ndeplinit se trece la comanda urm toare ciclului cu test final. n C, dac condi)ia este nenul (adev rat ) se reia execu)ia secven)ei, iar dac condi)ia este nul se reia ciclul do-while. Sintaxa comenzii este:
secven)
Pseudocod: repeta secventa cat_timp conditie

condi)ie A

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1 C/C++: do secventa while (conditie);

ASD_01

7.2 Ciclul cu test ini&ial. Testul pentru reprezentarea calculelor se face naintea execu)iei grupului de comenzi care trebuie repetate. Dac condi)ia este ndeplinit , se execut secven)a dup care se reevalueaz condi)ia, iar dac condi)ia nu este ndeplinit , se trece la comanda urm toare ciclului cu test ini)ial. Acest tip de ciclu are avantajul c secven)a nu se execut nici o dat dac condi)ia este fals de la nceput. Sintaxa comenzii este: F Pseudocod: condi)ie
cat_timp conditie repeta secventa

C/C++: while (conditie) secventa;

A secven)

7.3 Ciclul cu contor. Ciclul cu contor realizeaz repetarea unei secven)e de un num r de ori prestabilit, controlat de o variabil de ciclare numit contor. Sintaxa comenzii este:
Pseudocod: pentru i=vi,vf,pas repeta secventa C/C++: for(i=vi;i<=vf;i+=pas) secventa; i = vi

F i<=vf unde: - i este variabila de contorizare; A - pas este pasul cu care se face incrementarea; secven) - vi, vf sunt valorile initiale $i finale ale contorului. Modul de execu)ie este urm torul: i=i+pas 1. se atribuie i + vi; 2. se evalueaz condi)ia i > vf; dac condi)ia nu este ndeplinit se trece la pasul 3, altfel se trece la pasul 5; 3. se execut secven)a; 4. se atribuie i + i + pas $i se trece la pasul 2; 5. se execut comanda urm toare ciclului cu contor. Func)ionarea algoritmului a fost descris pentru valori pozitive ale lui pas; dac pas este o valoare negativ , la pasul 2 se evalueaz condi)ia i < vf. 8. Comanda de ie#ire. Aceasta comand are rolul de a asigura terminarea for)at a unui ciclu. Sintaxa sa este: Pseudocod: iesire
C/C++: exit(parametru);

9. Comanda goto. Aceasta comand permite transferul explicit al execu)iei la o instruc)iune care are o anumit etichet . Sintaxa sa este:
Pseudocod: C/C++: goto eticheta goto (numar_eticheta);

10. Proceduri #i func&ii. n rezolvarea problemelor apar situa)ii n care por)iuni de program similare se ntlnesc n diferite zone ale programului. Grupul de comenzi care se repet poate constitui o unitate distinct c reia i se d un nume $i un set de parametri. Ori de cte ori va fi 7

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

necesar execu)ia acestui grup de comenzi se specific numele $i parametrii care actualizeaz grupul de comenzi n noile condi)ii. Grupul de comenzi se nume$te subprogram. Subprogramul poate fi procedur sau func)ie. 11.1 Procedura. Procedura specific secven)e de opera)ii care se repet n diferite puncte ale programului $i eviden)iaz parametrii. Forma general a procedurii n pseudocod este:
Pseudocod: procedura nume (lista_parametrilor_formali) este secventa sfarsit C/C++: void nume(lista_parametrilor_formali) { secventa; }

Parametrii care apar n scrierea unei proceduri se numesc parametri formali, ei avnd un rol decriptiv. Apelul unei proceduri se face cu comanda:
Pseudocod: executa nume(lista_parametri_actuali) C: nume (lista_parametri_actuali);

11.2 Func&ia. Atunci cnd procedura calculeaz o singur valoare se poate utiliza un tip particular de procedur numit func)ie. Forma general este:
Pseudocod: functie nume (lista_parametrilor_formali) este secventa sfarsit C/C++: tip nume(lista_parametrilor_formali) { secventa; return valoare_tip; }

Pentru ca utilizarea unei func)ii n cadrul unei expresii s fie ct mai simpl , apelul unei func)ii este considerat ca un operand al expresiei. Forma apelului func)iei este:
Pseudocod: C/C++: nume(lista_parametri_actuali) variabila = nume(lista_parametri_actuali);

Execu)ia unei func)ii intervine atunci cnd la evaluarea unei expresii este necesar valoarea sa. n aceast situa)ie se face transmiterea parametrilor func)iei $i se execut secven)a de opera)ii corespunz toare, g sindu-se astfel valoarea func)iei. Utilizarea procedurilor $i func)iilor se face n urm toarele scopuri: 1. o sec)iune de program utilizat n mai multe puncte ale acestuia poate fi descris o singur dat $i apelat ori de cte ori este nevoie, scurtndu-se dimensiunea programului; 2. proiectarea unor p r)i ale algoritmului se poate face separat, independent una de alta, putndu-se codifica $i testa separat; 3. reprezentarea de sine st t toare a rezolv rii unor subprobleme; 4. construirea unor algoritmi de complexitate mare folosind deja module proiectate $i verificate. Alte elemente de baz! n pseudocod Cuvinte cheie (keywords) sunt cuvintele rezervate pentru comenzile standard $i n curs le-am eviden)iat prin scrierea lor folosind tipul ngro$at. De exemplu: citeste, scrie, daca, atunci, altfel, alege, dintre, rest, repeta, pentru, etc.

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

Identificatori reprezint un $ir de caractere folosit pentru nume de variabile, nume de func&ii, etc. O restric)ie de baz pentru identificatori este s difere de cuvintele cheie. n C/C++, un identificator ncepe ntotdeauna cu o liter (a..z, A..Z) $i apoi se pot folosi cifre, litere $i caracterul _ (underscore). O variabil! este un identificator dat dup dorin) de c tre utilizator unei zone din memorie cu care se va lucra (stoca sau modifica datele utile programului) pe parcursul scrierii algoritmului/codului surs . Numele unei variabile se alege de obicei astfel nct s descrie ce nseamn pentru programator, din punct de vedere al pseudocodului ntr-o form care poate fi prescurtat sau nu, dup preferin) . De exemplu, numele unei variabile ce re)ine o not poate fi: nota_1 sau n1 sau Nota_1, etc. Caracteristicile variabilelor sunt: - fiecare variabil are un nume - fiecare variabil re)ine o valoare sau un set de valori utile pentru algoritm - fiecare variabil va apar)ine unui tip de dat (ntregi, reale, caracter). Tipul unei date determin valorile pe care le poate lua, dimensiunea zonei de memorie ocupate $i modul in care este reprezentat valoare n memorie.

ALGORITMI FUNDAMENTALI

Algoritmi liniari Defini)ie: Algoritmii care pot fi descri$i folosind numai comenzi/instruc)iuni de citire (n pseudocod: citeste), scriere (n pseudocod: scrie) $i atribuire (n pseudocod: ) se numesc algoritmi liniari. Exemple de algoritmi liniari: R1. Enun&ul problemei: S se determine algoritmul pentru nsumarea a dou frac)ii (cu aducere la acela$i numitor ca fiind produsul numitorilor celor dou frac)ii $i simplific ri ulterioare). Metoda de rezolvare: 1 3 14 De exemplu, + = . S not m num r torul, respectiv numitorul primei frac)ii cu a, 2 8 16 respectiv b, apoi num r torul, respectiv numitorul celei de-a doua frac)ii cu c, respectiv d $i n a c e cele din urm , num r torul, respectiv numitorul frac)iei finale cu e, respectiv f: + = , b d f unde e = ad + bc, iar f = bd. Descrierea algoritmului n pseudocod:
citeste a,b,c,d e ad + bc f bd scrie e,f *datele de intrare *num r torul frac#iei finale *numitorul frac#iei finale *datele de ie&ire (frac#ia final )

Descrierea algoritmului n C++: 9

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

#include<iostream.h> //pt cin si cout #include<conio.h> //pt getch void main() { int a,b,c,d,e,f; cout<<endl<<"Dati numaratorul primei fractii: "; cin>>a; cout<<"Dati numitorul primei fractii: "; cin>>b; cout<<"Dati numaratorul celei de-a doua fractii: "; cin>>c; cout<<"Dati numitorul celei de-a doua fractii: "; cin>>d; e = a*d + b*c; f = b*d; cout<<"Numaratorul fractiei finale este: "<<e; cout<<endl<<"Numitorul fractiei finale este: "<<f; //sau //cout<<"Fractia finala este: "<<e<<"/"<<f; getch(); }

Rulare:
Dati numaratorul primei fractii: 1 <Enter> Dati numitorul primei fractii: 2 <Enter> Dati numaratorul celei de-a doua fractii: 3 <Enter> Dati numitorul celei de-a doua fractii: 8 <Enter> Numaratorul fractiei finale este: 14 Numitorul fractiei finale este: 16 sau Dati numaratorul primei fractii: 1 <Enter> Dati numitorul primei fractii: 2 <Enter> Dati numaratorul celei de-a doua fractii: 3 <Enter> Dati numitorul celei de-a doua fractii: 8 <Enter> Fractia finala este: 14/16

Explica&ii cod C++: De remarcat nti c se declar toate variabilele folosite n program (a, b, c, d, e, f), nu doar cele de intrare (care se vor citi, adic a, b, c, d). Se citesc datele de intrare (a, b, c, d) afi$nd nainte cte un mesaj pentru fiecare. Apoi, cu dou instruc)iuni de atribuire se determin valorile num r torului, respectiv numitorului frac)iei finale. Afi$area frac)iei finale se poate face afi$nd valoarea variabilei e, apoi afi$nd efectiv caracterul / (slash) $i n final valoarea variabilei f. R2. Enun&ul problemei: S se descrie un algoritm pentru determinarea ariei unui p trat, cunoscnd lungimea laturii sale. Metoda de rezolvare: Algoritmul const n citirea de la tastatur a lungimii laturii p tratului $i apoi determinarea $i afi$area ariei acestuia (aria = latura2). De exemplu, pentru un p trat cu latura de 4 (unit )i de m sur ), aria este 16. Descrierea algoritmului n pseudocod:
cite te latura aria latura2
scrie aria

Descrierea algoritmului n C++:


#include <iostream.h> #include <conio.h> #include <iomanip.h> //pt setprecision

10

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

void main() { float latura,aria; cout<<endl<<"Dati lungimea laturii: "; cin>>latura; aria = latura*latura; cout<<"Aria patratului este: "<<setprecision(2)<<aria; // se afiseaza cu maxim 2 zecimale getch(); }

Rulare:
Dati lungimea laturii: 1.2 Aria patratului este: 1.44

R4. Enun&ul problemei: S se descrie un algoritm care s converteasc o temperatur din grade Celsius n echivalentul ei n grade Farenheit. 9 (F = 32 + C; de exemplu: 00C = 00F, 70C = 44,6 0 F, 240C = 75,2 0 F). 5 Descrierea algoritmului n pseudocod:
cite te gr_C gr_F 32+
scrie gr_F

9 gr_C 5

Descrierea algoritmului n C++:


#include <iostream.h> #include <conio.h> #include <iomanip.h> void main() { int gr_C; float gr_F; cout<<endl<<"Dati numarul de grade Celsius: "; cin>>gr_C; gr_F = 32 + 9.0/5*gr_C; //in C/C++: 9/5=1 (catul impartirii) //insa 9.0 / 5 = 1.8 cout<<"Numarul de grade Farenheit echivalente: "<< setprecision(1) << gr_F; getch(); }

Rulare:
Dati numarul de grade Celsius: 7 Numarul de grade Farenheit echivalente: 44,6

R5. Enun&ul problemei: S se calculeze aria unui triunghi cunoscnd lungimile laturilor sale a, b $i c a+b+c (aria = p( p a)( p b)( p c) , p = ) 2 Descrierea algoritmului n pseudocod: 11

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

cite te a,b,c

*se citesc datele de intrare


*se calculeaza semiperimetrul

a+b+c p 2 aria p( p a)( p b)( p c)


scrie aria

*se calculeaza aria triunghiului


*se afiseaza valoarea variabilei aria

Descrierea algoritmului n C++:


#include <iostream.h> #include <conio.h> #include <iomanip.h> #include <math.h> //pt sqrt void main() { int a,b,c; float p,aria; cout<<endl<<"a = "; cin>>a; cout<<"b = "; cin>>b; cout<<"c = "; cin>>c; //presupunem ca ele pot forma laturile unui triunghi p = (a+b+c)/2.0; //a,b,c au fost declarate de tip int si daca nu convertim //unul dintre operanzi la float, atunci va calcula //doar catul impartirii aria = sqrt(p*(p-a)*(p-b)*(p-c)); cout<<"Aria triunghiului este: "<<setprecision(1)<<aria; getch(); }

Rulare:
a = 3 <Enter> b = 4 <Enter> c = 6 <Enter> Aria triunghiului este: 6 sau a = 2 <Enter> b = 2 <Enter> c = 2 <Enter> Aria triunghiului este: 1.7

R6. Enun&ul problemei: S se scrie un algoritm pentru determinarea ariei unei elipse, cunoscnd lungimile semiaxelor sale. Descrierea algoritmului n pseudocod:
cite te a,b aria )ab scrie aria

Descrierea algoritmului n C++:


#include <iostream.h> #include <iostream.h> #include <iomanip.h> #include <math.h> //pt M_PI void main() { float a, b, aria;

12

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

cout<<endl<<"Dati valoarea semiaxei pe OX: "; cin>>a; cout<<"Dati valoarea semiaxei pe OY: "; cin>>b; aria = M_PI*a*b; cout<<"Aria elipsei = "<<setprecision(2)<<aria; getch(); }

Rulare: Dati valoarea semiaxei pe OX: 1 Dati valoarea semiaxei pe OY: 2 Aria elipsei = 6.28 R7. Enun&ul problemei: S se calculeze media aritmetic , geometric $i armonic a dou numere reale strict pozitive citite de la tastatur $i s se verifice inegalitatea mediilor. a+b 2 Metoda de rezolvare: Pentru orice a, b > 0 avem: ma = , mg = ab , marm = . 1 1 2 + a b $i are loc inegalitatea mediilor este: ma # mg # marm (dubl inegalitate = dou inegalit )i). De exemplu: - pentru a = 4 $i b = 9: ma = 6.5, mg = 6, marm = 5.54 $i inegalitatea mediilor este adevarat . - pentru a = b =3: ma = 3, mg = 3, marm = 3 $i inegalitatea mediilor este adevarat . Descrierea algoritmului n pseudocod:
cite te a, b *presupunem ca ambele sunt strict pozitive
ma

a+b 2 mg ab 2 marm 1 1 + a b
daca ma * mg si mg * marm atunci *dubla inegalitate scrie este verificata inegalitatea mediilor altfel scrie nu este verificata inegalitatea mediilor

scrie ma,mg,marm

Descrierea algoritmului n C++:


#include <iostream.h> //pt cin, cout #include <iomanip.h> //pt setprecision #include <conio.h> //pt getch #include <math.h> //pt sqrt void main() { float a,b,ma,mg,marm; cout<<endl<<"a="; cin>>a; cout<<"b="; cin>>b; ma = (a+b)/2; mg = sqrt(a*b); marm = 2/(1/a+1/b); cout<<"Media aritmetica: "<<setprecision(2)<<ma; cout<<endl<<"Media geometrica: "<<mg; cout<<endl<<"Media armonica: "<<marm;

13

Algoritmi si structuri de date (14.10.2013) Informatic Rmnicu Vlcea, anul 1

ASD_01

if ((ma>=mg)&&(mg>=marm)) cout<<endl<<"Este verificata inegalitatea mediilor"; else cout<<endl<<"Nu este verificata inegalitatea mediilor"; getch(); }

Tema 01 termen maxim 2 s pt mni (se va transmite prin e-mail ntr-un fi$ier electronic sau personal pe foaie scris de mn sau listat cel trziu 28.10.2013): 1) Scrie)i n pseudocod (eventual $i n C++) algoritmul pentru determinarea TVA-ului unui produs (TVA=24%*valoare_produs), cunoscnd valoarea produsului. De exemplu, pentru un produs n valoare de 15 lei, TVA-ul este de 3.6 lei. 2) Scrie)i n pseudocod (eventual $i n C++) algoritmul pentru realizarea unui schimb valutar din euro n lei, $tiind cursul Euro $i suma n euro. De exemplu, pentru o sum de 100 Euro $i rata de schimb 1Euro = 4,5 lei, dup schimbul valutar al sumei respective se ob)ine 100*4,5 = 450lei. 3) Scrie)i n pseudocod (eventual $i n C++) algoritmul pentru realizarea unui schimb valutar din lei n euro, $tiind cursul Euro (de ex. 1Euro = 4,2 lei) $i suma n lei. De exemplu, pentru o sum de 100 lei $i rata de schimb 1Euro = 4,5 lei, dup schimbul valutar al sumei respective se ob)ine 100 / 4,5 = 22,2 Euro. 4) Scrie)i n pseudocod (eventual $i n C++) algoritmul pentru calculul ariei unui triunghi, cnd se cunoa$te o baz a triunghiului $i n l)imea pe aceast baz (aria = baza*inaltimea/2). De exemplu, pentru baza = 3, inaltimea=5 se ob)ine valoarea ariei: 3 * 5 / 2 = 7,5. 5) Scrie)i n pseudocod (eventual $i n C++) algoritmul pentru conversia unui unghi din grade n radiani. De exemplu, pentru x = 0 grade, valoarea n radiani este tot 0, iar pentru x = 180 grade, valoarea n radiani este 3.14. x _ grade x _ radiani = => x_radiani = x_grade , / 180 180 6) Scrie)i n pseudocod (eventual $i n C++) algoritmul pentru calculul ariei $i lungimii unui cerc cnd se cunoa$te raza acestuia (aria = ,*raza2, lungime = 2*,*raza). De exemplu, pentru raza = 1 se ob)ine aria = 3.14, iar lungime = 6.28.

14

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