Sunteți pe pagina 1din 12

Algoritmi si structuri de date (8.10.

2009) Informatica, anul 1

ASD_C01

BIBLIOGRAFIE (partea de Algoritmi): 1. Donald Knuth, Arta programrii calculatoarelor, vol.1 Algoritmi fundamentali, Editura Teora, 1999 (traducere). 2. Donald Knuth, Arta programrii 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. Marin Popa, Mariana Popa, Elemente de algoritmi si limbaje de programare, Editura Universitatii din Bucuresti, 2005. 5. Leon Livovshi, Horia Georgescu, Sinteza i analiza algoritmilor, Editura tiintific i enciclopedic, 1986. 6. R. Andonie, I. Gabarcea, Algoritmi fundamentali. O perspectiva C++, Editura Libris, 1995. 7. Octavian Ptrcoiu, Gheorghe Marian, Nicolae Mitroi, Elemente de grafuri, combinatoric, metode, algoritmi i programe, Editura All, Bucureti, 1994. 8. Gheorghe Barbu, Ion Vduva, Mircea Boloteanu, Bazele Informaticii, Editura Tehnic, Bucureti, 1997. 9. Viorel Pun, Algoritmic i programarea calculatoarelor. Limbajul C++. Editura Universitii din Piteti, 2003. 10. Iorga, V., Chiri, P., Stratan, C., Opincaru, C., Programare n C/C++. Culegere de probleme. Editura Niculescu, Bucureti, 2003. 11. B. Ptru, Aplicaii n C i C++, Editura Teora, 2000. 12. D.H. Logoftu, C++. Probleme rezolvate i algoritmi, Editura Polirom, 2001. 13. O. Catrina, Iuliana Cojocaru, Turbo C++, Editura Teora, 1993. 14. V. Petrovici, F. Goicea, Programare n limbajul C, Editura Tehnic, 1993. 15. V. Cristea, C.Giumale, E. Kalisz, A. Pnoiu, 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 oraul Kwarizm, azi oraul Kiwa din Uzbechistan. Acest autor, ca i alti matematicieni ai evului mediu inelegeau prin algoritm o regul pe baza creia se pot efectua calcule matematice. Mult vreme conceptul de algoritm rmne cu o ntrebuinare destul de restrns chiar i n matematic. Ctre sfritul secolului al XIX-lea (1886-1888) Kronecker i Dedekind introduc n matematic funciile recursive n care conceptul de algoritm este strns legat de cel de recursivitate. Abia n secolul XX, n deceniile 3 i 4, prin lucrrile matematicienilor Skolem, Ackerman, Sudan, Gdel, Church, Kleene, Turing i alii, teoria algoritmilor i recursivitii se constituie ca atare. Astzi, 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 activiti care constau n parcurgerea unei succesiuni de pai (cum este de exemplu utilizarea unui telefon public sau realizarea unei reete gastronomice). Algoritmul este considerat noiunea fundamental a informaticii. n informatic, prin algoritm se poate nelege o metod prin care se descriu paii necesari pentru rezolvarea 1

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

unei clase de probleme, metod care se poate implementa pe calculator prin intermediul unui limbaj de programare. Conform urmtoarei seciuni, se poate spune c un algoritm este o secven finit de pai, aranjat ntr-o ordine logic specific care, atunci cnd este executat, produce o soluie corect pentru o problem precizat. 1.2 Generaliti despre algoritmi n matematic exist o serie de algoritmi: cel al rezolvrii ecuaiei de gradul doi, algoritmul lui Eratostene (pentru generarea numerelor prime mai mici dect o anumit valoare), schema lui Horner (pentru determinarea ctului i restului mpririi unui polinom la un binom), etc. Soluia problemei se obine prin execuia algoritmului. Algoritmul poate fi executat pe o main formal (n faza de proiectare i analiz) sau pe o main 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 maina pe care va fi executat. Studiul algoritmilor presupune: Elaborarea algoritmilor. Are ca scop identificarea unei soluii de rezolvare a problemei practice. Exprimarea algoritmilor. Presupune prezentarea algoritmilor ntr-un limbaj abstract, bine definit, astfel ncat s avem o form clar i concis a soluiei identificate. Algoritmii pot fi exprimati i n limbaje de programare. Validarea i analiza algoritmilor. nseamn revizuirea algoritmilor pentru a vedea dac ntr-adevr, acestia produc rezultatele dorite pentru problema analizat i identificarea eficienei acestor algoritmi Testarea algoritmilor. Presupune rularea programelor aferente algoritmilor i depanarea acestora.

