Sunteți pe pagina 1din 51

Programare I

Informatica Economica
Anul II
FEAA
Octavian Dospinescu - FEAA UAIC

Structuri de date si structuri de


control
Date si tipuri de date
Structuri de date simple si complexe (vectori,
tablouri n-dimensionale, liste, cozi, stive etc)
Constante
Variabile si lucrul cu variabile
Structuri de control elementare
Implementari uzuale pentru structuri de date si
structuri de control (parcurgeri si abordari
specifice)
Octavian Dospinescu - FEAA UAIC

Concepte de baza in programarea


calculatoarelor

Tipuri de date
Variabile
Constante
Operanzi si operatori
Structuri de control

Octavian Dospinescu - FEAA UAIC

Concepte de baza in programarea


calculatoarelor

Tipuri de date
Variabile
Constante
Operanzi si operatori
Structuri de control

Octavian Dospinescu - FEAA UAIC

Structuri de control
Un program scris n C# se execut de ctre
compilator urmnd o anumit traiectorie
numit flux de execuie. Modul n care se
realizeaz acest flux este asigurat prin intermediul
structurilor de control care pot fi mprite n mai
multe categorii:

structuri alternative;
structuri repetitive;
structuri de salt;
structuri de gestionare a excepiilor.
Octavian Dospinescu - FEAA UAIC

Structuri alternative (decizionale)


Un program scris n C# se execut de ctre
compilator urmnd o anumit traiectorie
numit flux de execuie. Modul n care se
realizeaz acest flux este asigurat prin intermediul
structurilor de control care pot fi mprite n mai
multe categorii:

structuri alternative;
structuri repetitive;
structuri de salt;
structuri de gestionare a excepiilor.
Octavian Dospinescu - FEAA UAIC

Structura if-else
Structura de control decizional de tip if-else se
bazeaz pe verificarea unei condiii logice.

n cazul n care aceast condiie are valoarea de


adevr true, atunci se execut ramura if
aferent, iar n caz contrar se execut ramura
else.

Octavian Dospinescu - FEAA UAIC

Structura if-else
if (conditie_logica)
<secventa_pt_true>;
else
<secventa_pt_false>;

Octavian Dospinescu - FEAA UAIC

Structura if-else
int notaExamen;
string stare;
notaExamen = 7;
if (notaExamen >= 5)
stare = "promovat";
else
stare = "restantier";
MessageBox.Show(stare);

Octavian Dospinescu - FEAA UAIC

Structura switch
Structura switch este o structur de control care
ne permite s selectm o seciune care se va
executa dintr-o list de candidaturi.
Fiecare seciune cuprinde una sau mai multe
etichete de selecie i o list de instruciuni
de executat.

Octavian Dospinescu - FEAA UAIC

Structura switch
switch(<variabila>)
{
case <valoare1>:
<secventa1>;
break;
case <valoare2>:
<secventa2>;
break;
... ... ...
case <valoare_n>:
<secventa_n>;
break;
default:
<secventa_default>;
break;
}

Octavian Dospinescu - FEAA UAIC

Structura switch - exemplu de problema


Un salariat poate primi o deducere fiscal din
salariu n funcie de numrul de copii pe care
i are n ntreinere;
Dac nu are nici un copil, deducerea fiscal
este 0%;
Dac are un copil, deducerea fiscal este 5%;
Dac are 2 copii, deducerea fiscal este 10%;
Dac are 3 copii sau mai muli, atunci
deducerea fiscal este 15%.
Octavian Dospinescu - FEAA UAIC

Structura switch - implementare


int numarCopii;
double deducere;
numarCopii = 2;
switch (numarCopii)
{
case 0:
deducere = 0.00;
break;
case 1:
deducere = 0.05;
break;
case 2:
deducere = 0.10;
break;
default:
deducere = 0.15;
break;
}
MessageBox.Show("Deducerea=" + deducere);

Octavian Dospinescu - FEAA UAIC

