Documente Academic
Documente Profesional
Documente Cultură
TABLOURI
Cuprins Pagina
10 Tablouri 2
Test de autoevaluare 6
Recapitulare 9
1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
10. TABLOURI
Un tablou este o colecţie de date, de acelaşi tip, situate într-o zonă de memorie
continuă (elementele tabloului se află la adrese succesive). Tablourile sunt variabile
compuse (structurate), deoarece grupează mai multe elemente. Variabilele tablou au
nume, iar tipul tabloului este dat de tipul elementelor sale. Elementele tabloului pot fi
referite prin numele tabloului şi indicii (numere întregi) care reprezintă poziţia
elementului în cadrul tabloului.
În funcţie de numărul indicilor utilizaţi pentru a referi elementele tabloului, putem
întâlni tablouri unidimensionale (vectorii) sau multidimensionale (matricile sunt tablouri
bidimensionale).
2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
De exemplu, în secvenţa:
int k[50] ;
char c[8] ;
float a[100] ;
se declară tablourile c , k şi a cu, respectiv, 50 de elemente întregi, 8 elemente de tip
caracter şi 100 elemente de tip float.
3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Valorile din lista de valori sunt separate prin virgulă, iar întreaga listă este inclusă
între acolade:
Exemple:
1.
int vector[6]={100,101,102,103,104,105};
[0] [4]
Adresa elementului de indice i dintr-un tablou unidimensional poate fi calculată astfel:
adresa_elementului_i = adresa_de_bază + i lungime_element
4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
cout<<a[i]<<’ ’;
c) Afişarea elementelor unui vector în ordine inversă:
cout<<”Elementele vectorului în ordine inversă:”<<endl;
for (i=n-1; i>=0 i--)
cout<<a[i]<<’ ’;
#include <iostream.h>
#include <conio.h>
main()
{
int n, v[50],i,s=0;
cout<<"Dati numarul elementelor vectorului"; cin >>n;
for(i=1;i<=n;i++)
{
cout<<"elementul "<<i<<":";
cin>>v[i];
s=s+v[i];
}
cout<<"suma elemtelor vectorului este "<<s;
getch();
}
6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Test de autoevaluare 10
1. Se citeşte un vector cu n componente reale. Aflaţi minimul
dintre acestea.
#include <iostream.h>
#include <conio.h>
void main(){
int n, v[50],i, nr_poz =0; nr_neg =0; nr_nul=0 ;
cout<<"Dati numarul elementelor vectorului"; cin >>n;
for(i=1;i<=n;i++) {
cout<<"elementul "<<i<<":"; cin>>v[i];}
for(i=1;i<=n;i++) {
if (v[i]>0) nr_poz++;
else
if (v[i]<0) nr_neg++
else nr_nul++;}
cout<<nr_poz<<” elemente pozitive”<<endl;
cout<<nr_neg<<” elemente negative”<<endl;
cout<<nr_nul<<” elemente nule”<<endl;
getch( ); }
7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
xy ( x(
2
xy x y) y ) 2
Tablouri
8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
#include <iostream.h>
#include <conio.h>
main(){
int n, baza2[50],k=0,i;
/* vectorul baza2 retine cifrele binare (resturile la 2) ale numarului,
in ordinea in care acestea sunt aflate*/
cout<<"Codul =";cin >>n;
while (n!=0) {
k++;
baza2[k]=n%2;
n=n/2;}
cout<<"Codificarea binara a lui "<<n<<" este ";
for(i=k;i>=1;i--) cout<<baza2[i];
getch();
}
1. #include <iostream.h>
#include <conio.h>
main( )
{ int n, v[50],i,min;
cout<<"Dati numarul elementelor vectorului"; cin >>n;
for(i=1;i<=n;i++)
{
cout<<"elementul "<<i<<":";
cin>>v[i];
}
min=v[1];
for(i=2;i<=n;i++) if (min>v[i]) min=v[i];
cout<<"minimul este "<<min;
getch();
}
9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
2. #include <iostream.h>
#include <conio.h>
main()
{ int n, a[50],b[50],c[50],i;
cout<<"Dati numarul elementelor vectorilor"; cin >>n;
cout<<"vectorul a:"<<endl;
for(i=1;i<=n;i++)
{ cout<<"a["<<i<<"]:"; cin>>a[i]; }
cout<<"vectorul b:"<<endl;
for(i=1;i<=n;i++)
{ cout<<"b["<<i<<"]:"; cin>>b[i]; c[i]=a[i]+b[i]; }
for(i=1;i<=n;i++) cout<<c[i]<<" ";
getch();
}
Recapitulare
Datele de același tip pot fi organizate în tablouri, în vederea
prelucrării, acestea permițând prelucrarea lor, atunci când sunt în volum
mare.
Elementele unui tablou se memorează în locații succesive de
memorie și pot fi identificate prin numele tabloului şi indicii (numere
întregi) care reprezintă poziţia elementului în cadrul tabloului.
În funcţie de numărul indicilor utilizaţi pentru a referi elementele
tabloului, putem întâlni tablouri
unidimensionale (vectorii)
multidimensionale (matricile sunt tablouri bidimensionale).
Înainte de utilizare, variabilele de tip tablou trebuie declarate.
Sintaxa declarării unei asemenea variabile este:
nume_tablou [dim_1][dim_2]…[dim_n] ; unde:
tip reprezintă tipul elementelor tabloului (tip de bază), iar
dim_1,dim_2,...,dim_n sunt numere întregi sau expresii constante întregi
mărul(a căror valoare este evaluată la compilare) care reprezintă numărul
maxim de elemente ale tabloului.
Tablourile unidimensionale sunt tablouri cu un singur indice
(vectori). Dacă tabloul conţine n elemente, indicii elementelor au valori
10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Bibliografie
11
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
TABLOURI
Cuprins Pagin
a
Test de autoevaluare 8
Recapitulare 10
1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Exemplu:
double q[3][2]; // declararea matricii q, cu maxim3 linii şi 2 coloane, tip double
2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
#include <iostream.h>
void main(void)
{int a[10][10]; int lin, col; cout<<"Nr. linii:"; cin>>lin;
cout<<"Nr. coloane:"; cin>>col;int i, j;
//citirea elementelor unei matrici
for (i=0; i<lin; i++)
for (j=0; j<col; j++) {
cout<<"A["<<i<<","<<j<<"]="; //afişarea unui mesaj prealabil citirii
cin>>a[i][j]; }
//afişarea elementelor matricii
for (i=0; i<nr_lin; i++) {
for (j=0; j<nr_col; j++)
cout<<a[i][j]<<' ';
cout<<endl; // după afişarea elementelor unei linii, se trece pe linia următoare
}
}
cout<<”Diagonala principala:”<<endl;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++)
if (i==j) cout<<a[i][j]<<" "; cout<<endl;
cout<<”Diagonala secundara:”<<endl;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++)
if (j==n-i+1) cout<<a[i][j]<<" "; cout<<endl;
getch();}
#include <iostream.h>
#include <conio.h>
void main( ) {
int m,n,i,j, a[10][10], b[10][10],c[10][10];
cout<<"Nr. linii:";cin>>m;
cout<<"Nr. coloane:";cin>>n;
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) {
cout<<"a["<<i<<","<<j<<"]=";
cin>> a[i][j]; }
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) {
cout<<"b["<<i<<","<<j<<"]=";
cin>> b[i][j]; }
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) c[i][j]=a[i][j]+b[i][j];
for (i=1; i<=m;i++) {
for (j=1; j<=n;j++)cout <<c[i][j]<<" ";
cout<<endl;}
getch( ); }
5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
#include <iostream.h>
#include <conio.h>
void main(){clrscr();
int m,n,i,j, a[10][10], s ;
cout<<"Nr. concurenti: (linii in matricea a )"; cin>>m;
cout<<"Nr. probe (coloane in matricea a):";cin>>n;
//se introduc punctajele fiecarui concurent i, pentru fiecare proba j, in elementul a[i][j]
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) {
cout<<"Dati punctajul concurentului "<<i<<" proba "<<j<<":";
cin>> a[i][j];}
// se calculeaza punctajul total pentru fiecare concurent in variabila s
for (i=1; i<=m;i++) {s=0;
for (j=1; j<=n;j++) s=s+a[i][j];
cout<<"Concurent "<<i<<":"<<s<<endl; };
getch();}
Test de autoevaluare 11
1. Se citesc de la tastatură elementele unei matrici pătratice, de
dimensiune n, preluată. Să se afişeze suma elementelor de
deasupra diagonalei principale.
2. Se citește o matrice a, având m linii și c coloane. Afișați
matricea transpusă lui a.
8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
xy ( x(
2
xy x y) y ) 2
Tablouri
#include <iostream.h>
#include <conio.h>
void main(){ int n,i,j;
float a[10][10], s1=0, s2=0;
cout<<"Dimensiunea matricei:";cin>>n;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++) {
cout<<"Elementul["<<i<<","<<j<<"]=";
cin>> a[i][j];}
for (i=1; i<=n;i++)
for (j=1; j<=n;j++) {
if (n-i+1<j) s1=s1+a[i][j];
if (i>j) s2=s2+a[i][j];}
cout<<”s1=”<<s1<<endl;
cout<<”s2=”<<s2<<endl;
getch();}
9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
2. #include <iostream.h>
#include <conio.h>
void main(){clrscr();
int n,i,j;
float a[10][10];
cout<<"Nr. linii:"; cin>>m;
cout<<"Nr. coloane:"; cin>>n
for(i=1; i<=m; i++)
for(j=1; j<=n; j++) {
cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j]; }
for(j=1; j<=n; j++)
for(i=1; i<=m; i++) {
cout<<a[j][i]; cout<<endl; }
Recapitulare
Matricile sunt tablouribidimensionale, conținând informație de
același tip, organizată pe linii și coloane
Declararea unei variabile de tip matrice se face astflel:
tip nume[nrLinii, nrCol], unde tip=tipul de date al elementelor
nume=numele matricei
nrLinii =numărul maxim de linii
nrCol= numărul maxim de coloane
Identificarea unui element dintr-o matrice se face pe baza indicilor
acestuia, astfel:
nume[i,j] identifică în matricea nume elmentul din linia i și coloana j
Bibliografie
10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
TABLOURI
Cuprins Pagina
Test de autoevaluare 8
Recapitulare 10
1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Exemplu:
char tc[5] = {’a’, ’b’, ’c’, ’d’, ’e’};
char sc[5] = {’a’, ’b’, ’c’, ’d’, ’\0’};
char sc1[5] = ”abcd”;
char s[10];
cout<<sc<<’\n’; //afişează abcd
cout<<tc<<’\n’;
//eroare: tabloul de caractere nu conţine terminatorul de şir, deci nu poate fi
afişat ca şir
cout<<s<<’\n’; // eroare: tablou neiniţializat
cout<<sc1[2]; // afişează al treilea element din şirul sc1
sc1[1]=’K’; // elementului din şir de indice 1 i se atribuie valoarea ‘K’;
2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Nr. Efect
Funcţia
Crt.
Citeşte caractere de la tastatură şi le înscrie în şirul s, până
1 gets(s); întâlneşte caracterul ’\n’. Acest caracterul nu este înscris în
s, dar se adaugă terminatorul ’\0’.
2 puts(s); Afişează şirul s pe ecran şi trece la linie nouă.
3 strcpy(s1, s2); Copiază şirul s2 în şirul s1.
Copiază primele n caractere din şirul s2 în şirul s1 (pe
4 strncpy(s1, s2, n);
poziţia n, trebuie adăugat după copiere terminatorul ’\0’.
5 strcat(s1, s2); Adaugă şirul s2 la sfârşitul şirului s1.
Adaugă cel mult n caractere din şirul s2 la sfârşitul şirului
6 strncat(s1, s2, n);
s1.
În şirul s, caracterele litere mici sunt înlocuite cu caractere
7 strupr(s);
litere mari.
În şirul s, caracterele litere mari sunt înlocuite cu caractere
8 strlwr(s);
litere mici.
Inversează toate caracterele şirului s, exceptând
9 strrev(s);
terminatorul’\0’.
10 strset(s,c); În şirul s, toate caracterele sunt înlocuite cu caracterul c.
În şirul s, primele n caracterele sunt înlocuite cu caracterul
11 strnset(s,c,n);
c. Operaţia se încheie, dacă este întâlnit terminatorul’\0’.
12 strlen(s); Returnează lungimea şirului s.
Compară succesiv codurile ASCII ale celor două şiruri.
Returnează valoarea 0 dacă sunt identice, o valoare pozitivă
13 strcmp(s1, s2); dacă s1[k]>s2[k]; o valoare negativă dacă s1[k]<s2[k], unde
k este indicele unde apare prima diferenţă între caracterele
şirurilor.
strcimp(s1, s2); sau Idem strcmp, fără a face deosebire între literele mari şi
14
strcmpi(s1, s2); mici.
Idem strcmp, dar compară numai primelor n caractere ale
15 strncmp(s1, s2,n);
celor două şiruri
Idem strcmp, dar compară numai primelor n caractere ale
strncmpi(s1, s2,n); sau
16 celor două şiruri, fără a face deosebire între literele mari şi
strnicmp(s1, s2,n);
mici.
Returnează un pointer la prima apariţie a caracterului c în
17 strchr(s, c);
şirul s. Când caracterul nu este găsit, se returnează NULL
Returnează un pointer la ultima apariţie a caracterului c în
18 strrchr(s, c);
şirul s. Când caracterul nu este găsit, se returnează NULL
Returnează un pointer la prima apariţie a şirului s2 în şirul
18 strstr(s1, s2);
s1. Când şirul s2 nu este găsit, se returnează NULL
3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
Exemplu:
#include <iostream.h>
#include <string.h>
void main()
{
char sir1[] = ”abcd”, sir2[] = ”abcde”, sir3 = "abcdef”, sir4 =
"de”;
cout<<strcmp(sir1, sir2)<<’\n’; // afişare: -101
// ’e’ = 101, ’a’ = 97, ’d’ = 100
//’0’ - ’e’ = -101
cout<<strcmp(sir2, sir1)<<’\n’; //afişare: 101
cout<<strcmp(sir1, "")<<’ '; //compararea variabilei sir1 cu constanta şir
vid
char str1[20]=”hello”;
char str2[20]=”goodbye”;
char str3[20];
int difer, lungime;
cout<<”str1=”<<str1<<” str2=”<<str2<<’\n’;
difer=strcmp(str1, str2);
if (difer == 0)
cout<<”Siruri echivalente!\n”;
else if (difer>0)
cout<<str1<<” mai mare (lexicografic) decât
“<<str2<<’\n’;
else
cout<<str1<<” mai mic (lexicografic) decât “<<str2<<’\n’;
cout<<”str1=”<<str1<<’\n’; cout<<”str3=”<<str3<<’\n’;
strcpy (str3, str1); cout<<”str1=”<<str1<<’\n’;
cout<<”str3=”<<str3<<’\n’;
strcat (str3, str1);
cout<<”str1=”<<str1<<’\n’;
cout<<”str3=”<<str3<<’\n’;
}
Test de autoevaluare 12
4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
void main(){ clrscr( );
char s[100],c;
int i;
cout<<"dati sirul:"; cin.getline(s,100);
for (i=0;i<=strlen(s);i++) s[i]=toupper(s[i]);
cout<<s;
getch(); }
xy ( x(
2
xy x y) y ) 2
5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri
2. #include <iostream.h>
#include <conio.h>
#include <string.h>
void main(){ clrscr( );
char c, s[100];
cout<<"dati sirul:"; cin.getline(s,100);
cout<<"dati caracterul:"; cin>>c;
for (i=0;i<=strlen(s)-1;i++)
if (c==s[i]) cout<<i<<” ”;
getch(); }
Recapitulare
Bibliografie
6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Cuprins Pagina
Test de autoevaluare 11
Recapitulare 13
1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
În figura de mai sus, variabila x este memorată la adresa 1024 şi are valoarea
5. Variabila ptrx este memorată la adresa de memorie 1028 şi are valoarea 1024
(adresa variabilei x). Vom spune că ptrx pointează către x, deoarece valoarea variabilei
ptrx este chiar adresa de memorie a variabilei x.
Simbolul precizează că nume_pointer este numele unei variabile pointer de date, iar
tip este tipul obiectelor a căror adresă o va conţine.
Exemplu:
int *k; /* pointer de obiecte int */
int *c[8]; /* tablou de 8 pointeri catre intregi */
float *a; /* pointer de obiecte float */
float **a; /* pointer la pointer de obiecte float */
void *v; /* pointer void */
3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Exemple:
int x, y, q; q=&x;
q=8; // echivalentă cu x=8;
q=&5; // invalidă - constantele nu au adresă
x=9; // invalidă - x nu este variabilă pointer
x=&y; //invalidă: x nu este variabilă pointer, deci nu poate fi folosită cu
operatorul de indirectare
y= q + 3; // echivalentă cu y=x+3;
q = 0; // setează x pe 0
q += 1; // echivalentă cu ( q)++ sau cu x++
int r; r = q;
/* copiază conţinutul lui q (adresa lui x) în r, deci r va pointa tot către x (va
conţine tot adresa lui x)*/
double w, r = &w, r1, r2; r1= &w; r2=r1;
cout<<”r1=”<<r1<<’\n’; //afişează valoarea pointerului r1 (adresa lui
w)
cout<<”&r1=”<<&r1<<’\n’; // afişează adresa variabilei r1
cout<<” r1= ”<< r1<<’\n’;
double z= r1; // echivalentă cu z=w
cout<<”z=”<<z<<’\n’;
POINTERI GENERICI
Exemplu:
void v1, v2; int a, b, q1, q2;
q1 = &a; q2 = q1; v1 = q1;
q2 = v1; // eroare: unui pointer cu tip nu i se poate atribui un pointer generic
q2 = (int ) v1; double s, ps = &s;
int c, l; void sv;
l = (int ) sv; ps = (double ) sv;
(char ) sv = 'a'; /*Interpretare: adresa la care se găseşte valoarea lui sv
este interpretată ca fiind adresa zonei de memorie care conţine o data de tip
char. */
5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Exemplu:
int p1, p2;
if (p1<p2)
cout<<”p1=”<<p1<<”<”<<”p2=”<<p2<<’\n’;
else cout<<”p1=”<<p1<<”>=”<<”p2=”<<p2<<’\n’;
O operaţie uzuală este compararea unui pointer cu valoarea nulă, pentru a verifica
dacă acesta adresează un obiect. Compararea se face cu constanta simbolică
NULL (definită în header-ul stdio.h) sau cu valoarea 0.
Exemplu:
if (!p1) // sau if (p1 != NULL)
.....; // pointer nul
else . . . . ; // pointer nenul
6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
ptr++, respectiv ptr--, valoarea variabilei ptr devine ptr+sizeof(tip), respectiv, ptr-
sizeof(tip).
Este permisă scăderea a doi pointeri de obiecte de acelaşi tip, rezultatul fiind o
valoare întreagă care reprezintă diferenţa de adrese divizată prin dimensiunea
tipului de bază.
Exemplu:
int a, pa, pb;
cout<<”&a=”<<&a<<’\n’; pa=&a; cout<<”pa=”<<pa<<’\n’;
cout<<”pa+2”<<pa+2<<’\n’; pb=pa++; cout<<”pb=”<<pb<<’\n’;
int i=pa-pb; cout<<”i=”<<i<<’\n’;
Exemplu:
int a[10], ptr; // a este definit ca &a[0]; a este pointer constant
a = a + 1; // ilegal
ptr = a ; // legal: ptr are aceeaşi valoare ca şi a, respectiv adresa
elementului a[0]
// ptr este variabilă pointer, a este constantă pointer.
int x = a[0]; // echivalent cu x = ptr; se atribuie lui x valoarea lui a[0]
Aşa cum s-a arătat în capitolul 4, un şir de caractere poate fi memorat într-un
vector de caractere. Spre deosebire de celelalte constante, constantele şir de
caractere nu au o lungime fixă, deci numărul de octeţi alocaţi la compilare pentru
7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Exemplu:
char sir[10]; char psir;
sir = ”hello”; // ilegal
psir = ”hello”; // legal
Operaţia de indexare a elementelor unui tablou poate fi realizată cu ajutorul
variabilelor pointer.
Exemplu:
int a[10], ptr; // a este pointer constant; ptr este variabilă pointer
ptr = a; // ptr este adresa lui a[0]
ptr+i înseamnă ptr+(i sizeof(int)), deci: ptr + i & a[i]
Deoarece numele unui tablou este un pointer (constant), putem concluziona
(figura 5.2):
a+i & a[i]
a[i] (a+i)
8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Elementele unui tablou bidimensional sunt păstrate tot într-o zonă continuă de
memorie, dar inconvenientul constă în faptul că ne gândim la aceste elemente în
termeni de rânduri (linii) şi coloane (figura 5.3). Un tablou bidimensional este tratat ca
un tablou unidimensional ale cărui elemente sunt tablouri unidimensionale.
int M[4][3]={ {10, 5, -3}, {9, 18, 0}, {32, 20, 1}, {-1, 0, 8} };
Compilatorul tratează atât M, cât şi M[0], ca tablouri de mărimi diferite. Astfel:
cout<<”Marime M:”<<sizeof(M)<<’\n’; // 24 = 2octeţi
12elemente
cout<<”Marime M[0]”<<sizeof(M[0])<<’\n’; // 6 = 2octeţi 3elemente
cout<<”Marime M[0][0]”<<sizeof(M[0][0])<<’\n’; // 4 octeţi (sizeof(int))
Matricea M
M[0] 10 5 -3 Matricea M are 4 linii şi 3 coloane.
Numele tabloului bidimensional, M, referă întregul
9 18 0
M[1] tablou;
32 20 1 M[0] referă prima linie din tablou;
M[2] M[0][0] referă primul element al tabloului.
-1 0 8
M[3]
Matricea M
9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
primului element (M[0][0]) din linie (tablou unidimensional), deci M[0] este un pointer
către int: M = M[0] = &M[0][0]. Astfel, M şi M[linie] sunt pointeri constanţi.
Putem concluziona:
M este un pointer către un tablou unidimensional (de întregi, în exemplul anterior).
M este pointer către int (pentru că M[0] este pointer către int), şi M = (M + 0)
M[0].
M este întreg; deoarece M[0][0] este int, M= ( M) (M[0])= (M[0]+0)
M[0][0].
10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Test de autoevaluare 15
Alegeţi varianta de răspuns corectă (este una singură la fiecare item):
int a[100],*p,*q;
p=a+4; q=a+40;
cout<<(q – p);
a) 70 b) 36 c) 35 d) 72 e) secvenţa conţine erori
3. Ce afişează secvenţa?
int a[10],*p,*q=a+10;
for ( p=a; p<q; p++) *p=(q – p);
cout<<a[1];
a) 9 b) 1 c) 10 d) 0 e) secvenţa conţine erori
int a=3,*adr=&a;
++ (*adr);
cout<<*adr<< “ ”<<a;
a) 3 3 b) 4 4 c) 3 4 d) 4 3 e) secvenţa conţine erori
11
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
int a[10],*p, i;
*p=a;
for (i=0;i<10;i++) { *p=i; p++; }
cout<<*(a+3);
a) 3 b) 4 c) 5 d) 55 e) secvenţa conţine erori
a) *q=p;
b) q=&p;
c) i=*(a + i);
d) *q=*a;
#include<iostream.h>
void main(){
int *p, *q;
int a=3;
float b=7.5;
*p=a;
*q=b;
cout<<*p<<" "<<*q<<endl;
}
a) 3 7
b) 7 3
c) 3 7.5
d) 7.5 3
e) Se produce eroare la execuţia programului
( x( xy)y2)
x y xy
2
R: 1. E 2. D 3. a 4. e
12
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Recapitulare
13
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Pointeri
Bibliografie
1. Andonie, Răzvan; Gârbacea Ilie, Algoritmi fundamentali. O
perspectivă C++, Editura Libris, Cluj, 1995
2. Atanasiu, Adrian; Pintea Rodica, Culegere de probleme Pascal,
Editura Petrion, București, 1996
3. Cerchez, Emanuela; Șerban Marinel, Infomatica. Culegere de
probleme, Editura Polirom, Iași, 2002
4. Cerchez, Emanuela; Șerban Marinel, Programarea în limbajul
C/C++, Editura Polirom, Iași, 2005
5. Frâncu, Cătălin, Psihologia cursurilor de informatică, Editura
L&S Infomat, București, 1997
6. Jamsa, Kris; Klander, Lars, Totul despre C și C++, Editura
Teora, București, 2001
7. Livovschi, Leon; Georgescu Horia, Sinteza și analiza
algoritmilor, Editura Științifică și Enciclopedică, București, 1986
8. Lucanu, Dorel, Bazele proiectării programelor și algoritmilor,
Editura Universității Al. I. Cuza, Iași, 1996
14
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii