Sunteți pe pagina 1din 6

7. Aplicaii cu tablouri n C/C++.

(Application with arrays in C/C++)


1. Obiective: nelegerea tablourilor unidimensionale i multidimensionale din C/C++ nelegerea modului n care se lucreaz cu tablourilor unidimensionale i multidimensionale din C/C++: declarare, iniializare, accesul la elemente, diferite operaii Scrierea i rularea de programe simple n care sunt folosite tablouri 2. Breviar teoretic 2.1. Tablouri unidimensionale (vectori) Declarare: tip nume_tablou[dimensiune]; Pentru referirea unui element se folosete operatorul de indexare [], preciznd numele tabloului i poziia elementului n tablou (indexul sau indicele): nume_tablou[index]

2.2. Tablouri multidimensionale Declarare: tip nume_tablou[dimens1][dimens2]...[dimensN]; Un tablou cu mai multe dimensiuni este de fapt un tablou unidimensional avnd ca elemente alte tablouri. Referirea unui element se face astfel: nume_tablou[index1][index2]...[indexN];

2.3. Elemente de tablou Un element de tablou poate s apar oriunde poate s apar o variabil simpl cu acelai tip ca i tipul tabloului : atribuiri, citiri de la consol, afiri, calcule (expresii), apeluri de funcii. 2.4. Iniializarea tablourilor la declarare Iniializarea se poate face la declarare, prin utilizarea unei liste de valori separate prin virgul i delimitat de acolade. a) tablouri unidimensionale: tip nume_tablou[dimensiune] = {ec0, ..., eci}; b) tablouri multidimensionale: tip nume_tablou[n][m] = {{ec11,...,ec1m}, {ec21,...,ec2m},..., {ecn1,...,ecnm}}; 2.5. Prelucrarea tuturor elementelor unui tablou Se utilizeaz cel mai frecvent instruciunea ciclic for pentru a prelucra secvenial toate elementele. Variabila de ciclare este folosit ca i index n tablou, iar o alt variabil sau constant simbolic ce conine dimensiunea tabloului se folosete n condiia asociat instruciunii ciclice. 2.6. Transmiterea tablourilor ctre funcii Se poate face prin declararea unui argument de tip tablou, dar fr dimensiune. Uzual, se mai transmite i dimensiunea tabloului ca i argument separat deoarece n C/C++ nu avem informaie despre dimensiunea unui tablou. n acest mod, funcia respectiv poate fi apelat pentru orice tablou ce are acelai tip precizat n prototipul funciei. Fiind o form de apel prin referin, orice modificare, n funcie, a elementelor unui tablou transmis ca parametru, se reflect asupra tabloului iniial. Dac ns se folosete modificatorul const pentru tablou, atunci acesta este transmis prin valoare i nu se mai pot face modificri asupra elementelor tabloului. n cazul tablourilor multidimensionale, prima dimensiune poate lipsi, celelalte sunt obligatorii.

2.7. Cutarea n tablouri De obicei se caut poziia unui element cu o anumit valoare. Dac tabloul nu este sortat (elementele nu sunt aranjate ntr-o anumit ordine) se aplic cutarea liniar care const n parcurgerea secveniala (unul dup altul) a elementelor tabloului i compararea acestora cu valoarea de cutat. Dac este gsit un element ce are acea valoare, se returneaz indicele elementului, altfel se returneaz valoarea -1. Acest algoritm permite gsirea primului element ce are o anumit valoare, ns pot fi mai multe elemente cu aceeai valoare. 2.8. Inserarea n tablouri n cazul tablourilor nesortate, pentru a insera elemente noi ntr-un tablou trebuie s inem cont de urmtoarele: - trebuie s existe poziii libere n tablou; - pentru elementul nou se creaz loc prin deplasarea altor elemente, de obicei spre dreapta. n cazul tablourilor sortate trebuie gsit mai nti poziia n care se va face inserarea. 2.9. tergerea din tablouri Ca i inserarea, tergerea presupune deplasarea unor elemente, de obicei spre stnga. Se presupune c se cunoate poziia n care se face tergerea (dac nu se face cutarea elementului de tablou cu o anumit valoare).

3. Exemple: Exemplul 1: program ce citete elementele unui tablou bidimensional, dup care determina suma elementelor de pe diagonala principal. #include <stdio.h> #define MAX 20

