Sunteți pe pagina 1din 11

Laborator 3 Programarea Calculatoarelor

Tablouri de date
Tablouri unidimensionale(siruri de date sau vectori)
I. Operaii asupra irurilor de date monodimensionale
Definiie
Tablou = succesiune de locaii de memorie recunoscute prin acelai identificator
i prin poziia fiecreia n cadrul irului. Poziia este dat printr-un numr pozitiv numit
index.
Valorile atribuite elementelor tabloului trebuie s fie de acelai tip.
Organizarea unui tablou n memorie este de forma:
a) Declararea vectorilor
Ex. int x[8];
[0]

23

[1]

[2]

[3]

[4]

[5]

[6]

[7]

67
A

x[0] = 23;
x[5] = 67;
b) Citirea vectorilor
Ex.
int tablou[10];
int i;
printf(\n Introduceti dimensiunea tabloului );
scanf(%d,&n);
for(i=0; i<n; i++)
{
printf(\n tablou[%d] = ,i); //se va afisa tablou[i]= i se ateapt
scanf(%d,&tablou[i]);
//introducerea valorii care se atribuie
}
//
variabilei tablou[i]

Obs:
1. Dimensiunea tabloului introdus de ctre utilizator (n) nu trebuie s
depeasc dimensiunea cu care a fost declarat vectorul, (n cazul anterior n introdus de
utilizator nu trebuie s depeasc 10 ntruct declaraia a fost tablou[10]).
2. Identificarea zonei de memorie unde va fi reinut tabloul se face cu ajutorul
numelui tabloului. Acesta are ca valoare adresa primului element din tablou), ceea ce l
deosebete de variabilele simple care nu reprezint o adres.
&st st &st[0];
3. Instruciunea printf() din interiorul buclei cu contorizare va afia numai
numele variabilei care se citete.

Laborator 3 Programarea Calculatoarelor


4. Instruciunea scanf() va prelua i va memora valoarea pentru poziia
respectiv (tablou[i]).
5. Dac secvena de citire este alctuit sub forma:
for(i=0; i<n; i++)
{
printf(\n tablou[%d] = %d: ,i, tablou[i]);
scanf(%d,&tablou[i]);
}

se va afia, pentru i=0, tablou[0] = -30731 i se va executa apoi instruciunea de


citire, deci se va ateapta introducerea valorii care se va memora n locaia tablou[0];
Valoarea afiat 30731 provine din faptul c n momentul afirii variabila
tablou[i] nu este iniializat i de aceea se va afia o valoare aleatoare care va fi gsit n
memorie la adresa respectivului element.
c) Afiarea vectorilor
Ex.
int tab[5]={1,2,3,4,5}; //sau vectorul este introdus ca la ex. de mai sus
printf(\n Elementele vectorului sunt: );
for(i=0; i<5; i++)
printf(\n tab[%d] = %d, i, tab[i]);

Obs.
n acest caz elementele tabloului au fost iniializate direct. Pentru aceasta valorile
care trebuiesc reinute n tablou au fost trecute ntre acolade {}.
d) Prelucrri asupra vectorilor
Ex.

S se afieze valorile unei funcii considernd c x parine unui vector de valori.


f :DC
D ( , - 3] [3, )
f ( x)

x2 9

x {-5, - 2, 0, 5, 7, 9}

f(x) {4, x, x,4, 40 , 72 }

Obs.
Prin caracterul x s-a reprezentat faptul c respectivele valori x[i] nu aparin
domeniului de definiie.
Etapele cara trebuiesc parcurse pentru determinarea valorilor funciei:
-

declararea vectorului de intrare x float x[5] i a vectorului de ieire f float f[5]


citirea numrului de elemente din x i a valorilor acestuia;

Laborator 3 Programarea Calculatoarelor


-

verificarea apartenenei valorii x[i] la D i a valorilor funciei (pentru x[i] D). Dac
x[i] nu aparine lui D atunci evident calculul valorii lui f nu este posibil. De aceea s-a
folosit variabila j care s indice poziia valorii care a putut fi calculat n vectorul f.
Totodat valorile x[i] care aparin domeniului sunt memorate n vectorul x1;
afiarea vectorilor x1, i f;
Secvena de program este:

