Algoritmi Elementari

I. Introducere

Depindem de tehnologie și de calculatoare din ce în ce mai mult. Din această cauză, informatica este o disciplină de bază în sprijinirea evoluției noilor tehnologii. Pentru profesorii de informatică una dintre cele mai mari provocări o reprezintă atragerea elevilor către o disciplină ce implică o muncă constantă și dorința de a descoperi lucruri noi, de a face conexiuni cu lumea reală. Cum reușim să îi motivăm, cum reușim să îi convingem că nu va exista o lume fără tehnologie sau fară informaticieni? Trebuie să demonstrăm elevilor că informaticieni buni nu sunt doar elevii de excepție ci toți elevii care încearcă să abordeze creativ problemele din viața de zi cu zi.

Lucrarea de față propune o astfel de abordare a procesului instructiv-educativ din cadrul orelor de informatică. Lucrarea este structurată în două părți: prima parte – dedicată algoritmilor elementari – conține trei capitole: algoritmi elementari, algoritmi de sortare și algortimi din teoria grafurilor; partea a doua – de metodică – cuprinde aspecte teoretice și practice legate în principal de metoda proiectului.

Astfel, în prima parte, am prezentat noțiunea de algoritm, proprietățile algoritmilor precum și unele elemente de calculabilitate și complexitate. Capitolul Algoritmi de sortare prezintă cei mai cunoscuți algoritmi utilizați în rearanjarea elementelor unui vector. Pentru fiecare algoritm am facut o scurtă prezentare, am discutat despre complexitatea acestuia și am dat implementarea în limbajul de programare C++, utilizând aplicația software Code::Blocks. În capitolul Algoritmi din teoria grafurilor, am prezentat noțiunile teoretice despre grafurile neorientate și orientate, incluzând algorimi elementari pentru lucrul cu aceste noțiuni, implementați în C++. Majoritatea noțiunilor prezentate în acest capitol au fost utilizate în partea de metodică, fiind structura de bază pentru temele de proiect realizate la clasă.

Partea a doua cuprinde o prezentare a metodei proiectului, exemple de teme pentru proiecte, exemple practice realizate la clasă precum și o interpretare a rezultatelor implementării acestei metode la clasă.

II.1. Algoritmi elementari

II.1.1. Definirea și caracteristicile algoritmilor

Un algoritm (cuvântul are ca origine numele matematicianului persan Al-Khwarizmi) înseamnă în matematică și informatică o metodă sau o procedură de calcul, alcătuită din pașii elementari necesari pentru rezolvarea unei probleme sau categorii de probleme. De obicei algoritmii se implementează în mod concret prin programe de calculator. Din diverse motive există și algoritmi încă neimplementați, teoretici.

Nu există o definiție general acceptată pentru noțiunea de algoritm . De aceea există mai multe descrieri și caracterizari.

Prin algoritm înțelegem o mulțime ordonată și finită de pași care ajută la rezolvarea unei clase de probleme. Fiecare pas dintr-un algoritm implică efectuarea unor operații. Pentru a fi implementate pe un calculator, într-un anumit limbaj de programare, aceste operații trebuie să fie definite și efective.

Principalele caracteristici ale algoritmilor sunt: corectitudinea, finitudinea, generalitatea și completitudinea.

Există diferite criterii de clasificare a algoritmilor. De exemplu, după modul de administrare a rezultatelor în raport datele de intrare și cu cele intermediare, algoritmii se împart în: algoritmi iterativi și algoritmi recursivi

Studiul algoritmilor cuprinde următoarele etape:

1. Elaborarea algoritmilor (ceea ce implică stabilirea unor tehnici de elaborare (reguli) care, împreună cu creativitatea (intuiția) utilizatorului vor duce la soluția adecvată).

