Sunteți pe pagina 1din 10

Pointeri

Orice variabilă ocupă în memorie un anumit număr de octeți consecutivi (în funcție de tipul
variabilei); adresa primului octet alocat unei variabile reprezintă adresa variabilei.

Definiție: Un pointer este o dată a cărei valoare este o adresă de memorie. O variabilă de tip
pointer este o variabilă a cărei valoare este adresa unei variabile si se declara astfel:

tip_data *nume_pointer;
Exemplu int *p,x;
p este o variabilă pointer a cărei valoare este adresa unei variabile de tip int.

x 280

Adresa 4FC00 ( adresa zonei allocate variabilei x)


p 4FC00

Operatii cu pointeri . Pointerii pot fi folosiţi în expresii aritmetice, atribuiri şi comparaţii.


1. Operatorul & ( referentiere) obtine adresa de memorie a unei variabile
p=&x;
2. Operatorul * (dereferentiere) obtine valoarea datei memorate la adresa indicata de
pointer.
Ex. *p=280
3. Compararea pointerilor se realizeazacu operatorii de egalitate si operatori relationali.
Aritmetica pointerilor
Pentru pointerul declarat tip *p;
1. Operatorul ++ modifica adresa p adunand la p dimensiunea zonei alocatei tipului de data
din declaratia pointerului : p=p+sizeof(tip)
p++
2. Operatorul –- modifica adresa p scazand din p dimensiunea zonei alocatei tipului de data
din declaratia pointerului : p=p-sizeof(tip)
3. Expresia p+n, n este numar natural modifica p: p=p+n*sizeof(tip)
4. Expresia p-n, n este numar natural modifica p: p=p-n*sizeof(tip)
Legatura dintre pointeri si tablouri
La declararea unui tablou undidimensional acestuia i se aloca o zona de memorie, de ex.
int A[10]; A
A[0] A[1] A[2] ... A[i]..............A[9]

adrese A A+1 A+2 A+i A+9


Numele vectorului A este un pointer constant si memoreaza adresa primului element ,
A=&A[0].

Șiruri de caractere
Un șir de caractere reprezintă o succesiune de caractere ASCII, care se încheie cu caracterul
‘\0’(NULL) .
Declarare șir de caractere
a) char nume_sir[lungime_maxima]; lungime_maxima reprezintă numărul maxim de caractere
din șir +1.
b) char *nume_sir;
Exemple
1
char s[101],*q;
La declarare, un șir de caractere poate fi și inițializat: char t[5]=”abc”;
a b c NULL
t[0] t[1] t[2] t[3]

Citirea unui șir de caractere


char s[lungime_maxima];
a) Dacă șirul nu conține spații se poate utiliza citirea:
cin>>s;
b) Dacă șirul conține spații se utilizează una din variantele următoare de citire:
1. cin.get(s,lungime_maxima,caracter_final);
caracter_final este implicit caracterul newline =’\n’.
Se citește șirul s până la întâlnirea caracterului final (fără să-l introducă în șir) sau până la
citirea unui număr maxim de lungime_maxima-1 caractere și adaugă NULL la sfârșitul
șirului.
2. cin.getline(s,lungime_maxima, caracter_final);
Se citește șirul s până la întâlnirea caracterului final sau până la citirea unui număr maxim de
lungime_maxima-1 caractere, adaugă NULL la sfârșitul șirului și extrage caracter_final din
fluxul de intrare (îl va omite la citirea următoare din program).
Afișarea unui șir de caractere
cout<<s;
Subșir obținut dintr-un șir de caractere
char s[10]=”cd1*bc”;
c d 1 * b c NULL
s[0] s[1] s[2] s[3] s[4] s[5] s[6]

Exemple de subșiruri din șirul s : “d1”, “1”etc. Pointerul s+2 indică subșirul care începe cu s[2] și
se încheie cu NULL.: “1*bc”

Funcții predefinite pentru șiruri de caractere (definite în headerul cstring)


char s[lungime_maxima],s1[lungime_maxima1];
char s2[lungime_maxima2],separatori[lungime_maxima],*p,ch;

Operația realizată de funcție, apel funcție Descrierea execuției funcției

Lungimea unui șir de caractere Returnează lungimea șirului s, dat ca parametru.


