Documente Academic
Documente Profesional
Documente Cultură
Siruri
#include <stdio.h>
main( )
{
int nota[100], max, i;
printf("Introduceti notele:");
for(i = 0; i < 100; i ++)
scanf("%d", ¬a[i]);
... ....
Adresa sirului este adresa primului element al sirului, deci adresa elementului de
index 0. Daca se cunoaste adresa sirului atunci se poate afla adresa oricarui element al
sirului.
adresa lui a[2] =adresa lui a[0] + 4 * 2 = 1079 + 8 = 1087
Lectia 2
2.1 Sirurile in functii
Un element al unui sir poate fi argumentul unei functii asa cum orice variabila
de tipul sirului poate fi argumentul functiei.
De exemplu:
void scrie(int n)
{
printf("%d\n",n);
}
poate fi apelata in programul urmator
main( )
{
int a[20], i;
for(i = 0; i < 20; i ++)
scrie(a[i]);
}
si va scrie toate elementele sirului, cate unul pe fiecare linie.
Sirurile pot fi parametrii unei functii. Pentru a preciza faptul ca un sir este
parametrul functiei acesta este declarat in felul urmator:
tip_sir nume_sir[ ]
deci nu se precizeaza nici un numar intre parantezele patrate (chiar daca am scrie o
constanta acolo, compilatorul ar ignora-o).
Sa presupunem ca vrem sa scriem o functie care calculeaza suma elementelor
unui sir de tip int. Functia trebuie sa primeasca sirul ca data de intrare, dar in plus mai
are nevoie si de dimensiunea sirului, deci de un parametru in plus:
int suma(int a[], int dim)
{
int suma = 0, i;
for (i = 0; i < dim; i ++)
suma += a[i];
return suma;
}
De cele mai multe ori cand vrem sa folosim un sir ca parametru al unei functii trebuie
sa avem doi parametrii de fapt, sirul si numarul de elemente din sir pe care vrem sa le
folosim in functie. Functia suma va fi apelata in felul urmator:
main( )
{
int x[4] = {7, 3, 9, 5}, y[8] = {7, 7, 9, 8};
printf("Suma elementelor sirului x este %d\n", suma(x, 4));
printf("Suma elementelor sirului y este %d\n", suma(y, 8));
}
Mentionam in capitolul 4 Functii ca argumentele unei functii sunt transmise
prin valoare, adica functiile nu au acces direct la argumentele lor ci doar la o copie
locala a lor (parametrii sunt variabile locale care primesc valorile argumentelor).
Acest lucru este adevarat cu o singura exceptie: cand un sir este folosit ca argument al
unei functii atunci adresa sirului (deci adresa primului element) este transmisa
functiei, elementele sirului nu sunt copiate in alt sir. Aceasta inseamna ca de fapt
functia poate accesa elementele sirului si le poate modifica.
Consideram functia:
void sir_zero(int x[ ], int n)
{
int i;
for(i = 0; i < n; i ++)
x[i] = 0;
}
main( )
{
int a[5] = {3, 8, 5, 7}, i;
for(i = 0; i < 5; i ++)
printf("a[%d] = %d ", i, a[i]);
printf("\n");
sir_zero(a, 5);
for (i = 0; i < 5; i ++)
printf("a[%d] = %d ", i, a[i]);
}
va tipari:
a[0] = 3 a[1] = 8 a[2] = 5 a[3] = 7 a[4] = 0
a[0] = 0 a[1] = 0 a[2] = 0 a[3] = 0 a[4] = 0
2.2 Siruri partiale
main()
{
int nota[NR_STUDENTI], max, i, studenti;
printf("Introduceti notele:");
for(i = 0; i < studenti; i ++)
scanf("%d", ¬a[i]);
Exemplu:
int matrice[3][2], cursor[120][180];
double imagine[10][20][30];
Elementele unui sir multidimensional sunt de acelasi tip si sunt indexate dupa
2, 3 sau mai multi indici, in functie de dimensiunea sirului. In exemplul de mai sus
elementele sirului matrice vor fi: matrice[0][0], matrice[0][1], matrice[1][0],
matrice[1][1], matrice[2][0], matrice[2][1]. De fapt aceasta este si ordinea elementelor
sirului in memorie. In C, un sir bidimensional este de fapt un sir de siruri. In exemplul
de mai sus, matrice este de fapt un sir de 3 elemente in care fiecare element este un sir
de doi intregi.
m:
7 8 9 10
1 2 3 8
3 4
5 6
Daca sunt scrise mai putine elemente in lista atunci celelalte vor fi 0. Daca lista
contine mai multe elemente atunci se obtine eroare de compilare.
double a[3][4];
int i, j;
for(i = 0; i < 3; i ++)
for(j = 0; j < 4; j ++)
scanf("%lf ", &a[i][j]);
Citirea elementelor matricii se va face: intai prima linie apoi a doua, etc. Daca in
schimb folosim secventa de instructiuni for:
citirea elementelor matricii se va face: intai prima coloana, apoi a doua, etc. In orice
caz, elementele matricii vor fi stocate in memorie, asa cum am precizat mai inainte,
pe linii (intai prima linie, apoi a doua, etc).
main( )
{ int matrice[10][3], x[8][3], y[7][9];
citeste(matrice,10);
citeste(x, 8);
/* citeste(y, 7) nu este permis pentru ca sirul y are 9 coloane
si nu 3 */
}
citeste(note);
calculeaza_medie_student(note, medie_student);
calculeaza_medie_examen(note, medie_examen);
afiseaza(note, medie_student, medie_examen);
}
3. Scrieti o functie care verifica daca un sir de intregi dat este in ordine
crescatoare (de examplu, 1, 4, 6, 6, 7, 9, 9, 20 este in ordine crescatoare).
Dacac este atunci functia intoarce valoarea 1, altfel returneaza valoarea 0.
Sirul dat este un parametru al functiei. Includeti aceasta functie intr-un
program si testati-o.
5. Scrieti un program care citeste un sir de tip int. Puteti presupune ca sirul are
mai putin de 50 de elemente. Programul trebuie sa determine intregii distincti
din sir si numarul lor de aparitii. Se tipareste o lista cu doua coloane. In prima
coloana trebuie sa apara intregii distincti din sir in ordine descrescatoare, si, in
cea de a doua, numarul aparitiilor intregului respectiv in sirul de intregi. De
exemplu, daca sirul este:
-12 3 -12 4 1 1 -12 1 -1 1 2 3 4 2 3 -12
programul trebuie sa tipareasca:
4 2
3 3
2 2
1 4
-1 1
-12 4
9. Scrieti un program care citeste un numar de cel mult 100 de intregi si ii aseaza
intr-un sir in ordine crescatoare. Programul trebuie scris in asa fel incat
numerele se citesc de la tastatura unul cate unul si dupa fiecare citire ele sunt
ordonate.
10. Scrieti o functie care sa determine daca o matrice nxn este simetrica.
11. Un patrat magic este o matrice patrata pentru care suma elementelor pe fiecare
linie, pe fiecare coloana si pe cele doua diagonale este aceeasi. Un exemplu de
patrat magic este urmatorul:
16 9 2 7
6 3 12 13
11 14 5 4
1 8 15 10
Scrieti un program care sa verifice daca o matrice este un patrat magic.
Numarul de linii si coloane se citeste de la tastatura.
12. Pentru un sir de intregi, rotatie la dreapta este operatia care muta toate
elementele sirului o pozitie spre dreapta si ultimul element in prima pozitie.
Scrieti o functie care roteste un sir un numar arbitrar de locuri spre dreapta.
Functia trebuie sa aiba parametrii: sirul care trebuie rotat, lungimea sirului si
un intreg corespunzator numarului de pozitii ce trebuie rotite. Includeti functia
intr-un program si testati-o.
13. In matematica, doi vectori (u1 , u 2 ,..., u n) si (v1 , v2 ,..., vn) sunt ortogonali daca
n
suma ∑ u k v k = 0 . Scrieti o functie care determina daca doi vectori dati sunt
k =1
14. Scrieti un program care cauta un element dat intr-un sir de intregi deja ordonat
crescator.
15. Scrieti un program care gaseste cel mai mic element al unui sir si il
interschimba cu primul element al sirului.
16. Scrieti un program care sorteaza elementele unui sir de intregi dat in ordine
crescatoare.
Bibliografie recomandata: