Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να καταλάβουν την διαφορά ανάμεσα σε τοπικές και καθολικές μεταβλητές. Nα κάνουν αποσφαλμάτωση στα προγράμματα τους. Εκφώνηση Να δημιουργήσετε ένα πρόγραμμα έκδοσης λογαριασμού για ένα super market. Επίλυση Δημιουργείστε ένα νέο έργο (File New Project) τύπου Windows Application με όνομα SuperMarket. Σχεδιάστε την διεπαφή της εφαρμογής όπως παρακάτω : Επιλέξτε ένα προς ένα τα αντικείμενα της φόρμας και στο παράθυρο Properties αλλάξτε τις παρακάτω ιδιότητες : Η φόρμα 1
Form1 Name frmbill Το όνομα του Έκδοση Λογαριασμού Η γραμμή τίτλου MaximizeButton False Για να μην FormBorderStyle FixedSingle αλλάζει το μέγεθος της φόρμας. Το πρώτο κουτί κειμένου textbox1 Name txtproduct Το όνομα του Το δεύτερο κουτί κειμένου textbox2 Name txtposotita Το όνομα του Το τρίτο κουτί κειμένου textbox3 Name txttimi Το όνομα του ReadOnly True Για να μην μπορεί να γράψει ο χρήστης Το τέταρτο κουτί κειμένου textbox4 Name txtaxia Το όνομα του ReadOnly True Για να μην μπορεί να γράψει ο χρήστης Το πέμπτο κουτί κειμένου 2
textbox5 Name txtbill Το όνομα του ReadOnly True Για να μην μπορεί να γράψει ο χρήστης Η πρώτη ετικέτα label1 Name lbldescription Το όνομα του Περιγραφή Font Arial 14 Γραμματοσειρά ForeColor Blue Χρώμα Η δεύτερη ετικέτα label2 Name lblproduct Το όνομα του Περιγραφή Η τρίτη ετικέτα label3 Name lblposotita Το όνομα του Ποσότητα Η τέταρτη ετικέτα label4 Name lbltimi Το όνομα του Τιμή Η πέμπτη ετικέτα label5 Name lblaxia Το όνομα του Αξία Η έκτη ετικέτα label6 Name lblbill Το όνομα του 3
Λογαριασμός Το πρώτο κουμπί εντολών button1 Name btnnewproduct Το όνομα του Επόμενο Το δεύτερο κουμπί εντολών button2 Name btnnextcustomer Το όνομα του Επόμενο H λογική της εφαρμογής είναι να πληκτρολογείτε την περιγραφή ενός προϊόντος (π.χ. Μακαρόνια), την ποσότητα (π.χ. 2), την τιμή του (π.χ. 2,34) και πατώντας το πλήκτρο Επόμενο να εμφανίζετε η αξία του προϊόντος δηλαδή 4,68. Η υλοποίηση μέχρι στιγμής είναι εύκολη αφού στο κώδικα της συνάρτησης btnnewproduct_click θα μετατρέψετε σε αριθμούς τα περιεχόμενα των κουτιών κειμένου txtposotita και txttimi και θα αποδώσετε το γινόμενο τους σε μια τοπική μεταβλητή τύπου double με το όνομα Αxia. Τέλος θα εμφανίσετε την τιμή της μεταβλητής Axia στο αντίστοιχο κουτί κειμένου. Όμως εκτός από τα ανωτέρω θέλετε να διατηρείτε και το άθροισμα όλων των αξιών που υπολογίσατε ανάμεσα στα διαδοχικά πατήματα του κουμπιού Επόμενο και το σύνολο να εμφανίζετε στο κουτί με την ετικέτα Λογαριασμός. Για την υλοποίηση αυτής της λειτουργίας θα χρειαστείτε μια μεταβλητή τύπου double με όνομα Bill και αρχική τιμή 0 και με το πάτημα του κουμπιού Επόμενο, η τιμή της Bill να αυξάνεται κατά την τιμή της αξίας, δηλαδή Bill = Bill + Axia. Αν την Bill την δηλώσετε μέσα στην btnnewproduct_click όσες φορές και να πατήσετε το πλήκτρο Επόμενο οι τιμές των Αxia και Bill θα είναι οι ίδιες. Το πρόβλημα βρίσκεται στο ότι η μεταβλητή Bill είναι τοπική μεταβλητή για την btnnewproduct_click και αποκτά υπόσταση με το πάτημα του κουμπιού Επόμενο, οπότε κάθε φορά ξεκινά με την τιμή 0. Η λύση είναι να ορίσετε την Bill έξω από το σώμα της συνάρτησης αλλά μέσα στο σώμα της κλάσης frmbill. 4
Επιλέξτε το κουμπί εντολών btnnewproduct και στο παράθυρο Properties κάντε κλικ στο εικονίδιο με το κεραυνό για να εμφανιστούν τα γεγονότα. Βρείτε το γεγονός Click κάντε διπλό κλικ πάνω για να εμφανιστεί το παράθυρο με το προγραμματισμό των γεγονότων. Μέσα στη μέθοδο btnnewproduct_click πληκτρολογείστε τις παρακάτω εντολές : Πίνακας 1. Ο κώδικας της εφαρμογής 1 namespace SuperMarket 2 { 3 4 public partial class frmbill : Form 5 { 6 double Bill = 0; 7 8 public frmbill() 9 { 10 InitializeComponent(); 11 } 12 13 private void btnnextproduct_click(object sender, EventArgs e) 14 { 15 double posotita = double.parse(txtposotita.); 16 double timi = double.parse(txttimi.); 17 double Αxia = posotita * timi; 18 Bill = Bill + Αxia; 19 txtaxia. = Αxia.ToString(); 20 txtbill. = Bill.ToString(); 21 } 22 23 void ClearFields() 24 { 25 txtproduct. = ""; 26 txtposotita. = ""; 27 txttimi. = ""; 28 txtbill. = ""; 29 txtaxia. = ""; 30 } 31 32 private void btnnewcustomer_click(object sender, EventArgs e) 33 { 34 ClearFields(); 35 36 37 Bill = 0; 38 } 39 40 } 5
41 } Όλες οι μεταβλητές έξω από το σώμα μιας συνάρτησης ονομάζονται καθολικές (global) και αποκτούν υπόσταση καθ όλη την διάρκεια ζωής της κλάσης στην οποία εμπεριέχονται. Στην συγκεκριμένη περίπτωση η Bill εμπεριέχεται στην κλάση frmbill η οποία είναι το παράθυρο της εφαρμογής οπότε η Bill αποκτά υπόσταση με την έναρξη του προγράμματος και παύει να ισχύει με τον τερματισμό του. Την Bill θα μπορούσατε να την ορίσετε αντί της γραμμής 6 στην 12 ή 22 ή 31 ή 39. Οπουδήποτε μέσα στην frmbill αλλά έξω από οποιαδήποτε συνάρτηση. Στις γραμμές 23 έως 30 κατασκευάζετε την συνάρτηση ClearFields ή οποία είναι παράδειγμα συνάρτησης που δεν παίρνει παραμέτρους και δεν επιστρέφει τιμή και για αυτό δηλώνετε και void. Στις γραμμές 32 έως 38 στις οποίες ορίζετε τις εντολές που θα εκτελεστούν με το πάτημα του κουμπιού btnnewcustomer και αυτές είναι η εκτέλεση της ClearFields για να καθαρίσουν τα κουτιά κειμένου και η απόδοση του 0 στην Bill ώστε να υπολογίσει σωστά τον λογαριασμό του επόμενου πελάτη. Αν εν συνεχεία θέλετε να επεκτείνετε την εφαρμογή ώστε να υπολογίζετε και την είσπραξη της ημέρας θα πρέπει να κάνετε τα εξής : 1. Μεγαλώστε τις διαστάσεις της φόρμας της εφαρμογής και προσθέστε μια νέα ετικέτα και ένα νέο κουτί κειμένου, όπως στην παρακάτω εικόνα. Οι ιδιότητες των αντικειμένων θα είναι : Το κουτί κειμένου 6
textbox1 Η ετικέτα label1 Name txttotal Το όνομα του ReadOnly True Για να μην μπορεί να γράψει ο χρήστης Name lbltotal Το όνομα του Σύνολο Ημέρας Στο κώδικα του Πίνακα 1 στην γραμμή 7 προσθέστε μια νέα καθολική μεταβλητή τύπου double με όνομα Total και αρχική τιμή 0. 7 double Total = 0; Επίσης στις γραμμές 35 και 36 υπολογίστε το σύνολο της ημέρας και εμφανίστε το στο κουτί κειμένου txttotal. 35 Total = Total + Bill 36 txttotal. = Total.ToString() Αποσφαλμάτωση (Debugging) Όσο τα προγράμματα μεγαλώνουν σε μέγεθος θα πρέπει να είστε ιδιαίτερα προσεκτικοί στην σύνταξη των εντολών. Τα σύγχρονα περιβάλλοντα προγραμματισμού διαθέτουν την λειτουργία της αποσφαλμάτωσης με σκοπό να δώσουν την δυνατότητα στο προγραμματιστή να ελέγξει τις τιμές των μεταβλητών αλλά και την ροή του προγράμματος κατά την ώρα της λειτουργίας του. Για παράδειγμα υποθέστε ότι στο προηγούμενο πρόγραμμα θέλατε να ελέγξετε τις τιμές των μεταβλητών όταν πατάτε το πλήκτρο Επόμενο. Για να ενεργοποιήσετε την αποσφαλμάτωση θα πρέπει να πάτε στο κώδικα σας στην γραμμή 15 και να τοποθετήσετε ένα σημείο διακοπής (breakpoint). Αυτό επιτυγχάνετε πατώντας δεξί πλήκτρο στο σημείο που επιθυμείτε την διακοπή εκτέλεσης του προγράμματος και εν συνεχεία επιλέγετε Breakpoint και Insert Breakpoint. 7
Αμέσως μετά την εισαγωγή της διακοπής εμφανίζετε μια κόκκινη γραμμή για να δηλώσει την ύπαρξη του Breakpoint. Εν συνεχεία πατήστε F5 για να τρέξετε την εφαρμογή σας και αφού πληκτρολογείστε τις τιμές της παρακάτω εικόνας εν συνεχεία πατήστε το πλήκτρο Επόμενο. Με το πάτημα του πλήκτρου εμφανίζετε ο κώδικας της εφαρμογής στο σημείο της διακοπής. Μια κίτρινη γραμμή και ένα βέλος στο αριστερό περιθώριο της σελίδας δείχνουν την τρέχουσα γραμμή εκτέλεσης του προγράμματος. Πηγαίνοντας το κέρσορα πάνω από μια μεταβλητή ή ένα αντικείμενο της φόρμας χωρίς να πατήσετε 8
κάποιο πλήκτρο το περιβάλλον σας δείχνει την τιμή του. Στην παρακάτω εικόνα εμφανίζετε η τιμή του κουτιού κειμένου txtposotita. Αν θέλετε να έχετε συνεχώς μπροστά σας ένα πίνακα με μια ή περισσότερες μεταβλητές ώστε να παρακολουθείτε τις εναλλαγές που συμβαίνουν στις τιμές τους, τότε πηγαίνετε το κέρσορα πάνω από την επιθυμητή μεταβλητή και αφού πατήσετε δεξί πλήκτρο επιλέξτε Add Watch. Μετά την επιλογή Add Watch εμφανίζεται στο κάτω μέρος της οθόνης ένας πίνακας με το όνομα, την τιμή και το τύπο της μεταβλητής. Στο πίνακα μπορείτε να προσθέσετε μια καινούργια μεταβλητή είτε επαναλαμβάνοντας την προηγούμενη διαδικασία ή πηγαίνοντας σε μια κενή γραμμή και πληκτρολογώντας το όνομα της. Αντίθετα πατώντας το πλήκτρο Del πάνω σε μια γραμμή διαγράφετε την αντίστοιχη μεταβλητή από το πίνακα. 9
Για να προχωρήσετε στην επόμενη γραμμή του προγράμματος θα πρέπει να πατήσετε το πλήκτρο F10 ή F11. Η διαφορά μεταξύ τους είναι ότι το F11 εκτελεί την επόμενη γραμμή ενώ το F10 εκτελεί το επόμενο σύνολο εντολών. Για να καταλάβετε την διαφορά θεωρείστε ένα σημείο διακοπής στην γραμμή 34 του Πίνακα 1. Αν πατήσετε το πλήκτρο F11 τότε η εκτέλεση του προγράμματος θα συνεχίσει στο σώμα της ClearFields και αφού συνεχίσετε να πατάτε το F11 και φτάσετε στην γραμμή 30 τότε θα επιστρέψετε στην γραμμή 35 της btnnewcustomer_click. Αν στην γραμμή 34 αντί για F11 είχατε πατήσει το F10 τότε πάλι θα εκτελούσατε την ClearFields χωρίς όμως να μπείτε στο σώμα της και να τρέξετε γραμμή προς γραμμή τις εντολές και θα συνεχίζατε στην γραμμή 35. Το F10 είναι χρήσιμο για να αποφύγετε μια άσκοπη περιήγηση στο σώμα μιας συνάρτησης την οποία έχετε ελέγξει σε προηγούμενο στάδιο. 10
Αν θέλετε να διαγράψετε ή να απενεργοποιήσετε το σημείο διακοπής τότε πατάτε δεξί πλήκτρο πάνω του οπουδήποτε στην κόκκινη γραμμή - και εν συνεχεία επιλέγετε Breakpoint και Delete Breakpoint (διαγραφή) ή Disable Breakpoint (απενεργοποίηση). H αποσφαλμάτωση είναι μια χρονοβόρα διαδικασία αλλά και πολύτιμο εργαλείο για την διόρθωση σφαλμάτων και την κατανόηση της εκτέλεσης των εντολών του προγράμματος. 11