Un algoritm trebuie s posede urmtoarele proprieti: Finitudine. Un algoritm trebuie s admit o descriere finit i fiecare dintre prelucrrile pe care le conine 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 soluie corect a problemei date. Generalitate. Un algoritm destinat rezolvrii unei (clase de) probleme trebuie s permit obinerea rezultatului pentru orice date de intrare i nu numai pentru date particulare de intrare. Rigurozitate / claritate. Paii algoritmului trebuie specificai riguros, fr ambiguiti. n orice etap a execuiei algoritmului trebuie s se tie exact care este urmtoarea etap ce va fi executat. Eficiena. Algoritmii pot fi efectiv utilizai doar dac folosesc resurse de calcul n volum acceptabil. Prin resurse de calcul se nelege volumul de memorie i timpul necesar pentru execuie. Exemple: 1. Nu orice problem poate fi rezolvat algoritmic. Considerm un numr natural n i urmtoarele dou probleme: (i) s se construiasc mulimea divizorilor lui n; (ii) s se construiasc mulimea multiplilor lui n. Pentru rezolvarea primei probleme se poate elabora uor un algoritm, n schimb pentru a doua problem nu se poate scrie un algoritm atta timp ct nu se cunoate un criteriu de oprire a prelucrrilor. 2

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

2. Un algoritm trebuie s funcioneze pentru orice date de intrare. S considerm problema ordonrii cresctoare a irului de valori: (2 1 4 3 5). O modalitate de ordonare ar fi urmtoarea: se compar primul element cu al doilea, iar dac nu se afl n ordinea bun se interschimb (n felul acesta se obine (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 rmne neschimbat); se continu procedeul pn penultimul element se compar cu ultimul. n felul acesta se obine (1 2 3 4 5). Dei metoda descris mai sus a permis ordonarea cresctoare 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 urmtoarea secven de prelucrri: Pas 1. Atribuie variabilei x valoarea 1; Pas 2. Mrete valoarea lui x cu 2; Pas 3. Dac x este egal cu 100 atunci se oprete prelucrarea, altfel se reia de la Pas 2. Este uor de observat c x nu va lua niciodat valoarea 100, deci succesiunea de prelucrri nu se termin niciodat. Din acest motiv nu poate fi considerat un algoritm corect. 4. Prelucrrile dintr-un algoritm trebuie s fie neambigue. Considerm urmtoarea secven de prelucrri: Pas 1. Atribuie variabilei x valoarea 0; Pas 2. Fie se mrete x cu 1 fie se micoreaz x cu 1; Pas 3. Dac x [10 10] se reia de la Pasul 2, altfel se oprete algoritmul. Att timp ct nu se stabilete un criteriu dup care se decide dac x se mrete sau se micoreaz secvena de mai sus nu poate fi considerat un algoritm. Ambiguitatea poate fi evitat prin utilizarea unui limbaj riguros de descriere a algoritmilor. S considerm c Pas 2 anterior se nlocuiete cu: Pas 2. Se arunc o moned. Dac se obine cap se mrete x cu 1, iar dac se obine pajur se micoreaz x cu 1; n acest caz specificarea prelucrrilor nu mai este ambigu chiar dac la execuii diferite se obin rezultate diferite. Ce se poate spune despre finitudinea acestui algoritm? Dac s-ar obine alternativ cap respectiv pajur, prelucrarea ar putea fi infinit. Exist ns i posibilitatea s se obin de 11 ori la rnd cap (sau pajur), caz n care procesul s-ar opri dup 11 repetri 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 considerm c rezolvarea unei probleme implic prelucrarea a n date i c numrul de prelucrri T(n) depinde de n. Presupunem c timpul de execuie a unei prelucrri este 103 s i c problema are dimensiunea n = 100. Dac se folosete un algoritm caracterizat prin T(n) = n atunci timpul de execuie va fi 100103 = 101 secunde. Dac, ns se folosete un algoritm caracterizat prin T(n) = 2n atunci timpul de execuie va fi de aproximativ 1019 ani.

Algoritmii pot fi descrii (reprezentai) n mai multe moduri, folosind: schema logic, care constituie un mod sugestiv (intuitiv) de reprezentare a unui algoritm, utiliznd simboluri cu o semnificaie bine precizat; pseudocod, care se remarc prin simplitatea i naturaleea sa, fiind de asemenea un limbaj cu reguli sintactice foarte simple ce permit exprimarea neambigu a ordinii de execuie a pailor, etc. un limbaj de programare ca Pascal, C/C++, Java, etc. 3

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

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 notaie textual ce permite exprimarea logicii programelor ntr-un mod oarecum formalizat fr a fi necesare totui 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 propoziii: a) propoziii standard prin care se exprim operaii ce pot fi transcrise direct ntr-un limbaj de programare, fiecare propoziie ncepnd cu un verb care exprim ct mai fidel operaia descris; b) propoziii nestandard prin care se exprim operaii ce urmeaz a fi detaliate ulterior, de exemplu: * se citesc datele de intrare * se afieaz meniul pe ecran unde caracterul * este folosit pentru a marca nceputul propoziiilor de acest tip. n continuare prezentm un exemplu de pseudocod pe care-l vom folosi mai departe i echivalentele n C/C++. Operaiile standard ale pseudocodului sunt descrise mai jos. 1. Comanda de citire. Citirea const n transferul de valori de pe mediul de intrare n locaiile de memorie ale calculatorului i are sintaxa:
Pseudocod: C: C++: citeste lista_de_variabile int scanf(control, par1, par2, ); cin>>var1>>var2;