strlen(s)
Copierea unui șir de caractere
strcpy(s1,s2) Se copie șirul s2 în șirul s1 și se returnează
adresa s1
Copierea unui subșir dintr-un șir de
caractere Copie primele nr caractere din șirul s2 în șirul
s1 și returnează adresa s1
strncpy(s1,s2,nr)

Compararea a două șiruri de caractere Compară s1 cu s2 și returnează valoarea


strcmp(s1,s2) 0, dacă șirurile sunt identice
Compararea a două șiruri de caractere, <0, dacă s1<s2
fără a face distincție între litere mari și >0, dacă s1>s2
litere mici
stricmp(s1,s2)
Concatenarea a două șiruri de caractere Concatenează s2 la s1 și returnează adresa s1
2
strcat(s1,s2) (se reunesc șirurile s1 și s2 prin adăugarea s2
după ultimul caracter din s1, rezultatul reunirii se
obține în s1)
Căutarea unui caracter într-un șir de Dacă șirul s conține caracterul ch, funcția
caractere returnează adresa din s a primei apariții a
strchr(s,ch) caracterului ch. Dacă șirul s nu conține caracterul
ch, funcția returnează NULL.
Căutarea unui subșir într-un șir de Dacă șirul s conține un subșir identic cu șirul s2,
caractere funcția returnează adresa din s1 a primei apariții
strstr(s1,s2) a șirului s2. Dacă șirul s1 nu conține un subșir
identic cu șirul s2, funcția returnează NULL.

Funcții predefinite pentru verificarea apartenenței unui caracter la o categorie de


caractere (definite în headerul cctype)
char c;
Operația realizată de funcție, apel funcție Descriere execuție funcție

Verificare literă mare Returnează o valoare diferită de 0, dacă c este


literă mare.
isupper(c)
Verificare literă mică Returnează o valoare diferită de 0, dacă c este
literă mică.
islower(c)
Verificare cifră zecimală Returnează o valoare diferită de 0, dacă c este
cifră în baza 10 .
isdigit(c)
Verificare literă sau cifră Returnează o valoare diferită de 0, dacă c este
literă sau cifră.
isalnum(c)
Transformare în literă mare Transformă caracterul c în literă mare și îl
returnează.
toupper(c)
Transformare în literă mică Transformă caracterul c în literă mică și îl
returnează.
tolower(c)

Aplicații

1.Lungime maxima

https://www.pbinfo.ro/probleme/87/lungimemaxima

Cerinţa
Să se scrie un program care citește mai multe propoziții și determină propoziția de lungime maximă.
Date de intrare
Fișierul de intrare lgmax.in conține pe prima linie un număr natural n, iar pe următoarele n linii
câte o propoziție alcătuită din litere ale alfabetului englez și spații.
Date de ieşire
Fișierul de ieșire lgmax.out va conține pe prima linie propoziția de lungime maximă.
Restricţii şi precizări
 0<n<100
 fiecare propoziție va conține cel mult 255 de caractere

3
Exemplu
lgmax.in lgmax.out
4 pe la cuiburi se aduna
somnoroase pasarele
pe la cuiburi se aduna
se ascund in ramurele
noapte buna
Soluție
#include <fstream>
#include <cstring>

using namespace std;


ifstream fin("lgmax.in");
ofstream fout ("lgmax.out");
int n,maxi,i;
char s[256],smax[260];
int main()
{
fin>>n;
fin.get(); // citire newline
for (i=1; i<=n; i++)
{
fin.getline(s,256);
if (strlen(s)>maxi)
{
maxi=strlen(s);
strcpy(smax,s);// memorare sir de lungime maxima
}
}
fout<<smax;
return 0;
}
2.Caractere
https://www.pbinfo.ro/probleme/1335/caractere
Cerința
Se dau 2 șiruri de caractere. Sa se afișeze toate caracterele primului șir ce se găsesc și în al doilea.
Date de intrare
Programul citește de la tastatură 2 șiruri de caractere, dispuse pe 2 linii.
Date de ieșire
Programul va afișa pe ecran toate caracterele primului șir ce se găsesc și în al doilea.
Restricții și precizări
 fiecare șir citit va conține cel mult 250 de caractere;
 caracterele vor fi afișate în ordinea în care se găsesc în primul șir.

