8
Laborator 1 În acest laborator vom realiza un calculator care să permită simplificarea fracțiilor raționale. 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 aplicației într-o clasă numită Fraction. Pentru a crea o clasă nouă, selectăm din meniul Project / Add Class. Dăm numele clasei: Fraction.cs 3. Adăugăm in clasă 2 variabile private: mNumerator și mDenominator private int mNumerator; private int mDenominator; 4. Pentru aceste variabile private creem proprietățile 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. Adăugăm metoda Reduce care simplifică fracțiile 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; } } }

Laborator1_medii

Embed Size (px)

DESCRIPTION

lab1

Citation preview

Page 1: Laborator1_medii

Laborator 1

În acest laborator vom realiza un calculator care să permită simplificarea fracțiilor raționale.

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 aplicației într-o clasă numită Fraction. Pentru a crea o clasă nouă,

selectăm din meniul Project / Add Class. Dăm numele clasei: Fraction.cs

3. Adăugăm in clasă 2 variabile private: mNumerator și mDenominator

private int mNumerator; private int mDenominator;

4. Pentru aceste variabile private creem proprietățile 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. Adăugăm metoda Reduce care simplifică fracțiile 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; } } }

Page 2: Laborator1_medii

6. Creem un constructor care să inițializeze proprietățile Numerator si Denominator la valorile primite

ca și argumente. In cadrul constructorului vom apela metoda Reduce pentru a realiza simplificarea

fracțiilor.

public Fraction(int aNumerator, int aDenominator) { mNumerator = aNumerator; mDenominator = aDenominator; Reduce(); } 7. Adăugăm metodele ToString și ToDouble pentru a converti un obiect din clasa Fraction către String

sau Double. Observăm că implicit metoda ToString este moștenită din superclasa comună

System.Object, deci va trebui să utilizăm cuvântul cheie override pentru a asigura supraîncărcarea

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, selectăm forma Form1

in designer, apoi din fereastra Properties schimbăm numele formei la frmMain. De asemenea, prin

click dreapta in Solution Explorer pe fisierul Form1.cs facem rename la frmMain.cs. Adăugăm din

toolbox pe formă următoarele 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, interfața grafică trebuie să arate ca și in figura 1.

Page 3: Laborator1_medii

Figura 1. Interfața grafică a aplicației 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 incât să putem lucra si cu parte intreagă.

Pentru aceasta, creem clasa CompoundFraction apeland meniul Project, Add Class. In codul sursa

specificăm faptul ca aceasta clasă moșteneste din clasa Fraction:

class CompoundFraction : Fraction { } 11. Adăugăm un constructor acestei clase care să accepte la intrare valori pentru numărător si numitor

și să apeleze constructorul clasei părinte Fraction pentru inițializarea membrilor.

public CompoundFraction(int aNumerator, int aDenominator) : base(aNumerator, aDenominator) { }

Page 4: Laborator1_medii

12. In clasa CompoundFraction adăugăm un constructor adițional care să permită transmiterea inca a

unui număr intreg către obiectul care se crează. Inainte să apelăm constructorul clasei de bază, va

trebui să convertim intregul transmis la intrare intr-un numărător corespunzător.

public CompoundFraction(int aNumerator, int aDenominator, int aWholeNumber) : base(aNumerator + aWholeNumber*aDenominator, aDenominator) { } 13. Adăugăm 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 supraincărcăm metoda ToString pentru a reflecta apariția părții 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ă, modificăm interfața grafică frmMain pentru a include partea intreagă. Astfel,

sub labelul lblDenominator vom mai adăuga folosind toolboxul următoarele 2 controale:

Control Proprietate Valoare

label Name lblWholeNumber

Text Whole Number

textbox Name txtWholeNumber

16. Localizăm handlerul butonului btnSimplify si modificăm acest handler astfel incât să creem un obiect

de tip CompoundFraction in locul obiectului de tip Fraction creat anterior. Noul obiect va ingloba

inclusiv informatia introdusă in câmpul txtWholeNumber.

private void btnSimplify_Click(object sender, EventArgs e) { try {

Page 5: Laborator1_medii

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 supraincărca operatorul + in clasa Fraction, pentru a aduna 2 fracții.

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 colecție tipizată care să memoreze obiecte de tip Fraction. Vom

adăuga prin interfața grafică obiecte la această colecție, iar apoi vom afișa suma acestor obiecte.

Pentru a crea o colecție, creem o nouă clasă FractionCollection moștenită din clasa

System.Collections.CollectionBase.

class FractionCollection : System.Collections.CollectionBase 19. Echipăm clasa FractionCollection cu metodele Add și Remove care vor adăuga respectiv sterge o

fractie din colecție.

public void Add(Fraction f) { List.Add(f); } public void Remove(Fraction f) { List.Remove(f); } 20. Implementăm un indexer care să returneze obiectul de pe poziția i din colecție.

public Fraction this[int i]

Page 6: Laborator1_medii

{ get { return (Fraction)List[i]; } set { List[i] = value; } } 21. Implementăm o metodă Total care foloseste operatorul + supraâncărcat pentru a aduna toate

fracțiile din colecție.

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 adaugăm 3 butoane ca și in figura de mai jos. Butoanele vor avea proprietățile din

tabel:

Control Proprietate Valoare

button name btnAdd

text Add to Collection

button name btnTotal

text Display Total

button name btnClear

text Clear Collection

Page 7: Laborator1_medii

Figura 2. Interfața grafică a aplicație care permite adăugarea de fracții la colectie și adunarea

acestora.

23. In editorul de cod adăugăm un obiect de tip FractionCollection ca si variabilă membră in clasa

frmMain:

private FractionCollection myFractions = new FractionCollection(); 24. Scriem handlere de evenimente corespunzătoare pentru cele 3 butoane nou adăugate.

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)

Page 8: Laborator1_medii

{ myFractions.Clear(); }

Temă de casă

Echipăm interfața grafică cu un obiect de tip listbox in care vom afișa pe câte o linie toate obiectele care

sunt salvate in colecția myFractions.