2. Exprimarea algoritmilor (se poate recurge la limbajul natural, la scheme logice, la limbaje de tip pseudocod sau de programare (universale sau specializate). De asemenea, se impune utilizarea unui anumit stil de programare (legat nu de un anumit limbaj de programare, ci de tipul limbajului și de modul de abordare a problemei)

3. Validarea algoritmilor (demonstrarea matematică a corectitudinii, independent de implementare)

4. Analiza algoritmilor (în general, se evalueaza timpul de calcul și/sau la memoria necesară)

5. Testarea programelor (care constă din depanare (debugging) și verificare (profiling).

II.1.2. Modele de calculabilitate

O procedură efectivă este o mulțime finită de acțiuni a căror execuție se termină într-un timp finit și care implică o cantitate finită de date pentru a obține un rezultat, mereu același pentru date identice.

Încercarea de definirea a noțiunii de algoritmi a condus, între anii 1930 – 1940, la apariția mai multor modele de calculabilitate:

Funcțiile -calculabile (Alonzo CHURCH și Stephen Cole KLEENE)

Mașinile Turing (Alan TURING)

Funcțiile general recursive (Kurt GÖDEL)

Sistemele Post, inclusiv mașina Post-Turing (Emil Leon POST)

Algoritmii normali Markov (N.N. MARKOV)

Lambda calculul

Definiție

O λ-functie este definită de o lambda-expresie care exprimă acțiunea funcției în argumentele ei.

Exemple: funcția f(x)=x+2: λ x. x + 2 .

numărul f(3): (λ x. x+ 2) 3

Mașina Turing

Mașina Turing este compusă din următoarele elemente (Gontineac, 08):

o bandă infinită de hârtie împărțită în locații care pot conține fiecare câte un singur caracter

un cap de citire-scriere, care se poate mișca deasupra benzii, la stânga sau la dreapta

o unitate de control, care dispune de un număr finit de reguli care indică mașinii ce să facă in fiecare moment în funcție de simbolul curent citit de pe bandă și de starea curentă a mașinii.

Structura mașinii Turnig:

Matematic, mașina Turing este definită ca fiind un sistem ( , , Q, q0, F, ) unde:

este o mulțime finită, nevidă numită alfabet de intrare

este o mulțime finită, nevidă numită alfabetul benzii

, și ;

Q este o mulțime finită, nevidă numită mulțimea stărilor mașinii

q0 Q este starea inițială

F Q este mulțimea stărilor finale (de acceptare sau de respingere)

: Q x Q x x { L , R } este funcția de tranziție, unde L denotă deplasarea la stânga iar R denotă deplasarea la dreapta a cursorului mașinii.

II.1.3. Reprezentarea algoritmilor

Există numeroase variante de reprezentare a algoritmilor. În general, cu cât acestea sunt mai sugestive pentru oameni, cu atât sunt mai greu de înțeles și interpretat pentru sistemele de calcul și invers. Cele mai frecvent folosite metode reprezentare sunt:

descrierea în limbajul natural

schemele logice

pseudocodul

limbajele de programare

II.1.4. Complexitatea algoritmilor

În rezolvarea cu ajutorul calculatorului a oricărei probleme se trece prin cele trei etape:

Analiza teoretică a problemei

Proiectarea algoritmului de soluționare

Implementarea algoritmului într-un program executabil pe calculator

Calcularea complexității algoritmilor are două abordări: abordarea teoretică și abordarea practică.

Abordarea practică:

Este realizată la nivelul implementării pe calculator

Este o metodă naturală și practică care revine la măsurarea cât mai exactă a duratei de execuție a programului

Este dependentă de limbajul de programare, performanțele hardware ale calculatorului

Abordarea teoretică:

Este realizată la nivelul algoritmului

Este ideală, robustă și independentă de:

performanțele hardware

modelul de calculabilitate

modelul

În calcularea duratei de execuție a unui program s-au impus două criterii esențiale (atât la nivelul practic cât și la nivelul teoretic):

datele de intrare

programele (algoritmii) fără subprograme (subalgoritmi)

Astfel, durata execuției unui program depinde de:

dimensiunea datelor de intrare

configurația datelor de intrare:

alfabetul de codificare

structura de date

instanța concretă a problemei

particularitățile sistemului de calcul:

limbajul de programare

performațele hardware

Calcularea timpului de rulare al programelor utilizează facilitățile oferite de elementele hardware, sistemele de operare, limbajele de programare etc.

Măsurarea exactă a timpului de execuție a programului de calculator nu este un criteriu valid pentru a descrie dificultatea / complexitatea rezolvării problemei.

O măsură mult mai utilă a timpului de execuție este dată de numărul pașilor elementari necesari execuției unui algoritm.

Nu există o masură universală pentru evaluarea timpului de execuție al tuturor algoritmilor.

Principalul criteriu este dimensiunea datelor de intrare, dată de:

lungimea

numărul lor

1. Lungimea datelor de intrare

Se disting două metode principale de evaluare a complexității algoritmilor după lungimea datelor de intrare:

(U) costul uniform

(L) costul logaritmic

Abordarea solvabilității problemelor prin costul uniform are următoarele avantaje:

complexitatea timp revine la a determina numărul total de operații executate pentru obținerea rezultatului

complexitatea spațiu revine la a determina numărul total de variabile utilizate pentru obținerea rezultatului

Abordarea solvabiliății problemelor prin utilizarea măsurii logaritmice implică calcularea costului oricărei operații elementare ca fiind suma dimensiunilor reprezentărilor binare ale operanzilor. Se pot adauga și dimensiunile reprezentării binare a adreselor locațiilor de memorie unde sunt depuse valorile operanzilor. Metoda aceasta este general adoptată în analiza complexității algoritmilor.

2. Numărul datelor de intrare

Distingem două tipuri de probleme:

Probleme care tratează date numerice

Probleme care tratează alte obiecte:

formule logice,

grafuri,

polinoame,

automate ,

gramatici etc

Timpul exact de execuție a unui algoritm poate fi o expresie foarte complexă. Acest timp de execuție este doar aproximat printr-o expresie mai simplă, conținând numai termenul de ordinul cel mai mare și către care tinde asimptotic (putem ignora termenii de ordin inferior și coeficienții deoarece, pentru intrări mari, aceștia sunt dominați de termenii de ordin superior).

II.1.5. Algoritmi elementari

În continuare sunt prezentați următorii algoritmi (Sorin, 08) (Miloșescu, 06):

Algoritmul de interschimbare a două valori

Algoritmul de calculare a valorii maxime dintr-un șir de n valori ( respectiv calcularea minimului)

Algoritmii de prelucrare a cifrelor unui număr:

Creare unui număr din cifre date

Extragerea unui număr

Crearea răsturnatului unui număr

Algoritmul pentru calcularea c.m.m.d.c a două numere

Algoritmul lui Euclid

Algoritmul lui Manna (cu scăderi succesive)

Algoritmul pentru verificarea primalității unui număr

Algoritmul pentru generarea divizorilor unui număr

Algoritmi pentru conversii între baze de numerație

Algoritmul pentru generarea șirurilor recurente

Algoritmul de interschimbare a două valori

Sunt date două valori care vor fi interschimbate

O rezolvare se poate realiza prin utilizarea unei variabile auxiliare care memorează temporar una din valorile citite

O altă rezolvare implică operații algebrice elementare (scăderi și adunări) prin care se interschimbă valorile inițiale

Utilizând o variabilă auxiliară

#include <iostream>

using namespace std;

int main()

{

int a,b,aux;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

aux=a;

a=b;

b=aux;

cout << "a=" <<a<< endl;

cout << "b=" <<b<< endl;

return 0;

}

Prin scăderi succesive

#include <iostream>

using namespace std;

int main()

{

int a,b;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

a=a-b;

b=b+a;

a=b-a;

cout << "a=" <<a<< endl;

cout << "b=" <<b<< endl;

return 0;

}

Algoritmul pentru determinarea valorii maxime/minime

Sunt citite de la tastatură mai multe numere

Prima valoare citită este considerată ca fiind maximă (minimă)

Se verifică după citirea fiecăre valori dacă este îndeplinită condiția de ordine; dacă acesta nu este îndeplinită, valoarea curentă va fi considerată ca fiind maximă (minimă)

Valoarea determinată este afișată

N numere citite

#include<iostream>

using namespace std;

int main()

{

int n,i,a,maxi;

cout<<"n=";cin>>n;

maxi=0;

for(i=1;i<=n;i++)

{

cout<<"a=";cin>>a;

if(a>maxi) maxi=a;

}

cout<<"valoarea maxima este "<<maxi<<endl;

return 0;

}

Mai multe numere citite

#include<iostream>

using namespace std;

int main()

{

int maxi,a;

cout<<"a=";cin>>a;

maxi=a;

while(a!=0)

{

cout<<"a=";cin>>a;

if(a>maxi) maxi=a;

}

cout<<"valoarea maxima este "<<maxi<<endl;

return 0;

}

Algoritmi pentru prelucrarea cifrelor unui număr

Crearea unui număr din cifre date

Se citesc pe rând cifrele unui număr

Se adaugă în cadrul numărului; adăugarea poate fi realizată la începutul sau la sfârșitul numărului

Se afișează numărul creat

Adăugarea cifrelor la sfârșitul numărului

#include<iostream>

using namespace std;

int main()

{

int c,nr;

nr=0;

cout<<"c=";cin>>c;

while((c>=0)&&(c<=9))

{

nr=nr*10+c;

cout<<"c=";cin>>c;

}

cout<<"numarul creat este "<<nr;

return 0;

}

Adăugarea cifrelor la începutul numărului

#include<iostream>

using namespace std;

int main()

{

int c,nr,p;

nr=0;

p=1;

cout<<"c=";cin>>c;

while((c>=0)&&(c<=9))

{

nr=nr+c*p;

p=p*10;

cout<<"c=";cin>>c;

}

cout<<"numarul creat este "<<nr;

return 0;

}

Extragerea cifrelor unui număr

Dat fiind un număr cu mai multe cifre, se dorește extragerea cifrelor acestuia

Cât timp nu se ajunge la valoarea 0, prin împărțiri succesive se poate obține fiecare cifră

#include<iostream>

using namespace std;

int main()

{

int n,c;

cout<<"n=";cin>>n;

while(n!=0)

{

c=n%10;

cout<<c<<endl;

n=n/10;

}

return 0;

}

Calcularea răsturnatului unui număr

Răsturnatul unui număr se obține prin citirea/scrierea cifrelor acestuia în ordine inversă

Se utilizează cei doi algoritmi de mai sus, de extragere a cifrelor și de creare a unui număr din cifre date pentru a calcula răsturnatul unui număr

#include<iostream>

using namespace std;

int main()

{

int n,nr,c;

cout<<"n=";cin>>n;

nr=0;

while (n!=0)

{

c=n%10;

nr=nr*10+c;

n=n/10;

}

cout<<"inversul numarului este "<<nr;

return 0; }

Algoritmul pentru calcularea c.m.m.d.c a două numere

Fiind date două numere naturale, se va calcula cel mai mare divizor comun

Există doi algoritmi de calcul: algoritmul lui Euclid și algoritmul lui Manna

Algoritmul lui Euclid utilizează împărțirea cu rest pentru a calcula divizorul; acesta este ultimul rest diferit de 0

Algoritmul lui Manna utilizează operația de scădere până când cele două valori sunt egale, valoarea fiind cel mai mare divizor

Algoritmul lui Euclid

#include<iostream>

using namespace std;

int main()

{

int a,b,r;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

while(b!=0)

{

r=a%b;

a=b;

b=r;

}

cout<<"c.m.m.d.c "<<a;

return 0;

}

Algoritmul lui Manna

#include<iostream>

using namespace std;

int main()

{

int a,b;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

while(a!=b)

{

if (a>b)

a=a-b;

else

b=b-a;

}

cout<<"c.m.m.d.c "<<a;

return 0;

}

Algoritmul pentru verificarea primalității unui număr

Se verifică dacă un număr n nu are divizori

Se încearcă împărțirea numărului la valori cuprinse între 2 și

Este posibil să se realizeze împărțirile până la

Varianta 1

#include<iostream>

using namespace std;

int main()

{

int n,t,i;

cout<<"n=";cin>>n;

i=2;

t=1;

while(i<n/2&&t)

if(n%i==0)

t=0;

else

i++;

if(t==1)

cout<<"numarul este prim";

else

cout<<"numarul nu este prim";

return 0;

}

Varianta 2

#include<iostream>

using namespace std;

int main()

{

int n,i,t;

cout<<"n=";cin>>n;

if (n%2==0)

t=0;

else

{

i=3;

t=1;

while (i<n/2 && t)

if (n%i==0)

t=0;

else

i+=2;

}

if(t==1)

cout<<"numarul este prim";

else

cout<<"numarul nu este prim";

return 0;

}

Algoritmul pentru generarea divizorilor unui număr

Fiind dat un număr natural, divizorii acestuia se pot calcula prin împărțiri succesive la valori cuprinse între 1 și numărul dat

Pentru a utiliza mai puțină memorie, se vor realiza împărțirile până la , deoarece următorii divizori sunt multiplii primilor

#include<iostream>

using namespace std;

int main()

{

int n,i;

cout<<"n=";cin>>n;

for(i=2;i<=n/2;i++)

if(n%i==0)

cout<<i<<endl;

return 0;

}

Algoritmi pentru conversii între baze de numerație

Conversia unui număr din baza zecimală într-o bază oarecare, este realizată prin împărțiri succesive

Conversia dintr-o bază oarecare în baza zecimală este realizată prin ridicarea la putere a cifrelor citite și adăugarea la numărul zecimal

Din baza 10 într-o bază b

#include<iostream>

using namespace std;

int main()

{

int n10,b,p,c,nb;

cout<<"n10=";cin>>n10;

cout<<"b=";cin>>b;

p=1;

nb=0;

while (n10!=0)

{

c=n10%b;

n10=n10/b;

nb=nb+p*c;

p=p*10;

}

cout<<"numarul in baza b este "<<nb;

return 0;

}

Din baza b în baza 10

#include<iostream>

using namespace std;

int main()

{

int n10,c,b;

cout<<"b=";cin>>b;

cout<<"c=";cin>>c;

n10=0;

while ((c>=0)&&(c<=b))

{

n10=n10*b+c;

cout<<"c=";cin>>c;

}

cout<<"numarul in baza 10 este "<<n10;

return 0;

}

Algoritmul pentru generarea șirurilor recurente

Cel mai cunoscut șir recurent este șirul lui Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, …….

Se folosesc două variabile care au inițial valoarea 1, acestea sunt utilizate în calcularea celui de-al treilea termen după relația de recurență:

Generarea șirului lui Fibonacci

#include<iostream>

using namespace std;

int main()

{

int n,i,a1,a2,a3;

cout<<"n=";cin>>n;

a1=1;

a2=1;

cout<<a1<<" ";

cout<<a2<<" ";

for(i=3;i<=n;i++)

{

a3=a1+a2;

cout<<a3<<" ";

a1=a2;

a2=a3;

}

return 0;

}

II.2. Algoritmi de sortare

Sunt algoritmi care rearanjează elementele unui vector, astfel încât între acestea să existe o relație de ordine (ordonarea poate fi crescătoare sau descrescătoare).

Sortarea se poate face în același vector sau utilizând un vector auxiliar. Cei mai cunoscuți algoritmi de sortare sunt:

Algoritmul de sortare prin numărare

Algoritmul de sortare prin metoda bulelor

Algoritmul de sortare prin selecția directă

Algoritmul de sortare prin inserție:

Algoritmul de sortare prin inserare

Algoritmul de sortare prin inserarea directă

Algoritmul de sortare prin inserarea rapidă

1. Algoritmul de sortare prin numărare:

Se folosesc trei vectori cu aceeași dimensiune:

Vectorul sursă

Vectorul destinație

Vectorul numărător

Elementele din vectorul sursă se copiază în vectorul destinație

Vectorul destinație respectă relația de ordine

Pentru a ști poziția în care se copiază elementul, se parcurge vectorul sursă și se numără câte elemente sunt mai mici decât el

Fiecare element din vectorul numărător corespunde unui element din vectorul sursă și reprezintă poziția lui din vectorul destinație

Complexitatea algoritmului este liniară (Zaharie, 14) (Sorin, 08)

using namespace std;

#include<iostream>

int main()

{

int a[20],b[20],n,i,j,k[20]={0};

cout<<"n=";cin>>n;

for(i=1;i<=n;i++)

{

cout<<"a["<<i<<"]="; cin>>a[i];

}

for(i=1;i<n;i++)

for(j=i+1;j<=n;j++)

if(a[i]>a[j])

k[i]++;

else

k[j]++;

for(i=1;i<=n;i++)

b[k[i]+1]=a[i];

for(i=1;i<=n;i++)

cout<<b[i]<<" ";

return 0;

}

2. Algoritmul de sortare prin metoda bulelor:

Se parcurge vectorul și se compară fiecare element cu succesorul lui

Dacă nu sunt în ordine, se interschimbă

La fiecare interschimbare, se reia parcurgerea verctorului de la început

Algoritmul se oprește dacă la o parcurgere completă nu se realizează nici o interchimbare

Complexitatea algoritmului este polinomială (Zaharie, 14) (Sorin, 08)

using namespace std;

#include<iostream>

int main()

{

int a[20],n,i,aux,t=0;

cout<<"n=";cin>>n;

for(i=1;i<=n;i++)

{

cout<<"a["<<i<<"]="; cin>>a[i];

}

while(!t)

{

t=1;

for(i=1;i<=n;i++)

if(a[i]>a[i+1])

{

aux=a[i];

a[i]=a[i+1];

a[i+1]=aux;

t=0;

}

}

for(i=1;i<=n;i++)

cout<<a[i]<<" ";

return 0;

}

3. Algortimul de sortare prin selecție directă:

Se aduce pe prima poziție elementul cu valoarea cea mai mică din vector

Se caută apoi elementul cel mai mic din cele rămase

Acesta se aduce pe poziția a doua

Apoi se realizează același lucru cu al treilea element

Procedeul continuă până la ultimul element din vector

Complexitatea algoritmului este polinomială (Zaharie, 14) (Sorin, 08)

using namespace std;

#include<iostream>

int main()

{

int a[20],n,i,j,aux;

cout<<"n=";cin>>n;

for(i=1;i<=n;i++)

{

cout<<"a["<<i<<"]="; cin>>a[i];

}

for(i=1;i<n;i++)

for(j=i+1;j<=n;j++)

if(a[i]>a[j])

{

aux=a[i];

a[i]=a[j];

a[j]=aux;

}

for(i=1;i<=n;i++)

cout<<a[i]<<" ";

return 0;

}

4. Algoritmul de sortare prin inserare:

Se folosesc doi vectori cu aceeași dimensiune:

Vectorul sursă

Vectorul destinație

Elementele din vectorul sursă sunt copiate în vectorul destinație în poziția corespunzătoare

Se respectă relația de ordine în vectorul destinație

Elementele din vectorul destinație sunt deplasate la dreapta

Complexitatea algoritmului este polinomială (Zaharie, 14) (Sorin, 08)

using namespace std;

#include<iostream>

int main()

{

int a[20],n,i,j,b[20],k;

cout<<"n=";cin>>n;

for(i=1;i<=n;i++)

{

cout<<"a["<<i<<"]="; cin>>a[i];

}

b[1]=a[1];

for(i=2;i<=n;i++)

{

j=1;

while((j<=i-1)&&(a[i]>b[j]))

j++;

for(k=i;k>j-1;k–)

b[k]=b[k-1];

b[j]=a[i];

}

for(i=1;i<=n;i++)

cout<<b[i]<<" ";

return 0;

}

5. Algoritmul de sortare prin metoda inserării directe

Se folosesc doi subvectori, obținuți din vectorul inițial

Se aplică procedeul de la metoda inserării

Complexitatea algoritmului este polinomială (Zaharie, 14) (Sorin, 08)

using namespace std;

#include<iostream>

int main()

{

int a[20],n,i,j,aux;

cout<<"n=";cin>>n;

for(i=1;i<=n;i++)

{

cout<<"a["<<i<<"]="; cin>>a[i];

}

for(i=2;i<n;i++)

{

aux=a[i];

j=i-1;

while(j>0&&aux<a[j])

{

a[j+1]=a[j];

j–;

}

if(aux>=a[j])

a[j+1]=aux;

else

{

a[2]=a[1];

a[1]=aux;

}

}

for(i=1;i<=n;i++)

cout<<a[i]<<" ";

return 0;

}

6. Algotimul de sortare prin metoda inserării rapide:

Se împarte vectorul în doi subvectori

Căutarea poziției pentru a insera elementul în subvectorul destinație se face prin algoritmul de căutare binară

Subvectorul destinație se împarte în doi subvectori și se examinează relația de ordine dintre elementul de la mijlocul subvectorului și elementul curent

Divizarea continuă până la găsirea poziției în care se va insera elementul curent

Complexitatea algoritmului este polinomială (Zaharie, 14) (Sorin, 08)

using namespace std;

#include<iostream>

int main()

{

int a[20],n,i,aux,st,dr,m,j;

cout<<"n=";cin>>n;

for(i=1;i<=n;i++)

{

cout<<"a["<<i<<"]="; cin>>a[i];

}

for(i=2;i<=n;i++)

{

aux=a[i];

st=1;

dr=i;

while(st<dr)

{

m=(st+dr)/2;

if(aux<a[m])

dr=m-1;

else

st=m+1;

}

j=i-1;

while(j>=st)

{

a[j+1]=a[j];

j=j-1;

}

a[st]=aux;

}

for(i=1;i<=n;i++)

cout<<a[i]<<" ";

return 0;

}

II.3. Algoritmi teoria grafurilor

II.3.1. Grafuri neorientate

II.3.1.1. Introducere

Se știe că proteinele reprezintă cărămizile structurale ale organismului. Fiecare celulă din corpul uman conține mii de proteine de mai multe tipuri, responsabile cu îndeplinirea diferitelor funcțiuni ale celulei. De exemplu, transmiterea senzațiilor tactile (cum ar fi durerea) este intermediată de diferite tipuri de proteine (plecând de la celulele senzoriale receptoare unde are loc recepția unei lovituri până la nivelul creierului, prin intermediul unei rețele de celule nervoase). În interiorul organismului uman există rețele de celule nervoase formate din celule aranjate una în continuarea celeilalte, care transmit senzația de durere sub forma unui impuls nervos.

Dacă am dori să calculăm viteza de reacție a unui organism la o durere, am putea să transformăm rețelele de proteine (Sedgewick et al, 08) în structuri de date, numite grafuri neorientate. Astfel, o rețea de proteine poate fi mapată informatic sub forma unui graf neorientat, în care fiecare proteină reprezintă un nod iar legăturile dintre ele reprezintă muchiile.

II.3.1.2. Definiții

Un graf neorientat este o pereche ordonată (V, E) unde V={v1,v2,….vn} este o mulțime finită nevidă de elemente numite noduri (sau vârfuri) iar E o mulțime de perechi neordonate din V de forma (vi,vj) unde i≠j, numite muchii. Notăm graful cu G=(V, E) (Sorin et al, 06).

Într-un un graf neorientat G=(V, E) dacă (vi,vj) ϵ E atunci (vj,vi) ϵ E (dacă există muchie de la nodul vi la nodul vj atunci se consideră că există muchie și de la nodul vj la nodul vi).

Un nod este un element al mulțimii V, unde G=(V, E) este un graf neorientat.

O muchie este un element al mulțimii E ce unește două noduri din V, unde G=(V, E) este un graf neorientat.

Într-un graf neorientat G=(V, E) nodurile distincte vi,vj ϵ V sunt adiacente dacă există muchia (vi,vj) ϵ E.

Într-un graf neorientat G=(V, E) muchia (vi,vj) ϵ E este incidentă cu nodurile vi,vj ϵ V.

Într-un graf neorientat G=(V, E) prin gradul unui nod v se înțelege numărul de muchii incidente cu nodul v. Se notează cu d(v) și este un număr natural.

Un nod cu gradul 0 se numește nod izolat. Un nod cu gradul 1 se numește nod terminal.

Exemplu:

Fie graful G=(V,E) din figura alăturată:

Atunci:

Numărul de noduri: n=6

Numărul de muchii: m=8

Mulțimea muchiilor: E={(1,2); (1,3); (1,5); (2,3); (2,4); (2,5); (3,4); (3,5); (4,5)},

Gradele nodurilor: d(1)=3, d(2)=4, d(3)=4, d(4)=3, d(5)=4; d(6)=0

Noduri izolate: 6

Noduri terminale: nu există

Relații utile:

Dacă un graf neorientat are n noduri și m muchii atunci suma gradelor tuturor nodurilor este 2m:

d(1)+d(2)+ …… +d(n)=2m

În orice graf G există un număr par de noduri de grad impar

Componente ale unui graf: Lanț. Circuit.

Într-un graf neorientat G=(V,E) se numește lanț o succesiune de noduri L=[v1, v2,…,vp], cu proprietatea că oricare două noduri consecutive sunt adiacente, adică (vi, vi+1) ϵ E pentru 1≤i<n.

v1, vp se numesc extremitățile lanțului.

Lungimea unui lanț este dată de numărul de muchii din care este format (p-1).

Într-un graf neorientat G=(V,E) se numește lanț elementar lanțul care conține numai noduri distincte.

Într-un graf neorientat G=(V,E) se numește circuit un lanț în care primul nod coincide cu ultimul (Bărbăcioru, 12).

Circuitul este elementar dacă este format doar din noduri distincte, excepție făcând primul și ultimul. Lungimea unui circuit nu poate fi egală cu 2.

Exemplu:

Fie graful G=(V,E) din figura alăturată:

În graf avem:

Numărul de noduri: n=5

Numărul de muchii: m=7

Dacă alegem nodul 1 ca nod inițial și nodul 3 este ca nod final avem:

Un lanț L=[1,2,4,2,5,3] de lungime 5

Un lanț elementar L=[1,5,2,4,3] de lungime 4

Un circuit poate fi {1,2,5,2,3,5,1} de lungime 6

Un circuit elementar {1,2,3,5,1} de lungime 4

Graf parțial. Subgraf

Un graf parțial al unui graf neorientat G=(V, E) este un graf G1=(V, E1), cu proprietatea că E1 E.

Din graful neorientat se suprimă cel puțin o muchie astfel, graful parțial are aceleași noduri și o parte din muchii.

Un subgraf al unui graf neorientat G=(V, E) este un graf G1=(V1, E1), cu proprietățile V1Vși E1E, iar muchiile din E1 sunt muchiile din E care sunt incidente numai cu noduri din mulțimea V1.

Din graful neorientat se suprimă cel puțin un nod și muchiile adiacente cu acesta.

Exemplu:

Cazuri particulare

Se numește graf regulat un graf neorientat în care toate nodurile au același grad.

Se numește graf complet un graf neorientat G=(V, E) în care oricare două noduri sunt adiacente.

Exemplu

După cum se poate observa și în exemplul de mai sus, nu este obligatoriu ca un graf regulat să fie complet. În schimb, un graf complet este obligatoriu graf regulat.

Relații utile:

Într-un graf neorientat complet cu n noduri gradul fiecărui nod este n-1.

Într-un graf neorientat complet cu n noduri și m muchii există relația: .

Există grafuri neorientate cu n noduri.

Exemplu

Fie graful complet alăturat G=(V, E).

Graful G are 6 noduri, gradul fiecărui nod este egal cu 5.

Numărul de muchii poate fi calculat cu ajutorul formulei:

Graf conex. Componentă conexă

Un graf neorientat G=(V, E) este graf conex dacă pentru orice pereche de noduri (x,y) există un lanț care le unește.

Din definiția de mai sus se deduce că un graf cu un singur nod este, prin definiție, conex.

Exemplu

Fie graful G=(V, E) cu 5 noduri.

Acesta este conex deoarece orice pereche de noduri poate fi unită printr-un lanț.

Fie G=(V, E) un graf neorientat și G1=(V1, E1) un subgraf al său. G1 se numește componentă conexă a grafului G dacă:

Între oricare două noduri din V1 exită un lanț

Nu există nici un alt subgraf a lui G care să îndeplinească prima condiție

Un nod izolat este, prin definiție o componentă conexă a unui graf neorientat.

Exemplu

Fie graful G=(V, E) cu 6 noduri.

Graful de mai sus are 3 componente conexe:

{2,3,4};{1,5} și {6}

Graf Hamiltonian

Într-un graf neorientat G=(V, E) se numește lanț hamiltonian un lanț elementar care conține toate nodurile unui graf.

Într-un graf neorientat G=(V, E) se numește circuit hamiltonian un circuit elementar care trece o singură dată prin toate nodurile grafului.

Un graf neorientat care admite un circuit hamiltonian se numește graf hamiltonian.

Teoremă: Dacă G=(V, E) este un graf neorientat cu n noduri (n≥3) și gradul fiecărui nod este mai mare sau egal decât atunci graful G este hamiltonian

Exemplu

Fie graful G=(V, E) cu 8 noduri

Un lanț hamiltonian este L=[1,3,2,4,6,5,7,8]

Un circuit hamiltonian este {1,2,3,4,5,6,7,8,1}

Deci graful G este hamiltonian

Graf Eulerian

Într-un graf neorientat G=(V, E) se numește lanț eulerian un lanț care conține fiecare muchie o dată și numai o dată.

Într-un graf neorientat G=(V, E) se numește circuit eulerian un lanț eulerian în care extremitățile coincid.

Un graf neorientat care conține un circuit eulerian se numește graf eulerian.

Teoremă: Un graf neorientat fără vârfuri izolate este eulerian, dacă și numai dacă este conex și gradele tuturor vârfurilor sunt numere pare.

Condiție necesară și suficientă: Un graf este eulerian dacă și numai dacă oricare vârf al său are gradul par.

Exemplu

Fie graful G=(V,E) cu 6 noduri

Un ciclu eulerian este {1,4,3,5,6,4,2,1}

Grafuri bipartite

Fie un graf neorientat G=(V, E). Graful G se numește bipartit dacă există două submulțimi A, B V astfel încât:

(mulțimile A și B nu au nici un punct comun);

(reuniunea mulțimilor A și B o constituie mulțimea V);

toate muchiile grafului au o extremitate în A și cealaltă în B.

Fie un graf neorientat G=(V, E). Graful G se numește bipartit complet dacă este bipartit și are în plus proprietatea că pentru orice nod x din A și orice nod y din B există muchia (x, y).

Exemple

a) Graful G=(V,E) cu 7 noduri este bipartit:

b) Graful este bipartit complet dacă are forma:

II.3.1.3. Memorarea grafurilor neorientate

Cele mai cunoscute forme de memorare ale unui graf neorientat sunt:

matricea de adiacență

listele de adiancență

vectorul muchiilor

Matricea de adiacență

Fiind dat un graf neorientat G=(V, E), cu n noduri, pentru memorarea acestuia se definește o matrice pătratică Anxn cu elemente numere binare astfel încât:

Proprietăți:

Elementele de pe diagonala principală sunt egale cu 0.

Este o matrice simetrică.

Suma elementelor pe linia i (sau coloana i) este egală cu gradul nodului i.

Dacă toate elementele pe linia i și coloana i sunt egale cu 0 atunci nodul este izolat.

Dacă toate elementele sunt egale cu 1 mai puțin cele de pe diagonala principală atunci înseamnă că graful este complet.

Suma tuturor elementelor din matrice este egală cu dublul numărului de muchii

Dacă numărul de muchii este mic, utilizarea matricei de adiacență este ineficientă.

Pentru a ușura munca programatorului, graful neorientat va fi memorat într-un fișier text astfel: pe prima linie se află numărul de noduri n, iar pe următoarele m linii se află muchiile grafului.

Exemplu

Fie graful G=(V,E)

În graful din alăturată avem:

Numărul de noduri: n=6

Numărul de muchii: m=8

Mulțimea muchiilor:

E={(1,2);(1,3);(1,5);(2,3);(2,4);(2,5);(3,4);(3,5);(4,5)},

Fișierul text graf.txt care conține graful este:

Matricea de adiacență asociată grafului este:

Citirea unui graf neorientat din fișierul text graf.txt și construirea matricei de adiacență se realizează utilizând subprogramul de mai jos. Deoarece același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf.h este (Sorin et al, 06):

void citiren(char nume_fis[20], int a[20][20], int &n)

{

int i,j;

ifstream f(nume_fis);

f>>n;

while(f>>i>>j)

{

a[i][j]=1;

a[j][i]=a[i][j];

}

f.close();

}

Listele de adiacență

Pentru a memora un graf neorientat G=(V, E) cu n noduri, se crează un vector cu n elemente, fiecare element fiind nodul de început al listelor de adiacență. Se memorează apoi nodurile adiacente cu fiecare element al vectorului.

Se utilizează tipul de dată înregistrare pentru alocarea dinamică a memoriei și pentru generarea vectorului ce reține adresele de început a listelor de adiacență alocate dinamic.

Sintaxa este:

struct nod

{

int info;

nod *urm;

};

Exemplu

Fie graful G=(V,E)

În graful alăturat avem:

Numărul de noduri: n=6

Mulțimea muchiilor:

E={(1,2);(1,3);(1,5);(2,3);(2,4);(2,5);(3,4);(3,5);(4,5)}

Fișierul text graf.txt care conține graful este:

Citirea unui graf neorientat din fișierul text graf.txt și construirea listelor de adiacență alocate dinamic se realizează utilizând subprogramul de mai jos. Deoarece același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf1.h este:

void cit_la_dinamic(char nume_fis[20], nod *l[50], int &n)

{

nod *p;

int i,j;

ifstream f(nume_fis);

f>>n;

while(f>>i>>j)

{

p=new nod;

p->urm=l[i];

p->info=j;

l[i]=p;

p=new nod;

p->urm=l[j];

p->info=i;

l[j]=p;

}

f.close();

}

