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
Ș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]
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”
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>
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>
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/
10