Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής. Να χρησιμοποιήσουν τα βασικά ελεγκτήρια (controls) της εργαλειοθήκης, Κουτί Κειμένου (Box), Ετικέτα (Label), Κουμπί Εντολών (Button). Να κατανοήσουν τους βασικούς τύπους δεδομένων και την ανάγκη μετατροπή του κειμένου σε αριθμητικό τύπο. Να χρησιμοποιήσουν τους βασικούς τελεστές, την δομή if, switch, for. Να δημιουργήσουν τις πρώτες συναρτήσεις. Εκφώνηση Να δημιουργήσετε ένα πρόγραμμα το οποίο θα δέχεται δύο ακεραίους αριθμούς έστω α και β και θα υπολογίζει το α υψωμένο στην δύναμη του β (α β ). Για παράδειγμα αν οι αριθμοί είναι το 2 και 4 το αποτέλεσμα είναι 16 (2 4 ) και υπολογίζεται 2*2*2*2. Δεν θα υπολογίζεται αρνητικές δυνάμεις. Επίλυση Δημιουργείστε ένα νέο έργο (File New Project) τύπου Windows Application με όνομα Power. Σχεδιάστε την διεπαφή της εφαρμογής όπως παρακάτω : 1
Επιλέξτε ένα προς ένα τα αντικείμενα της φόρμας και στο παράθυρο Properties αλλάξτε τις παρακάτω ιδιότητες : Η φόρμα Form1 Name frmpower Το όνομα του Ύψωση σε δύναμη Η γραμμή τίτλου MaximizeButton False Για να μην FormBorderStyle FixedSingle αλλάζει το μέγεθος της φόρμας. Το πρώτο κουτί κειμένου textbox1 Name txtbasi Το όνομα του Το δεύτερο κουτί κειμένου textbox2 Name txtekthetis Το όνομα του Το τρίτο κουτί κειμένου textbox3 Name txtapotelesma Το όνομα του ReadOnly True Για να μην μπορεί να γράψει ο χρήστης Το κουμπί εντολών button1 Name btncalculate Το όνομα του Υπολόγισε 2
Η πρώτη ετικέτα label1 Name lblbasi Το όνομα του Βάση Η δεύτερη ετικέτα label2 Name lblekthetis Το όνομα του Εκθέτης Η τρίτη ετικέτα label2 Name lblapotelesma Το όνομα του Αποτέλεσμα Επιλέξτε το κουμπί εντολών btncalculate και στο παράθυρο Properties κάντε κλικ στο εικονίδιο με το κεραυνό για να εμφανιστούν τα γεγονότα. Βρείτε το γεγονός Click κάντε διπλό κλικ πάνω για να εμφανιστεί το παράθυρο με το προγραμματισμό των γεγονότων. Μέσα στη μέθοδο btncalculate_click πληκτρολογείστε τις παρακάτω εντολές : Πίνακας 1. Ο κώδικας της εφαρμογής 1 private void btncalculate_click(object sender, EventArgs e) 2 { 3 int basi, ekthetis; 4 double apotelesma; 5 int i; 6 basi = int.parse(txtbasi.); 7 ekthetis = int.parse(txtekthetis.); 8 apotelesma = 1; 9 10 for (i = 1; i <= ekthetis; i++) 11 { 12 apotelesma = apotelesma * basi; 13 } 14 15 txtapotelesma. = apotelesma.tostring(); 16 } 3
Το παραπάνω παράδειγμα είχε σαν σκοπό να δείξει την χρήση του for με ένα απλό παράδειγμα. Παρ όλο ότι το ανωτέρω πρόγραμμα είναι σωστό δεν χρειάζεται να το χρησιμοποιείτε για τον υπολογισμό της ύψωσης σε δύναμη. Η κλάση Math της C# διαθέτει ισχυρή υποστήριξη για το υπολογισμό των γνωστών μαθητικών συναρτήσεων και πράξεων. Για να χρησιμοποιήσετε μια συνάρτηση γράφετε Math. και εν συνεχεία την επιλέγετε όπως παρακάτω : Έτσι ο κώδικας της εφαρμογής γίνεται : Πίνακας 2. Ο κώδικας της εφαρμογής 1 private void btncalculate_click(object sender, EventArgs e) 2 { 3 int basi, ekthetis; 4 double apotelesma; 5 6 basi = int.parse(txtbasi.); 7 ekthetis = int.parse(txtekthetis.); 8 apotelesma = Math.Pow(basi, ekthetis); 9 txtapotelesma. = apotelesma.tostring(); 10 } Για να δείτε την περιγραφή των μαθηματικών συναρτήσεων βάλτε το κέρσορα πάνω στην λέξη Math και πατήστε το πλήκτρο F1. Η βοήθεια στην C# είναι εκτενής και σε κάθε συνάρτηση υπάρχει ένα ολοκληρωμένο παράδειγμα. Ο Πίνακας 3 εμφανίζει τα ονόματα των συναρτήσεων και μια σύντομη περιγραφή. Ε Πίνακας 3. Η κλάση Math Η βάση των φυσικών λογαρίθμων 4
PI Ο αριθμός π Abs Επιστρέφει την απόλυτη τιμή του αριθμού Acos Επιστρέφει τo τόξο συνημίτονου ενός αριθμού. Asin Επιστρέφει τo τόξο ημίτονου ενός αριθμού. Atan Επιστρέφει τo τόξο εφαπτομένης ενός αριθμού. Atan2 Επιστρέφει τo τόξο εφαπτομένης του λόγου δύο αριθμών BigMul Υπολογίζει το γινόμενο δύο ακεραίων αριθμών. Ceiling Επιστρέφει το μικρότερο ακέραιο αριθμό που είναι μεγαλύτερος ή ίσος στο συγκεκριμένο αριθμό. Cos Επιστρέφει τo συνημίτονο ενός αριθμού. Cosh Επιστρέφει τo υπερβολικό συνημίτονο ενός αριθμού. DivRem Υπολογίζει το πηλίκο δύο αριθμών και επιστρέφει και το υπόλοιπο. Exp Επιστρέφει το e υψωμένο στο συγκεκριμένο αριθμό Floor Επιστρέφει το μεγαλύτερο ακέραιο αριθμό που είναι μικρότερος ή ίσος στο συγκεκριμένο αριθμό. IEEERemainder Υπολογίζει το υπόλοιπο από την διαίρεση δύο αριθμών. Log Επιστρέφει το λογάριθμο ενός αριθμού. Log10 Επιστρέφει το λογάριθμο με βάση το 10 ενός αριθμού. Max Επιστρέφει το μεγαλύτερο μεταξύ δύο αριθμών. Min Επιστρέφει το μικρότερο μεταξύ δύο αριθμών. Pow Υπολογίζει την ύψωση ενός αριθμού σε ένα εκθέτη. Round Στρογγυλοποιεί την τιμή ενός αριθμού Sign Επιστρέφει -1, 0, 1 για να δείξει το πρόσημο ενός αριθμού Sin Επιστρέφει τo ημίτονο ενός αριθμού. Sinh Επιστρέφει τo υπερβολικό ημίτονο ενός αριθμού. Sqrt Επιστρέφει την τετραγωνική ρίζα ενός αριθμού. Tan Επιστρέφει την εφαπτομένη ενός αριθμού. Tanh Επιστρέφει την υπερβολική εφαπτομένη ενός αριθμού. Truncate Επιστρέφει το ακέραιο μέρος ενός αριθμού 5
Όλες οι συναρτήσεις επιτελούν ένα συγκεκριμένο υπολογισμό και έχουν υλοποιηθεί από την εταιρία που κατασκεύασε την C#. Για να τις χρησιμοποιήσετε θα πρέπει να ακολουθήσετε τις οδηγίες του κατασκευαστή για τον τρόπο που θα τις καλέσετε χωρίς να σας ενδιαφέρουν οι λεπτομέρειες κατασκευής τους. Για παράδειγμα, η Pow που χρησιμοποιήσατε στο παραπάνω πρόγραμμα, συντάσσετε όπως παρακάτω : Η Pow θα πρέπει να πάρει δύο double αριθμούς (x και y) και θα επιστρέψει ένα αποτέλεσμα τύπου double η πρώτη λέξη πριν το όνομα της συνάρτησης. Θα μπορούσατε σε πολύ αφηρημένο επίπεδο να θεωρήσετε ότι η Pow είναι ένας μηχανισμός, όπως παρακάτω : Pow w x y Αποτέλεσμα Τα σημαντικά στοιχεία είναι : 1. Το όνομα του μηχανισμού γιατί μέσω αυτού θα χρησιμοποιήσω την λειτουργικότητα του. Είναι χρήσιμο τα ονόματα να δείχνουν την λειτουργικότητα του μηχανισμού, δηλαδή αν ο μηχανισμός υπολόγιζε το εμβαδόν ενός τριγώνου να είχε σαν όνομα, TriangleArea ή EmbadonTrigonou. 2. Το πλήθος των παραμέτρων που χρειάζονται για να λειτουργήσει ο μηχανισμός. Οι παράμετροι είναι οι είσοδοι στο μηχανισμό και αναφέρονται και σαν ορίσματα. Στην προκειμένη περίπτωση είναι δύο γιατί αυτό απαιτεί το πρόβλημα, μια βάση και έναν εκθέτη. Αν ένας άλλος μηχανισμός υπολόγιζε τον μικρότερο από 4 6
αριθμούς θα έπρεπε να είχε 4 εισόδους μια για κάθε έναν από τους τέσσερις αριθμούς. 3. Το είδος των παραμέτρων δηλαδή τι είναι η κάθε μια είσοδος, ακέραιος αριθμός, πραγματικός αριθμός, κείμενο κ.λπ. Αυτό καθορίζεται από το είδος του προβλήματος. 4. Το είδος του αποτελέσματος δηλαδή τι είναι το τελικό αποτέλεσμα του μηχανισμού, ακέραιος αριθμός, πραγματικός αριθμός, κείμενο κ.λπ. Επίσης όπως προηγουμένως έτσι και αυτό καθορίζεται από το είδος του προβλήματος. Αν για παράδειγμα ένας μηχανισμός υπολογίζει το άθροισμα πραγματικών αριθμών τότε και το τελικό αποτέλεσμα θα είναι πραγματικός αριθμός. Όλοι οι προγραμματιστές δημιουργούν τις δικές τους συναρτήσεις για τους εξής λόγους : Καλύτερη διαχείριση - Μια λειτουργία που αποτελεί την επίλυση ενός μέρους του προβλήματος, χρειάζεται σε πάρα πολλά διαφορετικά σημεία του προγράμματος. Για παράδειγμα, σε προηγούμενο πρόγραμμα με το πάτημα ενός κουμπιού υπολογίσατε το μικρότερο από τρεις αριθμούς. Εάν ο συγκεκριμένος υπολογισμός ήταν απαραίτητος και σε άλλο σημείο του προγράμματος θα έπρεπε να επαναλάβετε τις εντολές. Αυτή η τακτική είναι λάθος γιατί δημιουργεί μεγάλο κώδικα και προβλήματα στην διαχείριση του. Ασφαλέστερος Κώδικας : Η διόρθωση ενός σφάλματος θα γίνει σε ένα σημείο και όχι σε πολλά διαφορετικά σημεία. Η τοποθέτηση των εντολών σε ένα μηχανισμό παρέχει καλύτερο έλεγχο του προβλήματος αφού κοινές λειτουργίες ομαδοποιούνται κάτω από το όνομα ενός μηχανισμού και δίνουν την δυνατότητα στο προγραμματιστή να εστιάζει στο πρόβλημα και όχι σε κάθε εντολή ξεχωριστά. Επαναχρησιμοποίηση - Χρήσιμες συναρτήσεις μπορούν να τοποθετηθούν σε μια βιβλιοθήκη και να χρησιμοποιηθούν από πολλά προγράμματα. Όλες οι παραπάνω αρχές θα υλοποιηθούν στο επόμενο πρόγραμμα. 7
Εκφώνηση Να δημιουργήσετε ένα πρόγραμμα το οποίο θα δέχεται δύο πραγματικούς αριθμούς έστω α και β και θα υπολογίζει ανάλογα με το κουμπί που θα πατήσετε τις παρακάτω σχέσεις : 1. (a 4 +b 4 )/b 2. a*(a 4 +b 4 ) 3. (a 4 +b 4 )/a Δεν θα κάνετε έλεγχο αν ο παρανομαστής είναι μηδέν. Επίλυση Δημιουργείστε ένα νέο έργο (File New Project) τύπου Windows Application με όνομα Function. Σχεδιάστε την διεπαφή της εφαρμογής όπως παρακάτω : Επιλέξτε ένα προς ένα τα αντικείμενα της φόρμας και στο παράθυρο Properties αλλάξτε τις παρακάτω ιδιότητες : Η φόρμα Form1 Name frmfunction Το όνομα του Παράδειγμα Συναρτήσεων Η γραμμή τίτλου MaximizeButton False Για να μην FormBorderStyle FixedSingle αλλάζει το μέγεθος της φόρμας. Το πρώτο κουτί κειμένου 8
textbox1 Name txtα Το όνομα του Το δεύτερο κουτί κειμένου textbox2 Name txtβ Το όνομα του Το τρίτο κουτί κειμένου textbox3 Name txtapotelesma Το όνομα του ReadOnly True Για να μην μπορεί να γράψει ο χρήστης Το πρώτο κουμπί εντολών button1 Name btnfirst Το όνομα του (a^4+b^4)/b Το δεύτερο κουμπί εντολών Button2 Name btnsecond Το όνομα του a*(a^4+b^4) Το τρίτο κουμπί εντολών Button3 Name btnthird Το όνομα του (a^4+b^4)/a Η πρώτη ετικέτα 9
label1 Name lbla Το όνομα του a Η δεύτερη ετικέτα label2 Name lblb Το όνομα του b Η τρίτη ετικέτα label2 Name lblapotelesma Το όνομα του Αποτέλεσμα Από την εκφώνηση του προβλήματος φαίνεται ότι η σχέση (a 4 +b 4 ) χρησιμοποιείτε σε περισσότερους από έναν υπολογισμούς και για αυτό το λόγο είναι χρήσιμο να δημιουργήσετε την συνάρτηση SumPowerFour για τον υπολογισμό της. Επιλέξτε το κουμπί εντολών btnfirst και στο παράθυρο Properties κάντε κλικ στο εικονίδιο με το κεραυνό για να εμφανιστούν τα γεγονότα. Βρείτε το γεγονός Click κάντε διπλό κλικ πάνω για να εμφανιστεί το παράθυρο με το προγραμματισμό των γεγονότων. Τοποθετήστε το κέρσορα έξω από το σώμα της μεθόδου btnfirst_click σε ένα οποιοδήποτε σημείο από τα τρία πιθανά που εμφανίζονται στην παρακάτω οθόνη : Πιθανά σημεία τοποθέτησης μιας νέας συνάρτησης δηλαδή μέσα στο σώμα της φόρμας frmfunction αλλά έξω από το σώμα μιας 10
οποιοσδήποτε μεθόδου. Για παράδειγμα, πάνω από τη btnfirst_click πληκτρολογείστε τις παρακάτω εντολές : Πίνακας 4. Ο κώδικας της εφαρμογής 1 double SumPowerFour(double a, double b) 2 { 3 double apot; 4 5 apot = Math.Pow(a, 4) + Math.Pow(b, 4); 6 7 return apot; 8 } Για την δημιουργία της συνάρτησης θα πρέπει να σκεφτείτε ως εξής : 1. Το όνομα του μηχανισμού η μαθηματική σχέση υπολογίζει το άθροισμα δύο αριθμών υψωμένων εις την τετάρτη. Το SumPowerFour ταιριάζει στην περιγραφή του προβλήματος. Οπότε γράφετε την λέξη SumPowerFour. Πρώτη φάση σύνταξης της SumPowerFour SumPowerFour 2. Το πλήθος των παραμέτρων Η συγκεκριμένη λειτουργία χρειάζεται δύο πληροφορίες, τους αριθμούς a και β, για να υπολογίσει το αποτέλεσμα της σχέσης. Οπότε δίπλα στην λέξη SumPowerFour που γράψατε προηγουμένως - γράφετε μέσα σε παρενθέσεις (a, b). Όλες οι παράμετροι χωρίζονται μεταξύ τους με κόμμα. Υπάρχουν συναρτήσεις που δεν χρειάζονται παραμέτρους και σε αυτή την περίπτωση δεν θα γράφετε τίποτα μέσα στις παρενθέσεις. Το ονόματα των παραμέτρων δεν έχουν καμία σημασία εκτός από το να συσχετίζονται λογικά με το προς επίλυση πρόβλημα. Δεύτερη φάση σύνταξης της SumPowerFour SumPowerFour(a, b) 3. Το είδος των παραμέτρων Και οι δύο παράμετροι είναι πραγματικοί αριθμοί οπότε γράφετε την λέξη double πριν από την κάθε παράμετρο. 11
Τρίτη φάση σύνταξης της SumPowerFour SumPowerFour(double a, double b) 4. Το είδος του αποτελέσματος Το αποτέλεσμα του υπολογισμού είναι ένα πραγματικός αριθμός οπότε γράφετε την λέξη double πριν από το όνομα της συνάρτησης. Τέταρτη φάση σύνταξης της SumPowerFour double SumPowerFour(double a, double b) H εργασία ολοκληρώνεται με την τοποθέτηση του ζεύγους των αγκίστρων, τα οποία περικλείουν τις εντολές που θα εκτελέσει η SumPowerFour. Πέμπτη φάση σύνταξης της SumPowerFour double SumPowerFour(double a, double b) { } Από την στιγμή που ολοκληρώσατε την πέμπτη φάση επικεντρώνεστε στην επίλυση του εξής προβλήματος : Αν είχατε δύο αριθμούς a και b τι θα κάνατε για να υπολογίσετε το (a 4 +b 4 ); Ο Πίνακας 4 περιέχει την απάντηση. Ορίζετε μια μεταβλητή την apot για να αποθηκεύσετε το αποτέλεσμα του υπολογισμού. Στην γραμμή 5 επιλύετε το πρόβλημα. Στην επόμενη γραμμή με την βοήθεια της return επιστρέφετε την τιμή που υπολογίσατε και είναι αποθηκευμένη στην apot. Πριν προχωρήσετε στην επίλυση του συνολικού προβλήματος σκεφτείτε τα βήματα που θα πρέπει να ακολουθήσετε και αυτά είναι : - Στο σώμα των μεθόδων btnfirst, btnsecond και btnthird θα μετατρέψετε τις τιμές των txta και txtb σε πραγματικούς αριθμούς, - Στο σώμα του κάθε κουμπιού θα υπολογίσετε με την βοήθεια της SumPowerFour το αποτέλεσμα για την αντίστοιχη μαθηματική σχέση. 12
- Τέλος το αποτέλεσμα θα το αποδώσετε στο txtapotelesma. Παρατηρώντας τα ανωτέρω βήματα αντιλαμβάνεστε ότι το πρώτο και το τρίτο είναι κοινά οπότε δημιουργείτε την συνάρτηση CalculateFunctions για να τοποθετήσετε τις εντολές επίλυσης του προβλήματος. Σαν παράμετρο θα χρησιμοποιήσετε μια ακέραια τιμή με εύρος από 1 έως 3 και αναλόγως της τιμής θα υπολογίζεται η αντίστοιχη μαθηματική σχέση. Πίνακας 5. Ο κώδικας της CalculateFunctions 1 void CalculateFunctions(int choosefunction) 2 { 3 double apot; 4 double noa, nob; 5 6 noa = double.parse(txta.); 7 nob = double.parse(txtb.); 8 9 switch (choosefunction) 10 { 11 case 1 : 12 apot = SumPowerFour(noA, nob) / nob; 13 break; 14 case 2: 15 apot = noa * SumPowerFour(noA, nob); 16 break; 17 case 3: 18 apot = SumPowerFour(noA, nob) / noa; 19 break; 20 default : 21 apot = 0; 22 break; 23 } 24 25 txtapotelesma. = apot.tostring(); 26 } Παρατηρώντας την CalculateFunctions βλέπετε ότι απουσιάζει η return και επίσης πριν το όνομα, υπάρχει η λέξη void. Όλες οι συναρτήσεις που δεν επιστρέφουν τιμή δηλώνονται σαν void. Μέσα στο σώμα της CalculateFunctions δηλώνεται τρεις μεταβλητές. Η apot χρησιμοποιείται για την αποθήκευση του αποτελέσματος μετά τον υπολογισμό της αντίστοιχης μαθηματικής σχέσης. Αντιπαραβάλλοντας την CalculateFunctions και την SumPowerFour βλέπουμε ότι και οι δύο ορίζουν μια 13
μεταβλητή με το ίδιο όνομα. Παρά όλο αυτήν την ομοιότητα είναι διαφορετικές μεταξύ τους γιατί η κάθε μια αποκτά υπόσταση όταν εκτελείται η αντίστοιχη συνάρτηση. Όλες οι μεταβλητές που ορίζονται μέσα στο σώμα μιας συνάρτησης ονομάζονται τοπικές και έχουν διάρκεια ζωής όση ώρα εκτελείται η αντίστοιχη συνάρτηση. Οι noa και nob χρησιμοποιούνται για την αποθήκευση της αριθμητικής τιμής των κουτιών κειμένου txta και txtb, αντίστοιχα. Αυτές οι τιμές θα περάσουν σαν ορίσματα μέσα στην SumPowerFour για τον υπολογισμό της μαθηματικής σχέσης (noa 4 + nob 4 ), στις γραμμές 12 ή 15 ή 18 του Πίνακα 5. H τιμή του noα θα αποδοθεί στην παράμετρο a και η τιμή του nob στο b. Αν για παράδειγμα στην γραμμή 12 τα noa και nob έχουν τιμές 2 και 3 αντίστοιχα, τότε στο σώμα της SumPowerFour (Πίνακας 4, γραμμή 5) η apot = 2 4 + 3 4 δηλαδή 97. 2 3 97 Αυτή η τιμή επιστρέφεται στην CalculateFunctions και χρησιμοποιείται για τον υπολογισμό του συνολικού αποτελέσματος ανάλογα με την σχέση. Αντίστοιχα ο κώδικας για τα κουμπιά εντολών θα είναι Πίνακας 6. Ο κώδικας για τα κουμπιά επιλογών 1 private void btnfirst_click(object sender, EventArgs e) 2 { 3 CalculateFunctions(1); 4 } 5 6 private void btnsecond_click(object sender, EventArgs e) 7 { 14
8 CalculateFunctions(2); 9 } 10 11 private void btnthird_click(object sender, EventArgs e) 12 { 13 CalculateFunctions(3); 14 } Στο σώμα του κάθε κουμπιού καλείται την CalculateFunctions με τιμή παραμέτρου 1 ή 2 ή 3. 15