Sunteți pe pagina 1din 7

Teme pentru laborator .

NET
1. Constructia unui tip ce poate fi sortat.
Se considera un tip de data ce va fi memorat ca elemnte intr-un Array sau ArrayList. Pentru a
sorta acest tip de data vrem sa folosim metodele Array.Sort si ArrayList.Sort. Tipul de
data construit trebuie sa poata fi folosit intr-o colectie SortedList.
Indicatie
Metoda 1. Implementarea interfetei IComparable. Consultati MSDN.
Metoda 2. Implementarea interfetei IComparer.
Identificati diferentele dintre interfetele IComparable si IComparer.
2. Constructia unui tip ce suporta cautarea binara.
Se considera un tip ce va fi memorat ca elemente intr-un Array sau ArrayList. Trebuie sa
construim acest tip astfel incat sa suporte cautarea binara, mai exact metodele
Array.BinarySearch si ArrayList.BinarySearch.
Indicatie
Vezi 1.
3. Setare masca de biti
Avem o valoare numerica sau o enumerare ce contine o masca de biti. Trebuie sa definim o
metoda pentru a seta pe 1 sau pe 0 unul sau mai multi biti, de asemenea sa avem posibilitatea de
a schimba valorile din 1 in 0 sau din 0 in 1 pentru unul sau mai multi biti.
Veti identifica toate situatiile posibile si veti scrie codul corespunzator. Implementati scenariile
posibile.
Exemplu
Se considera variabila
byte router =0; // valoare implicita cu semnificatia ca nu exista definita nici o Stare.
ce modeleaza porturile unui router. Consideram ca router-ul are maximum 8 porturi, cu exceptia
portului WAN, la care sunt conectate diverse dispozitive.
Daca bit 0 este setat (are valoarea 1) atunci spunem ca este definita Stare 0, s.a.m.d. (pe portul 1
exista comunicatie activa).
Daca sunt setati bitii pentru Stare i, Stare j atunci spunem ca avem definit Stare ij.
Pentru exemplul nostru consideram i=0 si j = 1,2,3.
Reprezentarea interna este pe 8 biti cu urmatoarea semnificatie:
router Pozitie bit
Stare 0 0
Stare 1 1
Stare 2 2
Stare 3 3
Stare 4 4
Stare 5 5
Stare 6 6
Stare 7 7
(In practica Stare0, Stare 1, ..., Stare 7 pot reprezenta de exemplu conexiunile existente la un
router cu 8 porturi.)
Fiind data variabila router trebuie sa gasim o modalitate de a seta / reseta individual bitii pe 1
sau 0 si de asemenea de a determina daca unul sau mai multi biti au valoarea 1 sau 0.

4. Implementare polimorfism
Trebuie implementata functionalitatea polimorfica pe o multime de clase deja definite. Aceste
clase sunt derivate dintr-o clasa de baza (alta decat Object din BCL).
Adaugati functionalitate polimorfica la o structura.

5. Implementare notificare callback folosind interfete (nu veti folosi interfetele pentru
pattern-ul Observer din BCL).
Veti avea in vedere notificarea unui client sau a mai multor clienti simultan, renuntarea
notificarii pentru anumiti clienti (clientii s-au inregistrat pentru a fi notificati si la un moment dat
vor sa renunte la a primi notificari).


6. Creare cache pentru obiecte
Scenariu
Aplicatia pe care o realizam creaza mai multe obiecte. Operatia de creare a obiectelor este
consumatoare de timp si foloseste o cantitate mare de memorie. Aceste obiecte sunt folosite de
aplicatie pe durata de executie a acesteia. Cerinta este sa crestem performanta aplicatiei,
performanta masurata in timp si in modul de folosire al memoriei cat mai eficient.
Indicatie MSDN
Consultati clasa WeakReference din BCL.

7. Implementare operatie Rollback pentru obiecte
Scenariu
Avem un obiect ce permite ca starea acestuia sa fie modificata. Nu dorim ca aceste modificari sa
devina permanente daca alte modificari (pentru alte obiecte) nu pot fi facute in acelasi timp. Cu
alte cuvinte, o tranzactie contine mai multe actiuni si facem rollback daca nu s-au executat cu
succes toate operatiunile. (Problema este asemanatoare cu operatia Undo dintr-un procesor de
texte.)
Veti avea in vedere doua situatii:
1. Revenirea la starea anterioara modificarii.
2. Posibilitatea revenirii la una din starile modificate anterior, adica momente de timp t-1, t-2,
etc. Se presupune ca stim (putem determina) cate modificari anterioare au fost efectuate asupra
obiectului.
Indicatie
Pattern-ul Memento design.


