Documente Academic
Documente Profesional
Documente Cultură
n acest laborator vom realiza un calculator care s permit simplificarea fraciilor raionale precum si alte
operatii.
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;
}
}
}
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.
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
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):
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:
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.