#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
int i,j,n;
float x[10], x1[10], f[10],aux;
printf("\n Introduceti o valoare reala oarecare");//vezi observatia de mai jos
scanf("%f",&aux);
//vezi observatia de mai jos
clrscr();
printf("\n Introduceti dimensiunea vectorului x ");
scanf("%d",&n);
printf("\n introduceti elementele vectorului x ");
for(i=0; i<n; i++)
{
printf("\n x[%d] = :",i);
scanf("%f",&x[i]);
}
//AICI TREBUIE SA INTRODUCETI ECOUL
j=0;
for(i=0; i<n; i++)
if( (x[i] <= -3) || (x[i]>= 3))
{
x1[j] = x[i];
f[j] = sqrt( pow(x[i], 2) - 9);
j++;
}
printf("\n Afisarea vectorilor x1 si f");
for(i=0;i<j;i++)
printf("\n Pentru valoarea lui x=%.2f, valoarea functiei este f=%.2f",x1[i], f[i]);
getch();
}

ATENIE
ntruct versiunea de Borland C++ pe care o folosim are un bug la citirea unui
vector de valori reale, vom citi mai nti o valoare real aleatoare, dupa care vom citi
vectorul x de numere reale
Obs.

Laborator 3 Programarea Calculatoarelor


Programul alctuiete vectori x1 i f care conine valorile lui x[i] care aparin
domeniului de definiie i respectiv ale funciei f(x).

II. Memorarea unui ir de date folosind alocarea dinamic