unde control: conine 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 afiarea const n transferul valorii unor variabile din memorie pe mediul de ieire, 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 conine textul de afiat 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. Operaia de atribuire const n calculul unei expresii i asocierea acestei valori unei variabile, conform sintaxei:
Pseudocod: C/C++: variabila expresie variabila = expresie;

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

4. Secvena. Secvena desemneaz un grup de comenzi scrise una dup alta, executate secvenial i delimitate grafic. Efectul execuiei unei comenzi dintr-o secven depinde de poziia sa. Sintaxa acestor secvene este:
Pseudocod: comanda1 comanda2 ... comandan { comanda1 comanda2 ... comandan

C/C++:

5. Decizia este o comanda ce specific alegerea pentru execuie a uneia dintre dou alternative. Sintaxa comenzii este:
Pseudocod: daca conditie atunci secventa1 altfel

A secvena 1

condi

F secvena 2

ie

secventa2

C/C++:

if (conditie) secventa1; else secventa2;

unde conditie poate fi o variabil logic, o expresie relaional sau logic. Modul de execuie al deciziei este urmtorul: se evalueaz condiia i dac este adevrat se execut secventa1, n caz contrar se execut secventa2. n cazul n care cuvntul altfel lipsete, se folosete forma simplificat:
Pseudocod: daca conditie atunci secventa if (conditie) secventa;

condi

ie secvena

C/C++:

6. Selecia reprezint o extindere a operaiei de decizie, permind 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;> }

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

unde c1, c2, , cn se numesc etichete i se folosesc la identificarea secvenelor. Eticheta rest i secventan+1 sunt opionale. Modul de execuie este urmtorul: se evalueaz expresia; se caut eticheta avnd valoarea egal cu valoarea expresiei i este selectat secvena corespunztoare; dac nici o etichet nu are valoarea expresiei, atunci este selectat secventan+1; se execut secvena selectat dup care se trece la comanda urmtoare seleciei. Break poate lipsi. n cazul n care acesta lipsete, se vor executa toate instruciunile care urmeaz dup selecia corespunztoare n jos. Default poate lipsi. 7. Cicluri i iteraii. n rezolvarea problemelor apare deseori situaia n care o anumit secven urmeaz a se relua de mai multe ori; o astfel de combinaie se numete ciclu. Pentru reprezentarea ei se folosete o comand de ciclare ce specific att grupul de instruciuni ce se repet ct i condiia de repetare. Exist trei tipuri de cicluri: ciclul cu test final, ciclul cu test iniial i ciclul cu contor. 7.1 Ciclul cu test final. Testul pentru repetarea calculelor se face dup execuia grupului de comenzi care trebuie repetate. n pseudocod, dac condiia nu este ndeplinit (fals) se reia execuia secvenei, iar dac condiia este ndeplinit se trece la comanda urmtoare ciclului cu test final. n C, dac condiia este nenul (adevrat) se reia execuia secvenei, iar dac condiia este nul se reia ciclul do-while. Sintaxa comenzii este:
secven
Pseudocod: repeta secventa pana conditie C/C++: do secventa while (!conditie);

