Sunteți pe pagina 1din 11

Laborator 1

n acest laborator vom realiza un calculator care s permit simplificarea fraciilor raionale precum si alte
operatii.

1. Deschidem Visual Studio Express 2012 for Windows Desktop.


2. Se creaz un proiect nou din meniul File>New Project si apoi se selecteaz din dreapta ferestrei Visual
C# >WPF Application. Se introduce numele proiectului: Fraction
3. Pentru inceput, vom crea logica aplicaiei ntr-o clas numit FractionObject. Pentru a crea o clas
nou, selectm din meniul Project > Add Class. Dm numele clasei: FractionObject.cs
4. Adugm in clas 2 variabile private: mNumerator i mDenominator
FractionObject.cs
class FractionObject
{
private int mNumerator;
private int mDenominator;
}

5. Pentru aceste variabile private creem proprietile de tip read/write (cu get si set) Numerator i
Denominator. In clasa FractionObject adaugam urmatorul cod:
public int Numerator
{
get //comportament la citirea proprietatii
{
return mNumerator;
}
set //comportament la scrierea proprietatii
{
mNumerator = value;
}
}
public int Denominator
{
get
{
return mDenominator;
}
set
{
mDenominator = value;
}
}

6. Adugm metoda Reduce in clasa FractionObject care simplific fraciile la forma lor ireductibil.
private void Reduce()
{
int i;
for (i = Denominator; i > 1; i--)
{
if (Numerator % i == 0 && Denominator % i == 0)
{
Numerator = Numerator / i;
Denominator = Denominator / i;
break;
}
}
}

7. Creem un constructor pentru clasa FractionObject care s iniializeze proprietile Numerator si


Denominator la valorile primite ca i argumente. In cadrul constructorului vom apela metoda Reduce
pentru a realiza simplificarea fraciilor.
public FractionObject(int aNumerator, int aDenominator)
{
mNumerator = aNumerator;
mDenominator = aDenominator;
Reduce();
}

8. Adugm metodele ToString i ToDouble la clasa FractionObject pentru a converti un obiect din clasa
Fraction ctre String sau Double. Observm c implicit metoda ToString este motenit din superclasa
comun System.Object, deci va trebui s utilizm cuvntul cheie override pentru a asigura
suprancrcarea corect a acestei metode.
public double ToDouble()
{
return (double)Numerator / (double)Denominator;
}
public override string ToString()
{
return Numerator.ToString() + "/" + Denominator.ToString();
}

9. Pentru testarea clasei FractionObject vom crea o interfa grafic. Pentru nceput, selectm forma
MainWindow.xaml in designer, apoi din fereastra Properties schimbm numele formei la frmMain
(schimbarea proprietatii Name).

Observam ca un formular este format din doua fisiere: Design (specificat in limbaj XML in fisierul XAML)
si Cod (fisierul cu extensia .cs) . Avem de asemenea o suprafata de Design pentru interfata grafica si o
suprafata de cod xaml care descrie interfata grafica.

Atentie la x:Class=Fraction.MainWindow se face binding-ul interfetei grafice cu clasa in care se va


scrie codul aferent evenimentelor de pe formular precum si logica de functionare a formularului.
In stanga avem un Toolbox cu diferite controale grafice ce pot fi adaugate pe formular pentru crearea
interfetei grafice cu drag and drop. Fiecare control de pe un formular are proprietati specifice ce se vor
configura din fereastra Properties deschisa in dreapta la selectarea elementului.

10. Adugm din toolbox pe form urmtoarele componente:


Control grafic
Label
Label
Label
Label
Label
Label
TextBox
TextBox
Button

Proprietati setate
Name: lblNumerator
Content: Numerator:
Name: lblDenominator
Content: Denominator:
Name: lblFractionAsString
Content: Fraction as String
Name: lblAsString
Content: <blank>
Name: lblFractionAsDouble
Content: Fraction As Double
Name: lblAsDouble
Content: <blank>
Name: txtNumerator
Text: <blank>
Name: txtDenominator
Text: <blank>
Name: btnSimplify
Content: Simplify and Display Fraction

In final interfata grafica ar trebui sa arate ca si mai jos:

1 -> lblAsString iar 2 ->lblAsDouble, 1 si 2 sunt label-uri

11. In Designer selectam butonul Simplify and Display Fraction (prin click pe el) iar in fereastra
Properties facem click pe butonul Events:

Butonul cu iconita Cheii ne va readuce in modul de setare a proprietatilor pentru elementul selectat.
Butonul cu iconita Fulger ne va duce in modul de setare a Evenimentelor pentru elementul selectat.
Se va deschide o lista de evenimente suportate de catre elementul selectat. In continuare pentru
evenimentul Click vom seta si un event handler (o actiune asociata evenimentului): btnSimplify_Click
(scriem efectiv in casuta asociata evenimentului Click):

Dupa ce am introdus denumirea event-handler-ului dam Enter si ni se va genera automat in fiierul de


cod al formularului o metoda in care sa specificam logica de programare pentru evenimentul Click
actiunea evenimentului Click:
Introducem urmtorul cod in metoda btnSimplify_Click din fisierul de back-code al formularului:
MainWindow.xaml.cs
private void btnSimplify_Click(object sender, RoutedEventArgs e)
{
try
{
int numerator = int.Parse(txtNumerator.Text);
int denominator = int.Parse(txtDenominator.Text);
FractionObject aFraction = new FractionObject(numerator, denominator);
lblAsString.Content = aFraction.ToString();
lblAsDouble.Content = (aFraction.ToDouble()).ToString();
}
catch
{
MessageBox.Show("Please check the values and try again");
}
}

Pentru a testa ce am implementat pana acum, putem da Start sau Project>Run.

12. In cele ce urmeaz, vom extinde clasa FractionObject astfel inct s putem lucra si cu parte intreag.
Pentru aceasta, creem clasa CompoundFraction apeland meniul Project> Add Class. In codul sursa
specificm faptul ca aceasta clas moteneste din clasa FractionObject:
class CompoundFraction : FractionObject
{
}

13. Adugm un constructor acestei clase care s accepte la intrare valori pentru numrtor si numitor
i s apeleze constructorul clasei printe FractionObject pentru iniializarea membrilor.
class CompoundFraction : FractionObject
{
public CompoundFraction(int aNumerator, int aDenominator)
: base(aNumerator, aDenominator)
{
}
}

14. In clasa CompoundFraction adugm un constructor adiional care s permit transmiterea inca a
unui numr intreg ctre obiectul care se creaz. Inainte s apelm constructorul clasei de baz, va
trebui s convertim intregul transmis la intrare intr-un numrtor corespunztor.
public CompoundFraction(int aNumerator, int aDenominator, int aWholeNumber)
: base(aNumerator + aWholeNumber * aDenominator, aDenominator)
{
}

15. Adugm un al 3-lea constructor care va permite creerea unui obiect de tip CompoundFraction pe
baza unui obiect de tip FractionObject primit la intrare.
public CompoundFraction(FractionObject aFraction)
: base(aFraction.Numerator, aFraction.Denominator)
{
}

16. In clasa CompoundFraction supraincrcm metoda ToString() pentru a reflecta apariia prii intregi
la fractie.
public override string ToString()
{
string Result = "";
int tempNumerator = Numerator;
int wholeNumber = 0;
while (tempNumerator >= Denominator)
{
tempNumerator -= Denominator;
wholeNumber++;

}
if (!(wholeNumber == 0))
Result = wholeNumber.ToString() + " ";
if (!(tempNumerator == 0))
{
if (!(wholeNumber == 0))
Result += "";
Result += tempNumerator.ToString() + "/" + Denominator.ToString();
}
return Result;
}

17. In cele ce urmeaz, modificm interfaa grafic pentru a include partea intreag. Astfel,
sub label-ul lblDenominator de pe formularul construit vom mai aduga folosind toolboxul urmtoarele 2
controale:
Control grafic
Proprietati setate
Label
Name: lblWholeNumber
Content: Whole Number
Textbox
Name: txtWholeNumber
Text: <blank>
Formularul devine:

18. Localizm handlerul butonului btnSimplify si modificm acest handler astfel inct s creem un obiect
de tip CompoundFraction in locul obiectului de tip FractionObject creat anterior. Noul obiect va ingloba
inclusiv informatia introdus in cmpul txtWholeNumber.
Astfel handler-ul btnSimplify_Click este modificat astfel:
private void btnSimplify_Click(object sender, RoutedEventArgs e)
{
try
{
int numerator = int.Parse(txtNumerator.Text);
int denominator = int.Parse(txtDenominator.Text);
int wholenumber;
CompoundFraction aFraction;
if (!(txtWholeNumber.Text == ""))
{
wholenumber = int.Parse(txtWholeNumber.Text);
aFraction = new CompoundFraction(numerator, denominator,
wholenumber);
}

else
{
aFraction = new CompoundFraction(numerator, denominator);
}
lblAsString.Content = aFraction.ToString();
lblAsDouble.Content = (aFraction.ToDouble()).ToString();
}
catch
{
MessageBox.Show("Please check the values and try again");
}
}