Vectorul muchiilor

Fiecare muchie a grafului poate fi privită ca o înregistrare cu două componente: cele două vârfuri care constitue extremitățile muchiei. Graful în ansamblul său, este o mulțime de muchii.

Se utilizează tipul de date întregistrare pentru a crea vectorul muchiilor. Câmpurile înregistrării sunt extremitățile muchiilor.

Sintaxa:

struct muchie

{

int x,y;

} ;

muchie m[dim];

Exemplu:

Fie graful G=(V,E)

În graful din figura alăturată avem:

Numărul de noduri: n=6

Mulțimea muchiilor: E={(1,2);(1,3);(1,5);(2,3);(2,4);

(2,5);(3,4);(3,5);(4,5)}

Fișierul text graf.txt care conține graful este:

Citirea unui graf neorientat din fișierul text graf.txt și construirea listei muchiilor se realizează utilizând subprogramul de mai jos. Deoarece același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf2.h este:

void cit_muchii(char nume_fis[20], muchie v[20], int &n)

{

int i,j,k=1;

ifstream f(nume_fis);

f>>n;

while(f>>i>>j)

{

v[k].x=i;

v[k].y=j;

k++;

v[k].x=j;

v[k].y=i;

k++;

}

f.close();

}

II.3.1.4. Parcurgerea grafurilor

Reprezintă vizitarea tuturor nodurilor unui graf. Pentru a reuși vizitarea tuturor nodurilor, graful trebuie să fie conex. Parcurgerea eficientă a grafurilor este esențială deoarece mulți algoritmi se bazează pe vizitarea tuturor nodurilor.

Există două modalități consacrate de parcurgere și anume: parcurgerea în lățime (Breath First – BF) și parcurgerea în adâncime (Depth First – DF).

Ambele parcurgeri au următoarea strategie:

Se alege aleatoriu un nod inițial v

Se vizitează toate nodurile adiacente cu v

Dacă există noduri care nu au fost vizitate, se consideră ca fiind nodul de început v și se reia pasul 2 pentru noul nod v

Parcurgerea în lățime (Breath First – BF)

Se vizitează toate nodurile grafului astfel:

Se vizitează nodul v

Se vizitează toate nodurile adiacente cu v

Se vizitează toate nodurile adiacente cu cele anterioare care nu au fost vizitate

Se continuă vizitarea până când nu mai sunt noduri de vizitat

Algoritmul BF

Se inițializează un vector logic cu valoarea 0

Se inițializează coada cu valoarea de început

Pentru acest nod, se trec în coadă toate nodurile adiancente cu el

Pentru toate aceste noduri, se marchează ca fiind vizitate

Se afișează nodurile adiacente

Se extrage primul nod din coadă

Exemplu

Fie graful G=(V, E) cu 7 noduri

Pentru graful alăturat avem parcurgerile:

Nodul de pornire 1: 1, 2, 3, 5, 4, 6, 7

Nodul de pornire 6: 6, 4, 2, 7, 1, 3, 5

Nodul de pornire 3: 3, 1, 5, 2, 4, 6, 7

Parcurgerea în adâncime (Depth First – DF)

Se vizitează toate nodurile grafului începând de la v astfel:

Se vizitează nodul v

Se vizitează un nod x adiacent cu v care nu a fost vizitat încă

Se vizitează un nod y adiacent cu x care nu a fost vizitat încă

Se continuă până când nodul curent nu mai are nici un nod adiacent nevizitat

Se întoarce la un nod care mai are noduri adiacente nevizitate

Se parcurg astfel toate nodurile grafului

Algoritmul DF:

Se inițializează vectorul vizitat cu valoarea 0

Se memorează în stivă nodul v și se marchează ca fiind vizitat

Se trece la următorul nod adiacent cu nodul inițial și se adaugă în stivă

Dacă nodul curent nu mai are noduri adiacente nevizitate, se scoate din stivă

Exemplu

Fie graful G=(V, E) cu 7 noduri

Pentru graful alăturat avem parcurgerile:

Nodul de pornire 1: 1,6,7,4,2,5,3

Nodul de pornire 6: 6, 5,3,1,2,7,4

Nodul de pornire 3: 3,7,4,2,5,1,6

Estimarea timpului de execuție pentru algoritmii de parcurgere a unui graf:

BF și DF utilizând matricea de adiacență au ordinul O(n2)

BF și DF utilizând listele de adiacență au ordinul O(m)

II.3.1.5. Algoritmi elementari pentru grafuri neorientate

Citirea matricei de adiacență și afișarea acesteia (Sorin, 08)

Fie graful neorientat G=(V, E):

Fișierul text în care se memorează graful este:

using namespace std;

#include <iostream>

#include<fstream>

#include "graf.h"

int i,j;

int main()

{

citiren("graf.txt",a,n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

cout<<a[i][j];

cout<<endl;

}

return 0;

}

Memorarea listelor de adiacență alocate dinamic.

using namespace std;

#include<iostream>

#include<fstream>

#include"graf1.h"

nod *l[50];

int n,i;

int main()

{

cit_la_dinamic("graf.txt", l,n);

for (i=1;i<=n;i++)

{

cout<<"noduri adiacente cu "<<i<<endl;

while(l[i])

{

cout<<l[i]->info<<" ";

l[i]=l[i]->urm;

}

cout<<endl;

}

return 0;

}

Memorarea listei muchiilor

using namespace std;

#include<iostream>

#include<fstream>

#include"graf2.h"

muchie v[20];

int n,i;

int main()

{

cit_muchii("graf.txt",v,n);

cout<<"lista muchiilor este"<<endl;

for(i=1;i<=n;i++)

cout<<v[i].x<<" "<<v[i].y<<endl;

return 0;

}

Parcurgerea BF cu matricea de adiacență (Sorin, 08)

using namespace std;

#include<iostream>

#include<fstream>

#include"graf.h"

int coada[20], s[20], i_c=1,sf_c=1,i;

void bf(int nod)

{

coada[i_c]=nod;

s[nod]=1;

while(i_c<=sf_c)

{ i=1;

while(i<=n)

{ if(a[coada[i_c]][i]==1&&s[i]==0)

{ sf_c++;

coada[sf_c]=i;

s[i]=1;

}

i++;

}

cout<<coada[i_c]<<endl;

i_c++;

} }

int main()

{

int x;

citiren("graf1.txt",a,n);

cout<<"dati nodul de pornire ";cin>>x;

bf(x);

return 0; }

Parcurgerea DF recursivă cu matricea de adiacență (Cerchez et al, 06)

using namespace std;

#include<iostream>

#include<fstream>

#include"graf.h"

int s[20];

void df_r(int nod)

{

int i;

cout<<nod<<" ";

s[nod]=1;

for(i=1;i<=n;i++)

if(a[nod][i]==1&&s[i]==0)

df_r(i);

}

int main()

{

int x;

citiren("graf1.txt",a,n);

cout<<"dati nodul de pornire ";cin>>x;

df_r(x);

return 0; }

II.3.2. Grafuri orientate

II.3.2.1. Introducere

Utilizarea site-urilor de socializarea pentru interacționare este una din cele mai comune modalități de comunicare la ora actuală. Dar cum funcționează aceste site-uri? Care este modelul matematic și informatic pe baza căruia sunt sugerați prietenii? Cum este posibilă afișarea aceleași postări mai multor utilizatori?

Site-urile de socializare, gen Facebook, folosesc grafurile orientate pentru a sugera prieteni și a putea afișa aceeași postare mai multor utilizatori, doar pe baza relațiilor dintre ei (Sedgewick et al, 08). Astfel, utilizatorii site-ului de socializare pot fi considerați nodurile grafului orientat, iar legăturile dintre ei, arcele grafului. În acest fel, putem vizualiza cum o postare a unui utilizator sursă poate ajunge ca o notificare la un utilizator care nu este în legătura directă cu acesta, acest lucru fiind posibil datorită conexiunilor unidirecționale sau bidirecționale cu alți utilizatori comuni.

II.3.2.2. Definiții

Se numește graf orientat perechea ordonată G = (V, A), unde V={v1,v2,….vn} este o mulțime finită și nevidă de elemente numite vârfuri (sau noduri), iar A este o mulțime de perechi ordonate de elemente de forma (vi,vj) unde i≠j din V numite arce (Sorin et al, 06).

Dacă există arcul (vi,vj) nu înseamă că există neaparat și arcul (vj,vi).

Grafurile orientate se mai numesc și digrafuri. Grafurile orientate sunt un caz particular al grafurilor neorientate.

În graful orientat G = (V, A), vârfurile distincte vi, vj ϵ V sunt adiacente dacă există cel puțin un arc care le unește.

În graful orientat G = (V, A) dacă există arcul (vi,vj) ϵ A, vom spune că este incident spre exterior cu vi și spre interior cu vj.

În graful orientat G = (V, A) dacă există arcul (vj,vi) ϵ A, vom spune că este incident spre exterior cu vj și spre interior cu vi.

Într-un graf orientat G = (V, A) se numește gradul interior al unui vârf v numărul arcelor incidente spre interior cu v și se notează d-(v).

Într-un graf orientat G = (V, A) se numește gradul exterior al unui vârf v numărul arcelor incidente spre exterior cu v și se notează d+(v).

Relație utilă:

Suma gradelor interioare a tututor nodurilor unui graf este egală cu suma gradelor exterioare a tuturor nodurilor unui graf și este egală cu numărul de muchii din graf.

d-(1)+d-(2)+…..+d-(n)=d+(1)+d+(2)+……+d+(n)=m

Exemplu

Fie graful G=(V,A):

În exemplul din figura alăturată avem:

Numărul de noduri n=6

Mulțimea arcelor A={(1,2); (1,3); (1,5); (2,3); (2,4); (3,4); (4,1); (5,1); (5,2)}

numărul de arce m=9

Gradele nodurilor:

Gradele interioare d-(1)=2, d-(2)=2, d-(3)=2, d-(4)=2, d-(5)=1, d-(6)=0

Gradele exterioare d+(3)=2, d+(2)=2, d+(3)=1, d+(4)=1, d+(5)=2, d+(6)=0

Noduri izolate: 6

Noduri terminale: nu există

Componentele grafurilor. Drum. Ciclu.

Într-un graf orientat G=(V, A) se numește drum o succesiune de noduri D=[v1, v2,…,vp], cu proprietatea că oricare două noduri consecutive sunt adiacente, adică (vi, vi+1) ϵ A pentru 1≤i<n.

v1, vp se numesc extremitățile drumului.

Lungimea unui drum este dată de numărul de muchii din care este format (p-1).

Un drum în care toate vârfurile sunt distincte se numește drum elementar.

Într-un graf orientat, un drum în care vârful inițial coincide cu vârful final și care conține numai arce distincte se numește ciclu.

Exemple:

Fie graful G=(V,A):

În graf avem:

Numărul de noduri n=5

Mulțimea arcelor A={(1,2); (1,3); (1,5); (2,3); (2,4); (3,4); (4,1); (5,1); (5,2)}

Numărul de arce m=9

Un drum este: D=[1,5,2,3,4]

Un ciclu este C={1,2,3,4,1}

Graf parțial. Subgraf

Un graf parțial al unui graf orientat G=(V, A) este un graf G1=(V, A1), cu proprietatea că A1 A.

Din graful orientat se suprimă cel puțin un arc, graful parțial are aceleași număr de noduri.

Un subgraf al unui graf orientat G=(V, A) este un graf G1=(V1, A1), cu proprietățile V1Vși A1A, iar muchiile din A1 sunt muchiile din A care sunt incidente numai cu noduri din mulțimea V1.

Din graful orientat se suprimă un nod și arcele incidente interior și exterior cu acesta.

Exemple

Cazuri particulare

Un graf orientat se numește complet dacă oricare două vârfuri distincte sunt adiacente (câte un arc pentru fiecare direcție).

Se numește graf turneu un graf orientat cu proprietatea că între oricare două vârfuri distincte există exact un arc.

Exemple:

Proprietăți:

În cazul grafurilor orientate, pentru o mulțime de n vârfuri date putem avea grafuri complete.

În orice graf turneu există un drum elementar care conține toate vârfurile grafului.

Orice graf turneu este graf complet.

Graf conex. Componente conexe

Un graf orientat G=(V, A) este graf conex dacă pentru orice pereche de noduri (x,y) există un drum care le unește.

Din definiție se deduce că un graf alcătuit dintr-un singur nod este graf conex.

Exemplu

Fie graful G=(V,A) cu 5 noduri și 5 arce. Graful este conex deoarece există un drum care unește orice pereche de noduri din graf.

Fie G=(V, A) un graf orientat și G1=(V1, A1) un subgraf al său. G1 se numește componentă conexă a grafului G dacă:

Între oricare două noduri din V1 există un drum

Nu există nici un alt subgraf a lui G care să îndeplinească prima condiție

Un nod izolat este, prin definiție o componentă conexă a unui graf orientat.

Exemplu

Fie graful G=(V,A) cu 5 noduri și 4 arce

Componentele conexe ale grafului sunt:

{3,4};{1,2,5};{6}

Graf tare conex.Componente tare conexe

Un graf orientat G=(V, A) este graf tare conex dacă pentru orice pereche de noduri (x,y)ϵV există un drum de la x la y.

Fie G=(V, A) un graf orientat și G1=(V1, A1) un subgraf al său. G1 se numește componentă tare conexă a grafului G dacă:

Între oricare două noduri din V1 exită un drum

Nu există nici un alt subgraf a lui G care să îndeplinească prima condiție

Exemple

Grafuri ponderate

În numeroase situații practice modelate cu ajutorul grafurilor, fiecare muchie/arc a/al grafului are asociat un anumit cost sau o anumită pondere (de exemplu, lungimea cablului necesar pentru conectarea a două calculatoare într-o rețea, costul de transport pe o anumită rută, profitul obținut dintr-o anumită tranzacție etc.).

Graful G=(V, E) (orientat sau neorientat) însoțit de o funcție 𝑐: 𝐸 → 𝑅, prin care se asociază fiecărei muchii/arc din graf un număr real se numește graf ponderat sau rețea.

Pentru a reprezenta un graf ponderat trebuie să reținem și costurile asociate muchiilor/arcelor.

II.3.2.3. Memorarea grafurilor orientate

Cele mai cunoscute forme de memorare ale unui graf orientat sunt:

matricea de adiacență

listele de adiancență

lista arcelor

matricea ponderilor (costurilor)

Matricea de adiacență

Fiind dat un graf orientat G=(V, A), cu n noduri, pentru memorarea acestuia se definește o matrice pătratică Anxn cu elemente numere binare astfel încât:

Proprietăți:

Elementele de pe diagonala principală sunt egale cu 0.

Matricea nu este neapărat simetrică.

Suma elementelor pe linia i este egală cu gradul exterior al nodului i d+(i).

Suma elementelor pe coloana i este egală cu gradul interior al nodului i d-(i).

Dacă toate elementele pe linia i și coloana i sunt egale cu 0 atunci nodul este izolat.

Dacă toate elementele sunt egale cu 1 mai puțin cele de pe diagonala principală atunci înseamnă ca graful este complet.

Suma tuturor elementelor din matrice este egală cu numărului de arce.

Dacă numărul de arce este mic, utilizarea matricei de adiacență este ineficientă.

Pentru a ușura munca programatorului, graful orientat va fi memorat într-un fișier text astfel: pe prima linie se află numărul de noduri n, iar pe următoarele m linii se află arcele grafului.

Exemplu:

Fie graful G=(V,A)

În graful din figura alăturată avem:

Numărul de noduri: n=6

Numărul de arce: m=9

Mulțimea arcelor:

A={(1,2);(1,3);(1,5);(2,3);(2,4);(3,4);(4,1);(5,1);(5,2)}

Fișierul text graf.txt care conține graful este:

Matricea de adiacență asociată grafului este:

Citirea unui graf orientat din fișierul text graf.txt și construirea matricei de adiacență se realizează utilizând subprogramul de mai jos. Deoarece același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf3.h este (Sorin et al, 06):

void citireo(char nume_fis[20], int a[20][20],int &n)

{

int i,j;

ifstream f(nume_fis);

f>>n;

while(f>>i>>j)

a[i][j]=1;

f.close();

}

Listele de adiacență

Pentru a memora un graf orientat G=(V, A) cu n noduri, se crează un vector cu n elemente, fiecare element fiind nodul de început al listelor de adiacență. Se memorează apoi nodurile adiacente cu fiecare element al vectorului.

Se utilizează tipul de dată înregistrare pentru alocarea dinamică a memoriei și pentru generarea vectorului ce reține adresele de început a listelor de adiacență alocate dinamic.

Sintaxa este:

struct nod

{

int info;

nod *urm;

}; nod l[50];

Exemplu

Fie graful G=(V, A)

În graful din figura alăturată avem:

Numărul de noduri: n=6

Numărul de arce: m=9

Mulțimea arcelor:

A={(1,2);(1,3);(1,5);(2,3);(2,4);(3,4);(4,1);(5,1);(5,2)}

Fișierul text graf.txt care conține graful este:

Citirea unui graf orientat din fișierul text graf.txt și construirea listelor de adiacență alocate dinamic se realizează utilizând subprogramul de mai jos. Deoarece același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf4.h este:

void cit_la_dinamic(char nume_fis[20], nod *l[50], int &n)

{

nod *p;

int i,j;

ifstream f(nume_fis);

f>>n;

while(f>>i>>j)

{

p=new nod;

p->urm=l[i];

p->info=j;

l[i]=p;

}

f.close();

}

Lista arcelor

Fiecare arc al grafului poate fi privit ca o înregistrare cu două componente: cele două vârfuri care constitue extremitățile arcului. Graful în ansamblul său, este o mulțime de arce.

Se utilizează tipul de date întregistrare pentru a crea vectorul arcelor. Câmpurile înregistrării sunt extremitățile arcelor.

Sintaxa:

struct arc

{

int x,y;

} ;

arc a[dim];

Exemplu:

Fie graful G=(V,A)

În graf avem:

Numărul de noduri: n=6

Numărul de arce: m=9

Mulțimea arcelor:

A={(1,2);(1,3);(1,5);(2,3);(2,4);(3,4);(4,1);(5,1);(5,2)}

Fișierul text graf.txt care conține graful este:

Citirea unui graf orientat din fișierul text graf.txt și construirea listei muchiilor se realizează utilizând subprogramul de mai jos. Dacă același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf6.h este:

void cit_arce(char nume_fis[20], arc a[20], int &n)

{

int i,j,k=1;

ifstream f(nume_fis);

f>>n;

while(f>>i>>j)

{

a[k].x=i;

a[k].y=j;

k++;

}

f.close();

}

Matricea ponderilor (costurilor)

