Conceptul de dată [303361]
CAPITOLUL I – INTRODUCERE
I.1. [anonimizat], se desemnează un model de reprezentare a informației, model cu care se poate opera pentru a [anonimizat].
Conceptul de dată
O dată care apare ca o entitate indivizibilă atât din punct de vedere al informației pe care o reprezintă cât și din punct de vedere al procesorului care o prelucrează se numește dată elementară sau scalară.
Identificatorul datei este un simbol asociat acesteia pentru a o putea distinge de alte date și pentru a o putea referi în cadrul programului respectiv.
Atributele sunt proprietăți ale datei și precizează modul în care aceasta va fi tratată în cadrul procesului de prelucrare. [anonimizat] o [anonimizat].
Valorile datei pot fi precizate prin enumerare (tipul de enumerare în Pascal) sau printr-o proprietate comună. [anonimizat], etc.
[anonimizat] s-a definit o anumită organizare menită să faciliteze prelucrarea. Gruparea unor date sub un singur nume a fost necesară încă de la începuturile programării calculatoarelor.
O colecție de date pe care s-a definit o anumită organizare, o [anonimizat].
Componentele unei structuri de date pot fi identificate prin nume (selecția prin nume) sau prin ordinea pe care o ocupă în cadrul structurii în conformitate cu structura existentă.
Dacă accesul la o anumită componentă a [anonimizat]. Un exemplu este cazul unui tablou de elemente la care se poate accesa oricare element prin poziția sa în cadrul tabloului.
[anonimizat] o componentă a structurii se face ținând cont de alte câmpuri ale structurii în conformitate cu ordinea structurii (printr-un proces de traversare) atunci structura este cu acces secvențial (este cazul unui fișier text).
[anonimizat], în caz contrar este implicită. Structura de date de tip tablou este o structură implicită; listele liniare simplu înlănțuite sunt structuri explicite de date.
Asupra structurilor de date se pot efectua mai multe operații care se referă la valorile datei și/sau la structură.
Cele mai frecvente operații pot fi:
– operația de creare care constă în memorarea pe suportul de memorie a structurii de date în forma sa inițială;
– operația de consultare care constă în accesul la elementele structurii în vederea prelucrării valorilor acestora;
– [anonimizat] a structurii de date;
– [anonimizat]-o anumită ordine precizată de valorile date;
– operația de descompunere care constă în descompunerea unei structuri de date în două sau mai multe structuri;
– operația de fuzionare – combinarea a două sau mai multe structuri la fel ordonate în una singură;
– operația de copiere – realizarea unei copii a structurii de date, de regulă pe un alt suport de memorie.
Operațiile care pot fi efectuate asupra unei structuri de date și eficiența cu care acestea pot fi utilizate depind în mare măsură de natura relațiilor de ordonare și modul în care acestea sunt ordonate pe suport. Din acest punct de vedere, operațiile constituie element distinctiv al unei structuri de date, deci o proprietate a structurii.
Toate structurile de date la fel organizate și pe care s-au definit aceleași operații, poarta numele de tip de structură de date.
Prin tip de structură de date se înțelege o colecție de date (ordonată) pe care s-a definit un grup de operații de bază cu o anumită semantică. Cele mai avansate metode de structurare de bază sunt tablourile și structurile.
Structurile avansate de date nu se descriu ca structuri statice deoarece ele se generează în mod dinamic în timpul procesului de prelucrare – se vor numi structuri dinamice de date.
Pentru a veni în sprijinul programatorilor, limbajele de programare evoluate (de exemplu Pascal, C) pun la dispoziția acestora posibilitatea organizării datelor în anumite "șabloane" numite tipuri de date. Mai precis, prin tip de date se înțelege:
• o mulțime de valori;
• o regulă de codificare a acestora;
• o mulțime de operații definite pe mulțimea datelor.
La rândul lor, tipurile de date pot fi:
• simple – descriu date care aparțin unor mulțimi care nu sunt rezultate ca produs cartezian al altor mulțimi. Exemplu: integer (Pascal), respectiv int (C).
• structurate – descriu date care aparțin unor mulțimi rezultate ca produs cartezian al altor mulțimi.
Clasificarea structurilor de date
I. Structuri de date elementare:
– tablouri (vectori, matrice, șiruri de caractere);
– înregistrare;
– fișiere.
II. Structuri de date dinamice:
– structura de tip listă (listă simplu înlănțuită, dublu înlănțuită, circulară, stivă, coadă);
– structura de tip arbore: arbori binari, arbori binari de căutare, arbori oarecare.
III. Structuri de tip graf:
– grafuri neorientate;
– arbori;
– grafuri orientate.
Prima structură de date folosită a fost structura de vector (tabel), utilizată în operațiile de sortare (de ordonare) a colecțiilor și prezentă în primele limbaje de programare pentru aplicații numerice (Fortran și Basic).
Un vector este o colecție de date de același tip, în care elementele colecției sunt identificate prin indici ce reprezintă poziția relativă a fiecărui element în vector.
La început se puteau declara și utiliza numai vectori cu dimensiuni fixe, stabilite la scrierea programului și care nu mai puteau fi modificate la execuție.
Introducerea tipurilor pointer și alocării dinamice de memorie în limbajele Pascal și C a permis utilizarea de vectori cu dimensiuni stabilite și/sau modificate în cursul execuției programelor.
I.2. Descrierea capitolelor lucrării
CAPITOLUL II – FUNDAMENTE TEORETICE DESPRE STRUCTURILE DE DATE BIDIMENSIONALE
II.1. Interpretarea matematică a tablourilor bidimensionale
Definiție: Se numește matrice cu m linii și n coloane o funcție
.
Altfel spus, se numește matrice cu m linii și n coloane (de tip ) un tablou cu m linii și n coloane:
, ale cărui elemente sunt numere din mulțimea suport, care poate fi mulțimea numerelor naturale (), mulțimea numerelor întregi (), mulțimea numerelor raționale (), mulțimea numerelor reale () sau mulțimea numerelor naturale ().
Mulțimea matricelor de tip cu elemente numere reale se notează prin
Cazuri particulare:
Matrice linie: O matrice de tipul (deci cu 1 line și n coloane) se numește matrice linie și are forma:
Matrice coloană: O matrice de tipul (deci cu m lini și 1 coloană) se numește matrice coloană și are forma:
Matrice nulă (zero): O matrice care are toate elementele egale cu 0:
Matrice pătrată: O matrice pentru care numărul de linii este egal cu numărul de coloane:
Sistemul de elemente se numește diagonală principală a matricei A.
Matricea unitate: pe diagonala principală are toate elementele egale cu 1, iar în rest sunt egale cu 0).
Egalitatea a două matrice
Definiție: Fie două matrice . Se spune că ele sunt egale și se scrie dacă .
Transpusa unei matrice
Definiție: Fie matricea Transpusa matricei A este unde
Matrice simetrică
Definiție: Fie matricea pătratică . Spunem că matricea este simetrică dacă este egală cu transpusa ei: .
Operații cu matrice:
Adunarea matricelor:
Fie , , . Matricea se numește suma matricelor și , dacă ,
Figura 1: Adunarea matricelor
Observații: Două matrice se pot aduna dacă sunt de același tip, adică dacă au același număr de linii și același număr de coloane.
Proprietăți ale adunării matricelor:
a.1. Asociativitatea adunării
unde A, B și C .
a.2. Comutativitatea adunării
unde A, și B .
a.3. Element neutru
Adunarea matricelor admite matricea nulă ca element neutru, adică:
a.4. Elemente opuse
Orice matrice are un opus, notat , astfel încât:
Înmulțirea cu scalari a matricelor
Fie și . Se numește produsul dintre scalarul și matricea , matricea , definită prin .
A înmulți o matrice cu un scalar este echivalent cu a înmulți toate elementele matricei cu acest scalar, astfel:
Proprietăți ale înmulțirii matricelor cu scalari:
b.1.
b.2.
b.3.
b.4.
Înmulțirea matricelor
Fie . Produsul dintre matricele A și B, în această ordine, notat AB, este matricea , definită prin:
Figura 2: Înmulțirea matricelor
Observații:
1. Produsul AB a două matrice nu se poate efectua întotdeauna, decât dacă , , adică numărul de coloane al matricei A este egal cu numărul de linii al matricei B, când se obține o matrice C = AB
2. Dacă matricele A și B sunt pătrate, atunci are sens întotdeauna atât AB, cât și BA, iar în general , înmulțirea matricelor nefiind comutativă.
Proprietățile înmulțirii matricelor
c.1. Asociativitatea înmulțirii Înmulțirea matricelor este asociativă:
, .
c.2. Distributivitatea înmulțirii față de adunare Înmulțirea matricelor este distributivă în raport cu adunarea:
matrice pentru care au sens operațiile de adunare și înmulțire.
c.3. Element neutru Dacă este matricea unitate, atunci:
. este element neutru.
Determinanți
Dacă este o matrice pătrată cu elemente din K, atunci numărul
se numește determinantul lui A.
Proprietățile determinanților
Determinantul unei matrice A este egal cu determinantul matricei transpuse tA:
Dacă într-o matrice pătratică se schimbă între ele două linii (sau coloane) se obține o matrice care are determinantul egal cu opusul determinantului matricei inițiale.
Dacă elementele unei linii (sau coloane) a matricei A se înmulțesc cu un număr k, se obține o matrice B, al cărei determinant este egal cu .
Dacă elementele unei linii (sau coloane) dintr-o matrice pătratică sunt nule, atunci determinantul matricei este nul.
Dacă o matrice are două linii (coloane) identice, atunci determinantul ei este nul.
Urma unei matrice pătratice
Fie Suma elementelor de pe diagonala principală se numește urma matricei A, notată:
.
Fie două matrice pătratice, iar , atunci:
Rangul unei matrice
Definiție: Se numește minor de ordin k al matricei A, determinantul matricei extrase din matricea A, ale cărui elemente se găsesc la intersecția a k coloane diferite și k linii diferite.
Definiție: Rangul matricei A, notat rang(A), este dat de cel mai mare dintre ordinele minorilor nenuli ai matricei A.
Altfel spus, fie . Se numește rangul matricei A numărul natural r cu proprietățile:
Există un minor de ordinul r al lui A nenul;
Toți minorii de ordinul r+1 (dacă există) sunt nuli.
Observații:
Rangul matricei nule este prin definiție egal cu 0.
Dacă matricea are cel puțin un element diferit de zero, rangul acesteia este cel puțin 1.
Inversa unei matrice
Fie o matrice pătratică. Matricea A este inversabilă dacă și numai dacă este diferit de 0. Matricea inversă a matricei A este dată de formula:
unde A* (matricea adjunctă a matricei A) se obține înlocuind fiecare element al matricei tA (transpusa matricei A) cu complementul său algebric: fiind minorul elementului din tA (determinantul obținut din tA prin eliminarea liniei i și coloanei j).
Transformare elementară
Se numește transformare elementară a unei matrice orice dintre următoarele transformări:
Schimbarea a două linii (sau coloane) între ele;
Înmulțirea elementelor unei linii (sau coloane) cu un număr real nenul;
Adunarea la elementele unei linii (coloane) a elementelor altei linii înmulțite cu același număr.
Sisteme liniare
Fie sistemul
Acesta se poate rescrie folosind matrice:
, ,
Sistemul se scrie
Matricea se numește matricea lărgită (extinsă).
Teorema Kronecker-Capelli: Sistemul este compatibil dacă și numai dacă
.
Consecințe:
Sistemul este compatibil unic determinat dacă și numai dacă rangul matricei coincide cu rangul matricei lărgite și cu numărul de necunoscute, adică
Dacă , sistemul este compatibil nedeterminat.
Definiție: Fie matricea are rangul și un minor de ordin . Se numește determinant caracteristic un determinant obținut prin bordarea lui cu coloana termenilor liberi și cu una dintre liniile rămase.
Definiție: Dacă , sistemul se numește omogen. Astfel, forma generală este
Un sistem omogen este totdeauna compatibil.
Consecințe:
Sistemul omogen este compatibil unic determinat dacă și numai dacă rangul matricei coincide cu numărul de necunoscute, adică .
Dacă sistemul este compatibil nedeterminat.
Dacă , se obține:
Sistemul este compatibil unic determinat dacă și numai dacă
Sistemul este compatibil nedeterminat dacă și numai dacă = 0.
II.2. Noțiuni elementare – definiții, clasificări
Tablouri
Definiție: Un tablou de elemente reprezintă o structură de date alcătuită din mai multe variabile din același tip de date.
Tablourile pot fi :
tablouri unidimensionale (vectori);
tablouri bidimensionale (matrice);
tablouri multidimensionale.
Structura de tip tablou impune ca elementele să fie așezate în memorie în succesiune continuă de octeți, fiecare componentă ocupând același număr de octeți cât specifică tipul de baza.
Indicele este o valoare ordinală care identifică în mod unic o componentă (un element) a tabloului.
Prelucrarea unui tablou se bazează, în general, pe execuția unor operații asupra componentelor sale. Operațiile sunt cele permise de tipul de bază al tabloului.
Pentru definirea unui tablou este necesar să se știe numărul maxim de componente care pot apărea în prelucrările din cadrul problemei, în scopul declarării corecte a spațiului pe care îl va ocupa acesta.
Tablouri unidimensionale
Definiție: Tablourile unidimensionale sunt alcătuite dintr-un grup de elemente de același tip (numit tip de bază) și sunt referite printr-un nume comun. Tablourile sunt stocate în memorie la locații consecutive, un tablou ocupând o zonă contiguă de memorie, cu primul element al tabloului aflat la adresa cea mai mică.
Variabilele de tip tablou se declară astfel:
nume_tip nume_var[dimensiune];
unde:
nume_tip este tipul elementelor;
nume_var este numele tabloului;
dimensiune este numărul maxim de elemente.
Figură 3: Memorarea și accesul elementelor tablourilor unidimensionale
Inițializarea elementelor unui tablou se poate face în următoarele moduri:
v[0] = 21;
v[1] = 23;
v[2] = 27;
v[3] = 12;
sau:
int v[4] = { 21, 23, 27, 12 };
În limbajul C++, un tablou se poate inițializa și fără dimensiune:
int d[] = { 1, 4, 6, 3 };
În limbajul C++, numerotarea elementelor unui tablou începe cu poziția 0. Astfel, dacă avem definiția:
int tablou[10];
atunci primul element al tabloului este tablou[0], iar ultimul element al tabloului este tablou[9].
Accesarea unui element al unui tabloului se face folosind ca index poziția elementului. Astfel, tablou[3] va referi al 4-lea element al tabloului tablou.
Cantitatea de memorie necesară pentru memorarea unui tablou este determinată de tipul și numărul elementelor tabloului. Pentru un tablou unidimensional, cantitatea de memorie ocupată se calculează astfel:
mem_ocupată = dimensiune_octeți (a tipului elementelor) * mărime_tablou.
Tablouri multidimensionale
Din punct de vedere semantic, tablourile multidimensionale sunt “tablouri de tablouri”.
Un tablou multidimensional se declară în modul următor:
nume_tip nume_tablou[dim_1][dim_2]…[dim_n]
unde:
nume_tip este tipul elementelor;
nume_tablou este numele tabloului;
dim_1 … dim_n este numărul maxim de elemente ale fiecărui tablou.
Cantitatea de memorie ocupată se calculează astfel:
mem_ocupată = dim_1* dim_2* … * dimensiune_octeți (a tipului elementelor).
Elementele tabloului multidimensional sunt memorate astfel încât ultimul indice variază cel mai rapid.
Selectarea unui element dintr-un tablou multidimensional se realizează în felul următor:
nume_tablou [ind_1] [ind_2] … [ind_n]
unde ind_1, ind_2, …, ind_n sunt valori cuprinse între 0 și dim_1, dim_2, …, respectiv dim_n.
Tablouri bidimensionale
Definiție: Se numește matrice cu m linii și n coloane (de tip ) un tablou cu m linii și n coloane:
.
Un tablou bidimensional (matrice) este o colecție de date de același tip, dispuse sub formă de linii și coloane.
Un tablou bidimensional are două dimensiuni, orizontală și verticală, și este definit prin dimensiune maximă pe orizontală – număr maxim de linii și dimensiune maximă pe verticală – număr maxim de coloane. Liniile și coloanele sunt numerotate cu numere întregi, pornind de la 0.
Figură 4: Memorarea elementelor tablourilor unidimensionale
Este posibilă inițializarea unei matrice la definirea ei, iar elementele care nu sunt inițializate explicit primesc valoarea zero.
Prelucrarea elementelor unei matrice se face prin două cicluri; un ciclu repetat pentru fiecare linie și un ciclu pentru fiecare coloană dintr-o linie. Numărul de cicluri incluse poate fi mai mare dacă la fiecare element de matrice se fac prelucrări repetate. De exemplu, la înmulțirea a două matrice A și B, fiecare element al matricei rezultat c se obține ca o sumă.
În memorie, tablourile sunt reținute pe linii. Aceasta înseamnă că la început este memorată prima linie, apoi a doua etc.
Operațiile de bază cu matrice
Declararea
Presupune indicarea tipului de date, a numărului maxim de linii și a numărului maxim de coloane, pentru a se putea aloca suficientă memorie.
Dimensiunea memoriei ocupate este:
mem_ocupată = dim_1* dim_2* dimensiune_octeți (a tipului elementelor)
Accesarea (selecția) elementelor
Selectarea unui element dintr-o matrice se realizează astfel:
nume_tablou[ind1][ind2]
De exemplu, notația A[i][j] desemnează elementul aflat la intersecția dintre linia i și coloana j a unei matrice A, sau, altfel spus, elementul din poziția j din vectorul A[i].
Citirea elementelor
Se realizează cu ajutorul a două instrucțiuni for, una pentru parcurgerea liniilor și una pentru parcurgerea coloanelor.
Figură 5: Citirea elementelor (exemplificare pentru o matrice cu 5 linii și 5 coloane)
Afișarea elementelor
Se realizează cu ajutorul a două instrucțiuni for, una pentru parcurgerea liniilor și una pentru parcurgerea coloanelor.
La sfârșitul afișării unei linii, deci când toate coloanele de pe o linie au fost afișate, se afișează o linie nouă. Astfel, elementele matricei se afișează sub forma matriceală.
II.3. Proprietăți ale tablourilor bidimensionale
Cazuri speciale de matrice
Matrice-linie
Elementele acestui tablou sunt stocate într-o singură linie – asemenea unui tablou unidimensional (vector). În acest caz, indicele corespunzător liniei este 0, variind indicele corespunzător coloanei.
Matrice-coloană
Elementele acestui tablou sunt stocate într-o singură coloană. În acest caz, indicele corespunzător liniei variază, iar indicele corespunzător coloanei este 0.
În cazul acestor două tipuri de matrice, nu mai este necesară utilizarea a două cicluri, având în vedere că doar un indice variază. Astfel, parcurgerea acestora (citire, afișare, prelucrare) utilizează un singur ciclu.
Matrice nulă
Este matricea care are toate elementele egale cu 0.
Matrice pătratică
Este un caz particular, în care numărul de linii este egal cu numărul de coloane. În cazul acestui tip de matrice, apar proprietăți specifice.
Figură 6: Memorarea elementelor tablourilor unidimensionale
(exemplificare pentru o matrice cu 5 linii și 5 coloane)
Proprietăți specifice matricelor pătratice
Fie matricea pătratică A, cu n linii și n coloane.
Diagonala principală
Elementele a[0][0], a[1][1], …, a[n-1][n-1] formează diagonala principală.
Figură 7: Diagonala principală (exemplificare pentru o matrice cu 5 linii și 5 coloane)
Proprietatea acestor elemente este că ele se află pe linia și coloana cu același număr de ordine, deci i=j.
Diagonala secundară
Elementele a[0][n-1], a[1][n-2], …, a[n-1][0] formează diagonala secundară.
Figură 8: Diagonala secundară (exemplificare pentru o matrice cu 5 linii și 5 coloane)
Proprietatea acestor elemente este i+j=n-1, deci j=n-1-i.
Zonele de deasupra și de sub diagonale
3.a. Pentru diagonala principală, elementele de deasupra acesteia au proprietatea că i<j, iar cele de sub aceasta au proprietatea că i>j.
3.b. Pentru diagonala secundară, elementele de deasupra acesteia au proprietatea că i+j<n-1, iar cele de sub aceasta au proprietatea că i+j>n-1.
Triunghiurile
Cele două diagonale formează patru „triunghiuri” de elemente.
4.a. Triunghiul superior
Triunghiul superior este dat de elementele aflate deasupra celor două diagonale. Relația indicilor pentru aceste elemente este: i<j și i+j<n-1.
Figură 9: Triunghiul superior (exemplificare pentru o matrice cu 5 linii și 5 coloane)
4.b. Triunghiul inferior
Triunghiul inferior este dat de elementele aflate sub cele două diagonale. Relația indicilor pentru aceste elemente este: j<i și i+j>=n.
Figură 10: Triunghiul inferior (exemplificare pentru o matrice cu 5 linii și 5 coloane)
4.c. Triunghiul din stânga
Triunghiul din stânga este dat de elementele aflate sub diagonala principală, dar deasupra diagonalei secundare. Relația indicilor pentru aceste elemente este: j<i și i+j<n-1.
Figură 10: Triunghiul din stânga (exemplificare pentru o matrice cu 5 linii și 5 coloane)
4.d. Triunghiul din dreapta
Triunghiul din dreapta este dat de elementele aflate sub diagonala secundară, dar deasupra diagonalei principale. Relația indicilor pentru aceste elemente este: i<j și i+j>=n.
Figură 11: Triunghiul din dreapta (exemplificare pentru o matrice cu 5 linii și 5 coloane)
Vecinii unui element
În practică, se utilizează de multe ori noțiunea de vecin al unui element al matricei.
Un element din matrice, în funcție de poziția sa, are 3, 5 sau 8 vecini. Pentru a nu verifica poziția elementului, se bordează matricea (cu o valoare dependentă de problema care se rezolvă, se adaugă o linie sus, o linie jos, o coloană la stânga, o coloană la dreapta), astfel toate elementele vor avea 8 vecini.
Dacă însă deplasarea se realizează doar pe linie și pe coloană, elementul va avea doar 4 vecini.
Matricea rară
Matricea rară reprezintă un tip special de structură bidimensională formată dintr-un număr foarte mare de elemente din care o pondere foarte mare o ocupă elementele nule. Astfel, declararea clasică a unei matrice conduce la utilizarea inutilă a memoriei prin stocarea valorilor nule și a capacității de procesare.
Declararea unei structuri de date de tip matrice rară se bazează pe următoarele elemente:
Valori nenule;
Poziția valorilor nenule în cadrul structurii bidimensionale.
Avantaje ale utilizării matricelor rare:
Reducerea cerințelor de utilizare a memoriei;
Reducerea timpului de procesare prin eliminarea operațiilor inutile cu valori nule.
Dezavantaje ale utilizării matricelor rare:
Spațiu de memorie necesar stocării matricei rare mult mai mare dacă numărul de valori nenule nu este mult mai mic de numărul de valori nule;
Implementare mai dificilă a operațiilor la nivel de matrice datorită modului de acces indirect prin structura de date definită pentru stocarea matricei rare.
Structuri de stocare a matricelor rare:
Trei vectori pentru stocarea valorilor indicelui de linie, indicelui de coloană și a valorii nenule; în forma liniarizată, primii doi vectori se înlocuiesc cu indexul liniarizat;
Structură de tip articol cu următoarele câmpuri: indice de linie, indice de coloană și valoarea nenulă; articolele sunt stocate într-un vector sau listă liniară;
Vector pe biți pentru marcarea poziției elementului nenul în matricea liniarizată și un vector pentru stocarea valorilor nenule.
Structurile bidimensionale cu un număr foarte mare de valori nule sunt stocate sub forma de matrice rare dacă valorile nule ocupă între 0,15% și 3% din numărul total de elemente al matricei.
II.4. Implementarea tablourilor bidimensionale în limbajele de programare
Având în vedere utilitatea matricelor în transpunerea algoritmilor în programe, tablourile bidimensionale pot fi implementate în multiple limbaje de programare.
Tabloul ocupă în memoria calculatorului o „suprafață” (array) compusă din locații învecinate (adiacente). În fiecare locație este memorată valoarea unui element. Adresa locațiilor începe de la o valoare de referință specifică limbajului de programare (corespunzătoare primei linii) și se construiește prin valori succesive (corespunzătoare coloanelor de pe linie), pentru fiecare element din tablou. În memoria calculatorului, tabloul este liniarizat: elementele sunt memorate în locații adiacente, în ordinea liniilor. Adresarea unui element se face printr-o pereche de indici corespunzători liniei și coloanei pe care se află elementul respectiv.
Implementarea matricelor în limbajul C++
Declararea matricei
Declararea matricelor se realizează astfel:
tip_de_bază nume_matrice [nr_max_linii] [nr_max_coloane];
unde:
tip_de_bază – tipul de date al elementelor matricei;
nume_matrice – numele tabloului;
nr_max_linii, nr_max_coloane – numărul maxim de linii, respectiv de coloane.
Exemplu: int mat[20][25]; – este declarată matricea mat, având ca elemente numere întregi, cu maxim 20 linii și 25 coloane.
Accesarea elementelor
Fie următoarea matrice:
Figură 12: Accesarea elementelor
Liniile matricei sunt numerotate de la 0 la m-1, iar coloanele sunt numerotate de la 0 la n-1.
Un element se accesează cu ajutorul numărului liniei și numărului coloanei.
Exemplu: elementul a[2][1] are valoarea -43.
Inițializarea elementelor
Un element se inițializează astfel: a[i][j] = valoare
Citirea elementelor
Pentru citirea unei matrice, de la tastatură sau dintr-un fișier de date, se utilizează două instrucțiuni for.
for (i=0; i<m; i++)
for (j=0; j<n; j++)
cin>>a[i][j];
Afișarea elementelor
Pentru afișarea unei matrice, pe ecran sau într-un fișier de date, se utilizează două instrucțiuni for.
La sfârșitul afișării unei linii, deci când toate coloanele de pe o linie au fost afișate, se afișează o linie nouă. Astfel, elementele matricei se afișează sub forma matriceală.
for (i=0; i<m; i++)
{for (j=0; j<n; j++)
cout>>A[i][j];
cout<<endl;}
Afișarea elementelor
Interschimbare de linii. Se citesc de la tastatură elementele unui tablou de numere întregi cu m linii și n coloane. Se citesc, de asemenea, și două numere naturale distincte x și y, cuprinse între 1 și m. Se cere să se interschimbe linia x cu linia y. Se va afișa tabloul inițial, apoi pe cel obținut prin interschimbarea liniilor x și y.
#include <iostream.h>
main()
{ int mat[10][20],m,n,i,j,x,y,man;
cout<<"m="; cin>>m;
cout<<"n="; cin>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>mat[i][j];
cout<<"x="; cin>>x;
cout<<"y="; cin>>y;
cout<<endl;
for (i=0;i<m;i++)
{for (j=0;j<n;j++)
cout<<mat[i][j]<<' ';
cout<<endl;}
for(j=0;j<n;j++)
{man=mat[x-1][j];
mat[x-1][j]=mat[y-1][j];
mat[y-1][j]=man;}
cout<<endl;
for (i=0;i<m;i++)
{for (j=0;j<n;j++)
cout<<mat[i][j]<<' ';
cout<<endl;}
}
Suma elementelor de pe diagonala secundară Se citesc elementele unei matrice pătratice de numere reale cu m linii și m coloane. Se cere să se calculeze suma elementelor aflate pe diagonala secundară.
#include <iostream.h>
main()
{ float mat[10][10], suma=0;
int m,n,i,j;
cout<<"m="; cin>>m;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
cin>>mat[i][j];
for(i=0;i<m;i++)
suma=suma+mat[i][n-1-i];
cout<<”suma: ”<<suma;
}
Determinarea elementului minim de pe o linie oarecare Se citesc elementele unei matrice pătratice de numere întregi cu m linii și n coloane, precum și un număr întreg k, cu valori cuprinse între 1 și m. Se cere să se calculeze valoarea minimă de pe linia k.
#include <iostream.h>
main()
{ int mat[10][15],m,n,i,j, k, min;
cout<<"m="; cin>>m;
cout<<"n="; cin>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>mat[i][j];
cout<<”specificati linia”; cin>>k;
min=mat[k][0];
for(j=1;j<n;j++)
if(min>mat[k][j])
min= mat[k][j];
cout<<”minimul de pe linia ”<<k<<” este ”<<min;
}
Simularea unor situații reale Într-un grup de n persoane, se leagă prietenii. Se cere să se creeze o matrice ale cărei elemente vor avea valoarea 1, dacă între persoana și j și persoana i există relația de prietenie și 0, altfel. Se cere să se afișeze matricea.
#include <iostream.h>
main()
{ int mat[10][10],m,i,j, d=1;
cout<<"Dati numărul de persoane"; cin>>m;
while(d)
{cout<<”Prieteni între ”; cin>>i>>j;
mat[i][j]=1; mat[j][i]=1;
cout<<”Mai sunt prieteni? (1-da, 0-nu)”; cin>>d;
}
for (i=0; i<m; i++)
{for (j=0; j<n; j++)
cout>>A[i][j];
cout<<endl;}
}
Implementarea matricelor în limbajul Pascal
Declararea matricei
Declararea matricelor se realizează astfel:
var nume:array [1..nr_linii,1..nr_coloane] of tip_de_bază;
unde:
nume – numele tabloului;
tip_de_bază – tipul de date al elementelor matricei;
nr_linii, nr_coloane – numărul maxim de linii, respectiv de coloane.
Exemplu: var a:array [1..10,1..9] of real; – este declarată matricea a, având ca elemente numere reale, cu maxim 10 linii și 9 coloane.
Accesarea elementelor
Fie următoarea matrice:
Figură 13: Accesarea elementelor în limbajul Pascal
Liniile matricei sunt numerotate de la 1 la m, iar coloanele sunt numerotate de la 1 la n.
Un element se accesează cu ajutorul numărului liniei și numărului coloanei.
Exemplu: elementul a[2,4] are valoarea 45.
Inițializarea elementelor
Un element se inițializează astfel: a[i,j] := valoare
Citirea elementelor
Pentru citirea unei matrice, de la tastatură sau dintr-un fișier de date, se utilizează două instrucțiuni for.
for i:= 1 to m do
for j:= 1 to n do
readln(mat[i,j]);
Afișarea elementelor
Pentru afișarea unei matrice, pe ecran sau într-un fișier de date, se utilizează două instrucțiuni for.
La sfârșitul afișării unei linii, deci când toate coloanele de pe o linie au fost afișate, se afișează o linie nouă. Astfel, elementele matricei se afișează sub forma matriceală.
for i:= 1 to m do
begin
for j:= 1 to n do
write (mat[i,j], ‘ ‘);
writeln;
end;
Afișarea elementelor
Interschimbare de linii. Se citesc de la tastatură elementele unui tablou de numere întregi cu m linii și n coloane. Se citesc, de asemenea, și două numere naturale distincte x și y, cuprinse între 1 și m. Se cere să se interschimbe linia x cu linia y. Se va afișa tabloul inițial, apoi pe cel obținut prin interschimbarea liniilor x și y.
var mat:array [1..10,1..9] of integer;
m, n, i, j, x, y, man: integer;
begin
write ('m= '); readln(m);
write ('n= '); readln(n);
for i := 1 to m do
for j := 1 to n do
begin
write('mat[',i,',',j,']=');
readln(mat[i,j]);
end;
write('x= '); readln(x);
write('y= '); readln(y);
for i := 1 to m do
begin
for j := 1 to n do
write (mat[i,j],' ' );
writeln;
end;
for j:=1 to n do
begin
man := mat[x,j];
mat[x,j] := mat[y,j];
mat[y,j] := man;
end;
writeln;
for i := 1 to m do
begin
for j := 1 to n do
write(mat[i,j],' ');
writeln;
end;
end.
Suma elementelor de pe diagonala secundară Se citesc elementele unei matrice pătratice de numere reale cu m linii și m coloane. Se cere să se calculeze suma elementelor aflate pe diagonala secundară.
var mat:array [1..20,1..20] of real;
m, n, i, j: integer;
suma: real;
suma := 0;
begin
write ('m= '); readln(m);
for i := 1 to m do
for j := 1 to m do
begin
readln(mat[i,j]);
end;
for i := 1 to m do
begin
suma := suma + mat[i,i];
end;
write ('suma= ',mat[i,j]);
end.
6.3. Determinarea elementului minim de pe o linie oarecare Se citesc elementele unei matrice pătratice de numere întregi cu m linii și n coloane, precum și un număr întreg k, cu valori cuprinse între 1 și m. Se cere să se calculeze valoarea minimă de pe linia k.
var mat:array [1..10,1..20] of integer;
m, n, i, j, x, y, k, min: integer;
begin
write ('m= '); readln(m);
write ('n= '); readln(n);
for i := 1 to m do
for j := 1 to n do
begin
write('mat[',i,',',j,']=');
end;
write ('Specificati linia= '); readln(k);
min := mat[k,1];
for j := 2 to n do
if mat[k,j] < min then
min := A[k,j];
write('minimul de pe linia',k,' este ',min);
end;
6.4. Simularea unor situații reale Într-un grup de n persoane, se leagă prietenii. Se cere să se creeze o matrice ale cărei elemente vor avea valoarea 1, dacă între persoana și j și persoana i există relația de prietenie și 0, altfel. Se cere să se afișeze matricea.
var mat:array [1..20,1..20] of integer;
m, i, j, d: integer;
begin
write('Dati numărul de persoane:');
readln(m);
d := 1;
repeat
write('Prietenie între: '); readln(i,j);
mat[i,j] := 1; mat[j,i] := 1;
write('mai sunt prieteni? (1-da, 0-nu)');
readln(d);
until d=0;
for i := 1 to m do
begin
for j := 1 to n do
write(mat[i,j],' ');
writeln;
end;
end.
II.5. Utilitatea studiului structurilor de date bidimensionale pentru elevii de liceu
Structurile de date bidimensionale, datorită aplicativității lor în domenii variate, au o importanță deosebită în stocarea datelor, în transcrierea algoritmilor din pseudocod în limbaje de programare și implementarea programelor.
Conform Programei școlare pentru studiul disciplinei Informatică, pentru clasa a IX-a intensiv, Comisia Europeană a stabilit opt competențe cheie, fiind precizate, pentru fiecare competență cheie, cunoștințele, deprinderile și atitudinile care trebuie dobândite, respectiv formate elevilor în procesul educațional. Aceste competențe cheie răspund obiectivelor asumate pentru dezvoltarea sistemelor educaționale și de formare profesională în Uniunea Europeană și, ca urmare, stau la baza stabilirii curriculumului pentru educația de bază.
Pentru domeniul Informaticii, dintre aceste opt competențe, relevante sunt:
Competențe în matematică și competențe de bază în științe și tehnologie;
Competențe digitale.
Corelat cu aceste competențe, general valabile în spațiul european, au fost formulate Competențele generale ale disciplinei Informatică, pentru elevii de liceu:
Identificarea conexiunilor dintre informatică și societate
Identificarea datelor care intervin într-o problemă și a relațiilor dintre acestea
Elaborarea algoritmilor de rezolvare a problemelor
Aplicarea algoritmilor fundamentali în prelucrarea datelor
Implementarea algoritmilor într-un limbaj de programare
Se observă astfel importanța studiului elaborării algoritmilor de rezolvare a problemelor și de prelucrare a datelor, precum și a implementării algoritmilor într-un limbaj de programare.
Matricele joacă un rol important în viața de zi cu zi, chiar dacă acest fapt nu este evident. Utilizând aceste structuri, au fost dezvoltate tehnologii și sisteme fără de care multe activități cotidiene nu s-ar putea desfășura.
Spre exemplu, matricele stau la baza dezvoltării unor aplicații pentru rețele de telecomunicații, rețele electrice sau rețele de transport. De asemenea, structurile bidimensionale sunt esențiale în alte domenii și discipline, precum matematică, biologie – genetică, fizică, criptografie, statistică – calculul probabilităților, domeniul financiar, medicină, precum și industria de divertisment – realizarea jocurilor, dar și în managementul personal și de afaceri.
În practică, structurile bidimensionale apar în orice situație care presupune utilizarea tabelelor.
De aceea, studiul structurilor bidimensionale este esențial, mai ales pentru elevii de liceu și cu precădere pentru elevii care urmează cursurile profilului real. În primul rând, noțiunea de structură și de transpunere a informațiilor în structuri conduce la dezvoltarea armonioasă a unei gândiri algoritmice.
În al doilea rând, având în vedere utilitatea extrem de răspândită a structurilor bidimensionale, determină calitate de generalitate a acestora. Prin urmare, matricele devin elemente utilizate în mod repetat, în orice domeniu de activitate ar alege viitorul adult.
Astfel, structurile bidimensionale devin elemente de cultură generală, având în vedere utilitatea și generalitatea lor.
Studiul acestor structuri în cadrul disciplinei Informatică oferă, în plus față de noțiunile teoretice legate de matrice, și instrumentele necesare pentru manipularea și utilizarea corectă și la nivel maxim a acestora. Astfel, studiul matricelor în cadrul orelor de informatică oferă oportunitatea dobândirii competențelor de utilizare și manipulare a acestora și instrumente de aplicare a acestora în viața de zi cu zi.
Utilizarea matricelor în viața cotidiană
În diverse activități practice legate de înregistrarea, gruparea, analiza și interpretarea datelor referitoare la desfășurarea unui anumit fenomen de natură tehnică sau economică, apare necesitatea organizării acestor date informative în diverse tablouri (tabele) care să servească într-o manieră optimă scopului propus.
Fie următoarea situație practică:
Situația vânzărilor la 4 librării dintr-un oraș într-o perioadă de timp este prezentată în tabelul de mai jos, în care se specifică librăria, tipul de carte vândut și numărul de exemplare vândute din fiecare tip.
Figură 14: Tabel pentru stocarea și gestionarea informațiilor
Din acest tabel se pot extrage cu ușurință informații despre vânzările unor librării citind datele situate pe linii, precum și informații privind vânzările unui anumit tip decarte, la cele 4 librării, extrăgând datele situate pe o anumită coloană.
Utilizarea matricelor în programarea jocurilor
Spre exemplu, cu ajutorul conceptului de vecini ai unui element dintr-o matrice, se pot implementa mișcările unui personaj într-un joc electronic. Acest concept a rămas de actualitate, indiferent de evoluția complexității unor astfel de aplicații.
Utilizarea matricelor în procesarea digitală a imaginii
Orice imagine este o structură bidimensională de date. Un element al imaginii se numește pixel (cuvânt preluat din engleză, unde provine de la picture element). Astfel, o imagine este o matrice de pixeli, aceștia fiind așezați pe linii și coloane. De aici apare și noțiunea de rezoluție a imaginii, care este numărul de pixeli de pe orizontală x numărul de pixeli de pe verticală.
O imagine indexată este acea imagine în care valoarea fiecărui pixel este un indice prin care se regăsește informația de culoare asociată pixelului respectiv. Deci, pentru afișarea sau reprezentarea unei imagini indexate este necesara o informație suplimentară, de asociere între indici și culori. Această asociere se face prin intermediul tabelei de culoare. Tabela de culoare este o matrice în care fiecare linie conține descrierea unei culori (deci cele trei componente ce definesc culoarea – în mod tipic intensitățile relative de roșu, verde și albastru ce compun culoarea dată printr-un amestec aditiv).
Figură 15: Rezoluții ale imaginii
Utilizarea matricelor în botanică
Structurile bidimensionale se utilizează în probleme precum calculul numărului de indivizi rezultați în urma încrucișărilor într-o anumită perioadă de timp.
De exemplu, o plantă bienală devine matură la un an după ce sămânța este pusă în pământ. În anul al doilea, produce semințe care vor deveni plante în anul al treilea. După doi ani, planta moare.
Se poate determina numărul de plante după un anumit număr de ani dacă se cunosc numărul de plante din primul an (), numărul de plante din al doilea an (), câte plante din primul an supraviețuiesc în anul al doilea (), și câte plante din anul al doilea dau naștere la plante de un an (). Numărul de plante existente se pune în evidență printr-o matrice linie:
Matricea stărilor arată astfel:
Distribuția plantelor este dată de matricea:
După doi ani avem distribuția: ; după ani:
Utilizarea matricelor în chimie
Ecuațiile de echilibrare înseamnă scrierea ecuațiilor chimice, astfel încât cantitatea de soluție pe care o folosim în reacție va trebui, în final sa fie egală cu valoarea soluțiilor.
În procesul de fotosinteză, plantele utilizează energia radiată de soare pentru a transforma dioxidul de carbon și apa în glucoză și oxigen.
Pentru început, reacția arată așa: .
Pentru a obține echilibrul ecuației trebuie alese valorile a, b, c, d astfel încât numărul de atomi de carbon, hidrogen și oxigen din cei doi membri să fie același:
Deoarece dioxidul de carbon conține 1 atom de carbon iar glucoza 6 atomi, atunci pentru egalizarea numărului de atomi de carbon trebuie ca: .
Pentru atomii de oxigen, respectiv hidrogen se scriu ecuațiile: și .
Din aceste ecuații se formează sistemul:
De aici, rezultă , unde .
Utilizarea matricelor în criptografie
Arta criptografiei a luat naștere odată cu arta scrierii. Pe măsură ce civilizațiile au evoluat, indivizii s-au organizat în triburi, grupuri, regate. Acest fenomen a dus la nșterea conceptelor de putere, război, supremație, politică. Toate acestea au dus la necesitatea de a comunica în secret, astfel încât persoanele străine să nu aibă acces la informație.
Un sistem tradițional de criptografie este cunoscut ca cifru. Un cifru este mai degrabă un algoritm (set de pași) pentru a obține criptarea și decriptarea.
Cifrurile precum Cifrul lui Caesar, Cifrul de substituție simplă sau Cifrul PlayFair utilizează matrice pentru codificarea textelor.
Spre exemplu, în Cifrul PlayFair se creează inițial o matrice pătratică de ordin 5, în care literele sunt aranjate, omițându-se o literă din cele 26 (de obicei J). Dacă textul inițial conține litera J, aceasta se înlocuiește cu I.
Cei doi interlocutori aleg de comun acord un cuvânt-cheie. Literele cuvântului sunt așezate pe primele poziții ale matricei, excluzând dublurile. Apoi, restul literelor din alfabet sunt așezate lexicografic. Complexitatea crește față de cifrul cu substituție simplă, fiind vorba de 625 de perechi posibile de litere.
CAPITOLUL III – CONSIDERAȚII METODICE
Privire de ansamblu asupra informaticii
Prin informatică se înțelege știința care studiază principiile teoretice și modalitățile practice de utilizare și proiectare a calculatoarelor. Informatica este o abordare științifică a activităților computaționale și reprezintă o disciplină de studiu, din punct de vedere educațional. Termenul englezesc corespunzător este Computer Science. Termenul informatică provine din alăturarea cuvintelor informație și matematică.
Prin tehnologia informației se înțelege tehnologia necesară pentru prelucrarea informației cu ajutorul calculatoarelor și mijloacelor electronice. Tehnologia informației cuprinde elemente hardware și software care prelucrează intr-un fel sau altul date, informații sau cunoștințe. Din punct de vedere educațional, tehnologia informației reprezintă un obiect de studiu (chiar daca se folosește si termenul de disciplină).
Informatica include in principal algoritmi, structuri de date, logică matematică, arhitectură de sistem, limbaje de programare, compilatoare, inteligență artificială, ecosisteme software, protocoale de comunicație etc. Tehnologia informației înseamnă folosirea componentelor calculatorului, a imprimantelor, a scannerelor, lucrul cu fișiere și directoare. La acestea se adaugă folosirea unor editoare de text, programe de calcul tabelar, editoare de site-uri web, programe de contabilitate etc.
Din punct de vedere educațional, principala deosebire dintre cele două este că informatica educă elevii ca să fie autori de instrumente computaționale (spre exemplu aplicații software), în timp ce tehnologia informației educă elevii să fie utilizatori de tehnologii informatice (hardware și software).
În prezent, informatica își găsește aplicații în toate domeniile vieții. Prezența ei este puternic amplificată de impactul pe care îl are Internetul. Rețeaua la nivel mondial a revoluționat comunicarea dintre companii, logistica, mass-media, dar și viața privată a fiecărui individ. Mai puțin vizibil, dar totuși omniprezent, informatica și-a câștigat un loc stabil până și în aparatele casnice, ca de exemplu înregistratorul video sau mașina de spălat, în care sunt înglobate așa-numitele sisteme înglobate sau îmbarcate (în engleză Embedded Systems), care fac parte integrantă din aparat și care asigură acestor aparate un comportament mai mult sau mai puțin "inteligent". Printre altele, telefoanele inteligente, care sunt adevărate calculatoare, au permis democratizarea utilizării informatice pe scară extrem de largă.
Scopul predării informaticii în școli este acela de a oferi elevilor un mod de a vedea lumea adecvat activităților computaționale pe care le vor exercita ulterior.
Predarea informaticii în școli în mod corect este absolut necesară pentru a putea permite elevilor de astăzi să aibă succes în lumea de mâine. Fără o gândire computațională corect însușită, elevii se vor descurca foarte greu când vor deveni adulți. La nivelul Uniunii Europene și al României, industria IT joacă rol de „industrie industrializantă”, adică este coloana vertebrală în jurul căreia trebuie clădite toate celelalte ramuri industriale care vor funcționa in viitor.
Programa școlară pentru liceu, la disciplina Informatică, prevede următoarele competențe generale:
Identificarea conexiunilor dintre informatică și societate;
Identificarea datelor care intervin într-o problemă și a relațiilor dintre acestea;
Elaborarea algoritmilor de rezolvare a problemelor;
Aplicarea algoritmilor fundamentali în prelucrarea datelor;
Implementarea algoritmilor într-un limbaj de programare.
Programa școlară pentru gimnaziu, la disciplina Informatică și TIC, prevede competențele generale:
1. Utilizarea responsabilă și eficientă a tehnicii de calcul și de comunicații;
2. Rezolvarea unor probleme elementare prin construirea unor algoritmi de prelucrare a informației;
3. Elaborarea creativă de produse informatice care să valorifice conexiunile dintre disciplina Informatică și TIC și societate.
Se observă că, în ambele cazuri, se pune accentul pe legătura dintre Informatică și societate și pe utilizarea competențelor pentru formularea algoritmilor și rezolvarea problemelor în strânsă legătură cu viața cotidiană.
Prin urmare, Informatica este prezentă în viața de zi cu zi, atât datorită evoluției tehnologice și dispozitivele electronice care sunt prezente în toate domeniile societății cât și datorită legăturii sale cu alte domenii de activitate.
Gândirea algoritmică (Computational Thinking) este modul de raționare prin care soluțiile se obțin sub formă algoritmică, alcătuită din etape clare, bine definite. Gândirea computațională reprezintă o atitudine și un set de competențe pe care fiecare individ ar trebui să le dețină. Conceptul este construit pe capacitățile și limitările proceselor de calcul, indiferent dacă acestea sunt executate de un computer sau de o persoană. Acest tip de gândire este bazat pe concepte din informatică și constă dintr-o gamă de instrumente mentale. Gândirea computațională este dezvoltarea abilităților de gândire sprijinind învățarea și înțelegerea. Prin utilizarea gândirii computaționale, putem descrie procesele și abordările pentru o problemă sau sistem într-un mod în care calculatorul ne poate ajuta.
De aceea, în ultimul deceniu, gândirea computațională s-a bucurat de o atenție tot mai mare în domeniul educației. Includerea gândirii computaționale în educația obligatorie se axează pe două direcții:
Dezvoltarea competențelor de gândire computațională la elevi pentru ca aceștia să poată gândi într-o manieră diferită, să se exprime cu ajutorul multiplelor mijloace media, să rezolve probleme din lumea reală și să analizeze subiecte cotidiene din mai multe perspective;
Utilizarea gândirii computaționale pentru încurajarea creșterii economice, dezvoltarea carierelor în domeniul IT și pregătirea pentru absorbția pe piața muncii.
Prin gândirea algoritmică, problemele se rezolvă pas cu pas, elevii evaluează situația curentă, elaborează o ipoteză de alegere a pasului următor, acceptă sau resping o idee de rezolvare, evaluează anticipativ succesul pașilor în ansamblu. Verificarea cu ajutorul calculatorului îi încurajează în procesul de autoevaluare.
Dezvoltarea gândirii algoritmice trebuie luată în considerare ca obiectiv în instruire, atunci când se învață algoritmică (metode și tehnici), dar și când se învață programarea (limbaje de programare). Practica instruirii elevilor și studenților a demonstrat că învățarea unui limbaj de programare este în general “mai ușoară” decât învățarea elaborării algoritmilor (algoritmică). Acest lucru se poate justifica prin faptul că elaborarea unui algoritm este echivalentă cu implementarea (reprezentarea) raționamentelor (procese demonstrative) deduse din metode și tehnici utilizate în rezolvarea unei probleme. Rezolvarea problemelor necesită nu numai cunoștințe clare și precise, dar și capacitate de sinteză și control și mai ales capacitate de creație.
Astfel, disciplina Informatică are un rol esențial în dezvoltarea competențelor de gândire algoritmică în rândul elevilor. Ca atare, începând cu anul școlar 2017/2018, a fost introdusă, la gimnaziu, disciplina Informatică și TIC.
III.1. Instrumente de predare-învățare a structurilor de date bidimensionale pentru elevii de liceu
Procesul de învățământ este o activitate de acumulare și asimilare de către elevi a bazelor științelor, sub îndrumarea profesorului. Predarea, învățarea și evaluarea sunt acțiuni de bază ale procesului de învățământ.
Prin învățare se înțelege activitatea efectuată în scopul însușirii anumitor cunoștințe, al formării anumitor deprinderi sau dezvoltării unor capacități.
Predarea se definește în raport cu învățarea; este „activitatea desfășurată de profesor în cadrul lecției, spre a le determina elevilor activitatea de învățare. Predarea este o activitate cu dublă funcționalitate: de transmitere (de comunicare a unor cunoștințe, priceperi ori abilități, deprinderi, modele comportamentale) și de învățare a altora (elevi, studenți etc.).
Evaluarea reprezintă 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țelor și eficiența acestora la un moment dat, oferind soluții de perfecționare a actului de predare-învățare.
Delimitări conceptuale
Metoda didactică se referă la drumul sau calea de urmat în activitatea comună profesorului și elevilor, în vederea realizării obiectivelor instruirii.
Procedeul didactic este o componentă a metodei, o tehnică mai limitată de acțiune, un element de sprijin sau un mod concret de valorificare a metodei.
Raportul dintre metodă și procedeu didactic este de complementaritate: într-o lecție în care predomină expunerea profesorului, efectuarea unui experiment poate interveni ca procedeu demonstrativ.
Figură 16: Metode de învățământ
Metode de învățământ specifice disciplinei Informatică
Algoritmizarea
Algoritmizarea este modalitatea de a studia un obiect, fenomen, proces etc. sau de a rezolva o problemă teoretică sau practică prin intermediul algoritmilor. Algoritmii se exprimă sub forma formule, coduri, reguli și chiar modele de natură matematică, logică, practică.
Algoritmii de învățare se clasifică în:
algoritmi de percepere, înțelegere, generalizare și sistematizare a cunoștințelor (conceptele,judecățile, raționamentele, formulele, etc.);
algoritmi de recunoaștere (reguli de stabilire a unui anumit tip de probleme: ipotetice, de calcul, de proiectare, de investigație, aplicative);
algoritmi de rezolvare (reguli de rezolvare a unui anumit tip de probleme: etapele de elaborare a unui algoritm);
algoritmi de programare și dialogare cu calculatorul – care folosesc diverse limbaje de programare și codurile de dialogare;
algoritmi optimali (reguli de selectare a soluției celei mai bune din mai multe posibile);
algoritmi de repetare (reguli de transformarea acțiunilor în reflexe, deprinderi și obișnuințe intelectuale și practice);
algoritmi de creație (folosiți în învățarea euristică, în cercetarea și proiectarea inovatoare, bazați pe gândirea divergentă).
Etapele algoritmizării sunt:
conceperea (selectarea) algoritmului;
analiza algoritmului;
verificarea algoritmului.
Dinamica algoritmizării implică: conceperea (selectarea) algoritmului corespunzător nevoilor acțiunii și verificarea algoritmului prin exerciții practice (experimentale). În faza de început a învățării, se folosesc algoritmii, ca scheme operaționale fixe. Apoi, prin repetare și conștientizare, se pot construi alte soluții algoritmice. Prin urmare, s-a ajuns la o fază nouă, cea de descoperire, probare, creare a unor noi scheme de procedură. Astfel, se poate observa că, în anumite situații, algoritmii de rezolvare a unor probleme pot fi identificați și chiar construiți de către elevii înșiși, această posibilitate scoțând în evidență faptul că învățarea de tip algoritmic este compatibilă cu cea euristică. Sarcina profesorului este de a sesiza momentul când trebuie să renunțe la însușirea algoritmică a cunoștințelor, ca primă treaptă, și să impună treapta a doua, tactica euristică.
Exemplu de utilizare în procesul de predare-învățare: Algoritmizarea intervine în rezolvarea oricărei probleme din cadrul orelor de informatică, pentru că găsirea soluției pentru aceste probleme implică scrierea unui algoritm. Astfel, problemele care utilizează matrice intră în această categorie: pentru rezolvarea problemei, înainte de a scrie programul în limbaj de programare, este necesară conceperea algoritmului.
Problematizarea
Problematizarea (problem-solving) este modalitatea de a crea în mintea elevului o situație conflictuală (critică sau de neliniște) intelectuală pozitivă, determinată de necesitatea cunoașterii unui obiect, fenomen, proces, sau rezolvării unei probleme teoretice sau practice pe cale logico-matematica și/sau experimentală.
Denumită și „predare prin rezolvare de probleme", problematizarea reprezintă una dintre cele mai utile metode, prin potențialul ei euristic și activizator. Problematizarea este o metodă cu caracter activ-participativ, formativ și euristic, capabilă să determine activitatea independentă, să antreneze și să dezvolte capacitățile intelectuale.
Specificul metodei constă în faptul că profesorul nu comunică pur și simplu, ci îi pune pe elevi în situația de a descoperi, în urma creării unei situații problematice (mai puțin prin punerea unor întrebări).
Tipurile de problematizare:
întrebarea problemă, folosită în verificările curente, produce o stare conflictuală intelectuală restrânsă ca dificultate și complexitate, prin abordarea unei singure chestiuni, informație, etc.
problema, presupune utilizarea unor elemente cunoscute în scopul determinării unor date necunoscute, producând un conflict intelectual mai complex;
situația problemă, este cel mai puternic și complex tip de problematizare, starea conflictuală produsă fiind de nivel maxim.
Etapele problematizării:
crearea (alegerea) tipului de problematizare;
dobândirea de noi informații și restructurarea datelor vechi cu cele noi, într-un sistem unitar;
stabilirea/elaborarea variantelor de rezolvare și alegerea soluției optime;
verificarea (eventual experimentala) a soluției alese.
Cerințele problematizării:
existența, la elevi, a unui fond de cunoștințe, aptitudini și abilități;
folosirea progresivă a tipurilor de problematizare în ordinea: întrebări-problemă, probleme, situații problematice;
dificultățile să fie gradate;
motivarea suficientă a elevilor;
alegerea celui mai potrivit moment de plasare a problemei în lecție;
introducerea treptată a dificultăților în fiecare caz de problematizare;
îmbinarea efortului independent al elevului cu dirijarea din partea profesorului;
formarea capacității de a combina și recombina cunoștințele, algoritmii și modelele logico-matematice și informatice;
antrenarea elevilor în dezbaterea soluțiilor controversate, prin manifestarea independentă a punctelor de vedere în ceea ce privește obținerea soluției optime;
orice situate problematizată trebuie să aibă la bază o strategie de rezolvare conștientă.
Potențialul pedagogic al instruirii prin problematizare:
stimulează participarea elevului la cunoaștere prin efort propriu;
contribuie substanțial la educarea sistemului de gândire;
sprijină formarea unor deprinderi de muncă intelectuală:
familiarizează elevul cu modul de soluționare a unor situații tipice cu care se va putea întâlni în practica profesională;
contribuie la perfecționarea relației profesor-elevi – în sensul stimulării cooperării și concomitent al eliminării relațiilor de autoritate restrictivă.
Valoarea formativă a acestei metode este indiscutabilă: se consolidează structuri cognitive, se stimulează spiritul de explorare, se formează un stil activ de muncă, se cultiva autonomia și curajul în afișarea componentele intelectuale, afective, voliționale.
Exemplu de utilizare în procesul de predare-învățare: Disciplina Informatică implică rezolvarea de probleme. Astfel, problematizarea este o metodă folosită în majoritatea scenariilor didactice, datorită problemelor propuse spre rezolvare, pentru care se scriu algoritmi și programe.
Descoperirea (învățarea prin descoperire)
Descoperirea (învățarea prin descoperire) este o strategie complexă de predare-învățare care oferă elevilor posibilitatea de a dobândi cunoștințele prin efort personal, independent. Este o metodă de factură euristică și constă în crearea condițiilor de reactualizare a experienței și capacităților individuale, în vederea rezolvării unor situații-problemă.
Descoperirea prin învățare se constituie ca un demers elevat de metodologie didactică, atât de îmbinări, combinări și recombinări de date pe fondul de cunoștințe deja existent, cât și de restructurarea acestora într-o realizare creativă bazată pe noi documentări și investigații experimental-aplicative, în cadrul cărora acționează procesele intelectuale esențiale ca: spiritul de observație, memoria logică, imaginația și gândirea creatoare etc.
Descoperirea asigură o învățare cucerită, bazată pe problematizare și cercetare, pe experiența directă și concretă, creativă.
Se află în strânsă corelație cu metoda problematizării. Dacă în cazul problematizării accentul se pune pe declanșarea și crearea unor situații de învățare și cunoaștere, în cazul descoperirii accentul cade pe căutarea și găsirea soluției.
Exemplu de utilizare în procesul de predare-învățare: Descoperirea are un rol important în învățarea utilizării unui limbaj de programare și a utilizării structurilor oferite de acesta. Cunoașterea unui limbaj de programare este posibilă doar prin descoperire, prin scrierea programelor și eliminarea erorilor care apar, mai ales pentru un programator începător.
Studiul de caz
Studiul de caz este o modalitate de a analiza o situație specifică, particulară, reală sau ipotetică, modelată sau simulată, care există sau poate să apară într-o acțiune, fenomen, sistem etc. de orice natură, denumit caz, în vederea studierii sau rezolvării lui, în raport cu nevoile înlăturării unor neajunsuri sau a modernizării proceselor, asigurând luarea unei decizii optime în domeniul respectiv.
Etapele metodei studiului de caz sunt:
identificarea (modelarea, simularea) cazului;
studiul analitic (cauze, relații, rol, etc.);
reorganizarea informațiilor deținute, obținerea de noi informații și organizarea lor într-un ansamblu unitar, în concordanță cu cerințele rezolvării cazului;
stabilirea variantelor de rezolvare și alegerea soluției optime;
verificarea (experimentală) a variantei alese, înainte de aplicarea generalizată.
Metoda studiului de caz are un pronunțat caracter activ-participativ, formativ și euristic, contribuind la antrenarea și dezvoltarea capacităților intelectuale și profesionale, oferind soluții de rezolvare elevate și eficiente pentru problemele, sau situațiile-problemă teoretice și practice.
Exemplu de utilizare în procesul de predare-învățare: Studiul de caz are o importanță deosebită în studiul structurilor de date bidimensionale, pentru că acestea sunt utilizate în multe alte domenii, precum și în viața de zi cu zi. Spre exemplu, pentru introducerea structurilor bidimensionale, se poate considera cazul unei table de șah. Majoritatea elevilor sunt familiarizați cu acest concept, chiar dacă nu cunosc regulile jocului. Faptul că tabla de șah este împărțită în linii și coloane, care sunt numerotate, ajută la introducerea noțiunilor de bază legate de matrice.
Brainstorming-ul
Brainstorming-ul este modalitatea complexă de a elabora (crea) în cadrul unui anumit grup, în mod spontan și în flux continuu anumite idei, modele, soluții, etc. noi, originale, necesare rezolvării (abordării) unor teme sau probleme teoretice sau practice.
Brainstorming-ul este o metodă atât independentă, de căutări și creații individuale, precum și de grup, prin discutarea, argumentarea, dezbaterea soluțiilor identificate.
Metoda are un dublu aspect: este atât metodă de studiu, de învățare, cât și metodă de investigație științifică, de creativitate.
Etapele de desfășurare a metodei asaltului de idei sunt:
anunțarea temei (problemei), a importanței și obiectivelor ei;
emiterea de către participanți a ideilor, formulelor, soluțiilor, etc. de abordare sau rezolvare a temei, fără nici o restricție;
încheierea ședinței de brainstorming, atunci când grupul consideră că s-au adunat date suficiente rezolvării problemei;
evaluarea datelor și stabilirea concluziilor (soluțiilor) de rezolvare.
Brainstorming-ul este o metodă de stimulare a creativității. Cadrul didactic care inițiază „un moment brainstorming", trebuie să propună spre rezolvare probleme care prezintă un interes real. Evaluarea propriu-zisa a soluțiilor preconizate se realizează după un anumit timp, prin compararea și selecția ideilor valabile, sau prin combinarea acestora în complexe explicative sau operaționale adecvate pentru problema formulată.
Metoda brainstorming are o deosebită importanță cognitivă și practică și poate fi îmbinată cu: descoperirea, problematizarea, modelarea, studiul de caz, simularea, dezbaterea, etc., rolul său fiind în special cel de formare la elevi a unor calități imaginative, creative.
Exemplu de utilizare în procesul de predare-învățare: Brainstorming-ul, în cazul studiului structurilor bidimensionale, poate fi utilizat mai ales în cadrul lecțiilor de dobândire de competențe sau lecțiilor mixte, atunci când sunt propuse spre rezolvare diferite tipuri de probleme. Elevii pot lucra în echipe, formate de profesor, astfel încât distribuția elevilor să fie echitabilă, iar fiecare echipă să aibă elevi cu diferite pregătiri, pentru a preîntâmpina blocajele.
Conversația
Conversația este o metodă interogativă care adoptă mai multe forme, în funcție de obiectivele și conținutul diferitelor activități didactice:
conversația euristică, cu scopul de a redescoperi cunoștințele;
conversația ca mijloc de aprofundare a cunoștințelor;
conversația pentru fixarea și sistematizarea cunoștințelor;
conversația de verificare a cunoștințelor.
Prin utilizarea conversației, problematizării și descoperirii, elevii participă prin efort propriu de gândire și de acțiune la descoperirea soluțiilor, dobândind astfel competențe de investigare, urmând toți pașii necesari găsirii soluțiilor.
Exemplu de utilizare în procesul de predare-învățare: Această metodă este folosită într-un mod implicit, în cadrul fiecărei ore de curs. Conversația apare atât în etapa de comunicare a noilor cunoștințe legate de structurile bidimensionale, cât și în etapa de rezolvare de probleme și de dobândire de competențe în utilizarea matricelor.
Explicația
Explicația este folosită pentru formarea noțiunilor, prezentarea unui fenomen prin analiza cauzelor care l-au produs etc. (existând mai multe tipuri de explicație):
explicarea mecanismelor și a principiilor de funcționare;
explicarea consecutivă, când se enumeră evenimentele ce au dus la declanșarea unui fenomen;
explicarea cauzală, când sunt analizate cauzele unui fenomen;
explicarea procedurală, când sunt puse în evidență operațiile necesare pentru producerea unui obiect;
explicația normativă, când se stabilesc caracteristicile unui obiect sau fenomen după anumite criterii;
explicația teleologică, când se justifică o acțiune.
Exemplu de utilizare în procesul de predare-învățare: Asemănător conversației, această metodă apare în toate etapele procesului de predare-învățare, pentru că profesorul are rolul de a oferi explicații de-a lungul întregii ore de curs, fie că transmite noi cunoștințe sau reactualizează și utilizează noțiuni și competențe dobândite anterior sau evaluează progresul elevilor.
Metodele de acțiune practică (operațională)
Aceste metode sunt activ-formative și includ: metoda exercițiului, metoda lucrărilor practice și de laborator, metoda proiectelor, instruirea programată și instruirea programată asistată de calculator.
Metoda exercițiului constă în repetarea conștientă a unei activități, urmărind formarea deprinderilor, consolidarea cunoștințelor și dezvoltarea capacităților intelectuale.
Există mai multe tipuri de exerciții:
după forma de organizare: individuale, în echipă, frontale;
după funcția îndeplinită: introductive, de bază, operatorii;
după modul de intervenție al profesorului: dirijate, semidirijate, libere;
după obiectivul didactic urmărit: de calcul mintal, de comunicare, de rezolvare a problemelor, de formare a deprinderilor intelectuale, de creativitate, de autocontrol, de dezvoltare psihomotorie, etc.)
Metoda lucrărilor de laborator și a lucrărilor practice asigură legătura strânsă dintre teorie și practică, dezvoltă spiritul de observare al elevilor, dorința de cercetare. Unele lucrări practice au la baza exercițiul si se desfășoară după modelul acestora.
Exemplu de utilizare în procesul de predare-învățare: Metodele de acțiune practică sunt indispensabile în cadrul orelor de informatică, deoarece dobândirea de competențe la această disciplină presupune o componentă practică – cea a rezolvării de probleme, de concepere a algoritmilor și de scriere a programelor. Astfel, după ce profesorul a transmis noțiunile teoretice despre structurile bidimensionale, urmează o etapă de aplicații, în care elevii aplică și utilizează noile cunoștințe. Totodată, performanța în cadrul acestei discipline nu poate fi obținută fără aceste metode de acțiune practică, datorită caracterului aplicativ al acesteia.
Metoda instruirii programate cu manualul sau asistată de calculator
Este o tehnică modernă, care se bazează pe parcurgerea unor programe de învățare, după un algoritm prestabilit, alcătuit dm secvențe informative cu momente rezolutive, cu seturi suplimentare de cunoștințe, etc.
Principiile care stau la baza unor asemenea programe sunt:
principiul pașilor mici și al progresului gradat (prin fragmentarea dificultăților în unități gradate care să conducă, din aproape în aproape, la soluționarea integrală);
principiul participării active (relația între programă și elev este de tip interactiv, elevul rezolvând, răspunzând, selectând întrebări, propunând soluții în mod independent);
principiul verificării imediate a răspunsului (soluțiile date de elev sunt confirmate operativ cu cele valide, acesta neputând să treacă la secvențele următoare de învățare înainte ca răspunsurile să fie confirmate);
principiul respectării ritmului individual de studiu (fiecare elev parcurge programul în funcție de posibilități, dispunând și gestionând timpul de rezolvare a sarcinilor);
principiul reușitei, sau al răspunsurilor corecte (programa este astfel dimensionată încât orice copil normal să fie capabil să o parcurgă integral și satisfăcător).
Instruirea programată are unele avantaje față de instruirea prin metode clasice sau euristice, astfel :
fragmentarea materialului de învățământ pe secvențe se realizează în raport cu posibilitățile elevilor, cu ritmul lor de învățare;
asigură o învățare activă și o informare operativă asupra rezultatelor învățării necesară atât elevului cât și profesorului;
programele pot fi revizuite daca nu dau rezultatele așteptate, fiind ameliorate permanent;
reducerea timpului de însușire a cunoștințelor;
realizarea cu succes a respectării particularităților elevilor, până la urmă toți își însușesc cunoștințele;
crearea premisei formării unui stil de muncă activ, autocontrolat.
Dezavantajele instruirii programate:
fragmentarea excesivă a conținutului poate duce la diminuarea capacității de sinteza a elevului, la schematizarea gândirii;
nu orice conținut se poate programa, nu toate disciplinele sunt secvențiale;
se vizează aspectul instructiv al educației și mai puțin (sau deloc) aspectul formativ;
nu permite problematizarea sau punerea în discuție a unui caz.
Calculatorul, asociat cu videoproiectorul și alte dispozitive „smart”, ca mijloace modeme de captare a atenției și interesului, este folosit în activitățile didactice în diferite forme:
secvențe de pregătire pentru transmiterea de informații, punerea de întrebări, rezolvare de exerciții și probleme, prezentarea de algoritmi pentru rezolvarea problemelor-tip, proiectarea de grafice și diagrame, aplicații practice, demonstrarea unor teoreme, interpretarea unor date, etc.:
simularea unor fenomene, a unor experiențe și interpretarea lor, simularea pentru formarea unor deprinderi;
simularea unor jocuri didactice; evaluarea rezultatelor la învățătură și autoevaluare;
organizarea și dirijarea învățării independente pe baza unor programe de învățare, însoțite de fișe-program, constituind și un fel de documentație a soft-ului.
Instruirea programată poate fi transformată cu succes într-o metodă activă dacă se are în vedere implementarea sa într-o strategie activ-participativă, ca rezultat al aplicării unor metode de genul descoperirii, algoritmizării, problematizării și exercițiului.
Exemplu de utilizare în procesul de predare-învățare: prin natura sa, disciplina Informatică este în strânsă legătură cu instruirea asistată de calculator. Mai ales în cadrul capitolului dedicat structurilor bidimensionale, care au un pronunțat caracter aplicativ, predarea-învățarea corectă nu se poate realiza decât cu sprijinul instrumentelor IT și mai ales a calculatoarelor. Instruirea programată se poate desfășura în cadrul orelor de curs, prin rezolvarea problemelor în clasă, frontal, pe grupe sau individual, dar și acasă, cu ajutorul calculatorului și a aplicațiilor de e-learning.
Mijloace de învățământ
După funcția pedagogică îndeplinită, mijloacele de învățământ utilizate în predarea informaticii sunt:
mijloace informativ demonstrative
mijloace figurative: planșe, fișe, imagini, lecții în format electronic;
reprezentări simbolice: scheme logice, diagrame, desene.
mijloace de exersare și formare a deprinderilor
calculatoare, tablete, aplicații.
mijloace de evaluare
teste, activități, fișe de lucru pentru verificarea cunoștințelor.
Resursele materiale utilizate pot fi sintetizate astfel:
III.2. Elaborarea unei aplicații-suport pentru studiul structurilor de date bidimensionale
Am ales ca aplicație-suport crearea unui website dedicat studiului structurilor bidimensionale, datorită utilității acestuia, atât în cadrul orelor de curs, cât și pentru studiul independent de acasă.
CAPITOLUL IV – APLICAȚII PRACTICE
IV.1. Aplicații cu structuri de date bidimensionale
Voi prezenta, în cadrul acestui subcapitol, două aplicații cu structuri de date bidimensionale realizate sub formă de website. Ele constituie două jocuri clasice, aplicații care demonstrează caracterul aplicativ al structurilor bidimensionale.
Jocul Puzzle cu cifre
Se dau numerele de la 1 la 15, amestecate, aranjate într-un careu 4×4, rămânând un loc liber. Se cere să se aranjeze cifrele în ordine crescătoare, mutând în locul liber doar cifrele adiacente acestuia.
Am implementat jocul în limbajul Javascript, utilizând matrice linie pentru implementarea configurației inițiale și a șirului de numere.
Figură 17: Jocul puzzle cu cifre – configurația inițială
Utilizatorul apasă pe cifra pe care dorește să o mute. Dacă aceasta se află lângă spațiul liber, se execută schimbul între cifră și spațiul liber. Existența locului liber este probată prin compararea vecinilor cifrei pe care s-a apăsat. În momentul în care s-a ajuns la configurația finală – toate cifrele sunt în ordine, iar locul liber este ultimul, se afișează mesajul „Ați câștigat în x mutări”, unde x este înlocuit cu numărul de apăsări făcut de utilizator.
Figură 18: Jocul puzzle cu cifre – configurația câștigătoare
Codul sursă
<html>
<head>
<title>***15 puzzle***</title>
<style>
p {text-align:center; color:white;
font-family: "Times New Roman", Times, serif;
font-weight: bold;
}
body {
background-image: url("back.jpg");
}
</style>
<script>
var p=new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); //configurația corectă
var v=new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
var temp=new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); //mutari intermediare
var id2; var m=0;
var j, g, flag=0;
function nou()
{document.getElementById('p').innerHTML = " ";
m=0; s=0; c=0; g=0; flag=0; poz=0;
for(i=0;i<16;i++) {v[i]=0; temp[i]=0;}
for(i=0;i<16;i++){while(v[j]!=0) j=Math.round(Math.random()*16);
v[j]=1; temp[i]=p[j];
}
for(i=0;i<16;i++) {c=0;
if(temp[i]==16) {if(parseInt(i/4)%2) g=i+1;
else g=i;} //pentru 3×3, g=i
for(j=i;j<16;j++) if(temp[j]<temp[i]) c++;
s=s+c;
}
s=s+(g%2);
if((s%2)==0) for(i=0;i<16;i++) document.getElementById(i).src='p'+temp[i]+'.jpg';
else nou();
}
function win()
{g=1;
for(i=0;i<16;i++) if(temp[i]!=i+1) g=0;
if(g==1) {document.getElementById('p').innerHTML = "Ati castigat in "+m+ " mutari";
flag=1;
}
}
function mut(id)
{if(flag==0)
{m++;
for(i=0;i<16;i++) if(temp[i]==16) id2=i;
var a=parseInt(id)+4, b=parseInt(id)+1, c=parseInt(id)-4, d=parseInt(id)-1;
if((id2==a)||((id2==b)&&(b%4!=0))||(id2==c)||((id2==d)&&(id%4!=0)))
{document.getElementById(id).src='p16.jpg';
document.getElementById(id2).src='p'+temp[id]+'.jpg';
temp[id2]=temp[id]; temp[id]=16;}
win();
}
}
</script>
</head>
<body onload='nou()'>
<p style="font-size:30px">Puzzle</p>
<p style="font-size:20px">Apasati o cifra pentru mutare.</p>
<p style="font-size:20px">Cifra se va muta doar daca se afla langa locul liber.</p>
<input style="background-color:gold;margin:auto;display:block" type='button' value="Joc nou" onclick='nou()' >
</br>
<table border='black' align='center'>
<tr>
<td><img id=0 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=1 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=2 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=3 style='width:70; height:70' onclick='mut(id)' /></td>
</tr>
<tr>
<td><img id=4 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=5 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=6 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=7 style='width:70; height:70' onclick='mut(id)' /></td>
</tr>
<tr>
<td><img id=8 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=9 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=10 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=11 style='width:70; height:70' onclick='mut(id)' /></td>
</tr>
<tr>
<td><img id=12 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=13 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=14 style='width:70; height:70' onclick='mut(id)' /></td>
<td><img id=15 style='width:70; height:70' onclick='mut(id)' /></td>
</tr>
</table>
<p id='p'>
</body>
</html>
Jocul X și 0
Jocul este implementat în limbajul Javascript. Utilizând structuri bidimensionale, au fost analizate toate cazurile posibile astfel încât calculatorul să nu piardă.
Figură 19: Jocul X&0 – configurația inițială
Jocul reacționează la mutările utilizatorului. Acesta face prima mutare, iar aplicația calculează toate posibilitățile, alegând mutarea care asigură fie remiză, fie câștig. Rezultatul jocului este afișat. Butonul „Joc nou” reinițializează spațiul de joc.
Figură 20: Jocul X&0 – Calculatorul este câștigător
Figură 21: Jocul X&0 – Remiză
Codul sursă
<html>
<head>
<title>***X & 0***</title>
<style>
p {text-align:center;
font-family: "Times New Roman", Times, serif;
font-weight: bold;
}
body {
background-image: url("back.jpg");
}
</style>
<script>
var v=new Array();
v[3]=new Array(0,0,0,0);
v[1]=new Array(0,0,0,0);
v[2]=new Array(0,0,0,0);
var i, j, flag=0, c, ctr=0;
function nou()
{flag=0; ctr=0; ctr=0;
for(i=1;i<=3;i++) for(j=1;j<=3;j++) v[i][j]=0;
document.getElementById('11').src='Pb.jpg';
document.getElementById('12').src='Pb.jpg';
document.getElementById('13').src='Pb.jpg';
document.getElementById('21').src='Pb.jpg';
document.getElementById('22').src='Pb.jpg';
document.getElementById('23').src='Pb.jpg';
document.getElementById('31').src='Pb.jpg';
document.getElementById('32').src='Pb.jpg';
document.getElementById('33').src='Pb.jpg';
document.getElementById('p').innerHTML = " ";
}
function mut(a,b)
{var s=1;
if(flag==0&&v[a][b]==0)
{c=0;
document.getElementById((a*10)+b).src='Px.jpg';
v[a][b]=2;
ctr++;
if(v[1][1]==1&&v[1][2]==1&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][1]==1&&v[1][3]==1&&v[1][2]==0) {document.getElementById('12').src='Po.jpg';v[1][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][3]==1&&v[1][2]==1&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[2][1]==1&&v[2][2]==1&&v[2][3]==0) {document.getElementById('23').src='Po.jpg';v[2][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[2][1]==1&&v[2][3]==1&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[2][3]==1&&v[2][2]==1&&v[2][1]==0) {document.getElementById('21').src='Po.jpg';v[2][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][1]==1&&v[3][2]==1&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][1]==1&&v[3][3]==1&&v[3][2]==0) {document.getElementById('32').src='Po.jpg';v[3][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][3]==1&&v[3][2]==1&&v[3][1]==0) {document.getElementById('31').src='Po.jpg';v[3][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][1]==1&&v[2][1]==1&&v[3][1]==0) {document.getElementById('31').src='Po.jpg';v[3][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][1]==1&&v[3][1]==1&&v[2][1]==0) {document.getElementById('21').src='Po.jpg';v[2][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][1]==1&&v[2][1]==1&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][2]==1&&v[2][2]==1&&v[3][2]==0) {document.getElementById('32').src='Po.jpg';v[3][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][2]==1&&v[3][2]==1&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][2]==1&&v[2][2]==1&&v[1][2]==0) {document.getElementById('12').src='Po.jpg';v[1][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][3]==1&&v[2][3]==1&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][3]==1&&v[3][3]==1&&v[2][3]==0) {document.getElementById('23').src='Po.jpg';v[2][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][3]==1&&v[2][3]==1&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][3]==1&&v[1][1]==1&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][3]==1&&v[2][2]==1&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[2][2]==1&&v[1][1]==1&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][3]==1&&v[2][2]==1&&v[3][1]==0) {document.getElementById('31').src='Po.jpg';v[3][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[3][1]==1&&v[2][2]==1&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][3]==1&&v[3][1]==1&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][1]==1&&v[3][3]==1&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][1]==1&&v[2][2]==1&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][2]==1&&v[1][3]==1&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[1][2]==1&&v[1][3]==1&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[2][1]==1&&v[3][1]==1&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
else if(v[2][3]==1&&v[3][3]==1&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;
document.getElementById('p').innerHTML = "Calculatorul câștigă"; flag=1;}
//–––––
else if(v[1][1]==2&&v[1][2]==2&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;
else if(v[1][1]==2&&v[1][3]==2&&v[1][2]==0) {document.getElementById('12').src='Po.jpg';v[1][2]=1;ctr++;
}
else if(v[1][3]==2&&v[1][2]==2&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;
}
else if(v[2][1]==2&&v[2][2]==2&&v[2][3]==0) {document.getElementById('23').src='Po.jpg';v[2][3]=1;ctr++;
}
else if(v[2][1]==2&&v[2][3]==2&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;ctr++;
}
else if(v[2][3]==2&&v[2][2]==2&&v[2][1]==0) {document.getElementById('21').src='Po.jpg';v[2][1]=1;ctr++;
}
else if(v[3][1]==2&&v[3][2]==2&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;
}
else if(v[3][1]==2&&v[3][3]==2&&v[3][2]==0) {document.getElementById('32').src='Po.jpg';v[3][2]=1;ctr++;
}
else if(v[3][3]==2&&v[3][2]==2&&v[3][1]==0) {document.getElementById('31').src='Po.jpg';v[3][1]=1;ctr++;
}
else if(v[1][1]==2&&v[2][1]==2&&v[3][1]==0) {document.getElementById('31').src='Po.jpg';v[3][1]=1;ctr++;
}
else if(v[1][1]==2&&v[3][1]==2&&v[2][1]==0) {document.getElementById('21').src='Po.jpg';v[2][1]=1;ctr++;
}
else if(v[3][1]==2&&v[2][1]==2&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;
}
else if(v[1][2]==2&&v[2][2]==2&&v[3][2]==0) {document.getElementById('32').src='Po.jpg';v[3][2]=1;ctr++;
}
else if(v[1][2]==2&&v[3][2]==2&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;ctr++;
}
else if(v[3][2]==2&&v[2][2]==2&&v[1][2]==0) {document.getElementById('12').src='Po.jpg';v[1][2]=1;ctr++;
}
else if(v[1][3]==2&&v[2][3]==2&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;
}
else if(v[1][3]==2&&v[3][3]==2&&v[2][3]==0) {document.getElementById('23').src='Po.jpg';v[2][3]=1;ctr++;
}
else if(v[3][3]==2&&v[2][3]==2&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;
}
else if(v[3][3]==2&&v[1][1]==2&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;ctr++;
}
else if(v[3][3]==2&&v[2][2]==2&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;
}
else if(v[2][2]==2&&v[1][1]==2&&v[3][3]==0) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;
}
else if(v[1][3]==2&&v[2][2]==2&&v[3][1]==0) {document.getElementById('31').src='Po.jpg';v[3][1]=1;ctr++;
}
else if(v[3][1]==2&&v[2][2]==2&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;
}
else if(v[1][3]==2&&v[3][1]==2&&v[2][2]==0) {document.getElementById('22').src='Po.jpg';v[2][2]=1;ctr++;
}
else if(v[1][2]==2&&v[1][3]==2&&v[1][1]==0) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;
}
else if(v[2][3]==2&&v[3][3]==2&&v[1][3]==0) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;
}
else if(ctr==1) {if(v[2][2]==0) {document.getElementById('22').src='Po.jpg'; v[2][2]=1;ctr++;}
else if(v[1][1]==0) {document.getElementById('11').src='Po.jpg'; v[1][1]=1;ctr++;}}
else if(ctr==3) {if(v[1][1]==2&&v[3][3]==2&&v[2][2]==1) {document.getElementById('23').src='Po.jpg';v[2][3]=1;ctr++;}
else if(v[1][3]==2&&v[3][1]==2&&v[2][2]==1) {document.getElementById('23').src='Po.jpg';v[2][3]=1;ctr++;}
else if(v[1][2]==2&&v[2][1]==2&&v[2][2]==1) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;}
else if(v[1][2]==2&&v[2][3]==2&&v[2][2]==1) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;}
else if(v[2][1]==2&&v[3][2]==2&&v[2][2]==1) {document.getElementById('31').src='Po.jpg';v[3][1]=1;ctr++;}
else if(v[2][3]==2&&v[3][2]==2&&v[2][2]==1) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;}
else if(v[1][1]==2&&v[2][3]==2&&v[2][2]==1) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;}
else if(v[1][1]==2&&v[3][2]==2&&v[2][2]==1) {document.getElementById('31').src='Po.jpg';v[3][1]=1;ctr++;}
else if(v[1][3]==2&&v[2][1]==2&&v[2][2]==1) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;}
else if(v[1][3]==2&&v[3][2]==2&&v[2][2]==1) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;}
else if(v[3][3]==2&&v[1][2]==2&&v[2][2]==1) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;}
else if(v[3][3]==2&&v[2][1]==2&&v[2][2]==1) {document.getElementById('31').src='Po.jpg';v[3][1]=1;ctr++;}
else if(v[3][1]==2&&v[2][3]==2&&v[2][2]==1) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;}
else if(v[3][1]==2&&v[1][2]==2&&v[2][2]==1) {document.getElementById('11').src='Po.jpg';v[1][1]=1;ctr++;}
else if(v[1][2]==2&&v[3][2]==2&&v[2][2]==1) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;}
else if(v[2][1]==2&&v[2][3]==2&&v[2][2]==1) {document.getElementById('33').src='Po.jpg';v[3][3]=1;ctr++;}
else if(v[1][1]==2&&v[2][2]==2&&v[3][3]==1) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;}
else if(v[3][3]==2&&v[2][2]==2&&v[1][1]==1) {document.getElementById('13').src='Po.jpg';v[1][3]=1;ctr++;}
}
else if(ctr>=5) {for(i=1;i<=3;i++) for(j=1;j<=3;j++) if(v[i][j]==0&&c==0) {document.getElementById((i*10)+j).src='Po.jpg'; v[i][j]=1; c=1;}}
for(i=1;i<=3;i++) for(j=1;j<=3;j++) if(v[i][j]==0) s=0;
if(s==1) {document.getElementById('p').innerHTML = "Remiză"; flag=1;}
}
}
</script>
</head>
<body onload='nou()'>
<p style="font-size:30px">X & 0</p>
<p style="font-size:20px">X – Om; 0 – Computer</p>
<input style="background-color:lightgreen;margin:auto;display:block" type='button' value="Joc nou" onclick='nou()' >
<br/>
<table border='black' align='center'>
<tr>
<td><img id='11' style='width:70; height:70' onclick='mut(1,1)' /></td>
<td><img id='12' style='width:70; height:70' onclick='mut(1,2)' /></td>
<td><img id='13' style='width:70; height:70' onclick='mut(1,3)' /></td>
</tr>
<tr>
<td><img id='21' style='width:70; height:70' onclick='mut(2,1)' /></td>
<td><img id='22' style='width:70; height:70' onclick='mut(2,2)' /></td>
<td><img id='23' style='width:70; height:70' onclick='mut(2,3)' /></td>
</tr>
<tr>
<td><img id='31' style='width:70; height:70' onclick='mut(3,1)' /></td>
<td><img id='32' style='width:70; height:70' onclick='mut(3,2)' /></td>
<td><img id='33' style='width:70; height:70' onclick='mut(3,3)' /></td>
</tr>
</table>
<p id='p'>
</body>
</html>IV.2. Operații cu tablouri bidimensionale (adunare, înmulțire, determinant, transpusă)
Următoarele programe au fost scrise în CodeBlocks, software utilizat în predarea disciplinei Informatică pentru elevii de liceu.
Adunarea matricelor
Condiții: numărul de linii, respectiv numărul de coloane, sunt comune celor două matrice.
Algoritm: Sunt declarate două matrice. Citirea datelor se face din fișierul „adun1.txt”, care conține pe prima linie numărul de linii și de coloane, apoi, pe următoarele linii, elementele celor două matrice. Programul utilizează un subprogram pentru afișarea matricelor. Sunt afișate cele două matrice inițiale, iar matricea-sumă este calculată în prima matrice (se realizează economia de memorie). La final, este afișată matricea-sumă.
Codul sursă:
#include<iostream>
#include<fstream>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], b[20][10], m, n, i, j;
ifstream f("adun1.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>b[i][j];
cout<<"Matricele initiale:"<<endl;
afisare(a, m, n);
cout<<endl;
afisare(b, m, n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=a[i][j]+b[i][j];
cout<<endl;
afisare(a, m, n);
f.close();
return 0;
}
Înmulțirea matricelor
Înmulțirea unei matrice cu un scalar
Algoritm: Citirea datelor se face din fișierul „inmul1.txt”, care conține pe prima linie numărul de linii și de coloane, apoi, pe următoarele linii, elementele matricei. Programul utilizează un subprogram pentru afișarea matricei. Este afișată matricea inițială și scalarul. La final, este afișată matricea înmulțită cu un scalar.
Codul-sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], m, n, i, j, k;
ifstream f("inmul1.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
f>>k;
cout<<"Matricea initiala:"<<endl;
afisare(a, m, n);
cout<<endl;
cout<<"Scalar: "<<k<<endl;
cout<<endl<<"Matricea rezultat: "<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=a[i][j]*k;
cout<<endl;
afisare(a, m, n);
f.close();
return 0;
}
Înmulțirea a două matrice
Condiții: numărul de coloane al primei matrice este egal cu numărul de linii al celei de-a doua matrice.
Algoritm: Sunt declarate trei matrice. Citirea datelor se face din fișierul „inmul2.txt”, care conține pe prima linie numărul de linii și de coloane al primei matrice și numărul de coloana al celei de-a doua matrice, apoi, pe următoarele linii, elementele celor două matrice. Programul utilizează un subprogram pentru afișarea matricelor. Sunt afișate cele două matrice inițiale, iar matricea-produs este calculată. La final, este afișată matricea-produs.
Codul-sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[40][40], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[40][40], b[40][40], p[40][40], m, n, o, i, j, k;
ifstream f("inmul2.txt");
f>>m; f>>n; f>>o;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
for(i=0;i<n;i++)
for(j=0;j<o;j++)
f>>b[i][j];
for(i=0;i<m;i++)
for(j=0;j<o;j++)
p[i][j]=0;
cout<<"Matricele initiale:"<<endl;
afisare(a, m, n);
cout<<endl;
afisare(b, n, o);
cout<<endl<<"Matricea rezultat: "<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
p[i][j]=p[i][j]+a[i][k]+b[k][j];
cout<<endl;
afisare(p, m, o);
f.close();
return 0;
}
Determinantul unei matrice
Algoritm: Citirea datelor se face din fișierul „det.txt”. Programul utilizează un subprogram recursiv pentru calculul determinantului. Pentru aceasta, este utilizată metoda descompunerii determinantului după o linie: determinantul de m linii și n coloane în m*n determinanți formați dintr-o linie și o coloană. Semnele determinanților conform formulei:
, unde este complementul algebric.
Codul sursă:
#include<iostream>
#include<fstream>
#include<math.h>
using namespace std;
void submatrice(long int n,long int lin,long int col,long int a[50][50],long int b[50][50])
{
int i,j,c=0,l=1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(j!=col&&i!=lin) { c++;
if(c==n) {c=1;l++;}
b[l][c]=a[i][j];
}
}
long int det(long int a[50][50],long int n)
{
long int part,i,b[50][50],k,c,j,l,s=0;
if(n==1) { s=a[1][1];}
if(n==2) {
s=a[1][1]*a[2][2]-a[1][2]*a[2][1];}
else {
for(i=1;i<=n;i++)
{
submatrice(n,1,i,a,b);
s+=a[1][i]*pow(-1,i+1)*det(b,n-1);
}
}
return s;
}
int main()
{
ifstream f("det.txt");
long int a[50][50],n,i,j;
f>>n; //ordinul determinantului
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
cout<<det(a,n);
return 0;
}
Transpusa unei matrice
Algoritm: Citirea datelor se face din fișierul „trans.txt”. Se afișează matricea inițială. Se calculează și se afișează apoi matricea transpusă.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], t[20][10], m, n, i, j, k;
ifstream f("trans.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
cout<<"Matricea initiala:"<<endl;
afisare(a, m, n);
cout<<endl<<"Matricea transpusa: "<<endl;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
t[i][j]=a[j][i];
cout<<endl;
afisare(t, n, m);
f.close();
return 0;
}IV.3. Funcții de prelucrare în tablouri bidimensionale (interschimbarea elementelor, suma elementelor pe linii sau coloane)
Interschimbarea a două coloane
Algoritm: Citirea datelor se face din fișierul „intersch.txt”: numărul de linii și de coloane, elementele matricei și indicele coloanelor care trebuie interschimbate. Utilizând o variabilă auxiliară, se interschimbă cele două coloane, element cu element.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], t[20][10], m, n, i, j, x, y, aux;
ifstream f("intersch.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
cout<<"Matricea initiala:"<<endl;
afisare(a, m, n);
f>>x; f>>y;//coloanele de interschimbat
for(i=0;i<m;i++)
{
aux=a[i][x];
a[i][x]=a[i][y];
a[i][y]=aux;
}
cout<<endl<<"Matricea modificata: "<<endl;
afisare(a, m, n);
f.close();
return 0;
}
Suma elementelor de pe fiecare coloană
Algoritm: Citirea datelor se face din fișierul „mat.txt”. Pentru fiecare linie, se inițializează variabila s, în care se calculează suma, cu valoarea 0, se calculează suma elementelor de pe linie și se afișează suma, după parcurgerea liniei.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], t[20][10], m, n, i, j, s;
ifstream f("mat.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
cout<<"Matricea initiala:"<<endl;
afisare(a, m, n);
for(i=0;i<m;i++)
{
s=0;
for(j=0;j<n;j++)
s=s+a[i][j];
cout<<"Suma pe linia "<<i<<" este "<<s<<endl;
}
f.close();
return 0;
}
Numărul de elemente divizibile cu un număr k
Algoritm: Citirea datelor se face din fișierul „mat.txt”. Se verifică, element cu element, dacă este îndeplinită condiția de divizibilitate. De câte ori este îndeplinită condiția, variabila contor (c) se incrementează. La sfârșit, aceasta se afișează.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], t[20][10], m, n, i, j, c=0, k;
ifstream f("mat.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
cout<<"Matricea initiala:"<<endl;
afisare(a, m, n);
cout<<"Dati k: "; cin>>k;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(a[i][j]%k==0) c++;
cout<<"Sunt "<<c<<" elemente divizibile cu "<<k;
f.close();
return 0;
}
IV.4. Vectorizarea tablourilor bidimensionale
Definiție: Vectorizarea unei matrice înseamnă transformarea structurii bidimensionale într-o structură unidimensională (vector).
În urma vectorizării, se obține un vector cu m*n+2 componente, unde m și n sunt numărul de linii și, respectiv, numărul de coloane. Dimensiunea vectorului este cu două componente mai mare decât numărul de elemente ale matricei, deoarece pe ultimele două poziții se păstrează numărul de linii, respectiv numărul de coloane ale matricei. Este importantă păstrarea dimensiunilor matricei pentru o eventuala operație inversă (de la vector la matrice) sau pentru operațiile de adunare, scădere, transpunere și înmulțire cu matrice vectorizate. Traversarea matricei se face pe linii, prin urmare în vector regăsirea elementelor matricei este echivalentă cu punerea cap la cap a fiecărei linii.
Vectorizarea unei matrice
Algoritm: Se citește o matrice cu m linii și n coloane din fișierul „mat.txt”. Se creează un vector cu m*n+2. Ultimele două elemente, de pe pozițiile m*n și m*n+1, vor fi inițializate cu numărul de linii, respectiv de coloane ale matricei.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], v[500], m, n, i, j, k=0;
ifstream f("mat.txt");
f>>m; f>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
f>>a[i][j];
cout<<"Matricea initiala:"<<endl;
afisare(a, m, n);
v[m*n]=m; v[m*n+1]=n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
v[k]=a[i][j];
k++;
}
cout<<"Matricea vectorizata: "<<endl;
for(i=0;i<m*n+2;i++)
cout<<v[i]<<" ";
f.close();
return 0;
}
Obținerea matricei dintr-un vector obișnuit
Algoritm: Din fișierul „vector.txt” se citesc dimensiunea vectorului și elementele sale. De la tastatură, se citesc numărul de linii și de coloane ale noii matrice – m și n. Se verifică dacă m*n este egal cu dimensiunea vectorului citit. Dacă da, elementele matricei se inițializează cu elementele vectorului și se afișează matricea. Altfel, se afișează mesaj.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m, int n)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[20][10], v[500], m, n, o, i, j, k=0;
ifstream f("vector.txt");
f>>o;
for(i=0;i<o;i++)
f>>v[i];
m=v[o-2]; n=v[o-1];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
a[i][j]=v[k]; k++;
}
cout<<"Matricea este: "<<endl;
afisare(a, m, n);
f.close();
return 0;
}
IV.4. Proprietăți ale tablourilor bidimensionale pătratice
Afișarea elementelor de pe diagonala principală și cea secundară
Algoritm: Din fișierul „matp.txt” se citesc numărul de linii și elementele matricei pătratice. Se afișează matricea inițială. Se afișează apoi elementele aflate pe diagonala principală și elementele aflate pe diagonala secundară.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[10][10], m, i, j;
ifstream f("matp.txt");
f>>m;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
f>>a[i][j];
cout<<"Matricea initiala"<<endl;
afisare(a, m);
cout<<"Elementele de pe diagonala principala"<<endl;
for(i=0;i<m;i++)
cout<<a[i][i]<<" ";
cout<<endl<<"Elementele de pe diagonala secundara"<<endl;
for(i=0;i<m;i++)
cout<<a[i][m-1-i]<<" ";
f.close();
return 0;
}
Suma elementelor de deasupra diagonalei secundare și media aritmetică a elementelor de sub diagonala principală
Algoritm: Din fișierul „matp.txt” se citesc numărul de linii și elementele matricei pătratice. Se afișează matricea inițială. Se afișează apoi suma elementelor de deasupra diagonalei secundare și media aritmetică a elementelor de sub diagonala principală.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[10][10], s1=0, s2=0, nr=0, m, i, j;
ifstream f("matp.txt");
f>>m;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
f>>a[i][j];
cout<<"Matricea initiala"<<endl;
afisare(a, m);
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
if(i+j<m-1) s1=s1+a[i][j];
if(i>j)
{
s2=s2+a[i][j];
nr++;
}
}
cout<<"Suma elementelor de deasupra diagonalei secundare: "<<s1<<endl;
cout<<"Media aritmetica a elementelor de sub diagonala principala: "<<s2/nr;
f.close();
return 0;
}
Afișarea celor patru triunghiuri ale unei matrice pătratice
Algoritm: Din fișierul „matp.txt” se citesc numărul de linii și elementele matricei pătratice. Se afișează matricea inițială. Se afișează apoi elementele din cele patru triunghiuri ale matricei, utilizând relațiile menționate anterior.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[10][10], s1=0, s2=0, nr=0, m, i, j;
ifstream f("matp.txt");
f>>m;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
f>>a[i][j];
cout<<"Matricea initiala"<<endl;
afisare(a, m);
cout<<"Elementele triunghiului superior: "<<endl;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
if(i+j<m-1 && i<j) cout<<a[i][j]<<" ";
}
cout<<endl<<"Elementele triunghiului din dreapta: "<<endl;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
if(i+j>m-1 && i<j) cout<<a[i][j]<<" ";
}
cout<<endl<<"Elementele triunghiului inferior: "<<endl;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
if(i+j>=m && j<i) cout<<a[i][j]<<" ";
}
cout<<endl<<"Elementele triunghiului din stanga: "<<endl;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
if(i+j<m-1 && j<i) cout<<a[i][j]<<" ";
}
f.close();
return 0;
}
Spirala
Se citește un tablou bidimensional pătratic. Se cere să se afișeze elementele tabloului în ordinea rezultată prin parcurgerea acestuia în spirală, începând cu primul element al primei linii, în sensul acelor de ceas.
Exemplu: pentru matricea se afișează șirul 1 2 3 6 9 8 7 4 5.
Algoritm: Din fișierul „matp.txt” se citesc numărul de linii și elementele matricei pătratice. Se afișează matricea inițială. Se afișează apoi elementele „cercurilor concentrice” care alcătuiesc matricea, latură cu latură.
Codul sursă:
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void afisare(int a[20][10], int m)
{
int i, j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
cout<<setw(4)<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int a[10][10], k, m, i, j;
ifstream f("matp.txt");
f>>m;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
f>>a[i][j];
cout<<"Matricea initiala"<<endl;
afisare(a, m);
for(k=0;k<m;k++)
{
for(i=k;i<m-k;i++)
cout<<a[k][i]<<" ";
for(i=k+1;i<m-k;i++)
cout<<a[i][m-k-1]<<" ";
for(i=m-k-2;i>=k;i–)
cout<<a[m-k-1][i]<<" ";
for(i=m-k-2;i>=k+1;i–)
cout<<a[i][k]<<" ";
}
f.close();
return 0;
}
BIBLIOGRAFIE
Stefania BOCCONI, Augusto CHIOCCARIELLO, Giuliana DETTORI, Anusca FERRARI, Katja ENGELHARDT: Developing Computational Thinking in Compulsory Education, Centrul comun de cercetare al Comisiei Europene, 2016
Emanuela CERCHEZ, Marinel-Paul ȘERBAN: Programarea in limbajul C/C++ pentru liceu, Ed. Polirom, București, 2005
Ioan CERGHIT: Metode de învățământ, Editura didactică și pedagogică, 1976
Mioara GHEORGHE, Monica TĂTĂRÂM, Corina ACHINCA, Constanța NĂSTASE: Informatică – Manual pentru clasa a XI-a, Editura Corint, 2016
Michiel HAZEWINKEL: „Trace of a square matrix”, Encyclopaedia of Mathematics, Kluwer Academic Publishers, 2001
Vlad HUȚANU, Tudor SORIN: Informatică – Ciclul superior al liceului, clasa a XI-a, Editura L&S Soft, 2006
Donald E. KNUTH: Tratat de programare al calculatoarelor vol. I, Ed. tehnică, 1974
Carmen PETRE, Daniela POPA, Ștefania CRĂCIUNOIU, Camelia ILIESCU: Metodica predării Informaticii și Tehnologiei informației, Editura Arves, 2002
Alexandru Al. ROȘU: Teoria grafelor, algoritmi, aplicații (cap. 4. Matrice asociate grafelor, pp.98-113 & passim), Editura Militară, București, 1974
Herbet SCHILDT: C/C++ manual complet, Ed. Teora, București, 1997
Marin VLADA: Gândirea algoritmică – o filosofie modernă a matematicii și informaticii – Conferința Națională de Învățământ Virtual, Editura Universității din București, 2003
WEBOGRAFIE
http://oldsite.edu.ro/index.php/articles/12809
http://www.informaticainscoli.ro/doku.php?id=1.3priviredeansamblu
http://www.ise.ro/wp-content/uploads/2017/01/Informatica-si-TIC.pdf
https://ocw.cs.pub.ro/courses/programare/laboratoare/lab06
https://ro.wikipedia.org/wiki/Informatic%C4%83
https://www.todaysoftmag.ro/article/2623/gandirea-computationala-o-abilitate-pentru-oamenii-moderni
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Conceptul de dată [303361] (ID: 303361)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