Exemplu
Intrare
asD'";*]!
da';h
Ieșire
a';
Solutie.

#include <iostream>
#include <cstring>
using namespace std;
char s[251], t[251];
int i;
4
int main()
{ cin.getline(s, 251);
cin.getline(t, 251);
for (i = 0; i < strlen(s); i++)// parcurgerea primului sir
if (strchr(t, s[i])!=NULL) // cautare caracter s[i] in sirul t
cout << s[i];
return 0; }

3. EliminareVocale
https://www.pbinfo.ro/probleme/94/eliminarevocale
Se dă un şir de cel mult 20 caractere ce conţine numai litere mici ale alfabetului englez.
Cerinţa
Să se afişeze şirul obţinut prin eliminarea din șir a fiecărei vocale.
Date de intrare
Programul va citi de la tastatură şirul dat.
Date de ieşire
Programul va afişa pe ecran şirul transformat corespunzător.
Restricţii şi precizări
 se consideră vocale literele din mulțimea {a,e,i,o,u}

Exemplu
Intrare
romancier
Ieşire
rmncr

Solutie

#include <iostream>
#include <cstring>
using namespace std;
int main()
{ int i;
char s[21], t[]="aeiou",aux[21];
cin.get(s,21);
for(i=0;i<strlen(s);i++)
if(strchr(t,s[i])!=0)// verificam daca s[i] este vocala litera mica
{
strcpy(aux, s+i+1);
strcpy(s+i,aux);
i--;
}
cout<<s;
return 0;
}

4. Cuvinte7
https://www.pbinfo.ro/probleme/2304/cuvinte7

Scrieţi un program care citeşte de la tastatură, în această ordine, un număr natural n, apoi n cuvinte,
separate prin Enter, urmate de un număr natural k. Numerele citite sunt din intervalul [1,20], iar
fiecare cuvânt este format din cel mult 20 de caractere, numai litere mici ale alfabetului englez. Cel
puţin unul dintre cuvinte are k litere.

5
Programul construiește în memorie, apoi afișează pe ecran, un șir care să cuprindă cuvintele citite,
separate prin câte un spațiu, astfel încât toate cele care au k litere să ocupe primele poziţii, iar
celelalte să se regăsească în continuarea acestora, într-o ordine oarecare.

Exemplu

Intrare Ieșire
5 am un de cires mai
am
un
cires
de
mai
2
Explicație
Există și alte soluții corecte.

Solutie. Cele n cuvinte citite se memoreaza intr-un vector de cuvinte s. Se parcurge vectorul de
cuvinte, se vor selecta si concatena intr-un sir nou ,denumit rez, cuvintele de lungime k si se
concateneaza in alt sir, denumit rez1, cuvintele ce au lungime diferita de k. Se reunesc sirurile rez si
rez1 in sirul rez , ce se va afisa.
#include <iostream>
#include <cstring>

using namespace std;


char s[21][21], rez[501],rez1[501];
int main()
{
int n , k;
cin >> n;
for(int i = 1 ; i <= n ; i ++)
cin >> s[i]; // citire cuvant
cin >> k;
for(int i = 1 ; i <= n ; i ++)
if(strlen(s[i]) == k)
{strcat(rez, s[i]); strcat(rez, " ");}
else
{strcat(rez1, s[i]); strcat(rez1, " ");}
strcat(rez, rez1);
cout << rez;
return 0; }

5.Repetitii
https://www.pbinfo.ro/probleme/850/repetitii
Cerința
Se consideră un șir de caractere format numai din litere mici ale alfabetului englez. Dacă șirul
conține subșiruri consecutive care se repetă, el poate fi scris condensat. De exemplu, șirul
mamateteter poate fi scris (ma)2(te)3r – subșirul care se repetă se scrie între paranteze rotunde,
urmat de numărul de apariții. Dându-se un șir în forma condensată, să se determine șirul în forma
inițială.
Date de intrare
Programul citește de la tastatură șirul s, în forma condensată.
Date de ieșire

6
Programul va afișa pe ecran șirul t, în forma inițială.
Restricții și precizări
 lungimea șirurilor s și t nu depășește 255 caractere
 șirul condensat nu va conține paranteze în alte paranteze
Exemplu
Intrare
(ma)2(te)3r
Ieșire
mamateteter

