Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Organizarea in structuri de date a datelor prelucrate de algoritmi simplifica multe dintre operatiile de prelucrare. Atunci cand organizam datele intr-o structura de date, trebuie sa identificam modul in care putem avea acces la ele si operatiile pe care le putem executa cu datele respective. Procesul de organizare a datelor in colectii este un proces care se desfasoara pe trei niveluri care interactioneaza intre ele:
Nivel conceptual - nivelul la care se dezvolta imaginea mentala a structurii de date; modul in care trebuie organizate datele si reactiile care exista intre ele
Nivel logic - nivelul la care se alege un model de implementare a structurii conceptuale
Nivel fizic - nivelul la care sunt stocate datele in memoria calculatorului si care implica anumite caracteristici ale operatiilor de accesare si de prelucrare a datelor din colectie, in functie de modul in care sunt memorate datele si de algoritmii implementati in limbaj pentru accesarea, citirea si scrierea datelor in memorie.
2. ORGANIZAREA DATELOR - TABLOUL DE MEMORIE
Consideram o firma de transport care are un parc de 10 masini, cu capacitati de transport diferite si trebuie sa determinam cate dintre aceste masini au cea mai mare capacitate de transport.
Stabilim structura de date necesara:
a) la nivel conceptual
Capacitatile de transport ale masinilor reprezinta un sir de numere intregi, aranjate intr-o ordine aleatorie, in care trebuie cautat numarul cel mai mare si de cate ori apare in sir.
b) la nivel logic
Implementarea permisa de limbajul C++ a unei colectii de date omogene este vectorul, fiecare numar intreg fiind un element al structurii.
Vom folosi urmatorii algoritmi:
Algoritmul pentru parcurgerea vectorului la memorarea numerelor
Algoritmul pentru determinarea valorii maxime intr-un sir de numere
Algoritmul de cautare in vector a elementelor cu o valoare precizata (valoarea maxima)
Numerele vor fi memorate intr-o zona continua de memorie interna, fiecarui numar alocandu-i-se acelasi spatiu pentru memorare. Identificarea unui element al structurii se face prin indicele sau.
a |
a |
a |
a |
a |
a |
a |
a |
a |
a |
In structura de date folosita, intre elementele structurii exista o relatie de ordine in care fiecare element are un succesor si un predecesor. Acest tip de structura este o structura liniara.
a1 = primul element - nu are predecessor
ai = element - succesorul sau este ai+1, iar predecesorul sau este ai-
an = ultimul element - nu are successor
Luand un alt caz, daca consideram ca avem situatia in care exista cinci contoare pentru energie electrica, contoare ce se citesc trimestrial si se inregistreza intr-un tabel consumul trimestrial (in mii kWh), pentru a determina: media consumului trimestrial, cel mai mic consum trimestrial, contorul cu cel mai mic consum si contorul cu cel mai mare consum, stabilim structura de date care se va folosi:
a) la nivel conceptual
Contoarele sunt organizate intr-un tabel cu patru linii si cinci coloane in care sunt memorate numere intregi. Tabelul va avea 4 linii, corespunzatoare celor 4 trimestre si 5 coloane, corespunzatoare celor cinci contoare.
b) la nivel logic
Implementarea permisa de limbajul C++ a unei colectii de date omogene este tabloul de memorie.
Vom folosi urmatorii algoritmi:
Algoritmul pentru parcurgerea tabloului de memorie pentru memorarea numerelor
Algoritmul pentru determinarea mediei aritmetice
Algoritmii de determinare a valorii minime, respectiv maxime.
Daca pentru reprezentarea datelor s-ar folosi tabloul de memorie cu o singura dimensiune (vectorul), algoritmii de prelucrare ar fi foarte complicati. De aceea in acest caz vom folosi un tablou bidimensional ( matrice) cu patru linii si cinci coloane. Identificarea unui element din tablou se va face nu printr-un indice, ci prin numarul liniei si numarul coloanei. Astfel daca numele tabloului bidimensional este b, elementul b2,3 este elementul din linia 2 si coloana 3 si are valoarea 32.
TRIMESTRE |
CONTOARE |
|||||
| ||||||
Un tablou bidimensional (matrice) este ca un tabel unde fiecare element se afla pe o anumita linie si o anumita coloana.
De exemplu, elementul de pe linia i si coloana j din matricea a se noteaza cu aij.Exemple:
a=
Elementul de pe linia 1 si coloana 3 este 9.
I. In sectiunea typedef se defineste tipul tablou bidimensional (matrice), iar in sectiunea de declaratii de variabile se declara variabila de tip matrice astfel:
typedef tip_componente id_matrice[dimensiune1][dimensiune2] ;
id_matrice nume_variabila;
unde:
id_matrice identificatorul (numele) tipului tablou bidimensional;
nume_variabila identificatorul (numele) variabilei tablou;
dimensiune1, dimensiune2 sunt doua numere naturale reprezentand tipul de date pentru indicii de linie respectiv de coloana;
tip_componente tipul de date al elementelor matricii si poate fi orice tip predefinit sau definit de utilizator.
II. In sectiunea de declaratii de variabile astfel:
tip_componente nume_variabila [dimensiune1][dimensiune2
unde: tip_componente, nume_variabila, dimensiune1 si dimensiune2 au aceeasi semnificatie ca mai sus.
Nu este obligatoriu sa utilizam: elementele liniei cu numarul de ordine zero si anume nume_variabila[0][0], nume_variabila[0][1] . .. nume_variabila[0][dimensiune2-1] si pe cele ale coloanei cu numarul de ordine zero adica pe nume_variabila[0][0], nume_variabila[1][0] . .. nume_variabila[dimensiune1-1][0]
Elementele unei matrici pot fi initializate prin utilizarea urmatoarei sintaxe:
tip_comp nume_var [ dim1][dim2]=, , , . . };
valorii,i=0,1,2 . reprezinta un sir de valori separate prin virgula
Elementele matricei se vor initializa in ordine astfel: linia cu numar de ordine zero cu sirul de valori valori0, linia cu numarul de ordine unu cu sirul de valori valori1, etc.
Exemple:
float a[10
- se declara o matrice a cu maxim 10 linii si maxim 15 coloane cu toate elementele de tip real. Tipul indicelui de linie este intervalul 0..9, iar tipul indicelui de coloana este intervalul 0..14.
typedef int matrice[11][25];
matrice a;
- se declara o matrice a cu maxim 11 linii si maxim 25 coloane cu toate elementele de tip integer. Tipul indicelui de linie este intervalul 0..10, iar tipul indicelui de coloana este intervalul 0..24.
typedef char matrice[6][6];
matrice a,b;
- se declara doua matrici a si b cu maxim 6 linii si maxim 6 coloane cu elemente de tip char (fiecare dintre matrici are maxim 36 de elemente).
4) typedef int matrice[5];
matrice a[5],b[5];
- se declara variabilele cu numele a si b de tip matrice, cu cate 5 componente, reprezentand fiecare cate un tablou cu 5 componente de tip integer (adica maxim 25 de componente de tip integer).
5) enum culori ;
culori a[10][15], b[10][15], c[10][15];
- se declara trei matrici cu numele a, b si c cu tipul indicelui de linie intervalul 0..9 si tipul indicelui de coloana intervalul 0..14 (matricile au maxim 150 elemente)
double a[2][2]=,};
- se declara o matrice cu numele a, cu indicele de linie avand doua valori 0 si 1 iar cel de coloana avand tot valorile 0 si 1, deci matricea are maxim 4 elemente, tipul acestora fiind double, elemente care in urma initializarii vor avea valorile: a[0][0] va memora valoarea 1.2, a[0][1] va memora valoarea 3.22, a[1][0] va memora valoarea 5.67 si a[1][1] va memora valoarea 7.89.
-elementele diagonalei principale
a 1],a[2][2], a[3][3], , a[n][n].
- elementele diagonalei secundare:
a[1][n], a[2][n-1], a[3][n-2], , a[n][1].
Se scrie numele variabilei urmat intre paranteze drepte de pozitia liniei si intre alte paranteze drepte de pozitia coloanei in matrice (aceasta poate fi o valoare sau o expresie indiceala).
Exemple: Presupunem ca matrice are ca elemente valorile:
Fie declaratia:float a[2][3];
atunci:
a[0][0] - reprezinta elmentul de pe linia 0 si coloana 0 si are valoarea 3;
a[0][1] - reprezinta elmentul de pe linia 0 si coloana 1 si are valoarea 7;
a[1][2] - reprezinta elmentul de pe linia 1 si coloana 2 si are valoarea 5;
Variabilele de tip matrice nu se pot citi/scrie direct cu instructiunile cin/cout. Prezentam in continuare modalitatea prin care se poate face aceasta
Ca si-n cazul vectorilor, si la matrici trebuie citite mai intai numarul de linii respectiv de coloane, apoi pe rand folosind o instructiune repetitiva fiecare element al matricii. Ne propunem sa citim o matrice a cu m linii si n coloane.
Aceasta se realizeaza astfel:
cout<<'m=';cin>>m;
cout<<'n=';cin>>n;
for(i=1;i<=m;i++)
for (j=1;j<=n;j++)
Vom afisa matricea citita anterior (afisarea se va face pe linii).
for(i=1;i<=m;i++)
O componenta a unei variabile de tip tablou bidimensional primeste valoarea unei alte componente a altei variabile de acelasi tip tablou bidimensional ;
Nu pot avea loc atribuiri de forma x=y unde x si y sun tablouri bidimensionale.
Elementul a[i][j] al unui tablou bidimensional se identifica prin:
a[i][j] sau *(a[i]+j) sau *(j+a[i]) sau i[a][j] sau j[a[i]] sau j[i[a]] sau *(*(a+i)+j) sau
*(a+j+dimensiune2*i) sau *(&a[0][0]+dimensiune2*i+j)
6. APLICATII
Putem face aceasta citire utilizand un tablou bidimensional. Valorile elementelor le vom citi pozitie cu pozitie, utilizand doua instructiuni for.
#include <iostream.h>
int main()
return 0;}
Daca presupunem ca avem de scris un program mai complicat , cu operatii dificile cu matrici. Dorim sa testam programul pentru o matrice de 5 linii si 5 coloane. Introducem cele 25 elemente, programul nu functioneaza corect
Pentru a evita cazul de mai sus utilizam o citire speciala, dintr-un fisier extern. Pe prima linie este scris numarul de linii si numarul de coloane, apoi, pe urmatoarele n linii sunt scrise cele m coloane. Un exemplu concret:
"matrice.txt" Putem citi elementele si
insirate unul dupa altul, insa nu vom
gasi cu usurinta coordonatele
fiecaruia.
Programul acum va include "fstream.h" in loc de "iostream.h". Putem folosi in continuare "cin" si "cout" numai ca avem acces si la "ifstream" sau "ofstream". Pentru exemplificare, afisam matricea citia din "matrice.txt" in alt fisier text, "rezult.txt". Mai jos regasim acelasi program dar acum el utilizeaza citirea din fisier.
#include <fstream.h>
ifstream fin('matrice.txt');
ofstream fout('rezult.txt');
int main()
return 0;}
Nu este nevoie sa creem fisierul "rezult.txt", deoarece a fost creat automat de program.
Din definitia transpusei unei matrice rezulta ca matricea este simetrica daca si numai daca:
|
Forma generala a unei matrice simetrice este:
|
In relatie se observa simetria elementelor fata de diagonala principala a matricei .In particular, matricea patratica nula este simetrica.
Probleme:
Scrieti un program care construieste matricea dupa modelul :
pt. n=5 obtinem matricea:
5 1
4 1
1 1 1 1
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
int a[12][12],i,j,n;
void main()
getche();
Sa se citeasca o matrice cu m linii si n coloane cu elem numere intregi, sa se afiseze matricea si sa se calculeze maximul de pe o linie data de la tastatura Se vor folosi subprograme recursive pt citire, afisare si det maximului dintr-un vector.
#include <iostream.h>
#include <conio.h>
int a[10][10],m,n;
void citeste(int a[][10],int m,int n,int i,int j)
else citeste(a,m,n,i+1,1);
int max(int v[],int nr)
void scrie(int a[10][10],int i,int j)
else
}
void main()
7. BIBLIOGRAFIE
C. Apostol, B. Ghilic-Micu, I. Rosca, V. Rosca, Introducere in programare. Teorie si practica Pascal, Ed. Viata Romaneasca, 1993.
T. Balanescu, S. Gavrila, H. Georgescu, M. Gheorghe, L. Sofonea, I. Vaduva, Pascal si Turbo Pascal, Vol. I, II, Ed. Tehnica, 1992.
Fl.
M. Boian, Sisteme de operare interactive, Ed. Libris,
V. Cristea, C. Giumale, E, Kalisz, Al. Paunoiu, Limbajul C standard, Ed. Teora, Bucuresti, 1992
V. Patriciu, Sisteme de operare pentru minicalculatoare si microcalculatoare, Ed. Militara, 1992.
D. Rancea, Limbajul Turbo Pascal, vol I, II, Ed. Libris, Cluj-Napoca, 1993.
T. Spircu, Introducere in informatica, Ed. Teora, 1993.
I. Vaduva, Gh. Barbu, Bazele Informaticii, Editura Tehnica, 1997.
M. Vlada, Informatica, Ed. Ars Docendi, Bucuresti, 1999.
Gazeta de Informatica, 1999 - 2000.
Copyright © 2024 - Toate drepturile rezervate