Documente Academic
Documente Profesional
Documente Cultură
Siruri
In acest modul sunt prezentate, pe parcursul a trei lectii, notiunile teoretice de
baza ale declararii unui sir uni sau multidimensional, folosirii unui sir in functii,
precum si o serie de aplicatii care presupun folosirea sirurilor.
La sfarsitul parcurgerii acestui modul studentul va trebui
sa devina familiar cu folosirea sirurilor
sa poata accesa elementelor unui sir
sa inteleaga cum se transfera un sir unei functii
sa stie cum poate fi cautat un element intr-un sir
sa cunoasca cel\putin un algoritm de sortare a unui sir
sa stie sa foloseasca siruri multidimensionale
Organizarea materialului este urmtoarea:
prezentarea notiunilor teoretice de mai sus si a unui numar de exemple de
programe sau secvente de programe care puncteaza caracteristicile importante
ale notiunilor introduse si care faciliteaza o intelegere mai rapida a
materialului inclus.
o serie de exercitii (pe langa cele incluse la sfirsitul fiecarui modul) cu intentia
ca ele sa fie rezolvate in timp ce materialul teoretic este parcurs.
o lista de exercitii si probleme de programare care testeaza cunoasterea
notiunilor introduse de catre student. Mentionam ca aceste probleme nu sunt
ordonate dupa gradul lor de dificultate.
bibliografie recomandata
Recomandam parcurgerea materialului in ordinea sa fireasca. De asemenea, va
recomandam ca atunci cand parcurgeti materialul sa rulati atat exemplele de programe
prezentate cat si scurte programe, scrise de dvs, similare celor date in exemple. Pentru
a invata un limbaj de programare cel mai bine este sa programezi direct in acel limbaj.
Timpul mediu necesar parcurgerii i nsuirii noiunilor teoretice, formrii
deprinderilor practice de rezolvare i dobndirii competenelor anunate este de
aproximativ 6-8 ore de studiu pentru fiecare lecie.
Lectia 1
1.1 Declararea unui sir
Sa presupunem ca dorim sa scriem un program care citeste de la tastatura
rezultatele la examenul de programare ale celor o suta de studenti din anul II si se
doreste sa se afiseze cea mai mare nota, dupa care sa se afiseze toate notele in ordinea
inversa a introducerii lor. Pentru aceasta nu vom folosi 100 de variabile, cate una
pentru fiecare nota, ci vom folosi un sir.
Sirurile sunt folosite pentru procesarea colectiilor de date de acelasi tip.
Colectia de date va fi referita printr-un singur nume, numele sirului, iar fiecare
membru al colectiei va avea un index pentru identificarea sa.
In C, un sir de 100 de variabile de tip int se poate declara in modul urmator:
int nota[100];
in care nota este numele sirului, int este tipul de baza al sirului care este tipul comun
datelor din sir, iar 100 este dimensiunea sirului, adica numarul de elemente ale sirului.
Elementele sirului sunt indexate, intotdeauna indexul incepand cu 0. Cele 100 de
elemente ale sirului nota sunt:
nota[0], nota[1], ... , nota[99].
Indexul este intotdeauna inclus intre paranteze patrate si poate fi orice expresie
intreaga. O variabila indexata poate fi folosita in orice context in care o variabila de
tip int poate fi folosita. Dimensiunea sirului este intotdeauna o constanta de tip int.
Exemplu:
note.C
#include <stdio.h>
main( )
{
int nota[100], max, i;
printf("Introduceti notele:");
for(i = 0; i < 100; i ++)
scanf("%d", ¬a[i]);
/* calculeaza cea mai mare nota*/
max = 0;
for(i = 0;i < 100;i ++)
if(nota[i] > max)
max = nota[i];
printf("Cea mai mare nota este %d.\n", max);
/* scrie notele in ordine inversa */
printf("Notele in ordine inversa:\n");
for(i = 99;i >= 0;i --)
printf("%d ",nota[i]);
printf("\n");
}
...
....
124578
124579
124580
124581
124582
124583
1079
a[1]
a[2]
a[3]
1083
1087
1091
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
dimensiunea tipului sirului indexul elementului
Deci acum intelegem de ce referirea la un element ca a[5] (cu index in afara
domeniului) nu produce o eroare de compilare. Calculatorul va face referirea la
variabila int cu adresa 1079 + 4 * 5 = 1099 si o va modifica sau ii va folosi valoarea.
Sigur ca desi nu obtinem o eroare de compilare, vom obtine o eroare la rulare (eroare
run-time).
Un sir poate fi initializat cand este declarat.
int a[4] = { 3, 5, 8, 10};
Aceasta initializare va stoca valorile din lista in ordinea aparitiei in locatiile de
memorie ale sirului in ordine:
a[0] = 3
a[1] = 5
a[2] = 8
a[3] = 10
Daca se precizeaza mai putine elemente in lista decat dimensiunea sirului atunci sunt
initializate primele elemente, iar celelalte sunt initializate cu 0. De exemplu, definitia
int b[4] = {1, 2};
va genera sirul 1 2 0 0. Daca lista contine mai multe elemente decat dimensiunea
sirului atunci se produce o eroare la compilare. Daca un sir este initializat in timp ce
este declarat atunci putem omite constanta care precizeaza numarul de elemente ale
sirului. De exemplu
double z[ ]={3.5, 4.9, 1};
este echivalenta cu
double z[3 ]={3.5, 4.9, 1};
deci dimensiunea sirului va fi numarul de elemente din lista de initializare.
Observatie: Numai in cazul initializarii putem preciza valorile elementelor
sirului intr-o singura instructiune. Nu este permisa urmatoarea istructiune
z = {2.1, 3.0, 5.0};
De asemenea, chiar daca avem a,b doua siruri de intregi cu acelasi numar de
elemente,
int a[3] = {7, 8, 9}, b[3] = {1, 7, 3};
urmatoarea instructiune nu este permisa:
a = b;
Daca dorim sa copiem elementele sirului b in sirul a atunci trebuie sa folosim un ciclu
for pentru copierea fiecarui element in parte:
int i;
for(i = 0; i < 3; i ++)
a[i] = b[i];
De asemenea, nu putem compara doua siruri decat daca le vom compara element cu
element. if(a == b) nu este permisa si trebuie sa putem folosi un ciclu pentru aceasta.
int i;
for(i = 0;i < 3; i ++)
if(a[i] != b[i])
break;
if (i < 3)
puts("a nu este egal cu b");
else
puts("a este egal cu b");
sau
int i = 0;
while (i < 3 && (a[i] == b[i]))
i ++;
if (i<3)
puts ("a nu este egal cu b");
else
puts ("a este egal cu b");
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).
Lectia 3
matrice[0][0], matrice[0][1]
matrice[1][0], matrice[1][1]
matrice[2][0], matrice[2][1]
10
a:
1
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.
Exercitiu: Ce se intampla daca se declara:
int x[3][3]={{1}, {4,5}, {7,8,9}};
int y[2][3]={{0,1}}; ?
Pentru prelucrarea unui sir multidimensional se folosesc de obicei instructiuni
for imbricate. De exemplu, pentru introducerea elementelor unei matrici a:
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:
for(j = 0; j < 4; j ++)
for(i = 0;i < 3; i ++)
scanf("% f ", &a[i][j]);
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).
}
iar functia care apeleaza functia citeste este:
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 */
}
Exemplu: Prezentam un program care foloseste un sir bidimensional pentru
reprezentarea si afisarea notelor studentilor unei grupe. Grupa are 25 de studenti, iar
fiecare student are 3 note la cele trei examene. Primul index al sirului reprezinta
studentul iar al doilea nota. Programul permite introducerea notelor de la tastatura si
afiseaza media generala a fiecarui student, media clasei la fiecare examen si media
finala a clasei.
medie.C
/* Prezentam un program care foloseste un sir bidimensional pentru reprezentarea
si afisarea notelor studentilor unei grupe. Grupa are 25 de studenti, iar fiecare
student are 3 note la cele trei examene. Primul index al sirului reprezinta
studentul iar al doilea nota. Programul permite introducerea notelor de la tastatura
si afiseaza media generala a fiecarui student, media clasei la fiecare examen
*/
#include <stdio.h>
#define NR_STUDENTI 25
#define NR_EXAMENE 3
void citeste(int note[][NR_EXAMENE]);
void calculeaza_medie_student(int note[][NR_EXAMENE],double
medie_student[]);
void calculeaza_medie_examen(int note[][NR_EXAMENE], double
medie_examen[]);
void afiseaza(int note[][NR_EXAMENE], double medie_student[], double
medie_examen[]);
main()
{
int note[NR_STUDENTI][NR_EXAMENE];
double medie_student[NR_STUDENTI];
double medie_examen[NR_EXAMENE];
citeste(note);
calculeaza_medie_student(note, medie_student);
calculeaza_medie_examen(note, medie_examen);
afiseaza(note, medie_student, medie_examen);
}
void citeste(int note[][NR_EXAMENE])
{
int i, j;
for (i = 0; i < NR_STUDENTI; i++)
{
printf("Introduceti notele studentului al %d-lea\n", i+1);
for (j = 0; j < NR_EXAMENE; j++)
scanf("%d", ¬e[i][j]);
}
}
void calculeaza_medie_student(int note[][NR_EXAMENE],double
medie_student[])
{
int i, j;
for (i = 0; i < NR_STUDENTI; i++)
{
medie_student[i] = 0;
for (j = 0; j < NR_EXAMENE; j++)
medie_student[i] += note[i][j];
medie_student[i] /= (double) NR_EXAMENE;
}
}
void calculeaza_medie_examen(int note[][NR_EXAMENE], double
medie_examen[])
{
int i, j;
for (i = 0; i < NR_EXAMENE; i++)
{
medie_examen[i] = 0;
for (j = 0; j < NR_STUDENTI; j++)
medie_examen[i] += note[j][i];
medie_examen[i] /= (double) NR_STUDENTI;
}
}
sunt translatate spre stanga pentru a umple golul creat. Aceasta va crea o
pozitie libera la sfarsitul sirului, si deci o modificare a numarului de elemente
ale sirului. Functia returneaza noua dimensiune a sirului. 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
6. Scrieti un program care sa permita la doi utilizatori sa joace "X si 0".
Programul trebuie sa ceara alternativ celor doi utilizatori (jucatorul X si
jucatorul 0) sa mute. Programul trebuie sa descrie pozitia celor doi jucatori in
felul urmator: la inceput
1 2 3
4 5 6
7 8 9
la fiecare mutare jucatorul isi alege pozitia unde vrea sa mute si programul
trebuie sa schimbe tabla de joc in mod corespunzator. De exemplu, dupa patru
mutari (doua de fiecare jucator) tabla de joc poate arata in felul urmator:
0 X 3
4 0 6
7 8 X
Programul trebuie sa se opreasca atunci cand unul din jucatori castiga sau cand
toate pozitiile de pe tabla de joc au fost ocupate. Programul trebuie sa afiseze
ce jucator a castigat sau daca a fost egalitate.
7. Scrieti un program care sa plaseze pasageri intr-un avion in ordinea venirii si a
preferintelor. Cand un nou pasager cere un bilet, programul trebuie sa-i arate
ce locuri sunt libere si sa-l intrebe ce loc ar prefera. Dupa ce pasagerul a ales
un loc programul trebuie sa marcheze locul respectiv ca fiind ocupat. Daca
din greseala pasagerul a ales un loc care era deja ocupat, programul trebuie
sa-l informeze si sa-i ceara sa aleaga alt loc. Presupuneti ca este vorba de un
avion mic si ca locurile sunt numerotate in felul urmator:
1 A B C D
2 A B C D
3 A B C D
4 A B C D
5 A B C D
6 A B C D
7 A B C D
si ca un loc ocupat este marcat cu un X. Deci dupa ocuparea locurilor 1B, 2C
si 7D programul trebuie sa afiseze:
1 A X C D
2 A B X D
3 A B C D
4 A B C D
5 A B C D
6 A B C D
7 A B C X
Programul se opreste cand toate locurile au fost ocupate sau cand primeste un
mesaj de la utilizator.
8. Scrieti un program care la inceput citeste de la tastatura un numar intreg k.
Apoi citeste de la tastatura un numar de maxim 500 de intregi pe care ii pune
intr-un sir in ordinea in care au fost introdusi. Intregii din sir trebuie aranjati in
doua grupuri. Grupul din stanga trebuie sa contina toate elementele sirului care
sunt <= k, iar cel din dreapta toate elementele sirului care sunt >k. (Numarul
de elemente din fiecare grup depinde bineinteles de k).
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
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:
1.