Documente Academic
Documente Profesional
Documente Cultură
CUPRINS
CAPITOLUL I 4
ALGORITMI..........................................................................................4
ALGORITMI. NOŢIUNI INTODUCTIVE.......................................................4
ANALIZA COMPLEXITĂŢII ALGORITMILOR ...........................................7
TIMPUL DE EXECUŢIE........................................................................... 7
Date de Intrare................................................................................................7
Măsurarea Timpului de Execuţie........................................................................7
Cazul cel mai Defavorabil şi Cazul Mediu............................................................8
ORDINUL DE COMPLEXITATE................................................................. 9
Notaţia Asimptotică. Simbolul lui Landau............................................................9
CAPITOLUL II
TEHNICI DE PROGRAMARE..........................................................12
RECURSIVITATE.......................................................................................13
Descriere Metodă.....................................................................................................13
Mecanismul de Realizare a Recursivităţii....................................................................13
Avantaje şi Dezavantaje...........................................................................................14
METODA GREEDY.....................................................................................38
1
Metodica predării tehnicilor de programare pentru grupele de performanţă
Descriere Metodă.....................................................................................................38
Avantaje şi Dezavantaje...........................................................................................39
Aplicaţii Greedy........................................................................................................40
Probleme de Concurs...............................................................................................45
DIVIDE ET IMPERA.................................................................................52
Descriere Metodă.....................................................................................................52
Timpul de Calcul......................................................................................................53
Aplicaţii Divide et Impera..........................................................................................53
Probleme de Concurs...............................................................................................57
PROGRAMARE DINAMICĂ........................................................................67
Descriere Metodă.....................................................................................................67
Aplicaţii Programare Dinamică..................................................................................69
Probleme de Concurs...............................................................................................74
CAPITOLUL III
METODICA PREDARII INFORMATICII......................................81
PREDAREA INFORMATICII.......................................................................81
MEDODICA PREDĂRII INFORMATICII......................................................82
CE PREDĂM ?..........................................................................................82
Obiectivele Generale ale Informaticii în Învăţământul Românesc.................................82
METODE DE ÎNVÃTÃMÂNT...........................................................89
METODE ŞI PROCEDEE EXPOZOTIV - EURISTICE.....................................89
METODE ŞI PROCEDEE ALGORITMICE.....................................................98
INSTUIREA PROGRAMATĂ ASISTATĂ DE CALCULATOR............................99
Direcţii de Modernizare a Metodelor de Predare-Învaţare..........................................101
STRATEGII DIDACTICE................................................................102
MIJLOACE DE ÎNVÃTÃMÂNT.....................................................108
LECTIA. TIPOLOGIA LECTIEI....................................................109
TIPURI DE LECŢII SPECIFICE ORELOR DE INFORMATICĂ.....................111
2
Metodica predării tehnicilor de programare pentru grupele de performanţă
EVALUAREA.....................................................................................115
DEFINIREA CONCEPTULUI DE EVALUARE..............................................115
FUNCŢIILE EVALUĂRII...........................................................................117
MODURI DE EVALUARE ŞI IMPLICAŢIILE LOR.......................................119
PROIECTAREA OBIECTIVELOR DE EVALUARE.........................................120
METODE ŞI TEHNICI DE EVALUARE.......................................................121
INSTUMENTE DE EVALUARE...................................................................122
METODE ALTERNATIVE DE EVALUARE....................................................123
TESTELE DE EVALUARE..........................................................................127
CONCLUZII.......................................................................................136
BIBLIOGRAFIE................................................................................136
3
Metodica predării tehnicilor de programare pentru grupele de performanţă
CAPITOLUL I
ALGORITMI
Un algoritm1 este o secvenţă finită de paşi, aranjată într-o ordine logică specifică care, atunci când
este executată, produce o soluţie corectă pentru o problemă precizată. [3] [4] [19]
Această definiţie ne permite să intuim proprietăţile pe care trebuie să le posede un algoritm
performant şi bine conceput:
Claritatea – în fiecare moment trebuie să ştim exact care este următoarea operaţie pe care
trebuie să o realizăm;
Finitudinea – algoritmul trebuie să fie format dintr-un număr finit de operaţii. În caz contrar,
chiar dacă ar putea rezolva problema noastră, nu ar da niciodată răspunsul pe care îl aşteptăm,
deoarece pentru o infinitate de operaţii, oricât de rapid le-am realiza, am avea nevoie de un timp
infinit (??) pentru a le termina;
Generalitatea – algoritmul pe care îl concepem trebuie să se poată aplica unui număr cât mai
mare de probleme. Veţi vedea atunci când vom realiza programe, cât de important este să
respectăm această proprietate a unui algoritm bun: cu cât creşte generalitatea unui algoritm, cu
atât va fi mai mare numărul de probleme practice pe care le vom putea rezolva cu ajutorul
programului care se bazează pe acel algoritm.
În orice alt domeniu, în programare există anumite reguli clare, a căror formulare are o motivaţie
temeinică şi pe care va trebui să le respectăm. Vom întâlni o mare diversitate de probleme de rezolvat.
Acestea pot fi grupate într-o mare diversitate de clase de probleme. Pentru acestea putem concepe o
mare diversitate de algoritmi, care conţin o mare diversitate de operaţii…
1
Noţiunea de algoritm este foarte veche. Cuvântul algoritm este de origine arabă, derivând din numele
matematicianului Abu Ja’far Mohammed ibn Mûsâ al-Khowârizmî (autor persan, sec VII-IX) care a scris o carte de
matematică celebră intitulată “Kitab al jabr w’ai-muquabala” cunoscută în traducere latină ca “Algorithmi de numero
indorum”, iar apoi ca “Liber algorithmi”, unde “algorithm” provine de la “al-Khowârizmî”, ceea ce înseamnă “din
oraşul Khowârizmî”
4
Metodica predării tehnicilor de programare pentru grupele de performanţă
Implementarea algoritmului.
În perioada de început a programării calculatoarelor, complexitatea algoritmilor ce stăteau la baza
programelor era destul de redusă. Evoluţia firească a fost spre creşterea complexităţii ceea ce a condus la
dificultăţi din ce în ce mai mari legate în principal de modul „dezordonat” în care se scriau programele. A
devenit evident că se impune fundamentarea unui alt mod de elaborare a algoritmilor şi programelor.
În anul 1969 apare lucrarea „Note on Structured Programming” în care E.W. Dijkstra pune bazele
unei noi paradigme de programare (un nou stil), programarea structurată. La baza noului concept stă
necesitatea elaborării în echipă a unor programe complexe, fiind necesar un mod unitar de descriere şi
implementare a algoritmilor de către programatorii din cadrul echipei. [9]
5
Metodica predării tehnicilor de programare pentru grupele de performanţă
Optimalitatea algoritmilor
Să presupunem că pentru o anumită problemă am elaborat un algoritm şi am putut calcula şi timpul
său de executare T(n). Este natural să ne întrebăm dacă algoritmul nostru este "cel mai bun" sau există
un alt algoritm cu timp de executare mai mic.
Problema demonstrării optimalităţii unui algoritm este foarte dificilă, în mod deosebit datorită
faptului că trebuie să considerăm toţi algoritmii posibili şi să arătăm că ei au un timp de executare
superior.
Ne mărginim la a enunţa două probleme şi a demonstra optimalitatea algoritmilor propuşi, pentru a
pune în evidenţă dificultăţile care apar.
Exemplul 1.
Se cere să determinăm m=min(a1,a2,...,an).
Algoritmul binecunoscut este următorul:
m a1
Pentru i=2,n Execută
Dacă ai<m Atunci m ai
Sfârşit pentru
care necesită n-1 comparări între elementele vectorului a=(a1,a2,...,an).
Propoziţia 1.
Algoritmul de mai sus este optimal.
Trebuie demonstrat că orice algoritm bazat pe comparări necesită cel puţin n-1 comparări.
Demonstrarea optimalităţii acestui algoritm se face uşor prin inducţie.
Pentru n=1 este evident că nu trebuie efectuată nici o comparare.
Presupunem că orice algoritm care rezolvă problema pentru n numere efectuează cel puţin n-1
comparări să considerăm un algoritm oarecare care determină cel mai mic dintre n+1 numere.
Considerăm prima comparare efectuată de acest algoritm; fără reducerea generalităţii, putem
presupune că s-au comparat a1 cu a2 şi că a1<a2. Atunci m=min(a1,a3,...,an=1). Dar pentru
6
Metodica predării tehnicilor de programare pentru grupele de performanţă
determinarea acestui minim sunt necesare cel puţin n-1 comparări, deci numărul total de comparări
efectuat de algoritmul considerat este cel puţin egal cu n.
În cadrul acestui capitol vom prezenta câteva detalii referitoare la complexitatea algoritmilor. Vom
arăta că ordinul de complexitate al unui algoritm depinde de dimensiunea datelor de intrare, vom
prezenta noţiunile de caz mediu şi caz cel mai defavorabil şi vom introduce noţiunea de ordin de
complexitate.
TIMPUL DE EXECUŢIE
Este evident faptul că durata execuţiei unui program depinde de dimensiunea şi de particularităţile
datelor de intrare. De exemplu, putem spune cu certitudine că sortarea unui şir care conţine o mie de
numere va dura mai mult decât sortarea unui şir care conţine o sută de numere.
DATE DE INTRARE
Definiţia dimensiunii datelor de intrare depinde de problema care trebuie rezolvată. De exemplu,
pentru problema sortării unui şir de N numere, dimensiunea intrării este N. Cea mai des utilizată "măsură"
a dimensiunii datelor este numărul "obiectelor" care constituie intrarea. Totuşi, nu în toate cazurile este
utilizată o astfel de măsură. De exemplu, pentru adunarea a două numere, o măsură ar putea fi numărul
biţilor folosiţi pentru a reprezenta cele două numere.
Aşadar dimensiunea datelor de intrare este o funcţie care depinde de anumite variabile. În foarte
multe cazuri avem o singură astfel de variabilă, dar există şi situaţii în care sunt necesare mai multe. De
exemplu, dacă intrarea constă în descrierea unui graf neorientat, putem descrie dimensiunea datelor de
intrare în funcţie de două variabile: numărul nodurilor şi numărul muchiilor.
În principiu, timpul de execuţie al unui program este durata (exprimată în secunde, milisecunde,
nanosecunde etc.) necesară pentru ca programul să preia datele de intrare, să efectueze anumite operaţii
asupra lor şi să furnizeze datele de ieşire. Evident, acest timp depinde întotdeauna de calculatorul pe care
este executat programul. Nu ne putem aştepta ca un program care sortează un milion de numere să
necesite acelaşi timp de execuţie pe un calculator dotat cu un procesor Pentium II şi pe un calculator
Pentium IV.
Chiar dacă avem procesoare din aceeaşi familie, vom observa diferenţe vizibile între un procesor cu
frecvenţa de 2 GHz şi un procesor cu frecvenţa de 3 GHz. De fapt, chiar dacă avem acelaşi tip de
7
Metodica predării tehnicilor de programare pentru grupele de performanţă
procesor şi aceeaşi frecvenţă, pot apărea unele diferenţe de timp datorate altor factori cum ar fi: sistemul
de operare, cantitatea de memorie, rata de transfer a discului etc.
În concluzie, măsurarea exactă a timpului de execuţie nu este un criteriu valid pentru a descrie
timpul de execuţie al unui algoritm.
O măsură mult mai utilă a timpului de execuţie este dată de numărul paşilor elementari necesari
execuţiei unui algoritm.
Aşadar, dacă dimensiunea intrării este n, putem exprima numărul de paşi sub forma unei funcţii
T(n). Dacă algoritmul constă într-un număr de paşi egal cu pătratul valorii lui n vom avea T(n)=n2 .
Dacă, din diverse motive, mai avem nevoie de încă n paşi, vom avea T(n)=n+n.
8
Metodica predării tehnicilor de programare pentru grupele de performanţă
ORDINUL DE COMPLEXITATE
Funcţiile obţinute pentru timpii de execuţie pot fi uneori foarte complicate şi, din acest motiv, devin
inutile. Tocmai de aceea a fost introdus ordinul de complexitate al unui algoritm. Acesta reprezintă o
caracterizare a funcţiei respective, o descriere a ordinului de mărime. [4] [16] [18]
Ordinul de complexitate va indica doar ordinul de mărime al funcţiei, eliminându-se toţi termenii
care nu sunt importanţi.
Din păcate, chiar pentru o instanţă 1 fixată a unei probleme, numărarea instrucţiunilor executate este
o sarcină foarte dificilă. Din această cauză se socoteşte suficient a se măsura de câte ori se repetă
instrucţiunea care se execută cel mai mult. Aceasta este instrucţiunea dominantă, şi se găseşte de regulă
în interiorul tuturor buclelor. Numărul de repetiţii al instrucţiunii dominante este o aproximaţie rezonabilă
pentru numărul total de instrucţiuni executat de algoritm. Oricum, din moment ce nici o instrucţiune nu
se mai execută atât de mult, dacă înmulţim lungimea programului cu numărul de repetiţii al instrucţiunii
dominante avem imediat o margine superioară pentru timpul de execuţie.
În tabelul următor vom prezenta modul în care se stabileşte termenul dominant (coeficienţii au fost
eliminaţi).
Termen dominant Termen "dominat" Condiţii
n! an Întotdeauna
an bn a > b > 1 sau 0 < b < a < 1
an nb Întotdeauna
na nb a > b > 0 sau b < a < 0
na n a > 1
n logan a > 1
logan 1 a > 1
Ar putea părea că ar trebui să avem şi o linie care să indice că logan "domină" pe logbn dacă
a > b. Oarecum surprinzător, nu este cazul. Câteva calcule matematice simple ne arată că toţi termenii
logaritmici sunt la fel de importanţi. Avem:
Am notat prin c raportul 1/logba, pentru a sugera faptul că este o constantă. Datorită faptului că
valorile constante (coeficienţii) nu sunt luaţi în considerare, o funcţie logaritmică nu poate domina o altă
funcţie logaritmică. Din acest motiv, pentru descrierea ordinului de complexitate nici nu mai este prezentă
baza logaritmului, notaţia fiind (log n).
Pentru că de fapt noi socotim numai numărul de repetiţii al instrucţiunii dominante, şi nu toate
instrucţiunile executate, nu are foarte mult sens să comparăm între un algoritm cu complexitatea n şi
unul cu complexitate n+1. Toate instrucţiunile care nu au fost măsurate au o contribuţie care să facă
1
Instanţele unei probleme: mulţimea tuturor intrărilor din care se poate calcula o soluţie pentru problemă
9
Metodica predării tehnicilor de programare pentru grupele de performanţă
algoritmul cu n să dureze în realitate mai mult decât cel cu n+1. Ceea ce trebuie să comparăm de fapt
este ordinul de mărime al complexităţii, care pune în evidenţă creşteri substanţial diferite. Pentru a face
evident acest lucru se foloseşte o notaţie pentru ordinul de mărime al unei funcţii, introdus de fizicianul
Lev Davidovich Landau. [4] [16] [19]
Notaţia foloseşte simbolul („ mare”) pentru a indica mulţimea funcţiilor care cresc mai
repede decât o funcţie dată. Această notaţie compară numai funcţii la limită, în creşterea lor spre infinit.
Pentru a putea compara complexitatea a doi algoritmi care rezolvă o aceeaşi problemă în acest fel,
trebuie ca ei să poată lucra cu probleme de mărimi arbitrar de mari! [4]
Definiţie: fie dată o funcţie f : N --> N, astfel încât de la un rang încolo f(n) > 0; atunci mulţimea
funcţiilor dominate de f se notează cu (f) şi se defineşte astfel:
În cuvinte, o funcţie g este în mulţimea (f) dacă „g creşte mai încet” decât f la infinit.
Din considerentele indicate, metoda preferată pentru a indica complexitatea unui algoritm este de a
o face prin ordinul de mărime al funcţiei sale de complexitate. Din cauza că analizează această
comportare spre infinit complexitatea algoritmilor se numeşte „complexitate asimptotică”. Astfel,
complexitatea asimptotică exprimă concis o limită superioară a timpului de execuţie a unui algoritm.
În foarte multe situaţii putem estima mult mai uşor timpii de execuţie (şi ordinele de complexitate)
pentru anumite secţiuni ale algoritmilor. În această situaţie, este mult mai uşor să determinăm ordinul de
complexitate al întregului algoritm, deoarece se reduc semnificativ calculele necesare.
În concluzie, notaţia (f) se utilizează pentru a limita superior timpul necesar unui algoritm,
măsurând eficienţa acelui algoritm. Uneori este util să estimăm şi o limită inferioară a acestui timp.
În acest scop, definim mulţimea:
10
Metodica predării tehnicilor de programare pentru grupele de performanţă
În continuare vom presupune că funcţia f(n) domină funcţia g(n). În această situaţie vom avea
întotdeauna:
(f(n)) + (g(n)) = (f(n));
(f(n)) · (g(n)) = (f(g(n)));
min( (f(n)), (g(n))) = (g(n));
max( (f(n)), (g(n))) = (f(n)).
De exemplu, presupunem că am reuşit să stabilim că ordinul de complexitate al operaţiei de citire a
datelor de intrare este (n), ordinul de complexitate al operaţiei de prelucrare al acestora este
(n2) şi ordinul de complexitate al operaţiei de scriere a datelor de ieşire este (n). În acest caz,
ordinul de complexitate al algoritmului va fi:
(n) + (n2) + (n) = (n2)
De exemplu, dacă avem T(n) = 2·n2+ 5·n + 3, ordinul de complexitate va fi (n2).
Când cineva spune « acesta este un algoritm de complexitate n2 », de fapt vrea să spună: « pentru
anumite date de intrare de mărime n algoritmul execută instrucţiunea dominantă de cel mult n2 ori ».
Dacă notăm cu (1) ordinul funcţiilor mărginite superior de funcţia constantă, obţinem ierarhia:
O(1) O(log n) O(n) O(n log n) O(n2) O(n3) O(2n)
11
Metodica predării tehnicilor de programare pentru grupele de performanţă
CAPITOLUL II
TEHNICI DE PROGRAMARE
Unele probleme se pot rezolva, altele nu. De exemplu, o problemă notorie, a cărei imposibilitate este
riguros demonstrată în anii '30 de către matematicianul englez Alan Turing, este de a decide dacă un
program se va opri vreodată pentru o anumită instanţă a datelor de intrare.
Pe de altă parte, chiar între problemele care pot fi rezolvate, teoreticienii trag o linie imaginară între
problemele care au rezolvări «rezonabil de rapide», şi restul problemelor, care se numesc «intratabile».
În mod arbitrar, dar nu nejustificabil, o problemă se numeşte « intratabilă » dacă complexitatea ei
este exponenţială în mărimea datelor de intrare. (Nu uitaţi, este vorba de complexitate « worst-case »
asimptotică). O problemă este « tratabilă » dacă putem scrie complexitatea ei sub forma unui polinom,
de un grad oricât de mare.
Aşa cum s-a subliniat în capitolele anterioare, complexitatea în timp a algoritmilor joacă un rol
esenţial. În primul rând un algoritm este considerat "acceptabil" numai dacă timpul său de executare este
polinomial – notăm această clasă de probleme cu P, adică de ordinul O(nk) pentru date de intrare de
mărime n, unde k este o constantă.
Pentru a ne convinge de acest lucru, vom considera un calculator capabil să efectueze un milion de
operaţii pe secundă.
n=20 n=40 n=60
n3 0,2 sec
2n 1 sec 12,7 zile 366 secole
3n 58 min 3855 secole 1013 secole
Chiar dacă în prezent calculatoarele performante sunt capabile de a efectua zeci de miliarde de
operaţii pe secundă, tabelul de mai sus arată că algoritmii exponenţiali nu sunt acceptabili.
Algoritmii cu care suntem obişnuiţi să lucrăm zi de zi sunt determinişti. Asta înseamnă că la un
moment dat evoluţia algoritmului este unic determinată, şi ca instrucţiunea care urmează să se execute
este unic precizată în fiecare moment. [15]
Un algoritm nedeterminist este corect dacă există o posibilitate de executare a sa care găseşte
răspunsul corect. Pe măsură ce un algoritm nedeterminist se execută, la anumiţi paşi se confruntă cu
alegeri nedeterministe. Ei bine, dacă la fiecare pas există o alegere, care făcută să ducă la găsirea
soluţiei, atunci algoritmul este numit corect.
12
Metodica predării tehnicilor de programare pentru grupele de performanţă
Clasa tuturor problemelor care se pot rezolva cu algoritmi nedeterminişti într-un timp polinomial se
notează cu NP (Nedeterminist Polinomial). Este clar că orice problemă care se află în P se află şi în NP,
pentru că algoritmii determinişti sunt doar un caz extrem al celor determinişti: în fiecare moment au o
singură alegere posibilă.
Iată câteva exemple de probleme NP-complete:
Problema comis-voiajorului (turneu Hamiltonian de cost minim): dându-se o reţea de oraşe,
o reţea de drumuri între oraşe şi o lungime k, există un traseu de cost mai mic decât k
trecând prin fiecare oraş o singură dată şi revenind la punctul de plecare?
Dându-se o mulţime de numere naturale, se poate împărţi în două mulţimi de numere de
sume egale?
„Clica”: dându-se un graf G şi un număr k, are G un subgraf complet cu k vârfuri (adică o
mulţime de k vârfuri unite fiecare cu fiecare)?
„Acoperire”: dându-se un graf G şi un număr k, pot alege k vârfuri în aşa fel încât toate
muchiile din G au un capăt ales?
Pentru a afirma că o problemă este NP-completă, trebuie dată o demonstraţie a inaccesibilităţii sale.
RECURSIVITATE
DESCRIERE METODĂ
“O noţiune este definită recursiv dacă în cadrul definiţiei intervine însăşi noţiunea care se defineşte ”.
Noţiunea de recursivitate din informatică derivă din noţiunea matematică denumită recurenţă.
Recursivitate este o tehnică de programare utilizată frecvent în implementarea subprogramelor şi
constă în referirea, în corpul subprogramului definit, la subprogramul însuşi.
O definiţie recursivă corectă trebuie să satisfacă condiţia de consistenţă : valoarea trebuie să fie
direct calculabilă sau calculabilă cu ajutorul unor valori direct calculabile (mai exact, procesul de
autoapelare trebuie să se oprească după un număr finit de paşi).
Deci, regula fundamentală pentru o recursie definită corect este:
Să existe cazuri elementare, rezolvabile direct
Cazurile care nu se rezolvă direct să progreseze către un caz elementar.
Exemplu de definiţie de funcţie care nu respectă condiţia de consistenţă, este următorul (nu pot fi
calculate valorile funcţiei pentru n>0):
cu f: NxNN
13
Metodica predării tehnicilor de programare pentru grupele de performanţă
indirect – subprogramul recursiv apelează un alt subprogram, care, la rândul său, conţine un
apel (direct sau indirect) la primul subprogram.
La baza utilizării recursivităţii stă stiva, gestionată implicit de sistem, care, ca în cazul oricărui apel
de subprogram, reţine următoarele informaţii:
valorile parametrilor de tip valoare
adresele parametrilor de tip variabilă
variabilele locale ale subprogramului
adresa de revenire în subprogramul/programul apelant (adresa instrucţiunii aflată după
instrucţiunea de apel).
AVANTAJE ŞI DEZAVANTAJE
Avantajul metodei constă în simplificarea scrierii programelor, acestea preluând de multe ori definiţia
recursivă a unor procese de calcul, rezultând exprimări ale algoritmilor compacte şi clare.
Dezavantajul folosirii acestei metode derivă din faptul că folosirea stivei presupune un consum
suplimentar de timp şi memorie.
Există situaţii când varianta recursivă este nerecomandată – de exemplu cazul calculării numerelor
Fibonacci, deoarece se recalculează de mai multe ori aceleaşi valori (recursivitate în cascadă).
14
Metodica predării tehnicilor de programare pentru grupele de performanţă
METODA BACTRACKING
DESCRIERE METODĂ
Metoda backtracking este o metodă de programare cu ajutorul căreia se rezolvă problemele în care:
soluţia se poate reprezenta sub forma unui tablou X = (x1, x2, …, xn) cu x1M1, x2M2
etc. M1, M2, ..., Mn fiind mulţimi finite având s1, s2, ..., sn elemente.
Între elementele tabloului X există anumite relaţii impuse în enunţ.
Condiţii interne
În fiecare problemă sunt date anumite relaţii care trebuie să existe între componentele
x1, x2,..., xn ale vectorului X, numite condiţii interne.
Condiţii de continuare
Dacă la pasul k, condiţiile interne sunt satisfăcute, algoritmul se continuă în funcţie de cerinţe. Dacă
mai trebuie căutate componente, deoarece numărul lor se cunoaşte şi încă nu le-am obţinut pe toate, sau
componentele încă nu constituie o soluţie pe baza unor proprietăţi, condiţiile de continuare vor permite
continuarea algoritmului.
Soluţii rezultat
Acele soluţii dintre soluţiile posibile care satisfac condiţiile impuse de problemă (condiţiile
interne şi condiţiile de continuare nu cer componente în plus) se numesc soluţii rezultat. Metodă
de rezolvare a acestei categorii de probleme ar fi determinarea tuturor soluţiilor posibile şi apoi căutarea
acelora care satisfac condiţiile interne. Dezavantajul este uşor de observat deoarece timpul cerut de
această căutare este foarte mare.
1
Backtracking = parcurgerea limitată în adâncime a unui arbore conform condiţiilor de continuare
15
Metodica predării tehnicilor de programare pentru grupele de performanţă
termeni xk+1,..., xn, nu vom ajunge la o soluţie în care condiţiile interne să fie
satisfăcute)
Dacă la pasul k condiţiile de continuare nu sunt îndeplinite trebuie să se facă o altă alegere
pentru xk din mulţimea Mk
Dacă mulţimea Mk a fost epuizată (s-au testat toate valorile din mulţime) se decrementează
k şi se încearcă o altă alegere pentru xk-1 din mulţimea Mk-1 .
Observaţii
Acestei decrementări a lui k i se datorează numele metodei, exprimând faptul că atunci
când nu putem avansa, se avansează în sens invers (înapoi) în secvenţa curentă a soluţiei
Între condiţiile interne şi cele de continuare există o strânsă legătură. O bună alegere a
condiţiilor de continuare are ca efect reducerea numărului de calcule
Modul progresiv de completare a tabloului X (avans/revenire) este specific tehnicii LIFO (stiva).
Stiva este acea formă de organizare a datelor (structură de date) cu proprietatea că operaţiile
de introducere şi extragere a datelor se fac la un singur capăt, respectiv în vârful ei.
BACKTRACKING ITERATIV
Subalgoritm Backtracking:
k1
ST[k]0
Cât timp k > 0 execută:
okfals
Cât timp (ST[k]< valoare maximă permisă) AND NOT ok execută:
{mai sunt valori netestate în mulţime, deci lui ST[k] i se atribuie o
altă valoare }
ST[k] ST[k]+1
okPosibil(k) {poate am găsit valoare posibilă pentru ST[k]}
sfârşit cât timp
Dacă Not ok Atunci
16
Metodica predării tehnicilor de programare pentru grupele de performanţă
BACKTRACKING RECURSIV
Subalgoritm Back(k):
Pentru i=1,valoarea maximă impusă de problemă execută:
ST[k]i
Dacă Posibil(k) Atunci
{dacă am ajuns la sfârşitul generării}
Dacă (*) (k=numărul de elemente cerut) Atunci
{sau altă condiţie de continuare}
Scrie soluţia(k)
Altfel
Bacă(k+1)
sfârşit dacă
sfârşit dacă
sfârşit pentru
Un caz special îl reprezintă categoria de probleme care se implementează cu ajutorul unei matrice în
care se codifică posibilităţile de deplasare prin zone cu restricţii,regulate sau neregulate, (caz în care
soluţia se compune din două (sau mai multe) şiruri care descriu, de exemplu, coordonatele în plan).
17
Metodica predării tehnicilor de programare pentru grupele de performanţă
Concluzii:
Soluţia se construieşte pas cu pas
Dacă se constată că, pentru o valoare aleasă, nu avem cum să ajungem la soluţie, se
renunţă la acea valoare şi se reia căutarea din punctul în care am rămas
Dacă s-au determinat componentele x1, x2, …, xk-1 ale unei soluţii parţiale, un element
xkMk nu este ataşat imediat soluţiei, ci se verifică mai întâi dacă el satisface anumite
condiţii de continuare. Dacă ele nu sunt satisfăcute, atunci xk nu este adăugat soluţiei,
încercând alt element, dacă există. Dacă Mk s-a epuizat, atunci se revine la elementul xk-1
pentru care se caută altă valoare din Mk-1, dacă există
alegere bună a condiţiilor de continuare conduce la reducerea numărului de calcule. Ideal,
condiţiile de continuare nu trebuie să fie numai necesare ci şi suficiente pentru obţinerea
unei soluţii.
AVANTAJE ŞI DEZAVANTAJE
Avantajul metodei constă în garantarea obţinerii soluţiei. Dezavantajul principal îl reprezintă timpul
de execuţie mare.
Pentru ilustrarea metodei la clasă, se recomandă analiza şi implementarea rezolvărilor pentru
următoarele probleme:
Generarea de elemente combinatorice:
- generarea tuturor permutărilor şirului 1, 2, 3, ..., n
- generarea tuturor aranjamentelor de n luate câte m
- generarea tuturor combinărilor n luate câte m
- generarea partiţiilor mulţimii {1, 2, 3, ..., n}
Aşezarea pe tabla de şah de dimensiune nxn a n regine, fără ca acestea să se atace
Generarea tuturor partiţiilor unui număr natural n
Plata unei sume cu monede de valori date
Generarea tuturor şirurilor de n paranteze rotunde care se închid corect
Problema comis-voiajorului
Problema colorării hărţilor.
Se pot adăuga câteva probleme clasice de backtracking în plan:
Problema labirintului
Problema săriturii calului
Problema fotografiei.
Însă scopul acestei lucrări este acela de a ilustra modul de abordare şi implementare a acestei
metode din perspectiva pregătirii copiilor pentru performanţă, caz în care algoritmii de rezolvare vor
respecta forma generală a metodei, dar obiectivul principal este acela de a găsi posibilităţi de optimizare
şi implementări cât mai specifice problemei.
18
Metodica predării tehnicilor de programare pentru grupele de performanţă
Din acest motiv, voi prezenta, comparativ, rezolvări clasice şi rezolvări optimizate pentru câteva
probleme de concurs.
Observaţie:
Deşi rezolvarea unei probleme folosind metoda backtracking garantează obţinerea soluţiei, timpul
de execuţie al unui astfel de algoritm poate fi inacceptabil de mare. În consecinţă, atunci când trebuie să
rezolvăm o problemă încercăm elaborarea unui algoritm care nu se bazează pe backtracking. Dacă nu
găsim un astfel de algoritm sau nu există, analizăm datele de intrare:
o Pentru date de intrare cu dimensiuni rezonabile, se poate aborda problema în manieră
backtracking
o Pentru date de intrare de dimensiuni mari, abordarea backtracking este inacceptabilă (se
caută altă variantă care să genereze soluţie “aproape” optimă). [12]
APLICAŢII BACKTRACKING
Generarea combinărilor
combinărilor.
Considerăm combinările ca numere scrise în baza n+1, ordinea naturală coincide cu cea
lexicografică.
Să se genereze, pentru n şi k numere naturale date, combinările de n elemente luate câte k.
Soluţie:
Spaţiul soluţiilor posibile: generarea tuturor numerelor cuprinse în intervalul (1,n).
Condiţii de continuare:
Elementele mulţimii st={a1, a2,…, ak) trebuie să fie distincte
Generarea mulţimilor în ordine lexicografică
Program combinari;
Type stiva=array[1..100] of integer;
Var
st:stiva;
n,k,kk:integer;
Function valid(kk:integer):boolean;
var
i:integer;
ev:boolean;
19
Metodica predării tehnicilor de programare pentru grupele de performanţă
begin
{elemente distincte}
ev:=True;
for i:=1 to kk-1 do
if st[kk]=st[i] then ev:=False;
{ordine lexicografica}
if (kk>1) And (st[kk]<st[kk-1]) then ev:=False;
valid:=ev;
end;
Function solutie(kk:integer):boolean;
begin
solutie:=(k=kk)
end;
Procedure tipar(kk:integer);
var
i:integer;
begin
for i:=1 to kk do
write(st[i],' ');
writeln;
end;
Procedure back(kk:integer);
var
i:integer;
begin
for i:=1 to n do
begin
st[kk]:=i;
if valid(kk) then
if solutie(kk) then tipar (kk)
else back(kk+1);
end;
end;
Begin
write('n='); readln(n);
write('k='); readln(k);
back(1);
End.
Subalgoritm NextComb
jk
Cât timp cj=n-k+j Execută
jj-1;
Sfârşit Cât timp
Dacă j≠0 Atunci
cj cj+1
Pentru i=j+1,k Execută
1
Algoritm curs „Calcul paralel”, M. Drăgan, Timişoara
20
Metodica predării tehnicilor de programare pentru grupele de performanţă
Ci Ci-1+1
Sfârşit Pentru
Afişează mulţimea Ci
Altfel exit
Sfârşit Dacă
Sfârşit Subalgoritm
Implementare algoritm
Program combinari;
Type vect=array[0..100] of integer;
Var
c:vect;
i,n,k,j:integer;
Procedure tipar;
var
i:integer;
begin
For i:=1 To k Do
Write(c[i],' ');
Writeln;
end;
Procedure Nextcomb;
var i,j:integer;
begin
While true Do
begin
j:=k;
{cautam elementul care poate fi marit}
While c[j]=n-k+j Do
j:=j-1;
{Daca s-au generat toate elementele parasim fortat}
If j=0 then exit;
{incrementam valoarea elementului curent}
c[j]:=c[j]+1;
{reinitializam elementele aflate dupa elementul curent}
For i:=j+1 to k do
c[i]:=c[i-1]+1;
tipar;
end;
end;
Begin
Write('n=');Readln(n);
Write('k=');Readln(k);
{generam si afisam prima multime}
For i:=1 To k Do
c[i]:=i;
tipar;
Nextcomb;
End.
Scanarea combinării curente de la dreapta la stânga se face în cel mult O(k) paşi. Generarea
primei combinări necesită cel mult O(k) paşi, iar generarea tuturor combinărilor necesită iteraţii,
Descompunere
Fiind dat un număr natural N, se cere să se afişeze toate descompunerile sale ca sumă de numere prime.
Soluţie:
21
Metodica predării tehnicilor de programare pentru grupele de performanţă
Subalgoritm Prime(k)
okTrue
Pentru divizor=2, Execută
Dacă ST[k] Mod divizor=0 Atunci ok False
Sfârşit pentru
Return ok
Subalgoritm Suma(k)
S0
Pentru i=1,k Execută
SS+ST[k]
Sfârşit pentru
okS=N
Return ok
Program Descompune_prime;
var ST, Np:array[0..1000] of integer;
22
Metodica predării tehnicilor de programare pentru grupele de performanţă
n, K, P, S, i:integer;
procedure scrie_sol;
var i:integer;
begin
for i:=1 to k do
write(Np[ST[i]],' ');
writeln
end;
Begin
fillchar(ST,sizeof(ST),0);
fillchar(Np,sizeof(Np),0);
write('N='); readln(N);
P:=0;
for i:=2 to N do
if Prim(i) then
begin
inc(P);
Np[P]:=i
end;
k:=1;
S:=0;
while k>0 do
begin
ST[k]:=ST[k]+1;
if (ST[k]<=P) and (S+Np[St[k]]<=N) then
if S+Np[St[k]]=N then scrie_sol
else
begin
S:=S+Np[ST[k]];
k:=k+1;
ST[k]:=ST[k-1]-1
end
else
begin
k:=k-1;
S:=S-Np[St[k]]
end
end
End.
23
Metodica predării tehnicilor de programare pentru grupele de performanţă
program Subsiruri;
var ST,V :array[0..1000] of integer;
N,k,i :integer;
sol :longint;
scrie :boolean;
procedure Printsol(l:integer);
var i:integer;
begin
if scrie then
begin
for i:=1 to l do write(V[ST[i]],' ');
writeln
end;
sol:=sol+1
end;
procedure Bkt(l:integer);
var f,i:integer;
begin
i:=1;
ST[1]:=0;
while i>0 do
begin
repeat
ST[i]:=ST[i]+1
until ((ST[i]>ST[i-1]) and (V[ST[i]]>=V[ST[i-1]])) or (ST[i]>N);
if ST[i]<=N then
if i=l then Printsol(l)
else
begin
i:=i+1;
ST[i]:=0
end
else i:=i-1
24
Metodica predării tehnicilor de programare pentru grupele de performanţă
end
end;
Begin
write('N,k:'); readln(N,k);
for i:=1 to N do
begin
write('V[',i,']=');
readln(V[i])
end;
scrie:=true;
writeln('Subsirurile crescatoare de lungime ',N div 5,' sunt: ');
Bkt(N div 5);
sol:=0;
scrie:=false;
for i:=1 to k do Bkt(i);
write('Numarul subsirurilor crescatore de lungime <= ',K,' este: ',sol)
End.
PROBLEME DE CONCURS
Date de intrare
Fişierul de intrare MASINI.IN conţine o singură linie pe care sunt trecute valorile n şi m, separate
printr-un spaţiu.
Date de ieşire
Fişierul de ieşire MASINI.OUT va conţine pentru fiecare soluţie obţinută câte n linii care vor descrie
conţinutul cutiilor. Pe linia i (i = 1, 2, ..., n) se scriu m numere de or dine ale maşinuţelor care
sunt puse în cutia având numărul de ordine i. Aceste numere se vor despărţi printr-un spaţiu, iar în faţa
numerelor de ordine a maşinuţelor se va scrie cuvântul cutia, apoi un spaţiu şi numărul de ordine i,
care la rândul lui este urmat de ': '. Dacă într-o cutie nu se pune nici o maşinuţă, ea nu va conţine
după ': ' nimic.
Restricţii şi precizări
1 ≤ n, m ≤ 7.
Exemplu
MASINI.IN
3
MASINI.OUT
cutia 1: 1 2
cutia 2:
25
Metodica predării tehnicilor de programare pentru grupele de performanţă
cutia 1: 1
cutia 2: 2
cutia 1: 2
cutia 2: 1
cutia 1:
cutia 2: 1 2
Soluţie: [15]
Această problemă se rezolvă prin metoda backtracking deoarece trebuie generate toate soluţiile. În
această idee vom realiza următoarea codificare a datelor:
x va fi şirul soluţie şi vom păstra în xi numărul de ordine al cutiei în care punem maşinuţa i;
în şirul nri păstrăm numărul (cantitatea) maşinuţelor puse în cutia i;
în şirul pusi vom avea valoarea adevărat dacă maşinuţa i a fost pusă deja în soluţia curentă,
iar în caz contrar pusi va avea valoarea fals.
Exemplu
Fie n = 2 şi m = 3.
x = (1, 1) cu semnificaţia că atât maşinuţa 1, cât şi maşinuţa 2 se introduc în cutia 1;
x = (1, 2) maşinuţa 1 se introduce în cutia 1 şi maşinuţa 2 în cutia 2;
x = (2, 1) maşinuţa 1 se introduce în cutia 2 şi maşinuţa 2 în cutia 1;
x = (2, 2) ambele maşinuţe se introduc în cutia 2.
Pentru rezolvarea problemei avem nevoie de un algoritm care verifică condiţiile de continuare. Am
putea număra apariţiile fiecărei cutii până la pasul curent k şi am putea verifica apoi dacă numerele
obţinute nu sunt cumva mai mari decât m. Renunţăm la această idee şi vom verifica la fiecare pas k, dacă
maşinuţa k nu este pusă deja în vreo cutie şi dacă cutia în care vrem s-o punem nu este deja plină,
folosindu-ne de şirurile pus şi nr.
Subalgoritm Posibil(k):
Posibil (nr[i] < m) şi (nu pus[k])
Sfârşit subalgoritm
Afişarea cerută în enunţ are un format special, adică trebuie să scriem cuvântul ‘cutia’,
apoi numărul de ordine al cutiei şi după ': ' numerele maşinuţelor care sunt
În acea cutie separate prin c\te un spaţiu. Subalgoritmul prin care obţinem afişarea cerută este:
Subalgoritm Afişare(x):
Pentru i=1,n execută
Scrie 'cutia ',i,': '
Pentru j=1,n execută
Dacă i = x[j] atunci scrie j,' '
Sfârşit pentru
Sfârşit pentru
Sfârşit subalgoritm
26
Metodica predării tehnicilor de programare pentru grupele de performanţă
Date de ieşire
Fişierul de ieşire CALNEBUN.OUT va conţine câte o linie, corespunzătoare unei soluţii. Fiecare soluţie
va fi scrisă sub forma unor perechi de numere naturale indicând traseul calului. Aceste perechi reprezintă
coordonatele pătratelor tablei de şah atinse de cal pe traseul lui începând cu poziţia iniţială şi terminând
cu poziţia finală. Perechile se vor scrie încadrate între paranteze rotunde şi în interiorul parantezei
despărţite de o virgulă.
Dacă din start calul se află în bătaia nebunului sau coordonatele citite din fişier nu se află în
interiorul tablei, în fişierul de ieşire se va scrie mesajul 'Imposibil'.
Restricţii şi precizări
2 ≤ n ≤ 8;
calul nu are voie să iasă de pe tablă;
poziţia iniţială nu poate să coincidă cu poziţia finală;
în cazul în care coordonatele iniţiale şi finale ale calului se află în interiorul tablei şi poziţia
iniţială nu este atacată de nebun, atunci va exista întotdeauna cel puţin o soluţie.
Exemplu
CALNEBUN.IN
6
2 3
2 2
4 4
CALNEBUN.OUT
(2,2)(4,3)(2,4)(3,6)(4,4)
(2,2)(4,3)(5,5)(3,6)(4,4)
(2,2)(4,3)(5,5)(6,3)(4,4)
(2,2)(4,3)(6,4)(5,2)(4,4)
(2,2)(4,3)(5,1)(6,3)(4,4)
(2,2)(4,3)(3,1)(5,2)(4,4)
Soluţie1:
În figura de mai jos sunt haşurate poziţiile pe care bate nebunul când se află pe poziţia N având
coordonatele (2, 4). Calul se află iniţial în poziţia de start marcată cu C (2, 2) şi trebuie să ajungă
în poziţia finală F (5, 5). El are două trasee de aceeaşi lungime minimă pentru a ajunge în poziţia
finală, si anume:
(2, 2)(3, 4)(5, 5)
(2, 2)(4, 3)(5, 5)
1
O abordare interesantă se poate găsi în [17]
28
Metodica predării tehnicilor de programare pentru grupele de performanţă
Prima observaţie pe care o facem se referă la faptul că în enunţ se cer toate soluţiile problemei care
corespund cerinţelor. În acest moment ştim că metoda de rezolvare va fi backtracking. Analizând
cerinţele, constatăm că trebuie să determinăm un minim. În această problemă minimul nu este doar un
număr (care de altfel nici nu trebuie afişat la ieşire), ci un şir de coordonate de pe tabla de şah care
corespund traseului de lungime minimă. În plus, se cer toate aceste şiruri. Prima idee ar fi să stabilim
(conform algoritmului clasic) un astfel de minim, apoi să afişăm toate soluţiile care corespund acestuia.
Astfel ar trebui să efectuăm algoritmul realizat cu metoda backtracking o dată pentru stabilirea tuturor
soluţiilor, reţinând valoarea minimă a traseului, apoi să executăm î ncă odată acelaşi algoritm pentru
găsirea tuturor soluţiilor (traseelor) având lungimea minimă.
Este evident că o astfel de soluţie nu este acceptabilă, deoarece ar conduce la un timp de execuţie
mult prea mare. Analizând în continuare problema, ajungem la concluzia că trebuie să găsim o modalitate
care nu execută integral procedura care implementează metoda backtracking de două ori.
Mai întâi ne propunem să găsim o rezolvare în care s-o executăm o singură dată. Dacă am putea
stabili minimul şirului, traversându-l o singură dată, am găsit simplificarea pe care ne-am propus-o.
În următorul algoritm presupunem că se caută (mai simplu) toate poziţiile din şirul x pe care se
află valoarea minimă a şirului x. Rezultatul se va furniza programului apelant în şirul rez de lungime j:
Subalgoritm Minim(n,x,j,rez):
min x[1]
j 1
rez[j] 1
pentru i = 2, n execută
dacă min > x[i] atunci
j 1
rez[j] i
min x[i]
altfel
dacă min = x[i] atunci
j j + 1
rez[j] i
sfârşit dacă
sfârşit dacă
sfârşit pentru
sfârşit subalgoritm
Dar în cazul nostru trebuie reţinute soluţii care sunt şiruri de coordonate şi nu doar indici. Alegem
altă cale de rezolvare. Vom scrie rezultatul curent în fişier şi atunci când găsim unul care corespunde
aceluiaşi minim, deschidem fişierul cu Append şi îl scriem, iar când găsim o soluţie corespunzătoare unui
minim mai mic decât cel curent, deschidem fişierul cu ReWrite, astfel începând scrierea grupului nou de
soluţii.
Se poate observa că pe lângă această modalitate mai există şi altele care rezolvă problema.
De exemplu, putem presupune că traseul minim are lungimea minimă 1. Apelăm procedura
Back(i,j,pas) şi căutăm trasee având această lungime. Dacă găsim un astfel de traseu, îl scriem în
fişier, dacă nu, atunci mărim valoarea minimului la 2 şi căutăm trasee având această lungime. Algoritmul
se opreşte, evident, atunci când am găsit cel puţin o soluţie care corespunde minimului presupus
29
Metodica predării tehnicilor de programare pentru grupele de performanţă
la pasul respectiv. Suntem siguri că astfel găsim soluţiile corespunzătoare minimului, deoarece am luat
în considerare valorile posibile în ordine crescătoare.
Acest algoritm este următorul:
Subalgoritm Minim:
min 2
ok fals
repetă
Back(x0,y0,2,min,ok)
min min +1
până când ok
sfârşit algoritm
Soluţia o vom codifica într-un tablou t, corespunzător tablei de şah, iniţializându-i elementele cu 0.
Atunci când în căutarea soluţiei efectuăm un pas permis într-o anumită poziţie, valoarea acelui element
va fi egală cu numărul de ordine al pasului. Evident, la revenire vom avea grijă să restabilim valoarea
iniţială a elementului respectiv pentru ca în timpul generării unei soluţii noi să putem efectua un pas în
această poziţie.
În procedura Back(i,j,pas) vom genera poziţiile (ii,jj) corespunzătoare paşilor noi pe care
un cal le poate efectua dintr-o poziţie curentă (i,j) cu ajutorul a două şiruri de constante (di şi dy)
care reprezintă deplasamentele liniilor, respectiv coloanelor celor 8 poziţii în care poate sări un cal.
Pentru fiecare astfel de poziţie nouă, vom verifica dacă ea se află sau nu pe tabla de şah
(if (ii in [1..n]) and (jj in [1..n])).
Dacă ne aflăm pe tablă, vom verifica dacă această poziţie este în afara bătăii nebunului (aflat în
poziţia (x,y) cu instrucţiunea if (Abs(x-ii) <> Abs(y-jj)). Totodată verificăm şi elementul
corespunzător din tabloul t. Dacă acest element are valoarea 0, înseamnă că încă nu a fost inclus în
traseu, deci putem efectua un pas aici. Acum vom verifica dacă această poziţie nu este cumva cea finală,
caz în care urmează să ne convingem că lungimea traseului este egală cu lungimea minimă propusă.
Dacă am atins poziţia finală şi numărul paşilor este egal cu min, am obţinut o soluţie şi o putem
afişa. În caz contrar vom continua traseul început, dar numai dacă numărul de ordine al pasului curent
este mai mic decât lungimea minimă propusă , deoarece nu are sens să determinăm soluţii care conduc la
o lungime mai mare decât cea propusă din moment ce acestea nu se valorifică.
În concluzie, algoritmul recursiv care implementează metoda backtracking este următorul:
Subalgoritm Back(i,j,pas):
Pentru k=1,8 execută
iii+ di[k] { indicele de linie a poziţiei noi }
jjj+ dj[k] { indicele de coloana a poziţiei noi }
{ dacă poziţia aleasă este pe tablă }
Dacă (ii {1,2,...,n}) şi (jj {1,2,...,n}) atunci
{dacă poziţia nu se află pe traiectoriile nebunului şi }
Dacă (x-ii) y-jj) şi (t[ii,jj] = 0) atunci
30
Metodica predării tehnicilor de programare pentru grupele de performanţă
Afişarea rezultatului se realizează pe baza valorilor diferite de zero din tabloul t. Deoarece ştim că
numărul acestor elemente este min (accesibilă, deoarece algoritmul s-a terminat când am găsit un traseu
având cea mai mică valoare), în tabloul t vom căuta valori cuprinse între 1 şi min, în această ordine
afişând indicii de linie şi de coloană a acestora.
Subalgoritm Afişare(t):
k 1
cât timp k min execută
pentru i=1,n execută
pentru j=1,n execută
dacă t[i,j] = k atunci
scrie i, j
k k + 1
sfârşit dacă
sfârşit pentru
sfârşit pentru
sfârşit cât timp
sfârşit subalgoritm
Ion şi-a construit o vilă pe frumosul vârf al unui munte. Acum proiectează o scară specială, pe care
va urca de la şosea până la vilă. Diferenţa de nivel dintre şosea şi vilă este H (deci aceasta trebuie să fie
înălţimea totală a scării). Scara va avea N trepte, toate de aceeaşi lăţime, dar de înălţimi distincte două
câte două.
Ion a sesizat că efortul pe care îl depune pentru a urca o treaptă este egal cu înălţimea treptei. Dar
dacă el urcă x trepte deodată, efortul depus este egal cu media aritmetică a înălţimilor acestor x trepte
pe care le urcă deodată + un efort de valoare constantă p (necesar pentru a-şi lua avânt).
31
Metodica predării tehnicilor de programare pentru grupele de performanţă
Fiind un tip atletic, Ion poate urca mai multe trepte deodată, dar suma înălţimilor treptelor urcate
deodată nu trebuie să depăşească o valoare maximă M.
Cerinţă
Scrieţi un program care să determine efortul minim necesar pentru a urca pe o scară construită
conform restricţiilor problemei, precum şi o modalitate de a construi scara care va fi urcată cu efort
minim.
Date de intrare
Fişierul de intrare scara.in va conţine pe prima linie 4 numere naturale separate prin câte un
spaţiu H N M p (cu semnificaţia din enunţ).
Date de ieşire
Fişierul de ieşire scara.out va conţine
pe prima linie va fi scris efortul minim necesar (cu 2 zecimale cu rotunjire);
pe cea de a doua linie vor fi scrise N numere naturale nenule care reprezintă înălţimile celor
N trepte ale scării (în ordinea de la şosea către vilă), separate prin câte un spaţiu.
Restricţii şi precizări
0 < H 75
0 < N 8
0 < M < 14
0 p 10
Pentru datele de test, problema are întotdeauna soluţie.
Dacă există mai multe soluţii (modalităţi de a construi scara astfel încât să obţineţi efortul minim
dorit), veţi afişa prima soluţie în ordine lexicografică.
Spunem că vectorul x=(x1, x2, ..., xk) precedă în ordine lexicografică vectorul y=(y1,
y2, ..., yk) dacă există i1 astfel încât xj=yj, pentru orice j<i şi xi<yi.
Dacă a doua zecimală a efortului minim este 0, sau chiar ambele zecimale sunt 0 nu este necesar să
le afişaţi. Deci în exemplu s-ar fi putut scrie efortul minim 9 sau 9.0.
Exemplu
scara.in scara.out
10 4 5 2 9.00
1 4 2 3
Soluţie:
Reprezentarea informaţiilor
Vectorul în care generăm soluţiile: sol, cu n componente, cu semnificaţia
sol[i]=înălţimea treptei i
Soluţia care necesită efort minim o vom reţine în vectorul solmin
Pentru a verifica dacă toate înălţimile sunt distincte vom construi vectorul caracteristic al
înălţimilor: uz cu M componente (nu putem folosi înălţimi mai mari decât M)
uz[i]=1, dacă înălţimea i a fost utilizată şi 0 în caz contrar
32
Metodica predării tehnicilor de programare pentru grupele de performanţă
Condiţii interne
sol[i] din {1, 2, ..., M}
sol[i]<>sol[j], pentru orice i<>j
sol[1]+s[2]+...+sol[N]=H
void Citire();
void Back (int);
void Afisare();
double efort ();
void main()
{
Citire();
efmin=(double)H*N+1;
Back (1);
Afisare();
}
void Citire()
{ifstream fin(InFile);
fin>>H>>N>>M>>p;
fin.close();}
void Afisare()
{
int i;
ofstream fout(OutFile);
fout<<setprecision(2)<<efmin<<endl;
for (i=1; i<N; i++)
33
Metodica predării tehnicilor de programare pentru grupele de performanţă
fout<<solmin[i]<<' ';
fout<<solmin[N]<<endl;
fout.close();
}
double efort()
{
int k, j;
double x, sum;
for (k=1; k<=N; k++)
{x=sol[k]+ef[k-1];
//urc cu efort minim primele k-1 trepte si apoi urc treapta k de
inaltime i
sum=sol[k];
for (j=2; k-j>=0; j++)
{//urc deodata j trepte k, k-1, ..., k-j+1, daca suma inaltimilor
lor este <=M
//in sum calculez suma inaltimilor
sum+=sol[k-j+1];
if (sum>M) break;
if (sum/j+p+ef[k-j]<x)
x=sum/j+ef[k-j]+p;
}
ef[k]=x;
}
return ef[N];
}
void Back(int k)
{
int i;
double x;
if (k==N+1)
{
if (htot==H)
{x=efort();
if (x<efmin && efmin-x>0.001)
{efmin=x;
for (i=1; i<=N; i++) solmin[i]=sol[i]; }
}
}
else
for (i=1; i<=H && htot+i<=H && i<=M; i++)
if (!uz[i])
{
//care ar fi efortul minim daca as pune inaltimea treptei k=i?
sol[k]=i; htot+=i; uz[i]=1;
Back (k+1);
uz[i]=0; htot-=i;
}
}
Un senator are o vilă, reprezentată printr-o matrice ce conţine numai caracterele "1" şi "-" (minus),
unde 1 reprezintă "zid", iar 0 "spaţiu liber". Spre exemplu o vilă modestă, cu doar 3 camere arată în felul
următor:
34
Metodica predării tehnicilor de programare pentru grupele de performanţă
1111111111111
1-------1---1
1---111111111
1-------1---1
1111111111111
Problema cere să aflaţi:
a) Câte camere are vila senatorului
b) Care este camera cu suprafaţa cea mai mare
c) Ce perete trebuie îndepărtat (prin perete se înţelege un singur caracter de '1') astfel încât să
se obţină o cea mai mare cameră.
d) se cere o singură soluţie.
Datele de intrare
Se citesc din fişierul "vila.in" ce are următorul format:
pe prima linie se găsesc două numere naturale n şi m despărţite printr-un spaţiu
(1<=n,m<=100), care reprezintă numărul de linii n, respectiv numărul de coloane m al
matricei
pe următoarele n linii se găsesc cate m caractere "1" sau "-"
Datele de ieşire
Fişierul "vila.out", va avea următorul format
prima linie conţine numărul de camere
a doua linie conţine aria camerei de suprafaţă maximă
a treia linie conţine coordonatele zidului eliminat şi aria camerei de suprafaţă maximă
rezultată
Exemplu:
1)
vila.in vila.out Observaţie:
5 13 4 Camerele nu se învecinează
1111111111111 17 pe diagonala.
1-------1---1 4 9 22
1---1111-1111
1-------1---1
1111111111111
2)
vila.in
4 12 vila.out Observaţie:
111111111111 2 Vila se consideră
-----11----- 10 înconjurată de ziduri
-----11----- 1 1 11
111111111111
Soluţie1:
1
Idee de rezolvare preluată din [11]
35
Metodica predării tehnicilor de programare pentru grupele de performanţă
Rezolvarea problemei se bază pe fill (backtracking recursiv în plan). Problema avea totuşi două
capcane:
I. Prima dintre ele este legată de gestionarea corectă a stivei. O procedură de genul
"procedure fill(x,y:integer)" este din start greşită, deoarece nu avem suficient spaţiu pe stiva
pentru a parcurge in felul acesta o matrice de 10000 de elemente. O implementare corectă este
următoarea:
procedure fill;
begin
.....
inc(x);fill;dec(x);
dec(x);fill;inc(x);
inc(y);fill;dec(y);
dec(y);fill;inc(y);
.....
end;
unde x si y sunt variabile globale. În acest fel, pe stiva se alocă numai apelul de procedură (şi nici
un parametru). Este de reţinut această metodă şi pentru alte tipuri de proceduri recursive.
II. A doua capcană era legată de algoritmul folosit în determinarea peretelui ce trebuie scos. O variantă de
genul "scot fiecare perete, şi fac un fill pornind din locul unde se află peretele pentru a determina aria
camerei rezultate" este total ineficientă, deoarece măreşte în mod drastic complexitatea rezolvării. Ca
idee, pentru fiecare element (i,j) din matrice trebuie să cunosc aria camerei din care face parte,
arie[i,j]. Atunci pentru fiecare perete (x,y), aria camerei ce rezultă prin îndepărtarea lui este
1+arie[x-1,y]+arie[x+1,y]+arie[x,y-1]+arie[x,y+1].
Bineînţeles, se verifică sp, nu adun de doua ori aria aceleaşi camere la îndepărtarea unui perete. De
asemenea aria a[i,j] pentru (i,j) perete este zero.
Implementare algoritm Pascal
{$A+,B-,D+,E-,F+,G+,I-,L+,N+,O-,P-,Q-,R-,S-,T-,V+,X+}
{$M 65200,0,655360}
var
fil :text;
N,M,i,j,k,smax,mi,mj,t :integer;
A :array[1..100] of string[100];
C :array[1..100,1..100] of integer;
V :array[1..10000] of integer;
U :array[1..10000] of byte;
Procedure fill;
begin
if (A[i,j]<>'-') or (c[i,j]<>0) then exit;
C[i,j]:=k;
inc(V[k]);
if i>1 then begin dec(i); fill; inc(i) end;
if j>1 then begin dec(j); fill; inc(j) end;
if i<N then begin inc(i); fill; dec(i) end;
if j<M then begin inc(j); fill; dec(j) end;
end;
Begin
assign(fil,'VILA.IN'); reset(Fil); readln(fil,N,M);
for i:=1 to N do readln(fil,A[i]);
close(fil);
36
Metodica predării tehnicilor de programare pentru grupele de performanţă
fillchar(C,sizeof(C),0);
fillchar(V,sizeof(V),0);
k:=0;
smax:=0;
for i:=1 to N do
for j:=1 to M do
if (A[i,j]='-') and (C[i,j]=0) then
begin
inc(k);
Fill;
if V[k]>smax then smax:=V[k]
end;
assign(fil,'VILA.OUT'); rewrite(fil);
writeln(fil,k);
writeln(fil,smax);
smax:=0;
fillchar(u,sizeof(u),0);
for i:=1 to N do
for j:=1 to M do
if A[i,j]='1' then
begin
t:=0;
if (i>1) and (A[i-1,j]='-') then begin
t:=t+V[C[i-1,j]]; u[c[i-1,j]]:=1
end;
if (j>1) and (A[i,j-1]='-') and (u[c[i,j-1]]=0) then begin
t:=t+V[C[i,j-1]]; u[c[i,j-1]]:=1
end;
if (j<M) and (A[i,j+1]='-') and (u[c[i,j+1]]=0) then begin
t:=t+V[C[i,j+1]]; u[c[i,j+1]]:=1
end;
if (i<N) and (A[i+1,j]='-') and (u[c[i+1,j]]=0) then
t:=t+V[C[i+1,j]];
if t>smax then begin
smax:=t; mi:=i; mj:=j
end;
if (i>1) and (A[i-1,j]='-') then u[c[i-1,j]]:=0;
if (j>1) and (A[i,j-1]='-') then u[c[i,j-1]]:=0;
if (j<M) and (A[i,j+1]='-') then u[c[i,j+1]]:=0
end;
if mi+mj=0 then writeln(fil,'nu exista pereti de daramat...')
else writeln(fil,mi,' ',mj,' ',smax+1);
close(fil)
End.
37
Metodica predării tehnicilor de programare pentru grupele de performanţă
METODA GREEDY1
DESCRIERE METODĂ
Metoda rezolvă probleme de optim în care soluţia se construieşte pe parcurs. Optimul global se
determină prin estimări succesive ale optimului local. Dintr-o mulţime de elemente A trebuie determinată
o submulţime B, care verifică anumite condiţii şi care, de obicei, este soluţia unei probleme de
optimizare. Soluţia problemei se construieşte treptat. Iniţial B este mulţimea vidă. Se adaugă în B
succesiv elemente din A, atingându-se de fiecare dată un optim local. Dar, această construire nu
asigură întotdeauna atingerea unui optim global. De aceea metoda greedy nu poate fi aplicată decât dacă
se demonstrează că modul de construire a mulţimii B duce la obţinerea unui optim global. [12]
Datorită modului de construire a soluţiei, metoda se mai numeşte metoda optimului local.
Subalgoritm Greedy(A,B):
B Ø
Cât timp nu Soluţie(B) şi A ≠ Ø execută
Alege(A,b)
Elimină(A,b)
Dacă Posibil(B,b) Atunci
Adaugă(B,b)
Sfârşit dacă
Sfârşit cât timp
Dacă Solutie(B) Atunci scrie B
Altfel scrie 'Nu s-a gasit solutie.'
Sfârşit dacă
Sfârşit subalgoritm
În acest algoritm am utilizat următoarele subalgoritmi:
Subalgoritmul Soluţie(B) de tip funcţie verifică dacă B este soluţie optimă a
problemei;
Alege(A,b) extrage cel mai promiţător element b din mulţimea A pe care îl poate alege la
un moment dat;
Subalgoritmul Posibil(B,b) de tip funcţie verifică dacă este posibil să se obţină soluţie,
nu neapărat optimă, prin adăugarea lui b la mulţimea B.
Observaţii:
La fiecare pas se alege cel mai promiţător element la momentul respectiv. Dacă un element
se introduce în mulţimea B, el nu va fi niciodată eliminat de acolo.
Dacă se alege un element din A care nu se poate adăuga mulţimii B, el se elimină din A şi nu
se mai testează ulterior.
1
Greedy - lacom
38
Metodica predării tehnicilor de programare pentru grupele de performanţă
În rezolvarea problemelor, de multe ori este utilă ordonarea mulţimii A înainte ca algoritmul propriu-
zis să fie aplicat în funcţie de cerinţele problemei. Datorită or donării, elementele din A vor fi testate pe
rând, începând cu primul.
AVANTAJE ŞI DEZAVANTAJE
Avantajul metodei constă în faptul că algoritmul oferă întotdeauna o soluţie. Dezavantajul: algoritmii
de tip greedy nu asigură întotdeauna găsirea soluţiei optime, chiar dacă la fiecare pas se determină
soluţia optimă pentru pasul respectiv. De aceea, în momentul în care rezolvăm o problemă prin această
metodă, va trebui să găsim o demonstraţie matematică riguroasă referitoare la optimalitatea globală a
soluţiei. De cele mai multe ori ea se face prin inducţie matematică sau prin reducere la absurd.
Observaţii:
Metoda Greedy poate fi privită ca un caz particular al metoda Backtracking, în care se
renunţă la mecanismul de întoarcere;
Pentru a evita trierea tuturor submulţimilor mulţimii A în metoda Greedy se utilizează un
criteriu (o regulă) care asigură alegerea directă a elementelor necesare.
Tehnica Greedy conduce la timp de calcul polinomial. Să presupunem că mulţimea din care se face
alegerea are n elemente si că soluţia are tot n elemente (caz maxim). Se fac n alegeri, la fiecare alegere
se fac n teste, rezulta un algoritm cu timp O(n2).
De multe ori este necesar ca elementele mulţimii A să fie sortate, pentru ca apoi să alegem din
acestea, iar sortarea necesita un timp minim O(n * log2n). Însă sortarea se efectuează la început. Prin
urmare, acest timp se adună, deci nu influenţează rezultatul. [15]
39
Metodica predării tehnicilor de programare pentru grupele de performanţă
închirierea unei cabane pe anumite intervale de timp solicitate, astfel încât numărul
solicitanţilor serviţi să fie maxim;
problema spectacolelor (Într-o sală de spectacole trebuie planificate cât mai multe spectacole
dintre cele N existente în repertoriu, astfel încât fiecare să respecte ora de începere şi de
încheiere planificate);
descompunerea unui şir de numere dat în număr minim de subşiruri descrescătoare; ordinea
din subşiruri trebuie să fie aceeaşi cu ordinea din şirul dat:
coduri Huffman;
analiza problemei plăţii sumei cu bancnote de valori date; găsirea unei mulţimi de monede
pentru care algoritmul furnizează (respectiv nu furnizează) soluţie optimă. [15]
APLICAŢII GREEDY
Pentru plata unei sume S avem la dispoziţie n tipuri de monede, printre care şi moneda cu valoarea
1. Să se găsească o modalitate de plată a sumei cu un număr minim de monede.
Soluţie:
Algoritmul folosit este foarte simplu. Se ia moneda cu valoarea cea mai mare şi se foloseşte de câte
ori este posibil. Apoi moneda cu valoarea imediat următoare şi aşa mai departe.
Exemplu: S=13 n=3 M1=7 M2=3 M3=1
Se foloseşte moneda M1 de S div M1=13 div 7=1 ori.
Apoi M2 de S div M2=6 div 2=3 ori.
Am găsit o modalitate de plată cu 4 monede: S=13=7+2+2+2.
Algoritmul folosit nu conduce tot timpul la soluţia optimă, dar este foarte eficient. Putem găsi uşor
un contraexemplu: S=17 n=3 M1=7 M2=5 M3=1 , soluţia algoritmului va avea 5 monede:
S=17=7+7+1+1+1, în timp ce soluţia optimă are numai 3 monede: S=17=7+5+5.
Programul constă dintr-o sortare şi o parcurgere a vectorului de monede. Complexitatea algoritmului
este O(n× lg n+n)=O(n× lg n).
program Plata_sumei;
var M, F :array [1..100] of integer;
S, n, i :integer;
procedure Citire;
var i:integer;
f:text;
begin
assign(f,’mode.in’); Reset(f);
readln(f,S,n);
for i:=1 to n do
read(f,M[i])
close(f);
end;
40
Metodica predării tehnicilor de programare pentru grupele de performanţă
Dacă suma greutăţilor obiectelor este mai mică decât G, atunci încarc toate obiectele:
x=(1,...,1). De aceea presupunem în continuare că g1+...+gn>G.
Conform strategiei Greedy, ordonez obiectele descrescător după câştigul la unitatea de greutate,
deci lucrăm în situaţia:
(*)
Algoritmul constă în încărcarea în această ordine a obiectelor, atâta timp cât nu se depăşeşte
greutatea G (ultimul obiect poate fi eventual încărcat parţial):
G1 G { G1 reprezintă greutatea disponibilă }
41
Metodica predării tehnicilor de programare pentru grupele de performanţă
gkxk+(gk+1yk+1+...+gnyn)=gkyk+gk+1yk+1+...+gnyn. Rezultă:
gk(xk-yk)=(1-)(gk+1yk+1+…+gnyn) (**)
Compar performanţa lui y' cu cea a lui y:
42
Metodica predării tehnicilor de programare pentru grupele de performanţă
cunoaşte costul conectării lor directe (considerăm acest cost egal cu + dacă nu este posibilă conectarea
lor). Constructorul trebuie să conecteze oraşele astfel încât din oricare oraş să se poată ajunge în oricare
altul. Ce legături directe trebuie să aleagă constructorul astfel încât costul total al lucrării să fie minim?
Este evident că graful parţial căutat este un arbore (dacă ar exista un ciclu, am putea îndepărta
orice muchie din el, cu păstrarea conexităţii şi micşorarea costului total).
Soluţie:
Vom aplica metoda Greedy: adaug mereu o muchie de cost minim dintre cele nealese şi care nu
formează un ciclu cu precedentele muchii alese.
Acest algoritm poartă numele de algoritmul lui Kruskal.
Fie graful neorientat conex G=(X,U) cu X={1,2,..,n} şi funcţia cost .
Se pleacă iniţial de la n arbori disjuncţi H1,H2,...,Hn. La pasul k al algoritmului avem n-k arbori
disjuncţi, fie aceştia H1,H2,..,Hn-k, pentru care Hi=(Xi, Ui), i=1...(n-k) astfel încât:
Vom încerca unificarea (uniformizarea) acestor arbori. Alegerea, pentru a fi unificaţi, a doi arbori
se face astfel: dintre toate muchiile nealese încă, se selectează acea muchie de cost minim care are cele
două extremităţii (u,v) în două mulţimi diferite Xu şi Xv, muchie care nu duce la apariţia unui ciclu în
graful parţial de cost minim ce se construieşte.
Descriere algoritm:
Se pleacă de la graful parţial H=(V,A). Acesta va avea aşadar n componente conexe. Deoarece
ştim că un arbore cu n vârfuri are n–1 muchii, rămâne să stabilim modul de selectarea a arcelor
arborelui dintre muchiile grafului G.
Mai întâi se adaugă la graf muchia de cost minim şi se obţine un graf parţial cu n–1 componente
conexe. Dintre toate muchiile nealese, se selectează, la un moment dat, muchia de cost minim care să nu
formeze cicluri cu muchiile deja alese (se alege o muchie de cost cât mai mic ale cărei extremităţi se află
în componente conexe diferite). Prin adăugarea unei astfel de muchii, se reduce cu o unitate numărul
componentelor conexe (cele două componente conexe în care se aflau extremităţile muchiei selectate
devin în acest fel o unică componentă conexă).
Algoritmul se termină când se obţine un graf parţial H astfel încât oricare din muchiile nealese
formează cicluri cu muchiile din H.
43
Metodica predării tehnicilor de programare pentru grupele de performanţă
Pentru a marca componenta conexă în care se află fiecare vârf la un moment dat, vom folosi un
vector C cu n elemente (C[i] indică componenţa conexă în care se găseşte vârful i).
Etapele algoritmului sunt următoarele:
Pas 1
Iniţializarea vectorului componentelor conexe C
Pentru i = l,n execută
C[i] : = i ;
Pas 2
Se alcătuieşte lista U a muchiilor grafului G, în ordinea crescătoare a costurilor
Pas 3
ct:= 0; {costul APM este iniţial 0}
ms:=0; {numărul muchiilor selectate iniţial este 0}
k:=1;
Pas 4
Cât timp ms<n-1 execută
4.1 Repetă
Treci la următoarea muchie (u,v) U
Până când C[u]<>C[v];
4.2 Pune muchia (u,v) în H;
4.3 ct:=ct + Cost(u,v);
4.4 ms:=ms+1;
4.5 Pentru i := 1, n execută
{unifică componentele conexe din care fac parte vârfurile u şi v }
Dacă C[i]=max(C[u],C[v]) atunci
C[i]:=min(C[u],C[v]);
Pas 5
Scrie ct;
Observaţie:
Deoarece la unificarea componentelor conexe din care fac parte vârfurile u şi respectiv v am notat
componenta conexă comună cu min(C[u],C[v]), în final toate elementele vectorului C sunt egale cu
1. Dacă notam componenta conexă comună la întâmplare, fie cu C[u], fie cu C[v], în final elementele
vectorului C ar fi fost de asemenea egale între ele, dar cu neapărat egale cu 1. Acest lucru nu ar fi
schimbat cu nimic algoritmul general, iar pasul 4.5 poate fi scris sub forma:
4.5 Pentru i:=1,n execută
{unifică componentele conexe din care fac parte vârfurile u şi v}
Dacă C[i]=C[u] atunci
C[i]:=C[v];
PROBLEME DE CONCURS
44
Metodica predării tehnicilor de programare pentru grupele de performanţă
Într-un laborator de analize chimice se utilizează N reactivi. Se ştie că, pentru a evita accidentele sau
deprecierea reactivilor, aceştia trebuie să fie stocaţi în condiţii de mediu speciale. Mai exact, pentru
fiecare reactiv x, se precizează intervalul de temperatură [minx, maxx] în care trebuie să se încadreze
temperatura de stocare a acestuia.
Reactivii vor fi plasaţi în frigidere. Orice frigider are un dispozitiv cu ajutorul căruia putem stabili
temperatura (constantă) care va fi in interiorul acelui frigider (exprimată într-un număr întreg de grade
Celsius).
Cerinţă
Scrieţi un program care să determine numărul minim de frigidere necesare pentru stocarea
reactivilor chimici.
Date de intrare
Fişierul de intrare react.in conţine:
pe prima linie numărul natural N, care reprezintă numărul de reactivi;
pe fiecare dintre următoarele N linii se află min max (două numere întregi separate printr-
un spaţiu); numerele de pe linia x+1 reprezintă temperatura minimă, respectiv temperatura
maximă de stocare a reactivului x.
Date de ieşire
Fişierul de ieşire react.out va conţine o singură linie pe care este scris numărul minim de frigidere
necesar.
Restricţii
1 <= N <= 8000
-100 <= minx <= maxx <= 100 (numere întregi, reprezentând grade Celsius), pentru orice x
de la 1 la N
un frigider poate conţine un număr nelimitat de reactivi
Exemple
react.in react.out react.in react.out react.in react.out
3 2 4 3 5 2
-10 10 2 5 -10 10
-2 5 5 7 10 12
20 50 10 20 -20 10
30 40 7 10
7 8
Soluţie:
Problema se poate rezolva prin metoda greedy. O variantă mai explicită a enunţului este
următoarea:
"Se consideră N intervale pe o axă. Să se aleagă un număr minim de puncte astfel încât fiecare
interval să conţină cel puţin unul dintre punctele alese."
45
Metodica predării tehnicilor de programare pentru grupele de performanţă
Facem o primă observaţie: pentru orice soluţie optimă există o soluţie cu acelaşi număr de puncte
(frigidere), în care fiecare punct să fie sfârşitul unui interval. Aceasta se poate obţine mutând fiecare
punct spre dreapta, până când ar ajunge la sfârşitul intervalului care se termină cel mai repede, dintre
intervalele care îl conţin. Se observă că noua soluţie respectă restricţiile din enunţ.
În continuare ne vom concentra pe găsirea unei soluţii de acest tip.
Sortăm reactivii după sfârşitul intervalului. Pentru intervalul care se termină cel mai repede, alegem
ultimul punct al său ca temperatură a unui frigider. Se observă că această alegere este cea mai bună,
dintre toate alegerile unui punct în intervalul respectiv, în sensul că mulţimea intervalelor care conţin
punctul este mai mare (conform relaţiei de incluziune), decât mulţimea corespunzătoare oricărei alte
alegeri. Acest fapt este adevărat, deoarece mutarea punctului mai la stânga nu duce la selectarea unor
noi intervale.
Intervalele care conţin punctul respectiv sunt eliminate (reactivii corespunzători pot fi plasaţi într-un
frigider), iar procesul continuă cu intervalele rămase, în acelaşi mod
Notăm cu D numărul de temperaturi întregi din intervalul care conţine temperaturile din enunţ. Se
observă că D este cel mult 201.
Citirea datelor de intrare are ordinul de complexitate O(N).
Sortarea intervalelor după capătul din dreapta are ordinul de complexitate O(N · log N).
Urmează F paşi, unde F este numărul de frigidere selectate. Deoarece fiecare frigider este setat la o
temperatură întreagă, F ≤ D.
În cadrul unui pas, determinarea intervalului care se termină cel mai repede, pe baza vectorului
sortat, are ordinul de complexitate O(1). Eliminarea intervalelor care conţin un anumit punct (sfârşitul
intervalului care se termină cel mai repede) are ordinul de complexitate O(N).
Afişarea rezultatului are ordinul de complexitate O(1). În concluzie, ordinul de complexitate al
algoritmului de rezolvare a acestei probleme este O(N · D + N · log N); deoarece în general
D > log N, considerăm ordinul de complexitate ca fiind O(N · D).
46
Metodica predării tehnicilor de programare pentru grupele de performanţă
Begin
If x<y Then
Minim := x
Else
Minim := y
End;
Function Cauta(min, max: ShortInt): Integer;
Var i: Integer;
Begin
Cauta := -1;
For i := 1 To Cate Do
Begin
If (f[i].max>=min) And (f[i].max<=max) Then
Begin Cauta := i; Break End
Else
If (f[i].min>=min) And (f[i].min<=max) Then
Begin Cauta := i; Break End
Else
If (f[i].min<=min) And (f[i].max>=max) Then
Begin Cauta := i; Break End
Else
If (f[i].max<min) Or (f[i].min>max) Then
Cauta := -1
End;
End;
Procedure Intersectie(j: Integer; min, max: ShortInt);
Begin
f[j].min := Maxim(min, f[j].min);
f[j].max := Minim(max, f[j].max)
End;
procedure QuickSortCresc(Lo, Hi: Integer);
procedure Sort(Stanga, Dreapta: Integer);
var i, j, x: integer;
y: Frigider;
begin
i := Stanga; j := Dreapta; x := r[(Stanga+Dreapta) DIV 2].min;
repeat
while r[i].min < x do i := i + 1;
while x < r[j].min do j := j - 1;
if i <= j then
begin
y := r[i]; r[i] := r[j]; r[j] := y;
i := i + 1; j := j - 1;
end;
until i > j;
if Stanga < j then Sort(Stanga, j);
if i < Dreapta then Sort(i, Dreapta);
end;
begin {QuickSort};
Sort(Lo,Hi);
end;
47
Metodica predării tehnicilor de programare pentru grupele de performanţă
if i <= j then
begin
y := r[i]; r[i] := r[j]; r[j] := y;
i := i + 1; j := j - 1;
end;
until i > j;
if Stanga < j then Sort(Stanga, j);
if i < Dreapta then Sort(i, Dreapta);
end;
begin {QuickSort};
Sort(Lo,Hi);
end;
Begin
Assign(Fisier, 'reactivi.in'); Reset(Fisier);
ReadLn(Fisier, N);
For i := 1 To N Do
ReadLn(Fisier, r[i].min, r[i].max);
Close(Fisier);
QuickSortCresc(1, N);
i := 1; j := i+1;
While j<=N Do
Begin
While (r[j].min=r[i].min) And (j<=N) Do Inc(j);
QuickSortDescresc(i, j-1);
i := j; j := i+1
End;
Lupul uriaş şi rău îşi doreşte să se poată juca cu prietenele sale oiţele mici şi pufoase. În calea
fericirii sale stă însă ciobănaşul Eduard care decide să nu-l lase pe lup să se joace cu toate oile sale, îl
lasă să aleagă doar câteva. Lupul se află într-un punct fix pe pajişte, iar oile stau la diferite distanţe faţă
de el. Alegerea oilor se face în mai multe etape. Lupul uriaş şi rău alege o oaie aflată la o distanţă de
maxim X şi în acel moment toate celelalte oi se vor îndepărta (la cerinţele ciobănaşului Eduard) cu
distanţa L faţă de lup. Pentru fiecare oaie se cunoaşte cantitatea de lână pe care o are, iar lupul îşi
doreşte ca suma cantităţilor de lână pentru oile alese să fie cât mai mare (ca să fie cât mai pufoase).
48
Metodica predării tehnicilor de programare pentru grupele de performanţă
Cerinţă
Ajutaţi-l pe lupul uriaş şi rău să aleagă oile astfel încât să aibă cât mai multă lână.
Date de intrare
Prima linie a fişierului de intrare lupu.in conţine trei numere întregi N , X si L reprezentând
numărul de oi, distanţa maximă de la care lupul poate alege oi şi distanţa cu care se depărtează oile de
lup după fiecare alegere. Pe următoarele N linii se află câte două numere întregi D şi A reprezentând
distanţa iniţială şi cantitatea de lână a fiecărei oi.
Date de ieşire
În fişierul lupu.out veţi afişa un singur număr întreg S, reprezentând cantitatea maximă de lână
pe care o poate aduna lupul de la oile alese.
Restricţii si precizări
1 ≤ N ≤ 100.000
1 ≤ X ≤ 500.000
Pentru 40% din teste N ≤ 1000
Toate numerele din fişierul de intrare sunt întregi din intervalul [0, 231-1]
Exemplu
lupu.in lupu.out
10 6 2 54
1 13
4 14
4 3
6 7
0 7
5 16
3 16
4 10
4 18
3 16
Soluţie:
Se construieşte vectorul T[i] care retine timpul maxim la care oaia i poate fi aleasa si notăm
T_max valoarea maxima din T.
O abordare care însă nu conduce la punctaj maxim este programarea dinamică, calculând sol[i]
[j] cantitatea maximă de lână care se poate alege cu primele i oi până la momentul j. Răspunsul se va
găsi în sol[n][T_max]. Complexitatea este O(n2) şi ar obţine aproximativ 50-60 de puncte.
O rezolvare ce aduce 100 de puncte se bazează pe metoda greedy. Pentru fiecare valoare j de la
T_max la 1 se adaugă într-o mulţime toate cantităţile de lână A[i] pentru oile cu T[i]=j, apoi se
extrage valoarea maximă care se adaugă la soluţie, restul valorilor păstrându-se în mulţime pentru pasul
următor. Atenţie, se va extrage valoarea maximă chiar dacă la acest pas nu s-au introdus valori noi în
mulţime. Pentru a implementa eficient aceste operaţii ne vom folosi un heap care suporta operaţiile de
extragere maxim şi adăugare element în O(log n). Complexitatea finală a algoritmului va fi de
O(n log n). Demonstraţia intuitivă a faptului ca algoritmul conduce la soluţie optimă este că la fiecare
pas j se alege valoarea maximă dintre cele care nu vor mai putea fi alese la pasul j+1.
49
Metodica predării tehnicilor de programare pentru grupele de performanţă
O alta soluţie tot greedy a problemei este sortarea descrescătoare după cantităţile de lână. Pentru
fiecare valoare apoi se vede cel mai mare timp mai mic sau egal cu T[i] şi la care nu a mai fost aleasă
nici o alta oaie. Dacă există un astfel de timp se adaugă valoare respectiva la soluţie. Acest lucru se poate
realiza cu o căutare binara a acestui timp. O alternativă la acest lucru ar fi folosirea mulţimilor disjuncte.
Iniţial se consideră fiecare moment de timp o mulţime. Notam X = minimul din mulţimea care îl conţine
pe T[i]. Daca alegem A[i] pentru a-l adăuga la soluţie se va reuni mulţimea care îl conţine pe X cu
mulţimea care îl conţine pe X-1.
Cutii [25]
S-a mutat muzeul. Obiectele au fost împachetate în cutii având forme cubice de diverse dimensiuni.
La despachetare lucrează multe persoane în paralel şi pentru a evita dezordinea, prin încăperile unde se
lucrează la despachetare s-a instalat o bandă rulantă pe care se aşează cutiile goale, cu singura
deschizătură orientată în sus.
Ştefan stă la capătul benzii şi strânge cutiile. El a primit sarcina să împacheteze cutiile unele în
altele, astfel încât numărul pachetelor de cutii să fie cel mai mic posibil.
Directorul muzeului, văzându-l pe Ştefan dezorientat datorită acestei cerinţe, s-a hotărât să-l ajute şi
a stabilit regulile următoare:
cutiile se culeg de pe bandă în ordinea sosirii lor;
cutia curentă se aşează într-o altă cutie, dacă aceasta are dimensiunea mai mică;
dacă nu există pachet început în care să încapă cutia curentă, aceasta va constitui prima
cutie dintr-un pachet nou;
într-un pachet început se aşează o singură cutie (nu se pun mai multe cutii unele lângă
altele, chiar dacă există loc);
o cutie aşezată la un moment dat nu se mai scoate;
un pachet început nu se aşează în alt pachet, chiar dacă acest lucru ar fi posibil;
nici o cutie nu poate fi ignorată.
Scrieţi un program care determină numărul minim de pachete de cutii rezultate în urma muncii lui
Ştefan, precum şi secvenţele de cutii din fiecare pachet.
Date de intrare
Prima linie a fişierului de intrare CUTII.IN conţine un singur număr natural n, reprezentând
numărul cutiilor. Următoarele n linii conţin fiecare câte un număr natural, reprezentând dimensiunile
cutiilor.
Date de ieşire
Pe prima linie a fişierului CUTII.OUT se va scrie numărul minim m de pachete de cutii. Pe
următoarele m linii se vor scrie dimensiunile cutiilor pe care Ştefan le va împacheta într-un singur pachet,
în ordinea împachetării.
Restricţii
0 ≤ n ≤ 1000;
1 ≤ dimensiune_cutie ≤ 10.000.
50
Metodica predării tehnicilor de programare pentru grupele de performanţă
Exemplu
CUTII.IN
10
4
1
5
10
7
9
2
8
3
2
CUTII.OUT
4
4 1
5 2
10 7 3 2
9 8
Soluţie:
Această problemă a fost propusă în altă formă la o selecţie a lotului olimpic din 1999.
Pentru a rezolva problema putem folosi metoda greedy, astfel: punem cutia curentă în cea mai mică
cutie, care este mai mare decât ea, existentă printre cutiile deja poziţionate.
Şirul dimensiunilor cutiilor deschise este crescător. Această afirmaţie poate fi demonstrată uşor
prin inducţie şi prezentăm în continuare această demonstraţie.
Pentru un singur pachet afirmaţia este adevărată. În cazul în care avem un şir de n pachete
ordonate crescător şi adăugăm o cutie nouă, atunci ea fie formează un nou pachet (deci şirul este
crescător), fie intră într-un pachet deja format, şi din modul de alegere a pachetului rezultă că şirul
dimensiunilor rămâne crescător.
În concluzie, dacă folosim proprietatea că şirul este crescător, pentru a găsi locul cutiei curente vom
folosi o căutare binară în locul unei căutări secvenţiale.
Analiza complexităţii
Operaţiile de citire a datelor de intrare şi scriere a rezultatelor au ordinul de complexitate O(n).
Operaţia de împachetare a cutiilor are ordinul de complexitate O(n · log n), deoarece pentru
fiecare cutie care vine pe bandă căutăm locul unde va fi poziţionată folosind o căutare binară. În
concluzie, ordinul de complexitate a soluţiei acestei probleme este O(n) + O(n · log n)+ O(n) =
O(n · log n).
51
Metodica predării tehnicilor de programare pentru grupele de performanţă
DIVIDE ET IMPERA
DESCRIERE METODĂ
Divide et Impera este o metodă de elaborare a algoritmilor aplicabilă problemelor care pot fi
descompuse în subprobleme independente de dimensiuni mai mici, care pot fi rezolvate direct.
Dându-se o funcţie care lucrează asupra a n date, tehnica Divide et Impera („Divide şi
Stăpâneşte”) presupune o împărţire a celor n date în k submulţimi distincte, 1<=k<=n care produc k
subprobleme similare, elementare sau nu. [7]
Paradigma divide şi stăpâneşte implică trei paşi:
Divide problema într-un număr de subprobleme
Stăpneşte subproblemle prin rezolvarea acestora
Combină soluţiile tuturor subproblemelor în soluţia finală pentru problema iniţială.
Subproblemele elementare se rezolvă simplu, printr-un algoritm optim, iar cele ne-elementare se
descompun la rândul lor, în subprobleme, până când toate descompunerile au ajuns la probleme
elementare care se pot rezolva imediat.
Se determină o metodă de recombinare (compunere) a soluţiile problemelor elementare pentru a
obţine soluţia problemei iniţiale.
Metoda se poate implementa atât recursiv cât şi iterativ.
Considerând k=2 (problema iniţială P descompusă în două subprobleme de dimensiuni aproximativ
egale n1,n2) şi dimensiunea minimă a unei probleme rezolvabile direct n0, atunci forma generală a
metodei este:
Subprogram div_imp(P,n,s); {n-dimensiunea problemei P}
Dacă n<n0 atunci rezolvă(n,s) {problema elementara rezolvabila direct}
altfel
descompune(n,n1,n2);
{obţinem 2 subprobleme de dimensiuni n1,n2}
div_imp(n1,s1);
div_imp(n2,s2);
{recombinăm soluţiile s1,s2 => soluţia finală s}
combină(s1,s2,s)
Sfârşit dacă
52
Metodica predării tehnicilor de programare pentru grupele de performanţă
În practică, de foarte multe ori, cele n date pot fi memorate în tabloul A(1,n). Procedura generală
de împărţire în 2 subprobleme similare revine la împărţirea subşirului (xp, xq) în subşirurile:
o (xp,xm) şi (xm+1,xq) sau
o (xp,xm-1) şi (xm+1,xq)
Unde m este mijlocul subşirului (xp, xq).
TIMPUL DE CALCUL
Dacă mărimile celor două subprobleme sunt aproximativ egale, atunci timpul de calcul pentru
subprogramul anterior (div_imp) este descrisă prin următoarea formulă de recurenţă:
g (n}, n mic
T ( n)
T(n/2) f (n), altfel
Unde: T(n) este timpul consumat de funcţie pentru n intrări, g(n)- timpul pentru calculul
răspunsului direct pentru intrările date, iar f(n) – timpul consumat pentru funcţiile div_imp şi compune.
Lemă: Dacă f(n)=a*n, cu a o constantă, atunci T(n) =O(n log2n) .
Observaţie: O problemă de tipul Divide et Impera poate scoate un timp optim dacă algoritmul
care rezolvă problema elementară este optim.
Căutarea binară
53
Metodica predării tehnicilor de programare pentru grupele de performanţă
Sfârşit dacă
Sfârşit dacă
Return False
Algoritmul necesită o mică analiză, legată de corectitudinea sa parţială. Mai precis, ne întrebăm:
când se ajunge la p>u?
pentru cel puţin 3 elemente nu se poate ajunge la p>u;
pentru 2 elemente, adică pentru u=p+1, se alege m=p. Dacă x<am, atunci up-1. Se
observă că se iese din ciclul cât timp şi am-1<x<am=ap;
pentru un element, adică p=u, se alege m=p=u. Dacă x<am atunci up-1, iar dacă x>am
atunci pu+1; în ambele cazuri se părăseşte ciclul cât timp şi va fi returnat un rezultat
corect.
procedure Inter(p,m,u)
k1p; k2m+1; k3p;
while k1m And k2u
if ak1<ak2 then bk3ak1; k1k1+1
else bk3ak2; k2k2+1
k3k3+1
if k1>m { au fost epuizate elementele primei subsecvenţe }
then
for i=k2,u
bk3ai;
k3k3+1
else { au fost epuizate elementele primei subsecvenţe }
for i=k1,m
bk3ai;
k3k3+1
for i=p,u
aibi
end
Timpul de calcul este de ordinul O(u-p), adică liniar în lungimea secvenţei analizate.
54
Metodica predării tehnicilor de programare pentru grupele de performanţă
Programul principal urmează întocmai strategia Divide et Impera, deci se face apelul
SortInter(1,n), unde procedura recursivă SortInter are forma:
procedure SortInter(p,u)
if p<>u then
m(p+u)/2;
SortInter(p,m);
SortInter(m+1,u);
Inter(p,m,u)
end
Prezentăm încă o metodă de sortare a unui vector a=(a1,...,an). Va fi aplicată tot metoda Divide
et Impera. Şi de această dată fiecare problemă va fi descompusă în două subprobleme mai mici de
aceeaşi natură, dar nu va mai fi necesară combinarea (asamblarea) rezultatelor rezolvării subproblemelor.
Fie (ap,...,au) secvenţa curentă care trebuie sortată. Vom poziţiona pe ap în secvenţa
(ap,...,au), adică printr-o permutare a elementelor secvenţei:
x=ap va trece pe o poziţie k;
toate elementele aflate la stânga poziţiei k vor fi mai mici decât x;
toate elementele aflate la dreapta poziţiei k vor fi mai mari decât x.
În acest mod ap va apărea pe poziţia sa finală, rămânând apoi să ordonăm crescător elementele
aflate la stânga sa, precum şi pe cele aflate la dreapta sa.
Fie poz funcţia cu parametrii p,u care întoarce indicele k pe care va fi poziţionat ap în cadrul
secvenţei (ap,...,au).
Atunci sortarea se realizează prin apelul QuickSort(1,n), unde procedura QuickSort are
forma:
55
Metodica predării tehnicilor de programare pentru grupele de performanţă
procedure QuickSort(p,u)
if p<>u then
k poz(p,u);
QuickSort(p,k-1);
QuickSort(k+1,n)
end
Observaţie: Cazul cel mai defavorabil este cel în care vectorul este deja ordonat crescător: se
compară a1 cu a2,...,an rezultând că el se află pe poziţia finală, apoi se compară a2 cu a3,...,an
rezultând că el se află pe poziţia finală etc.
Trecem la calculul timpul mediu de executare al algoritmului Quicksort. Vom număra câte
comparări se efectuează (componentele vectorului nu sunt neapărat numere, ci elemente dintr-o mulţime
ordonată oarecare). Timpul mediu este dat de formulele:
deoarece:
în cazul cel mai defavorabil a1 se compară cu celelalte n-1 elemente;
a1 poate fi poziţionat pe oricare dintre poziţiile k=1,2,...,n; considerăm aceste cazuri
echiprobabile;
T(k-1) este timpul (numărul de comparări) necesar ordonării elementelor aflate la stânga
poziţiei k, iar T(n-k) este timpul necesar ordonării elementelor aflate la dreapta poziţiei k.
56
Metodica predării tehnicilor de programare pentru grupele de performanţă
2 3 n n+1
≤ 2 ln(n+1)
(am folosit o inegalitate bazată pe sumele Riemann pentru funcţia f(x)=ln x).
Deci T(n)=0(n.log n).
Încheiem cu menţiunea că metoda Divide et Impera are o largă aplicativitate în calculul paralel.
PROBLEME DE CONCURS
Pentru serbarea şcolii profesorul de dans a adus un costum de urs polar care poate fi îmbrăcat doar
de un copil care are înălţimea adecvată. El încearcă să găsească elevul potrivit pentru a purta costumul.
Profesorul, observând că nu există doi elevi cu aceeaşi înălţime, cere elevilor să se aşeze în ordinea
crescătoare a înălţimii lor. Speră astfel ca să găsească mai uşor elevul potrivit.
Cunoscând numărul elevilor, precum şi înălţimile lor în ordine crescătoare, scrieţi un program care să
determine dacă există un elev cu înălţimea cerută şi care este locul lui în şirul elevilor. Dacă nu există un
astfel de elev, determinaţi locul elevului care are cea mai mică înălţime şi este mai înalt decât înălţimea
cerută – adică locul pe care ar sta un elev cu înălţimea potrivită.
Date de intrare
57
Metodica predării tehnicilor de programare pentru grupele de performanţă
Prima linie a fişierului de intrare SERBARE.IN va conţine două numere întregi pozitive: înălţimea
căutată h în centimetri şi numărul de elevi n. Aceste numere vor fi separate printr-un spaţiu. Pe
următoarea linie se află n numere întregi, separate prin câte un spaţiu, în ordine strict crescătoare,
reprezentând înălţimea elevilor în centimetri.
Date de ieşire
Fişierul de ieşire SERBARE.OUT va conţine o linie pe care se va afla răspunsul 'NU', dacă nu există
un elev de înălţime potrivită, sau 'DA' dacă acesta există. Pe următoarea linie se va scrie poziţia
elevului în şirul ordonat fie că este cel găsit, fie că este a elevului imediat mai mare.
Restricţii şi precizări
60 ≤ h ≤200;
1 ≤ n ≤ 1000
Exemple
SERBARE.IN
150 7
110 112 140 137 150 151
155 158 167
SERBARE.OUT
NU
4
Soluţie:
Dacă şirul nu ar fi ordonat, profesorul ar fi nevoit să încerce să găsească elevul potrivit luând elev
după elev şi verificând înălţimea sa. În momentul în care a găsit elevul căruia i se potriveşte costumul,
căutarea profesorului ar lua sfârşit. Copilul căutat poate fi primul, dar tot aşa de bine poate fi şi ultimul.
Având în vedere faptul că înălţimea elevilor este dată în ordine crescătoare, o soluţie prin care se
găseşte elevul potrivit ar trebui să ţină cont de acest fapt.
O strategie posibilă este ca profesorul să încerce să găsească elevul potrivit studiind înălţimea
elevului aflat pe poziţia din mijloc al şirului. Dacă elevul căutat nu este cel din mijloc, profesorul îşi poate
da seama dacă elevul este în prima sau în cea de-a doua jumătate a şirului. Şirul este ordonat
crescător, iar dacă elevul din mijloc este mai mic decât cel căutat, este sigur că elevul căutat nu se
găseşte în prima jumătate a şirului. Dacă elevul din mijloc este mai mare decât cel căutat, este de
asemenea sigur că elevul căutat nu se găseşte în cea de-a doua jumătate. În cele ce urmează, profesorul
trebuie să continue căutarea doar în grupul format din jumătate dintre elevi, grup care la rândul lui este
un şir ordonat.
Acest subşir va fi împărţit în două (la fel ca şirul iniţial) şi eventual (dacă elevul căutat nu este cel
din mijlocul subşirului) se continuă căutarea în jumătatea corespunzătoare a subşirului. Această metodă
se repetă până când este găsit elevul cu înălţimea potrivită sau în cazul în care nu există un astfel de elev
până când lungimea subşirului este egală cu 1. În acest caz răspunsul la problema profesorului este: „Nu
se află în şir nici un elev cu înălţimea potrivită”.
58
Metodica predării tehnicilor de programare pentru grupele de performanţă
Această strategie aplică algoritmul de căutare binară. Algoritmul constă în căutarea unei valori val
într-un şir ordonat de elemente. Astfel, dacă trebuie găsită valoarea val în şirul x1, x2, …, xn, se
testează dacă val este egal cu xm, unde m = [(n + 1)/2].
Dacă cele două valori sunt egale, căutarea se opreşte cu succes.
Dacă cele două valori nu sunt egale, nu înseamnă că nu vom găsi în viitor valoarea val. S-ar putea
ca valoarea căutată să se găsească într-unul dintre cele două subşiruri obţinute: în subşirul x1, …,xm-1
în situaţia în care xm > val sau în subşirul xm+1, …, xn, în situaţia în care xm < val.
Împărţirea şirului în două subşiruri arată că problema face parte din categoria celor rezolvate cu
ajutorul metodei Divide et Impera, deoarece împărţirea unui astfel de subşir se poate realiza independent
de împărţirea celorlalte subşiruri. În concluzie, problema se împarte în subprobleme independente.
Metoda de rezolvare Divide et Impera în majoritatea cazurilor conduce la algoritmi având complexitate
logaritmică.
Problemele care se rezolvă folosind această metodă presupun posibilitatea de a le împărţi în
subprobleme distincte care se pot rezolva mai uşor şi soluţiile acestor subprobleme se combină pentru a
obţine rezultatul final al problemei de rezolvat.
În cazul căutării binare împărţirea problemei în subprobleme se realizează prin determinarea celor
două subşiruri. Astfel, dacă se caută o valoare în şirul (xst, …, xdr), împărţirea problemei constă în
stabilirea subşirurilor (xst, …, xm-1) şi (xm+1, …, xdr), unde m = [(st + dr) / 2].
Subalgoritm CăutareBinară(st,dr,h):
mij (st + dr) div 2 { stabilirea mijlocului subşirului curent }
dacă h = x[mij] atunci
scrie DA, mij
altfel
dacă h < x[mij] atunci
CăutareBinară(st,mij-1,h)
altfel
CăutareBinară(mij+1,dr,h)
sfârşit
Un arbore cartezian al unui vector este un arbore binar definit recursiv astfel:
rădăcina arborelui este elementul cel mai mic din vector;
subarborele stâng este arborele cartezian al sub-vectorului stâng (faţă de poziţia
elementului din rădăcină);
subarborele drept este arborele cartezian al sub-vectorului drept.
Exemplu: Pentru vectorul
i 1 2 3 4 5 6 7 8 9
59
Metodica predării tehnicilor de programare pentru grupele de performanţă
V[i] 9 8 23 10 16 3 12 4 7
Se pune în rădăcină elementul cel mai mic din vector, anume 3. Subarborele stâng este la rândul lui
un arbore cartezian al sub-vectorului V[1..5], iar cel drept al lui V[7..9]. Ca rădăcină a subarborelui
stâng (adică fiu stânga al rădăcinii), alegem elementul minim din V[1..5], adică V[2]=8. Procedeul
continuă recursiv pentru restul vectorului. Iată arborele rezultat:
Soluţie:
Pentru construirea arborelui folosim o procedură recursivă divide(i,j,Tata). Tata este nodul
al cărui subarbore este arborele cartezian al lui V[i..j]. Se determină Min, indicele elementului minim
din V[i..j], şi se apelează recursiv procedura pentru V[i..Min-1] şi V[Min+1..j].
Exemplu: n=9 V=(9,8,23,10,16,3,12,4,7)
Iniţial procedura se apelează cu i=1 şi j=n=9. Minimul este găsit pe poziţia Min=6. Se apelează
recursiv pentru V[i..Min-1], adică V[1..5], şi pentru V[Min+1..j], adică V[7..9], cu parametrul
Tata=Min=6.
Analizăm doar primul apel. i=1, j=5, Tata=6. Se găseşte Min=2. Se afişează muchia
(V[Tata],V[Min]), adică muchia (3,8). Apelăm recursiv pentru V[1..1] şi V[3..5].
program Arbore_cartezian;
var V :array [1..100] of integer;
n :integer;
M :array [1..101,1..2] of integer;
procedure Citire;
var i:integer;
f:text;
begin
assign(f,’arbore.in’); reset(f);
readln(f,n);
for i:=1 to n do
read(f,V[i])
close(f);
end;
60
Metodica predării tehnicilor de programare pentru grupele de performanţă
for k:=i+1 to j do
if V[k]0 then writeln(V[Min],' ',V[Tata]);
Divide(i,Min-1,Min);
Divide(Min+1,j,Min);
end;
end;
Begin
Citire;
writeln('Muchiile arborelui sunt:');
Divide(1,n,0);
End.
Se dă o tablă de dimensiuni 2nx2n. Pe această tablă există o gaură la poziţia (Lg,Cg). Pentru
acoperirea acestei table avem la dispoziţie piese de forma:
Aceste piese pot fi rotite cu 90, 180 sau 270° . Se cere să se afişeze o acoperire completă a tablei
(cu excepţia găurii). Pe fiecare linie se vor afişa 6 valori separate prin spaţii: l1 c1 l2 c2 l3 c3,
reprezentând coordonatele pătratelor din care este formată fiecare piesă aşezată pe tablă.
Soluţie:
Procedura recursivă Acopera primeşte ca parametrii:
bucată de tablă prin (L1,C1) – coordonatele pătratului din colţul stânga-sus de pe tablă, şi
(L2,C2) coordonatele pătratului din colţul dreapta-jos.
coordonatele găurii de pe această bucată de tablă, (Lg,Cg).
Urmând strategia generală Divide et Impera, la fiecare nivel descompunem problema curentă în 4
subprobleme, după care apelăm procedura recursivă pentru fiecare din ele. Împărţim tabla în 4 bucăţi
egale. Una dintre aceste 4 bucăţi are deja o gaură în ea. În celelalte trei bucăţi facem câte o gaură prin
aşezarea unei piese la îmbinarea bucăţilor, ca în figură.
Dacă se ajunge la o bucată 2x2 se opreşte apelarea recursivă; se aşează o piesă pe cele 3 pătrate
libere (un pătrat fiind gaură) şi se revine din apel.
Exemplu:
N=3 Lg=3 Cg=6
61
Metodica predării tehnicilor de programare pentru grupele de performanţă
În sfertul 3 avem deja gaura iniţială. Pentru a face o gaură şi în celelalte trei sferturi aşezăm o piesă
la îmbinarea lor, ca mai jos:
Afişăm coordonatele piesei pe care am aşezat-o şi apelăm recursiv pentru cele 4 subprobleme:
program piese;
var Lg,Cg,n,i :integer;
L :longint;
procedure Citire;
var f:text;
begin
assign(f,’’piese.in);reset(f);
readln(f,n);
readln(f,Lg,Cg);
close(f);
end;
procedure Acopera(L1,C1,L2,C2:longint;Lg,Cg:integer);
var Ml,Mc:longint;
begin
Ml:=(L1+L2) div 2;
Mc:=(C1+C2) div 2;
if (Lg>Ml) and (Cg>Mc) then
begin
writeln(Ml+1,' ',Mc,' ',Ml,' ',Mc,' ',Ml,' ',Mc+1);
if L2-L1>1 then
begin
Acopera(L1,C1,Ml,Mc,Ml,Mc);
Acopera(L1,Mc+1,Ml,C2,Ml,Mc+1);
Acopera(Ml+1,C1,L2,Mc,Ml+1,Mc);
Acopera(Ml+1,Mc+1,L2,C2,Lg,Cg)
end;
end
else if (Lg>Ml) and (Cg<=Mc) then
begin
writeln(Ml,' ',Mc,' ',Ml,' ',Mc+1,' ',Ml+1,' ',Mc+1);
if L2-L1>1 then
begin
Acopera(L1,C1,Ml,Mc,Ml,Mc);
Acopera(L1,Mc+1,Ml,C2,Ml,Mc+1);
Acopera(Ml+1,C1,L2,Mc,Lg,Cg);
62
Metodica predării tehnicilor de programare pentru grupele de performanţă
Acopera(Ml+1,Mc+1,L2,C2,Ml+1,Mc+1)
end
end
else if (Lg<=Ml) and (Cg>Mc) then
begin
writeln(Ml,' ',Mc,' ',Ml+1,' ',Mc,' ',Ml+1,' ',Mc+1);
if L2-L1>1 then
begin
Acopera(L1,C1,Ml,Mc,Ml,Mc);
Acopera(L1,Mc+1,Ml,C2,Lg,Cg);
Acopera(Ml+1,C1,L2,Mc,Ml+1,Mc);
Acopera(Ml+1,Mc+1,L2,C2,Ml+1,Mc+1)
end
end
else
begin
writeln(Ml+1,' ',Mc,' ',Ml+1,' ',Mc+1,' ',Ml,' ',Mc+1);
if L2-L1>1 then
begin
Acopera(L1,C1,Ml,Mc,Lg,Cg);
Acopera(L1,Mc+1,Ml,C2,Ml,Mc+1);
Acopera(Ml+1,C1,L2,Mc,Ml+1,Mc);
Acopera(Ml+1,Mc+1,L2,C2,Ml+1,Mc+1)
end
end;
end;
Begin
Citire;
L:=1;
for i:=1 to n do
L:=L*2;
Acopera(1,1,L,L,Lg,Cg);
End.
Două oraşe, Westmouth şi Eastmouth, sunt situate pe malul vestic, respectiv malul estic al râului
Highwater. Westmouth se află la sud de Eastmouth. Malurile râului sunt linii poligonale astfel încât o linie
orientată de la est la vest intersectează fiecare mal în exact un punct.
Căpitanul Hook navighează des între cele două oraşele. Din dorinţa de a minimiza cheltuielile pentru
combustibil, el ar vrea să afle cea mai scurtă rută de la Westmouth la Eastmouth.
Date de intrare
Fişierul de intrare INPUT.TXT conţine pe prima linie două numere întregi M şi N (2≤M, N≤2000)
reprezentând numărul colţurilor de pe malul vestic, respectiv estic.
Pe următoarele M linii se află câte două numere întregi X şi Y (0≤X, Y≤3600). Aceste numere
reprezintă coordonatele colţurilor de pe malul vestic începând de la Westmouth la un punct care se află
pe aceeaşi latitudine (adică având aceeaşi coordonată Y) cu Eastmouth.
Următoarele N linii conţin câte două numere întregi X şi Y (0≤X, Y≤3600) care reprezintă
coordonatele colţurilor de pe malul estic începând cu un punct aflat la aceeaşi latitudine geografică (adică
având aceeaşi coordonată Y) ca Westmouth, către Eastmouth.
63
Metodica predării tehnicilor de programare pentru grupele de performanţă
Date de ieşire
Fişierul de ieşire OUTPUT.TXT conţine linii în care sunt scrise câte două numere întregi X şi Y,
separate printr-un spaţiu, reprezentând coordonatele colţurilor rutei între Westmouth şi Eastmouth. (Este
evident că prima linie trebuie să conţină coordonatele orăşelului Westmouth, iar ultima linie conţine
coordonatele orăşelului Eastmouth.)
Exemplu
INPUT.TXT
3 3 0 0
0 0 50 50
50 50 50 100
0 150 100 150
OUTPUT.TXT
100 0
50 100
100 150
Soluţie: [13]
Se verifică dacă traseul direct între punctul de plecare şi cel de sosire este împiedicat de vreun colţ
al unui mal. Dacă nu, atunci drumul este, evident, segmentul determinat de cele două puncte. Altfel, se
selectează un colţ O (despre care se ştie cu siguranţă că aparţine traseului final) şi se determină drumul
în două etape: de la punctul de plecare la O şi de la O la punctul de sosire.
Tipurile de obstacole care pot apărea sunt:
a) colţuri ale malului vestic care se află în dreapta traseului direct;
b) colţuri ale malului estic care se află în stânga traseului direct.
Selectăm "cel mai din dreapta" obstacol de tip (a) şi "cel mai din stânga" obstacol de tip (b).
(Atenţie! Aceste exprimări nu se referă la abscisele punctelor de pe maluri, ci la unghiurile pe care le
formează cu abscisa semidreptele determinate de punctul de plecare şi aceste puncte). Obstacolul O
căutat este cel cu ordonata mai mică dintre cele două selectate.
Complexitatea algoritmului descris este O((M+N)2).
const ni='input.txt';
no='output.txt';
mare=1000000.0;
type punct=record
x,y:Longint;
mal:Byte
end;
list=array[1..4000] of Integer;
listp=array[1..4000] of punct;
var p:listp; q:^listp;
t:list;
i,j,k,l,m,n,e,f:Longint;
tg,u,ctg,st,dr,ust,udr:Real;
procedure citeste;
begin
Assign(input,ni); Reset(input);
Readln(m,n);
for i:=1 to m do
64
Metodica predării tehnicilor de programare pentru grupele de performanţă
65
Metodica predării tehnicilor de programare pentru grupele de performanţă
end;
if f=0 then udr:=0
else
if dr=0 then udr:=Pi/2
else begin
udr:=Arctan(1/dr);
if udr<0 then udr:=udr+Pi;
end;
if (ust>=u) and (udr<=u) then t[k]:=l
else
if ust>=u then
begin gaseste(k,f); gaseste(f,l) end
else
if udr<=u then begin
gaseste(k,e);
gaseste(e,l)
end
else
if e<f then begin
gaseste(k,e);
gaseste(e,l)
end
else begin
gaseste(k,f);
gaseste(f,l)
end
end;
procedure rezolva;
begin
for i:=1 to m+n do t[i]:=i;
quicksort(t,1,m+n);
if t[2]=1 then begin
t[2]:=t[1];
t[1]:=1
end;
if t[m+n]<>m+n-1 then begin
t[m+n-1]:=t[m+n];
t[m+n]:=m+n
end;
New(q);
for i:=1 to m+n do q^[i]:=p[t[i]];
p:=q^; Dispose(q);
gaseste(1,m+n);
t[m+n]:=0;
end;
procedure scrie;
begin
Assign(output,no); Rewrite(output);
i:=1;
while i>0 do
begin
Writeln(p[i].x,' ',p[i].y); i:=t[i]
end
end;
Begin
citeste;
rezolva;
scrie
End.
66
Metodica predării tehnicilor de programare pentru grupele de performanţă
PROGRAMARE DINAMICĂ
DESCRIERE METODĂ
Substructură optimală
Problema dată poate fi descompusă în subprobleme şi soluţia optimă a problemei depinde de
soluţiile optime ale subproblemelor sale.
Acest criteriu nu indică neapărat o soluţie prin programare dinamică, ar putea fi şi un indiciu că se
poate aplica metoda Greedy sau metoda „Divide et Impera”.
Subprobleme superpozabile
Subproblemele problemei date nu sunt independente, ci se suprapun.
Datorită faptului că subproblemele problemei date se suprapun, deducem că o abordare prin
metoda „Divide et Impera” ar fi dezastruoasă din punctul de vedere al timpului de execuţie (datorită
faptului că problemele se suprapun se ajunge la rezolvarea repetată a aceleiaşi subprobleme). Prin
urmare, vom rezolva subproblemele o singură, dată, reţinând rezultatele într-o structură de date
suplimentară (de obicei un tablou).
Rezolvarea unei probleme prin programare dinamică presupune următorii paşi:
Se identifică subproblemele problemei date.
Se alege o structură de date suplimentară, capabilă să reţină soluţiile subproblemelor.
Se caracterizează substructura optimală a problemei printr-o relaţie de recurenţă.
67
Metodica predării tehnicilor de programare pentru grupele de performanţă
5 5
4
4
1 2 1 2
Un PD-arbore nu este neapărat un arbore, dar:
poate fi pus pe niveluri: fiecare vârf x va fi pus pe nivelul egal cu lungimea celui mai lung
drum de la x la z;
poate fi parcurs (cu mici modificări) în postordine;
Prin parcurgerea în postordine, vârfurile apar sortate topologic.
Algoritmul de parcurgere în postordine foloseşte un vector parcurs pentru a ţine evidenţa
vârfurilor vizitate. Este iniţializat vectorul parcurs şi se începe parcurgerea prin apelul postord(z):
procedure postord(x)
Pentru toţi jAx cu parcurs(j)=false Execută
postord(j)
calculează v(x) conform funcţiei fx;
parcurs(x)true
end
68
Metodica predării tehnicilor de programare pentru grupele de performanţă
Bellman a enunţat un principiu numit principiul optimalităţii: « O strategie are proprietatea că
oricare ar fi starea iniţială şi decizia iniţială, deciziile rămase trebuie să constituie o strategie optimală
privitoare la starea care rezultă din decizia anterioară »
Demonstrarea corectitudinii algoritmului de rezolvare a unei probleme, a cărei rezolvare se obţine
folosind metoda programării dinamice, se face, de obicei, prin inducţie matematică.
Metoda programării dinamice se poate aplica cu următoarele abordării:
Metoda înainte – pentru rezolvare se plecă de la starea finală
Metoda înapoi – pentru rezolvare se plecă de la starea iniţială
Metoda mixtă – o combinaţie a primelor două [12]
Implementări sugerate
În scopul formării deprinderilor de a rezolva probleme în care se utilizează metoda programării
dinamice se pot realiza implementarea următorilor algoritmi pentru:
Sumă maximă în triunghi
Problema tirului
Determinarea subşirului crescător de lungime maximă
Subşir comun maximal
Se consideră un triunghi cu numere aşezate ca în figura alăturată. Dintr-o poziţie putem coborî pe
una din cele două aflate sub aceasta (pe diagonală în stânga sau în dreapta). Poziţia iniţială este cea din
vârf. Costul unui drum din vârf până la o poziţie din triunghi este suma valorilor de pe poziţiile prin care
trece drumul. Să se afle drumul de cost maxim care pleacă din vârf şi se încheie pe ultimul rând al
triunghiului (baza sa).
Datele de intrare vor fi citite din fişierul triunghi.in. Pe prima linie a fişierului se află valoarea N
(1N100), care reprezintă numărul de rânduri ale triunghiului (5 în exemplul de mai sus). Pe
următoarele N linii ale fişierului se află numerele din triunghi.
În fişierul triunghi.out, pe o singură linie, se va scrie costul maxim care poate fi obţinut în
condiţiile date în enunţ.
Exemplu:
triunghi.in triunghi.out
5 30
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Soluţie:
Vom reţine triunghiul într-o matrice pătratică T, de ordin n, sub diagonala principală. Subproblemele
problemei date constau în determinarea sumei maxime care se poate obţine din numere aflate pe un
69
Metodica predării tehnicilor de programare pentru grupele de performanţă
drum între numărul T[i,j], până la un număr de pe ultima linie, fiecare număr din acest drum fiind
situat sub precedentul, la stânga sau la dreapta sa. Evident, subproblemele nu sunt independente: pentru
a calcula suma maximă a numerelor de pe un drum de la T[i,j] la ultima linie, trebuie să calculăm
suma maximă a numerelor de pe un drum de la T[i+1,j] la ultima linie şi suma maximă a numerelor
de pe un drum de la T[i+1,j+1] la ultima linie.
Pentru a reţine soluţiile subproblemelor, vom utiliza o matrice suplimentară S, pătratică de ordin n,
cu semnificaţia
S[i,j]= suma maximă ce se poate obţine pe un drum de la T[i,j] la un element de pe ultima
linie, respectând condiţiile problemei.
Evident, soluţia problemei va fi S[1,1].
Relaţia de recurenţă care caracterizează substructura optimală a problemei este:
S[n,i]=T[n,i], i{1,2,...,n}
S[i,j]=T[i,j]+max{S[i+1,j], S[i+1,j+1]}
Rezolvăm relaţia de recurenţă în mod bottom-up.
Complexitatea algoritmului descris este O(n2).
Program triunghi;
Type mat=Array[1..100,1..100] of integer;
var
S,T:mat;
n,i,j:integer;
f:text;
Procedure citire;
begin
Assign(f,'triunghi.in'); Reset(f);
Readln(f,n);
For i:=1 To n Do
For j:=1 To i Do
Read(f,T[i,j]);
Close(f);
end;
Begin
citire;
{initia;izari}
For i:=1 To n Do
S[n,i]:=T[n,i];
For i:=n-1 Downto 1 Do
For j:=1 To i Do
begin
S[i,j]:=T[i,j]+S[i+1,j];
If S[i+1,j]<S[i+1,j+1] Then
S[i,j]:=T[i,j]+S[i+1,j+1];
end;
Assign(f,'triunghi.out');
Rewrite(f);
Writeln(f,S[1,1]);
Close(f);
End.
70
Metodica predării tehnicilor de programare pentru grupele de performanţă
Fie X=(x1, x2, ..., xn) şi Y=(y1, y2, ..., ym) două şiruri de n, respectiv m numere întregi.
Determinaţi un subşir comun de lungime maximă. [5]
Exemplu
Pentru X=(2,5,5,6,2,8,4,0,1,3,5,8) şi Y=(6,2,5,6,5,5,4,3,5,8) o soluţie posibilă
este: Z=(2,5,5,4,3,5,8).
Soluţie:
Notăm cu Xk=(x1, x2, ..., xk) (prefixul lui X de lungime k) şi cu Yh=(y1, y2, ..., yh) prefixul lui
Y de lungime h. O subproblemă a problemei date constă în determinarea celui mai lung subşir comun al
lui Xk, Yh. Notăm cu LCS(Xk,Yh) lungimea celui mai lung subşir comun al lui Xk, Yh. Utilizând aceste
notaţii, problema cere determinarea LCS(Xn,Ym), precum şi un astfel de subşir.
Observaţie
Dacă Xk=Yh atunci LCS(Xk,Yh)=1+LCS(Xk-1,Yh-1).
Dacă XkYh atunci LCS(Xk,Yh)=max(LCS(Xk-1,Yh), LCS(Xk,Yh-1)).
Din observaţia precedentă deducem că subproblemele problemei date nu sunt independente şi că
problema are substructură optimală.
Pentru a reţine soluţiile subproblemelor vom utiliza o matrice cu n+1 linii şi m+1 coloane, denumită
lcs. Linia şi coloana 0 sunt utilizate pentru iniţializare cu 0, iar elementul lcs[k,h] va fi lungimea celui
mai lung subşir comun al şirurilor Xk şi Yh.
Vom caracteriza substructura optimală a problemei prin următoarea relaţie de recurenţă:
lcs[k,0]=lcs[0,h]=0, k{1,2,..,n}, h{1,2,..,m}
lcs[k,h]=1+lcs[k-1,h-1], dacă x[k]=y[h]
max{lcs[k,h-1], lcs[k-1,h]}, dacă x[k]y[h]
Rezolvăm relaţia de recurenţă în mod bottom-up.
Deoarece nu am utilizat o structură de date suplimentară cu ajutorul căreia să memorăm soluţia
optimă, vom reconstitui soluţia optimă pe baza rezultatelor memorate în matricea lcs. Prin reconstituire
vom obţine soluţia în ordine inversă, din acest motiv vom memora soluţia într-un vector, pe care îl vom
afişa de la sfârşit către început:
Complexitatea algoritmului descris este O(n2).
Program L_C_S;
var
f:text;
k,n,m,i,j:byte;
lcs:Array[0..100,0..100] of word;
x,y,z:Array[1..100] of integer;
Procedure citire;
begin
assign(f,'date.in'); reset(f);
readln(f,m);
for i:=1 to m do
read(f,x[i]);
readln(f,n);
for i:=1 to n do
71
Metodica predării tehnicilor de programare pentru grupele de performanţă
read(f,y[i]);
close(f);
end;
Begin
Citire;
{bordam matricea}
for i:=1 to m do
lcs[i,0]:=0;
for i:=1 to n do
lcs[0,i]:=0;
for i:=1 to m do
for j:=1 to n do
if x[i]=y[j] then lcs[i,j]:=lcs[i-1,j-1]+1
else
if lcs[i-1,j]>lcs[i,j-1] then lcs[i,j]:=lcs[i-1,j]
else lcs[i,j]:=lcs[i,j-1];
assign(f,'date.out');
rewrite(f);
writeln(f,lcs[m,n]);
{ reconsituirea subsirului, plecam de la lcs[m,n] }
k:=0; i:=m;j:=n;
while (i>0) And (j>0) do
begin
if (a[i]=b[j]) then begin
k:=k+1;
c[k]:=a[i];
i:=i-1;
j:=j-1;
end
else
if lcs[i,j]=lcs[i-1,j] then i:=i-1
else j:=j-1;
end;
for i:=k downto 1 do
write(f,c[i],' ');
close(f)
End.
Fie un şir A=(a1, a2, ..., an). Numim subşir al şirului A o succesiune de elemente din A, în
ordinea în care acestea apar în A: ai1, ai2, ..., aik, unde 1<= i1<i2<...<ik<= n.
Determinaţi un subşir crescător al şirului A, de lungime maximă. [5]
Exemplu
Pentru A=(8,3,6,50,10,8,100,30,60,40,80) o soluţie poate fi: (3,6,10,30,60,80).
Soluţie:
Fie Ai1=(ai1ai2 ...aik) cel mai lung subşir crescător al lui şirului A. Observăm că el coincide cu cel
mai lung subşir crescător al şirului (ai1, ai1+1, ..., an). Evident Ai2=(ai2ai3 ...aik) este cel mai lung
subşir crescător al lui (ai2, ai2+1, ..., an), etc. Prin urmare, o subproblemă a problemei iniţiale constă în
determinarea celui mai lung subşir crescător care începe cu ai,i{1,.., n}. Subproblemele nu sunt
independente: pentru a determina cel mai lung subşir crescător care începe cu ai, este necesar să
determinăm cele mai lungi subşiruri crescătoare care încep cu aj, aiaj, j{i+1,.., n}.
72
Metodica predării tehnicilor de programare pentru grupele de performanţă
Pentru a reţine soluţiile subproblemelor vom considera doi vectori suplimentari l şi poz, fiecare cu
câte n componente, având semnificaţia:
l[i]=lungimea celui mai lung subşir crescător care începe cu a[i];
poz[i]=poziţia elementului care urmează după a[i] în cel mai lung subşir crescător care
începe cu a[i], dacă un astfel de element există, sau -1 dacă un astfel de element nu
există.
Relaţia de recurenţă care caracterizează substructura optimală a problemei este:
l[n]=1; poz[n]=-1;
l[i]=max{1+l[j]|a[i]a[j]}, j=i+1,n
poz[i]= indicele j pentru care se obţine maximul l[i].
Rezolvăm relaţia de recurenţă în mod bottom-up.
Pentru a determina soluţia optimă a problemei, determinăm maximul din vectorul l, apoi afişăm
soluţia, începând cu poziţia maximului şi utilizând informaţiile memorate în vectorul poz.
Complexitatea algoritmului descris este O(n(n+1)/2).
Program subsir;
var
i,j,n,max,p:integer;
f:text;
poz,a,l:array[1..1000] of integer;
Procedure citire;
begin
assign(f,'sir.in'); reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
bnd;
Begin
Citire;
l[n]:=1; poz[n]:=-1;
for i:=n-1 downto 1 do
begin
l[i]:=1; poz[i]:=-1;
for j:=i+1 to n do
if (a[i]<=a[j]) And (l[i]<1+l[j]) then
begin
l[i]:=1+l[j];
poz[i]:=j;
end;
end;
{afisare solutie}
max:=l[1];p:=1;
for i:=2 to n do
if max<l[i] then begin
max:=l[i];
p:=i;
end;
assign(f,'sir.out');
rewrite(f);
writeln({Lungimea maxima}f,max);
i:=p;
while i<>-1 do
begin
73
Metodica predării tehnicilor de programare pentru grupele de performanţă
write(f,a[i],' ');
i:=poz[i];
end;
close(f);
End.
PROBLEME DE CONCURS
La un concurs de tir, ţinta este alcătuită din n cercuri concentrice, numerotate din exterior către
interior de la 1 la n. Cercurile delimitează pe ţintă n zone circulare (o zonă între cercul 1 şi cercul 2, a
doua zonă între cercul 2 şi cercul 3, ş.a.m.d, o zonă între cercul n-1 şi cercul n şi a n-a zonă interiorul
cercului n).
Fiecare zonă are ataşată o valoare strict pozitivă, reprezentând numărul de puncte pe care le poate
primi un concurent în cazul în care va lovi această zonă.
Cerinţă
1
Acest algoritm împreună cu o demonstraţie a corectitudinii sunt explicate în cartea lui Cătălin Frâncu -
"Psihologia concursurilor de informatică"[11], capitolul "Probleme de concurs", problema 13
74
Metodica predării tehnicilor de programare pentru grupele de performanţă
Soluţie:
Valorile sectoarelor le vom reţine într-un vector v, vector anterior ordonat crescător.
Trebuie să găsim o modalitate de a-l scrie pe k sub forma unei sume având număr minim de
termeni din şirul v.
Notăm cu c[i] numărul minim de elemente din şirul v[i], având suma i. Soluţia problemei
o vom obţine în c[k].
Relaţia de recurenţă:
75
Metodica predării tehnicilor de programare pentru grupele de performanţă
C[0]=0
C[i]=1 + min{c[j] cu i=j+v[k], k=1,2,…,n}
Pentru a nu lucra cu numere negative vom pleca cu c[0]=1. Dacă c[i]=0, atunci se consideră că
i este nemarcat.
Numerele c[i] se calculează astfel:
La pasul 0 se marchează c[0]=1
Pentru fiecare dintre cele n sectoare căutăm în vectorul c valorile care au fost deja ‚atinse’ şi
pornind de la acestea adăugăm punctajul sectorului curent.
Dacă valoarea rezultată a fost obţinută printr-un număr mai mic de „trageri”, modificăm
vectorul c, iar în vectorul d reţinem valoarea anterioara (de la care am ajuns în poziţia
curentă).
Program tir;
var
f:text;
v:array[1..50] of integer;
c,d:array[0..50] of integer;
i,n,k:longint;
Procedure citire;
var
i:longint;
begin
assign(f,'tir.in'); reset(f);
i:=0;
while not seekeoln(f) do
begin
inc(i);
read(f,v[i]);
end;
n:=i;
readln(f);
read(f,k);
end;
Procedure calcul;
var i,j:integer;
begin
c[0]:=1;
for j:=1 to n do
for i:=0 to k-v[j] do
if c[i]>0 then
if (c[i+v[j]]=0) or (c[i+v[j]]>c[i]+1) then
begin
c[i+v[j]]:=c[i]+1;
d[i+v[j]]:=i;
end;
end;
procedure reconstituie(k:longint);
begin
if k<>0 then
begin
reconstituie(d[k]);
writeln(f,k-d[k]);
end;
end;
Begin
76
Metodica predării tehnicilor de programare pentru grupele de performanţă
citire;
calcul;
assign(f,'tir.out');
rewrite(f);
if k=0 then write(f,0)
else
begin
writeln(f,'nr. min. de operatii : ',c[k]-1);
reconstituie(k);
end;
close(f);
End.
Soluţie: [5]
Problema cere să determinăm numărul minim de palindroame în care poate fi împărţit şirul s de
lungime Lg. Să notăm cu si prefixul şirului s ce se termină pe poziţia i (1≤i≤Lg), deci şirul format din
caracterele s1, s2, …, si. O subproblemă a problemei date constă în determinarea numărului minim
de palindromuri în care poate fi împărţit şirul si.
Pentru reţinerea soluţiilor subproblemelor vom folosi un vector nrp cu Lg componente, unde
nrp[i] reprezintă numărul minim de palindromuri din descompunere şirului si.
Relaţia de recurenţă:
nrp[i]=1, dacă şirul este si palindrom
nrp[i]=1 + min(nrp[j], 0≤j<i, şi sj,sj+1,…,si este palindrom), dacă si nu este
palindrom
Rezolvăm relaţia de recurenţă în mod bottom-up.
77
Metodica predării tehnicilor de programare pentru grupele de performanţă
Pentru implementare este necesară o funcţie care să testeze dacă o subsecvenţă a şirului dat este
sau nu palindrom.
Program palindroam;
const
fi='pal.in';
fo='pal.out';
var
s:string;
Lg,rez:integer;
f:text;
procedure citire;
begin
assign(f,fi); reset(f);
readln(f,s);
Lg:=length(s);
close(f);
end;
function palindrom (i,j:byte):boolean;
begin
while (i<=j) and (s[i]=s[j]) do
begin
i:=i+1; j:=j-1;
end;
palindrom:=i>j;
end;
procedure dinamica;
var
i,j,nrmin:integer;
nrp:array[1..102] of integer;
begin
fillchar(nrp,sizeof(nrp),0);
for i:=1 to Lg do
if (palindrom(1,i)) then nrp[i]:= 1
else begin
nrmin:=MaxInt;
for j:=1 to i-1 do
if palindrom(j+1, i) And (nrp[j] < nrmin) then
nrmin:=nrp[j];
nrp[i]:=nrmin+1;
end;
rez:=nrp[Lg];
end;
procedure scrie;
begin
assign(f,fo);rewrite(f);
writeln(f,rez);
close(f);
end;
Begin
citire;
dinamica;
scrie;
End.
78
Metodica predării tehnicilor de programare pentru grupele de performanţă
că putem trece de la o celulă la oricare alta aflată pe aceeaşi linie, iar un pas înseamnă că putem trece de
la o celulă la celula aflată imediat sub ea. Excepţie face ultima deplasare (cea în care ne aflăm pe ultima
linie), când vom face doar un salt pentru a ajunge în colţul dreapta-jos, dar nu vom mai face şi pasul
corespunzător. Astfel traversarea va consta din vizitarea a 2m celule.
Cerinţă
Scrieţi un program care să determine suma minimă care se poate obţine pentru o astfel de
traversare.
Date de intrare
Fişierul de intrare lacusta.in conţine pe prima linie două numere naturale separate printr-un
spaţiu m n, reprezentând numărul de linii şi respectiv numărul de coloane ale matricei. Pe următoarele m
linii este descrisă matricea, câte n numere pe fiecare linie, separate prin câte un spaţiu.
Date de ieşire
Fişierul de ieşire lacusta.out va conţine o singură linie pe care va fi scrisă suma minimă găsită.
Restricţii
1 m, n 100
Valorile elementelor matricei sunt numere întregi din intervalul [1, 255]
Exemplu
lacusta.in lacusta.out Explicaţie
4 5 28 Drumul este:
3 4 5 7 9 (1,1)->(1,3)->
6 6 3 4 4 (2,3)->(2,2)->
6 3 3 9 6 (3,2)->(3,3)->
6 5 3 8 2 (4,3)->(4,5)
Soluţie: [24]
Problema cere determinarea sumei minime ce se poate obţine din colţul din stânga-sus (A[0][0])
până în colţul din dreapta-jos (A[m-1][n-1]), traversând matricea în condiţiile specificate.
O subproblemă a problemei date constă în determinarea sumei minime, care se poate obţine
pornind din colţul stânga-sus până la fiecare element A[i][j] al matricei.
Pentru a reţine soluţiile subproblemelor vom folosi o matrice B, cu m linii şi n coloane, cu
semnificaţia că B[i][j] reprezintă suma minimă care se poate obţine din colţul stânga-sus până la
elementul A[i][j].
Relaţia de recurenţă:
B[0][0]=A[0][0]
B[0][i]=∞ , nu putem ajunge la elementul A[0][i] făcând un salt şi un pas
B[1][0]=∞ , nu putem ajunge la elementul A[1][0] făcând un salt şi un pas
B[1][j]=A[0][0]+A[0][j]+A[1][j], 0<j<n, facem un salt până la elementul
A[0][j], apoi un pas până la A[1][j].
79
Metodica predării tehnicilor de programare pentru grupele de performanţă
int main()
{
FILE *fi,*fo;
unsigned int a[M][M],b[M][M],m,n,i,j,min1,min2,jmin;
fi=fopen("lacusta.in", "rt");
fscanf(fi,"%u %u", &m, &n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
fscanf(fi,"%u",&a[i][j]);
fclose(fi);
b[1][0]=32000;
for(i=1; i<n; i++)
b[1][i]=a[0][0]+a[0][i]+a[1][i];
for(i=1; i<m-1; i++)
{
if(b[i][0]<=b[i][1])
{
min1=b[i][0];
min2=b[i][1];
jmin=0;
}
else
{
min1=b[i][1];
min2=b[i][0];
jmin=1;
}
for(j=2; j<n; j++)
if(b[i][j]<min1)
{
min2=min1;
min1=b[i][j];
jmin=j;
}
else
if(b[i][j]<min2)
min2=b[i][j];
for(j=0; j<n; j++)
if(j!=jmin)
b[i+1][j]=min1+a[i][j]+a[i+1][j];
else
b[i+1][j]=a[i][j]+a[i+1][j]+min2;
}
min1=b[m-1][0];
for (j=1; j<n; j++)
if(b[m-1][j]<min1) min1=b[m-1][j];
fo=fopen("lacusta.out", "wt");
80
Metodica predării tehnicilor de programare pentru grupele de performanţă
fprintf(fo,"%u\n", min1+a[m-1][n-1]);
fclose(fo);
return 0;
}
CAPITOLUL III
METODICA PREDARII
INFORMATICII
PREDAREA INFORMATICII
Predarea informaticii diferă în conţinut şi stil faţa de predarea altor discipline. Metodica predării
informaticii se conturează abia acum. Toata lumea recunoaşte necesitatea ei, dar este nevoie de curaj şi
timp pentru a o dezvolta, respectiv însuşi. Curaj, deoarece un instrument folositor viitorilor profesori de
informatica nu poate fi realizat fără îndrăzneală necesară de a împărtăşi experienţa didactică proprie.
Timp, deoarece este important ca viitorul profesor să descopere propriile resurse ale imaginaţiei şi
creativităţii.
În predarea informaticii nu există şabloane sau reţete care sa fie obligatorii, în schimb este nevoie
de talent şi de dorinţa de a descoperi chemarea, vocaţia, pentru meseria de profesor. Aceasta chemare
trebuie conştientizată.
Viitorul profesor va trebui să descopere secretele modului în care trebuie educată viitoarea
generaţie care trebuie să dobândească o viziune cu totul nouă despre lume . Societatea super-
informatizată va solicita din partea membrilor săi nu doar cunoaşterea calculatorului şi a modului de
utilizare a acestuia, ci şi o atitudine curajoasă, flexibilă şi dinamică în faţa unor situaţii sau instrumente
informatice noi, necunoscute. Cultura informatică (Computer Literacy) va trebui să devină parte
integrantă din cultura generala a fiecărei persoane, fapt ce impune învăţarea elementelor ei de bază în
şcoală.
Toţi tinerii trebuie să-şi asigure un minim de cunoştinţe de tehnologia informaţiei, necesare utilizării
calculatoarelor în rezolvarea problemelor profesionale în diversele domenii ale vieţii economice. Indiferent
dacă vor absolvi sau nu o instituţie de învăţământ superior, vor avea extrem de mult de câştigat dacă vor
81
Metodica predării tehnicilor de programare pentru grupele de performanţă
avea cunoştinţe de informatică, reuşind astfel să corespundă cerinţelor pe care locurile de muncă ale
prezentului şi viitorului le vor ridica în faţa lor.
CE PREDĂM ?
Evident, este foarte important să predam adecvat sferei de interes şi categoriei de vârstă a elevilor,
astfel încât să nu pierdem din vedere faptul ca este mai bine mai puţin dar temeinic, decât mult şi
superficial.
82
Metodica predării tehnicilor de programare pentru grupele de performanţă
83
Metodica predării tehnicilor de programare pentru grupele de performanţă
CÂT PREDĂM ?
84
Metodica predării tehnicilor de programare pentru grupele de performanţă
Proiectarea conţinutului se realizează pornind de la câteva întrebări: „Ce se va preda? Câte valori
urmează să fie transmise şi asimilate? Cum sunt structurate aceste valori? Ce fel de
personalităţi vrem să formăm ?" şi se materializează în instrumentele cu care lucrează învăţământul:
plan cadru, programa şcolară, manual. Odată cu structurarea planului cadru se stabilesc:
Obiectele de învăţământ de-a lungul anilor de studiu, „într-o succesiune, ordine şi gradare,
avându-se în vedere complexitatea, dinamica şi specificitatea conţinutului, sarcinile de învăţare
pe care le solicită raportate la posibilităţile şi nivelul dezvoltării ontogenetice a elevilor din diferite
grade de şcolarizare"
Programa şcolară reprezintă un instrument al procesului instructiv-educativ la o disciplină de
învăţământ. Descrie condiţiile deziderabile pentru reuşita învăţării în termeni de obiective,
conţinuturi, activităţi de învăţare.
Programa şcolară descrie „oferta educaţională" la o disciplină pe o perioadă limitată de timp (un an
şcolar) şi oferă sugestii metodologice de abordare a conţinuturilor astfel încât să se atingă obiectivele
stabilite sau competenţele vizate. Noile programe şcolare sunt elaborate în concordanţă cu noile planuri -
cadru de învăţământ.
"Viziunea curriculară" de alcătuire a programelor şcolare permite o „bună orientare" a
predării/învăţării în raport cu „obiectivele de formare care vizează competenţele de nivel superior, de
aplicare a cunoştinţelor şi competenţelor în contexte noi şi de rezolvare de probleme teoretice şi
practice". [23]
Noile programe şcolare nu mai reprezintă o „înşiruire" de conţinuturi grupate în capitole şi lecţii, ci în
interiorul lor, conţinuturile sunt privite ca „vehicule de formare a competenţelor intelectuale şi relaţionale
de nivel superior, a atitudinilor şi comportamentelor necesare unui tânăr într-o societate democratică a
timpului nostru".
în structura programei pentru clasa a IX-a s-a pornit de la ideea că această clasă face parte din
ciclul curricular de observare şi orientare, în elaborarea programei s-au avut în vedere şi următoarele
aspecte:
Trecerea de la programe analitice centrale pe conţinuturi fixe la programe „centrate pe
obiective care urmăresc achiziţiile finale ale învăţării la elev";
Promovarea unor strategii didactice care „plasează elevul în centrul procesului didactic".
Deschiderea spre o „abordare multidisciplinară" care să permită realizarea unor legături între
discipline.
Ţinând cont că liceul trebuie să asigure o pregătire bazată pe achiziţii finale uşor evaluabile,
programele pentru aceste clase, au fost organizate într-o structură care să permită „centrarea pe
competenţe ce urmează a fi formate la elevi şi în acelaşi timp să asigure corelarea conţinuturilor învăţării
cu aceste competenţe".
Organizarea liceului pe filiere, profiluri, specializări a impus elaborarea unor programe şcolare,
pentru curriculum-ul nucleu, diferite pentru specializări diferite. Astfel pentru filiera teoretică, profilul
matematică a fost realizată o programă pentru disciplina Informatică, care vizează dezvoltarea
deprinderilor în elaborarea şi aplicarea unor algoritmi în rezolvarea unor probleme specifice.
85
Metodica predării tehnicilor de programare pentru grupele de performanţă
Pentru disciplinele Tehnologia Informaţiei şi Informatică, care se studiază pe trunchiul comun toate
filierele şi specializările, a fost realizată o programă şcolară care vizează, în primul rând, dezvoltarea
deprinderilor moderne de utilizator.
în sens larg, Curriculum defineşte sistemul de procese decizionale, manageriale şi de monitorizare
care preced, însoţesc şi urmează proiectarea, elaborarea, implementarea, evaluarea şi revizuirea
permanentă şi dinamică a setului de experienţe de învăţare oferite de şcoală.
În sens restrâns, Curriculum defineşte sistemul documentelor de tip reglator sau de altă natură, în
cadrul cărora se consemnează experienţele de învăţare recomandate prin şcoală, elevilor.
În România, Curriculum Naţional formal cuprinde: [23]
Cadrul curricular - Planul de învăţământ pentru clasele I - XII;
Programele şcolare elaborate conform tradiţiei româneşti, pe cicluri: primar, gimnazial,
liceal, care sunt aprobate anual, prin ordin al Ministerului Educaţiei şi Cercetării. Elaborarea
acestor documente se realizează în Comisiile Naţionale pentru fiecare disciplină cu profesori
reprezentanţi din ţară care exprimă puncte de vedere direct din interiorul sistemului, din
experienţa de la catedră.
Reglementări, ghiduri de implementare pentru şcoli, profesori, directori;
Manuale alternative pentru clasele I - XII;
Materiale - suport folosite la clasă: auxiliare, culegeri de probleme, texte suplimentare,
caiete de laborator
Noul Curriculum Naţional vizează toate componentele de bază ale procesului de învăţământ:
A. Principii privind curriculum-ul ca întreg :
Curriculum-ul trebuie să reflecte idealul educaţional al şcolii româneşti aşa cum este acesta
definit în Legea învăţământului
Curriculum-ul trebuie să respecte caracteristicile de vârstă ale elevului, corelate cu
principiile de psihologie a învăţării
Curriculum-ul trebuie să stimuleze dezvoltarea unei gândiri critice şi creative
Curriculum-ul trebuie să-i ajute pe elevi să-şi descopere disponibilităţile şi să le valorifice la
maximum în folosul lor şi al societăţii
B. Principii privind învăţarea:
Elevii învaţă în stiluri diferite şi în ritmuri diferite.
învăţarea presupune investigaţii continue, efort şi autodisciplină
învăţarea dezvoltă atitudini, capacităţi şi contribuie la însuşirea de cunoştinţe.
învăţarea trebuie să pornească de la aspecte relevante pentru dezvoltarea personală a
elevului şi pentru inserţia sa în viaţa socială.
învăţarea se produce prin studiu individual şi prin activităţi de grup.
C. Principii privind predarea :
Predare trebuie să genereze şi să susţină motivaţia elevilor pentru învăţarea continuă.
Profesorii trebuie să creeze oportunităţi diverse, care să faciliteze atingerea obiectelor
propuse.
86
Metodica predării tehnicilor de programare pentru grupele de performanţă
CUM PREDĂM ?
B.
După modul de echilibru al antrenării elevilor în învăţare:
strategii euristice - când învăţarea domină pe baza acţiunii de căutare a elevilor, iar
predarea este doar de sinteză, coordonare
strategie algoritmică - când învăţarea este pe baza de reguli, de norme precise
Ioan Neacşu asociază strategiile de predare-învăţare cu modelele de predare rezultate din aplicarea
teoriilor predării. Astfel rezultă strategii care pun accentul pe comportamentul profesorului şi elevilor, pe
modul de conducere a logicii învăţării pe structurarea etapelor învăţării sau după specificul a ceea ce se
învaţă (strategii pentru formarea noţiunilor, strategii pentru învăţarea atitudinilor sau a capacităţilor) sau
strategii care se referă la modalitatea individuală a fiecărui elev de învăţare. [10]
87
Metodica predării tehnicilor de programare pentru grupele de performanţă
METODE DE ÎNVÃTÃMÂNT
Metodele de învăţământ reprezintă modalităţi sistematice de lucru de care se pot servi profesorii în
activitatea de instruire iar elevii în aceea de învăţare, capabile să conducă spre rezolvarea obiectivelor
pedagogice propuse.
Din perspectiva profesorului, metodele de învăţământ servesc la organizarea şi conducerea unei
acţiuni sistematice prin care elevul va realiza obiectivele pedagogice, arătându-i ce face şi cum să
acţioneze .
Din perspectiva elevului, metodele de învăţământ au menirea să parcurgă calea spre cunoaştere,
spre dobândirea de noi comportamente care îi sporesc valoarea personalităţii arătându-i de asemenea
ce să facă şi cum să facă .
Metodele de învăţare-formare pot fi grupate în trei secţiuni:
metode şi procedee expozitiv-euristice;
metode şi procedee algoritmice;
metode şi procedee evaluativ-stimulative (vezi Evaluarea).
89
Metodica predării tehnicilor de programare pentru grupele de performanţă
EXPUNEREA
Caracterizare:
Este o metodă complexă de comunicare sistematică şi continuă a cunoştinţelor dintr-un anumit
domeniu de specialitate prin intermediul limbajului oral, îmbinat, după caz şi posibilităţi, cu alte limbaje
, cum ar fi cele demonstrativ-intuitive, audio-vizuale, experimental-aplicative şi de investigaţie, logico-
matematică şi altele.
În funcţie de particularităţile şi cerinţele specifice ale gradului şi profilului învăţământului, ale
disciplinei de studiu, ale tipului de activitate didactică, de particularităţile elevilor etc., expunerea poate
folosi forme variate de realizare: descrierea, explicaţia, prelegerea.
Descrierea
Este o formă de expunere care, realizată pe baza observaţiei, îndeosebi, prezintă caracteristicile şi
chiar detaliile exterioare tipice ale obiectelor, proceselor, fenomenelor etc. care se studiază, urmărind să
evidenţieze aspectele fizice ale acestora.
Descrierea se bazează pe intuiţie (observaţie directă) şi se corelează cu datele experienţei şi nivelul
pregătirii elevilor în domeniul respectiv de specialitate, fapt care serveşte îmbinării cunoaşterii şi învăţării
senzoriale cu a celei raţionale.
Explicaţia
Metoda urmăreşte clarificarea unor noţiuni, principii, legi prin evidenţierea notelor esenţiale,
a legăturilor cauzale dintre obiecte şi fenomene. În acest sens se apelează la diferite procedee cum ar fi:
procedeul inductiv, procedeul deductiv, procedeul comparaţiei şi analogiei, procedeul genetic şi istoric,
procedeul analizei cauzale etc.
Explicaţia contribuie la lărgirea şi adâncirea orizontului ştiinţific, la dezvoltarea proceselor
intelectuale, la formarea gândirii tehnice, la formarea concepţiei despre lume şi viaţa.
Prelegerea
Constă în expunerea de către profesor a unui volum mai mare de informaţii printr-o înlănţuire logică
de raţionamente prin relevarea legăturilor complexe dintre obiecte şi fenomene. Se foloseşte atunci când
materialul ce urmează a fi predat este bogat şi cu caracter de noutate pentru elevi. Apelează la capacită-
ţile intelectuale ale elevilor şi necesită o atenţie concentrată din partea acestora şi o maturizare în
gândire.
Potenţialul pedagogic:
Permit transmiterea unui volum mare de cunoştinţe într-un timp scurt.
Asigură desfăşurarea procesului de învăţământ într-un ritm planificat.
Constituie un cadru corespunzător de argumentare ştiinţifică.
Solicită concomitent mai multe procese psihice (gândirea, imaginaţia, afectivitatea).
Sporesc motivaţia de participare a elevilor în situaţia când profesorul se bucură de prestigiu
recunoscut.
90
Metodica predării tehnicilor de programare pentru grupele de performanţă
Cerinţe de aplicare:
Conţinutul transmis trebuie să beneficieze de:
nivel ştiinţific ridicat;
argumentaţie logică şi ierarhizare riguroasă a ideilor;
claritate în expunere;
accesibilitatea cunoştinţelor transmise;
expresivitate în exprimare;
formularea concluziilor parţiale şi generale.
Limitele metodei:
Comunicarea se face în sens unic, profesor spre elevi;
Solicitare mică a gândirii independente;
Grad redus de participare a elevilor la actul de învăţare;
Nu asigură conexiunea inversă.
Modalităţi de realizare:
Prin expunerea sistematică a unor fapte sau evenimente.
Ex: operaţiile tehnologice din cadrul unei tehnologii de fabricaţie.
Explicarea prin argumentarea logică.
Ex: explicarea unui lanţ cinematic.
Efectuarea de instructaje.
Ex: realizarea unui instructaj curent de protecţia muncii.
Prezentarea de probleme şi soluţii.
Ex: expunerea fenomenului de coroziune a metalelor şi a soluţiilor de protejarea
suprafeţelor.
Lectura unor texte în colectiv.
Ex: despre standardizare şi tipizare.
CONVERSAŢIA
Caracterizare:
Este metoda care vehiculează cunoştinţe prin intermediul dialogului (întrebărilor şi răspunsurilor),
discuţiilor sau dezbaterilor.
Conversaţia poate lua una din cele două forme principale cunoscute:
conversaţia socratică implică utilizarea unor întrebări judicios alese şi formulate astfel
încât să-l conducă pe elev către descoperirea adevărului pe care îl urmăreşte cel care
conduce conversaţia. Întrebările, în acest caz, conduc în mod unidirecţional către un răspuns
final pe care profesorul îl aşteaptă din partea elevului.
91
Metodica predării tehnicilor de programare pentru grupele de performanţă
În funcţie de modul în care este implicat procesul gândirii în asimilarea cunoştinţelor se disting:
conversaţia convergentă (întrebările vizează obţinerea aceluiaşi răspuns);
conversaţia divergentă (angajează elevii în descoperirea adevărului prin analiza alternativelor pe
care le implică întrebarea)
Potenţialul pedagogic:
Favorizează perfecţionarea relaţiei profesor-elev.
Stimulează efortul elevilor pentru exprimări clare şi răspunsuri corecte.
Dezvoltă ambiţia elevilor de afirmare intelectuala, curiozitatea, înţelegerea şi iniţiativa.
Cerinţe de aplicare:
Să se bazeze pe cunoştinţe, experienţe şi observaţii anterioare sau pe materiale intuitive.
Să vizeze un singur răspuns la o întrebare.
Să inducă o tensiune psihică pentru aflarea răspunsului.
Formularea răspunsurilor trebuie să aibă următoarele calităţi:
o corectitudine de fond;
o exprimare precisă şi clară;
o răspuns complet;
o să probeze înţelegerea faptelor şi a legăturilor cauzale;
o să fie elaborate independent.
92
Metodica predării tehnicilor de programare pentru grupele de performanţă
Limitele metodei:
Nu asigură în suficientă măsură sistematizarea cunoştinţelor.
Participarea efectivă la conversaţie revine numai unui grup de elevi dintr-o clasă.
Fragmentează problemele şi nu asigură continuitatea activităţilor individuale.
Nu se pot folosi în cazul în care noile cunoştinţe nu sunt sprijinite de materiale intuitive şi de
experienţă.
Participarea la dialog este condiţionată de interesul şi pregătirea elevilor.
De regulă această metoda nu creează fond emoţional.
Se manifestă tendinţa de a depăşi timpul afectat unei lecţii.
Modalităţi de folosire:
Omogenizarea momentului iniţial al unei activităţi de instruire.
Ex: discutarea realizării sarcinilor primite în lecţia anterioară.
Însuşirea de noi cunoştinţe.
Ex: obţinerea prin organizarea unei conversaţii a părţilor principale ale unei maşini-unelte.
Consolidarea cunoştinţelor.
Ex: recunoaşterea prin conversaţie a lanţului cinematic pentru obţinerea mişcării principale a
arborelui principal la o maşină-unealtă.
Formarea şi dezvoltarea capacităţilor intelectuale.
Ex: organizarea unei conversaţii care să-i solicite pe elevi să găsească soluţii noi de fabricaţie a
unor repere.
Formarea de deprinderi.
Ex: organizarea unei conversaţii pentru formarea deprinderilor de comunicare prin simboluri a
stării suprafeţelor pieselor prelucrate.
PROBLEMATIZAREA
Caracterizare:
Problematizarea este modalitatea de instruire a elevilor în care se îmbină rezolvarea de probleme şi
situaţii-problemă, valorificarea experienţei anterioare a elevilor cu efectuarea unui efort personal de
rezolvare.
Situaţia-problemă se caracterizează prin aceea că oferă elevului posibilitatea să caute singur soluţia,
orientându-se după anumite repere mai mult sau mai puţin detaliate.
În cadrul aplicării acestei metode se pot delimita trei momente succesive:
momentul pregătitor care constă în crearea situaţiei-problemă.
Se pot distinge trei cazuri:
− profesorul creează în mod intenţionat o situaţie-problemă, iar explicaţiile conduc
la rezolvarea ei.
− profesorul creează în mod intenţionat o situaţie-problemă, rezolvarea având loc
în mod independent de către elevi;
− elevii înşişi creează o situaţie-problemă şi tot ei o rezolvă în mod independent.
93
Metodica predării tehnicilor de programare pentru grupele de performanţă
Cerinţe de aplicare:
Profesorul trebuie să dea clasei seturi de probleme pe care trebuie să le elaboreze.
Sarcinile de activitate cerute să provoace dinamizarea cunoştinţelor existente în sprijinul
dobândirii de cunoştinţe noi.
Elementele cognitive noi să derive din cele dobândite de elevi.
Problemele să fie adaptate la posibilităţile de rezolvare ale elevilor.
Învăţarea problematizată să se realizeze continuu.
Limitele metodei :
Timpul de desfăşurare este impus de posibilităţile de rezolvare a majorităţii elevilor.
La elevii neantrenaţi se produce frecvent o stare de oboseală.
Participarea elevilor este condiţionată de motivaţia de învăţare.
Elevii pot pierde continuitatea învăţării dacă nu este asigurată o conexiune inversă de reglaj.
Modalităţi de folosire:
Poate fi aplicată în predarea tuturor disciplinelor de învăţământ, în toate etapele procesului
didactic şi la nivelul tuturor ciclurilor şcolare.
DESCOPERIREA
Caracterizare:
Metoda descoperirii constă în utilizarea de către elevi a experienţei şi capacităţii individuale în
vederea aplicării lor asupra unei situaţii-problemă în scopul găsirii soluţiei. Elevul desfăşoară în acest sens
o activitate intensă de observare, prelucrare şi stabilire a concluziilor.
Descoperirea presupune raportarea continuă la experienţa anterioară în vederea folosirii ei pentru
soluţionarea problemei. Este cunoscut faptul că ceea ce se obţine prin efort propriu nu se reduce la
94
Metodica predării tehnicilor de programare pentru grupele de performanţă
Cerinţe de aplicare:
Proiectarea procesului de învăţământ trebuie să se facă în raport cu elementele caracteristice
acestei metode.
Pentru realizarea sarcinilor didactice, elevii trebuie să parcurgă etapele:
o confruntarea cu problema;
o declanşarea procesului de descoperire;
o sesizarea relaţiilor anterioare şi formularea rezultatelor.
Limitele metodei:
Necesită rezervarea unui timp mai îndelungat.
În cazul unor probleme complexe, realizarea înţelegerii bazate numai pe efortul personal al
elevului poate întâmpina dificultăţi.
MODELAREA
Caracterizare:
Modelul reprezintă un sistem material sau teoretic care reproduce, la scară, structura unui sistem pe
care ne propunem să-l cunoaştem. Cu alte cuvinte, un obiect, un fenomen, un sistem tehnologic sau un
proces real poate fi reprodus cu ajutorul modelului.
Cunoaşterea realităţii se realizează astfel în mod indirect prin intermediul modelului, care trebuie să
îndeplinească astfel o funcţie demonstrativă condensând informaţiile pe care elevii urmează să le
descopere.
Modelele didactice pot fi:
95
Metodica predării tehnicilor de programare pentru grupele de performanţă
obiectuale - reproduc sub forma materială la o scară redusă diferite obiecte şi procese
din realitate (machete, piese secţionate);
iconice- reproduc fenomenul sau procesul tehnologic cu ajutorul imaginii (scheme,
schiţe, organigrame, grafice etc.);
simbolice - reproduc originalul cu ajutorul semnelor convenţionale;
informatice - reproduc originalul cu ajutorul unor facilităţi oferite de mijloacele
multimedia (imagine, animaţie, sunet).
Modele informatice sunt practic programe de calculator interactive care permit simularea
funcţionării unor echipamente tehnologice, instalaţii etc.
Ex: poate fi modelat modul de funcţionare al unui motor cu aprindere prin scânteie.
Indiferent de natura lor modelele didactice sunt considerate analogii ale realităţii şi nu copii ale ei,
reproducând în principal structura obiectelor, fenomenelor şi proceselor în vederea realizării sarcinilor
învăţării.
Potenţialul pedagogic:
Modelul didactic sprijină trecerea de la cunoaşterea senzorială la formele logice ale cunoaşterii.
Modelul stimulează funcţiile creative ale gândirii.
Modelul serveşte ca instrument de sprijin pentru soluţionarea unor probleme.
Cu ajutorul modelului se pot exersa diferite deprinderi.
Modelul oferă posibilitatea elevilor de a exersa şi aplica cunoştinţele în contexte noi, variate.
Cu ajutorul modelelor elevii pot analiza părţile componente ale unei machete tehnice.
LUCRĂRILE EXPERIMENTALE
Caracterizare:
În acest caz elevii sunt puşi în situaţia de a experimenta pentru a cunoaşte în mod nemijlocit diferite
fenomene. În cadrul lucrărilor experimentale sunt utilizate instalaţii, dispozitive şi materiale
corespunzătoare. Metoda constă în efectuarea de către elevi , sub supravegherea profesorului a unor
experienţe in scopul acumulării de informaţii ştiinţifice de către elevi. Experienţele pot fi efectuate
individual sau în grup, în laborator sau atelier.
Profesorul indică principalele etape ce urmează a fi parcurse şi supraveghează desfăşurarea
experimentelor prin întrebările ce le adresează pe parcurs pentru a orienta atenţia elevilor spre soluţia
finală sau spre concluzii valide. Simultan cu executarea operaţiilor indicate, elevii observă ceea ce se
întâmplă şi înregistrează rezultatele obţinute.
După încheierea lucrării experimentale are loc o conversaţie finală în cadrul căreia se desprind ideile
generale fixându-le sub formă de concluzii.
Lucrările experimentale pot fi:
frontale - toţi elevii efectuează concomitent aceeaşi experienţă. Profesorul urmăreşte activitatea
elevilor putând interveni cu recomandări şi precizări individuale sau colective. Acest tip de lucrări
este posibil când fiecare elev posedă câte o trusă de instrumente;
96
Metodica predării tehnicilor de programare pentru grupele de performanţă
pe grupe - se repartizează fiecărei grupe sarcini diferite sau toate grupele efectuează aceeaşi
lucrare;
individuale - fiecare elev îndeplineşte o sarcină concretă diferită de a celorlalţi, folosind aparate
şi instrumente adecvate.
După finalitatea lor pedagogică lucrările experimentale pot fi:
demonstrative - sunt efectuate de către profesor, în faţa clasei cu scopul de a demonstra şi
confirma adevărurile transmise;
aplicative - se efectuează de către elevi pe baza unui protocol întocmit de profesor în vederea
urmăririi posibilităţilor de aplicare în practică a cunoştinţelor teoretice;
experimentale - sunt destinate formării abilităţilor şi deprinderilor motrice de mânuire a
instrumentelor şi aparatelor din laboratoare şi ateliere şcolare;
cu caracter de cercetare - elevii sunt puşi în situaţia de a concepe ei înşişi montajul
experimental, pornind de la o ipoteza şi continuând cu culegerea datelor şi desprinderea
concluziilor.
Potenţialul pedagogic:
Efectuarea unor lucrări practice sprijină consolidarea şi aplicarea cunoştinţelor în situaţii concrete.
Contribuie la formarea corectă a deprinderilor.
Formează şi consolidează aptitudini.
Efectele pedagogice sporesc pe măsură ce creşte caracterul creator al acestora.
Elevul beneficiază de posibilitatea autocontrolului.
Cultivă aptitudini profesionale.
Cerinţe de aplicare:
Elevii trebuie să cunoască şi să înţeleagă scopul şi principiul pe care îl fundamentează lucrarea.
Efectuarea corectă a lucrării necesită dimensionarea prealabilă.
Limitele metodei:
Aplicarea metodei necesită un mediu de instruire corespunzător.
LUCRUL ÎN GRUP
Caracterizare:
Presupune distribuirea elevilor pe grupuri, rezolvarea sarcinilor didactice având loc prin confruntarea
punctelor de vedere, prin discuţii reciproce.
97
Metodica predării tehnicilor de programare pentru grupele de performanţă
Metoda constă în declanşarea şi menţinerea unor relaţii de cooperare şi competiţie dintre membrii
unui grup sau mai multor grupe de elevi în vederea obţinerii unei performanţe sporite a învăţării.
Potenţialul pedagogic:
Poate spori eforturile individuale ale învăţării ca urmare a îmbinării lor cu eforturile şi inteligenţa
grupului.
Conduce la ridicarea ştachetei învăţării.
Stimulează un control reciproc între elevi şi spiritul de iniţiativă.
Este o metodă de socializare, de formare a spiritului de cooperare şi întrajutorare reciprocă, de
competiţie loială.
Întreţine un climat deschis, democratic, stimulativ.
ALGORITMIZAREA
Caracterizare:
Constă în elaborarea şi aplicarea unor scheme, constituite dintr-o succesiune de secvenţe şi operaţii,
în scopul rezolvării unor probleme şi asimilării pe această bază a cunoştinţelor, concomitent cu formarea
capacităţilor operaţionale corespunzătoare.
Algoritmii se prezintă sub diferite forme:
reguli de calcul;
scheme de desfăşurare a unei activităţi;
instructaj riguros care indică ordinea acţiunilor ce trebuie executate etc.
Orice algoritm se caracterizează printr-o succesiune de elemente (secvenţe, operaţii), prin caracterul
univoc al acestei succesiuni, printr-o finalitate precisă, prin claritatea lui în sensul că, aplicat de persoane
diferite, va asigura un răspuns corect.
Potenţialul pedagogic:
Micşorează eforturile şi timpul de efectuare a acţiunilor.
Măreşte productivitatea muncii intelectuale sau practice.
Cerinţe de aplicare:
Alegerea corectă a algoritmului corespunzător rezolvării problemei.
Conştientizarea caracteristicilor algoritmului pentru a fi folosit adecvat, creator şi eficient.
INSTRUIREA PROGRAMATĂ
Caracterizare:
Constituie o aplicare a principiilor ciberneticii la procesul de învăţământ.
98
Metodica predării tehnicilor de programare pentru grupele de performanţă
Potenţialul pedagogic:
Activează şi individualizează maxim instruirea.
Dezvoltă un stil eficient de muncă individuală.
Manifestă un puternic caracter formativ.
Poate fi adaptat la colectivul de elevi cu pregătire eterogenă.
Realizează feed-back-ul la cel mai înalt grad.
Limitele metodei:
Elevii obosesc repede.
Serveşte latura de instruire şi în mai mică măsură latura educativă.
Creează decalaje mari în ritmul de învăţare a elevilor.
Implică cheltuieli ridicate.
EXERCIŢIUL
Caracterizare:
Exerciţiile sunt considerate ca acţiuni intelectuale sau motrice ce se repetă relativ identic în scopul
învăţării sau formării unor tehnici de lucru de natură mentală sau motrică.
Dacă asimilarea cunoştinţelor se realizează prin comunicare verbală sau prin contactul nemijlocit cu
realitatea, formarea deprinderilor motrice sau intelectuale este posibilă numai prin efectuarea repetată a
unor acţiuni motrice sau intelectuale.
Exerciţiul se desfăşoară în mod algoritmic şi se încheie cu formarea unor priceperi şi deprinderi ce
vor putea fi aplicate ulterior în rezolvarea unor sarcini mai complexe.
Potenţialul pedagogic:
Contribuie la formarea corectă a deprinderilor.
Efectele pedagogice sporesc pe măsură ce creşte caracterul creator al exerciţiilor.
Cerinţe de aplicare:
Tipurile de exerciţii trebuie să corespundă dezvoltării psihice a elevilor în sensul că ponderea
exerciţiilor pentru stimularea creativităţii să sporească în comparaţie cu exerciţiile reproductive.
Pentru a asigura automatizarea deprinderilor, exerciţiile trebuie desfăşurate într-o succesiune
didactică.
Efectuarea de către elevi a exerciţiilor în mod conştient.
99
Metodica predării tehnicilor de programare pentru grupele de performanţă
100
Metodica predării tehnicilor de programare pentru grupele de performanţă
fixarea procedeelor de lucru sub formă de comenzi: formulează răspunsul, confruntă-l cu cel
corect, alege răspunsul, rezolvă, doreşti informaţie suplimentară, identifică, interpretează,
explică, demonstrează etc.;
elaborarea programului şi transpunerea lui în limbajul cunoscut de calculator;
verificarea şi corectarea programului, dacă este necesar.
Învăţarea asistată de calculator este un factor de progres în activitatea didactică, însă, dacă
programele nu sunt alcătuite pe baza unor cerinţe didactice şi nu are în vedere dezvoltarea creativităţii,
eficienţa poate fi scăzută, mai ales din punct de vedere formativ.
Instruirea programată poate fi transformată cu succes într-o metodă activă dacă se are în vedere
implementarea sa, cu măiestrie, într-o strategie, activ-participativă, ca rezultat al aplicării unor metode de
genul descoperirii, algoritmizării, problematizării şi exerciţiului etc.
Desigur că nu vom avea pretenţia de a considera suficiente observaţiile făcute din perspectiva
modernizării şi activizării metodelor prezentate, dar sperăm ca ideile respective să poată fi luate în
considerare în cazul unui studiu făcut asupra metodelor, mai larg, şi mai amănunţit, care să cuprindă un
volum mai mare de informaţii şi din aceste motive nu ar putea fi inclus în lucrarea prezentă.
Principalele mobiluri ale perfecţionării şi modernizării metodelor de învăţământ nu sunt altele decât
aceleaşi impulsuri care propulsează dezvoltarea progresivă a întregului învăţământ de astăzi. Profesorul
trebuie să dovedească o mai mare capacitate de gândire creatoare şi de acţiune constructivă, de
cercetare şi previziune, spirit de invenţie şi de inovaţie.
În ultima vreme s-a ajuns la înţelegerea mai profundă a raportului dintre învăţare şi legile dezvoltării
mintale, dintre instrucţie şi formarea personalităţii. Dispunem de o metodă de abordare sistematică a
învăţământului, de o taxonomic a obiectivelor. Recentele progrese ne ajută să înţelegem altfel decât până
acum multe dintre principalele aspecte ale organizării învăţării, ne dau posibilitatea să întrevedem o
inovaţie metodologică dedusă nu doar din stricta experienţă directă la catedră, dar şi ştiinţifică, inspirată
din cunoaşterea legităţilor învăţării şi ale dezvoltării personalităţii.
101
Metodica predării tehnicilor de programare pentru grupele de performanţă
Vechile metode mai pot fi utilizate în anumite situaţii, atunci când profesorul decide că este necesar,
dar pot fi îmbinate, îmbunătăţite şi modernizate, astfel încât să se atingă scopul propus.
Luate în forma brută, iniţială, a lor, metodele învechite, practicate până acum, au câteva
caracteristici, cum ar fi:
acordă prioritate instrucţiei;
pun accent pe însuşirea materiei, au orientare intelectualistă;
sunt centrate pe activitatea profesorului, promovând un „învăţământ magistral";
pun accentul pe predare;
elevul este privit ca obiect al instruirii;
neglijează însuşirea metodelor de studiu individual, personal;
sunt centrate pe comunicarea orală, pe cuvânt, livreşti;
sunt receptive şi pasive, bazate pe memorie şi reproducere;
sunt orientate pe produs, prezentând ştiinţa ca pe o sumă de cunoştinţe finite;
sunt abstracte, orientate spre aspectul formal al realităţii, au prea puţin caracter aplicativ,
menţinând o legătură sporadică cu activitatea practică;
impun o conducere rigidă a instrucţiei;
impun un control formal, aversiv;
promovează numai competiţia;
presupun fie o individualizare excesivă, fie o socializare exagerată a învăţării;
se bazează pe o motivaţie exterioară ( extrinsecă), cu evidente elemente de reprimare, de
frică şi de constrângere;
întreţin relaţii rigide, autocratice între profesor şi elevi;
profesorul are rolul de „depozitar" şi „transmiţător" de cunoştinţe;
disciplina învăţării este impusă prin constrângere.
Revoluţionarea metodologiei didactice presupune transformarea celui care învaţă în subiect activ al
propriei formări, dar şi apropierea cunoaşterii didactice de cunoaşterea ştiinţifică. Tehnologia şi strategiile
didactice au rolul de a crea un cadru propice, angajării şi participării active a celui care învaţă la realizarea
obiectivelor predării.
STRATEGII DIDACTICE
Învăţarea este un act personal care cere participarea personală, efortul depus trebuie să fie
conştient, motivat, susţinut, cu rezultate vizibile în timp. Producerea învăţării, dezvoltarea intelectuală a
elevilor depind în egală măsură atât de prezenţa lor fizică în clasă, cât şi de participarea efectivă la
propria formare..
102
Metodica predării tehnicilor de programare pentru grupele de performanţă
autocontrol;
4. sistematică
capacitate de analiză şi autoreglare a propriei activităţi;
cunoştinţe;
direcţională spre însuşirea criteriilor de distingere şi ierarhizare a valorilor, şi de
5. perfecţionarea propriei autoapreciere;
personalităţi, scop capacitate de selecţie;
capacitate de a fixa un ideal, scopuri şi obiective, mobilizatoare;
autoanaliză ;
capacitate de a decide în legătură cu sine, cu propria evoluţie;
pe baza unei decizii
7. capacitate de concretizare a valorilor dorite în norme de acţiune
personale
proprie;
capacitate de elaborare a unui program de acţiuni imediate;
capacitate de automobilizare;
8. (de) autoangajare
voinţă;
103
Metodica predării tehnicilor de programare pentru grupele de performanţă
Ca un corolar a celor înfăţişate până acum referitor la autoeducaţie, la efortul personal depus pentru
„a învăţa", imperativele impuse de loan Neacşu [10], privind ceea ce numeşte un „ghid normativ
destinat învăţării eficiente", sunt:
a) cunoaşterea bună a profilului mnezic;
b) buna pregătire a mecanismelor memoriei pentru activitate;
c) organizarea materialului care trebuie prelucrat şi asimilat;
d) învăţarea activă;
e) cunoaşterea dominantelor memoriei şi gândirii;
f) asocierea memoriei cu gândirea;
g) cultivarea capacităţii de concentrare şi de mobilizare; h) antrenarea proceselor psihice
necesare învăţării.
Realizarea unei lecţii bune nu înseamnă a face pe elevi să înmagazineze un volum de informaţii, ci a-
i învăţa cum să ia parte activă la procesul de învăţare, la formarea propriei personalităţi, la autoeducaţie
şi autoinstrucţie.
Activitatea intelectuală trebuie desfăşurată conform cu metodele şi tehnicile de utilizare şi prelucrare
a informaţiilor, care începe cu munca la clasă şi se continuă cu alte activităţi intelectuale şcolare sau
extraşcolare (de exemplu munca în bibliotecă). E necesar ca acestor preocupări să li se adauge iniţierea
în problematica cercetării ştiinţifice, elaborării unor lucrări personale, creaţiei şi invenţiei.
Este foarte importantă crearea unei motivaţii interioare justificată, care să-1 facă pe elev să
acţioneze din propria-i pornire, din înţelegerea şi convingerea necesităţii de a îndeplini sarcinile de
învăţare ce îi revin.
Revenind la problematica participării la învăţare, se ştie că fiecare lecţie oferă suficiente posibilităţi
de angajare activă. Cheia succesului învăţării depline şi active este:
trăirea deplină a experienţei de învăţare;
angajarea autentică a elevului;
implicarea plenară, cu toate forţele în procesul de învăţare;
participarea intensivă şi activă, conştientă şi creatoare .
Gradul de participare, intensitatea, variază în funcţie de gradul de dirijare a învăţării propusă de
către profesor şi modul de realizare a acesteia, de metodele şi procedeele folosite. Pedagogia lecţiei
active este condiţionată de utilizarea metodelor activ-participative.
Profesorul trebuie să înţeleagă rolul metodelor pe care le utilizează în lecţie, astfel încât să nu fie
tentat să substituie efortul propriu al celui care învaţă, oferindu-i cunoştinţe de-a gata, şi probleme sau
situaţii problematice dinainte rezolvate, dirijând şi controlând prea îndeaproape fiecare acţiune întreprinsă
de elevi, în şi aşa puţinul timp şi spaţiu care le mai rămâne.
104
Metodica predării tehnicilor de programare pentru grupele de performanţă
Gândirea şi imaginaţia elevului sunt „blocate", în acest caz, iar acesta, fie renunţă la învăţare
căutând modalităţi de „înşelare", fie se plafonează realizând o memorare forţată şi neeficientă a
informaţiilor.
Activizarea este cu atât mai intensă cu cât sunt declanşate şi puse în funcţiune componentele
superioare ale celor doi parametri, unul de natură cognitiv-intelectuală, format din procesele cognitive
(senzaţii, percepţii, reprezentări, imaginaţia, memoria, gândirea, etc.), iar celei afective, atitudini,
trăsături caracteriale etc), şi în plus menţinerea unui echilibru optim între aceşti parametri.
Valorificarea posibilităţilor de activizare pe care le incumbă metodele şi mijloacele de învăţământ
depinde de măiestria cu care sunt folosite şi aplicate de către profesor. Cunoscând factorii implicaţi într-
un context concret, el poate decide asupra tehnologiei didactice celei mai apte, să contribuie la realizarea
activizării.
Acţiunea didactică începe cu sfârşitul ei, în sensul că înainte de a trece la efectuarea propriu-zisă a
acesteia, profesorul îşi proiectează în plan mintal rezultatele finale şi performanţele la care se aşteaptă să
ajungă elevii.
El analizează cu grijă toate elementele care intervin în procesul de predare-învăţare şi gândeşte la
ce are de înfăptuit, anticipează natura şi nivelul modificărilor ce trebuie produse în comportamentul
elevilor săi, pe plan cognitiv, afectiv şi psihomotor. în concluzie, metodele se definesc în modul cel mai
simplu prin obiectivele pe care şi le-a propus. Prin faptul că aceleaşi metode pot duce la realizarea unor
obiective diferite, ele manifestă şi o relativă interdependenţă faţă de finalităţile educaţiei.
Această relativă autonomie este întărită de însăşi caracterul polifuncţional al metodelor, de faptul că
ele pot îndeplini funcţii diferite în raport cu obiectivele propuse. Cu alte cuvinte este vorba şi despre
alegerea celei mai bune funcţii pentru o anumită metodă, în raport cu cerinţele de îndeplinire a
obiectivelor propuse.
Metoda are o deschidere bidirecţională în raport cu ceea ce face şi cum face profesorul, în raport cu
obiectul, şi în acelaşi timp subiectul instrucţiei. Am dedus că opţiunea pentru o metodă sau alta este
condiţionată de competenţa profesorului, de capacitatea sa de reflecţie pedagogică şi de analiză a
situaţiei de moment.
Succesul depinde de talentul cu care o metodă este utilizată. În acelaşi timp, o metodă poate să
compenseze carenţele aptitudinale ale profesorului, sau să pună în valoare cu şi mai multă vigoare
anumite aptitudini. Deci succesul mai depinde şi de rigurozitatea cu care sunt respectate particularităţile
metodei. Profesorii îşi pot folosi metodele proprii, originale, însă nu se poate merge până într-acolo încât
să se poată spune că fiecare, trebuie, şi poate să-şi găsească, şi să utilizeze metoda proprie, în întregime
personală şi originală. Acest lucru nu este posibil atât timp cât o metodă nu este determinată de un
singur factor, ci de o mulţime de alte variabile, intercorelate şi întrepătrunse.
Procesul de modernizare al metodelor stă, în primul rând, sub semnul progreselor înregistrate de
psihologie, psihopedagogie, psihosociologie, aspectul esenţial fiind adaptarea metodologiilor de instruire
la legile dezvoltării psihice.
Astfel, „metodologia se cere a fi suplă şi permisivă la dinamica schimbărilor care au loc în
componentele procesului instructiv-educativ. Calitatea unei tehnologii este dată de flexibilitatea şi
deschiderea ei faţă de situaţiile şi exigenţele noi, complexe ale învăţământului contemporan."
105
Metodica predării tehnicilor de programare pentru grupele de performanţă
Criteriul raportării unei metode la o anumită realitate poate să facă o metodă „bună" sau „rea",
eficientă, sau mai puţin eficientă.
Considerând că utilizarea metodelor activ-participative reprezintă o condiţie ce nu ar mai trebui
comentată, în plus trebuie asigurate oportunitatea, adecvarea şi congruenţa metodologică.
Profesorul trebuie să-şi însuşească principiile generale care stau la baza unei metodologii,
rămânându-i posibilitatea să inventeze alte procedee, să descopere o modalitate mai bună de aplicare a
metodei care convine cel mai bine, în concordanţă cu caracteristicile personale ale temperamentului său
şi cu obiectivele pe care şi le-a propus.
Modernitatea în alegerea (sau crearea) unor noi metode constă şi în respectarea unor factori
subiectivi, care ţin de psihologia vârstei şi de individualităţile elevilor (stadiul dezvoltării intelectuale şi
fizice, de mecanismele de achiziţie constituite), de suportul motivaţional şi atitudinal, atenţia şi gradul de
efort dovedit, de specificul clasei şi relaţiile elevi-elevi anterior formate etc.
Optimizarea activităţii didactice corespunde aşadar, cu necesitate, unei căutări şi dorinţe reale de
perfecţionare şi creaţie, venită din partea profesorului, pe lângă buna pregătire psihopedagogică şi
ştiinţifică dovedită de acesta, conform cu funcţiile metodelor şi cu scopurile pe care şi le-a propus.
Modernitatea metodelor nu este un dat sau o etichetă atribuită artificial, ea are un conţinut concret,
determinat pe de o parte, de forţa cu care se stimulează efortul constructiv şi creator al subiectului, iar pe
de altă parte, de relaţiile sale cu celelalte metode şi procedee, cu mijloacele folosite într-o situaţie
concretă dată.
Modernitatea derivă din idealul educativ nou ce se impune. Metodele trebuie să se orienteze spre
activizarea elevilor, astfel încât, aceştia să se deprindă ei înşişi cu metode-instrumente de gândire şi de
lucru, de exerciţiu, prin muncă personală să obţină rezultatele dorite, să devină un fel de autodidacţi
moderni.
Astfel, comparativ cu însuşirile metodelor învechite, precizate la începutul acestui subcapitol, se pot
deduce câteva caracteristici şi direcţii de înnoire a metodologiei didactice pe care le încearcă învăţământul
actual:
îmbină armonios educaţia cu instrucţia;
dau întâietate dezvoltării personalităţii, exersării şi dezvoltării capacităţilor şi aptitudinilor;
sunt axate pe activitatea elevului;
deplasează accentul pe învăţare, cu ridicarea concomitentă a exigenţelor faţă de predare;
elevul a fost obiect, dar devine subiect al actului de instrucţie şi educaţie, al propriei sale
formări;
sunt subordonate principiului educaţiei permanente, urmărind însuşirea unor tehnici de
muncă intelectuală, de autonomie continuă;
sunt centrate pe acţiune, pe cercetare, redescoperire, explorare, experimentare;
se preferă metodele activ-participative, care presupun o cunoaştere cucerită prin efort
propriu;
îşi îndreaptă atenţia spre proces, spre metodele euristice şi de cercetare, spre învăţarea prin
descoperire;
presupun contactul direct cu problemele realităţii, ale muncii practice;
106
Metodica predării tehnicilor de programare pentru grupele de performanţă
MIJLOACE DE ÎNVÃTÃMÂNT
Mijloacele de învăţământ pot fi definite ca „un ansamblu de resurse sau instrumente
materiale şi tehnice adoptate şi selectate" în vederea realizării sarcinilor instructiv-educative ale
şcolii.
Dintre mijloacele de învăţământ, clasificate conform propunerilor făcute de P. J. Nills, L.P. Presman,
M. lonescu [10], după funcţia pedagogică îndeplinită, cel mai des utilizate în lecţiile de informatică sunt
următoarele:
a) Mijloace informativ demonstrative
mijloace sau reprezentări figurative: planşe, folii transparente de retroproiector, imagini
audiovizuale;
reprezentări simbolice: scheme logice, diagrame, desene pe tablă.
b) Mijloace audio-vizuale
mijloace realizate pe suporturi sonore: benzi audio, discuri, CD-uri, emisiuni radiofonice
mijloace realizate pe suporturi audio-vizuale: filme didactice, emisiuni TV, utilizarea
programelor demonstrative pe calculator
c) Mijloace realizate pe alte tipuri de suporturi:
colecţii
modele spaţiale (mulaje, modele statice, modele funcţionare, simulatoare)
108
Metodica predării tehnicilor de programare pentru grupele de performanţă
109
Metodica predării tehnicilor de programare pentru grupele de performanţă
110
Metodica predării tehnicilor de programare pentru grupele de performanţă
înseamnă că nu există o „lecţie-tip", o „lecţie-model", care să poată fi reprodusă mereu în acelaşi mod, ci
numai situaţii asemănătoare care sugerează o structură asemănătoare, tipică pentru o categorie dată."
Criteriile de clasificare pot fi diverse, lucru rezultat din necesitatea perfecţionării continue a tehnicilor
de elaborare a proiectării şi realizare a lecţiei, deziderat al noii reforme a învăţământului din ţara noastră
care. presupune noi orientări şi restructurări chiar la nivelul cel mai fin al pregătirii tinerilor în şcoală. I.
Cerghit ia drept criteriu de clasificare sarcina didactică de bază şi drept subcriteriu tipul de învăţare în
scopul clasificării categoriilor de lecţii după tipul lor. I. Nicola consideră că în cadrul fiecărei lecţii se
realizează multiple sarcini, dar există una dominantă sau care constituie obiectivul ei principal, orientând
şi concentrând în acelaşi sens activitatea profesorului şi a elevilor (aşa numita „sarcină didactică
fundamentală"). Sarcinile didactice fundamentale pot fi: comunicarea de cunoştinţe, formarea de
priceperi şi deprinderi, sistematizarea, verificarea, etc[23].
Fiecare sarcină didactică fundamentală presupune stabilirea riguroasă a obiectivelor operaţionale
care pot fi diverse în funcţie de multitudinea factorilor ce trebuie luaţi în considerare: obiectul de
învăţământ, particularităţile colectivului de elevi, de grup şi individuale, strategiile didactice propuse şi în
acelaşi timp viabile, stilul de predare şi creativitatea profesorului, etc.
Realizarea obiectivelor prin modalităţi diferite conduce la o infinitate de variante determinate de
factorii variabili ce intervin în fiecare lecţie.
I. Nicola a determinat următorii factori variabili ce intervin şi impun variante de lecţii: conţinutul
lecţiei, gama obiectivelor operaţionale ale lecţiei, pregătirea anterioară a elevilor, strategiile şi mijloacele
folosite, sursele de informaţii la care se apelează, locul pe care lecţia îl ocupă în sistemul de lecţii,
particularităţile procesului de învăţare, mărimea colectivului de elevi, formele muncii cu elevii (frontale, pe
grupe, individuale), locul unde se desfăşoară lecţia (clasă, atelier, laborator, etc.), nivelul dezvoltării
psihice a elevilor, stilul de predare al profesorului, etc.
Fiecare dintre variantele ce pot fi concepute are propria structură ce se constituie dintr-o serie de
evenimente, etape, secţiuni de lucru sau module, aşa numitele „evenimente ale instruirii".
111
Metodica predării tehnicilor de programare pentru grupele de performanţă
112
Metodica predării tehnicilor de programare pentru grupele de performanţă
simulatoare, experienţă simulată prin jocuri de roluri (lecţii cu caracter de joc), de caracterizare a
personajelor literare etc.;
Lecţia de creaţie, de dezvoltare a funcţiilor de expresie (a capacităţilor şi
aptitudinilor de creaţie)
Variante: lecţii bazate pe învăţare prin creaţie, adică pe exerciţii de creaţie, creaţie de modele
noi, compuneri libere, eseuri literare şi filozofice, creaţie tehnică, creaţie artistică, aplicaţii creatoare etc.;
Lecţia de evaluare.
Variante: lecţii de verificare şi apreciere, de lucrări practice şi apreciere, de lucrări scrise, de analiză
şi corectare a lucrărilor, de dezbatere asupra alternativelor şi modurilor de acţiune aplicate, de evaluare a
exerciţiilor (fizice de exemplu) etc;
Lecţia de atitudine (motivaţie).
Variante: lecţia de sensibilizare (de sesizare a semnificaţiilor), lecţia de introducere sau inaugurală
(de sesizare a cadrului ideaţional), lecţia-demonstraţie de sensibilizare etc.;
Lecţia complexă sau mixtă (de dezvoltare multilaterală).
Se poate observa că polifuncţionalitatea unor variante creează unele dificultăţi de plasare a lor într-o
categorie sau alta, de aceea se pot regăsi ca variaţii la două sau chiar mai multe tipuri de lecţii.
Clasificarea tipurilor de lecţii după modelul lui I.Nicola ţine cont de caracteristicile fiecărui tip de
lecţie, de structura posibilă şi, în concordanţă cu clasificarea făcută de I.Cerghit, prezintă şi câteva
variante posibile (aceasta fiind de referinţă pentru mulţi specialişti pedagogi care şi-au propus clasificarea
tipurilor de lecţii):
Tipul lecţiei mixte sau combinate
Caracteristici: urmăreşte realizarea aproximativ în aceeaşi măsură a mai multor sarcini didactice
(comunicare, sistematizare, fixare, verificare,etc.), fiecăreia fiindu-i rezervată o verigă a instruirii, sarcinile
profesorului şi elevilor se situează pe acelaşi plan, succesiunea evenimentelor este variabilă, volumul
cunoştinţelor predate este mai redus.
Structură:
organizarea clasei pentru lecţie şi captarea atenţiei elevilor;
actualizarea elementelor învăţate anterior; pregătirea elevilor pentru asimilarea noilor
cunoştinţe;
comunicarea şi asimilarea noilor cunoştinţe
fixarea cunoştinţelor predate (sistematizare, exerciţii aplicative, reluarea într-un alt context a
esenţialului, etc.);
conexiunea inversă - pe tot parcursul lecţiei.
Tipul lecţiei de comunicare
Caracteristici: concentrarea activităţii didactice în direcţia dobândirii de către elevi a unor cunoştinţe
şi dezvoltării, pe această bază a proceselor şi însuşirilor psihice, a capacităţilor instrumentale şi
operaţionale, comunicarea are ponderea cea mai mare în lecţie.
Structură (subsecvente):
pregătirea elevilor în vederea asimilării noilor cunoştinţe;
113
Metodica predării tehnicilor de programare pentru grupele de performanţă
114
Metodica predării tehnicilor de programare pentru grupele de performanţă
115
Metodica predării tehnicilor de programare pentru grupele de performanţă
EVALUAREA
Procesul educaţional presupune în acelaşi timp parcurgerea nivelurilor învăţării (acumulării, formării)
respectiv cunoaşterea, înţelegerea, aplicarea, analiza şi sinteza precum şi evaluarea, în consecinţă
necesită acţiuni de reglare şi autoreglare continuă.
Referitor la evaluarea educaţională ne propunem să răspundem la întrebări de genul: „Ce este
evaluarea?", „Ce evaluăm concret?", „Pe cine evaluăm?", „Când evaluăm?", „Care sunt metodele şi
mijloacele de evaluare pe care le putem folosi?", „ Cum interpretăm rezultatele evaluării?", „Cum ne
îmbunătăţim activitatea viitoare pe baza rezultatelor evaluării? " etc. [23]
Pentru a utiliza în cunoştinţă de cauză termenul de evaluare trebuie să cunoaştem principalele
concepte referitoare la aceasta, precum şi importanţa şi complexitatea evaluării învăţării. Astfel în
Dicţionarul de Pedagogie - definiţia evaluării este sinonimă cu cea de apreciere.
Aprecierea este un act psihopedagogie de determinare prin note, calificative, clasificări, puncte etc.
a rezultatelor instructiv-educative obţinute de un elev la un obiect de studiu (cunoştinţe, deprinderi,
capacităţi mintale, atitudini morale faţă de activitatea de învăţare şi traducere în practică a celor învăţate)
Etimologic:
latină: Examen - cântărire, probă, control, verificare şi apreciere, examen, examinare;
franceză: evaluation - control, verificare, estimare;
engleză: examination, estimation, verification, control, apreciation şi valuation - examinare,
estimare, apreciere, evaluare;
latină: concursus - confruntare, competiţie şi apreciere pe bază de competenţă.
În şcoala românească noţiunea de evaluare a evoluat, adaptându-se şi modernizându-se continuu,
în scopul perfecţionării actului în sine, precum şi a etapelor parcurse (conceperea, aplicarea, analiza şi
sinteza, ameliorarea). „Evaluarea şcolară este procesul prin care se delimitează, se obţin şi se furnizează
informaţii utile, permiţând luarea unor decizii ulterioare. Actul evaluării presupune două momente relativ
distincte: măsurarea şi aprecierea rezultatelor şcolare".
Desfăşurându-se în cea mai mare parte la nivel de nucleu (profesor -clasă - elev) actul didactic al
evaluării vizează procesul de învăţământ în ansamblul său.
„Evaluarea (examinarea) este actul didactic complex integrat întregului proces de învăţământ, care
asigură evidenţierea cantităţii cunoştinţelor dobândite şi valoarea, nivelul, performanţele şi eficienţa
acestora la un moment dat - în mod curent, periodic şi final, oferind soluţii de perfecţionare a actului de
predare-învăţare".
Integrată procesului didactic, evaluarea presupune o „[...] activitate prin care sunt colectate,
asamblate şi interpretate informaţii despre starea, funcţionarea şi/sau evoluţia viitoare probabilă a unui
sistem (elev, profesor, unitate, şcolară, condiţii, sistem de învăţământ) activitate a cărei specificitate este
conferită de următoarele caracteristici esenţiale:
116
Metodica predării tehnicilor de programare pentru grupele de performanţă
117
Metodica predării tehnicilor de programare pentru grupele de performanţă
FUNCŢIILE EVALUĂRII
Rolul evaluatorului în evaluarea curentă precum şi în testări şi examinări se distinge clar de cel al
simplului profesor, acesta trebuind să asigure îndeplinirea întregului proiect educaţional. Pornind de la
planificarea evaluării în funcţie de resursele proprii, interne (motivaţii, interese, timp, disponibilităţi) şi
cele externe, evaluatorul parcurge etape care necesită pregătire intensă, cunoaştere, ajungând până la
faza de „iluminare" în crearea sarcinilor de lucru şi la aplicarea conştientă şi responsabilă asupra
educabilului, în plus el interpretează rezultatele, le analizează, sintetizează, clasifică şi asigură în final,
ameliorările necesare. Astfel el îndeplineşte motivat, conştient, riguros, activ şi interactiv, reglativ funcţiile
evaluării.
Pornind de la ideea că „scopul evaluării nu este de a parveni la anumite date, ci de a perfecţiona
procesul educativ" se pot face diverse clasificări ale funcţiilor evaluării.
118
Metodica predării tehnicilor de programare pentru grupele de performanţă
Vizând în principal obiectivele operaţionale care sunt formulate şi raportate la actul evaluării se
disting, pe scurt funcţiile:
a) constatativă (în urma adunării şi stocării datelor ce vor fi interpretate);
b) de diagnosticare (analiza datelor);
c) predictivă, de prognosticare (interpretarea datelor).
Referitor la o secvenţă de învăţare, asemănător celor de mai sus se pot distinge funcţiile:
a) verificarea, sau identificarea achiziţiilor şcolare;
b) perfecţionarea şi regularizarea căilor de formare a indivizilor, identificarea celor mai facile şi
mai pertinente căi de instrucţie şi educaţie;
c) sancţionarea sau recunoaşterea socială a schimbărilor operate asupra elevilor.
Forme de evaluare :
Evaluarea iniţială
119
Metodica predării tehnicilor de programare pentru grupele de performanţă
Evaluarea iniţială conduce la formarea unei imagini despre bagajul de cunoştinţe cu care elevul
porneşte la drum. Trebuie să ne asigurăm de ceea ce cunoaşte elevul înainte de a-l învăţa alte lucruri.
Această formă de verificare creează şi o imagine asupra posibilităţilor de progres ale elevului, asupra
capacităţii lui de învăţare, în funcţie de care se va stabili programul de instruire.
Evaluarea formativă (continuă)
Evaluarea formativă este forma de evaluare pe care profesorul o aplică pe întreaga durată a
programului de instruire în cadrul lecţiilor şi la încheierea unui capitol. Această formă de verificare oferă
permanent informaţii cu privire la eficienţa programului de instruire şi permite profesorului să ia cele mai
potrivite măsuri de prevenire a insuccesului şcolar, ajutând totodată la ameliorarea metodelor de predare-
învăţare. Verificarea ritmică oferă, pe baza mecanismului de feed-back continuu, semnalele necesare atât
elevului cât şi profesorului, fiind un veritabil metronom al activităţii didactice.
Examinarea prin probe practice este caracteristică disciplinelor cu pronunţat caracter aplicativ, iar
Informaticii cu atât mai mult. Ea se poate desfăşura în forme variate, de la realizarea de programe simple
sau editări de texte sau grafică pe durata unei ore, lucrându-se individual sau în grup, până la aplicaţii
complexe, realizate într-un interval mai lung de timp. Sunt verificate şi evaluate cunoştinţele teoretice
necesare realizării lucrării, cât şi deprinderile şi dexterităţile necesare executării ei.
Este necesară formarea la elevi a capacităţii de autoevaluare, prezentându-le criteriile de apreciere,
ceea ce va mari încrederea elevului în propriile sale forţe şi va înlătura orice urmă de suspiciune.
Examenele pot fi evaluări autentice, reale, extrem de utile. Se bazează pe programe de examen
stabilite anterior. Produc o evaluare cu caracter normativ, naţional (în cazul examenelor naţionale) şi
garantează protejarea oportunităţilor egale pentru toţi candidaţii, pe de o parte, precum şi asigurarea
calităţii (prin satisfacerea criteriilor de validitate şi fidelitate stabilite) pe de altă parte, având o miză
ridicată.
Evaluarea curentă
Poate acoperi o gamă mai largă de abilităţi şi competenţe şi o arie mai largă de conţinuturi decât
examenele, având în general şi o miză mai scăzută.
Evaluarea realizată prin metode complementare
Motivează elevii şi profesorii în integrarea creatoare a cunoştinţelor, demonstrează constructiv
înţelegerea şi capacitatea* de a dovedi abilităţi şi deprinderi achiziţionate în diverse perioade şcolare.
Obiectivul de evaluare este un enunţ sintetic, vizând rezultatele concrete ale procesului de învăţare
(asimilare, formare) ce trebuie demonstrate de către persoana evaluată. Fiind formulat în termenii
comportamentului observabil urmărit face posibil ca mai mulţi evaluatori să ajungă la aceeaşi judecată de
valoare referitoare la îndeplinirea, sau nu, a obiectivului. Din formularea obiectivului trebuie să rezulte
clar nivelul de performanţă necesar a fi atins de către cel evaluat şi condiţiile necesare atingerii acestei
performanţe. Obiectivele de evaluare se formulează pe baza operaţionalizării obiectivelor curriculare.
120
Metodica predării tehnicilor de programare pentru grupele de performanţă
După R F Mager[22] modelul de operaţionalizare simplificat presupune formularea unui astfel de enunţ
prin specificarea a trei elemente:
comportamentul necesar a fi demonstrat;
condiţiile în care se produce comportamentul
nivelul de performanţă dorit, sau criteriul de reuşită.
Precizarea comportamentului observabil se face în mod tradiţional folosind taxonomia lui B.S.
Bloom [23], care a asociat fiecărui nivel de complexitate a învăţării verbe de acţiune concrete:
Cunoaştere: să definească, să descrie, să identifice, să numească, să selecteze, să reproducă, să
enumere, etc.
Înţelegere: să transforme, să diferenţieze, să estimeze, să explice, să generalizeze, să exemplifice,
să parafrazeze, să rescrie, să rezume, să argumenteze, să extindă, etc.
Aplicare: să aplice, să calculeze, să înlocuiască, să schimbe, să descopere, să modifice, să prepare,
să producă, să indice, să rezolve, să utilizeze, să opereze, etc.
Analiză: să discrimineze, să descompună în componente, să diferenţieze, să identifice, să ilustreze,
să arate legăturile, să selecteze, să separe etc.
Sinteză: să clarifice, să combine, să compileze, să compună, să creeze, să elaboreze, să
organizeze, să planifice, să reconstruiască, să rezume, să combine etc.
Evaluare: să justifice, să argumenteze, să interpreteze, să aprecieze, să compare, să
concluzioneze, să critice, să descrie, să discrimineze, să explice, să rezume, etc.
Condiţiile de producere a comportamentului pot fi precizate prin formulări de tipul: oral, scris,
practic, dintr-o enumerare dată, pe baza textului din manual, dintr-un text la prima vedere, aplicând
regula (axioma, principiul, legea, etc.), cu ajutorul profesorului, folosind tabelul (harta, diagrama,
desenul) etc.
Criteriul de reuşită este precizat:
Cantitativ - prin precizarea limitei de timp, de dimensiune (lungime), numărului de exemple dorite,
procentul de realizare considerat satisfăcător (sau minim);
Calitativ - prin enunţuri de tipul: enumerând ideile principale, corect, sintetic, pe scurt, utilizând
limbajul ştiinţific adecvat, în ordine cronologică, în ordinea preferinţelor, pe baza unei anumite reguli, etc.
Strategiile de evaluare sunt diverse şi se împart în două mari categorii ale căror caracteristici sunt
evidenţiate pornind de la analiza comparativă a lui I.T.Radu în următorul tabel:
Cumulativă (sau sumativă) Continuă (sau formativă)
Se realizează prin verificări parţiale încheiate cu Se realizează prin verificări sistematice pe parcursul
aprecieri de bilanţ asupra rezultatelor programului pe secvenţe mici
Operează prin verificare prin sondaj în rândul Are loc prin verificarea tuturor elevilor şi asupra
121
Metodica predării tehnicilor de programare pentru grupele de performanţă
Utilizează o parte considerabilă din timpul Sporeşte timpul alocat instruirii prin diminuarea
alocat instruirii celui efectiv evaluării
Cele două strategii este avantajos să fie aplicate prin îmbinare şi complementaritate.
Criteriile care au condus prin îmbinare la această clasificare sunt:
1. Cantitatea de informaţie (sau experienţă) ce poate fi asimilată (dobândită) de către elevi
2. Perspectiva temporală
122
Metodica predării tehnicilor de programare pentru grupele de performanţă
INSTUMENTE DE EVALUARE
Rezultatele şcolare ale fiecărui elev se concretizează în efectele (rezultatele) învăţării personale.
Deoarece aceste efecte nu se pot măsura direct pentru că sunt constituite din comportamente formate
în sfera psihică a individului, apare necesitatea ca ele să fie exteriorizate şi traduse în mărimi
măsurabile. Aceste mărimi măsurabile nu sunt altele decât rezultatele probate de elevi şi care pun în
evidenţa nivelul de formare a comportamentelor dorite şi exprimate prin obiective pedagogice.
Deci, pentru obţinerea unor informaţii de evaluare şcolară sunt necesare următoarele acţiuni:
probarea de către elevi a nivelului la care au ajuns în realizarea obiectivelor pedagogice;
măsurarea rezultatelor probate;
evaluarea lor.
În ultimii ani se observă, mai ales în unele ţări dezvoltate, o schimbare de concepţie în cea ce
priveşte evaluarea curentă, în sensul dezvoltării a numeroase şi variate strategii evaluative, concretizate
în instrumente de evaluare care pot reprezenta alternative reale la testele standardizate sau forme
complementare, centrate pe obiectivele care nu pot fi evaluate prin testele clasice. Se constată chiar, în
unele sisteme de învăţământ, tendinţa de a se renunţa la notarea administrativa periodica în favoarea
unei aprecieri globale, care ia în consideraţie întregul complex de activităţi desfăşurate de elev în şcoală şi
în afara ei.
La nivelul profesorului evaluator schimbarea se manifestă mai ales în combinaţiile de metode de
evaluare, calitative şi cantitative, cu rol formativ mai accentuat, pe care acesta îşi întemeiază judecata de
valoare asupra activităţii şi achiziţiilor elevului. Evaluatorul „judecător” şi „sancţionator” se transformă din
ce în ce mai mult în „formator”.
123
Metodica predării tehnicilor de programare pentru grupele de performanţă
Profesorul care îşi propune să utilizeze această metodă pentru a obţine informaţii relevante asupra
activităţii elevilor săi, din perspectiva capacităţii lor de acţiune, relaţionare, a competenţelor şi abilităţilor
de care dispun, trebuie să utilizeze un instrumentar adecvat obiectului observării. Pentru a înregistra
aceste informaţii, profesorul are la dispoziţie în mod practic trei modalităţi:
fişa de evaluare (calitativă);
scara de clasificare;
lista de control/verificare.
Aceste instrumente se utilizează atât pentru evaluarea procesului, cât şi a produselor realizate de
către elevi, cu ajutorul lor putând fi surprinse atât obiectivări comportamentale ale domeniului cognitiv,
cât şi ale domeniului afectiv şi psihomotor.
Fişa de evaluare este completată de către profesor, în ea înregistrându-se date factuale despre
evenimentele cele mai importante pe care profesorul le identifică în comportamentul său în modul de
acţiune al elevilor săi (fapte remarcabile, probleme comportamentale, evidenţierea unor aptitudini
deosebite într-un domeniu sau altul etc.).
La acestea se adaugă interpretările profesorului asupra celor întâmplate, permiţându-i acestuia să
surprindă modelul comportamental al elevilor săi.
Un avantaj important al acestor fişe de evaluare este acela că nu depind de capacitatea de
comunicare a elevului cu profesorul, profesorul fiind cel care înregistrează şi interpretează
comportamentul tipic sau alte produse şi performanţe ale elevului.
Un dezavantaj îl constituie faptul că aceste observaţii nu au o cota ridicată de obiectivitate, ceea ce
are repercursiuni asupra fidelităţii acestor înregistrări. [23]
Scara de clasificare însumează un set de caracteristici (comportamente) ce trebuie supuse
evaluării, însoţit de un anumit tip de scară, de obicei scara Likert.
Exemplu:
Particip cu plăcere la activităţile organizate pe grupuri de lucru.
puternic dezacord dezacord neutru acord puternic acord
Secretul construirii unei astfel de scări îl constituie redactarea unui bun enunţ la care elevul să poată
răspunde.
Lista de control/verificare constată prezenţa sau absenţa unei caracteristici, comportament
etc., fără a emite o judecată de valoare oricât de simplă.
Exemplu:
Elevul:
a urmat instrucţiunile specifice activităţii; Da Nu
a cerut ajutor atunci când a avut nevoie; Da Nu
a colaborat cu ceilalţi colegi pentru a realiza produsul final; Da Nu
a finalizat sarcina de lucru; Da Nu
a făcut ordine pe masa de lucru; Da Nu
INVESTIGAŢIA
124
Metodica predării tehnicilor de programare pentru grupele de performanţă
Oferă posibilitatea elevului de a aplica în mod creativ cunoştinţele însuşite, în situaţii noi şi variate,
pe parcursul unei ore sau a unei succesiuni de ore de curs. Această metodă:
reprezintă o situaţie problemă care nu are o rezolvare simplă;
deşi sarcina poate fi scurtă, timpul de rezolvare este relativ lung
începe, se desfăşoară şi se termină în clasă;
poate fi individuală sau de grup.
Obiectivele care se urmăresc:
înţelegerea şi clarificarea sarcinii;
găsirea procedeelor pentru obţinerea de informaţii;
colectarea şi organizarea datelor sau informaţiilor necesare;
formularea şi testarea ipotezelor de lucru;
schimbarea planului de lucru sau colectarea altor date dacă este necesar;
explicarea metodelor folosite în investigaţie;
scrierea unui scurt raport privind rezultatele investigaţiei.
Caracteristici personale (ale elevilor) urmărite:
creativitate şi iniţiativă;
participarea în cadrul grupului;
cooperarea şi preluarea conducerii/iniţiativei în cadrul grupului;
persistenţă;
flexibilitate în gândire şi deschidere către idei noi;
dorinţa de generalizare.
PROIECTUL
Necesită o activitate amplă care evaluează elevul pe nivele superioare urmărindu-se capacitatea
acestuia da a selecta, utiliza, bibliografia, experimenta, realiza, prezenta documentaţia care cuprinde
soluţia şi reprezentări grafice, organizarea conţinutului şi prezentării într-un referat, munca în echipă cu
distribuirea sarcinilor, calitatea prezentării scrise şi exprimate, calitatea materialului exprimat în limbaj
grafic convenţional, puterea de convingere în argumentarea soluţiei date etc.
Proiectul:
începe în clasă prin definirea şi înţelegerea sarcinii - eventual şi prin începerea rezolvării
acestuia;
se continuă acasă pe parcursul a mai multor zile sau săptămâni, timp în care elevul se
consultă permanent cu profesorul;
se încheie tot în clasă, prin prezentarea în faţa colegilor a unui raport asupra rezultatelor
obţinute şi, dacă este cazul, a produsului realizat;
poate fi realizat individual sau în grup.
PORTOFOLIUL
125
Metodica predării tehnicilor de programare pentru grupele de performanţă
AUTOEVALUAREA
Participarea elevilor la atribuirea notelor le permite acestora să conştientizeze criteriile de apreciere
şi să ajungă la imaginea de sine, să fie conştienţi de progresele înregistrate, de eforturile care li se cer
pentru atingerea obiectivelor propuse.
Tehnicile folosite în scopul formării şi dezvoltării capacităţii de autoevaluare la elevii pot fi grupate
astfel:
înţelegerea de către elevi a criteriilor de apreciere după care se conduce profesorul;
autonotarea controlată, în care elevul îşi face propunerea de nota, aceasta fiind revăzută şi
definitivată de profesor;
126
Metodica predării tehnicilor de programare pentru grupele de performanţă
FIŞE DE LUCRU
Criterii de utilizare eficientă:
Fişele sunt abordate ca mijloace de învăţământ, ca instrumente utile învăţării.
Pot fi utilizate în toate etapele lecţiei, formele învăţării, nivele de operaţionalizare a obiectivelor.
Răspunsul poate fi direct pe fişa sau în caietul de notiţe, în clasă sau acasă.
Este necesar a se preciza, în scris sau oral, indicaţiile de lucru; după nivelul elevilor se pot însuma
şi ordona, pe module, teme, lecţii.
Se pot grupa în fişiere tematice, cu accesul liber al elevilor, cu rezolvarea lor independenta, fără
sprijin.
Pot fi utilizate ca fise de evaluare dacă elevul nu primeşte material sau indicaţii suplimentare.
Se pot aplica individual sau în grup.
FIŞA DE LUCRU FIŞA DE EVALUARE
nu se dă timpul de rezolvare decât orientativ; se indică timpul total
se abordează total interdisciplinar
127
Metodica predării tehnicilor de programare pentru grupele de performanţă
TESTELE DE EVALUARE
Testul reprezintă un instrument de evaluare folosit în general în sensul de test şcolar şi cu orientări
specifice de genul: test de cunoştinţe, de aptitudini, de dezvoltare mintală, de comportament etc.
Prelucrând clasificarea tipurilor de teste de cunoştinţe relevate de P.Lisievici se poate face
clasificarea:
Criteriu Tipuri de teste Caracteristici
Utilizate în perioada preştiinţifică a evaluării vizează structuri
Integrative
integrate de cunoaştere, înţelegere, aplicare
128
Metodica predării tehnicilor de programare pentru grupele de performanţă
129
Metodica predării tehnicilor de programare pentru grupele de performanţă
Proiectarea testului:
1. Precizarea obiectivelor;
2. Documentarea ştiinţifică necesară;
3. Avansarea unor ipoteze (conceperea şi/sau selecţionarea problemelor reprezentative);
130
Metodica predării tehnicilor de programare pentru grupele de performanţă
Experimentarea testului
Aplicarea cu scopul de a-l perfecţiona;
a) Analiza rezultatelor şi ameliorarea testului
b) Aplicarea efectivă a testului
3. Itemi subiectivi
de tip rezolvare de problemă
de tip redactare de text
de tip analiză, rezumat, sinteză, schematizare etc.
131
Metodica predării tehnicilor de programare pentru grupele de performanţă
de tip creaţie.
Un alt tip de clasificare ţine cont de criterii cum ar fi :natura sarcinii de lucru dată elevului, după
prezenţa materialelor auxiliare, după modul de transmitere-comunicare a sarcinilor, respectiv răspunsului
obţinut:
132
Metodica predării tehnicilor de programare pentru grupele de performanţă
133
Metodica predării tehnicilor de programare pentru grupele de performanţă
CONCLUZII
134
Metodica predării tehnicilor de programare pentru grupele de performanţă
Datorită implicaţiei pe care Informatica o are azi în toate profesiile, rezultă caracterul ei
interdisciplinar. Informatica nu poate fi privită numai ca o disciplină independentă şi nu poate fi ţinută
între bariere create artificial.
Elevii trebuie să înţeleagă conexiunile dintre Informatică şi societate şi să fie capabili să se
adapteze dinamicii schimbărilor determinate de aceste conexiuni.
Alegerea temei are la bază interesul crescut al elevilor pentru pregătirea în cadrul grupelor de
performanţă.
Conţinutul lucrării se adresează elevilor care sunt doritori de cunoştinţe suplimentare programei
şcolare, elevilor care doresc să înveţe mai repede şi să atingă performanţă în informatică, cu precădere în
algoritmică şi programare.
Elevii cărora le place programarea pot participa la o serie de concursuri, simpozioane, tabere,
olimpiade şcolare unde pot învăţa şi pot arăta ceea ce ştiu. Prima condiţie pe care un elev trebuie s-o
îndeplinească pentru a avea succes la aceste concursuri este să fie în stare să gândească singur.
Lucrarea îşi propune să dezvolte gândirea algoritmică şi noi abilităţi de a implementa algoritmi prin
numeroasele aplicaţii rezolvate, cu explicaţii detaliate şi implementări.
135
Metodica predării tehnicilor de programare pentru grupele de performanţă
BIBLIOGRAFIE
[1] R. Bellman, Dynamic Programming, Princeton University Press, 1957
[2] C. Boehm, Corrado, G. Jacopini , Flow Diagrams, Turing Machines, and Languages
with only Two Formation Rules, Communications of the ACM 9, 1966.
[3] G. Brassard, P. Bratley, Algorithmics: Theory and Practice, Prentice-Hall, 1998
[4] Thomas H.Cormen, Charles E.Leiserson, Ronald R.Rives, Introducerea în algoritmi, ed.
Agora, Cluj 2001
[5] E. Cerchez, M. Şerban, Programarea în limbajul C++. Metode şi tehnici de
programare, ed. Polirom, 2006
[6] E. Cerchez, Informatică. Culegere de probleme pentru liceu, ed. Polirom, 2002
[7] M. Dragan, L. Cucu, T. Jebelean, V. Negru, Delaunay Triangulation Using Divide-and-
Conquer , Timişoara
[8] M. Dragan, T. Jebelean, Efficient parallelization of long integer arithmetic using
Karatsuba Method , ALGORITMY2000 (15th Conference on Scientific Computing) , 10-15
Sept. 2000, Podbanske, Slovakia
[9] E.W. Dijkstra, Note on Structured Programming, Technological University
Eindhoven, The Netherlands, 1969
[10] O. Dogaru, Gh.Bocşan,…, Informatică pentru definitivat şi grad , Editura de Vest,
Timişoara, 2000
[11] C. Frâncu, Psihologia concursurilor de informatică, ed. L&S Info-mat, 1997
[12] H. Georgescu, Tehnicii de Programare, Bucureşti, 1999
[13] Ginfo, Gazeta de Informatică, 1994-2006
[14] E. Horowitz, S. Sahni, Sanguthevar Rajasekaran, Computer Algorithms in C++, New
York, 1996
[15] C. Ionescu, A. Bălan, Informatică pentru grupele de excelenţă, ed. Dacia, 2005
[16] D. E.Knuth, Arta programării calculatoarelor vol. 1, 2, 3, ed. Teora 2000
[17] D. Lica, M. Paşoi, Informatică. Fundamentele Programării, ed. L&S Info-mat, 2005
[18] L. Livovschi, H. Georgescu, Sinteza şi analiza algoritmilor , ed. Ştiinţifică şi
Enciclopedică, Bucureşti, 1986
[19] D. Luncan, Bazele proiectării programelor şi algoritmilor, Iaşi, 1996
[20] M. Olteanu, Proiectarea şi Implementarea algoritmilor, ed. Agora, 2000
[21] T. Sorin, Tehnici de programare, ed. L&S Infomat, 1997
[22] M. Stoica, Sinteze de pedagogie şi psihologie, ed. Universitaria, Craiova, 1992
136
Metodica predării tehnicilor de programare pentru grupele de performanţă
[23] S.N.E.E., Ghid de evaluare, Informatică şi Tehnologia Informaţiei , ed. Aramis, 2001
[24] www.infoarena.devnet.ro
[25] www.liis.ro/campion
137