void main(void) { int i, j, n, sum=0, tab[MAX][MAX]; printf("\nDimensiunea matricei: "); scanf("%d", &n); if(n<=0) { printf("\n\tDate invalide !"); return; }//end if printf("\nIntroduceti elementele matricei:"); for(i=0; i<n; i++) { printf("\n\t Linia %d: \n", i+1); for(j=0; j<n; j++) { printf("\t\ttab[%d,%d] = ",i+1, j+1); scanf("%d", &tab[i][j]); } }//end for for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (i == j) sum += tab[i][j]; printf( "\nSuma elementelor de pe diagonala principala este: %d\n ", sum); }

Exemplul 2: program pentru determinarea valorii medii a elementelor unui vector. #include <stdio.h> #define DIM 20 float ValMed(int x[], int dim); void main(void) { int i, dim; int x[DIM]; printf("\nIntroduceti dimensiunea vectorului: "); scanf("%d", &dim); if(dim > DIM) { printf("\n Dimensiune prea mare !"); return; } printf("\n Introduceti elementele vectorului:\n"); for(i=0; i<dim; i++) { printf("\tx[%d] = ", i); scanf(" %d", &x[i]); } printf("\n Valoarea medie este: %.3f\n", ValMed(x, dim)); } // Functia determina valoarea medie a elementelor unui vector float ValMed(int x[], int n) { int i; float sum=0; for(i=0; i<n; i++) sum += x[i]; return sum/n; } Exemplul 3: program pentru cutarea direct ntr-un vector. #include <stdio.h> #define DIM 100 int CautDir(int x[], int dim, int val); void main(void) { int i, dim, val, poz; int x[DIM]; printf("\nIntroduceti dimensiunea vectorului : "); scanf("%d", &dim); if(dim > DIM) { printf("\n Dimensiune prea mare !"); return; }

printf("\n Introduceti elementele vectorului:\n"); for(i=0; i<dim; i++) { printf("\tx[%d] = ", i); scanf("%d", &x[i]); } printf("\n Introduceti numarul de cautat: "); scanf("%d", &val); poz = CautDir(x, dim, val); if(poz < 0) printf("\n Numarul %d nu a fost gasit !\n", val); else printf("\n Numarul %d a fost gasit in pozitia %d.\n", val, poz+1); } // Functie ce cauta o valoare intr-un tablou // Returneaza pozitia in caz de suuces sau valoarea -1 in caz de esec int CautDir(int x[], int n, int val) { for(int i=0; i<n; i++) { if(x[i] == val) return i; } return -1; } Exemplul 4: program pentru inserarea unei valori ntr-un vector. #include <stdio.h> #define DIM 20 void Inserare(int tab[], int n, int idx, int val); void main(void) { int i, dim, val, poz; int x[DIM]; printf("\nIntroduceti dimensiunea vectorului: "); scanf("%d", &dim); if(dim > DIM) { printf("\n Dimensiune prea mare !"); return; } printf("\n Introduceti elementele vectorului:\n"); for(i=0; i<dim; i++) { printf("\tx[%d] = ", i); scanf("%d", &x[i]); } printf("\n Introduceti numarul de inserat: "); scanf("%d", &val); printf("\n Introduceti pozitia in care se va face inserarea: "); scanf("%d", &poz);

if(dim == DIM) { printf("\n Spatiu insuficient pentru inserare !\n"); return; } Inserare(x, dim, poz, val); dim++; printf("\nNumerele din tablou :\n"); for(i=0; i<dim; i++) printf("\t%d", x[i]);//end for printf("\n"); }//end main void Inserare(int arr[], int n, int idx, int val) { if (idx==-1) arr[n] = val; // adaugare else { for(int i = n; i > idx; i--) arr[i] = arr[i-1]; arr[idx] = val; } } 4. ntrebri: Cum se pot accesa elementele unui tablou ? Cum se face iniializarea unui tablou ? Ce presupune inserarea, respectiv tergerea unui element dintr-un tablou ? Cum se realizeaz transmiterea unui tablou ntr-o funcie?

5. Teme: 1. Scriei un program pentru determinarea valorii medii a elementelor pozitive/negative dintr-un vector. 2. Scriei un program pentru determinarea celui mai mic element pozitiv dintr-un vector. 3. Scrieti o aplicatie C/C++ care citeste de la tastatura un sir de 10 valori intregi. Definiti o functie care primeste sirul ca parametru si apoi il afiseaza ordonat crescator. 4. Scrieti o aplicatie C/C++ care defineste o parola (in format sir de caractere). Programul citeste in mod repetat sirurile de caractere introduse de la tastatura, pana cand utilizatorul scrie parola corecta. Sa se afiseze numarul de incercari pana la introducerea parolei corecte. 5. Scrieti o aplicatie C/C++ care citeste de la tastatura 2 siruri de caractere reprezentand numele si prenumele unei persoane. Afisati-le cu majuscula, separate prin 2 spatii de tabulare. 6. Scrieti o aplicatie C/C++ care defineste 2 matrice de valori intregi. Dimensiunea si elementele matricilor sunt citite de la tastatura. Scrieti functiile care: a) afiseaza pozitiile elementelor pare din fiecare matrice; b) afiseaza suma elementelor impare din ambele matrice; c) afiseaza suma matricelor; 7. Cititi de la tastatura elementele unei matrice de elemente de tip float, cu dimensiunea 3x3. Rearanjati coloanele matricei astfel incat suma elementelor de pe o anumita coloana sa fie mai mica decat suma elementelor de pe coloana urmatoare. 5. Homework 1. Write a C/C++ that determines the mean value of the negative/positive elements from a vector. 2. Write a C/C++ that determines the value of the minimum positive element from a vector. 3. Write a C/C++ application that reads from the keyboard an array of 10 integer values. Define and implement a function that receives the array as parameter and then displays its elements, ordered increasingly.

4. Write a C/C++ application that defines a password (as an array o characters).The program reads repeatedly the entries from the keyboard until the user enters the right password. Display the number of tries the user entered wrong passwords. 5. Write a C/C++ application that that reads from the keyboard 2 arrays of characters representing the name and surname of a person. Display them with capital letter, separated by a TAB space. 6. Write a C/C++ application that defines 2 matrices of integer values. The matrices dimensions and elements are read from the standard input. Write the functions that: a) display the positions of the odd elements in each matrix; b) display the sum of all even elements in both matrices; c) display the sum of the 2 initial matrices; 7. Read from the keyboard the elements of a 3x3 float matrix. Re-arrange the columns so that the sum of a column's elements is smaller than the sum of the elements from the next column.

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