condi

ie
F

7.2 Ciclul cu test iniial. Testul pentru reprezentarea calculelor se face naintea execuiei grupului de comenzi care trebuie repetate. Dac condiia este ndeplinit, se execut secvena dup care se reevalueaz condiia, iar dac condiia nu este ndeplinit, se trece la comanda urmtoare ciclului cu test iniial. Acest tip de ciclu are avantajul c secvena nu se execut nici o dat dac condiia este falsde la nceput. Sintaxa comenzii este: F condi Pseudocod: cat_timp conditie repeta ie
secventa

A secven
i = vi

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

7.3 Ciclul cu contor. Ciclul cu contor realizeaz repetarea unei secvene de un numr de ori prestabilit, controlat de o variabil de ciclare numit contor. Sintaxa comenzii este:
Pseudocod:

i<=vf

A 6 secven
i=i+pas

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1 pentru i=vi,vf,pas repeta secventa C/C++: for(i=vi;i<=vf;i+=pas) secventa;

ASD_C01

unde: - i este variabila de contorizare; - pas este pasul cu care se face incrementarea; - vi, vf sunt valorile initiale i finale ale contorului. Modul de execuie este urmtorul: 1. se atribuie i vi; 2. se evalueaz condiia i > vf; dac condiia nu este ndeplinit se trece la pasul 3, altfel se trece la pasul 5; 3. se execut secvena; 4. se atribuie i i + pas i se trece la pasul 2; 5. se execut comanda urmtoare ciclului cu contor. Funcionarea algoritmului a fost descris pentru valori pozitive ale lui pas; dac pas este o valoare negativ, la pasul 2 se evalueaz condiia i < vf. 8. Comanda de ieire. Aceasta comand are rolul de a asigura terminarea forat a unui ciclu. Sintaxa sa este: Pseudocod: iesire
C/C++: exit(parametru);

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

10. Proceduri i funcii. n rezolvarea problemelor apar situaii n care poriuni de program similare se ntlnesc n diferite zone ale programului. Grupul de comenzi care se repet poate constitui o unitate distinct creia i se d un nume i un set de parametri. Ori de cte ori va fi necesar execuia acestui grup de comenzi se specific numele i parametrii care actualizeaz grupul de comenzi n noile condiii. Grupul de comenzi se numete subprogram. Subprogramul poate fi procedur sau funcie. 11.1 Procedura. Procedura specific secvene de operaii care se repet n diferite puncte ale programului i evideniaz 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 Funcia. Atunci cnd procedura calculeaz o singur valoare se poate utiliza un tip particular de procedur numit funcie. Forma general este:
Pseudocod:

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1 functie nume (lista_parametrilor_formali) este secventa sfarsit C/C++: tip nume(lista_parametrilor_formali) { secventa; return valoare_tip; }

ASD_C01

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

Execuia unei funcii intervine atunci cnd la evaluarea unei expresii este necesar valoarea sa. n aceast situaie se face transmiterea parametrilor funciei i se execut secvena de operaii corespunztoare, gsindu-se astfel valoarea funciei. Utilizarea procedurilor i funciilor se face n urmtoarele scopuri: 1. o seciune 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 pri ale algoritmului se poate face separat, independent una de alta, putndu-se codifica i testa separat; 3. reprezentarea de sine stttoare a rezolvrii 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 evideniat prin scierea lor folosind tipul ngroat. De exemplu: citeste, scrie, daca, atunci, altfel, alege, dintre, rest, repeta, pentru, etc. Identificatori reprezint un ir de caractere folosit pentru nume de variabile, nume de funcii, etc. O restricie 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 ctre 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 reine o not poate fi: nota_1 sau n1 sau Nota_1, etc. Caracteristicile variabilelor sunt: - fiecare variabil are un nume - fiecare variabil reine o valoare sau un set de valori utile pentru algoritm - fiecare variabil va aparine 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

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

