Sunteți pe pagina 1din 4

PCLP Laboratorul 8

Asist.drd.ing. Ana-Maria SUDUC

Laboratorul 8
Tablouri şi şiruri II

1. Noţiuni teoretice
1.1. Tablouri de şiruri
În programare utilizarea tablourilor de şiruri nu este atât de neobişnuită. De exemplu, procesorul de
introducere a datelor într-o bază de date poate compara comenzile utilizatorului cu un tablou de comenzi
valabile. Pentru a crea un tablou de şiruri se va folosi un tablou de caractere bidimensional. Dimensiunea
indicelui stâng va determina numărul de şiruri, iar a celui din dreapta controlează dimensiunea maximă a
fiecărui şir. Codul următor declară un tablou de 30 de şiruri, fiecare având lungime maximă de 79 de
caractere:
char tablou_siruri[30][80];
Un exemplu de utilizare a tablourilor cu şiruri veţi găsi la punctul 2. Aplicaţii.
1.2. Tablouri multidimensionale
C/C++ acceptă tablouri cu mai mult de două dimensiuni. Limita exactă, dacă există, este
determinată de compilator. Forma generală a unei declaraţii de tablou multidimensional este:
Tip nume[Dimensiune1][Dimensiune2][Dimensiune3]…[DimensiuneN]
Tablourile de trei sau de mai multe dimensiuni nu sunt folosite prea des, datorită cantităţii de
memorie necesară pentru stocarea acestora. De exemplu, un tablou de caractere cvadridimensional, având
dimensiunile 10, 6, 9, 4 necesită 10*6*9*4=2160 de octeţi. Dacă tabloul ar fi fost compus din întregi de 2
octeţi, ar fi necesari 4320 de octeţi, iar pentru double 17280 octeţi. Practic, spaţiul de memorie necesar se
măreşte exponenţial cu numărul de dimensiuni ale tabloului.
1.3. Ataşarea de indici la pointeri
În C/C++ pointerii şi tablourile sunt elemente foarte apropiate. Numele unui tablou fără indice
reprezintă un pointer al primului element al tabloului. Pentru
char p[10];
instrucţiunile: p şi &p[0] sunt identice, adică p = = &p[0].
Unui pointer i se poate ataşa un indice ca şi cum ar fi fost declarat ca fiind tablou. De exemplu, fie
următorul fragment de program:
int *p, i[10];
p = i;
p[5] = 100; /* atribuire folosind indice */
*(p+5) = 100; /* atribuire folosind aritmetica pointerilor */
Ambele instrucţiuni de atribuire plasează valoarea 100 în cel de-al şaselea element al tabloului i.
Pentru un tablou de 10x10 următoarele expresii sunt adevărate:
a == &a[0][0];
a[0][4] == *(a+4);
a[1][2] == *(a+12);
1.4. Iniţializarea unui tablou
C/C++ permite iniţializarea unui tablou în momentul declarării acestuia. Forma generală a
iniţializării unui tablou este similară cu aceea a iniţializării altor variabile:
tip_specificator nume_tablou[dimensiune1]…[dimensiuneN] = {lista_valori};
lista_valori este o listă de constante separate prin virgulă, al căror tip este comparabil cu tip_specificator.
Exemplu:

1
PCLP Laboratorul 8
Asist.drd.ing. Ana-Maria SUDUC

int [10] = {1,2,3,4,5,6,7,8,9,10};


Tablourile de caractere care conţin şiruri permit o iniţializare rapidă, de forma:
char nume_sir[dimensiune]=”sir”
Dacă în instrucţiunea de iniţializare a unui tablou, dimensiunea tabloului nu este specificată,
compilatorul de C/C++ creează automat un tablou suficient de mare pentru a memora toţi iniţializatorii.
Acesta se numeşte tablou nedimensionat. Pentru tablourile nedimensionate multidimensionale trebuie
precizate toate dimensiunile, în afară de cea situată cel mai la stânga.
2. Aplicaţii
2.1.Lansaţi în execuţie aplicaţia Visual C++ 2010 Express Edition:
Din meniul Start-> All Programs-> Microsoft Visual Studio 2010 Express, executaţi clic pe
opţiunea Microsoft Visual C++ 2010 Express.
2.2. Creaţi un nou proiect, Proiect8 şi un nou fişier File1.cpp:
a) Din meniul File->New, alegeţi opţiunea Project;
b) În fereastra New Project selectaţi opţiunea Win32 şi verificaţi să fie selectat Win32 Console
Application;
c) În câmpul Name introduceţi Proiect8 şi apăsaţi OK;
d) În fereastra deschisă apăsaţi Next şi apoi selectaţi opţiunea Empty Project şi apăsaţi Finish;
e) În secţiunea Solution Explorer executaţi clic dreapta pe directorul Source File şi alegeţi opţiunea
New-> Item;
f) În fereastra Add New Item selectaţi categoria Code şi verificaţi să fie selectată opţiunea C++
File (.cpp);
g) În câmpul Name tastaţi numele File1 şi apăsaţi Add.
2.3. În fişierul File1.cpp introduceţi şi testaţi următorul program care calculează şi afişează suma a n
numere:
#include <iostream>
using namespace std;