Aceasta presupune declararea unui pointer care s indice adresa primului element
din irul de locaii folosite pentru memorarea irului.
Obs. Toate elementele care se doresc memorate trebuie s fie de acelai tip
Ex.
S se memoreze un ir de 5 numere ntregi {1,3,5,3,9}
Pentru aceasta este necesar parcurgerea urmtorilor pai:
- se declar un pointer spre primul element din ir,
int* ptablou;
- se aloc spaiu n memorie pentru memorarea tuturor elementelor irului
ptablou = (int *) malloc (10);
(ntruct un element de tip int ocup doi octei, iar irul are 5 elemente, rezult c
va fi necesar alocarea a 10 octei pentru memorarea tuturor elementelor irului)
- se citesc de la tastatur elementele vectorului i sunt nscrise n locaiile de
memorie indicate prin intermediul pointerului.
Obs.
Citirea elementului urmtor se va face folosind adresa primului element i un
index. (Ex. elementul cu numrul de ordine i va fi memorat la adresa (ptablou+i). Deci,
dac se cunoate adresa primului element, urmtoarele vor fi amplasate la adrese
succesive (ptablou+1, ptablou+2, ........., ptablou+i).
Aceasta ne permite ca pentru citirea tabloului s folosim o secven ciclic cu
contorizare.
for(i=0; i<5; i++)
scanf(%d,(ptablou+i));
Afiarea tabloul citit se va face tot cu ajutorul acestui pointer
for(i=0; i<5; i++)
printf(%d,*(ptablou+i));
Secvena de program este:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
int i,n;
int *ptablou;
ptablou=(int *)malloc(10);
printf("\n Introduceti cele 5
elemente ale tabloului ");
for(i=0; i<5; i++)

{
printf("\n ptablou[%d] = :",i);
scanf("%d",(ptablou+i));
}
printf("\n Elementele tabloului sunt: ");
for(i=0; i<5; i++)
{
printf("\n ptablou[%d]= %d",i,*(ptablou+i));
}
getch();
}

Laborator 3 Programarea Calculatoarelor

Laborator 3 Programarea Calculatoarelor


Obs.
1. Valoarea memorat n pointerul ptablou nu trebuie modificat ntruct se va
pierde adresa primului element i irul nu se va mai putea reconstitui.
2. n instruciunea de citire se folosete (tablou+i), adic adresa la care se
transfer elementul citit. n schimb n instruciunea de scriere se folosete
*(ptablou+i), adic locaia in care se extrage elementul ce urmeaz a se afia.

III.

Memorarea irurilor de caractere

A. Memorarea cu ajutorul tablourilor unidimensionale (vectori).


Spre deosebire de irurile de numere, irurile de caractere pot avea i o
semnificaie semantic.
De aceea simpla declarare a unui vector de caractere pentru memorarea unui ir
de caractere nu este avantajoas.
n limbajul C/ C++ irul de caractere se obine prin ataarea unui terminator
(\0) dup ultimul caracter al irului. n acest fel irul de caractere este considerat ca
fiind un ansamblu unitar, un string.
Ex.
- cuvntul STUDENT se memoreaz ca un ir de caractere sub forma:
STUDENT\0
Completarea vectorului de caractere cu terminatorul \0 se poate face:
1. prin program:
char st[]={S,T,U,D,E,N,T};
st[7] = \0;
2. - prin iniializare, ncadrnd cuvntul ntre :
char st[] = STUDENT;
3. prin citirea irului cu ajutorul descriptorului de format %s:
char st[8];
scanf(%s,st);
Obs.
n limbajul PASCAL pentru o folosire mai comod a irurilor de caractere exist
tipul de date string. n limbajul C/ C++ aceast structur de date ne este definit.
Citirea unui ir de caractere
Ex.

S se memoreze cuvntul student.

Preluarea de la tastatur a unui ir de caractere se poate face folosind o secven


ciclic char tab[8];
for(i=0; i<7; i++)

Laborator 3 Programarea Calculatoarelor


scanf(%c,&tab[i]);
dup care se ataeaz vectorului terminatorul de ir (\0).
tab[7] = \0;
Exist i posibilitatea citirii directe a unui ir de caractere. Pentru aceasta se
folosete descriptorul de format %s:
char tab[8];
scanf(%s,&tab);
sau
char tab[8];
scanf(%s,tab);
Obs:
Spre deosebire de limbajul Pascal, n limbajul C/C++ nu exist tipul de date
string.
Atentie! Daca citim un vector folosind %s NU este obligatoriu sa punem & la
scanf. Este o exceptie de la regula. Mai mult, tinind cont de modul de citire cu pointeri a
sirurilor de date este INDICAT SA NU FOLOSIM & LA SCANF, cand folosim %s.
Citirea unui ir de caractere folosind pointeri
-

se declar mai nti un pointer spre primul element din irul de caractere,
se aloc spaiu de memorie avnd grij s existe o locaie pentru caracterul terminator
de ir \0,
se citete irul folosind descriptorul de format %s, sau se iniializeaz direct folosind
ghilimelele

Ex. 12
S se memoreze cuvntul ACUM.
char* p;
p = (char *)malloc(5);
scanf(%s,p);

char* p;
p = (char *)malloc(5);
*p = ACUM;

Operaii cu irurile de caractere


Funciile pentru prelucrare irurilor de caractere sunt grupate n biblioteca
string.h. Dintre acestea se vor exemplifica:
- strlen() o funcie pentru determinarea dimensiunii unui ir de caractere util n
prelucrarea unui anumit caracter din interiorul irului
- strcmp()o funcie de comparare a dou iruri de caractere util n operaii de
ordonare alfabetic a unor iruri de caractere.

Laborator 3 Programarea Calculatoarelor

Ex.
S se memoreze cuvntul abracadabra
S se nlocuiasc toate caracterele a dintr-un cuvnt citit de la tastatur cu
caracterul o.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
void main()
{
char* cuvant;
int i, dim;
clrscr();
cuvant=(char *)malloc(100);
printf("\n Introduceti cuvantul care va fi prelucrat ");
scanf("%s",cuvant);
dim=strlen(cuvant);
printf("\n Dimensiunea cuvantului introdus este de %d caractere ",dim);
for(i=0;i<dim;i++)
if(cuvant[i]=='a')
cuvant[i]='o';
printf("\n Cuvantul rezultat in urma prelucrarii este %s ", cuvant);
getch();
}

Obs.
Penrtu lungimea irului se va afia valoarea 11, deci terminatorul nu se
consider ca fcnd parte din string
Ex.
S se ordoneze in ordine alfabetic dou cuvinte introduse de la tastatur cuvnt1,
cuvant2
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
void main()
{
char* cuvant1, *cuvant2;
clrscr();
cuvant1=(char *)malloc(100);
cuvant2=(char *)malloc(100);
printf("\n Introduceti primul cuvant ");
scanf("%s",cuvant1);
printf("\n Introduceti al doilea cuvant ");
scanf("%s",cuvant2);
printf("\n Cuvintele afisate in ordine alfabetica: ");

Laborator 3 Programarea Calculatoarelor


if(strcmp(cuvant1,cuvant2)<0)
{
printf("\n Primul va fi %s ", cuvant1);
printf("\n Al doilea va fi %s ", cuvant2);
}
else
{
printf("\n Primul va fi %s ", cuvant2);
printf("\n Al doilea va fi %s ", cuvant1);
}
getch();
}

Lucrul cu iruri de caracter (stringuri) (biblioteca string)


Def.
String -ul este un ir de caractere marcat prin terminatorul de ir \0. Prezena
acestui terminator (caracter special) face posibil operarea cu irurile de caractere privite
ca un tot unitar i nu caracter cu caracter, cum este cazul tablourilor de caractere.
Mediul integrat Borland C++ pune la dispoziia programatorului o biblioteca
specific lucrului cu irurile de caractere . Aceasta este prezent n biblioteca string.
i.

Funcii pentru copierea irurilor de caractere.


a) - funcii pentru copierea irului surs s n irul destinaie d
- strcpy (char *d, char *s)
b) - funcii pentru copierea numai a n caractere dintr-un ir s n irul destinaie d
- strncpy(char *d, char *s, size n)

