Upload
andrea-nemet
View
19
Download
0
Embed Size (px)
DESCRIPTION
lab1
Citation preview
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; } } }
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.
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) { }
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 {
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]
{ 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
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)
{ 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.