19. In cele ce urmeaz vom supraincrca operatorul + in clasa FractionObject, pentru a aduna 2 fracii.
Adaugam urmatorul cod in clasa FractionObject, cod care modifica functionalitatea operatorului +.
public static FractionObject operator +(FractionObject fraction1, FractionObject
fraction2)
{ //aduna doua obiecte fractionobject si returneaza obiectul rezultat
int tempDenominator;
int tempNumerator1, tempNumerator2;
FractionObject result;
tempDenominator = fraction1.Denominator * fraction2.Denominator;
tempNumerator1 = fraction1.Numerator * fraction2.Denominator;
tempNumerator2 = fraction2.Numerator * fraction1.Denominator;
result = new FractionObject(tempNumerator1 + tempNumerator2,
tempDenominator);
return result;
}

20. Vom crea o colecie tipizat care s memoreze obiecte de tip Fraction. Vom aduga prin interfaa grafic
obiecte la aceast colecie, iar apoi vom afia suma acestor obiecte. Pentru a crea o colecie, creem o nou
clas FractionCollection motenit din clasa System.Collections.CollectionBase. (Project>Add class)
FractionCollection.cs
class FractionCollection : System.Collections.CollectionBase
{
}

21. Echipm clasa FractionCollection cu metodele Add i Remove care vor aduga respectiv sterge o
fractie din colecie. In clasa de mai sus adaugam metodele:
public void Add(FractionObject f)
{
List.Add(f);
}
public void Remove(FractionObject f)
{
List.Remove(f);
}

22. Implementm in clasa FractionCollection un indexer care s returneze obiectul de pe poziia i din colecie.
public FractionObject this[int i]
{
get
{
return (FractionObject)List[i];
}
set
{
List[i] = value;
}
}

23. Implementm in clasa FractionCollection o metod Total care foloseste operatorul + suprancrcat pentru
a aduna toate fraciile din colecie.
public FractionObject Total()
{
FractionObject Result;
if (this.Count == 0)
Result = new FractionObject(0, 1);
else if (this.Count == 1)
Result = this[0]; //utilizare indexer
else
{
Result = this[0];
int Counter;
for (Counter = 1; Counter < this.Count; Counter++)
//utilizare + supraincarcat pentru adunare fractiilor
Result = Result + this[Counter];
}
return Result;
}

24. In forma formular mai adaugm 3 butoane ca i in figura de mai jos. Butoanele vor avea proprietile din
tabel:
Control grafic
Button
Button
Button

Proprietati setate
Name: btnAdd
Content: Add to Collection
Name: btnTotal
Content: Display Total
Name: btnClear
Content: Clear collection

25. In codul aferent formularului (fisierul MainWindow.xaml.cs , clasa MainWindow) adugm un obiect de
tip FractionCollection ca si variabil membr in clasa MainWindow:
public partial class MainWindow : Window
{
private FractionCollection myFractions = new FractionCollection();
.

26. Pentru fiecare dintre cele 3 butoane adaugam event handler-e pentru evenimentul click:
Se selecteaza fiecare buton, in fereastra properties se trece in modul de configurare a evenimentelor (prin
butonul cu fulger), apoi pentru evenimentul click se specifica denumirea fiecarui handler; se da enter:

27. Astfel in clasa asociata formularului (MainWindow.xaml.cs) avem generate trei event handler-e goale pe
care le umplem cu logica de programare:

MainWindow.xaml.cs > clasa MainWindow


private void btnAdd_Click(object sender, RoutedEventArgs e)
{
int numerator = int.Parse(txtNumerator.Text);
int denominator = int.Parse(txtDenominator.Text);
int wholenumber;
CompoundFraction aFraction;
if (!(txtWholeNumber.Text == ""))
{
wholenumber = int.Parse(txtWholeNumber.Text);
aFraction = new CompoundFraction(numerator, denominator, wholenumber);
}
else
{
aFraction = new CompoundFraction(numerator, denominator);
}
myFractions.Add(aFraction);
txtDenominator.Text = "";
txtNumerator.Text = "";
txtWholeNumber.Text = "";
}
private void btnTotal_Click(object sender, RoutedEventArgs e)
{
CompoundFraction Result = new CompoundFraction(myFractions.Total());
MessageBox.Show("The result is: " + Result.ToString());
}
private void btnClear_Click(object sender, RoutedEventArgs e)
{
myFractions.Clear();
}

Tem: Echipai interfaa grafic cu un obiect de tip Listbox in care s afiai pe cte o linie toate obiectele
care sunt salvate in colecia myFractions.

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