Sunteți pe pagina 1din 15

MODULUL 5

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", &nota[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");
}

Observatie: In cazul in care numarul de studenti nu este 100, ci sa zicem 50,


programul de mai sus trebuie modificat peste tot unde apare 100. Pentru a evita
aceasta putem folosi o constanta predefinita pentru marimea sirului.
Declararea variabilelor si constantelor va fi
#define NR_STUDENTI 100
int nota[NR_STUDENTI], max, i;
iar prima parte a primelor doua instructiuni for va fi
for(i = 0; i < NR_STUDENTI; i ++)
iar ultimul:
for(i = NR_STUDENTI - 1; i >= 0; i --)
Atunci daca se doreste modificarea numarului de studenti de la 100 la 50 numai
#define NR_STUDENTI 100
se va modifica prin inlocuirea lui 100 cu 50, restul programului ramanand
neschimbat.
Observatie. Nu este permisa urmatoarea secventa de program:
int nr_studenti;
scanf("%d", &nr_studenti);
int nota[nr_studenti];
deoarece dimensiunea unui sir trebuie sa fie o constanta.
Una din cele mai frecvente greseli de programare cand se folosesc siruri este
incercarea de a face referire la un element de index inexistent. In exemplul de mai sus
daca inlocuim, din greseala, ultimul for cu
for(i = 100; i <= 0; i --)
atunci i este initializat cu valoarea 100 si instructiunea printf incearca accesarea
elementului nota[100], element inexistent in sir deoarece elementele sirului sunt
nota[0], nota[1], ... , nota[99]. In acest caz se spune ca indexul (100) este ilegal sau in
afara domeniului. Din pacate compilatorul nu semnalizeaza acesti indecsi ilegali,
programul ruleaza si va genera ceva gresit, bineinteles nu ceea ce se dorea.
Verificarea daca indexul este legal este lasata programatorului.

1.2 Cum sunt stocate sirurile in memorie


Inainte de a discuta despre reprezentarea sirurilor in memorie, sa ne amintim
cum sunt stocate variabilele simple. Memoria calculatorului este o lista de locatii de
memorie numite byte-uri (octeti). Acestor byte-uri li se atribuie numere consecutive
reprezentand adresele lor. Cand o variabila int este stocata (pe 4 octeti de obicei)
atunci 4 locatii de memorie consecutive vor fi alocate acestei variabile. Spunem ca
adresa variabilei este adresa primului octet alocat acelei variabile, adica numarul
asociat primului octet.
v a r i a b i la i n t

...

....
124578

124579

124580

124581

124582

124583

Elementele unui sir sunt stocate in memorie in ordine consecutiva: intai


elementul de index 0, acesta ocupand un numar de octeti corespunzator tipului sirului,
apoi elementul de index 1, si asa mai departe.
De exemplu, sirul urmator va fi memorat dupa cum urmeaza:
int a[4];
a[0]

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).

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;
}
Ea atribuie tuturor elementelor unui sir de intregi valoarea zero.
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


De cele mai multe ori nu se cunoaste dimensiunea unui sir de la inceput si de
fapt am dori sa scriem programe care sa ne permita introducerea numarului de
elemente ale sirului de la tastatura. Urmatoarea secventa de program nu este permisa:
printf("Introduceti numarul de elemente ale sirului");
scanf("%d", &n);
double x[n];
deoarece dimensiunea sirului trebuie sa fie o constanta. Cum putem face totusi ca sa
putem rula un program pentru siruri de dimensiuni variabile? Foarte simplu. Initial
definim dimensiunea sirului suficient de mare pentru a putea rula programul nostru
pentru sirurile dorite. De exemplu daca stim ca o grupa de studenti are intre 16 si 25
de studenti putem defini dimensiunea sirului de 30 sa zicem, sau chiar mai mare, de
100 sau 200 daca ne gandim ca am putea folosi programul pentru toti studentii unei
serii, iar in program ii cerem utilizatorului sa introduca de la tastatura dimensiunea
exacta a sirului care urmeaza sa fie prelucrat.
Exemplu: Programul note.C se va modifica in felul urmator:
note2.C
#include <stdio.h>
#define NR_STUDENTI 200 /* dimensiune suficient de mare a sirului */
main()
{
int nota[NR_STUDENTI], max, i, studenti;
/* se cere introducerea numarului exact al elementelor sirului */
printf ("Introduceti numarul de studenti (nu mai mare decat %d) ", NR_STUDENTI);
scanf("%d", &studenti);
printf("Introduceti notele:");
for(i = 0; i < studenti; i ++)
scanf("%d", &nota[i]);
/* calculeaza cea mai mare nota */
max = 0;
for(i = 0; i < studenti; 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 = studenti - 1; i >= 0; i --)
printf("%d ", nota[i]);
printf("\n");
}

