Sunteți pe pagina 1din 8

Laborator 1 n acest laborator vom realiza un calculator care s permit simplificarea fraciilor raionale. 1.

Se creaz un proiect nou din meniul File, New Project si apoi se selecteaz Windows Forms Application. Se introduce numele proiectului: Fraction 2. Pentru inceput, vom crea logica aplicaiei ntr-o clas numit Fraction. Pentru a crea o clas nou, selectm din meniul Project / Add Class. Dm numele clasei: Fraction.cs 3. Adugm in clas 2 variabile private: mNumerator i mDenominator
private int mNumerator; private int mDenominator;

4. Pentru aceste variabile private creem proprietile de tip read/write Numerator i Denominator.
public int Numerator { get { return mNumerator; } set { mNumerator = value; } } public int Denominator { get { return mDenominator; } set { mDenominator = value; } }

5. Adugm metoda Reduce 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; } } }

6. Creem un constructor 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 Fraction(int aNumerator, int aDenominator) { mNumerator = aNumerator; mDenominator = aDenominator; Reduce(); }

7. Adugm metodele ToString i ToDouble 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(); }

8. Pentru testarea clasei Fraction vom crea o interfa grafic. Pentru nceput, selectm forma Form1 in designer, apoi din fereastra Properties schimbm numele formei la frmMain. De asemenea, prin click dreapta in Solution Explorer pe fisierul Form1.cs facem rename la frmMain.cs. Adugm din toolbox pe form urmtoarele componente: Control Proprietate Valoare label name lblNumerator text Numerator label name lblDenominator text Denominator label name lblFractionAsString text Fraction as String label name lblAsString text <blank> label name lblFractionAsDouble text Fraction as Double label name lblAsDouble text <blank> textBox name txtNumerator textBox name txtDenominator button name btnSimplify text Simplify and Display Fraction In final, interfaa grafic trebuie s arate ca i in figura 1.

Figura 1. Interfaa grafic a aplicaiei care testeaz clasa Fraction 9. In desginer facem dublu click pe butonul btnSimplify i in cod se deschide handlerul de evenimente asociat acestui buton. Introducem in acesta cod pentru a crea un nou obiect de tip Fraction. Pornind de la acest obiect, in label-urile lblAsString si lblAsDouble vom afisa valorile simplificate.
private void btnSimplify_Click(object sender, EventArgs e) { try { int numerator = int.Parse(txtNumerator.Text); int denominator = int.Parse(txtDenominator.Text); Fraction aFraction = new Fraction(numerator, denominator); lblAsString.Text = aFraction.ToString(); lblAsDouble.Text = (aFraction.ToDouble()).ToString(); } catch { MessageBox.Show("Please check the values and try again"); } }

10. In cele ce urmeaz, vom extinde clasa Fraction 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 Fraction:
class CompoundFraction : Fraction { }

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

12. 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) { }

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

14. In clasa CompundFraction 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; }

15. In cele ce urmeaz, modificm interfaa grafic frmMain pentru a include partea intreag. Astfel, sub labelul lblDenominator vom mai aduga folosind toolboxul urmtoarele 2 controale: Control Proprietate Valoare label Name lblWholeNumber Text Whole Number textbox Name txtWholeNumber 16. Localizm handlerul butonului btnSimplify si modificm acest handler astfel inct s creem un obiect de tip CompoundFraction in locul obiectului de tip Fraction creat anterior. Noul obiect va ingloba inclusiv informatia introdus in cmpul txtWholeNumber.
private void btnSimplify_Click(object sender, EventArgs 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.Text = aFraction.ToString(); lblAsDouble.Text = (aFraction.ToDouble()).ToString(); } catch { MessageBox.Show("Please check the values and try again"); } }

17. In cele ce urmeaz vom supraincrca operatorul + in clasa Fraction, pentru a aduna 2 fracii.
public static Fraction operator +(Fraction fraction1, Fraction fraction2) { int tempDenominator; int tempNumerator1, tempNumerator2; Fraction result; tempDenominator = fraction1.Denominator * fraction2.Denominator; tempNumerator1 = fraction1.Numerator * fraction2.Denominator; tempNumerator2 = fraction2.Numerator * fraction1.Denominator; result = new Fraction(tempNumerator1 + tempNumerator2, tempDenominator); return result; }

18. In cele ce urmeaz 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.
class FractionCollection : System.Collections.CollectionBase

19. Echipm clasa FractionCollection cu metodele Add i Remove care vor aduga respectiv sterge o fractie din colecie.
public void Add(Fraction f) { List.Add(f); } public void Remove(Fraction f) { List.Remove(f); }

20. Implementm un indexer care s returneze obiectul de pe poziia i din colecie.


public Fraction this[int i]

{ get { return (Fraction)List[i]; } set { List[i] = value; } }

21. Implementm o metod Total care foloseste operatorul + suprancrcat pentru a aduna toate fraciile din colecie.
public Fraction Total() { Fraction Result; if (this.Count == 0) Result = new Fraction(0, 1); else if (this.Count == 1) Result = this[0]; else { Result = this[0]; int Counter; for (Counter = 1; Counter < this.Count; Counter++) Result = Result + this[Counter]; } return Result; }

22. In forma frmMain adaugm 3 butoane ca i in figura de mai jos. Butoanele vor avea proprietile din tabel: Control Proprietate Valoare button name btnAdd text Add to Collection button name btnTotal text Display Total button name btnClear text Clear Collection

Figura 2. Interfaa grafic a aplicaie care permite adugarea de fracii la colectie i adunarea acestora. 23. In editorul de cod adugm un obiect de tip FractionCollection ca si variabil membr in clasa frmMain:
private FractionCollection myFractions = new FractionCollection();

24. Scriem handlere de evenimente corespunztoare pentru cele 3 butoane nou adugate.
private void btnAdd_Click(object sender, EventArgs 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, EventArgs e) { CompoundFraction Result = new CompoundFraction(myFractions.Total()); MessageBox.Show("The result is: " + Result.ToString()); } private void btnClear_Click(object sender, EventArgs e)

{ myFractions.Clear(); }

Tem de cas Echipm interfaa grafic cu un obiect de tip listbox in care vom afia pe cte o linie toate obiectele care sunt salvate in colecia myFractions.