Sunteți pe pagina 1din 8

Pointeri. iruri decaractere.

Un pointer este o dat care are ca valori adrese de memorie.


Pointerii sunt utilizai n general:
n lucrul cu tablouri
la transmiterea parametrilor n funcii
pentru accesarea direct a memoriei
la alocarea dinamic a memoriei
Adresa unei variabile este adresa primului octet din reprezentarea intern a variabilei
respective. Variabilele de tip pointer au ca valoare adrese de memorie.
Obs.1. Limbajul C++ face distincie ntre natura adreselor care pot fi memorate.
2. Nu trebuie confundat adresa unei variabile cu coninutul variabilei respective.
Declararea unui pointer de date, are urmtorul format:
tip* var_pointer;

ex: int *p1, *p2;


char *c;

// tip reprezint tipul de baz al pointerului i va indica tipul


//datei memorate
//p1, p2 sunt pointeri la ntregi, deci rein adresele unor zone //de
memorie la care vor fi memorate date ntregi
// c va indica o zon de memorie la care va fi memorat un
//caracter

Obs. 3.Tipul de baz al pointerului poate fi orice tip al limbajului inclusiv tipul void.
Un pointer cu tipul de baz void* se numete pointer generic.
4.Exist o constant pointer special, denumit NULL, cu semnificaia pointerul
nu conine adresa nici unei zone de memorie; valoarea acestei constante este 0.
Operaii cu pointeri
1. Operaia de refereniere
-este operaia prin care putem obine adresa de memorie a unei variabile
-adresa unei variabile se poate obine cu ajutorul operatorului unar & care va precede
numele variabilei; rezultatul acestei operaii este un pointer
ex: int *p,a;
p=& a;
// p va reine adresa lui a
2. Operaia de derefereniere
-este operaia prin care putem accesa coninutul memorat la o anumit adres
-operaia se realizeaz folosind operatorul unar * care va precede numele variabilei
ex: int *p,a;
p=& a;
// p va reine adresa lui a
*p=3;
cout<<a;
//va afia pe ecran valoarea 3
3. Operaia de incrementare/decrementare
-are ca efect indicarea elementului urmtor/anterior celui indicat de pointerul iniial

-se crete/micoreaz adresa memorat n pointer, cu numrul de octei necesari pentru a


memora o dat de tipul de baz al pointerului sizeof(tip)
ex: long int *p;
p++;
// adresa memorat de p va crete cu 4 octei
p--;
//adresa memorat de p se micoreaz cu 4 octei

4. Adunarea / scderea dintre un pointer i un ntreg p+n / p-n


- are urmtorul efect: adresa memorat n pointer crete/se micoreaz cu n*sizeof(tip),
unde tip reprezint tipul de baz al pointerului p
5. Scderea a doi pointeri
-rezultatul obinut are valoare ntreag i indic numrul de elemente dintre cei doi
pointeri
6. Compararea a doi pointeri
-asupra pointerilor care au acelai tip de baz se pot aplica operatorii relaionali i de
egalitate
ex: int *p1,*p2,a;
a=2;
p1=&a;
p2=p1;
if (p1==p2) cout<<indic aceeai zon de memorie;
7. Afiarea unui pointer
n limbajul C
-se utilizeaz funcia printf cu
specificatorul de format %p
int *r,a;
a=2;
r=&a;
printf(%p,r);

n limbajul C++
-se utilizeaz operatorul de afiare

cout<<r;

Legtura dintre pointeri i tablouri


Numele unui tablou este un pointer constant care are ca valoare adresa primului element
din tablou
Utilizarea pointerilor reprezint una din posibilitile de accesare a elemenelor unui tablou.
ex: tip x[100]; tip este tipul de baz al elementelor vectorului
expresii echivalente
x
&x[0]
adresa primului element din vector
x+i
&x[i]
adresa elementului de pe poyiia i din vector
*x
x[0]
primul element din vector
*(x+i)
x[i]
elementul de pe poziia i din tablou
irurile de caractere

Un ir de caractere este o structur de date format dintr-o succesiune de caractere care se


termin cu caracterul NULL ( \0).
Implementarea irurilor de caractere se face sub forma unui tablou unidimensional
(vector) ale crui elemente sunt de tip caracter, fiecare caracter fiind reprezentat prin codul
su ASCII.
irul de caractere se deosebete de vectorii cu alte tipuri de elemente prin marcatorul
logic utilizat la sfritul irului - NULL (care are codul ASCII 0).
Declararea
ex: char x[5];
cin>>x;

// am declarat irul x care va putea conine maxim 5 caractere

m
0

a
1

m
2

a
3

\0
4

Dimensiunea vectorului de caractere trebuie declarat cu un caracter mai mult dect cel mai
mare ir de caractere pe care l poate conine, pentru a exista loc i pentru terminatorul
irului (caracterul \0).
O constant ir de caractere este o succesiune de caractere delimitat de ghilimele.
ex: char ir[256]=Buna ziua;
Citirea
n limbajul C++
-se poate utilize operatorul >> sau
funciile get sau getline

n limbajul C
-se folosete specificatorul de format %c
pentru caractere i %s pentru iruri