Fiind dat un graf orientat G=(V, A), cu n noduri, pentru memorarea acestuia se atașează fiecărui arc o pondere (un cost) se definește astfel o matrice pătratică Anxn:

Matricea ponderilor forma 1

Matricea ponderilor forma 2

Exemplu

Fie graful G=(V,A)

În graful din figura alăturată avem:

Numărul de noduri: n=6

Numărul de arce: m=8

Mulțimea arcelor:

A={(1,2);(1,3);(1,5);(2,3);(2,4);(3,4);(4,1);(5,2)}

Fișierul text graf.txt care conține graful este:

Citirea unui graf orientat din fișierul text graf.txt și construirea matricei de adiacență se realizează utilizând subprogramul de mai jos. Deoarece același subprogram este apelat în mai multe programe, este utilă crearea unui fișier header care să fie inclus în programele următoare.

Fișierul graf5.h este:

const float pinf=1.e20;

void cit_cost(char nume_fis[20], float a[20][20], int &n)

{

int i,j;

float c;

ifstream f(nume_fis);

f>>n;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j)

a[i][j]=0;

else

a[i][j]=pinf;

while(f>>i>>j>>c)

a[i][j]=c;

f.close();

}

II.3.2.4. Parcurgerea grafurilor

Există două modalități consacrate de parcurgere și anume: parcurgerea în lățime (Breath First – BF) și parcurgerea în adâncime (Depth First – DF). Algoritmii de parcurgere sunt similari cu cele de la grafurile neorientate. Acestea au fost prezentate în capitolul anterior.

II.3.2.5. Drumuri de cost minim

Algoritmii existenți pentru determinarea drumurilor optime în grafuri se împart în două mari categorii: algoritmi pentru drumuri minime și algoritmi pentru drumuri maxime (Lucanu, 15).

Acești algoritmi sunt pentru două categorii de probleme și anume:

determinarea drumurilor optime de sursă unică (sursă unică, destinații multiple)

determinarea drumurilor optime între toate perechile de vârfuri (surse multiple, destinații multiple)

Cei mai cunoscuți algoritmi pentru calcularea drumurilor optime în grafuri sunt:

Algoritmul Dijkstra: determină drumurile minime cu sursă unică în grafuri care admit doar costuri pozitive

Algoritmul Dantzig: determină drumurile minime cu sursă unică în grafuri care admit doar costuri pozitive

Algoritmul Bellman-Ford: drumuri minime cu sursă unică în grafuri care admit costuri negative, dar fără circuite de cost negativ

Algoritmul Roy-Floyd (Floyd-Warhall): drumuri minime între oricare două noduri

Algoritmul Bellman-Kalaba: drumuri maxime cu sursă unică și număr fixat de pași

Algoritmul Floyd-Warshall: drumuri maxime între oricare două noduri în grafuri fără circuite

În continuare vor fi prezentați trei algoritmi: algoritmul lui Dijkstra, algoritmul Roy-Floyd și algoritmul Bellman-Ford.

1. Algoritmul lui Dijkstra

Este un algoritm care calculează drumurile minime dintr-un graf de la un nod la toate celelalte noduri din graf. Algoritmul funcționează atât pe grafuri conexe cât și pe grafuri neconexe. Daca nu există nici un drum de la nodul de start la un alt nod al grafului atunci algoritmul lui Dijkstra va raporta, lipsa oricărui drum între cele două noduri. Algoritmul utilizează metoda Greedy generând drumurile minime în ordinea crescătoare a lungimilor (Crețu, 15).

Algoritmul se aplică pentru următorul tip de problemă:

Fiind dat un graf orientat G=(V, A), să se determine pentru toate vârfurile xi dacă există drum de la x0 la xi și lungimea celui mai scurt drum precum și unul dintre drumurile minime de la x0 la xi.

Date de intrare:

Algoritmul pornește de la un graf orientat și ponderat cu n noduri

De asemenea, există un nod de start aparținând grafului – acesta este nodul de la care se doreste aflarea drumurilor minime până la celelalte noduri din graf

Date de ieșire:

un tablou D cu n valori, conținând distanțele minime de la nodul de start la toate celelalte noduri din graf

se mai poate obține arborele drumurilor minime – acesta este un arbore reprezentat sub forma unui tablou T cu n valori (vectorul tata din reprezentarea arborilor)

Algoritmul Dijkstra (Rebedea et al, 15, a):

Pasul 1: Se pornește din x0 nodul se marchează ca vizitat. Se calculează cel mai scurt drum de la x0 la unul din celelalte vârfuri ale grafului este dat de arcul (x0,xj) de lungime minimă.

Pasul 2: Se calculează valorile pentru vectorul D (lungimile tuturor drumurilor de la nodul x0 la toate celelalte noduri la un moment dat) din matricea costurilor A. În același timp, se completează vectorul T cu valorile nodurilor care au un cost finit al drumului de la x0 la ele.

Pasul 3: Dintre nodurile neselectate, se alege cel cu distanța cea mai mică, xk, se marchează nodul ca vizitat și se actualizează vectorul D utilizând acest nod intermediar xk. Astfel, se verifică dacă drumul care trece prin acest nod intermediar are costul mai mic (D(j)>D(xk)+A(xk,j)), dacă da, se înlocuiește costul și se modifică vectorul T. Se repetă acest pas până când nu mai există noduri neselectate.

Pasul 4: Se trasează toate drumurile de la fiecare nod la x0

Algoritmul lui Dijkstra pseudocod:

pentru fiecare j V(G) execută

D[j] ∞

T[j] 0

sfârșit pentru

D[x0]0

S

QV(G) //Q este o coadă conținând toate nodurile neselectate

cât timp Q0 execută

xk minim(Q)

SS { xk }

pentru fiecare j vecin cu u execută

dacă D[j]D[xk]+A(xk,j) atunci // se verifică distanța mnimă

D[j]D[xk]+A(xk,j)

T[j] xk

sfârșit dacă

sfârșit pentru

sfârșit cât timp

2. Algoritmul lui Roy-Floyd

Este un algoritm care calculează drumurile minime dintr-un graf de la un nod oarecare la toate celelalte noduri din graf. Dacă nu există nici un drum de la nodul de start la un alt nod al grafului atunci algoritmul va raporta, lipsa oricărui drum între cele două noduri. Algoritmul utilizează metoda Divide et Impera de calculare.

Algoritmul se aplică pentru următorul tip de problemă:

Fie G=(V, A) un graf orientat, unde V are n elemente (n noduri) și A are m elemente (m muchii) memorat prin matricea ponderilor. Se cere să se determine toate drumurile de cost minim între oricare două noduri din graf .

Date de intrare:

Algoritmul pornește de la un graf orientat și ponderat cu n noduri

Se utilizează matricea costurilor A

Date de ieșire:

Lungimile tuturor drumurilor din graf

Un drum între două noduri selectate

Algoritmul lui Roy-Floyd (Rebedea et al, 15, c):

Pasul 1: Se generează matricea ponderilor de forma I. Memorându-se doar drumurile directe între oricare două noduri din graf

Pasul 2: Se încearcă pentru oricare pereche de noduri i, j să se obțină drumuri mai scurte trecând prin noduri intermediare k (kϵ1…n). Se compară lungimea lanțului a[i,j] cu lungimea lanțului care trece prin k: dacă a[i,j] > a[i,k]+a[k,j] atunci a[i,j] ←a[i,k]+a[k,j]

Pasul 3:Pentru două noduri citite x, y se cere să se reconstituie un lanț optim de la x la y.

Algoritmul Roy-Floyd pseudocod:

pentru k←1,n execută

pentru i←1,n execută

pentru j←1,n execută

dacă (A[i][k]≠INF și A[k][j]≠INF) atunci

dacă A[i][j]>A[i][k]+A[k][j] atunci

A[i][j] A[i][k] + A[k][j]

sfârșit dacă

sfârșit dacă

sfârșit pentru

sfârșit pentru

sfârșit pentru

3. Algoritmul Bellman-Ford

Algoritmul Bellman-Ford determină drumurile de cost minim dintre un nod desemnat ca sursă (plecare) și restul nodurilor accesibile lui chiar dacă există costuri negative pe arce. Aceste rezultate sunt furnizate numai în situația în care nodul de plecare nu face parte dintr-un circuit de cost negativ.

Algoritmul se aplică pentru următorul tip de problemă:

Se consideră un graf orientat G=(V, A) și o funcție de cost c : A R. Mulțimea V conține n vârfuri. Se desemnează un nod p de plecare. Pentru orice nod jV se cere determinarea drumului de cost minim de la p la j. Se vor detecta situațiile în care există circuite de cost negativ care includ nodul p.

Strategia algoritmului este aceea de minimizare succesivă a costului drumului minim de la nodul de plecare la orice alt nod din graf, până la obținerea costului minim. Această operație se face prin verificarea posibilității ca fiecare arc (i,j)U să participe la minimizarea distanței de la p la j. Operația se face cu o trecere completă prin toate arcele grafului.

Algoritmul Bellman-Ford pseudocod (Rebedea et al, 15, b):

pentru fiecare v V(G) execută

D[v] ∞

T[v] 0

sfârșit pentru

D[nod]0

pentru i=1,n-1 execută

dacă D[v]D[u]+A[u,v] atunci

D[v]D[u]+A[u,v]

T[v]u

sfârșit dacă

sfârșit pentru

pentru fiecare arc (u,v)A(G) execută

dacă D[v]D[u]+A[u,v] atunci

returnează Fals

sfârșit dacă

sfârșit pentru

returnează Adevarat

Algoritmul returnează Adevarat dacă și numai dacă graful nu conține circuite de cost negativ accesibile din sursa p și Fals în caz contrar.

II.3.2.6. Algoritmi elementari pentru grafuri orientate

Citirea matricei de adiacență

using namespace std;

#include<iostream>

#include<fstream>

#include"graf3.h"

int a[20][20],n,i,j;

int main()

{

citireo("graf.txt",a,n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

cout<<a[i][j]<<" ";

cout<<endl;

}

return 0; }

Citirea listelor de adiacență

using namespace std;

#include<iostream>

#include<fstream>

#include"graf4.h"

nod *l[50];

int n,i;

int main()

{

cit_la_dinamic("graf.txt", l,n);

for (i=1;i<=n;i++)

{

cout<<"noduri adiacente cu "<<i<<endl;

while(l[i])

{

cout<<l[i]->info<<" ";

l[i]=l[i]->urm;

}

cout<<endl;

}

return 0; }

Citirea cu lista arcelor

using namespace std;

#include<iostream>

#include<fstream>

#include"graf6.h"

arc a[20];

int n,i;

int main()

{ cit_arce("graf.txt",a,n);

cout<<"lista arcelor este"<<endl;

for(i=1;i<=n;i++)

cout<<a[i].x<<" "<<a[i].y<<endl;

return 0; }

Citire cu matricea ponderilor

using namespace std;

#include <iostream>

#include<fstream>

#include "graf5.h"

int i,j,n;

float a[20][20];

int main()

{

cit_cost("graf2.txt",a,n);

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

if(a[i][j]==pinf)

cout<<'\236'<<" ";

else

cout<<a[i][j]<<" ";

cout<<endl;}

return 0;

}

Drumuri de cost minim

Algoritmul lui Dijkstra (Cerchez et al, 06):

using namespace std;

#include<iostream>

#include<fstream>

#include"graf5.h"

float a[20][20], d[20], mini;

int s[20],t[20], n,i,j,r,poz;

void drum(int i)

{

if(t[i])

drum(t[i]);

cout<<i<<" ";

}

int main()

{

cit_cost("graf2.txt",a,n);

cout<<"r=";cin>>r;

s[r]=1;

for(i=1;i<=n;i++)

{

d[i]=a[r][i];

if(i!=r)

if(d[i]<pinf)

t[i]=r;

}

for(i=1;i<=n-1;i++)

{

mini=pinf;

for(j=1;j<=n;j++)

if(s[j]==0)

if(d[j]<mini)

{

mini=d[j];

poz=j;

}

s[poz]=1;

for(j=1;j<=n;j++)

if(s[j]==0)

if(d[j]>d[poz]+a[poz][j])

{

d[j]=d[poz]+a[poz][j];

t[j]=poz;

}

}

for(i=1;i<=n;i++)

cout<<d[i]<<" ";

cout<<endl;

for(i=1;i<=n;i++)

if(i!=r)

if(t[i])

{

cout<<"distanta de la "<<r<<" la "<<i<<" este: "<<d[i]<<endl;

drum(i);

cout<<endl;

}

else

cout<<"nu exista drum de la "<<r<<" la "<<i<<endl;

return 0;

}

Algoritmul Roy-Floyd (Sorin et al, 06):

using namespace std;

#include<iostream>

#include<fstream>

#include"graf5.h"

float a[20][20];

int n,i,j;

void drum(int i, int j)

{

int k=1, gasit=0;

while ((k<=n)&& !gasit)

{

if(i!=k && j!=k && a[i][j]==a[i][k]+a[k][j])

{

drum(i,k);

drum(k,j);

gasit=1;

}

k++; }

if(!gasit) cout<<j<<" ";

}

void scriu_drum(int nod_ini,int nod_fin)

{

if(a[nod_ini][nod_fin]<pinf)

{

cout<<"drumul de la "<<nod_ini<<" la "<<nod_fin<<" are lungimea "<<a[nod_ini][nod_fin]<<endl;

cout<<nod_ini<<" ";

drum(nod_ini,nod_fin);

}

else

cout<<"nu exista drum de la "<<nod_ini<<" la "<<nod_fin;

}

void lung_drum()

{ int i,j,k;

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(a[i][j]>a[i][k]+a[k][j])

a[i][j]=a[i][k]+a[k][j];

}

int main()

{ cit_cost("graf2.txt",a,n);

lung_drum();

scriu_drum(5,3);

return 0; }

III.1. Considerații metodice

III.1.1. Despre competențele secolului XXI

Educația, ca funcție deopotrivă socială și economică, are un rol fundamental în dobândirea de către cetățenii europeni a competențelor cheie necesare pentru adaptarea la aceste schimbări.

Idealul educațional, ca element reglator al noului curriculum nu mai are în vedere „formarea forței de muncă” ci dezvoltarea liberă integrală a individului uman (Bercu et al, 10). Competențele cheie sunt necesare oricărui individ pentru formarea și dezvoltarea personală, cetățenie activă, muncă și incluziune socială.

Cele opt domenii ale Competențelor cheie sunt:

Comunicarea în limba maternă

Comunicare în limbi străine

Competențe în matematică și competențe elementare în științe și tehnologie

Competențe în utilizarea noilor tehnologii informaționale și de comunicație

Competențe pentru a învăța să înveți

Competențe de relaționare interpersonală și competențe civice

Spirit de inițiativă și antreprenoriat

Sensibilizare culturală și exprimare artistică

III.1.2. Taxonomia lui Bloom

Dicționarul explicativ al limbii române definește învățătura ca fiind un precept la care se ajunge prin experiență practică sau pregătire teoretică.

Școala constructivistă urmărește învățarea prin înțelegere (Constantinescu, 15, a), învățarea cu sens, ceea ce presupune că lucrurile nou învățate sunt construite pe cele deja cunoscute. Înțelegerea unui concept înseamnă capacitatea de a-l explica prin referire la alte concepte. Dacă înțelegem ce învățăm, atunci informația nouă se conectează la cea existentă. În acelați timp, învățarea cu succes are loc printr-un proces personal de construire de ipoteze. Cel care învață își construiește cunoștințele. Numai elevul care a înțeles conceptul, va putea opera cu el.

Ce înseamnă a înțelege pe deplin un subiect? Ce înseamnă să poți utiliza ce ai învățat în situații noi?

Un răspuns a fost dat de către Benjamin Bloom care, în anul 1965 a descris procesul gândirii cognitive. Acesta a împărțit învățarea într-o paleta de sarcini sau abilități, numită taxonomie. Lista sa de procese cognitive este organizată pornind de la cele mai simple, amintirea cunoștințelor, până la cele mai complexe, cum ar fi emiterea unei judecăți cu privire la valoarea unei idei. Învățarea este completă dacă sunt atinse toate treptele.

Tot Bloom a definit noțiunea de obiectiv educațional ca fiind modalitatea de măsurare a procesului de învățare. În crearea obiectivelor operaționale, Bloom a dat o listă de verbe care pot fi utilizate pentru atingerea celor șase capacități (Bloom et al, 56):

Cunoștințe: amintirea informațiilor

Înțelegere: înțelegerea sensului, parafraza unui concept

Aplicare: utilizarea informațiilor sau a conceptului într-o situație nouă

Analiză: descompunerea informațiilor sau a conceptelor în părți pentru a le înțelege mai bine

Sinteză: folosirea ideilor pentru a produce ceva nou

Evaluare: emiterea de judecăți de valoare

III.1.3. Taxonomia lui Bloom revizuită

Lumea de astăzi este totuși diferită de cea pe care o reflecta taxonomia lui Bloom în 1956. Specialiștii în domeniul pedagogiei au învățat mult mai multe despre cum învață elevii și cum predau profesorii și recunosc acum că procesele de predare și învățare cuprind mult mai multe decât gândirea. Aceste procese implică și sentimentele și convingerile elevilor și ale profesorilor, precum și mediul social și cultural al clasei.

Ca orice model teoretic, taxonomia lui Bloom are punctele sale forte și slabe. Cel mai important punct forte al său este acela că a abordat subiectul foarte important al gândirii și a elaborat o structură în jurul său care poate fi utilizată de profesioniști. După crearea taxonomiei, unul din punctele slabe, subliniat de către însuși Bloom a fost diferența substanțială dintre categoria „cunoașterii” și celelalte cinci nivele ale procesului de gândire. Bloom a conștientizat diferența dintre cunoștință și procesele intelectuale și mentale realizate utilizând acea cunoștință.

În plus, atâtea activități care merită a fi desfășurate, cum ar fi problemele autentice sau proiectele, nu pot fi clasificate după taxonomie și numai încercarea de a le clasifica astfel le-ar diminua potențialul de oportunități de învățare.

Astfel, în 1999, Lorin Anderson și colegii săi au publicat o versiune actualizată a taxonomiei lui Bloom, care ia în considerare un număr mai mare de factori care au impact asupra predării și învățării. Această taxonomie revizuită încearcă să actualizeze unele concepte ale celei originale. Spre deosebire de versiunea din 1956, noua taxonomie face diferența între „ a ști ce”, conținutul gândirii și „a ști cum”, procedeele utilizate în rezolvarea problemelor.

Anderson, fost student a lui Bloom a împărțit cunoștințele în patru categorii: cunoștințe faptice, cunoștințe conceptuale, cunoștințe procedurale și cunoștințe metacognitive.