Definiie: Algoritmii care pot fi descrii folosind numai comenzi/instruciuni de citire (n pseudocod: citeste), scriere (n pseudocod: scrie) i atribuire (n pseudocod: ) se numesc algoritmi liniari. Exemple de algoritmi liniari: E1. Enunul problemei: S se determine aria unui ptrat, citind de la tastatur lungimea laturii sale. Metoda de rezolvare: Algoritmul const n citirea de la tastatur a lungimii laturii ptratului i apoi determinarea i afiarea ariei acestuia (aria = latura2). De exemplu, pentru un ptrat cu latura de 4 (uniti de msur), aria este 16. Descrierea algoritmului n pseudocod i C/C++: Pseudocod:
citete latura aria latura2
scrie aria #include<stdio.h> #include<conio.h> void main(){ float latura,aria; clrscr(); printf("Dati lungimea laturii: "); scanf("%f",&latura); aria = latura*latura; printf("Aria patratului este: %.2f",aria); getch(); }

C:

O form echivalent a implementrii anterioare presupune evitarea folosirii variabilei aria i afiarea direct a expresiei ariei ptratului.
#include<stdio.h> #include<conio.h> void main(){ float latura; clrscr(); printf("Dati lungimea laturii: "); scanf("%f",&latura); printf("Aria patratului este: %.2f", latura*latura); getch(); }

Explicaii: Linia
float latura;

semnific declararea unei variabile de tip float (unul din tipurile reale din C, cu valori n intervalul [10308, 10308] [10308, 10308]). Linia clrscr(); conine o funcie care este declarat n fiierul header conio.h i care terge fereastra activ n modul text, n care se afieaz rezultatele programelor i poziioneaz cursorul n colul stnga-sus al acestuia. Linia scanf("%f",&latura); conine o funcie declarat n fiierul header stdio.h (similar funciei printf(), doar c este folosit pentru intrri de la dispozitivul standard stdin - tastatura). Aici aceasta are dou argumente: primul este un ir de caractere care conine specificaia de format conform crora se vor interpreta variabilele ale cror valori se vor citi de la tastatur; al doilea parametru reprezint adresa de memorie (operatorul de adres este &) a variabilei latura. Aadar, funcia aceasta presupune interpretarea caracterelor date 9

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

de la tastatur ca un ntreg zecimal i memorarea acestora n variabila latura la adresa &latura. Linia printf("Aria patratului este: %.2f", latura*latura); folosete specificaia de format pentru afiare %.2f cu ajutorul cruia se afieaz valoarea variabilei reale corespunztoare cu dou zecimale. Linia getch(); reprezint apelul unei funcii declarat n fiierul header conio.h i care citete fr ecou (fr s afieze pe ecran) un caracter de la tastatur; aceasta permite oprirea programului pentru vizualizarea datelor.
C++:
#include<iostream.h> void main(){ float latura,aria; cout<<"Dati lungimea laturii: "; cin>>latura; aria = latura*latura; cout<<"Aria patratului este: %.2f"<<aria; }

E2. Enunul problemei: S se scrie un program C care s converteasc o temperatur n grade Celsius n echivalentul ei n grade Farenheit. Metoda de rezolvare: Formula de echivalen ntre grade Celsius i grade Farenheit este 9 F = 32 + C. 5 Astfel, algoritmul se reduce la citirea valorii temperaturii n grade Celsius i apoi afiarea expresiei din dreapta semnului egal de mai sus. Descrierea algoritmului n pseudocod i C/C++: Pseudocod:
citete gr_C gr_F 32+ C:
scrie gr_F #include<stdio.h> void main(){ float gr_C,gr_F; printf("Dati numarul de grade Celsius: "); scanf("%f",&gr_C); gr_F = 32 + 9*gr_C/5; printf("%.1f grade Celsius este echivalent cu %.1f grade Farenheit", gr_C,gr_F); }

9 gr_C 5

E3. Enunul problemei: S se calculeze aria unui triunghi cunoscnd lungimile laturilor sale a, b i c. Metoda de rezolvare: Se folosete formula lui Heron: aria = p ( p a)( p b)( p c) , unde p este semiperimetrul triunghiului, adic p = (a+b+c)/2. Descrierea algoritmului:
citete a,b,c

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


scrie aria

*se citesc datele de intrare


*se calculeaza semiperimetrul

*se calculeaza aria triunghiului


*se afiseaza valoarea variabilei aria

10

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