char c, sir[201];

char c, sir[201];

fin>>c;
fin.getline(sir, 200);
//sau fin.get(sir,200);fin.get();

fscanf(fin,%c, &c);
fscanf(fin,%s,sir);

Prototipul funciilor get i getline sunt:


getline(char *s, int n, char c=\n);
get(char *s, int n, char c=\n);
Diferena dintre funciile get i getline este faptul c funcia getline preia din stream-ul de
intrare i delimitatorul, n timp ce funcia get nu-l extrage.
Scrierea
n limbajul C++
fout<<c<< <<s;

n limbajul C
fprintf(fout, %c, c);
fprintf(fout, %s, sir);
puts(sir);

Obs.
1. Citirea irurilor de caractere la care se utilizeaz operatorul >> se oprete la ntlnirea
primului caracter alb.
2.Dac delimitatorul este altul dect \n, acesta trebuie precizat pe poziia corespunztoare
lui n funcia getline.

ex:getline(sir,200,!);

// sir va conine caracterele citite pn la ntlnirea


caracterului ! sau pan la citirea a 200 de caractere.
3.Fiierul antet stdio.h conine o funcie special pentru afiarea irurilor de caractere.
Funcia afieaz caracterele irului pn la NULL i apoi afieaz \n.
Prototipul ei este: int puts(const char* sir);

Prelucrarea irurilor de caractere se poate face:


a) prin parcurgerea caracterelor din ir (lucrnd indexat sau cu pointeri)
b) folosind funciile sistem (din bibliotecile string.h, stdlib.h, conio.h)
Utilizarea funciilor standard pentru lucrul cu iruri de caractere
1.Determinarea lungimii unui ir de caractere
unsigned strlen(const char *sir);
ex: char sir[]="informatica";
cout<<strlen(sir); // va afia valoarea 11
2.Copierea unui ir de caractere n alt ir de caractere
char* strcpy(char * destinatia, const char * sursa);
ex: char sir[]="informatica",sir1[]=exemplu;
strcpy(sir, sir1);
cout<<sir; // va afia exemplu
Copierea unui prefix al unui ir de caractere n alt ir de caractere
char* strncpy(char * destinatia, const char * sursa,int n);
Va copia n destinaie din surs maxim n caractere; dac irul sursa are lungimea < n atunci
irul destinaie va avea inclus i caracterul NULL, altfel nu.
ex: char sir[]="informatica",sir1[]=exemplu;
strncpy(sir, sir1, 7);
cout<<sir;
strncpy(sir1, sir ,12);
cout<<sir1;
3.Concatenarea a dou iruri de caractere
char* strcat(char * destinatia, const char * sursa);
// adaug irul surs la sfritul irului destinaie, inclusiv NULL
char* strncat(char * destinatia, const char * sursa, int n);
// adaug primele n carectere din irul surs la sfritul irului destinaie
ex: char sir[]="om ",sir1[]=harnic ;
int n=3;
strcat(sir, sir1);
cout<<sir;
strncat(sir,sir1,n);
cout<<sir;
Obs.
1.Dimensiunea irului destinaie trebuie s fie suficient de mare pentru a reine rezultatul.

2.Dac dorim s concatenm doar primele n caractere din irul surs la irul destinaie i
lungimea irului surs este <n atunci se va concatena ntreg irul surs la destinaie, inclusiv
caracterul NULL.
4.Compararea a dou iruri de caractere
int strcmp(char * s1, char * s2);
// compar irul s1 cu irului s2 i returneaz, astfel:
valoarea 0 dac s1 este egal cu s2
un ntreg >0 dac s1>s2 (dpdv lexicografic)
un ntreg <0 dac s1<s2
int strncmp(char * s1, char * s2, int n);
// compar primele n caractere din cele dou iruri
ex: char sir[]="harpa",sir1[]=harnic;
int n=3;
if (strcmp(sir, sir1)==0)
cout<<egale;
else if (strcmp(sir, sir1)<0)
cout<<sir<<<<<sir1;
else
cout<<sir1<<<<<sir;
cout<<\n;
if (strncmp(sir, sir1, n)==0)
cout<<sunt egale primele<<n<<caractere din sirurile<<sir<<si<<sir1;
else if (strcmp(sir, sir1)<0)
cout<<sir<<<<<sir1;
else
cout<<sir1<<<<<sir;
Obs.
Dac dorim ca la comparare s nu se fac diferena ntre litere mari i mici, atunci vom
folosi funcia stricmp.
int stricmp(char * s1, char * s2);
5.Cutarea primei apariii a unui caracter ntr-un ir
char* strchr(char * s, char x);
//caut i returneaz un pointer ctre prima apariie a caracterului x n irul s; dac
caracterul x nu se gsete n irul s, funcia va returna NULL
ex: char sir[]="Sambata merg la CEX",x, *p;
x=a;
p=strchr(sir, x);
if (p!=0)
cout<<x<<apare prima data in <<sir<<pe pozitia<<p-sir;
else
cout<< x<<nu apare deloc in <<sir;
cout<<\n;
6.Cutarea primei apariii a unui ir n alt ir
char* strstr(const char * s1, const char * s2);