8. Persistenta unei colectii intre sesiunile unei aplicatii
Scenariu
Avem o colectie cum ar fi ArrayList, List<T>, Hashtable sau Dictionary<T,U> in
care se memoreaza informatii specifice aplicatiei. Se pot folosi aceste informatii pentru a seta
mediul de executie al aplicatiei (ex. marimea ferestrei, plasarea ferestrei, etc.). Dorim sa folosim
aceste informatii astfel incat la relansarea aplicatiei sa avem informatiile existente in aplicatie
inainte de ultimul shutdown.
Exemplu
Aplicatia deseneaza pe ecran o multime de figuri geometrice (cerc, patrat, triunghi, etc.), sau
simuleaza un editor de teste ca Notepad.
La relansarea aplicatiei dorim sa afisam cursorul in aplicatia ce simuleaza Notepad la pozitia in
care a fost inainte de shutdown (se va afisa si textul existent inainte de shutdown). Asemanator
pentru aplicatia ce deseneaza figuri geometrice.
Observatie
Nu e necesar sa construiti aplicatii ca in exemplul de mai sus. Imaginati-va si alte tipuri de
aplicatii.

9. Implenetare functionalitate foreach intr-o clasa
Scenariu
Avem nevoie de o clasa ce contine o lista de obiecte, fiecare dintre aceste obiecte contin la
randul lor o lista de obiecte.
Implementati aceste clase astfel incat sa putem folosi foreach pentru a itera pe aceste obiecte, ca
in exemplul urmator:
foreach (SubGroup sg in group)
{
foreach (Item i in sg)
{
// cod
}
}

Indicatie
Implementati interfata IEnumerable pe clasa (MSDN).

10. Creare enumeratori personalizati
E nevoie de a adauga suport pentru foreach la o clasa.
Iteratorii pe care-i vom implementa trebuie sa dea posibilitatea iterarii de la sfarsit la inceput, de
a "sari" peste anumite elemente, de a itera elementele dintr-un anumit interval.
In pseudo cod am putea scrie:
for i=n to 1 step pas { // cod }
sau - iteratie pe interval : pas = 1 -
for i=startIndex to endIndex { // cod }
sau - iteratie pe interval -
for i=startIndex to endIndex Step pas { // cod }
unde pas indica numarul de elemente se trebuiesc "sarite".
Vedeti indicatia de la tema anterioara.


11. Creare iterator pe un tip generic
Elementele continute intr-un tip generic trebuie sa poata fi enumerate folosind instructiunea
foreach.
Indicatie
Construiti un tip generic ce nu implementeaza IEnumerable<T>.
Construiti un tip generic ce implementeaza IEnumerable<T>.

12. Implementare iteratori ca operatori supraincarcati.
Presupunem ca avem doua sau mai multe colectii. Nu exista elemente duplicate in colectie.
Trebuie sa construim tipul din colectie astfel incat sa putem efectua iteratii (cu foreach) pe:
a. toate colectiile. Se va supraincarca operatorul +.
b. reuniunea colectiilor. Se va supraincarca operatorul |.
c. intersectia colectiilor. Se va supraincarca operatorul &.
Construiti un asemenea tip si evident codul pentru testare.
Exemplu
class Grup<T>
{
private List<T> _lista = new List<T>();
// implementare metode ce vor lucra cu colectia privata _lista

}
Tipul Grup este astfel construit incat urmatoarele linii de cod sunt corecte:
Grup<string> g1 = new Grup<string>(); // adaugare elemente
Grup<string> g2 = new Grup<string>(); // adaugare elemente

Cazul a:
foreach(string s in (g1 + g2)) { // cod }
Cazul b:
foreach(string s in (g1 | g2)) { // cod }
Cazul c:
foreach(string s in (g1 & g2)) { // cod }
13. Eliberare resurse unmanaged
Scenariu
Clasa (tipul) construita intr-o aplicatie referentiaza resurse unmanaged. Eliberarea acestor resurse
unmanaged nu e facuta de Garbage Collector in mod implicit. Trebuie sa construim tipul astfel
incat Garbage Collector sa fie in stare sa elibere aceste resurse.
Exemple de resurse unmanaged: handle la un semaphor, Mutex, conexiune la o baza de date, etc.
Va trebui sa construiti tipuri ce referentiaza resurse unmanaged si acestea sunt eliberate in mod
corect.
Indicatie
Implementati "Dispose design pattern".

.

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