Solutie
Vom parcurge șirul condensat. Dacă caracterul curent este literă, îl adăugă în șirul rezultat.
Dacă nu este literă, atunci este paranteză deschisă. Căutăm paranteza închisă corespunzătoare,
extragem subșirul inclus, determinăm numărul de apariții nr și concatenăm subșirul la rezultat de
nr ori.

#include <iostream>
#include <cstring>
#include<cctype>
using namespace std;

int main(){
char s[256],sir[256],s1[256]="",*p,*q,aux[256];
int nr,i,j;
cin.getline(s,256);
p=strchr(s,'('); // cautare paranteza deschisa, p este adresa din s a parantezei
if(p==0)
cout<<s;
else
{
while(p)
{if(p!=s)
strncat(s1,s,p-s); // adaugarea subsirului de la s la p
nr=0;
q=strchr(p+1,')'); // cautare paranteza inchisa
strncpy(sir,p+1,q-p-1); // sirul ce va fi repetat
sir[q-p-1]=NULL;
q++;i=0;
while(isdigit(q[i])) // formare numar
{
nr=nr*10+q[i]-'0';
i++;
}
for(j=1;j<=nr;j++) // repetare sir de nr ori
strcat(s1,sir);
strcpy(aux,q+i); // eliminare subsir utilizat anterior
strcpy(s,aux);
p=strchr(s,'('); // cautare paranteza deschisa
}
if(strlen(s)>0)
strcat(s1,s);
cout << s1;
}
7
return 0;
}

Tema
1. Ecuatii_grad_2
https://www.pbinfo.ro/probleme/1458/ecuatii-grad-2
Cerința
Dându-se o ecuaţie de gradul 2, să se scrie un program care determină soluţiile acestei ecuaţii.
Date de intrare
Fișierul de intrare ecuatii.in conține pe prima linie un şir de caractere de forma ax^2+bx+c,
reprezentând o ecuaţie de gradul 2: ax2+bx+c=0
Date de ieșire
Fișierul de ieșire ecuatii.out va conține soluţiile acestei ecuaţii, cu 2 zecimale exacte, sperate
printr-un spaţiu. Dacă ecuaţia nu are soluţii reale, se va afişa -1. Dacă ecuaţia are o singură soluţie
reală, se va afişa numai aceasta, cu 2 zecimale exacte.
Restricții și precizări
3 3
 a, b, c ∈ [-10 , 10 ], a≠0
 Dacă valorile a şi b nu sunt precizate (ex: x^2+x+1=0), acestea vor fi egale cu 1 sau -1,
în funcţie de semn (vedeţi exemplele)
 Dacă ecuaţia are 2 soluţii reale, se va afişa cea mai mică, urmată de cea mai mare
Exemple:
ecuatii.in ecuatii.out ecuaţie
3x^2-x-4 -1.00 1.33 3x2−x−4=0
2
x^2-8x+16 4.00 x −8x+16=0
2
-x^2-8x+16 -9.66 1.66 −x −8×+16=0
2
3x^2-x+0 0.00 0.33 3x −x=0
2
4x^2+x+16 -1 4x +x+16=0
2
x^2+0x-4 -2.00 2.00 x −4=0
2. EliminareSubsir
https://www.pbinfo.ro/probleme/199/eliminaresubsir
Cerinţa
Se dau două şiruri de caractere s şi t. Să se elimine din s toate apariţiile lui t.
Date de intrare
Programul citește de la tastatură cele două şiruri, s, respectiv t, separate prin caracterul NewLine.
Date de ieşire
Programul afișează pe ecran şirul s, obţinut după transformarea cerută.
Restricţii şi precizări
 cele două şiruri conţin cel mult 255 caractere.
 aparițiile șirului t în s nu se suprapun

Exemplu
Intrare
ana si mariana canta la nai
na
Ieșire
a si maria canta la i

8
3. Eliminare
https://www.pbinfo.ro/probleme/110/eliminare

