Sunteți pe pagina 1din 3

Tehnici avansate de programare 2016-2017

Cap. 4

4.3. Programare generică. Clase şi funcţii generice

Noţiuni generale

 Programarea generică presupune definirea unor modele (şabloane, template-uri)


care ajută la reutilizarea codului.
 Un cod generic descrie o clasă sau funcţii (metode) ale unei clase care lucrează în
mod similar pentru diferite tipuri de date. Practic, se scrie cod fără a lua în
considerare tipul datelor pentru care se va utiliza apoi acel cod.
 În limbajul C++, pentru programare generică există cuvântul cheie template.

Programare generică în C#

În C# se pot defini clase şi funcţii generice prin utilizarea caracterelor < şi >, care permit
scrierea unui tip de date generic, urmând ca atunci când se va utiliza clasa sau funcţia generică,
să se precizeze pentru ce tip de date se utilizează.

Exemplu. Definirea unei clase generice pentru o stivă.

Clasa va conţine un constructor şi metode pentru adăugarea unui element în stivă


(operaţia Push) şi pentru extragerea unui element din stivă (operaţia Pop).

Observaţie. O stivă funcţionează după acelaşi principiu (LIFO), indiferent ce fel de


date conţine (o stivă de numere întregi sau o stivă de caractere sau de orice alt tip de date).

Programarea generică înseamnă definirea clasei fără să se precizeze pentru ce tip de date
lucrează. Concret, se va implementa o stivă de elemente de tip T, lăsând libertatea utilizatorului
să specifice tipul T la instanţierea clasei.
Se consideră că dimensiunea maximă a stivei (numărul de elemente) este limitată la o
valoare MAX_SIZE, ceea ce permite utilizarea unui tablou unidimensional.
class Stiva<T>
{
private T[] st;
private int index = 0;
public const int MAX_SIZE = 100;

public Stiva() //constructor


{
st = new T[MAX_SIZE];
}

public T Pop() //extrage vârful stivei


{
try
{
return st[index--];
}

94
Tehnici avansate de programare 2016-2017
Cap. 4
catch
{
MessageBox.Show("Nu se poate extrage un element. Stiva este vida.");
return default(T);
}

}
public void Push(T item) //adaugă element nou în stivă
{
try
{
st[++index] = item;
}
catch
{
MessageBox.Show("Nu se mai poate adauga un element. Stiva este plina.");
}
}
}

Clasa generică Stiva<T> poate fi acum utilizată pentru stive conţinând date de diverse
tipuri.

Stiva<int> st1 = new Stiva<int>(); // st1 este o stivă de numere întregi


for (int i = 1; i <= 99; i++)
st1.Push(i);
int nr = st1.Pop(); // Ce valoare are variabila nr?
Stiva<string> st2 = new Stiva<string>(); // st2 este o stivă de string-uri
st2.Push("un text");
string s = st2.Pop(); // Ce valoare are variabila s?

Observaţie. În spaţiul de nume System.Collection.Generics sunt definite clase generice pentru a


putea lucra cu diverse structuri de date. De exemplu: List<T>, Stack<T>, Queue<T>,
HashSet<T>, Dictionary<TKey, TValue>, SortedSet<T> etc.

https://msdn.microsoft.com/en-us/library/system.collections.generic(v=vs.110).aspx

Aceste clase au definite metode şi proprietăţi generice (Push( ), Pop( ), Peek( ), Count( ), Max(),
Min(), getEnumerator() etc.

Exemplu:
Stack<int> stiva = new Stack<int>();
for (int i = 1; i <= 99; i++)
stiva.Push(i);
foreach (int i in stiva)
textBox1.AppendText(i.ToString() + " ");
textBox1.AppendText("\r\nLungime stiva:" + stiva.Count().ToString());

95
Tehnici avansate de programare 2016-2017
Cap. 4
Aplicaţie

Să se realizeze o aplicaţie care foloseşte clasa generică Stack (din System.Collection.Generics) pentru a
crea o stivă de numere întregi.

a) Să se introducă în stivă n numere întregi generate aleator între 0 şi 100. Să se afişeze stiva.
b) Să se determine maximul, minimul, suma şi media aritmetică.
c) Să se afişeze vârful stivei (fără a fi şters din stivă).
d) Să se caute în stivă o valoare x, introdusă de utilizator. În cazul în care se găseşte valoarea x, să se
şteargă elementele din stivă până când x devine vârful stivei. Să se afişeze stiva rămasă.
e) Să se obţină o listă cu elementele unice din stivă (eliminarea duplicatelor).

Indicaţie: List<int> d = (st.Distinct<int>()).ToList<int>();

f) Să se afişeze lungimea listei.


g) Să se caute în listă o valoare y introdusă de utilizator, prin metoda căutării binare.
h) Să se sorteze crescător lista.

96