Potrivit acestei taxonomii, fiecărui nivel de cunoștințe îi poate corespunde un nivel al proceselor cognitive, astfel că elevul poate să-și amintească cunoștințe faptice sau procedurale, să înțeleagă cunoștințe conceptuale sau metacognitive sau să analizeze cunoștințe metacognitive sau faptice. După Anderson și colegii săi, „Învățarea care are sens le oferă elevilor cunoștințele și procesele cognitive de care au nevoie pentru a putea rezolva probleme.” (Anderson et al, 01).

Cunoștințele faptice sunt acele noțiuni de bază care sunt necesare elevilor pentru familiarizarea cu anumite domenii, discipline sau probleme.

Cunoștințele conceptuale sunt acele informații pe care elevii le utilizează pentru interdisciplinaritate și conexiuni cu viața reală.

Cunoștințele procedurale sunt reprezentate de metodele de descoperire, analizare, criticare și adaptare a algoritmilor și tehnicilor de rezolvare a problemelor la cele din viața reală.

Cunoștințele metacognitive sunt noțiunile necesare pentru cunoașterea în sine, precum și întelegerea procesului de învățare și gandire propriu.

Deși pare surprinzător, Bloom a definit primele trei tipuri de cunoștințe în taxonomia proprie. Aceste noțiuni au fost puțin înțelese de către profesori și mult mai puțin aplicate în decursul timpului. În general, au fost utilizate doar cele șase nivele ale procesului de gândire precum și lista verbelor.

Comparație între cele două taxonomii:

Taxonomia revizuită pune accentul pe modalitatea de atingere a capacităților descrise. Astfel, atingerea și depășirea unui nivel implică găsirea răspunsului adecvat pentru fiecare din întrebările de mai jos:

Reamintirea: pot elevii să își amintească informațiile?

Înțelegere: pot elevii să explice idei sau concepte?

Aplicarea: pot elevii să utilizeze înformațiile în situații noi?

Analizarea: pot elevii să facă distincția dintre diferite informații?

Evaluarea: pot elevii să justifice o decizie?

Crearea: pot elevii să utilizeze informațiile pentru a crea propriul punct de vedere?

III.1.4. Predarea prin proiecte

Autoînvățarea și învățarea informală în grup sunt modalități importante de dezvoltare a abilităților și competențelor în utilizarea noilor tehnologii informaționale și de comunicare. Aceste procedee sunt extrem de importante și în cadrul educației formale a elevilor. Integrarea tehnologiilor informaționale și de comunicație în procesul educativ oferă persoanelor posibilitatea de a-și dezvolta relațiile sociale precum și competențele de comunicare, acest lucru poate duce la o învățare activ-partcipativă din partea elevilor. Instrumentele și platformele e-learning și de comunicare socială devin din ce în ce mai populare. Acestea sunt blog-urile, wiki-urile, site-uri sociale virtuale, alături de alte instrumente precum telefoanele mobile, tabletele, e-reader-urile și altele. Acestea sunt ușor de utilizat, accesibile și larg răspândite.

Dezvoltarea abilităților de inovație necesită metodologii și strategii de predare/învățare/evaluare noi, bazate pe metode de învățare activă precum: rezolvarea în mod creativ a problemelor, învățarea prin descoperire, învățarea prin practică, învățarea prin experimentare, gândirea critică și creativitatea (Constantinescu, 15, b).

Proiectele ar trebui să dezvolte abordări inovatoare de consolidare a abilităților de a învăța și a capacităților de inovare. Se dorește realizarea de proiecte interdisciplinare sau de abordare a problemelor din viața de zi cu zi care utilizează instrumente și tehnologii moderne și care ating următoarele aspecte:

încurajarea creativității

genereze idei noi și soluții inovatoare

încurajarea învățării prin autointerogare și rezolvare de probleme

colaborarea în cadrul unui grup de lucru

autoevaluarea progresului făcut

Dintre metodele interactive utilizate pe scară largă în școli, metoda proiectelor interdisciplinare și-a dovedit în ultimii ani o deosebită eficiență.

Metoda proiectelor ca strategie de predare-învățare-evaluare se concentrează pe cercetarea realizată de elevi, pe depistarea detaliilor și înțelegerea subiectului în întreaga sa amploare, pe generarea ideilor proprii, pe crearea unui produs final și pe susținerea acestuia în fața colegilor ceea ce constituie garanția activității de învățare, deoarece permite folosirea unei multitudini de tehnici de structurare a materiei și poate fi folosită la toate nivelurile de școlarizare.

Metoda proiectelor asigură o învățare diferențiată, bazată pe experiență, individualizată, în cadrul căreia elevul experimentează lucruri noi. Elevii sunt permanent bombardați cu informații din mass-media, iar profesorii sunt puși în fața unor elevi care dețin deja informațiile sub diverse forme. Profesorii sunt puși în postura de a corecta informațiile primite și de a determina elevii să adopte o atitudine pozitivă în ceea ce privește procesul instructiv-educativ. Unul dintre dezavantajele fluxului continuu de informații a accestui secol este scăderea interesului elevilor pentru procesul de învățare. Este cazul să ne întrebăm din ce în ce mai mult dacă reproducerea informațiilor este necesară reușitei elevilor, în momentul în care informațiile sunt doar la un clic distanță.

Utilizând metoda proiectului se încearcă îmbinarea învățării spontane cu cea dirijată. Această metodă oferă posibilitatea de a respecta ritmul individual de învățare și înțelegere a fiecărui copil din clasă, cadrul didactic stabilind obiectivele de învățare, dar și metodele specifice prin care va urmări realizarea acestora. Copiii învață în ritmuri diferite, deci strategiile de predare-învățare-evaluare trebuie adaptate în consecință. Toți elevii au puncte forte dar și puncte slabe. Pentru a depăși punctele slabe, educatorul dorește să se bazeze pe interesele și pe capacitățile fiecărui copil. Este necesară deci o înțelegere prealabilă a dinamicii clasei de elevi, precum și a nivelului fiecărui elev și a intereselor acestora.

Cadrul didactic își asumă prin această metodă de predare rolul de mediator în cadrul clasei și nu numai. Transferul de informații nu va mai fi într-un sens unic, de la profesor la elev ci va deveni o descoperire, o îndrumare și o dezbatere pentru a ajunge la informațiile corecte. La fiecare unitate de învățare, este necesară stabilirea unei strategii de predare-învățare-evaluare astfel încât clasa de elevi să poată atinge un nivel de înțelegere acceptabil.

Elevul nu va mai fi doar receptor, ci va fi un factor important în structurarea și implementarea metodei proiectului pentru o unitate de învățare. El va fi implicat activ în înțelegerea materiei, răspunderea la întrebările întâlnite pe parcurs, găsirea unor noi modalități de abordare a informațiilor, crearea unui produs final care să arate nivelul de înțelegere atins ca și prezentarea acestui produs și discutarea ideilor de îmbunătățire primite din exterior.

Această metodă de predare-învățare-evaluare dorește să scoată elevii alături de profesori din zona de confort și să îi pună în situații cât mai apropiate de viața reală. Abordarea unei noi metode activ-participative nu înseamnă că profesorul nu mai este o parte importantă a procesului educativ ci înseamnă includerea elevului în propria învățare. În utilizarea acestei metode se pune accentul pe dezvoltarea abilităților necesare în acest secol.

Abilități necesare în secolul XXI (Rychen et al, 03), conform celor opt competențe cheie date de comisia europeană sunt:

Responsabilitate și capacitate de adaptare, obținute prin:

exersarea responsabilității personale și a flexibilității în contexte legate de propria persoană, loc de muncă și comunitate

stabilirea și atingerea unor standarde și țeluri ridicate pentru sine și pentru ceilalți

tolerarea ambiguității

Competențe de comunicare, realizate prin:

înțelegerea și realizarea unei comunicări eficiente verbale, scrise și multimedia, într-o varietate de forme și contexte

Creativitate și curiozitate intelectuală, realizată prin:

dezvoltarea, implementarea și comunicarea ideilor noi altor persoane

deschidere și receptivitate la nou, perspective variate

Gândire critică și gândire sistemică, obținută prin:

exersarea gândirii în ce privește înțelegerea și realizarea unor alegeri complexe

înțelegerea conexiunilor dintre sisteme

Informații și abilități media, realizate prin:

analizarea, accesarea, administrarea, integrarea, evaluarea și crearea de informații în diverse forme și medii

Capacități de colaborare și interpersonale, obținute prin:

demonstrarea capacităților de lucru în echipă și de conducere

adaptarea la diverse roluri și responsabilități

colaborarea productivă cu ceilalți

conduită empatică

respectarea altor puncte de vedere

Identificarea, formularea și soluționarea problemelor, realizată prin:

capacitatea de a depista, formula, analiza și rezolva probleme

Auto-formare, descrisă de:

monitorizarea propriilor nevoi de înțelegere și învățare

localizarea resurselor corespunzătoare

transferul cunoștințelor dintr-un domeniu în altul

Responsabilitate socială, realizată prin:

acționarea în mod responsabil, ținând cont de interesele comunității

demonstrarea unui comportament etic în contexte legate de propria persoană, loc de muncă și comunitate

Dar, nu toate unitățile de învățare pot să includă un proiect, însă în momentul în care învățarea pe bază de proiect este adecvată, integrarea unui proiect poate stimula semnificativ învățarea elevilor. De aceea, există nivele diferite ale modelării unei unități de învățare:

bazată pe proiect de la început până la sfârșit

include un proiect ca și experiență culminantă

include un proiect într-un anumit segment al unității.

III.1.4.1. Etapele implementării

Un proiect bun necesită o bună planificare și o bună organizare în avans, realizată de către profesor. Este foarte ușor să se greșească implementarea proiectului, începând de la unitatea la care se dorește să se integreze metoda proiectului, continuând cu cerințele proiectului care să nu fie în concordanță cu nivelul clasei de elevi și finalizând cu evaluarea proiectelor care să nu atingă toate tipurile de evaluare. O modalitate de a corecta o parte din aceste posibile erori este de a realiza proiectul de către profesor pentru a reuși să structureze un proiect care să atingă toate obiectivele și care să asigure o învățare adecvată pentru întreaga clasă de elevi.

După stabilirea unității și generarea primelor idei, profesorii ar putea parcurge o listă de întrebări despre proiectul ce urmează să fie implementat. Unele criterii pentru lista de verificare a caracteristicilor proiectului este:

Elevii se află în centrul procesului de instruire și își demonstrează cunoștințele și abilitățile prin intermediul produselor care sunt prezentate

Proiectul are conexiuni cu lumea reală și implică metode de evaluare multiple și continue

Proiectul implică sarcini de lucru și activități conectate, care se desfășoară într-o anumită perioadă de timp

Tehnologia sprijină și îmbunătățește procesul de învățare al elevilor, sprijinind diverse stiluri de învățare

Abilitățile de gândire de nivel superior sunt incluse în activitatea de proiect.

Un alt aspect pozitiv în metoda proiectului este utilizarea tuturor tipurilor de evaluare (inițială, sumativă și formativă). De asemenea, utilizarea autoevaluării și interevaluării permit elevilor dezvoltarea unui spirit critic pe lângă acceptarea opiniilor din exterior pentru îmbunătățirea propriei învățări. În acest sens, evaluarea integrată și continuă stă la baza învățării bazate pe proiect. În cadrul metodei proiectului, evaluarea este integrată astfel încât: utilizează o varietate de strategii de evaluare, include metode de evaluare pe tot parcursul procesului de instruire, evaluează obiectivele importante ale unității de învățare și nu în ultimul rând, implică elevii în propria evaluare. Implicarea elevilor în evaluarea proprie și în interevaluare este un proces amplu. În general, în procesul educativ, elevii se așteaptă la o notare din exterior, de cele mai multe ori criteriile nefiind clare acestora. În acest mod, se dezvoltă de către elevi percepția greșită asupra nivelului propriu de înțelegere precum și asupra evaluării. Prin această meodă, evaluarea nu mai este privită ca o simplă cotare a nivelului de informații deținute ci este privită ca un instrument de ghidare pentru atingerea tuturor obiectivelor proiectului. Elevii fiind evaluați continuu, sunt încurajați să utilizeze rezultatele evaluării continue pentru îmbunătățirea produsului final și atingerea unui nivel ridicat de înțelegere a unității de învățare.

Pentru a implica elevii în procesul de evaluare, cadrul didactic le va asigura: criterii clare, comunicate de la începutul unității, exemple și sugestii pentru o activitate de calitate ridicată, oportunități de monitorizare a propriului progres, metode pentru oferirea unui feedback constructiv colegilor și pentru încorporarea feedback-ului primit de la ceilalți pentru a îmbunătăți activitatea proprie, timp pentru reflecție și pentru îmbunătățirea produselor activității și sprijin în stabilirea unor obiective noi, pentru activitățile ulterioare de învățare.

Planificarea evaluării continue, centrate pe elev, necesită o planificare în prealabil. Evaluarea înițială dă informații despre nivelul cunoștințelor elevilor înainte de începerea capitolului și despre modalitatea de abordare a unității de învățare. Evaluarea abordată prin metoda proiectului pune accent pe gândirea de ordin superior și abilitățile necesare în secolul XXI în activitatea elevilor, implicarea elevii în înțelegerea așteptărilor cu privire la respectivul proiect, a obiectivelor și a criteriilor de evaluare înainte de a începe lucrul la proiect, utilizarea unei grile cu criterii pe tot parcursul proiectului pentru a înțelege așteptările și cel mai important, elevii creează grile și alte evaluări pentru a le folosi pe parcursul unui proiect. Evaluarea în cadrul unui proiect va monitoriza și comportamentul individual precum și cel de grup, va monitoriza de asemenea și învățarea independentă. Abordarea unei evaluări care să implice și elevii necesită o discutare a tuturor criteriilor și așteptărilor. Informațiile obținute ajută cadrul didactic în a oferi sugestii, a da instrucțiuni și a răspunde la întrebări. Evaluarea sumativă va da informații cu privire la instruirea viitoare precum și informații despre alte instrumente de evaluare și alte teme pentru proiecte.

Un alt aspect pozitiv în utilizarea metodei proiectului este utilizarea IT și a Internet-ului în căutarea informațiilor. Este necesară combaterea ideii că Internet-ul conține informații corecte în totalitate precum și utilizarea Internet-ului numai pentru aspectele relaxante. Internet-ul poate fi un instrument de documentare utilizat cu succes în găsirea informațiilor, generearea întrebărilor și găsirea unor răspunsuri care pot duce la abordări unice la probleme practice. Internet-ul poate fi un instrument puternic de cercetare, colaborare și comunicare cu alții. Instrucțiunile pentru o utilizare loială descriu modurile în care materialele protejate de drepturile de autor pot fi folosite în mod legal de către profesori și elevi în clasă. În acest scop, listele bibliografice pot fi create în diverse formate pentru elevii de toate vârstele. Elevii dezvoltă spiritul critic în legătură cu informațiile găsite pe diverse site-uri prin stabilirea factorilor ce trebuie luați în considerare în momentul în care se stabilește credibilitatea și valoarea unui site web. Instrumentele care permit elevilor să comunice cu persoane din toată lumea prin Internet: E-mail, Chat-uri online, mesaje instant și protocol pentru Internet, Voice Over IP, precum și blog-uri, wiki-urile și documentele online, permit elevilor să colaboreze la proiecte prin partajarea și oferirea de răspunsuri cu privire la activitatea celorlalte persoane.

Este important ca elevi să conștientizeze aspectele legale legate de utilizarea Internet-ului în realizarea unui proiect. Astfel, pe lângă stabilirea credibilității unui site, mai sunt și aspectele legate de drepturile de autor. Copyright-ul sau dreptul de autor este dreptul exclusiv de a produce și reproduce, de a reprezenta în public sau de a publica o operă originală artistică sau literală. Aproape orice creat privat și original este protejat, indiferent dacă are o înștiințare sau nu. De asemenea, este bine de știut factorii care determină utilizarea legală a unei informații: scopul și caracterul folosirii, natura lucrării protejate, mărimea părții utilizate și efectul folosirii asupra potențialei piețe.

III.1.4.2. Avantaje și dezavantaje

Metoda proiectului asigură elevilor următoarele avantaje:

urmărește studierea și rezolvarea unei probleme concrete, de viață

elevul exersează lucrul individual, pe grupe sau în echipă

folosește cunoștințe de la mai multe discipline, pe care le subordonează realizării unui scop

exersează elaborarea și generarea răspunsurilor la întrebări precum și la formularea de întrebări

își formează o expunere liberă

realizează o sarcină într-un timp determinat

lucrul în grup îi ajută pe elevi să asimileze cunoștințe în mod independent și să-și formeze atitudini ca: responsabilitate, inițiativă, perseverență, cooperare etc.

dezvoltarea abilităților secolului XXI

implicarea elevilor în procesul de predare-învățare-evaluare ceea ce duce la un interes crescut al elevilor către disciplina predată

dezvoltarea creativității elevilor

dezvoltarea modalității de utilizare a informațiilor teoretice în aplicații practice

finalitățile se concretizează în lucruri importante pentru ei care le creează satisfacții

Există și unele dezavantaje, cele mai evidente fiind:

nu poate fi aplicată la toate unitățile de învățare

cadrul didactic este cel care realizează schema de derulare a proiectului, activitățile practice, obiectivele, fișele de evaluare precum și monitorizarea realizării proiectului; acestea înseamnă o muncă susținută în implementarea și realizarea unui proiect

lipsa timpului necesar realizării unui proiect doar în timpul orelor de studiu

programele încărcate determină cadrele didactice să elimine metodele activ-participative

învățarea centrată pe elev este implementată doar la nivel teoretic în sistemul național de învățământ

modificarea abordării procesului educativ de către profesori – centrarea pe competențele secolului XII și nu pe reproducerea noțiunilor teoretice

lipsa implicării elevilor în această metodă datorată unui volum de muncă mai ridicat

tendința elevilor de a privi procesul educativ ca un proces static

neadaptarea cerințelor proiectului la nivelul clasei sau la viața reală

Integrarea noilor tehnologii în educație aduce toate avantajele dezvoltării abilităților secolului XXI, precum și dezavantajele utilizării fără un scop bine determinat. Ca și profesori, în acest secol, trebuie să dezvoltăm elevilor abilități necesare în viitor. Fiecare profesor dorește o atragere a interesului elevilor către disciplina predată. Este prin natura meseriei faptul că fiecare profesor adaugă câte un pic din propria personalitate și din propriile cunoștințe elevilor cu care interacționează.Învățarea pe tot parcursul vieții este abilitatea necesară integrării în societatea europeană care continuă să se dezvolte.

III.1.5. Implementarea la clasă