Cerinţa
Să se scrie un program care citeşte de la tastatură un cuvânt şi afişează pe ecran toate cuvintele care
se pot obţine prin eliminarea unei singure litere din cuvântul citit.
Date de intrare
Programul citeşte de la tastatură un cuvânt de cel mult 100 caractere.
Date de ieşire
Programul afişează pe ecran toate cuvintele care se pot obţine prin eliminarea unei singure litere din
cuvântul citit, fiecare pe o linie.
Restricţii şi precizări
 cuvântul citit este alcătuit din litere mici ale alfabetului englez
 primul cuvânt afişat va fi cel obţinut prin eliminarea primei litere, al doilea va fi cel obţinut
prin eliminarea celei de-a doua litere, etc.

Exemplu
Intrare
caiet
Ieşire
aiet
ciet
caet
cait
caie
4. Email
https://www.pbinfo.ro/probleme/851/email
O adresă de email este alcătuită din numele de utilizator și numele de domeniu, separate prin
simbolul @. De exemplu, gigel@pbinfo.ro este o adresă de email corectă ca structură, chiar dacă
inexistentă.
Cerința
Se dă o listă de adrese de email corecte ca structură. Să se determine câte adrese de email sunt
asociate cu fiecare nume de domeniu.
Date de intrare
Fișierul de intrare email.in conține mai multe adrese de email, câte una pe o linie.
Date de ieșire
Fișierul de ieșire email.out va conține pe prima linie numărul C de nume de domenii diferite.
Următoarele C linii conțin câte un nume de domeniu, urmat de un spațiu și de numărul de adrese
date asociate cu acel domeniu. Numele de domeniu se vor afișa în ordine descrescătoare a
numărului de adrese asociate. Dacă există mai multe nume de domenii cu același număr de adrese
asociate, se vor afișa în ordine lexicografică.
Restricții și precizări
 fișierul de intrare va conține cel mult 1000 de adrese distincte, cu cel mult 200 de domenii
distincte;
 lungimea maximă a unei adrese de email este de 50 de caractere;
 numele de domeniu începe după simbolul @ și se termină la sfârșitul adresei;
 adresa de email nu conține spații sau alte caractere albe.

Exemplu
email.in email.out
gigel@pbinfo.ro 3
gigel@yahoo.com yahoo.com 3
9
ionel.c@gmail.com gmail.com 2
gigi@pbinfo.ro pbinfo.ro 2
vasile@yahoo.com
jr@gmail.com
qwerty@yahoo.com

5.Valori
https://www.pbinfo.ro/probleme/856/valori
Cerința
Gigel se joacă cu cuvinte (scrise cu litere din alfabetul englez, mari sau mici). El a asociat fiecărei
litere din alfabet o valoare număr natural, pe care a numit-o valoarea literei. Apoi a definit valoarea
unui cuvânt astfel: se calculează suma S1 a valorilor literelor mici din cuvânt şi suma S2 a valorilor
literelor mari din cuvânt. Valoarea cuvântului va fi S1 - S2.
Cunoscându-se valoarea fiecărei litere din alfabet şi o listă de cuvinte, să se determine cuvântul cu
valoarea maximă. Dacă există mai multe cuvinte de valoare maximă, se vor determina toate, în
ordinea din lista dată.
Date de intrare
Fișierul de intrare valori.in conține pe prima linie numărul 26 de numere, reprezentând, în
ordine, valorile literelor din alfabet, pe a doua linie numărul de cuvinte n iar pe următoarele n linii
câte un cuvânt format din litere mari şi mici ale alfabetului englez.
Date de ieșire
Fișierul de ieșire valori.out va conține cuvintele de valoare maximă din lista dată, în ordinea
din listă, fiecare cuvânt pe câte o linie.
Restricții și precizări
 valorile literelor sunt numere naturale mai mici decât 1000
 1 ≤ n ≤ 1000
 fiecare dintre cuvintele date conţine cel mult 255 caractere

Exemplu
valori.in valori.out

2 7 7 3 9 8 9 6 3 9 6 6 6 5 5 8 2 6 6 1 AbAc
5 6 9 4 7 3
4
BaciL
AbAc
Aba
AbEcEdAr

Resurse

1. https://www.pbinfo.ro/articole/7659/pointeri-operatii-cu-pointeri
2. https://www.pbinfo.ro/articole/7660/legatura-intre-pointeri-si-tablouri

3. https://www.pbinfo.ro/articole/7661/aritmetica-pointerilor

4. https://infogenius.ro/siruri-de-caractere-cpp/

Prof. Silvia Grecu

10

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