//caut i returneaz un pointer ctre prima apariie a irului s2 n irul s1; dac s2 nu se
gsete n irul s1, funcia va returna NULL
ex: char sir[]="Sambata merg la CEX",sir1[]=merg, *p;
p=strstr(sir, sir1);
if (p!=0)
cout<<sir1<<apare prima data in <<sir<<pe pozitia<<p-sir;
else
cout<< sir1<<nu apare deloc in <<sir;
cout<<\n;
7. Transformarea literelor mici n litere mari i invers
char* strlwr(char* s);
// transform toate literele irului n litere mici
char* strupr(char* s);
// transform toate literele irului n litere mari
8.Inversarea irului
char* strrev(char* s);
// inverseaz irul n el nsui
ex: char sir[]="sambata";
strrev(sir);
cout<<sir<<\n; // va scrie atabmas
9.Funcii de conversie
Fiierul antet stdlib.h conine funcii care realizeaz conversia unui numr ntreg sau real
n ir de caractere i invers.
char * itoa(int n, char* sir, int baza);
char * ltoa(long n, char* sir, int baza);
char * utoa(unsigned long n, char* sir, int baza);
// funciile permit conversia unui numr ntreg n ir de caractere; numrul
obinut se va afla n baza indicat
int atoi(char* sir);
long atol(char* sir);
double atof(char* sir);
long strtol(char* s, char* p, int baza);
// funciile permit conversia n ir de caractere a unui numr ntreg;
// funcia strtol returneaz prin pointerul p adresa primului caracter din sirul s
care nu a putut fi convertit
Probleme propuse
1.Problema ION
Vi se dau mai multe succesiuni cu acelai numr de litere mici pe care trebuie s le aezai
unele sub altele. n careul astfel format trebuie s cutai un anumit cuvnt. Cutarea se face
att pe orizontal (linie) ct i pe vertical (coloan) iar cuvntul poate aprea de la dreapta
la stnga, de la stnga la dreapta, de jos n sus sau de sus n jos. S se numere liniile i
coloanele pe care cuvntul apare cel puin o dat.

Cerin
Cunoscnd cuvntul c care trebuie cutat, numrul n de succesiuni de n litere precum i cele n
succesiuni, se cere s se determine pe cte linii i coloane apare cuvntul dat.
Date de intrare
Pe prima linie a fiierului de intrare cuvant.in se afl un cuvnt c format din litere mici. Pe
linia a 2-a se gsete un numr natural n iar pe urmtoarele linii se dau cele n succesiuni de
cte n litere mici fiecare.
Date de ieire
Fiierul de ieire cuvant.out va conine numrul de linii i coloane pe care apare cuvntul dat.
Restricii
Cuvntul c are maxim 20 de litere iar n nu depaeste 100.
Exemplu
cuvant.in
ion
6
ionabc
ajonoi
uuiono
aixbnn
ionnoi
cnrsit

cuvant.out
8

Explicatii
Aezm succesiunile de litere unele sub altele, ca n careul de mai
jos:
i
o n a b c
a j o n o i
u u i
o n o
a i
x b n n
i
o n n o i
c n r
s i t
Cuvntul ion se gsete pe liniile 1 i 3 (de la stanga la dreapta), pe
linia 2 (de la dreapa la stnga), pe linia 5 (pe ambele direc), pe
coloanele 2 i 6 (de sus n jos) i pe coloanele 3 i 5 (de jos n sus),
deci n total pe 8 direcii.

Timp de execuie/test: 1 secund


2. Operaii cu radicali
Se citete o expresie aritmetic scris corect din punct de vedere matematic. Aceasta expresie
conine numai operatorii + i -, iar operanzii pot avea doar una din formele :
n
- numr natural fr semn
nrm
- cu semnificaia n radical din m, unde m si n sunt numere naturale fr semn,
n>=2
rm
- cu semnificaia radical din m, unde m este numr natural fr semn.
Cerin
Se cere ca, pornind de la o expresie aritmetic de forma precizat anterior, s se efectueze
calculele astfel nct s fie ndeplinite simultan condiiile:
a) expresia are numr minim de radicali din numere libere de ptrate ( expresia poate
avea numai astfel de radicali) i valoarea egal cu cea a expresiei iniiale

b) numerele de sub radicalii expresiei de la punctual a) trebuie s apar n ordine


cresctoare.
Date de intrare
Pe prima linie a fiierului de intrare radical.in se afl o expresie aritmetic n forma precizat
anterior.
Date de ieire
Fiierul de ieire cuvant.out va conine expresia aritmetic adus n forma cerut n enun.
Restricii

Expresia poate avea maxim 10000 de caractere i este corect din punct de vedere
matematic.

0< n , m <1000

Valorile care rmn sub radical, sunt numere naturale < 1000

Exemplu
radical.in
4r12+r75-2r3+1+2r20+2r4

radical.out
5+11r3+4r5

3.alfabetar
http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=1200
4.grad
http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=143
5.comp
http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=1241
6.ed
http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=296
7.secvsir
http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=969
8.cezar
http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=647

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