Diferență între revizuiri ale paginii „PC Laborator 7”
(Nu s-au afișat 27 de versiuni intermediare efectuate de alți 3 utilizatori) | |||
Linia 12: | Linia 12: | ||
*vectori (tablouri unidimensionale): șiruri de valori | *vectori (tablouri unidimensionale): șiruri de valori | ||
*matrici (tablouri bidimensionale): catalogul cu note | *matrici (tablouri bidimensionale): catalogul cu note | ||
− | *multidimensionale: | + | *multidimensionale: pixelii unei imagini în timp |
Linia 32: | Linia 32: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | <div class="regula">'''<font color="red"> Observatie:</font>''' ''Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat | + | <div class="regula">'''<font color="red"> Observatie:</font>''' ''Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).'' |
</div> | </div> | ||
Linia 41: | Linia 41: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | <div class="regula">'''<font color="red"> | + | <div class="regula">'''<font color="red"> Recomandare: </font>''' ''Numărătoarea elementelor începe de la 0.'' </div> |
<syntaxhighlight lang="C"> int v[10]; // primul element va fi v[0],iar ultimul element v[9] </syntaxhighlight> | <syntaxhighlight lang="C"> int v[10]; // primul element va fi v[0],iar ultimul element v[9] </syntaxhighlight> | ||
− | Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul | + | Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă. |
'''Un alt mod de declarare este:''' | '''Un alt mod de declarare este:''' | ||
Linia 49: | Linia 49: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13}; // Toate elemente sunt initializate | int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13}; // Toate elemente sunt initializate | ||
− | float nume_vector[] = {1.2, 2.2, 6.1, -9.3}; // Compilatorul determina dimensiunea vectorului=4 | + | float nume_vector[] = {1.2, 2.2, 6.1, -9.3}; // Compilatorul determina dimensiunea vectorului = 4 |
int vect[1000] = {0, 1, 2, 3, 5}; // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero | int vect[1000] = {0, 1, 2, 3, 5}; // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 55: | Linia 55: | ||
==== Parcurgerea vectorilor ==== | ==== Parcurgerea vectorilor ==== | ||
− | Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1]. A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin: | + | Cum deja am discutat, prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1]. A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin: |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | for(i=0; i < N; i++) | + | for (i = 0; i < N; i++) |
// instrucțiune v[i]; | // instrucțiune v[i]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 80: | Linia 80: | ||
| 120 | | 120 | ||
| 460 | | 460 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | + | printf("%d", v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33 | |
− | printf("%d",v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33 | ||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 98: | Linia 90: | ||
int v[100], n, i; // vectorul a are maxim 100 de intregi | int v[100], n, i; // vectorul a are maxim 100 de intregi | ||
− | + | scanf("%d", &n); // citeste nr de elemente | |
for (i = 0; i < n; i++) { | for (i = 0; i < n; i++) { | ||
scanf("%d", &v[i]); // citire elemente | scanf("%d", &v[i]); // citire elemente | ||
− | + | } | |
for (i = 0; i < n; i++) { | for (i = 0; i < n; i++) { | ||
printf("%d ", v[i]); // scrie elemente | printf("%d ", v[i]); // scrie elemente | ||
− | + | } | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | === | + | === Matrice === |
− | O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane. | + | O matrice reprezintă o colecție de date de acelaşi tip, ce este structurată pe linii şi coloane. |
Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei. | Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei. | ||
<div class="regula">'''<font color="red"> Observatie:</font>''' '' Un vector este un caz particular de matrice cu o singură linie.'' </div> | <div class="regula">'''<font color="red"> Observatie:</font>''' '' Un vector este un caz particular de matrice cu o singură linie.'' </div> | ||
− | ==== Declarația unei | + | ==== Declarația unei matrice ==== |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
Linia 125: | Linia 117: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți | + | int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5 * 10 * 4 = 200 octeți |
#define MAX 100 | #define MAX 100 | ||
Linia 136: | Linia 128: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
int mat[N][M]; | int mat[N][M]; | ||
− | + | ||
− | + | for (int i = 0; i < N; i++) { | |
− | + | for (int j = 0; j < M; j++) { | |
+ | // instrucțiune mat[i][j]; | ||
+ | } | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 145: | Linia 140: | ||
==== Adresarea matricilor ==== | ==== Adresarea matricilor ==== | ||
− | Adresarea este similară cu cea a vectorilor,doar | + | Adresarea este similară cu cea a vectorilor, doar că în acest caz lucrăm cu două dimensiuni (2D)-matrici. |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | printf("%d",mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat | + | printf("%d", mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat |
− | + | scanf("%d", &mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat | |
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 158: | Linia 153: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | int mat[10][10] | + | int mat[10][10]; |
− | + | int i, j; | |
− | + | ||
− | + | for (i = 0; i < 10; i++) | |
− | + | for (j = 0; j < 10; j++) { | |
− | + | printf("v[%d][%d] = ", i, j); | |
+ | scanf("%d", &mat[i][j]); | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Tablouri multidimensionale === | === Tablouri multidimensionale === | ||
− | Noţiunea generală de tablou cu mai multe dimensiuni | + | Noţiunea generală de tablou cu mai multe dimensiuni se declară astfel: |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
Linia 181: | Linia 178: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil. | + | În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar, ușor perceptibil. |
== Exerciții == | == Exerciții == | ||
− | + | <ol> | |
− | + | <li>Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.</li> | |
− | + | <li>Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.</li> | |
− | + | <li>Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.</li> | |
− | + | <li>Declarați și afișați o matrice unitate.</li> | |
− | + | <li>Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.</li> | |
+ | <li>Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.</li> | ||
+ | <li>Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile: | ||
+ | <ul> | ||
+ | <li>toate elementele situate pe diagonala principală sunt nule;</li> | ||
+ | <li>fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.</li></ul></li> | ||
+ | Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe | ||
+ | câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin | ||
+ | câte un spatiu. | ||
+ | Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat. | ||
+ | <syntaxhighlight lang="C"> | ||
+ | 0 1 2 3 4 | ||
+ | 1 0 1 2 3 | ||
+ | 2 1 0 1 2 | ||
+ | 3 2 1 0 1 | ||
+ | 4 3 2 1 0 | ||
+ | </syntaxhighlight> | ||
+ | <li>Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.</li> | ||
+ | <li>Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.</li> | ||
+ | </ol> | ||
+ | |||
+ | == Exerciții pentru acasă== | ||
+ | |||
+ | # Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule. | ||
+ | # Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze: | ||
+ | #* suma elementelor de pe diagonala principală | ||
+ | #* produsul elmentelor de pe diagonala secundară | ||
+ | #* minimul elementelor aflate deasupra, respectiv sub diagonala principală | ||
+ | # Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii. | ||
+ | # Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2<n<25, 2<m<25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea: | ||
+ | <syntaxhighlight lang="C"> | ||
+ | 1 2 3 4 5 | ||
+ | 2 3 4 5 6 | ||
+ | 3 4 5 6 7 | ||
+ | </syntaxhighlight> |
Versiunea curentă din 3 noiembrie 2019 23:16
Obiective
La încheierea acestui laborator studentul va fi capabil:
- să înteleagă modul de utilizare a tablourilor de memorie
- să declare şi să iniţializeze vectori/matrici
- să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme
Tablouri
Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.
Tablourile pot fi :
- vectori (tablouri unidimensionale): șiruri de valori
- matrici (tablouri bidimensionale): catalogul cu note
- multidimensionale: pixelii unei imagini în timp
Vectori
Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.
Declarația unei variabile de tip vector
<tip_elemente> <nume_vector>[<număr_maxim_elemente>];
Exemplu
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */
float nume_vector[100]; /* vector de tip float cu 100 elemente */
#define MAX 100
...
unsigned long nume_vector[MAX]
int v[10]; // primul element va fi v[0],iar ultimul element v[9]
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă.
Un alt mod de declarare este:
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13}; // Toate elemente sunt initializate
float nume_vector[] = {1.2, 2.2, 6.1, -9.3}; // Compilatorul determina dimensiunea vectorului = 4
int vect[1000] = {0, 1, 2, 3, 5}; // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero
Parcurgerea vectorilor
Cum deja am discutat, prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1]. A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:
for (i = 0; i < N; i++)
// instrucțiune v[i];
Modul de adresare
Indici | 0 | 1 | 2 | 3 |
---|---|---|---|---|
Valoare | 12 | 33 | 120 | 460 |
printf("%d", v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33
Citirea vectorilor
int v[100], n, i; // vectorul a are maxim 100 de intregi
scanf("%d", &n); // citeste nr de elemente
for (i = 0; i < n; i++) {
scanf("%d", &v[i]); // citire elemente
}
for (i = 0; i < n; i++) {
printf("%d ", v[i]); // scrie elemente
}
Matrice
O matrice reprezintă o colecție de date de acelaşi tip, ce este structurată pe linii şi coloane. Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.
Declarația unei matrice
<tip_elemente> <nume_matrice>[<număr_linii>][<număr_coloane>];
Exemplul 1
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5 * 10 * 4 = 200 octeți
#define MAX 100
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100
Parcurgerea matricilor
int mat[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// instrucțiune mat[i][j];
}
}
Adresarea matricilor
Adresarea este similară cu cea a vectorilor, doar că în acest caz lucrăm cu două dimensiuni (2D)-matrici.
printf("%d", mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat
scanf("%d", &mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat
Citirea matricilor
int mat[10][10];
int i, j;
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++) {
printf("v[%d][%d] = ", i, j);
scanf("%d", &mat[i][j]);
}
Tablouri multidimensionale
Noţiunea generală de tablou cu mai multe dimensiuni se declară astfel:
<tip_elemente> <nume_tablou>[<dim_1>][<dim_2>]...[<dim_n>];
Exemplu
int cub[3][3][3];
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar, ușor perceptibil.
Exerciții
- Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.
- Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.
- Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.
- Declarați și afișați o matrice unitate.
- Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.
- Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.
- Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:
- toate elementele situate pe diagonala principală sunt nule;
- fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.
- Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.
- Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin câte un spatiu. Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.
0 1 2 3 4
1 0 1 2 3
2 1 0 1 2
3 2 1 0 1
4 3 2 1 0
Exerciții pentru acasă
- Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.
- Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:
- suma elementelor de pe diagonala principală
- produsul elmentelor de pe diagonala secundară
- minimul elementelor aflate deasupra, respectiv sub diagonala principală
- Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.
- Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2<n<25, 2<m<25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7