Structuri repetitive
Structurile repetitive se folosesc pentru a realiza
iteraii (aciuni care se desfoar n mod repetat)
i se folosesc n realizarea diverselor calcule
precum i n parcurgerea unor structuri de date
de tip vector, matrice, colecie etc.
Aceste structuri repetitive pot fi:
condiionate anterior primului ciclu de execuie
(while);
condiionate posterior primului ciclu de execuie
(do-while);
cu numr predefinit de pai (for).
Octavian Dospinescu - FEAA UAIC

Structura while
Structura repetitiv while este condiionat
anterior i execut o anumit secven att timp
ct este ndeplinit o condiiei logic. Forma
general poate fi rezumat astfel:

while (conditie_logica)
{
<secventa_iterativa>
}
Octavian Dospinescu - FEAA UAIC

Structura while - implementare


Ne propunem s obinem n mod iterativ o secven n care s
se afieze numerele de la 1 la 10 mpreun cu ptratele lor. O
secven valabil este cea din exemplul de mai jos.
int i = 1;
int patrat;
while (i <= 10)
{
patrat = i * i;
MessageBox.Show("Patratul numarului " + i + "
este " + patrat);
i++;
}

Octavian Dospinescu - FEAA UAIC

Structura do-while
Structura repetitiv do-while este condiionat
posterior i execut o anumit secven att timp
ct este ndeplinit o condiiei logic. Forma
general poate fi rezumat astfel:
do
{
<secventa_iterativa>
}
while (conditie_logica);
Octavian Dospinescu - FEAA UAIC

Structura do-while - implementare


Relund exemplul precedent, implementm calculul ptratelor
primelor 10 numere naturale folosind o structur do-while.

int i=1;
int patrat;
do
{
patrat = i * i;
MessageBox.Show("Patratul numarului " + i + "
este " + patrat);
i = i + 1;
} while (i <= 10);

Octavian Dospinescu - FEAA UAIC

Structura for

Structura repetitiv for este folosit n toate


limbajele de programare moderne i se
folosete de regul n cazul iteraiilor cu un
numr predefinit de pai care presupun
incrementarea unei variabile care joac rol de
contor.

Octavian Dospinescu - FEAA UAIC

Structura for
Forma general a structurii se prezint astfel:

for (contor=valoare_initiala; conditie_de_rulare; operatiune_incrementare_contor)


{
<secventa_repetitiva>
}

Simplificat, structura poate fi schematizat prin precizarea elementelor cheie:


for ( ; ; )
{
... ... ...
}

Octavian Dospinescu - FEAA UAIC

Structura for
Pentru nceput, vom realiza afiarea primelor 10 numere naturale:
int i;
for (i = 1; i <= 10; i++)
{
MessageBox.Show("Numarul " + i);
}

Pentru fiecare iteraie, structura for execut secvena dup cum urmeaz:

mai nti se evalueaz valoare lui i;


dac valoarea lui i este mai mic sau egal cu 10, condiia de rulare este true i se
execut instruciunea de afiare;
i este incrementat cu o unitate dup fiecare afiare (i++);
atunci cnd i depete valoarea 10, condiia devine false i controlul este predat n
afara buclei.
Octavian Dospinescu - FEAA UAIC

Structura de date (ceva mai) complexe


Structuri de tip Array:
Vectori (matrici uni-dimensionale);
matrici multi-dimensionale;
vectori de vectori.

Octavian Dospinescu - FEAA UAIC

Agenda generala
Vectori, matrici, tablouri
Parcurgerea tablourilor uni si
(bi)(multi)dimensionale operatii pe
linii/coloane/matrici
Max/Min dintr-un sir de valori
Cautarea secventiala intr-o multime de valori
Intrebari si raspunsuri

Octavian Dospinescu - FEAA UAIC

Vectori, matrici, tablouri si alte


picturi
Premise pentru utilizarea acestor concepte:
Date de acelasi tip
Numar mare/foarte mare de valori
Necesitatea de a a accesa in mod facil valorile
(atat la scriere cat si la citire)
Necesitatea de a sorta ulterior valorile

Octavian Dospinescu - FEAA UAIC

Agenda generala
Vectori, matrici, tablouri
Parcurgerea tablourilor uni si
(bi)(multi)dimensionale operatii pe
linii/coloane/matrici
Max/Min dintr-un sir de valori
Cautarea secventiala intr-o multime de valori
Intrebari si raspunsuri

Octavian Dospinescu - FEAA UAIC

Vectori
Un vector reprezinta o structura unidimensionala de tip linie, in care sunt
memorate mai multe valori de acelasi tip, una
dupa alta.
8

45

32

11

87

103

28

12

10

Indici de referinta
Octavian Dospinescu - FEAA UAIC

Vectori implementari reale


Declarare
//declararea unui tablou (vector) unidimensional 0 - n-1
decimal[] noteStudenti;
noteStudenti = new decimal[10];
noteStudenti[0] = 7;
noteStudenti[1] = 9;
noteStudenti[2] = 9;
noteStudenti[3] = 9;
noteStudenti[4] = 10;
noteStudenti[5] = 8;
noteStudenti[6] = 5;
noteStudenti[7] = 6;
noteStudenti[8] = 6;
noteStudenti[9] = 9;
//noteStudenti[10] = 8; aici ne aflam deja in afara vectorului "legal"

Octavian Dospinescu - FEAA UAIC

Vectori exemplu
{
string[] studenti;
studenti = new string[5];
studenti[0] = "Ionescu";
studenti[1] = "Popescu";
studenti[2] = "Vasilescu";
studenti[3] = "Irimescu";
studenti[4] = "Nicolaescu";
for (int i = 0; i < 5; i++)
Console.WriteLine("Studentul " + (i + 1) + " se numeste " + studenti[i]);
}

Rezultatul apare la consol n forma urmtoare:


Studentul 1 se numeste Ionescu
Studentul 2 se numeste Popescu
Studentul 3 se numeste Vasilescu
Studentul 4 se numeste Irimescu
Studentul 5 se numeste Nicolaescu

Octavian Dospinescu - FEAA UAIC

Aspecte importante despre vectori


Lungimea (marimea) vectorului = numarul de
elemente care exista in vector (length)
Accesarea unui element din cadrul vectorului
se realizeaza prin specificarea indicelui
(vector*0+, vector*1+, , vector*15+, )
Primul element din vector are indicele 0
(zero), iar ultimul are indicele length-1

Octavian Dospinescu - FEAA UAIC

Parcurgerea integrala a unui vector


string[] studenti;
studenti = new string[5];
studenti[0] = "Ionescu";
studenti[1] = "Popescu";
studenti[2] = "Vasilescu";
studenti[3] = "Irimescu";
studenti[4] = "Nicolaescu";

for (int i=0;i<studenti.Length;i++)


Console.WriteLine("Studentul " + (i + 1) + " se numeste " + studenti[i]);
sau
foreach (string nume in studenti)
Console.WriteLine(nume);

Octavian Dospinescu - FEAA UAIC

Vectori implementari reale


Parcurgere vector
//parcurgerea secventiala a vectorului cu structura for()
decimal notaCurenta;
decimal suma;
suma = 0;
for (int i = 0; i < noteStudenti.Length; i++)
{
notaCurenta = noteStudenti[i]; //obtinerea unei note in mod
explicit, prin specificarea indexului din vector
suma = suma + notaCurenta;
}
//la final, in variabila "suma" avem suma tuturor notelor studentilor
double mediaAritmetica;
mediaAritmetica =Convert.ToDouble( suma / noteStudenti.Length);

Octavian Dospinescu - FEAA UAIC

Agenda generala
Vectori, matrici, tablouri
Parcurgerea tablourilor uni si
(bi)(multi)dimensionale operatii pe
linii/coloane/matrici
Max/Min dintr-un sir de valori
Cautarea secventiala intr-o multime de valori
Intrebari si raspunsuri

Octavian Dospinescu - FEAA UAIC

Tablouri
La modul general, un tablou reprezinta o
structura n-dimensionala de date.
Uzual se folosesc tablouri uni sau bidimensionale, insa sunt si cazuri de 3,4,ndimensional. Se foloseste uneori chiar
conceptul de cub multidimensional.
Tablourile bi-dimensionale se mai numesc
matrici.
Octavian Dospinescu - FEAA UAIC

Tablouri bi-dimensionale
Modeleaza de fapt conceptul de matrice
0

Ionel

Vasile

Maria

Elena

Costel

Georgiana

Bogdan

Ionut

Octav

Mircea

Adrian

Liviu

Tablou[2,0]
Octavian Dospinescu - FEAA UAIC

Particularitati
Datele memorate in celule trebuie sa fie de
tipul declarat la initializarea tabloului
Pentru a afla marimea fiecarei dimensiuni a
tabloului, se foloseste metoda .GetLength(i)
Declararea unei matrici se face astfel:
double[,] matrice;
matrice = new double[2,5];
//matricea are 2 linii si 5 coloane
Octavian Dospinescu - FEAA UAIC

Exemplu practic
Sa se calculeze media ponderata a notelor
unui student, in conditiile in care fiecare nota
poate avea o pondere diferita
Metoda de rezolvare: memorarea notelor si a
ponderilor in aceeasi structura de date
0

.GetLength(1)

Nota1

Nota2

Nota3

Nota n

Pondere1

Pondere2

Pondere3

Pondere n

Octavian Dospinescu - FEAA UAIC

Exemplu practic - implementare


private void btnTablouriBidimensionale_Click(object sender, EventArgs e)
{
double[,] noteStudent; //declararea unui "tablou" cu 2 dimensiuni; fiecare nota are o anumita pondere
noteStudent=new double[2,5]; //tabloul de date are 2 linii si 5 coloane (adica 5 note cu ponderile
aferente)
noteStudent[0, 0] = 9; noteStudent[1, 0] = 0.2; //prima nota (9) are ponderea 0.2
noteStudent[0, 1] = 7; noteStudent[1, 1] = 0.1;
noteStudent[0, 2] = 10; noteStudent[1, 2] = 0.1;
noteStudent[0, 3] = 8; noteStudent[1, 3] = 0.5;
noteStudent[0, 4] = 6; noteStudent[1, 4] = 0.1;
//calculul mediei ponderate
double mediaPonderata = 0;
for (int i = 0; i < noteStudent.GetLength(1); i++) { //parcurg toate notele studentului
mediaPonderata= mediaPonderata + noteStudent[0,i] * noteStudent[1,i]; //ponderez nota cu
ponderea
}
//afisez media ponderata
MessageBox.Show("Media ponderata este " + mediaPonderata.ToString());
Octavian Dospinescu - FEAA UAIC
}

Un alt exemplu practic


Ore lucrate si salarii (pe prima linie se
memoreaza numarul de ore lucrate, iar pe a
doua linie avem salariile brute obtinute).

Dimensiunea 1

Dimensiunea 0

Octavian Dospinescu - FEAA UAIC

Accesare date din matrice versiunea


incepatoare
Dimensiunea 1

Dimensiunea 0

{
int[,] munca;
munca = new int[2, 5];
munca[0, 0] = 21; munca[0, 1] = 10; munca[0, 2] = 15; munca[0, 3] = 14; munca[0, 4] = 15;
munca[1, 0] = 2000; munca[1, 1] = 1040; munca[1, 2] = 1300; munca[1, 3] = 1100; munca[1, 4] = 1900;
int linie;
int coloana;
for(linie=0;linie<2;linie++)
{
for (coloana = 0; coloana < 5; coloana++)
{
Console.Write(munca[linie, coloana].ToString() + " ");
}
Console.WriteLine();
}
}

Octavian Dospinescu - FEAA UAIC

Accesare date din matrice versiunea


profesionista
Dimensiunea 1

Dimensiunea 0

{
int[,] munca;
munca = new int[2, 5];
munca[0, 0] = 21; munca[0, 1] = 10; munca[0, 2] = 15; munca[0, 3] = 14; munca[0, 4] = 15;
munca[1, 0] = 2000; munca[1, 1] = 1040; munca[1, 2] = 1300; munca[1, 3] = 1100; munca[1, 4] = 1900;
int linie;
int coloana;
for(linie=0;linie<munca.GetLength(0);linie++)
{
for (coloana = 0; coloana < munca.GetLength(1); coloana++)
{
Console.Write(munca[linie, coloana].ToString() + " ");
}
Console.WriteLine();
}
}

Octavian Dospinescu - FEAA UAIC

Vectori de vectori (jagged arrays)


Matrici cu numar variabil de elemente pe
linii
Prima coloan

A doua coloan

... ...

Prima linie

A doua linie

A treia linie

Octavian Dospinescu - FEAA UAIC

... ...

A cincea coloan

Vectori de vectori (jagged arrays)


Definire, populare, citire, parcurgere nu va speriati! Este chiar simplu!
{

//declarare jagged array


int[][] valori;
//specificare marime pentru prima dimensiune
valori = new int[3][];
//specificare marime pentru fiecare linie in parte
valori[0] = new int[2];
valori[1] = new int[4];
valori[2] = new int[5];
//atribuire de valori
valori[0][0] = 5;
valori[0][1]=7;
valori[1][0] = 15;
//...pana la...
valori[1][3] = 20;
//...
valori[2][0] = 4;
//...pana la...
valori[2][4] = 19;
//parcurgere vector variabil
for (int i = 0; i < valori.GetLength(0); i++)
for (int j = 0; j < valori[i].Length;j++ )
Console.WriteLine(valori[i][j].ToString());
}

Octavian Dospinescu - FEAA UAIC

Erori frecvente in lucrul cu vectori/matrici


Depasirea indexului maxim din vector

Octavian Dospinescu - FEAA UAIC

Minim/Maxim dintr-o multime de


valori
Scop: aflarea valorii minime dintr-un sir de valori
Metoda de rezolvare:
Se porneste de la ipoteza ca primul element din
multime este cel minim
Se parcurge restul multimii si se compara cu minimul
presupus. Daca un element este mai mic decat
minimul presupus, atunci acel element devine
minimul presupus.
La finalul parcurgerii, minimul local este si minimul
multimii
Octavian Dospinescu - FEAA UAIC

Minimul dintr-un vector implementare


private void btnMinimVector_Click(object sender, EventArgs e)
{
int[] salarii;
salarii = new int[]{100,200,70,300,140,50,80,90,45,135,230};
//calcularea minimului din vector
//consideram ca prima valoare este minimul si apoi comparam cu urmatoarele
int minim;
minim = salarii[0];
for (int i = 1; i < salarii.Length; i++)
{
if (salarii[i] < minim)
//noul minim este salariul "curent" din vector
minim = salarii[i];
}
//afisez minimul din vector
MessageBox.Show("Valoarea cea mai mica din vector este " + minim.ToString());
}

Octavian Dospinescu - FEAA UAIC

Tema practica

Implementati secventa de cod necesara


pentru a afla valoarea maxima dintr-un vector
Timp de lucru: 7 minute

Octavian Dospinescu - FEAA UAIC

Observatii (valabile pentru C#)

Tablourile pot fi redimensionate in C#, folosind clasa Array, metoda Resize()

Exemplu:
int[] lista;
lista = new int[5];
lista[0]=1;
lista[1]=2;
lista[2]=3;
lista[3]=4;
lista[4]=5;
for (int i = 0; i < lista.Length; i++)
MessageBox.Show(lista[i].ToString());
Array.Resize(ref lista, 7);
lista[6] = 12;
for (int i = 0; i < lista.Length; i++)
MessageBox.Show(lista[i].ToString());

Octavian Dospinescu - FEAA UAIC

Cautare secventiala intr-o multime de


valori

Scop: identificarea pozitiei la care se afla o anumita valoare in multimea de valori

private void btnCautareSimpla_Click(object sender, EventArgs e)


{
int[] preturi;
preturi = new int[8];
preturi[0] = 8; preturi[1] = 7; preturi[2] = 103;
preturi[3] = 25; preturi[4] = 40; preturi[5] = 15;
preturi[6] = 90; preturi[7] = 85;
//la ce pozitie in lista se afla pretul cu valoarea 15?
int valoareCautata = 15;
int pozitie = -1; //initial, nu am nicio pozitie gasita
for (int i = 0; i < preturi.Length; i++)
{
if (valoareCautata == preturi[i])
pozitie = i;
}
//verific daca a fost gasita valoarea in lista
if (pozitie == -1)
MessageBox.Show("Valoarea cautata nu a fost gasita in lista");
else
MessageBox.Show("Pretul cautat se afla pe pozitia " + pozitie);
}
Octavian Dospinescu - FEAA UAIC

Cautare secventiala (ceva mai)


elaborata
Ipoteza: este posibil ca valoarea cautata sa se afle
de mai multe ori in multime.
Scop: sa se memoreze si sa se afiseze toate
pozitiile in care se afla valoarea cautata.
Indicatie/sugestie: pentru memorarea pozitiilor in
care se gaseste valoarea cautata, se foloseste un
vector care va fi redimensionat (Array.Resize())
la fiecare noua aparitie a valorii in multime. La
final se afiseaza valorile din acest vector care a
memorat pozitiile.
Octavian Dospinescu - FEAA UAIC

Tema de realizat in laborator


SCOP: calculul diversilor indicatori la nivel de tablou
bidimensional (matrice)
totalul pe fiecare linie, totalul pe fiecare coloana, media
aritmetica pe fiecare linie
media aritmetica pe fiecare coloana, maximul pe fiecare
linie, maximul pe fiecare coloana
minimul pe fiecare coloana, minimul pe fiecare linie
maximul la nivelul intregului tablou
minimul la nivelul intregului tablou
toate pozitiile din tablou in care se afla o valoare cautata
PREMIU: aplauze frenetice

Octavian Dospinescu - FEAA UAIC

C# - operatii cu variabile
Matematici avansate
Pentru operaii matematice mai complexe, C# ne ofer clasa Math.

Cteva metode ale clasei Math:


int valoare;
valoare = Math.Abs(-9) //Valoarea absolut. Rezultat: 9
valoare = Math.Ceiling(9.44) //Rotunjire n sus. Rezultat: 10
valoare = Math.Floor(9.44) //Rotunjire n jos. Rezultat: 9
valoare = Math.E //Rezultat: 2,71...
valoare = Math.PI //Rezultat: 3,14...
valoare = Math.Exp(2) //e la puterea a 2-a. Rezultat 7,38...
valoare = Math.Log(3,2) //Logaritm de 3 n baza 2. Rezultat: 1,58...
valoare = Math.Log10(4) //Logaritm n baza 10. Rezultat: 0,60...
valoare = Math.Max(4,5) //Maximul dintre 2 numere. Rezultat: 5
valoare = Math.Min(4,5) //Minimul dintre 2 numere. Rezultat: 4
valoare = Math.Pow(4,2) //4 la puterea a 2-a. Rezultat: 16
valoare = Math.Round(4.7853,2) //Rotunjirea unui numr cu
virgul la 2 zecimale. Rezultat: 4.78
valoare = Math.Sqrt(4) //Radical din 4. Rezultat: 2
Octavian Dospinescu - FEAA UAIC

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