Am aplicat metoda proiectului în anii școlari 2013-2014 și 2014-2015, la finalul capitolului grafuri neorientate și orientate la clasa XI Matematică – Informatică intensiv informatică, ca o experiență culminantă. Proiectele au fost implementate la finalul unității, după parcurgerea materiei, ca răspuns la întrebările elevilor legate de legătura dintre grafurile neorientate și orientate cu viața reală. Elevii au avut la dispoziție 2 săptămâni (14 de ore) pentru realizarea produselor finale și 5 ore pentru prezentare și evaluare. Clasele au fost împărțite în grupe de 3 elevi, fiecare primind o problemă. Produsul final a constat dintr-o prezentare power point care să conțină:

enunțul problemei

cerințele problemei

descrierea metodei de rezolvare, amintind noțiunile teoretice utilizate în proiect

metoda de adaptare a noțiunilor teoretice la problema practică

programul C++ corespunzător

fișele de monitorizare a proiectului, fișele de evaluare și autoevaluare

Elevii au avut la dispoziție, ca surse de documentație manualul de informatică, portofoliul personal și Internet-ul. Fiecare grupă a stabilit rolurile în cadrul grupului, o singură persoană fiind responsabilă cu prezentarea produsului final. Fiecare grupă a fost implicată în evaluarea celorlalți elevi, implicând discuții cu privire la proiectul fiecărei grupe, formularea de întrebări pertinente cu privire la problema prezentată și la rezolvarea acesteia.

La diseminare, fiecare elev a notat colegii din clasă și s-a autoevaluat. Am utilizat aceste note pentru a realiza o medie, care a reprezentat nota finală pentru întreg proiectul. În cadrul diseminării am realizat și un vot cu privire la cea mai eficientă grupă, criteriile fiind axate pe modul în care au colaborat, modul în care au rezolvat eventualele conflicte, ca și modul în care au decizii de grup.

III.1.5.1. Teme de proiecte practice

„Theory without practice is useless; practice without theory is blind” Roger Bacon

Realizarea unei hărți rutiere a județului Bacău. Calcularea celor mai scurte rute din orasul Bacău către toate județele învecinate.

Realizarea unei hărți pentru transportul în comun a orașului Iași. Un călător dorește să viziteze tot orașul, utilizând transportul în comun, cu un cost minim.

Cablurile de înaltă tensiune care pornesc dintr-o centrală pot fi și ele reprezentate cu ușurință cu ajutorul unui graf orientat, indicând și direcția de deplasare a curentului. În acest caz, centrala este un nod sursă.

În imperiul maleficului Costel s-a instaurat anarhia. În imperiu sunt n orașe, numerotate de la 1 la n, unite prin m șosele unidirecționale, fiecare șosea fiind controlată de o bandă afiliată la unul dintre cele k sindicate banditești existente în imperiu, numerotate de la 1 la k. Pentru a călători prin pe șoselele din imperiu, orice călător trebuie să plătească taxe sindicatelor: plata taxei către un anumit sindicat îi permite călătorului să folosească nelimitat orice șosea controlată de o bandă afiliată acelui sindicat. Pentru toate sindicatele se plătește aceeași taxă. Călătorul Gigel trebuie să ajungă din orașul p în orașul q. Determinați numărul minim de sindicate banditești cărora Gigel trebuie să le plătească taxe, pentru a putea realiza călătoria dorită.

Pe o arena hipică ce urmează să organizeze un concurs de călărie, s-au montat n obstacole, numerotate 1,2, 3,….., n. Traseul pe care îl vor parcurge călăreții în timpul concursului trebuie să țină cont de următoarele condiții:

se poate începe cu orice obstacole și trebuie sărite toate obstacolele, fiecare o singura dată;

distanța între oricare doua obstacole poate fi parcursa numai într-un singur sens, pe care călăreții îl cunosc la intrarea în concurs Să se conceapă un program cu ajutorul căruia călăreții să-și stabilească traseul

Într-un complex de insule exotice, un turist dorește să realizeze cât mai multe excursii între insule, încadrându-se într-o suma inițială. Scrieți programul care determină toate traseele de la locul inițial până la insulele vizitate.

Criterii pentru proiecte

Pentru fiecare proiect, unele cerințe au fost comune cum ar fi: citirea datelor din fișier, utilizarea matricei de adiacență, determinarea celui mai scurt drum, determinarea unui lanț de la un nod dat la alt nod din graf, determinarea drumurilor de cost minim în graf. Restul cerințelor, cu privire la implementare au fost personalizate.

Criteriile comune de evaluare a proiectelor au fost:

III.1.5.2. Propuneri proiecte

Modul de implementare pentru o rețea feroviară. Se va pune accent pe introducerea datele pentru un orar al trenurilor, cum se modelează acest orar cu ajutorul unui graf orientat și determinarea drumurilor optime (trasee avînd timp minim de călătorie) între două stații.

Implementarea căilor aeriene cu ajutorul grafurilor. Nodurile sunt intersecțiile sau aeroporturile și muchiile sunt rutele. Implementarea va realiza un orar pentru o mulțime de avioane, astfel încât fiecare călător să știe costul unei călătorii de la oricare nod la toate celelalte, precum și timpul în care se realizează călătoria.

Cu ajutorul grafurilor se poate reprezenta și un sistem de canalizare dintr-un cartier al unui oraș.

Reprezentarea unui sistem de încălzire sau rețeaua de apa curentă. Determinarea costurilor de la toate nodurile la unul cu destinație specială.

Determinarea și reprezentarea numărului de izomeri ai compușilor organici, utilizând grafurile neorientate și orientate.

Să se implementeze o rețea electrică cu ajutorul grafurilor orientate, să se verifice funcționarea corectă a rețelei. Să se determine ciclurile grafului orientat.

Să se implementeze o rețea de electricitate dintr-o localitate, care să fie în totalitate ecologică și să nu fie conectată la nici o rețea de electricitate națională. Cum poate fi structurată informatic o astfel de rețea?

III.1.5.3. Exemple practice

Proiectele următoare au fost realizate în anul școlar 2013-2014 (primele patru) și în anul școlar 2014-2015 (ultimele patru). Am reluat unele din problemele propuse în al doilea an școlar, modificând doar unele din cerințe. După cum se poate observa și mai jos, diferiți elevi au abordări diferite cu privire la aceeași temă de proiect (exemplul 2 și exemplul 5).

Exemplul 1: Rețea informațională

N localități trebuie unite într-o rețea informațională astfel încât informația transmisă dintr-o localitate A să poată fi recepționată în orice altă localitate printr-un canal de legatură direct sau prin intermediul altor centre, cu condiția ca lungimea totală a acestei rețele să fie minimă. Se știe că între oricare două localități este posibilă trasarea unui canal de legatură informațională. Programul va determina timpul în care pot comunica calculatoarele din rețea.

Date de intrare:

Citirea datelor pentru cele n orașe,

Citirea coordonatelor pentru localități

Graful neorientat care mapează harta

Cerințe:

Descrierea topologiei de tip rețea, mod de funcționare, avantaje și dezavantaje

Posibilitatea adăugării și eliminării orașelor

Posibilitatea afișării tuturor orașelor din hartă

Calcularea prin mesaje de tip ping a timpului de transmitere a mesajelor între două localități

Realizarea unui meniu cu cerințele de mai sus

Codul sursă este:

#include <iostream>

#include <math.h>

#include <conio.h>

#include <fstream>

#include <string>

#include <limits>

#include<string.h>

using namespace std;

struct oras {

string orasul;

int x,y;

} ora;

void functiaPrincipala() {

int optiune;

cout << "1) Adauga localitate: " << endl;

cout << "2) Stergerea unei localitati existente: " << endl;

cout << "3) Stergerea tuturor localitatilor existente: " << endl;

cout << "4) Afisarea tuturor localitatilor existente: " << endl;

cout << "5) Calculul distantei a doua localitati si testarea legaturii dintre centru informational si localitate: " << endl;

cout << "Introduceti optiunea: " << endl;

cin >> optiune;

switch (optiune) {

case 1:

adaugaOras(); break;

case 2:

stergeLocatie(); break;

case 3: break;

case 4: break;

case 5: break;}

getch();}

void calculator(float coordonate_x1, float coordonate_y1, float coordonate_x2, float coordonate_y2) { float rezultat;

rezultat = sqrt((coordonate_x2 * coordonate_x1) – (coordonate_x2 * coordonate_x1) + (coordonate_y2 * coordonate_y1) – (coordonate_y2 * coordonate_y1));

cout << "Distanta de la orasul 1 la orasul 2 este de: " << rezultat<<" "<<"PING:";}

void adaugaOras() {

int n;

ofstream fisierOutt("ORASE.txt", ios::app);

cout << "Cate orase doresti sa introduci: ";

cin >> n;

if (fisierOutt.is_open()) {

for (int i = 0; i < n; i++) {

cout << "Introdu numele orasului: ";cin >> ora.orasul;

cout << "Introdu coordonatele x: ";cin >> ora.x;

cout << "Introdu coordonatele y: ";cin >> ora.y;

fisierOutt << ora.orasul << " " << ora.x << " " << ora.y << endl;cout << endl << endl;}}

else

{cout << "Nu am putut deschide fisierul";}

fisierOutt.close();

cout << endl;}

void stergeLocatie()

{}

void repetare()

{char optiune;

cout << "Doriti sa mai adaugati ceva sau sa iesiti?(d/n)";cin >> optiune;

if (optiune == 'd')

{functiaPrincipala();}

else

exit ;

}

main()

{functiaPrincipala();

adaugaOras();

repetare();

}

Exemplul 2: Rețele de calculatoare

Rețeaua Internet este o structură configurată la nivel hardware și software. Configurarea hardware este dată de modul în care sunt legate fizic calculatoarele între ele. Aceste legături poartă denumirea de topologie fizică.

Date de intrare:

Fișierul text care memorează un graf

Numărul de noduri din graf

Graful este neorientat

Cerințe:

Clasificarea topologiilor de rețea

Descrierea tipurilor de topologii pentru rețelele de calculatoare

Să se stabilească dacă graful citit din fișier poate mapa o topologie fizică de rețea

În caz afirmativ, să se specifice ce tip de topologie este

Codul sursă este:

#include <iostream>

#include<fstream>

using namespace std;

int a[50][50],n,i,j,gasit,t[50],c,d,suma,z,q=0, p,v,m=0,l;

void citire(char b[20],int a[50][50],int &n)

{ ifstream f("graf.txt");

f>>n;

while(f>>i>>j)

a[i][j]=a[j][i]=1;

f.close();}

void df(int nod)

{ int k,s[50];

s[nod]=1;

for(k=1;k<=n;k++)

if(a[nod][k]==1)

{ a[k][nod]=0;

if(s[k]==0)

df(k);

else

gasit=1; }}

void refac(int nod)

{ if(nod!=0)

{ refac(t[nod]);

cout<<nod<<" "; }}

void df_r(int nod)

{ int k,s[50];

s[nod]=1;

for(k=1;k<=n;k++)

if(a[nod][k]==1&&s[k]==0)

{ t[k]=nod;

df_r(k); }}

int main()

{ int x,s=0;

cout<<"1.Conexiune de tip stea."<<endl;

cout<<"2.Conexiune de tip inel."<<endl;

//cout<<"3.Conexiune de tip magistrala."<<endl;

cout<<"4.Verificare tip conexiune."<<endl;

// cout<<"5.Conexiune de tip arbore."<<endl;

cout<<"6.Conexiune de tip graf complet."<<endl;

cout<<"0.Iesire"<<endl;

cout<<"x=";cin>>x;

switch(x)

{ case 0:x=0;

return 0;

break;

case 1:x=1;

{cout<<"1.Conexiune de tip stea."<<endl;

citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{v=0;

for(j=1;j<=n;j++)

if(a[i][j]==1)

v=v+a[i][j];

if((v==1)||(v==n-1))

m=m+v;}

if(m==2*(n-1))

cout<<"DA"<<endl;

else

cout<<"NU"<<endl; }

break;

cout<<"x=";cin>>x;

case 2:x=2;

{cout<<"2.Conexiune de tip inel."<<endl;

citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{df(i);

if(gasit)

s++;}

citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{v=0;

for(j=1;j<=n;j++)

if(a[i][j]==1)

v=v+a[i][j];

if(v==2)

m=m+v; }

if((m==2*n)&& (s==n))

cout<<"DA"<<endl;

else cout<<"NU"<<endl;}

break;

cout<<"x=";cin>>x;

case 3:x=3;

{cout<<"3.Conexiune de tip magistrala."<<endl;

citire("graf.txt",a,n);

cout<<"c=";cin>>c;

cout<<"d=";cin>>d;

df_r(c);

if(t[d]!=0)

refac(d);}

cout<<"x=";cin>>x;

break;

case 4:x=4;

{cout<<"4.Verificare tip conexiune."<<endl;

{

citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{v=0;

for(j=1;j<=n;j++)

if(a[i][j]==1)

v=v+a[i][j];

if((v==1)||(v==n-1))

m=m+v;}

if(m==2*(n-1))

cout<<"Conexiune de tip stea"<<endl;}

{ citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{df(i);

if(gasit)

s++;}

citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{v=0;

for(j=1;j<=n;j++)

if(a[i][j]==1)

v=v+a[i][j];

if(v==2)

m=m+v; }

if((m==2*n)&& (s==n))

cout<<"Conexiune de tip inel"<<endl; }

{ citire("graf.txt",a,n);

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j&&a[i][j]==0)

l=1;

else l=0;

citire("graf.txt",a,n);

for(i=1;i<=n;i++)

{v=0;

for(j=1;j<=n;j++)

if(a[i][j]==1)

v=v+a[i][j];

if(v==n-1)

m=m+v;}

if((m==(n*n)-n)&&(l==1))

cout<<"Conexiune de tip graf completa"<<endl; }

cout<<"x=";cin>>x; }

break;

case 5:x=5;

{int s[50];

cout<<"5.Conexiune de tip arbore."<<endl;

citire("graf.txt",a,n);

df(1);

suma=0;

for(i=1;i<=n;i++)

suma+=s[i];

if(suma!=n)

cout<<"NU ESTE CONEX"<<endl;

else if(gasit)

cout<<"Are ciclu"<<endl;

else cout<<"DA"<<endl;}

cout<<"x=";cin>>x;

break;

case 6:x=6;

{ cout<<"Conexiune de tip graf complet"<<endl;

citire("graf6.txt",a,n);

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j&&a[i][j]==0)

l=1;

else l=0;

citire("graf6.txt",a,n);

for(i=1;i<=n;i++)

{v=0;

for(j=1;j<=n;j++)

if(a[i][j]==1)

v=v+a[i][j];

if(v==n-1)

m=m+v;}

if((m==(n*n)-n)&&(l==1))

cout<<"DA"<<endl;

else cout<<"NU"<<endl; }

cout<<"x=";cin>>x;

break; }

return 0;

}

Exemplul 3: O centrală de telefonie fixă

Să se implementeze o centrală de telefonie fixă cu ajutorul grafurilor orientate. Să se simuleze căderea unui nod de comunicație. Cum se va modifica modul de comportare a rețelei în cazul în care un nod nu este funcțional, eliminarea rețelei de comunicație nefiind o soluție posibilă.

Date de intrare:

Rețeaua de telefonie fixă

Graful orientat care mapează această rețea

Nodurile care vor fi evitate, în cazul defecțiunii acestora

Cerințe:

Să se calculeze drumul de cost minim de la un nod oarecare la alt nod din rețea

Să se afișeze drumul, în cazul în care se dorește evitarea unui anumit nod

Să se șteargă din matricea costurilor un nod și să se scrie un nou drum între două noduri din rețea

Să se afișeze un mesaj în cazul în care nu se poate ajunge la un nod din rețea

Codul sursă:

using namespace std;

#include<iostream>

#include<fstream>

float A[50][50];

int n;

const float PInfinit=1.e20;

void Citire_cost(char Nume_fis[20],float A[50][50],int &n)

{int i,j;

float c;

fstream f(Nume_fis,ios::in);

f>>n;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j)

A[i][j]=0;

else

A[i][j]=PInfinit;

while(f>>i>>j>>c)

A[i][j]=c;

f.close();}

void Drum(int i,int j)

{int k=1,gasit=0;

while((k<=n)&&(!gasit))

{if((i!=k)&&(j!=k)&&(A[i][j]==A[i][k]+A[k][j]))

{Drum(i,k);

Drum(k,j);

gasit=1;}

k++;}

if(!gasit)

cout<<j<<" ";}

void Scriu_drum(int Nod_Initial,int Nod_Final)

{if(A[Nod_Initial][Nod_Final]<PInfinit)

{cout<<"Drumul de la "<<Nod_Initial <<" la "<<Nod_Final<<" are lungimea "<<A[Nod_Initial][Nod_Final]<<endl;

cout<<Nod_Initial<<" ";

Drum(Nod_Initial,Nod_Final);}

else

cout<<"Nu exista drum de la "<<Nod_Initial<<" la "<<Nod_Final;}

void Lungime_Drumuri()

{int i,j,k;

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(A[i][j]>A[i][k]+A[k][j])

A[i][j]=A[i][k]+A[k][j];}

void Stergere(int q)

{int i,j;

for(i=1;i<=n;i++)

A[i][q]=PInfinit;

for(j=1;j<=n;j++)

A[q][j]=PInfinit;}

int main()

{int g,h,q;

cout<<"Primul nod : ";cin>>g;

cout<<"Al doilea nod : ";cin>>h;

cout<<"Evitarea nodului : ";cin>>q;

Citire_cost("Graf.txt",A,n);

Stergere(q);

Lungime_Drumuri();

Scriu_drum(g,h);}

Exemplu 4: O centrală de televiziune

Să se implementeze o centrală de televiziune cu ajutorul grafurilor orientate. Să se simuleze căderea unui nod de comunicație. Ce va deveni rețeaua în cazul în care un nod nu este funcțional, eliminarea rețelei de televiziune nefiind o soluție posibilă.

Date de intrare:

Rețeaua de televiziune dintr-un cartier

Graful orientat care mapează această rețea

Nodurile care vor fi eliminate, în cazul defecțiunii acestora

Cerințe:

Să se citească graful

Să se elimine un nod din rețea

Să se afișeze care este cel mai apropiat nod care poate relua transmisia semnalului în cazul defecțiunii unui dintre nodurile de transmisie

Să se afișeze un mesaj în cazul în care nu se poate transmite la un nod din rețea

Codul sursă:

using namespace std;

#include<iostream>

#include<fstream>

const float Infinit=1.e20;

void Citire_const(char Nume_fis[20],float A[50][50],int& n)

{

int i,j;

float c;

ifstream f(Nume_fis);

f>>n;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j)

A[i][j]=Infinit;

while(f>>i>>j>>c)

A[i][j]=A[j][i]=c;

f.close();}

int main()

{

int c,n,x,y,i,j,min;

float A[50][50];

Citire_const("Graf.txt",A,n);

cout<<"Alege nodul ce trebuie eliminat: ";cin>>y;

min=10;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==y)

