Author
adriana
View
263
Download
0
Embed Size (px)
8/8/2019 Programarea Calculatoarelor M6
1/10
Programarea Calculatoarelor (limbajul C)
Curs 6 Tipuri de date compuse
Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i
Tehnologia Informaiei
.l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN
2010-20112
Cuprins
6.1. Lucrul cu tablouri
6.2. Lucrul cu iruri de caractere
6.3. Lucrul cu structuri
Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 1/54
3
6.1. Lucrul cu tablouri
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 2/54 Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 3/54
Tablouri de date
> Un tablou este ostructur omogen format dintr-omulime finit de elemente de acelai tip, denumit i tipde baz.
informaia este stocatsub form matriceal
sursa principal deinformaie sunt cifrele,
sursa secundar deinformaie este dat derelaiile de vecintate.
84.23
9.12.22
5.134.3Exemplu:
2.2 are ca vecini la: N -3, S 2.4, V 2 i E 1.9.
Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 4/54
Tablouri de date (continuare)
> Informaia de vecintate este esenial i constituie motivulfolosirii tablourilor i nu a unei liste de valori.Exemplu: dispunem de 14 valori de0, 26 valori de1 i9 valori de0.5 .
valori independente n memorie
00.5
1
0.50
00
1
0
0.5
10
0 1 etc.
valori cu vecintate pe o direcie
1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 etc.
Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 5/54
110.50.50.511
110.50.50.501
110.50.50.501
1100001
1100001
1100001
1111111
Tablouri de date (continuare)
Exemplu: dispunem de 14 valori de0, 26 valori de1 i9 valori de0.5 (continuare)
valori cu vecintate pe dou direcii datele ncep s capetesens datorit informaiilor suplimentare.
imagine cu dou obiecte
8/8/2019 Programarea Calculatoarelor M6
2/10
7Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 6/54
Tablouri de date (continuare)
n continuare vom discuta despre urmtoarele tipuri detablouri de date:
- vectori de date
- matrice bidimensionale
- iruri de caractere
- matrice n-dimensionale (n>2)
Observaie : nsi modul de reprezentare al datelor n memorieeste unul matriceal, astfel c lucrul cu tablouri de date(definire, manevrare) este eficient i totodat favorizat.
8Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 7/54
Tablouri de date (continuare)
Vectori
> Un vector reprezint o colecie de date de acelai tipreprezentate sub forma unei linii sau coloane.
[ ]Exemplu:
> Datele sunt identificate prin poziia acestora n vector ce este dat deindice .
0 1 2 3
sau
> n limbajul C vom folosi primul tip dereprezentare a vectorilor i anume sub forma uneilinii.Atenie: indicele primului element este ntotdeauna 0.
0
1
2
3
9Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 8/54
Tablouri de date (continuare) Vectori (continuare)
> Modul de definire a unui vector n limbajul C:
[];
tipul datelor coninute de vector:ex .: int, char, float
numele variabileide tip vector (identificator)
numrulmaximde elementeale vectorului
Exemple:
int x[100];float y[50];
-variabilax este un vector cu 100de valorintregi ,
-variabilay este un vector cu 50de valorireale .
10Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 9/54
Tablouri de date (continuare) Vectori (continuare)
> Modul de alocare al memoriei unui vector:
int x[4];aceast modalitate de alocare a memoriei
este de tip static , sistemul de calcul alocnd nmemorie numrul specificat de valori, indiferentdac acestea vor fi folosite sau nu.
> Astfel, se aloc 4 locaii de memorie consecutive de tipint ,ce vor corespunde valorilor vectorului x:
32 bii 32 bii 32 bii 32 bii
> Fiecare locaie este identificat prin adresa sa n memorie(adresele sunt consecutive).
adr. N adr. N+1 adr. N+2 adr. N+3
123 324 456 100adr. N adr. N+1 adr. N+2 adr. N+3
indici: 0 1 2 3
11Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 10/54
Tablouri de date (continuare)
Vectori (continuare)> Modul de accesare al valorilor vectorului din memorie:
printf (%d,x);x stocheaz adresa din memorie aprimului element din vector (N ),
printf (%d,x[2]);x[2] reprezintvaloarea din a treialocaie de memorie a vectorului x (456),
printf (%d,&x[3]);operatorul& returneazadresa dinmemorie a variabilei ce il succede (N+3)
12Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 11/54
Tablouri de date (continuare)
Vectori (continuare)> Exemplu citire vector:
int v[10], i;for (i=0; iv[0]=12 (enter)>v[1]=45 (enter)>v[2]=14 (enter)
> Observaie : nu este obligatoriu s folosesc toate valorilealocate, n acest caz 10, pot folosi un numr mai mic, dar nuun numr mai mare eroare .Rezultat: v[0]=12, v[1]=45, v[2]=14, v[3]=?, , v[9]=?, v[10]
8/8/2019 Programarea Calculatoarelor M6
3/10
13Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 12/54
Tablouri de date (continuare) Vectori (continuare)
Exemplu:
int v[200], dim, i, max;printf (dimensiune vector=);scanf (%d,&dim);for (i=0; i
8/8/2019 Programarea Calculatoarelor M6
4/10
19Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 18/54
Tablouri de date (continuare) Matrice 2D (continuare)
> Modul de definire a unei matrice n limbajul C:
[][];
tipul datelor coninute de matriceex .: int, char, float
numele variabileide tip matrice(identificator)
numrulmaximde linii i coloaneale matricei
Exemple:
int x[10][10];float y[5][10];
- variabilax este o matrice ce conine 100de valorintregi , pe 10 linii i 10 coloane
- variabilay este o matrice ce conine 50de valorireale, pe 5 linii i 10 coloane.
20Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 19/54
Tablouri de date (continuare) Matrice 2D (continuare)
> Modul de alocare al memoriei unei matrice:
int m[2][4];alocarea este tot detip static , sistemul de
calcul alocnd n memorie numrul specificat devalori.
> Astfel, se aloc 2x4 locaii de memorie consecutive de tipint ,ce vor corespunde liniilor i coloanelor matriceim:
32 bii 32 bii 32 bii 32 bii
> Observaie: adresele sunt de regul consecutive.
32 bii 32 bii 32 bii 32 biiadr. N adr. N+1 adr. N+2 adr. N+3
adr. N+4 adr. N+5 adr. N+6 adr. N+7
21Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 20/54
Tablouri de date (continuare) Matrice 2D (continuare)
> Modul de accesare al valorilor matricei din memorie:
123 324 456 100
34 5 258 199adr. N adr. N+1 adr. N+2 adr. N+3
indici: 0 1 2 30
1adr. N+4 adr. N+5 adr. N+6 adr. N+7
printf (%d,m); m stocheaz adresa din memorie aprimului element din matriceam (N ),
printf (%d,m[1] );m[1] reprezintadresa liniei de indice1, i anume a primului element alacesteia (N+4),
22Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 21/54
Tablouri de date (continuare) Matrice 2D (continuare)
> Modul de accesare al valorilor matricei din memorie (cont.):
Observaie : practic o matrice este o colecie de vectori linie, ncazul de fa avem doi vectori de adrese N i N+4.
123 324 456 100adr. N adr. N+1 adr. N+2 adr. N+3
indici: 0 1 2 30
1 34 5 258 199adr. N+4 adr. N+5 adr. N+6 adr. N+7
printf (%d,m[1][3] );m[1][3] reprezintvaloarea de pelinia de indice 1, i coloana de indice3, a matriceim (199),
23Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 22/54
Tablouri de date (continuare)
Matrice 2D (continuare)> Modul de accesare al valorilor matricei din memorie (cont.):
123 324 456 100adr. N adr. N+1 adr. N+2 adr. N+3
indici: 0 1 2 30
1 34 5 258 199adr. N+4 adr. N+5 adr. N+6 adr. N+7
printf (%d,&m[1][3] );&m[1][3] reprezintadresa dememorie a elementului de pe liniade indice 1 i coloana de indice 3
24Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 23/54
Tablouri de date (continuare)
Matrice 2D (continuare)> Exemplu citire matrice:
int m[10][10], i, j;for (i=0; iv[0][1]=45 (enter)>v[1][0]=14 (enter)
> Observaie : ca i n cazul vectorilor, nu este obligatoriu sfolosesc toate locaiile alocate, pot folosi un numr mai mic delinii sau coloane, dar nu mai mare eroare .
>v[1][1]=42 (enter)
8/8/2019 Programarea Calculatoarelor M6
5/10
25Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 24/54
Tablouri de date (continuare) Matrice 2D (continuare)
Exemplu:
int m[5][10], Nl, Nc;int i, j, prod=1;printf (Nl si Nc:);scanf (%d %d,&Nl, &Nc);for (i=0; i
8/8/2019 Programarea Calculatoarelor M6
6/10
31Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 30/54
Tablouri de date (continuare) Matrice 2D (continuare)
for (x=0; x n practic este ineficient reprezentarea static a matricelor
cu dimensiuni mai mari de n=3, datorit necesarului dememorie deloc neglijabil.
eroare : out of memory
35Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 34/54
6.2. Lucrul cu iruri de caractere
36Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 35/54
> Limbajul Cnu pune la dispoziia utilizatorului un tip individualde date care s permit stocarea irurilor de caractere(exemplu din alte limbaje: String, AnsiString, etc.)
iruri de caractere
un ir de caractere = o mulime ordonat de caracterealfanumerice (string).
Exemplu: exemplu ir ={e,x,e,m,p,l,u, ,,i,r }
Observaie : constantele ir de caracter sunt marcatecu ghilimele
Observaie : constantele detip caracter sunt marcatecu apostrof
> Limbajul C permite totui lucrul cu iruri de caractere, dar acestea sunt reprezentate cavectori de caractere .
8/8/2019 Programarea Calculatoarelor M6
7/10
37Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 36/54
iruri de caractere (continuare)
> Modul de alocare al unui ir de caractere:
char x[100];variabilax reprezint un ir de caractere
ce poate conine maxim 99 de caractere.
> Principiul alocrii memoriei este identic cu cel folosit lavectori, irul de caractere fiind un vector de tip char.
8 bii 8 bii \0
> Atenie: un ir de caractere se ncheie ntotdeauna cucaracterul special \0 sau NULL (sfrit de string)
adr. N adr. N+98 adr. N+99...
dimensiunea vectorului = nr.caractere+138
Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 37/54
iruri de caractere (continuare)> Modul de citire al irurilor de caractere
char s[5];int i;for (i=0;i Lucrul cu irurile de caractere:
bineneles c toate operaiile ce pot fi efectuate cu vectori,sunt valabile i la lucrul cu irurile de caractere,
limbajul C pune totui la dispoziia utilizatorului o bibliotecde funcii de lucru cu iruri de caractere,string.h :
Atenie: irurile de caractere sunt vectori, astfel:
- strcmp : compar dou iruri,- strcpy : copiaz un ir n altul,
- strlen : determin dimensiune string, etc.
char s[100];s=proba;
eroare , nu se pot face atribuiri directei nici calcule cu iruri.
40Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 39/54
iruri de caractere (continuare)
> Exemplu: concatenarea a dou iruri.
char s1[100], s2[100], s3[200];int i, pos;printf (Introduceti doua siruri:);scanf (%s %s,s1, s2);for (i=0; i Pe lng reprezentarea datelor sub form matriceal (dateomogene), limbajul de programareC mai permite i lucrul custructuri de date : grupuri de date neomogene (tipuri diferite).
> n acest sens, exist tipurile urmtoare:
8/8/2019 Programarea Calculatoarelor M6
8/10
43Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 42/54
Tipul struct
P S se realizeze un program care s permit stocareai manipularea datelor personale a N persoane.
nume ir de caractere (char []),prenume ir de caractere (char []),vrst numr ntreg (int ),
nlime numr real (float ),ocupaie ir de caractere (char []).
Exemplu de persoan:
> Problema este simpl dac ar fi vorba de o singur persoan,ce facem dac trebuie s introducem aceste date pentru 1000de persoane ?
x1000~5000 devariabileindep. !
44Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 43/54
Tipul struct (continuare)
> Soluia exist de mult timp n domeniul bazelor de date, undeastfel de colecii erau reprezentate pe baza nregistrrilor:
7 HoundstoothRd.15-Nov-199402-Jul-1969Ms.Sales RepresentativeAnneDodsworth
4726 -11th Ave. N.E.05-Mar-199409-Jan-1958Ms.Inside Sales Coordinator LauraCallahanEdgehamHollow Winchester Way02-Jan-199429-May-1960Mr.Sales RepresentativeRobertKing
Coventry House Miner Rd.17-Oct-199302-Jul-1963Mr.Sales RepresentativeMichaelSuyama14 Garrett Hill17-Oct-199304-Mar-1955Mr.Sales Manager StevenBuchanan4110 Old Redmond Rd.03-May-199319-Sep-1958Mrs.Sales RepresentativeMargaretPeacock
722 Moss Bay Blvd.01-Apr-199230-Aug-1963Ms.Sales RepresentativeJanetLeverling908 W. Capital Way14-Aug-199219-Feb-1952Dr.Vice President, SalesAndrewFuller
507 -20th Ave. E. Apt. 2A01-May-199208-Dec-1968Ms.Sales RepresentativeNancyDavolioAddressHire DateBirth DateTitle Of CourtesyTitleFirst NameLast Name
Exemplu baz de date:
se definesc o serie de tipuri dedate (variabile)
definite o singur dat
ceea ce se schimb suntvalorile pentru fiecare persoan
nregistrri
45Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 44/54
Tipul struct (continuare)
> Limbajul C permite manipularea acestor tipuri de date prinfolosireastructurilor ,structur de date= o colecie devariabile , de regul, detipuri diferite, ce se reunesc ntr-o singur variabil container.
struct {{{{
;... ;
}}}};
Sintax: - am definit un nou tipde date (structur)numit:
- acesta conine oserie de alte tipuri dedate, TipA TipX.
; se ncheie definiia.46
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 45/54
Tipul struct (continuare)
struct Persoana{{{{char nume[100];char prenume[100];int varsta;float inaltime;
}}}};
Exemplu:-am definit tipul de datestructura numit:Persoana
-acesta va permite stocarea adou iruri de caractere, a unuiint i a unui numr real.
> Deocamdat am definit doar tipul de date, nu i o variabilcare s stocheze aceste date, pentru aceasta:
struct Persoana OPersoanaAnume;variabilaOPersoanaAnumeeste de tipPersoana .
47Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 46/54
Tipul struct (continuare)
struct Persoana OPersoanaAnume;variabilaOPersoanaAnumeeste de tipPersoana .
> Declararea variabilelor struct (continuare):
> Efect : n memorie se va aloca spaiu pentru stocarea a100+100 de caractere (200x8bii), a unui int (32 bii) i a unuifloat (32 bii).> Aceste locaii de memorie vor fi adresate prin intermediulvariabilei OPersoanaAnume:
OPersoanaAnume
.nume[100]
.prenume[100]
.varsta
.inaltime48
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 47/54
Tipul struct (continuare)
> Citirea i manipularea variabilelor unei structuri:struct Patrat{{{{int latura;float arie;
}}}} P1, P2;printf (Patrat 1:);scanf (%d, &P1.latura);P1.arie=P1.latura*P1.latura;printf (\nPatrat 2:);scanf (%d, &P2.latura);P2.arie=P2.latura*P2.latura;printf (Suma arii este: %f, P1.arie+P2.arie);
- elementele sunt adresate prin:P1.latura i P1.arie , acesteafiind practic ele nsele nitevariabile (fac parte din P1).
- variabilele de tip structur pot fidefinite idirect dup specificareatipului.
- calculele se realizeazfolosind variabilele, ca i cum ar fi independente.
8/8/2019 Programarea Calculatoarelor M6
9/10
49Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 48/54
Tipul struct (continuare)Exemplu:
struct Patrat{{{{int latura;float arie;
}}}};struct Patrat MultePatrate[100];int i;for (i=0;i Din punct de vedere al sintaxei i al modului de declarare alvariabilelor, acesta este identic cu tipulstruct , astfel:
union {{{{
;... ;
}}}};
Sintax: - am definit un nou tipde date (uniune)numit:
- acesta conine oserie de alte tipuri dedate, TipA TipX.
; se ncheie definiia.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 51/54
Tipul union (continuare)
union VarHibrida{{{{int Ix;float Fx;double Dx;char Cx[8];
}}}} proba;
Exemplu: -am definit tipul de date uniunenumit:VarHibrida
-lista datelor ce pot fi coninutede acesta,
-variabila proba este de acest tip,i anumeVarHibrida .
> Efect : n memoriese va aloca spaiu pentru a putea stocavaloarea variabilei, din lista de variabile a uniunii, ce necesitspaiul de memorie cel mai mare :
int = 32 bii, float = 32 bii, double = 64 bii, char [8] = 64 bii
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 52/54
Tipul union (continuare) union VarHibrida{{{{int Ix;float Fx;double Dx;char Cx[8];
}}}} proba;
> Nu se aloc spaiu pentru toatevariabilele, ci doar suficient spaiu pentrua putea stoca oricare dintre valorile variab.
64 biiadr. N
> Astfel, la un moment dat, variabila proba nu va putea aveadect una dintre valorile enumerate: int, float, double sau char.
proba.lx=10;proba.Fx=10.5;scanf (%s,proba.Cx);
Exemplu:
1010.5coduri ASCII: 8bii 8bii ... 8bii
> Fiind disponibil doar o locaie dememorie, valorile sunt suprapuseprogresiv pe msur ce suntschimbate.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 53/54
Tipul union (continuare)
union Utest{int x, y, z;
} Var;Var.y=3; Var.z=20;printf (%d %d %d, Var.x, Var.y, Var.z);
Exemplu: ce se afieaz pe ecran?20 20 20
x, y i z sunt stocate la aceeailocaie de memorie.
union Utest{int x, z; float y;
} Var;Var.y=3.3; Var.z=20;printf (%d %f %d, Var.x, Var.y, Var.z);
Exemplu: ce se afieaz pe ecran?20 0.00000 20 de ce???
memorie Var 33x10 -1=100001 120=00000 10100
int float int
8/8/2019 Programarea Calculatoarelor M6
10/10
55Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 54/54
Sfritul Cursului 6