void main(void)
{
int a[20],n,i,s=0;
cout<<"Introduceti nr. de elemente: ";
cin>>n;
for (i=0; i<n; i++)
{
cout<<"Nr."<<i+1<<": ";
cin>>a[i];
}
for (i=0; i<n; i++)
{
s+=a[i];
}
cout<<"Suma elementelor este "<<s<<endl;
}
a) Tastaţi programul dat, respectând liniile de cod;
b) Compilaţi programul executând clic dreapta pe numele fişierului din secţiunea Solution Explorer
şi executând clic pe opţiunea Compile sau executând combinaţia de taste Ctrl+F7;
c) Corectaţi eventualele erori semnalate în secţiunea Output;
d) După rezolvarea eventualelor erori, rulaţi programul selectând, din meniul Debug, opţiunea Start
Without Debugging sau executând combinaţia de taste Ctrl+F5.
2.4. Modificaţi programul anterior astfel încât să calculeze şi suma şi produsul celor n numere date în
timpul rulării programului.

2
PCLP Laboratorul 8
Asist.drd.ing. Ana-Maria SUDUC

2.5. Modificaţi programul de la punctul 2.3. astfel încât să calculeze suma numerelor date care sunt
divizibile cu 3.
2.6. Testaţi următorul program care calculează raportul dintre sumele s1=1*1+2*2+3*3... +n*n şi
s2=2*1+2*2+2*3+2*4+... 2*n.
#include <iostream>
using namespace std;

void main()
{
int n, i;
float E, s1=0, s2=0;
cout<<"n=";
cin>>n;
for (i=1; i<=n; i++)
{
s1=s1+i*i;
s2=s2+2*i;
}
E=s1/s2;
cout<<"E="<<E<<endl;
}
2.7. Modificaţi programul anterior astfel încât să calculeze raportul dintre
s1=a[0]*a[0]+a[1]*a[1]+a[2]*a[2]... +a[n-1]*a[n-1] şi s2=2*a[0]+2*a[1]+2*a[2]+2*a[3]+... 2*a[n-
1], unde a[i] reprezintă al (i+1)-lea element al unui tablou de numere întregi.
2.8. Testaţi următorul program care afişează elementul maxim al unei matrici cu m linii şi n coloane.
#include <iostream>
using namespace std;
void main()
{
int i,j, m, n;
float a[20][20], max;
cout<<"Introduceti numarul de linii ale matricei: ";
cin>>m;
cout<<"Introduceti numarul de coloane ale matricei: ";
cin>>n;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
max=a[0][0];
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
if (max<a[i][j]) max=a[i][j];
}
cout<<"Maximul este: "<<max<<endl;
}
}
2.9. Realizaţi un program care să afişeze numărul minim de pe diagonala principală a unei matrice
pătratice de dimensiune nxn.
2.10. Testaţi următorul program care permite introducerea de linii de text. Programul se termină
când utilizatorul introduce un rând gol. Ulterior reafişează textul introdus.

#include <iostream>

#define MAX 100

3
PCLP Laboratorul 8
Asist.drd.ing. Ana-Maria SUDUC

#define LUNG 80

using namespace std;

char text[MAX][LUNG];

/* un editor de text */
void main(void)
{
int t,i,j;
cout<<"Introduceti un rand gol pentru a iesi din program.\n";
for (t=0; t<MAX; t++){
cout<<t<<": ";
cin.getline(text[t],LUNG);
if(!*text[t]) break; /*iesire din program pentru rand gol*/
}
for (i=0; i<t; i++){
for(j=0; text[i][j]; j++)
cout<<text[i][j];
cout<<'\n';
}
2.11. Realizaţi un program care calculează media aritmetică a numerelor impare ale unui vector cu
dimensiunea n.