Ex. S se memoreze n stringul surs n cuvntul student i s se copieze mai apoi n


stringul d.
char *n=student;
char *d;
strcpy(d,s);
ii.

Funcii de comparare a dou iruri de caractere


a) comparare lexicografic
- int strcmp(char *s1, char *s2)

0, daca s1 este inaintea lui s2

0, daca s1 si s2 coincid
valoarea ntoars de funcie:
0, daca s2 este inaintea lui s1

Laborator 3 Programarea Calculatoarelor


Ex.
S se compare stringurile student i abracadabra. Precizai care este valoarea lui n.
int n;
char *s1,*s2;
strcpy(s1,student);
strcpy(s2, abracadabra);
n=strcmp(s1,s2);
printf(\n Valoarea intoarsa de functia strcmp este %d,n);

Diferite forme ale acestei funcii


a) - int stricmp(char *s1, char *s2)
- compar dou iruri fr a face diferena ntre litere mari i litere mici
b) int strncmp(char *s1, char *s2, size n)
- compar primele n caractere ale celor dou iruri
c) int strincmp(char *s1, char *s2, size n)
- compar primele n caractere ale celor dou iruri fr a face distincie
ntre
litere mari i litere mici
iii.
Funcii pentru concatenarea a dou iruri de caractere
a) char* strcat(char *d, char *s)
- copie irul s n continuarea irului d
b) char* strncat(char *d, char *s, size n)
- copie primele n caractere din irul s n continuarea irului d.
iv.

Funcii de cutare n iruri de caractere

a) - char* strchr(char *s, char c)


- funcia caut caracterul c n stringul s. Dac caracterul este gsit se ntoarce catre
program un pointer la prima apariie a caracterului cutat n ir, n caz de eec este
ntors caracterul NULL.
c) char* strstr(char *s1, char *s2)
- funcie pentru cutarea apariiei unui subir s2, n irul s1.
v. Funcii pentru conversia unui ir de cifre n numrul corespunztor i invers
Dup cum se tie tabela caracterelor ASCII atribuie fiecrui simbol (liter, cifr,
caracter grafic) un cod numeric, ns nu exist coresponden ntre codul pentru
caracterul 5 i cifra 5. Astfel caracterul 5 are codul numeric 0x35 (53 n zecimal). Se
constat c diferena este de 0x30 (48 n zecimal).
Funciile atoi i itoa au rolul de a converti un caracter n cifra corespunztoare
sau invers. Biblioteca care trebuie inclus n program este <stdlib.h>.
a) int atoi(const char *s);
- convertete irul de caractere s n numrul ntreg corespunztor. Funcia
ntoarce ca rezultat un ntreg.

Laborator 3 Programarea Calculatoarelor


b) - char *itoa(int value, char *string, int radix);
- convertete valoarea ntreag value, n irul string, conversia fcndu-se
n funcie de baza (radix) n care a fost scris numrul intreg. Funcia
ntoarce un pointer spre irul de caractere n care a fost convertit numrul
ntreg value (string).
vi.

Funcii pentru determinarea dimensiunii unui ir de caractere

- int strlen(const char *s);


- funcia primete ca argument irul de caractere s i ntoarce ca rezultat nr.
de caractere pe care l are irul.
ATENIE:
Funcia strlen() nu contorizeaz i terminatorul de ir \0. De aceea, n situaiile n
care se folosete funcia strlen() pentru determinarea spaiului din memoria operativ care
trebuie rezervat pentru memorarea unui ir de caractere valoarea returnat trebuie
incrementat cu nc o poziie (pentru a putea fi memorat i terminatorul de ir).
Exerciii:
1. S se determine numrul de apariii ale unui caracter c, ntr-un anumit cuvnt.
Att cuvntul, ct i caracterul vor fi introduse de la tastatur.
2. S se determine numrul de apariii ale unui anumit cuvnt, ntr-un text
introdus de la tastatur.

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