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; // 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

ex: int *p1, *p2; char *c;

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; 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 utiliza operatorul >> sau una din funciile get sau getline char c, sir[201]; fin>>c; fin.getline(sir, 200); //sau fin.get(sir,200);fin.get();

n limbajul C -se folosete specificatorul de format %c pentru caractere i %s pentru iruri char c, sir[201]; fscanf(fin,%c, &c); fscanf(fin,%s,sir);

Prototipurile funciilor get i getline: 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 radical.out 5+11r3+4r5

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

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