E4. Enunul problemei: S se scrie algoritmul ce determin aria unei elipsei, citind de la tastatur lungimile semiaxelor sale. Metoda de rezolvare: Aria unei elipse este A = ab, unde a i b sunt lungimile semiaxelor elipsei. n C, valoarea lui este declarat ca o constant n fiierul header math.h i anume M_PI. Ca i la programul pentru determinarea ariei ptratului, putem evita folosirea variabilei aria prin afiarea direct a expresiei ariei elipsei.. Descrierea algoritmului n pseudocod i C/C++: Pseudocod:
citete a,b aria ab scrie aria
#include<stdio.h> #include<math.h> void main(){ float a,b,aria; printf("Dati lungimea primei semiaxe a="); scanf("%f",&a); printf("Dati lungimea celei de-a doua semiaxe b="); scanf("%f",&b); aria = M_PI*a*b printf("Aria elipsei este: %.2f",aria); } #include<iostream.h> #include<math.h> void main(){ float a,b,aria; cout<<"Dati lungimea primei semiaxe a="; cin>>a; cout<<"Dati lungimea celei de-a doua semiaxe b="; cin>>b; aria = M_PI*a*b; cout<<"Aria elipsei este: %.2f"<<aria; }

C:

C++:

E5. Enunul problemei: S se scrie un program care determin aria unui triunghi, citind de la tastatur lungimile a dou laturi i unghiul dintre acestea (exprimat in grade). Metoda de rezolvare: Reamintim c aria unui triunghi n funcie de dou laturi i unghiul dintre acestea este ac sin B A= . 2 Valoarea unghiului B se va introduce de la tastatur n grade, dar funcia trigonometric sin (din limbajul C) accept ca argument unghi reprezentat n radiani; aadar unghiul citit de la tastatur n grade se va converti n radiani nainte de folosirea funciei trigonometrice sin. Formula de conversie a valorii unui unghi exprimat din grade n radiani i invers este:
x _ grade x _ radiani = 180

=> x_radiani = x_grade / 180.

Descrierea algoritmului n pseudocod i C/C++: Pseudocod:


citete a,c,B aria C:

ac sin B 2

scrie aria

11

Algoritmi si structuri de date (8.10.2009) Informatica, anul 1

ASD_C01

#include<stdio.h> #include<math.h> void main(){ float a,c,B; printf("Dati valoarea unei laturi a triunghiului: a="); scanf("%f",&a); printf("Dati valoarea altei laturi a triunghiului: c="); scanf("%f",&c); printf("Dati valoarea unghiului dintre laturi (in grade): B="); scanf("%f",&B); printf("Aria triunghiului este: %.2f",a*c*sin(B*M_PI/180)/2); }

C++:

#include<iostream.h> #include<math.h> void main(){ float a,c,B; cout<<"Dati valoarea unei laturi a triunghiului: a="; cin>>a; cout<<"Dati valoarea altei laturi a triunghiului: c="; cin>>c; cout<<"Dati valoarea unghiului dintre laturi (in grade): B=";cin>>B; cout<<"Aria triunghiului este: %.2f",a*c*sin(B*M_PI/180)/2;

E6. transformarea unui moment de timp din ore-min-sec n secunde i invers. - rezolvat la tabl)

Tem (C1) termen maxim 2 sptmni: 1) Scriei n pseudocod algoritmul pentru determinarea TVA-ului unui produs (TVA=19%*valoare_produs). 2) Scriei n pseudocod algoritmul pentru realizarea unui schimb valutar din euro n lei, tiind cursul Euro (de ex. 1Euro = 4,2Ron). 3) Scriei n pseudocod algoritmul pentru realizarea unui schimb valutar din lei n euro, tiind cursul Euro (de ex. 1Euro = 4,2Ron). 4) Scriei n pseudocod algoritmul pentru calculul ariei unui triunghi, cnd se cunoate o baz a triunghiului i nlimea pe aceast baz (aria = baza*inaltimea/2). 5) Scriei n pseudocod (eventual i n C/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 tot 3.14. 6) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru calculul ariei i lungimii unui cerc cnd se cunoate raza acestuia (aria = *raza2, lungime = 2**raza). De exemplu, pentru raza = 1 se obine aria = 3.14, iar lungime = 6.28. 7) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru calculul celui de-al treilea unghi dintr-un triunghi cnd se cunosc celelalte dou n grade (suma tuturor = 1800).

12

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