Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
INFORMATICII
Breviar teoretic:
NOIUNI TEORETICE DESPRE LIMBAJUL C++ - PREZENTARE GENERAL
Prin programare se nelege n mod generic transpunerea unor operaii repetitive, asupra unui set
de date, ntr-un limbaj inteligibil de ctre un sistem de calcul care urmeaz ulterior s le execute. Acest
lucru este realizat n dou etape: o etap n care este implicat omul i anume cea de trecere de la
problema real la transpunerea ntr-un limbaj de programare. o a doua etap, automat, care transpune
codul surs (niruirea de instruciuni specifice limbajului respectiv) ntr-un cod direct executabil (inteligibil
sistemului de calcul) lucru de care se ocup programe specializate numite compilatoare. Atunci cnd
scriem un program ntr-un anumit limbaj de programare trebuie s lum n considerare urmtoarele:
declararea, scrierea i citirea setului de date de intrare (cele care trebuie s fie prelucrate); s execute
asupra lor suita standard de operaiuni; i s livreze datele de ieire (adic rezultatele). Un program scris
n limbajul C++ este compus din unul sau mai multe fiiere surs. Un fiier surs este un fiier text care
conine codul surs al unui program. Fiecare fiier surs conine una sau mai multe funcii i eventual,
referine ctre unul sau mai fiiere header. Funcia principal a unui program este numit main.
Metode de programare:
Programarea se bazeaza pe algoritmi elementare care sunt idispensabili, fara ei nu am putea realiza
un program mai complex dar si pe anumite metode de programare dintre acestea enumeram:
-backtracking
Definiie
Algoritmii cu revenire (algoritmi de tip backtracking) se aplic problemelor n care soluia se poate
reprezenta sub forma unui vector x=(x1,x2,...xn) cu S=S1 x S2 x...x Sn, unde mulimile Si sunt finite, S
numindu-se spatiul soluiilor posibile. n particular, Si sunt identice avind acelai numr M. de elemente.
Pentru fiecare problem concret sunt date anumite relaii ntre componentele vectorului x, numite condiii
interne.
-divide et impera
Definiie
Tehnica divizarii ("divide and conquer" sau divide et impera), este fundamental n elaborarea algoritmilor
i const n descompunerea unei probleme complexe n mai multe subprobleme a cror rezolvare e mai
simpl i din soluiile crora se poate determina soluia problemei iniiale (exemple: gsirea minimului i
maximului valorilor elementelor unui tablou, cutarea binar, sortare Quicksort, turnurile din Hanoi).
Noiunea de recursivitate
Fia suport 1.1
Noiunea de recursivitate este fundamental n informatic. Utilizarea frecvent a ei s-a fcut dup anii 80.
Multe din limbajele de programare evoluate i mult utilizate Fortran, Cobol nu permiteau scrierea
programelor recursive.
Definiie
Procesul recursiv este procesul care, n timpul execuiei, genereaz apariia unor procese identice, aflate n
legtur direct cu procesul ce le genereaz.Un proces poate fi descris printr- un subprogram.
Aadar recursivitatea este un mecanism general de elaborare a programelor, care const n posibilitatea ca
un subprogram s se autoapeleze.
Recursivitatea a aparut din necesiti practice date de transcrierea direct a formulelor matematice
recursive. n timp acest mecanism a fost extins, fiind utilizat n elaborarea multor algoritmi. Pentru predarea
acestor coninuturi este necesar s se dea cteva exemple intuitive de procese recursive din realitatea
cotidian.
Atunci cnd scriem un algoritm recursiv, este suficient s gndim exact ce se ntmpl la un anumit
nivel, pentru c la orice nivel se ntmpl exact acelai lucru.
Exemplele prezentate sunt procese recursive infinite, prezentnd un ir infinit de televizoare, respectiv
anunul este perpetuu.
Complexitatea de timp
Msurarea n practic a duratei de execuie (adic a complexitii de timp) a implementrii algoritmilor a
condus la urmtoarea concluzie categoric: singurii algoritmi ce soluioneaz n mod eficient o problem
oarecare snt acei algoritmi care au complexitatea polinomial (sau mai mic dect exponenial). O astfel
de soluie se numete soluie rezonabil, fa de cealalt situaie cu soluie nerezonabil avnd o
complexitate de timp exponenial sau factorial (total ineficient ca durat de execuie).
De exemplu, dac pentru colorarea unui graf cu n virfuri cu doar trei culori, se ncearc toate cele
3n variante de colorare (printr-un algoritm de tip backtracking ), timpul necesar unui program pentru
epuizarea tututor cazurilor, n cazul n care n=100, este direct proporional cu uriaa valoare de 3100 =
38742048910 ceea ce face acel program cu totul inutilizabil (chiar dac am presupune c o instruciune s-ar
executa ntr-o pico-secund = 10-12s).
Enuntul problemei:
cout<<"n=";cin>>n;
copie=n;//realizam o copie a nr. Citit de la tastatura doarece dupa structura while n o sa devina 0 si nu o sa mai putem realiza
comparatia din structura if
while(n!=0)
{
c=n%10;
oglindit=oglindit*10+c;
//in structura while cat timp n nostru mai are cifre ii luam ultima cifra si o adauga, la oglindit
n=n/10;
}
if(copie==oglindit) cout<<"palindrom"; //daca oglinditul obtinut este acelasi cu numarul citit de la tastatura ineamna ca nr
nostru este palindrom
cout<<"n=";cin>>n;
copie=n;//realizam o copie a nr. Citit de la tastatura doarece dupa structura while n o sa devina 0 si nu o sa mai putem realiza
comparatia din structura if
while(n!=0)
{
c=n%10;
oglindit=oglindit*10+c;
//in structura while cat timp n nostru mai are cifre ii luam ultima cifra si o adauga, la oglindit
n=n/10;
}
c=0//luam un contor pentru a numara pozitile in care cifrele coinid
while(copie!=0 )//putem pune si conditia oglindit!=0 deoarece ambele au acelasi numar de cifre
{ult1=copie%10;
Ult2=oglindit%10;
If(ult1==ult2)
C++;
Copie=copie/10;
Oglindit=oglindit/10;
}
Cout<<c;
}
Complexitatea algoritumului este O(n).
O alta rezolvare a subunctului b) ar putea fi folosirea unui vector.Adica pune toate cifrele numarului nostru
intr-un vector folosind tot o structura while(taiem fiecare ultima cifra sip e aceasta o adaugam intr-un
vector v,si apoi trecem la urmatoarea pozitie i++,pozitia i o initializam cu 1,si creste pana cand umarul nu
mai are cifre).Dupa incheierea while-ului o sa avem un vector cu cifrele numarului, de ex. Daca nr este
12541 o sa avem vectorul.Tot in while in timp ce taiem cifrele, le si numaram pentru ca o sa avem nevoie
Dupa de am pus cifrele in vector pornim cu un i de pe prima pozitie si un j de pe ultima(ultima pozitie este
nr de cifre) si comparam i si j, daca sunt egale marim un contor.Toate acestea le facem intr-un if, in care
vedem daca numarul de cifre este par sau impar.Daca este par o sa facem ce am spus mai sus pana
i<n/2+1 si j>n/2-1, o sa afisam pe ecran c*2 (acesta fiind numarul de pozitii in care numerele
coincid).Daca contorul este impar atunci o sa mergem cu i<n/2+1 si j>n/2+1 si o sa afisam pe ecran
c*2+1;
Dar din punctul meu de vedere prima variata este cea mai frecventa aleasa de elevi, a doua fiind mai
complexa si greserile frecvente pe care le face elevul la a 2a varianta este faptul ca nu imparte problema
pe doua cazuri(nr cifrelor par sau impar), sau daca ia in considerare acestul lucru acestia ori nu meg cu Iul si j-ul pana unde este necesar primind astfel un raspuns eronat ori nu calculeaza corect nr final de
pozitii(c*2 /c*2+1).
La primul subpunct teoretic numarul de greseli ar trebui sa mic doarece este un algoritm elemenar,dar
totusi exista greseli frecvente cum ar fii greserile de sintaxa.O alta greseala intalnita la algoritmi
elementari este faptul ca unii elevi invata pe dinafara aceste programe si nu logic enevitabil aparand astfel
greseli.
Enuntul problemei este usor de inteles, chiar prezinta exemple.Primul subpunct al problemei este
simplu, din punctul meu de vedere simplitatea este data de faptul ca in enunt se explica ce este un
palindrom,iar explicatia este data printru exemplu si un contraexemplu ceea ce ajuta foarte mult
elevul,doarece elevi inteleg mai bine din exemple concrete,acestea nefiind atrasi de enunturile lungi in
care se pierd in explicatii,ei neavand rabdarea sa citeasca pana la sfarsit daca enuntul este prea incarcat
si lung.
Al doilea subpunct este de nivel mediu,daca la primul era un algoritm elementar aici elevul trebuie sa
foloseasca o metode inventiva.Dar odata cu rezolvarea acestua elevul poate invata o metoda noua si
inventiva de a rezolvat subpunctul a) unde a folosit un algoritm elementar.Oarecum subpunctul b) ajuta
elevul sa isi personalizeze o noua metode de verificare a unui numar daca e palindrom.
Aceasta problema ar devein o problema complexa daca subpunctul b) nu ar fii insotit de subpunctul
a).Punctul a) ajuta elevul sa inteleaga mai bine ce cere b) dar deasemeni ii si da o variant de
rezolvare,subpunctul b) fiind un caz particular.Daca problema ar fi sunat:
Un posibil barem de
corectare ai putea fii