if(min>A[i][j] && A[i][j]!=0)

{min=A[i][j];

x=j;}

cout<<"Nodul cel mai apropiat ce poate transmite semnal nodului eliminat este "<<x<<".";

return 0;}

Exemplu 5: Rețele de calculatoare

Rețeaua Internet este o structură configurată la nivel hardware și software. Configurarea hardware este dată de modul în care sunt legate fizic calculatoarele între ele. Aceste legături poartă denumirea de topologie fizică.

Date de intrare:

Fișierul text care memorează un graf

Numărul de noduri din graf

Graful este neorientat

Cerințe:

Clasificarea topologiilor de rețea

Descrierea tipurilor de topologii pentru rețelele de calculatoare

Să se stabilească dacă graful citit din fișier poate mapa o topologie fizică de rețea

În caz afirmativ, să se specifice ce tip de topologie este

Codul sursă:

#include <iostream>

#include "graf.h"

using namespace std;

int A[50][50],V[50],s,i,j,n;

int main()

{

citireN("graf.txt",A,n);

int k=0,l=0,o=0,p=0,m=0,q=0,r=0;

for(i=1;i<=n;i++)

{ s=0;

for(j=1;j<=n;j++)

{

s+=A[i][j];

V[i]=s;

}

}

cout<<"Gradele Nodurilor"<<endl;

for(i=1;i<=n;i++)

cout<<"Gradul nodului "<<i<<" este "<<V[i]<<endl;

for(i=1;i<=n;i++)

{

if(V[i]==n-1)

m++;

}

if(m==n)

cout<<"Graful reprezinta o retea de tip Plasa"<<endl;

for(i=1;i<=n;i++)

{if(V[i]==n-1)

k++;

else

if(V[i]==1)

l++;}

if(k==1 && l==n-1)

cout<<"Graful reprezinta o retea de tip Stea(Star)"<<endl;

for(i=1;i<=n;i++)

{

if(V[i]==n-1)

q++;

else

if(V[i]==2)

r++;

}

if(q==2&&r==n-2)

cout<<"Graful reprezinta o retea de tip Magistrala(BUS)";

for(i=1;i<=n;i++)

{if(V[i]==1)

o++;

else

if(V[i]==2)

p++;

}

if(o==2 && p==n-2)

cout<<"Graful reprezinta o retea de tip Linie"<<endl;

return 0;

}

graf.h

#include <iostream>

#include<fstream>

using namespace std;

void citireN(char nume_fis[20],int A[50] [50],int&n)

{

int i,j;

fstream f(nume_fis,ios::in);

f>>n;

while(f>>i>>j)

A[i] [j]=A[j] [i]=1;

f.close();

}

Exemplu 6: Traseul unui robot printr-o cameră

Un robot R de formă circulară trebuie să se deplaseze într-un mediu cu obstacole de formă poligonală. Zona în care se poate deplasa robotul poate fi determinată relativ simplu astfel. Mai întâi se setează fiecare obstacol cu o bordură descrisă de urma pe care ar lăsa-o robotul dacă acesta s-ar deplasa. Programul va calcula timpul în care robotul parcurge camera de la un punct inițial până la un punct final precum și traseul pe care îl va efectua, ocolind obstacolele.

Date de intrare:

Dimensiunea camerei în care se poate deplasa robotul

Timpul în care robotul se deplasează de la un nod la altul

Coordonatele obstacolelor, coordonatele de început și de sfârșit a robotului

Cerințe:

Să se afișeze harta de început a camerei și harta după trasarea obstacolelor

Să se calculeze timpul în care robotul poate traversa camera

Să se traseze drumul în interiorul camerei

Să se seteze obstacolele în matricea grafului

Codul sursă:

#include <iostream>

#include <fstream>

#include <math.h>

#include <string.h>

#include <stdlib.h>

using namespace std;

const float pinfinit = 1.e20;

float b[100][100];

int n,a[100][100];

int traseu[100],it=1;

int obstacole[100],ot=1;

void animatie(char mesaj[100])

{

cout<<endl;

cout<<" _______ "<<endl;

cout<<" _/ \\_ "<<endl;

cout<<" / | MOBOT | \\ "<<endl;

cout<<" / |__ __| \\ "<<endl;

cout<<" |__/(_)| |(_)\\__| "<<endl;

cout<<" | | | | "<<endl;

cout<<" |\\ |_| /| "<<endl;

cout<<" | \\ / | <- "<<mesaj<<endl;

cout<<" \\| / ___ \\ |/ "<<endl;

cout<<" \\ | / _ \\ | / "<<endl;

cout<<" \\_________/ "<<endl;

cout<<" _|_____|_ "<<endl;

cout<<" ____|_________|____ "<<endl;

cout<<" / \\ "<<endl;

cout<<endl;

cout<<"Raspuns: ";

}

void afisare_aranjat(int v)

{

int nr=0,aux=v;

while(aux!=0)

{

nr++;

aux/=10;

}

if(nr<=1)

{

cout<<" "<<v;

}

else

{

cout<<" "<<v;

}

}

void afisare_harta(int a[100][100],int n)

{

cout<<endl;

for(int i=1;i<=n*2-1;i++)

{

for(int j=1;j<=n*2-1;j++)

switch(a[i][j])

{

case 0:cout<<" ";break;

case -1:cout<<" -";break;

case -2:cout<<" |";break;

case -3:cout<<" \\";break;

case -4:cout<<" /";break;

case -5:cout<<" M";break;

default:

afisare_aranjat(a[i][j]);break;

}

cout<<endl;

}

}

void generare_harta(int a[100][100],int v[100],int c,int n,int o)

{

int el=1,coordonate[200];

el=1;

for(int i=1;i<=2*(c-1);i+=2)

{

int j=v[el]/n+1;

if(v[el]%n==0)

j–;

coordonate[i]=j;

j=v[el]%n;

if(j==0)

coordonate[i+1]=n;

else

if(j!=0)

coordonate[i+1]=j;

el++;

}

if(o==1)

{

for(int i=1;i<=2*(c-1)-3;i+=2)

if(coordonate[i]==coordonate[i+2])

a[((coordonate[i]*2-1)+(coordonate[i+2]*2-1))/2][((coordonate[i+1]*2-1)+(coordonate[i+3])*2-1)/2]=-1;

else

if(coordonate[i+1]==coordonate[i+3])

a[((coordonate[i]*2-1)+(coordonate[i+2]*2-1))/2][((coordonate[i+1]*2-1)+(coordonate[i+3])*2-1)/2]=-2;

else

if((coordonate[i]<coordonate[i+2] && coordonate[i+1]<coordonate[i+3]) || (coordonate[i]>coordonate[i+2] && coordonate[i+1]>coordonate[i+3]))

a[((coordonate[i]*2-1)+(coordonate[i+2]*2-1))/2][((coordonate[i+1]*2-1)+(coordonate[i+3])*2-1)/2]=-3;

else

a[((coordonate[i]*2-1)+(coordonate[i+2]*2-1))/2][((coordonate[i+1]*2-1)+(coordonate[i+3])*2-1)/2]=-4;

}

else

{

el=1;

for(int i=1;i<=n*2-1;i++)

for(int j=1;j<=n*2-1;j++)

if(i%2!=0 && j%2!=0)

{

a[i][j]=el;

el++;

}

else

a[i][j]=0;

for(int i=1;i<=2*(c-1)-3;i+=4)

a[((coordonate[i]*2-1)+(coordonate[i+2]*2-1))/2][((coordonate[i+1]*2-1)+(coordonate[i+3])*2-1)/2]=-5;

}

}

void construire_graf(char nume_fis[20], int a[100][100],float b[100][100], int &n)

{

int i,j,k,l,el;

//animatie("Salut, eu sunt Mobot! Setati perimetrul camerei.");

animatie("Salut, eu sunt Mobot! Setati perimetrul camerei.");

cin>>n;

system("cls");

generare_harta(a,obstacole,ot,n,0);

afisare_harta(a,n);

animatie("Setati timpul in care este parcurs un metru.");

cin>>k;

system("cls");

afisare_harta(a,n);

//MATRICEA DE NODURI

el=1;

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

a[i][j]=el;

el++;

//afisare_aranjat(a[i][j]);

}

}

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

for(k=1;k<=n;k++)

for(l=1;l<=n;l++)

if(sqrt((k-i)*(k-i)+(l-j)*(l-j))<=sqrt(2))

{

b[a[i][j]][a[k][l]]=k;

}

else

{

b[a[i][j]][a[k][l]]=pinfinit;

}

//DIAGONALA PRINCIPALA = 0

for(i=1;i<=n*n;i++)

b[i][i]=0;

//OBSTACOLE

do

{

animatie("Setati obstacolele.");

cin>>i>>j;

system("cls");

b[i][j]=b[j][i]=pinfinit;

obstacole[ot]=i;

ot++;

obstacole[ot]=j;

ot++;

generare_harta(a,obstacole,ot,n,0);

afisare_harta(a,n);

}

while(i||j);

}

void drum(int i,int j)

{

int k=1,gasit=0;

while((k<=n*n) && !gasit)

{

if(i!=k && j!=k && b[i][j]==b[i][k]+b[k][j])

{

drum(i,k);

drum(k,j);

gasit=1;

}

k++;

}

if(!gasit)

{

traseu[it]=j;

it++;

}

}

void scriu_drum(int nod_initial, int nod_final)

{

if(b[nod_initial][nod_final]<pinfinit)

{

traseu[it]=nod_initial;

it++;

drum(nod_initial,nod_final);

}

else

{

cout<<"Nu exista drum de la "<<nod_initial<<" la "<<nod_final;

}

}

void lungime_drumuri()

{

int i,j,k;

for(k=1;k<=n*n;k++)

for(i=1;i<=n*n;i++)

for(j=1;j<=n*n;j++)

if(b[i][j]>b[i][k]+b[k][j])

b[i][j]=b[i][k]+b[k][j];

}

int main()

{

int i,j;

construire_graf("harta.txt",a,b,n);

lungime_drumuri();

animatie("Setati pozitia initiala si destinatia.");

cin>>i>>j;

system("cls");

scriu_drum(i,j);

generare_harta(a,obstacole,ot,n,0);

generare_harta(a,traseu,it,n,1);

afisare_harta(a,n);

char mesaj[100]="Am ajuns la destinatie in ";

char x[20];

char mesaj2[50]=" secunde.";

itoa(b[i][j],x,10);

strcat(mesaj,x);

strcat(mesaj,mesaj2);

animatie(mesaj);

cout<<endl;

return 0;

}

Exemplu 7: Implementarea prin grafuri a reacțiilor chimice

Să se realizeze reprezentarea ca grafuri neorientate a structurii și a secvențelor de reacții chimice. Se pornește de la un graf orientat și se dorește expandarea acestuia cu un număr specific de noduri, precum și transformarea în graf neorientat.

Date de intrare:

Reacția chimică a carbonului cu clorul și cu bromul

Graful orientat care mapează gaful chimic inițial

Costurile pentru fiecare legătură

Cerințe:

Maparea reacțiilor chimice cu ajutorul grafurilor

Adăugarea de noduri la graful inițial

Transformarea matricei costurilor în matrice de adiacență

Codul sursă:

#include<iostream>

#include <fstream>

using namespace std;

const float pinfinit =1.e20;

int n,i,j; float A[50][50];

void citire_cost(char nume_fis[20],float A[50][50],int &n)

{

int i,j;

float c;

fstream f(nume_fis,ios::in);

f>>n;

for( i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j)

A[i][j]=0;

else

A[i][j]=pinfinit;

while(f>>i>>j>>c)

A[i][j]=c;

f.close();

}

void construire1(float A[50][50],int &n)

{

cout<<"Numarul de noduri introduse in cazul in care ati selectat cazul 1 este 2 "<<endl;

n=n+2;

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

if(A[i][j]!=0 && A[i][j]!=1)

{A[i][j]=1;

A[i][j+1]=1;

A[i+1][n]=1;

}

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

if(i==j)

A[i][j]=0;

}

}

void construire2(float A[50][50],int & n)

{

cout<<"Numarul de noduri introduse in cazul in care ati selectat cazul 2 este 4 "<<endl;

n=n+4;

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

if(A[i][j]!=0 && A[i][j]!=1)

{A[i][j]=1;

A[i][j+1]=1;

A[i+1][n]=1;

}

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

if(i==j)

A[i][j]=0;

}

}

main()

{

int x;

cout<<"Introduceti tasta 1 pentru a afisa legatura Carbonului cu Clorul"<<endl;

cout<<"Introduceti tasta 2 pentru a afisa legatura Carbonului cu Bromul"<<endl;

cout<<"Tasta = ";cin>>x;

citire_cost("graf2.txt",A,n);

switch(x)

{

case 1:{ cout<<"In urmatoarea secventa putem observa transformarea suferita de matricea costurilor a Carbonului cu Clorul"<<endl;

construire1(A,n);

break;

}

case 2: { cout<<"In urmatoarea secventa putem observa transformarea suferita de matricea costurilor a Carbonului cu Bromul"<<endl;

construire2(A,n);

break;}

}

for(int i=1;i<=n;i++)

{for(int j=1;j<=n;j++)

cout<<A[i][j]<<" ";

cout<<endl;

}

return 0;

}

Exemplu 8: Genetica populațiilor

Grafurile mai pot arăta legăturile dintre anuminte grupuri sau oameni. Un arbore genealogic este de asemena un graf. Fiind dat un număr de noduri, să se construiască un arbore genealogic.

Date de intrare:

Numărul de noduri din graf

Structura unui graf pentru arborele genealogic

Cerințe:

Să se afișeze arborele genealogic

Să se calculeze nivelul in graf pentru fiecare nod, precum și vectorul de tați

Să se afișeze referințele ascendente și descendente ale nodurilor

Codul sursă:

#include <iostream>

#include <fstream>

using namespace std;

int n,r, T[100], D[100],i,p[100] , niv[100];

int afis()

{ cout<<"gradele sunt>>"<<endl;

for(int i=1;i<=n;i++)

cout<<D[i];

cout<<endl;

cout<<"nivelele sunt>>"<<endl;

for(i=1;i<=n;i++)

cout<<niv[i];

cout<<endl;

}

int df(int r)

{

for(int i=1;i<=n;i++)

if(T[i]==r && !p[i])

{ p[i]=1;

niv[i]=niv[r]+1;

df(i);

}}

int main()

{

int N[100],i,x=1,y=1;

cout<<"numarul de noduri >>"<<endl;

cout<<"n=";cin>>n;

cout<<"––––––––––––"<<endl;

for(i=1;i<=n;i++)

N[i]=i;

cout<<"nodurile sunt>>"<<endl;

for(i=1;i<=n;i++)

cout<<N[i]<<" ";

cout<<endl;

cout<<"––––––––––––"<<endl;

cout<<"vectorul de tati pentru arborele ce "<<endl;

cout<<"reprezinta genetica populatiilor este >>"<<endl;

cout<<endl;

for(i=1;i<=n;i++)

{if(N[i]==1)

T[i]=0;

else

if(N[i]%2==0)

{T[i]=x;

x++;}

else

if(N[i]%2!=0)

{

T[i]=y;

y++;

} }

for(i=1;i<=n;i++)

cout<<T[i];

cout<<endl;

cout<<"––––––––––––"<<endl;

for(i=1;i<=n;i++)

{

if(T[i]!=0) { D[i]++;

D[T[i]]++;

} }

for(i=1;i<=n;i++)

if(T[i]==0) r=i;

niv[r]=0;

df(r);

afis();

cout<<"––––––––––––"<<endl;

cout<<" arborele ce reprezinta "<<endl;

cout<<"genetica populatiilor este >>"<<endl;

cout<<endl;

i=0;

while(n!=0)

{

i++;

if(i==1)

{cout<<" "<<i<<endl;

cout<<" / \\";cout<<endl;

cout<<" / \\";cout<<endl;

cout<<" / \\";cout<<endl;

}

else

if(i==2)

cout<<" "<<i;

else

if(i==3)

{cout<<" "<<i<<endl;

cout<<" / \\ / \\";cout<<endl;

cout<<" / \\ / \\ ";cout<<endl;

}

else

if(i==4)

cout<<" "<<i;

else

if(i==5)

cout<<" "<<i;

else

if(i==6)

cout<<" "<<i;

else

if(i==7)

{cout<<" "<<i<<endl;

cout<<" / \\ / \\ / \\ / \\";cout<<endl;

}

else

if(i==8)

cout<<" "<<i;

else

if(i==9)

cout<<" "<<i;

else

if(i==10)

cout<<" "<<i;

else

if(i==11)

cout<<" "<<i;

else

if(i==12)

cout<<" "<<i;

else

if(i==13)

cout<<" "<<i;

else

if(i==14)

cout<<" "<<i;

else

if(i==15)

cout<<" "<<i<<endl;

else

if(i==16)

{cout<<" / \\ / \\";cout<<endl;

cout<<" "<<i; }

else

if(i==17)

cout<<" "<<i;

else

if(i==18)

cout<<" "<<i;

else

if(i==19)

cout<<" "<<i;

n–; }

return 0;}

III.1.6. Monitorizarea activității proiectului

Pe lângă realizarea unui produs final, elevii au fost evaluați și afectiv, un scop important fiind determinarea unei mai eficiente colaborării și implicări în procesul de învățare. Din această cauză, monitorizarea proiectului a implicat și monitorizarea grupurilor de lucru. Unele discuții referitoare la proiectele implementate s-au derulat în afara orelor de curs, pe site-uri de socializarea și nu numai, acestea nefiind monitorizate și au creat unele disensiuni în interiorul grupelor de lucru. Ca o încercare de rezolvare, am propus ca la finalul proiectului să fie aleasă o echipă de lucru care a fost cea mai eficientă. Aceasta fiind recompensată în afara orelor. Această propunere, deși a fost inițiată în mijlocul derulării proiectului a fost primită cu interes de elevi, determinând o mai bună colaborare în interiorul echipelor de lucru.

III.1.6.1. Autoevaluarea elevilor

O parte extrem de importantă în procesul de evaluare o reprezintă autoevaluarea. Importanța autoevaluării este subliniată prin înțelegerea de către elevi a noțiunilor ce necesită aprofundare. Acest proces nu este important prin note ci prin aprecieri care să determine punctele slabe din procesul de învățare. Prin corectarea acestor puncte slabe, elevii vor obține rezultate care să îî ajute în realizarea optimă a produsului final din proiect. Din această cauză am realizat următoarea fișă de autoevaluare pentru elevi:

Cum am făcut ca participarea mea să fie eficientă?

Am ajutat la formularea întrebărilor esențiale proiectului?

Am învățat mai ușor prin realizarea unui proiect?

Am ajutat la găsirea răspunsurilor la întrebări?

Am descoperit un nou mod de învățare?

Ce dificultăți am întâmpinat în derularea proiectului?

