Sunteți pe pagina 1din 13

Lucrarea de laborator nr.

Siruri de caractere si tablouri bidimensionale

1. Scopul lucrarii

In aceasta lucrarea se prezinta cateva notiuni generale despre tablourile


bidimensionale si despre sirurile de caractere. De asemenea, se descriu cateva
aplicatii simple si se propun teme pentru consolidarea cunostintelor dobandite.

2. Breviar teoretic

Tablouri bidimensionale

Declararea matricelor

Definiţie:
Un tablou este o colecţie de date de acelaşi tip, memorate într-o zonă continuă
de memorie.

Un tablou care conţine două sau mai multe linii şi două sau mai multe coloane,
poartă numele de tablou bidimensional sau matrice.

Declararea unui tablou bidimensional:


Pentru un tablou bidimensional, la declarare trebuiesc precizate două
dimensiuni (numărul de linii şi numărul de coloane).

tip nume[număr_linii][număr_coloane]

unde:
tip poate fi orice tip din C
nume este un identificator C reprezintă numele tabloului
numar_linii este o expresie constantă întreagă pozitivă, reprezentând numărul
de linii ale tabloului
numar_coloane este o expresie constantă întreagă pozitivă, reprezentând
numărul de coloane ale tabloului.
Accesarea elementelor unui tablou bidimensional
Fiecare element al tabloului bidimensional este bine determinat de doi indici:
indicele de linie şi indicele de coloană.
Indicele de linie este o expresie întreagă pozitivă şi poate lua valori în
intervalul [0 , număr_linii - 1] .
Indicele de coloană este o expresie întreagă pozitivă şi poate lua valori în
intervalul [0 , număr_coloane - 1].

Exemplu:
Dacă dorim să utilizăm o matrice cu trei linii şi două coloane, cu elemente
numere întregi cu numele a vom declara:

int a[3][2];

a coloana 0 coloana 1
linia 0 a[0][0] a[0][1]
linia 1 a[1][0] a[1][1]
linia 2 a[2][0] a[2][1]

Dacă dorim să atribuim valoarea 3 elementului de pe linia 1 coloana 0, vom


scrie:

a[1][0]=3.

Citirea matricei:

//Citirea se realizează parcurgând matricea linie cu linie


void citire(int a[][10],int &n,int &m)
{int i,j;
cout<<"dati nr de linii:";cin>>n;
cout<<"dati nr de coloane:";cin>>m;
cout<<"dati elem:";
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
}
Afişarea matricei:

// afişarea se realizează linie cu linie


void afisare(int a[][10],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
}

În operaţiile de citire şi afişare, s-a parcurs matricea pe linii, adică elementele


de pe linia de indice 0 (a[0][0], a[0][1], a[0][2], ... a[0][m-1]), apoi elementele de pe
linia de indice 1 (a[1][0], a[1][1], a[1][2], ... a[1][m-1]), .... elementele de pe linia de
indice n-1 (a[n-1][0], a[n-1][1], a[n-1][2], ... a[n-1][m-1]).

coloana 0 coloana 1 … coloana m-1


linia 0 …
linia 1 …
… … … … …
linia n-1 …

Matricea poate fi parcursă şi pe coloane (coloana 0, coloana 1, ... , coloana m-


1). În exemplul următor vom calcula sumele elementelor de pe coloanele matricei:

void sume_coloane(int a[][10],int n, int m)


{int i,j,s;
for (j=0;j<m;j++)
{ s=0; // pentru fiecare coloana, se initializeaza suma s cu 0
for(i=0;i<n;i++) // aici parcurgem o coloana
s=s+a[i][j];
cout<<" suma elementelor de pe coloana "<<j<<"="<<s<<endl;
}
}
Matrice pătratică

Definiţie:
O matrice cu proprietatea că numărul de linii este egal cu numărul de coloane
se numeşte matrice pătratică

Şiruri de caractere

Declararea şi memorarea vectorilor de caractere

Şirurile de caractere sunt de fapt succesiuni de caractere. Am învăţat deja să


memorăm succesiuni de caractere cu ajutorul tablourilor.
De exemplu:

char cuvant[15];

este un tablou unidimensional (vector), care poate memora 15 elemente de tip char.
Acesta poate fi reprezentat în memorie astfel:

cuvant

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Presupunând că dorim să citim, să memorăm şi să afişăm cuvântul “programator”,


vom scrie următorul program:

#include <iostream>
using namespace std;
int main()
{char cuvant[15],i;
cout<<"introduceti cuvantul:";
for(i=0;i<11;i++)
{cin>>cuvant[i];}
cout<<"cuvantul citit:";
for(i=0;i<11;i++)
cout<<cuvant[i];
return 0;
}
Putem reprezenta memorarea variabilei cuvânt astfel:

cuvant
p r o g r a m a t o r
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

În realitate, în fiecare octet al tabloului se memorează codul ASCII al


caracterului respectiv. Octeţii haşuraţi ai tabloului reprezintă zona de memorie
neutilizată. După cum observăm, din exemplul precedent, o astfel de modalitate de
lucru este greoaie şi neplăcută.
Limbajul de programare C++, permite prelucrarea şirurilor de caractere într-
un mod mult mai facil.

Iniţializarea şirurilor de caractere

Un şir de caractere poate fi iniţializat la declarare astfel:

char cuvant[ ]=”programator”;

In urma iniţializării, la sfârşitul cuvântului va fi adăugat caracterul 0 (codul


ASCII al caracterului nul).

cuvant
p r o g r a m a t o r 0
0 1 2 3 4 5 6 7 8 9 10 11

Compilatorul va calcula numărul de octeţi necesari pentru memorarea cuvântului


programator. În acest caz tabloul conţine 12 octeţi, 11 pentru memorarea cuvântului
şi 1 pentru memorarea codului caracterului nul.

char cuvant[ 15]=”programator”;

cuvant
p r o g r a m a t o r 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

În acest caz am memorat un vector de 15 octeţi, mai mulţi decât sunt necesari.
Ultimii trei octeţi rămân neutilizaţi.
Citirea şi afişarea şirurilor de caractere

Modalitatea de memorare a şirurilor, prezentată mai sus (memorând la


sfârşitul şirului codul ASCII al caracterului nul), ne permite citirea şi afişarea cu
mare uşurinţă a şirurilor de caractere. De asemenea, Limbaul C deţine numeroase
funcţii pentru prelucrarea şirurilor de caractere.
Funcţiile cin şi cout suportă şirurile de caractere terminate cu caracterul nul,
astfel pot fi citite respectiv afişate şirurile de caractere.
Exemplul de mai sus poate fi scris mult mai simplu astfel:

#include <iostream>
using namespace std;
int main()
{char cuvant[15];
//citeste un sir de caractere
cout<<"introduceti cuvantul:"; cin>>cuvant;
//afiseaza sirul de caractere de la primul octet pana la întalnirea caract. nul
cout<<"cuvantul citit:"; cout<<cuvant;
return 0;
}

În urma introducerii cuvântului “programator”, în memorie vom avea


următoarea reprezentare:

cuvant
p r o g r a m a t o r 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Un vector care conţine un şir de caractere citit sau iniţializat în modul anterior
prezentat, poate fi adresat pe componente, în mod normal. De exemplu
cuvant[0]=’p’, cunvant[1]=’r’, ş.a.m.d.
Din nefericire, cu ajutorul funcţiei cin nu putem citi şiruri de cractere care
conţin spaţii sau alte caractere albe.
Funcţia cin procedează astfel la citirea unui şir de caractere:
 Se sar toate caracterele albe
 Se citeste şirul care începe cu primul caracter care nu este alb
 Citirea se încheie la întâlnirea primului caracter alb.
Exemplu
Pentru şirul introdus de la tastatură: “invatam despre siruri de caractere”,
programul de mai sus va afişa doar “invatam”.
Pentru citirea şirurilor de caractere care conţin cuvinte separate prin spaţii sau
alte caractere albe vom folosi funcţia cin.get().

Formatul funcţiei:
cin.get(nume_sir, int nr, char=’\n’)

unde:
 nume_sir – reprezintă identificatorul şirului de caractere
 nr - reprezintă numărul de caractere care se vor citi împreună cu caracterul
terminal nul.
 Al treilea parametru desemnează caracterul la întâlnirea căruia se opreşte
citirea şirului (valoarea lui implicită este ‘\n’), prin urmare în cazul în care
nu dorim ca citirea sa se termine cu un alt cracter diferit de ’\n’, acest
parametru poate să lipsească.

Funcţia cin.get citeşte caractere pâna când este îndeplinită una din conditiile: fie s-
au citit nr-1 caractere fie a întâlnit caracterul specificat de parametrul al
treilea.

#include <iostream> //SIR


using namespace std;

int main()
{char sir[50];
cout<<"introduceti cuvantul:";
cin.get(sir,40); //citeste maximum 40 de caractere sau se termina la <enter>
cout<<"cuvantul citit:";
cout<<sir;
return 0;
}

