Sunteți pe pagina 1din 4

Laboratorul 13

1. Completai frazele urmtoare: a) Un pointer este o variabil a crei valoare este _______ unei alte variabile. b) Cele trei valori cu care poate fi iniializat un pointer sunt _______, _______ i _______. c) Singura valoare ntreag care poate fi asignat unui pointer este __. 2. Stabilii dac urmtoarele afirmaii sunt adevrate sau false. Motivai fiecare rspuns fals. a) Operatorul adres & poate fi aplicat constantelor. b) Un pointer care este declarat de tip void poate fi derefereniat. c) Pointerii de diferite tipuri nu pot fi asignai unul altuia fr o operaie prealabil de cast. 3. Pentru fiecare dintre punctele urmtoare, scriei cte o instruciune care realizeaz operaia indicat. Presupunei c au fost declarate variabilele n virgul mobil number1 i number2 i c number1 a fost iniializat cu valoarea 7.3. a) Declarai variabila fPtr ca un pointer la un obiect de tip double; b) Asignai adresa variabilei number1 pointerului la variabila fPtr; c) Tiprii valoarea obiectului la care pointeaz variabila fPtr; d) Asignai valoarea obiectului la care pointeaz fPtr variabilei number2; e) Tiprii valoarea lui number2; f) Tiprii adresa lui number1; g) Tiprii adresa stocat n fPtr. Valoarea tiprit este aceeai cu adresa lui number1? 4. Gsii erorile din segmentele de program de mai jos. Presupunei c au fost fcute urmtoarele declaraii: int *zPtr; //zPtr va referi tabloul z void *sPtr = 0; int number, i; int z[5] = {1, 2, 3, 4, 5}; zPtr = z; sPtr = z; a) //folosirea pointerului pentru a accesa //prima valoare a tabloului number = zPtr; b) //asigneaza al doilea element al tabloului (valoarea 3) // variabilei number number = *zPtr[2]; c) //tipareste toate elementele tabloului z for( i = 0; i <= 5; i++ ) cout << zPtr[i] << endl; d) //asigneaza variabilei number valoarea obiectului la care pointeaza sPtr

Programarea calculatoarelor i limbaje de programare I

number = *sPtr; 5. Prelucrarea string-urilor. Un string n C++ este un ir de caractere care se termin cu caracterul null (\0). Un string poate fi accesat printr-un pointer la primul su caracter. n C++, un string este un pointer constant la primul lui caracter, astfel nct string-urile pot fi tratate ca i tablouri. Citirea string-urilor se poate face cu ajutorul stream-urilor. Pentru string-ul word[20], instruciunea de citire poate fi scris astfel: cin >> word; Manipulatorul setw se folosete pentru a fi siguri c string-ul introdus nu depete dimensiunea alocat.: cin >> setw(20) >> word; n unele cazuri este necesar s introducem ntr-un tablou o ntreag linie de text. Pentru aceasta se poate folosi funcia cin.getline care are trei parametri: numele tabloului n care se pstreaz textul, lungimea acestuia i un caracter de delimitare: char fraza[80]; cin.getline(fraza, 80, \n); Funcia oprete citirea caracterelor atunci cnd ntlnete caracterul de delimitare nainte de a fi citit cele 80 de caractere. Biblioteca standard C++ definete o serie de funcii pentru manipularea stringurilor i sunt incluse n fiierul header cstring. Unele dintre aceste funcii folosesc tipul de dat size_t care este un tip integral unsigned. Prototipul funciei Descrierea funciei char* strcpy(char* s1, const char* s2); Copiaz string-ul s2 n tabloul de caractere s1. Este returnat valoarea lui s1. char* strncpy(char* s1, const char* s2, size_t n); Copiaz cel mult n caractere ale string-ului s2 n tabloul s1. Este returnat valoarea lui s1. char* strcat(char* s1, const char* s2); Adaug string-ul s2 la s1. Primul caracter al lui s2 suprascrie terminatorul de ir din s1. Este returnat valoarea lui s1. char* strncat(char* s1, const char* s2, size_t n); Adaug cel mult n caractere din string-ul s2 la s1. Primul caracter al lui s2 suprascrie terminatorul de ir din s1. Este returnat valoarea lui s1. char strcmp(char* s1, const char* s2); Compar string-ul s1 cu s2. Funcia returneaz valoarea zero, o valoare negativ sau o valoare pozitiv dac s1 este egal cu s2, dac este mai mic sau este mai mare, respectiv. Compararea se face dup codurile ASCII. char strncmp(char* s1, const char* s2, size_t n); Compar cel mult n caractere din string-ul s1 cu s2. Funcia returneaz valoarea zero, o valoare negativ sau o valoare pozitiv dac s1 este egal cu s2, dac este mai mic sau este mai mare, respectiv. Compararea se face dup codurile ASCII. char* strtok(char* s1, const char* s2);

Programarea calculatoarelor i limbaje de programare I

O secven de apeluri ale lui strtok separ string-ul s1 n tokeni elemente componente, de exemplu cuvinte dintr-o linie de text delimitate prin caracteru coninut n string-ul s2. Primul apel folosete s1 ca prim argument, iar apelurile urmtoare continu s delimiteze tokenii aceluiai string. La fiecare apel este returnat un pointer la tokenul curent. Dac nu mai sunt tokeni n ir, se returneaz NULL. Exemplu #include <iostream> #include <cstring> using namespace std; int main() { char x[] = "Happy Birthday to You"; char y[25], z[15]; cout << "String-ul din tabloul x este: " << x << endl << "String-ul din taboul y este: " << strcpy(y, x) << endl; strncpy(z, x, 14); //nu copiaza caracterul NULL z[14] = '\0'; cout << "String-ul din tabloul z este: " << z << endl; return 0; } Programul afieaz: String-ul din tabloul x este: Happy Birthday to You String-ul din taboul y este: Happy Birthday to You String-ul din tabloul z este: Happy Birthday Exemplu #include <iostream> #include <cstring> using namespace std; int main() { char string[] = "Aceasta este o fraza cu 7 tokeni"; char *tokenPtr; cout << "String-ul care va fi impartit in tokeni este: " << string << endl << endl << "Tokenii sunt: " << endl; tokenPtr = strtok(string, " "); while(tokenPtr != NULL) { cout << tokenPtr << endl; tokenPtr = strtok(NULL, " "); 3

Programarea calculatoarelor i limbaje de programare I

} return 0; } Programul afieaz: String-ul care va fi impartit in tokeni este: Aceasta este o fraza cu 7 tokeni Tokenii sunt: Aceasta este o fraza cu 7 tokeni Gsii erorile din segmentele de program de mai jos. a) char s[50]; cout << strncpy(s, hello, 5) << endl; b) char s[12]; strcpy(s, Welcome Home); c) if(strcmp(string1, string2)) cout << String-urile sunt egale << endl;