Am acordat un real sprijin colegilor aflați într-un punct critic?

Cum știu că participarea mea a fost eficientă?

Colegii s-au putut baza pe ajutorul meu?

Ce am descoperit lucrând la acest proiect?

III.1.6.2. Interevaluarea elevilor

Am împărțit evaluarea produsului final în două părți, prima parte conținând criterii pentru proiectul în sine în timp ce partea a doua a fost axată pe prezentarea produsului final. În acest fel, am încercat să dezvolt elevilor și abilități de comunicare a informațiilor deținute. Am pus accentul și pe explicarea produsului final, dezvoltând în acest fel limbajul necesar elevilor la disciplina informatică. Produsul final a fost evaluat cu ajutorul unei fișe utilizând criteriile de mai jos:

Proiectul a cuprins toate etapele de realizare?

Proiectul a atins toate cerințele?

Proiectul a avut toate explicațiile cerute?

Prezentarea a fost realizată cu toate echipamentele necesare?

Proiectul a cuprins noțiuni teoretice?

Proiectul a conținut implementarea rezolvării?

Au fost realizate explicații cu privire la metoda de rezolvare?

Programul a rulat cu date diverse?

Elevii au explicat în detaliu rezolvarea abordată?

Elevii au lucrat în cadrul orelor de laborator?

III.1.6.3. Evaluarea prezentărilor proiectelor

La prezentarea finală, accentul a fost pus pe abilitățile de comunicare în limbaj adecvat disciplinei informatică și pe abilitățile de comunicare în limba română. Comunicarea nu s-a axat numai pe produsul final ci și pe formularea de întrebări și formularea de răspunsuri corecte. Grupele de lucru au fost încurajate să colaboreze în găsirea răspunsurilor corecte a explicațiilor complete. Astfel, am utilizat o fișă de evaluarea cuprinzând criteriile următoare:

Prezentarea a fost cursivă? DA NU 50%

Prezentarea a cuprins toate aspectele proiectului? DA NU 50%

Toți membrii grupului au participat la prezentare? 100% 50% 25%

Au utilizat metode inovative în prezentare? DA NU 50%

5. Au fost prezentate dificultățile întâmpinate în realizarea proiectului? 100% 50% NU

6. Elevii au înțeles întrebările adresate? DA NU 50%

7. Fiecare întrebare a avut un răspuns? DA NU 50%

8. Toți membrii au formulat un răspuns? DA NU 50%

9. Răspunsurile au fost obiective? 100% 50% NU

10. Au avut nevoie de materiale ajutătoare în formularea răspunsurilor? DA NU 50%

11. Întrebările au fost legate de tema proiectului? DA NU 50%

12. Întrebările au fost obiective? DA NU 50%

13. Gradul de dificultate a întrebărilor? DIFICIL MEDIU MIC

14. Toți membrii grupului au participat la formularea întrebărilor? DA NU 50%

15. Au avut nevoie de materiale ajutătoare în formularea întrebărilor? DA NU 50%

III.2. Impactul implementării metodei proiectului

III.2.1. Rezultatele evaluării

Am realizat o comparație între notele obținute de elevi la un test clasic și la proiecte. Am aplicat în cadrul parcurgerii materiei din unitatea de învățare un test care cuprindea itemi obiectivi (Nicu, 15) (cu alegere multiplă), semiobiectivi (cu răspuns de completare) și subiectivi (de tip rezolvare de probleme). Datorită faptului că acest capitol pune accentul pe reproducerea teoriei, aplicarea acesteia în itemi cu alegere multiplă, 37% din totalul elevilor au obținut note sub 5. Se poate observa că nota maximă a clasei a fost 8, obținută de un singur elev. Restul notelor s-au situat între 5 și 7. Deși, 63% din elevi au obținut note de trecere, media clasei a fost 5,12. Ceea ce a situat clasa foarte puțin peste valoarea 5.

După aplicarea metodei proiectului, se observă o creștere substanțială a valorilor notelor obținute. Astfel, datorită implicării active a elevilor, nu au existat note mai mici de 7, iar media clasei a fost 8,43. În cadrul proiectelor, la evaluare am pus accentul pe creativitatea elevilor în crearea produselor finale, în abordarea corectă a problemelor, alegerea algoritmilor corespunzători problemelor propuse precum și pe implicarea în realizarea produselor finale. Notele de la proiecte au fost stabilite prin diseminarea produselor finale de întreaga clasă. Notele au fost calculate ca fiind media notelor de la autoevaluare și notele de la interevaluare.

Majoritatea notelor au fost de 8, ceea ce reprezintă 50%, restul fiind de 9 și 10.

După susținerea proiectelor și diseminarea acestora, clasa a mai susținut o lucrarea scrisă care cuprindea toate tipurile de itemi. Cum se poate observa și din tabelul de mai jos, notele au fost cu mult mai bune decât la prima lucrare. Deși media clasei (7,18) nu a fost la fel de mare ca în cazul proiectelor (8,43), totuși a fost mult mai bună decât în primul caz. De asemenea, nu au existat note sub 5.

Elevii au reușit utilizând metoda proiectului să își consolideze cunoștințele, au reținut cu mai multă ușurință noțiunile teoretice și au aplicat aceste noțiuni în problemele practice și teoretice.

În anul școlar următor, am utilizat aceeași abordarea unității de învățare grafuri neorientate și orientate. La prima lucrare scrisă, cu toate tipurile de itemi, media clasei a fost 4,7 iar 45% din elevi au obținut note mai mici de 5. Nota maximă a fost 8, iar cea mai des obținută notă a fost 5. După realizarea proiectului și diseminarea acestuia, media clasei a fost 8,55, notele fiind calculate ca medie dintre autoevaluarea fiecărui elev și interevaluarea întregii clase. Cele mai multe note au fost de 8 dar, spre deosebire de anul precedent au fost mai multe de 10.

După diseminarea proiectului, clasa a susținut o lucrare scrisă, cu toate tipurile de itemi. Și în acest caz, media clasei a fost mai bună decât în primul caz (7,40), deși nu la fel de bună ca în cazul proiectelor (8,55). Totuși, numărul notelor de 9 și de 10 a fost mult mai mare, și nu au existat note sub 5, iar cele mai multe note au fost de 8.

Ca și în anul precedent, am observat o implicare activă a elevilor în realizarea produsului final în cadrul proiectului. Elevii au reușit să atingă un nivel de pregătire care să le permită aplicarea cu succes a noțiunilor teoretice în probleme practice și teoretice.

III.2.2. Finalitatea metodei proiectului

Cu privire la impactul utilizării metodei proiectului, am realizat un chestionar pe un eșantion de 53 elevi de clasa a XI-a, profil real, specializarea Matematică – Informatică intensiv informatică și filiera tehnologică, profilul tehnician ecolog și protecția calității mediului. Acest chestionar conține 10 întrebări, majoritatea cu subiectul metoda proiectului, pentru a afla în ce măsură această metodă de predare-învățare răspunde nevoilor elevilor secolului XII. În același timp, am dorit să aflu în ce măsură sunt utilizate instrumentele IT și Internet-ul în afara disciplinelor de profil.

Cu privire la organizarea unității de învățate și la alte discipline la care aplică această metodă, rezultatele au fost:

După cum se poate observa din primul grafic, majoritatea elevilor consideră că au fost implicați în structurarea produsului final, și nu numai. Se constată, un procent destul de ridicat de elevi care nu au mai utilizat această metodă activ-participativă la alte discipline.

Deoarece metoda proiectului pune accentul pe auto-instruire și pe dezvoltarea liberă integrală a individului uman, am inclus în chestionar întrebarea:

Se observă din diagrama de mai sus, că cea mai mare parte a elevilor consideră că școala nu îi formează suficient pentru secolul XXI.

Cei mai mulți elevi nu percep utilitatea evaluărilor și consideră că notele nu reflectă cu adevărat nivelul de înțelegere a materiei. Întrebați de finalitatea proiectului, elevii au răspuns:

Deși au existat elevi care au cerut discutarea notei finale, majoritatea s-au autoevaluat corect, nefiind diferențe foarte mari între notele lor și cele finale.

Cel mai controversat aspect al noilor tehnologii îl reprezintă Internetul care, deși este cea mai mare bibliotecă poate fi utilizat deficitar de către elevi.

Totuși, majoritate a elevilor utilizează ca sursă de documentare Internetul și la alte materii, exceptănd Informatica și TIC, cu toate că cele mai multe discipline nu utilizează frecvent calculatorul ca mijloc de predare/învățare.

Cu privire la organizarea unității de învățare prin această metodă activ-participativă, am întrebat elevii despre numărul de ore și despre eficiența metodei. După cum se observă mai jos, cei mai mulți elevi sunt de părere că această metodă i-a ajutat la o mai bună înțelegere a materiei.

Ca o opinie generală, am întrebat elevii cu privire la motivarea lor pe parcursul derulării proiectului. Deși se observă o mai bună motivare a lor cu această metodă, la întrebarea dacă ar mai trebui utilizată această metodă, mulți au fost de părere că nu este utilă:

Creșterea gradului de integrare a noilor tehnologii informaționale în curriculumul școlar pentru a-i pregăti pe elevi să se adapteze la cerințele unor ocupații ale secolului XXI este unul din factorii motivatori în utilizarea metodei proiectului la clasă. De asemenea, stimularea utilizării Internet-ului ca mijloc de comunicare prin pagini Web interactive (spreadsheet, googledocs, pagini blog, pagini wiki ) – comunicarea dintre elevi și cadrele didactice poate fi mereu îmbunătățită, prin utilizarea noilor tehnologii. Această comunicare poate câștiga prin aducerea în secolul XXI a orelor de curs.

Motivarea elevilor pentru o implicare mai activă în cadrul orelor de curs în vederea dezvoltării abilităților necesare secolului XXI este un punct de răscruce în abordarea materiei la clasa de elevi.

IV. Concluzii

Cu o nouă abordare a educației care să dezvolte elevilor abilitățile necesare unei învățări continue, unei abordări personale a procesului de învățare, am putea să aducem modificari benefice în dinamica orelor de studiu la școală.

Formarea profesorilor pentru integrarea noilor tehnologii este un pas important în alinierea educației cu secolul XXI. Predarea prin proiecte (prezentată cu succes de cursul IntelTeach) a adus o nouă abordare în sistemul educațional. Această abordare a fost implementată cu succes în 70 de țări din întreaga lume, inclusiv România.

Cloud computing, date mobile, securitate, case inteligente și orașe inteligente sunt doar unele dintre avantajele dezvoltării continue a tehnologiilor și a informaticii.

V. Bibliografie

[Anderson et al, 01] Lorin ANDERSON, David KRATHWOHL, Benjamin BLOOM, A taxonomy for learning, teaching, and assessing: a revision of Bloom’s taxonomy of educational objectives, Longman Publisher, 2001

[Bărbăcioru, 12] Iuliana Carmen BĂRBĂCIORU, Cercetari operaționale Curs universitar, Facultatea de Matematică, Universitatea Constantin Brâncuși Târgu-Jiu, an II, curs 2 – Elemente de teoria grafurilor (http://www.utgjiu.ro/math/cbarbacioru/book/co2009/c02.pdf)

[Bercu et al, 10] Nicoleta BERCU, Laura Elena CĂPIȚĂ, Despre a învăța elevul să învețe, Revista de pedagogie, Institutul de Științe ale Educației, nr. 58 (3)/2010

[Bloom et al, 56] Benjamin BLOOM, David KRATHWOHL, Taxonomy of Educational Objectives: The Classification of Educational Goals, D. McKay Publisher, 1956

[Captarencu, 14] Oana Otilia CAPTARENCU, Limbaje formale, automate și compilatoare Curs universitar, Facultatea de Informatică, Universitatea Alexandru Ioan Cuza, Iași an II, Curs 7 – Mașini Turing

[Cerchez et al, 06] Emanuela CERCHEZ, Marinel ȘERBAN, Programarea în limbajul C/C++ pentru liceu volumul III, Editura Polirom, Iași, 2006

[Constantinescu, 15a] Oana CONSTANTINESCU, Didactica matematicii Curs universitar, Facultatea de Matematică, Universitatea Alexandru Ioan Cuza Iași, an II, curs 2- Principiile învățării (http://www.math.uaic.ro/~oanacon/depozit/Curs_2_Prin_inv_gen.pdf)

[Constantinescu, 15b] Oana CONSTANTINESCU, Didactica matematicii Curs universitar, Facultatea de Matematică, Universitatea Alexandru Ioan Cuza Iași, an II, curs 2- Principiile MPM (http://www.math.uaic.ro/~oanacon/depozit/Curs_4_Prin_MPM_cont_lyx.pdf)

[Crețu, 15] Vladimir-Ioan CREȚU, Structuri de date și algoritmi Curs universitar, Facultatea de Automatică și Calculatoare, Universitatea Politehnică Timișoara, an II, curs 4 – Algoritmul lui Dijkstra (bigfoot.cs.upt.ro/~calin/resources/sdaa/dijkstra.ppt)

[Gontineac, 08] Mihai GONTINEAC, Limbaje formale și teoria automatelor Curs universitar, Facultatea de Matematică, Universitatea Alexandru Ioan Cuza Iași, an II, curs 12 – Mașini Turing

[Lucanu, 15] Dorel LUCANU, Proiectarea algoritmilor Curs universitar, Facultatea de Informatică, Universitatea Alexandru Ioan Cuza, Iași an II, curs 4 – Grafuri (http://thor.info.uaic.ro/~dlucanu/cursuri/ap/resurse/curs4.pdf)

[Miloșescu, 06] Mariana MILOȘESCU, Informatică: clasa a IX-a, intensiv informatică, Editura Didactică și Pedagogică, București, 2006

[Nicu, 15] Adriana NICU, Introducere în pedagogie. Teoria și metodologia curriculum-ului, DPPD Pedagogic, Universitatea Lucian Blaga Sibiu, curs 8-Testul docimologic (http://dppd.ulbsibiu.ro/ro/cadre_didactice/adriana_nicu/cursuri/Pedagogie%202_curs_8_Testul%20docimologic.pdf )

[Rebedea et al, 15a] Traian REBEDEA, Vlad POSEA, Ștefan TRĂUȘAN-MATU, Costin CHIRU, Proiectarea algoritmilor curs universitar, Facultatea de Automatică și Calculatoare, Universitatea Politehnică București, an II, Curs 16 – Algoritmul lui Dijkstra  (http://andrei.clubcisco.ro/cursuri/f/f-sym/2pa/cursuri/elearning/PA%20-%2016.pdf)

[Rebedea et al, 15b] Traian REBEDEA, Vlad POSEA, Ștefan TRĂUȘAN-MATU, Costin CHIRU, Proiectarea algoritmilor curs universitar, Facultatea de Automatică și Calculatoare, Universitatea Politehnică București, an II, Curs 17 – Algoritmul Bellman-Ford  (http://andrei.clubcisco.ro/cursuri/f/f-sym/2pa/cursuri/elearning/PA%20-%2017.pdf)

[Rebedea et al, 15c] Traian REBEDEA, Vlad POSEA, Ștefan TRĂUȘAN-MATU, Costin CHIRU, Proiectarea algoritmilor curs universitar, Facultatea de Automatică și Calculatoare, Universitatea Politehnică București, an II, Curs 18 – Algorimtul Floyd-Warshall (Roy-Floyd) (http://andrei.clubcisco.ro/cursuri/f/f-sym/2pa/cursuri/elearning/PA%20-%2018.pdf)

[Rychen et al, 03] Dominique Simone RYCHEN, Laura Hersh SALGANIK, Key Competencies for a Successful Life and a Well-Functioning Society, Hogrefe & Huber Publisher, 2003

[Sorin et al, 06] Tudor SORIN, Vlad HUȚANU, Informatică, manual clasa a XI-a, informatică intensiv, Editura L&S Soft, București, 2006

[Sorin, 08] Tudor SORIN, Informatică: curs pentru clasele a IX-a și a X-a, Editura L&S Soft, București, 2008

[Sedgewick et al, 08] Robert SEDGEWICK, Kevin WAYNE, Princeton University, Introduction to Programming in Java: an interdisciplinary approach, Chapters 17 and 18 Section 4.5, Pearson Education, Inc., 2008 (http://algs4.cs.princeton.edu/41undirected/)

[Tomescu, 81] Ioan TOMESCU, Probleme de combinatorică și teoria grafurilor, Editura Didactica și Pedagogică, București, 1981

[Zaharie, 14] Daniela ZAHARIE, Algoritmi Curs universitar, Facultatea de matematică și informatică Universitatea de Vest Timișoara, an I, curs 6 – Analiza algoritmilor de sortare

Algoritmul lui Dijkstra implementare practică: http://campion.edu.ro/arhiva/www/arhiva_2009/seds/7/html/moment_df_3.html

Predarea prin proiecte, structurarea unui proiect pentru o unitate de învățare: http://educate.intel.com/ro/ProjectDesign

Noile tendințe în educație, la nivel internațional, inițiativa Intel, Microsoft și Cisco de sprijinire a reformelor în educație pentru atingerea competențelor secolului XXI http://www.euractiv.ro/uniunea-europeana/articles|displayArticle/articleID_16039/Cisco-Intel-si-Microsoft-colaboreaza-pentru-a-imbunatati-evaluarea-in-educatie.html

Competențele cheie ale secolului XXI în educație http://www.eurotrainer.ro/competente-cheie/competente-cheie.html/lang/ro

Predarea prin proiecte, implementarea la clasă http://iteach.ro/

Dezvoltarea competențelor de învățare pe tot parcursul vieții http://www.ise.ro/a-invata-sa-inveti-in-scoala-dincolo-de-logica-implicita-a-simtului-comun

Competențele cheie ale secolului XXI în educație și implementarea în România https://eduproiect.wordpress.com/2009/08/18/competente-cheie-lisabona-2000/

Avantajele și dezavantajele învățării prin proiecte http://www.gsn.org/web/pbl/pblintro.htm

Dezvoltarea competențelor cheie în școlile din Europa http://eacea.ec.europa.eu/EDUCATION/EURYDICE/documents/thematic_reports/145RO.pdf

Declarație de autenticitate

Subsemnata, Arghire Diana declar pe propria răspundere că lucrarea de față a fost elaborată personal și îmi aparține în întregime.

Declar că lucrarea este rezultatul muncii mele, pe baza cercetărilor proprii și pe baza informațiilor obținute din surse care au fost citate și indicate în text, figuri, tabele și bibliografie conform normelor de citare a surselor și a respectării legislației privind drepturile de autor.

Declar că lucrarea nu a mai fost prezentată sub această formă vreunei instituții de învățământ superior în vederea obținerii unui grad sau titlu științific ori didactic.

Data,

…………………

Nume, prenume, semnătură

Arghire Diana……………………

Similar Posts