În C pot exista mai multe funcţii cu acelaşi nume dar care diferă între ele prin
numărul parametrilor, cu acţiuni diferite. (această modalitate de utilizare a funcţiilor
poartă numele de supraîncarcarea funcţiilor).
Există încă o implementare a funcţiei cin.get() fară parametri. În acest caz
funcţia citeşte un singur caracter alb sau nu.
Observaţie

În cazul citirii a două şiruri de caractere, în buffer-ul de citire se depune după


citirea primului şir, caracterul ‘\n’, datorită faptului că s-a tastat <enter>. Citirea
celui de-al doilea şir se opreşte pentru că se preia ‘\n’ din buffer.
Apelând funcţia cin.get() aceasta va prelua caracterul ‘\n’, eliminăm acest
inconvenient, iar al doilea şir se va citi în mod normal.

#include <iostream> //SIR


using namespace std;
int main()
{char sir1[50],sir2[50];
cout<<"introduceti sir1:";
cin.get(sir1,40);
cout<<"cuvantul citit:";
cout<<sir1<<endl;
cin.get(); //citeste caracterul ‘\n’ de la sfarsitul sirului sir1
cout<<"introduceti sir2:";
cin.get(sir2,40);
cout<<"cuvantul citit:";
cout<<sir2;
return 0;
}

3. Desfasurarea lucrarii

Se vor edita si apoi executa programele descrise mai jos. La fiecare program
in parte se vor opera modificarile necesare pentru a raspunde la intrebarile ce
insotesc fiecare program.
1. Realizati un program care sa afiseze produsul a doua matrici.

Organigrama
#include <iostream>
using namespace std;
int main()
{
int m, n, p, q, i, j, k, sum = 0;
int first[10][10], second[10][10], multiply[10][10];
cout << "Introduceti numarul de linii si de coloane al primei matrici:\n";
cin >> m >> n;
cout << "Introduceti numarul de linii si de coloane al celei de a doua matrici:\n";
cin >> p >> q;
if (n != p)
cout << "Produsul nu se poate realiza! Ordinul matricilor este eronat! \n";
else
{ cout << "Introduceti elementele primei matrici:\n";
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
cin >> first[i][j];
cout << "Introduceti elementele celei de a doua matrici:\n";
for (i = 0; i < p; i++)
for (j = 0; j < q; j++)
cin >> second[i][j];
for (i = 0; i < m; i++) {
for (j = 0; j < q; j++) {
multiply[i][j]=0;
for (k = 0; k < p; k++) {
multiply[i][j] = multiply[i][j] + first[i][k]*second[k][j];
}
}
}
cout << "Produsul matricilor introduse este:-\n";
//printf("Product of entered matrices:-\n");
for (i = 0; i < m; i++) {
for (j = 0; j < q; j++)
cout << "\t" << multiply[i][j] ;
cout << "\n" << endl;
}
}
return 0;
}
Exemplu:

Introduceti numarul de linii si de coloane al primei matrici: 3 3

Introduceti numarul de linii si de coloane al celei de a doua matrici: 3 3

Introduceti eleméntele primei matrici:


124521452

Introduceti eleméntele celei de a doua matrici:


124521452

Produsul matricilor introduse este:


10 18 28
50 18 7
40 45 14

Intrebari:

1. Se da o matrice patrata de n linii si n coloana. Sa se comute intre ele


coloana i si linia i.
2. Realizati un program care sa afiseze transpusa unei matrici.
3. Realizati un program care sa afiseze suma a doua matrici.

2. Realizati un program prin care sa concatenati doua siruri fara a utiliza


functia de librarie.

Exemplu:

Introduceti primul sir: hello


Introduceti al doilea sir: world
Sirurile concatenate sunt: helloworld
Organigrama
#include <iostream>
using namespace std;

int main()
{
char str1[25],str2[25];
int i=0,j=0;
cout << "\nIntroduceti primul sir: ";
cin >> str1;
cout << "\nIntroduceti al doilea sir: ";
cin >> str2;
while(str1[i]!='\0')
i++;
while(str2[j]!='\0')
{
str1[i]=str2[j];
j++;
i++;
}
str1[i]='\0';
cout << "\nSirurile concatenate sunt: " << str1 << endl;
return 0;
}

Intrebari:

1. Realizati un program care compara doua siruri si afiseaza caracterele


diferite.
2. Realizati un program care citeste o propozitie de la tastatura si afiseaza
numarul de cuvinte.
3. Realizati un program care citeste o propozitie de la tastaura si apoi
ordoneaza cuvintele in ordinea crescatoare a lungimii.

S-ar putea să vă placă și