Lectia 3

3.1 Siruri multidimensionale (tabele)


Sirurile multidimensionale sunt siruri cu mai mult de un index. De exemplu,
pozitia cursorului pe ecranul monitorului este data de doua valori, linia si coloana deci
daca am dori sa scriem un program care sa modeleze pozitiile cursorului pe ecran
atunci avem nevoie de un sir cu doua indexuri (similar cu matricile invatate la
matematica).
Declararea unui sir multidimensional se face:
tip nume_sir[dim_1][dim_2] ... [dim_n];
Sirul are dim_1 * dim_2 * ... * dim_n elemente.
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.
matrice[0]:
matrice[1]:
matrice[2]:

matrice[0][0], matrice[0][1]
matrice[1][0], matrice[1][1]
matrice[2][0], matrice[2][1]

Asa se si vizualizeaza un sir bidimensional, prima dimensiune este considerata


numarul de linii iar cea de a doua este numarul de coloane.
Sirurile multidimensional pot fi si ele initializate in momentul declararii:
int m[2][4] = { {7, 8, 9, 10}, {1, 2, 3, 8} };
va initializa matrice m:
m:
7

10

Dupa cum se observa liniile matricii sunt incluse intre acolade.


Este permisa si urmatoarea initializare:
int a[3][2] = {1, 2, 3, 4, 5, 6};
care va atribui elementele din lista in ordinea in care sunt memorate. Deci

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).

3.2 Siruri multidimensionale in functii


Cand o functie are ca parametru un sir multidimensional atunci prima
dimensiune nu se specifica, dar celelalte trebuie precizate intre paranteze patrate.
De exemplu, functia citeste
void citeste(int a[ ][3], int n);
va putea fi apelata pentru orice matrice cu trei coloane, numarul de linii fiind variabil.
void citeste(int a[ ][3], int n)
{
int i, j;
for(i = 0; i < n; i ++)
for(j = 0; j < 3; j ++)
scanf("%lf ", &a[i][j]);

}
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", &note[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;
}
}

void afiseaza(int note[][NR_EXAMENE], double medie_student[], double


medie_examen[])
{
int i, j;
for (i = 0; i < NR_STUDENTI; i++)
{
printf("Notele studentului al %d-lea\n", i+1);
for (j = 0; j < NR_EXAMENE; j++)
printf("%d ", note[i][j]);
printf("Media: %4.2f\n", medie_student[i]);
}
printf("Media fiecarui examen este \n");
for (i = 0; i < NR_EXAMENE; i++)
printf("examen[%d]: %4.2f\n",i+1, medie_examen[i]);
}

EXERCITII SI PROBLEME PROPUSE


1. In secventa de program urmatoare se produce impartirea la zero? Explicati.
int a[10] = {2, -1, 7, 5, 0, -3}, i;
for ( i = 1; i <6; i ++)
if ( a[i+1] > 0 && 1/a[i] < 1) printf( "%d ", a[i]);
2. Ce afiseaza urmatoarea secventa de program daca este citita de la tastatura
valoarea
a) 3
b) 10 ?
int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n, i;
printf( "Enter an integer between 1 and 10 ");
scanf("%d", &n);
for (i=0; i< n; i++)
switch (a[i])
{
case 5: printf("%d\n", ++ i ) ;
case 10: printf("%d\n", i ++);
default: printf("%d\n", i );
}
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.
4. Scrieti o functie numita sterge_repetat care are ca parametru un sir de intregi si
care sterge toate duplicatele (adica un numar nu va apare decat o singura data
in sir). Functia va avea un parametru sirul de intregi si inca unul de tip int care
numarul de elemente al sirului. Cand un caracter este sters, caracterele ramase

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

ortogonali. Includeti functia intr-un program si testati-o.


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:
1.

Daniela Joita, Programare procedurala, Editura Universitatii Titu


Maiorescu, 2008
2. Brian Kernighan si Denis Ritchie, "Limbajul C", Editura TEORA, 1998-2004
3. Clint Hicks, "Utilizare C", Editura TEORA, 1996
4. Manual electronic: Bruce Eckel, Thinking in C

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