Sunteți pe pagina 1din 6

Referat DIDACTICA

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 algoritmilor i Dificultatea problemelor


Din perspectiva rezolvrii problemelor cu ajutorul calculatorului putem studia i compara dificultatea
problemelor studiind i comparnd complexitatea algoritmilor optimali de soluionare a acestora.
Astfel, problema sortrii prin comparaii cere un efort minimal liniar-logaritmic. Ea nu este totui o problem
de efort liniar-logaritmic (Q (n log n)) ntruct ea poate fi soluionat cu efort liniar (Q (n) operai) atunci
cnd cheile de sortare pot fi distribuite folosind un algoritm de sortare prin distribuire.

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:

Fie numrul natural n 10.


a) S se elaboreze un program care s determine dac numrul este palindrom; n
caz afirmativ se cere s se tipreasc numrul i un mesaj (de exemplu: Numarul
12421 este palindrom); n caz negativ se cere s se afieze numrul i oglinditul su
(de exemplu: Numarul 186335 este oglinditul numarului 533681).
b) S se determine i s se afiseze numrul poziiilor n care numrul n i oglinditul
su coincid (adica: pe poziia respectiv n cele dou numere apare aceeai cifr).
Rezolare a):
#include<iostream.h>
void main()
{
int copie,oglindit,c,n;
oglindit=0;

//initializam varialbila oglindit cu 0 in aceasta variabila o sa memoram oglinditul

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

else cout<<"oglinditul nr: "<<copie<<este numarul<<oglindit;


}
Subpunctul b)
#include<iostream.h>
void main()
{
int copie,oglindit,c,n;
oglindit=0;

//initializam varialbila oglindit cu 0 in aceasta variabila o sa memoram oglinditul

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

sa stim cate cifre are nr,folosind un contor n care il initializam cu 0

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:

Fie numrul natural n 10.S se determine i s se afiseze numrul poziiilor n


care numrul n i oglinditul su coincid (adica: pe poziia respectiv n cele dou
numere apare aceeai cifr).
Elevul nu s-ar gandi la un algoritm elementar, cel mai probabil ar fi aplicat a doua
varianta de rezolvare a punctului b) unde am vazut cate greseli frecvente fac elevii
cei mai multi.

Un posibil barem de
corectare ai putea fii

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