Εκφώνηση Να δημιουργήσετε ένα πρόγραμμα το οποίο θα δέχεται δύο ακεραίους αριθμούς έστω α και β και θα υπολογίζει το α υψωμένο στην δύναμη του β (α β ). Για παράδειγμα αν οι αριθμοί είναι το 2 και 4 το αποτέλεσμα είναι 16 (2 4 ) και υπολογίζεται 2*2*2*2. Δεν θα υπολογίζεται αρνητικές δυνάμεις.
Ε PI Abs Acos Asin Atan Atan2 BigMul Ceiling Cos Cosh DivRem Exp Floor Πίνακας 3. Η κλάση Math Η βάση των φυσικών λογαρίθμων Ο αριθμός π Επιστρέφει την απόλυτη τιμή του αριθμού Επιστρέφει τo τόξο συνημίτονου ενός αριθμού. Επιστρέφει τo τόξο ημίτονου ενός αριθμού. Επιστρέφει τo τόξο εφαπτομένης ενός αριθμού. Επιστρέφει τo τόξο εφαπτομένης του λόγου δύο αριθμών Υπολογίζει το γινόμενο δύο ακεραίων αριθμών. Επιστρέφει το μικρότερο ακέραιο αριθμό που είναι μεγαλύτερος ή ίσος στο συγκεκριμένο αριθμό. Επιστρέφει τo συνημίτονο ενός αριθμού. Επιστρέφει τo υπερβολικό συνημίτονο ενός αριθμού. Υπολογίζει το πηλίκο δύο αριθμών και επιστρέφει και το υπόλοιπο. Επιστρέφει το e υψωμένο στο συγκεκριμένο αριθμό Επιστρέφει το μεγαλύτερο ακέραιο αριθμό που είναι μικρότερος ή ίσος στο συγκεκριμένο αριθμό.
IEEERemainder Υπολογίζει το υπόλοιπο από την διαίρεση δύο αριθμών. Log Επιστρέφει το λογάριθμο ενός αριθμού. Log10 Επιστρέφει το λογάριθμο με βάση το 10 ενός αριθμού. Max Επιστρέφει το μεγαλύτερο μεταξύ δύο αριθμών. Min Επιστρέφει το μικρότερο μεταξύ δύο αριθμών. Pow Υπολογίζει την ύψωση ενός αριθμού σε ένα εκθέτη. Round Στρογγυλοποιεί την τιμή ενός αριθμού Sign Επιστρέφει -1, 0, 1 για να δείξει το πρόσημο ενός αριθμού Sin Επιστρέφει τo ημίτονο ενός αριθμού. Sinh Επιστρέφει τo υπερβολικό ημίτονο ενός αριθμού. Sqrt Επιστρέφει την τετραγωνική ρίζα ενός αριθμού. Tan Επιστρέφει την εφαπτομένη ενός αριθμού. Tanh Επιστρέφει την υπερβολική εφαπτομένη ενός αριθμού. Truncate Επιστρέφει το ακέραιο μέρος ενός αριθμού
Πίνακας 2. Ο κώδικας της εφαρμογής 1 private void btncalculate_click(object sender, EventArgs e) 2 { 3 int basi, ekthetis; 4 double apotelesma; 5 6 basi = int.parse(txtbasi.text); 7 ekthetis = int.parse(txtekthetis.text); 8 9 apotelesma = Math.Pow(basi, ekthetis); 10 txtapotelesma.text = apotelesma.tostring(); 11 }
Συναρτήσεις Η Pow θα πρέπει να πάρει δύο double αριθμούς (x και y) και θα επιστρέψει ένααποτέλεσμα τύπου double ηπρώτη λέξη πριν το όνομα της συνάρτησης. Θα μπορούσατε σε πολύ αφηρημένο επίπεδο να θεωρήσετε ότι η Pow είναι ένας μηχανισμός, όπως παρακάτω : Pow x y Αποτέλεσμα
Τα σημαντικά στοιχεία ενός Μηχανισμού Το όνομα του μηχανισμού γιατί μέσω αυτού θα χρησιμοποιήσω την λειτουργικότητα του. Είναι χρήσιμο τα ονόματα να δείχνουν την λειτουργικότητα του μηχανισμού, δηλαδή αν ο μηχανισμός υπολόγιζε το εμβαδόν ενός τριγώνου να είχε σαν όνομα, TriangleArea ή EmbadonTrigonou. Το πλήθος των παραμέτρων που χρειάζονται για να λειτουργήσει ομηχανισμός. Οι παράμετροι είναι οι είσοδοι στο μηχανισμό και αναφέρονται και σαν ορίσματα (arguments). Στην προκειμένη περίπτωση είναι δύο γιατί αυτό απαιτεί το πρόβλημα, μια βάση και έναν εκθέτη. Αν ένας άλλος μηχανισμός υπολόγιζε τον μικρότερο από 4 αριθμούς θα έπρεπε να είχε 4 εισόδους μια για κάθε έναν από τους τέσσερις αριθμούς.
Το είδος των παραμέτρων δηλαδή τι είναι η κάθε μια είσοδος, ακέραιος αριθμός, πραγματικός αριθμός, κείμενο κ.λπ. Αυτό καθορίζεται από το είδος του προβλήματος. Το είδος του αποτελέσματος δηλαδή τι είναι το τελικό αποτέλεσμα του μηχανισμού, ακέραιος αριθμός, πραγματικός αριθμός, κείμενο κ.λπ. Επίσης όπως προηγουμένως έτσι και αυτό καθορίζεται από το είδος του προβλήματος. Αν για παράδειγμα ένας μηχανισμός υπολογίζει το άθροισμα πραγματικών αριθμών τότε και το τελικό αποτέλεσμα θα είναι πραγματικός αριθμός.
Γιατί φτιάχνουμε συναρτήσεις Όλοι οι προγραμματιστές δημιουργούν τις δικές τους συναρτήσεις για τους εξής λόγους : Καλύτερη διαχείριση - Μια λειτουργία που αποτελεί την επίλυση ενός μέρους του προβλήματος, χρειάζεται σε πάρα πολλά διαφορετικά σημεία του προγράμματος. Για παράδειγμα, σε προηγούμενο πρόγραμμα με το πάτημα ενός κουμπιού υπολογίσατε το μικρότερο από τρεις αριθμούς. Εάν οσυγκεκριμένος υπολογισμός ήταν απαραίτητος και σε άλλο σημείο του προγράμματος θα έπρεπε να επαναλάβετε τις εντολές. Αυτή η τακτική είναι λάθος γιατί δημιουργεί μεγάλο κώδικα και προβλήματα στην διαχείριση του.
Ασφαλέστερος Κώδικας : Ηδιόρθωση ενός σφάλματος θα γίνει σε ένα σημείο και όχι σε πολλά διαφορετικά σημεία. Η τοποθέτηση των εντολών σε ένα μηχανισμό παρέχει καλύτερο έλεγχο του προβλήματος αφού κοινές λειτουργίες ομαδοποιούνται κάτω από το όνομα ενός μηχανισμού και δίνουν την δυνατότητα στο προγραμματιστή να εστιάζει στο πρόβλημα και όχι σε κάθε εντολή ξεχωριστά. Επαναχρησιμοποίηση - Χρήσιμες συναρτήσεις μπορούν να τοποθετηθούν σε μια βιβλιοθήκη και να χρησιμοποιηθούν από πολλά προγράμματα.
Άσκηση Να δημιουργήσετε μια συνάρτηση η οποία θα δέχεται τρεις πραγματικούς αριθμούς και θα επιστρέφει τον μικρότερο από όλους. Στοιχεία της συνάρτησης Το όνομα του μηχανισμού Το πλήθος των παραμέτρων CalculateMin Smaller MinThree Mikroteros 3 αριθμούς Το είδος των παραμέτρων Το είδος του αποτελέσματος Όλοι είναι πραγματικοί αριθμοί Πραγματικός αριθμός
Παράδειγματα χρήσης float k,m,n,f; k =2; m = 4; n = 7; f=minthree(k,m,n); k = MinThree(3, 5,7);.. k = MinThree(m,20, float.parse(txtone.text));
Άσκηση Να δημιουργήσετε μια συνάρτηση για τον υπολογισμό της βαθμολογίας ενός μαθητή, η οποία θα δέχεται έναν πραγματικό αριθμό οοποίος αντιστοιχεί στην βαθμολογία του μαθητή, και ανάλογα επιστρέφει τα παρακάτω μηνύματα : 8,5 έως 10 : Άριστα 7,5 έως 8.5 : Πολύ Καλά 6,0 έως 7.5 : Καλά 5,0 έως 6,0 : Μέτρια 0 έως 5 : Αποτυχία Σε οποιαδήποτε άλλη περίπτωση : Αριθμός εκτός ορίων
Στοιχεία της συνάρτησης Το όνομα του μηχανισμού Το πλήθος των παραμέτρων Το είδος των παραμέτρων Το είδος του αποτελέσματος ShowStudentMark CalcMark Bathmos 1 αριθμός πραγματικός αριθμός string (αλφαριθμητικό)
Άσκηση Να δημιουργήσετε μια συνάρτηση για τον υπολογισμό της φορολογίας, η οποία θα δέχεται έναν πραγματικό αριθμό ο οποίος αντιστοιχεί στο εισόδημα ενός πολίτη και επιστρέφει το φόρο όπως παρακάτω : Έως 1000 Ευρώ, ο φόρος είναι 0 Από 1000 μέχρι 2000 Ευρώ, ο φόρος είναι 200 Ευρώ. Από 2000 μέχρι 3000 ο φόρος είναι 15 % του εισοδήματος πέραν των 2000 Ευρώ Για μεγαλύτερα ποσά είναι 25 % του εισοδήματος, πέραν των 3000 Ευρώ
Στοιχεία της συνάρτησης Το όνομα του μηχανισμού Το πλήθος των παραμέτρων Το είδος των παραμέτρων Το είδος του αποτελέσματος CalculateTax Foros CalculateForos 1 αριθμός πραγματικός αριθμός πραγματικός αριθμός
Παράδειγμα Να δημιουργήσετε ένα πρόγραμμα το οποίο θα δέχεται δύο πραγματικούς αριθμούς έστω α και β και θα υπολογίζει ανάλογα με το κουμπί που θα πατήσετε τις παρακάτω σχέσεις : 1. (a 4 +b 4 )/b 2. a*(a 4 +b 4 ) 3. (a 4 +b 4 )/a
Από την εκφώνηση του προβλήματος φαίνεται ότι ησχέση 1. (a 4 +b 4 )/b χρησιμοποιείτε σε περισσότερους από έναν υπολογισμούς και για αυτό το λόγο είναι χρήσιμο να δημιουργήσετε μια συνάρτηση για τον υπολογισμό της. Πιθανά σημεία τοποθέτησης μιας νέας συνάρτησης
Για την δημιουργία της συνάρτησης θα πρέπει να σκεφτείτε ως εξής : Το όνομα του μηχανισμού ημαθηματική σχέση υπολογίζει το άθροισμα δύο αριθμών υψωμένων εις την τετάρτη. Το SumPowerFour ταιριάζει στην περιγραφή του προβλήματος. Οπότε γράφετε σε ένα από τα πιθανά σημεία τοποθέτησης της προηγούμενης διαφάνειας - π.χ. πάνω btnfirst_click - την λέξη SumPowerFour. Πρώτη φάση σύνταξης της SumPowerFour SumPowerFour
Το πλήθος των παραμέτρων Ησυγκεκριμένη λειτουργία χρειάζεται δύο πληροφορίες, τους αριθμούς a και β, για να υπολογίσει το αποτέλεσμα της σχέσης. Οπότε δίπλα στην λέξη SumPowerFour που γράψατε προηγουμένως - γράφετε μέσα σε παρενθέσεις (a, b). Όλες οι παράμετροι χωρίζονται μεταξύ τους με κόμμα. Υπάρχουν συναρτήσεις που δεν χρειάζονται παραμέτρους και σε αυτή την περίπτωση δεν θα γράφετε τίποτα μέσα στις παρενθέσεις. Το ονόματα των παραμέτρων δεν έχουν καμία σημασία εκτός από το να συσχετίζονται λογικά με το προς επίλυση πρόβλημα. Δεύτερη φάση σύνταξης της SumPowerFour SumPowerFour(a, b)
Το είδος των παραμέτρων Και οι δύο παράμετροι είναι πραγματικοί αριθμοί οπότε γράφετε την λέξη double πριν από την κάθε παράμετρο. Τρίτη φάση σύνταξης της SumPowerFour SumPowerFour(double a, double b) Το είδος του αποτελέσματος Το αποτέλεσμα του υπολογισμού είναι ένα πραγματικός αριθμός οπότε γράφετε την λέξη double πριν από το όνομα της συνάρτησης. Τέταρτη φάση σύνταξης της SumPowerFour double SumPowerFour(double a, double b)
H εργασία ολοκληρώνεται με την τοποθέτηση του ζεύγους των αγκίστρων, τα οποία θα περικλείουν τις εντολές που θα εκτελέσει ηsumpowerfour. Πέμπτη φάση σύνταξης της SumPowerFour double SumPowerFour(double a, double b) { }
Πίνακας 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 } Μπορείτε να χρησιμοποιήσετε όσες μεταβλητές θέλετε μέσα στο σώμα μιας συνάρτησης. Τα ονόματα που θα χρησιμοποιήσετε δεν έχει καμία σημασία αν χρησιμοποιούνται και σε άλλες συναρτήσεις γιατί αποκτούν υπόσταση μόλις ενεργοποιηθεί η συνάρτηση και παύει η δράση τους με το πέρας της συνάρτησης. Όλες οι μεταβλητές που ορίζονται μέσα στο σώμα μιας συνάρτησης ονομάζονται Τοπικές μεταβλητές (Local)
Πίνακας 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 } Μέσα στο σώμα μιας συνάρτησης αφού ολοκληρωθούν οι υπολογισμοί θα πρέπει να επιστραφεί το αποτέλεσμα. Η return χρησιμοποιείται για αυτό το λόγο.
Απόσπασμα ενός προγράμματος Το πέρασμα των παραμέτρων 2 3 Ηεπιστροφή του αποτελέσματος 97
Στην συνέχεια θα πρέπει στο σώμα των μεθόδων btnfirst, btnsecond και btnthird : 1. Να μετατρέψετε τις τιμές των txta και txtb σε πραγματικούς αριθμούς, 2. Να υπολογίσετε με την βοήθεια της SumPowerFour το αποτέλεσμα για την αντίστοιχη μαθηματική σχέση. 3. Να αποδώσετε το αποτέλεσμα στο 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.text); 7 nob = double.parse(txtb.text); 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.text = apot.tostring(); 26 } Από την συνάρτηση απουσιάζει η return και επίσης πριν το όνομα, υπάρχει η λέξη void. Όλες οι συναρτήσεις που δεν χρειάζεται να επιστρέψουν τιμή δηλώνονται σαν void.
Πίνακας 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 { 8 CalculateFunctions(2); 9 } 10 11 private void btnthird_click(object sender, EventArgs e) 12 { 13 CalculateFunctions(3); 14 }
Παράδειγμα Να δημιουργήσετε ένα πρόγραμμα έκδοσης λογαριασμού για ένα super market.
H λογική της εφαρμογής είναι να πληκτρολογείτε την περιγραφή ενός προϊόντος (π.χ. Μακαρόνια), την ποσότητα (π.χ. 2), την τιμή του (π.χ. 2,34) και πατώντας το πλήκτρο Επόμενο να εμφανίζετε ηαξία του προϊόντος δηλαδή 4,68. Μακαρόνια 2 2,34 4,68
Στο κώδικα της συνάρτησης btnnextproduct_click θα μετατρέψετε σε αριθμούς τα περιεχόμενα των κουτιών κειμένου txtposotita και txttimi και θα αποδώσετε το γινόμενο τους σε μια τοπική μεταβλητή τύπου double με το όνομα Αxia. Τέλος θα εμφανίσετε την τιμή της μεταβλητής Axia στο αντίστοιχο κουτί κειμένου.
Όμως εκτός από τα ανωτέρω θέλετε να διατηρείτε και το άθροισμα όλων των αξιών που υπολογίσατε ανάμεσα στα διαδοχικά πατήματα του κουμπιού Επόμενο και το σύνολο να εμφανίζετε στο κουτί με την ετικέτα Λογαριασμός. Για την υλοποίηση αυτής της λειτουργίας θα χρειαστείτε μια μεταβλητή τύπου double με όνομα Bill και αρχική τιμή 0 και με το πάτημα τουκουμπιού Επόμενο, ητιμή της Bill να αυξάνεται κατά τηντιμήτηςαξίας, δηλαδή Bill = Bill + Axia Επίσης με το πάτημα του κουμπιού btnnewcustomer ναμηδενίζειητιμή της Bill για να υπολογίσει το λογαριασμό του επόμενου πελάτη
Αν την Bill την δηλώσετε μέσα στην btnnextproduct_click όσες φορές και να πατήσετε το πλήκτρο Επόμενο οι τιμές των Αxia και Bill θα είναι οι ίδιες. Το πρόβλημα βρίσκεται στο ότι η μεταβλητή Bill είναι τοπική μεταβλητή για την btnnextproduct_click και αποκτά υπόσταση με το πάτημα του κουμπιού Επόμενο, οπότε κάθε φορά ξεκινά με την τιμή 0.
Η λύση είναι να ορίσετε την Bill έξω από το σώμα της συνάρτησης αλλά μέσα στο σώμα της κλάσης frmbill. Όλες οι μεταβλητές έξω από το σώμα μιας συνάρτησης ονομάζονται καθολικές (global) και αποκτούν υπόσταση καθ όλη την διάρκεια ζωής της κλάσης στην οποία εμπεριέχονται. 1 public partial class frmbill : Form 2 { 3 double Bill = 0; 4 5 public frmbill() 6 { 7 InitializeComponent(); 8 } 9 Πιθανά σημεία τοποθέτησης μιας καθολικής (global) μεταβλητής. 10 private void btnnextproduct_click(object sender, EventArgs e) 11 { 12 } 13 14 private void btnnewcustomer_click(object sender, EventArgs e) 15 { 16 } 17 18 }
Πίνακας 1. Ο κώδικας της εφαρμογής 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.text); 16 double timi = double.parse(txttimi.text); 17 double Αxia = posotita * timi; 18 Bill = Bill + Αxia; 19 txtaxia.text = Αxia.ToString(); 20 txtbill.text = Bill.ToString(); 21 }
23 void ClearFields() 24 { 25 txtproduct.text = ""; 26 txtposotita.text = ""; 27 txttimi.text = ""; 28 txtbill.text = ""; 29 txtaxia.text = ""; 30 } 31 32 private void btnnewcustomer_click(object sender, EventArgs e) 33 { 34 ClearFields(); 35 36 37 Bill = 0; 38 } 39 40 }
Nα επεκτείνετετην εφαρμογήώστενα υπολογίζετεκαι την είσπραξητης ημέρας :
Πίνακας 1. Ο κώδικας της εφαρμογής 4 public partial class frmbill : Form 5 { 6 double Bill = 0; 7 double Total = 0; 8 public frmbill() 9 { 10 InitializeComponent(); 11 } 12 13 private void btnnextproduct_click(object sender, EventArgs e) 14 { 15 double posotita = double.parse(txtposotita.text); 16 double timi = double.parse(txttimi.text); 17 double Αxia = posotita * timi; 18 Bill = Bill + Αxia; 19 txtaxia.text = Αxia.ToString(); 20 txtbill.text = Bill.ToString(); 21 }
23 void ClearFields() 24 { 25 txtproduct.text = ""; 26 txtposotita.text = ""; 27 txttimi.text = ""; 28 txtbill.text = ""; 29 txtaxia.text = ""; 30 } 31 32 private void btnnewcustomer_click(object sender, EventArgs e) 33 { 34 ClearFields(); 35 36 37 Bill = 0; 38 } 39 40 } Total = Total + Bill txttotal.text = Total.ToString()
Αποσφαλμάτωση (Debugging) Όσο τα προγράμματα μεγαλώνουν σε μέγεθος θα πρέπει να είστε ιδιαίτερα προσεκτικοί στην σύνταξη των εντολών. Τα σύγχρονα περιβάλλοντα προγραμματισμού διαθέτουν την λειτουργία της αποσφαλμάτωσης με σκοπό να δώσουν την δυνατότητα στο προγραμματιστή να ελέγξει τις τιμές των μεταβλητών αλλά και την ροή του προγράμματος κατά την ώρα της λειτουργίας του. Για παράδειγμα υποθέστε ότι στο προηγούμενο πρόγραμμα θέλατε να ελέγξετε τις τιμές των μεταβλητών όταν πατάτε το πλήκτρο Επόμενο.
Πατάτε δεξί πλήκτρο στο σημείο που επιθυμείτε την διακοπή εκτέλεσης του προγράμματος Αμέσως μετά εμφανίζετε μια κόκκινη γραμμή για να δηλώσει την ύπαρξη του Breakpoint
Πατήστε F5 για να τρέξετε την εφαρμογή σας και αφού πληκτρολογείστε τις τιμές της παρακάτω εικόνας εν συνεχεία πατήστε το πλήκτρο Επόμενο
Με το πάτημα του πλήκτρου εμφανίζετε ο κώδικας της εφαρμογής στο σημείο της διακοπής. Μια κίτρινη γραμμή και ένα βέλος στο αριστερό περιθώριο της σελίδας δείχνουν την τρέχουσα γραμμή εκτέλεσης του προγράμματος. Πηγαίνοντας το κέρσορα πάνω από μια μεταβλητή ή ένα αντικείμενο της φόρμας χωρίς να πατήσετε κάποιο πλήκτρο το περιβάλλον σας δείχνει την τιμή του. Στην εικόνα εμφανίζετε η τιμή του κουτιού κειμένου txtposotita.
Αν θέλετε να έχετε συνεχώς μπροστά σας ένα πίνακα με μια ή περισσότερες μεταβλητές ώστε να παρακολουθείτε τις εναλλαγές που συμβαίνουν στις τιμές τους, τότε πηγαίνετε το κέρσορα πάνω από την επιθυμητή μεταβλητή και αφού πατήσετε δεξί πλήκτρο επιλέξτε Add Watch.
Μετά την επιλογή Add Watch εμφανίζεται στο κάτω μέρος της οθόνης ένας πίνακας με το όνομα, την τιμή και το τύπο της μεταβλητής.
Για να προχωρήσετε στην επόμενη γραμμή του προγράμματος θα πρέπει να πατήσετε το πλήκτρο F10 ή F11. Η διαφορά μεταξύ τους είναι ότι το F11 εκτελεί την επόμενη γραμμή ενώ το F10 εκτελεί το επόμενο σύνολο εντολών. 23 void ClearFields() 24 { 25 txtproduct.text = ""; F11 Aν σε οποιαδήποτε γραμμή αντί 26 txtposotita.text = ""; F11 για F11 πατήσετε το συνδυασμό 27 txttimi.text = ""; Shift και F11 θα ολοκληρωθεί η F11 28 txtbill.text = ""; εκτέλεση των εναπομεινάντων F11 γραμμών της ClearFields και η 29 txtaxia.text = ""; συνέχεια θα είναι ηγραμμή 37. 30 } F11 31 32 private void btnnewcustomer_click(object sender, EventArgs e) 33 { F11 34 ClearFields(); 35 F10 36 37 Bill = 0; 38 } 39 40 }
Αν θέλετε να διαγράψετε ή να απενεργοποιήσετε το σημείο διακοπής τότεπατάτεδεξί πλήκτροπάνωτου οπουδήποτε στηνκόκκινηγραμμή - καιενσυνεχείαεπιλέγετε Breakpoint και Delete Breakpoint (διαγραφή) ή Disable Breakpoint (απενεργοποίηση).
Σε οποιαδήποτε στιγμή από το μενού Debug ή πατώντας το συνδυασμό των πλήκτρων Shift και F5 μπορείτε να διακόψετε την λειτουργία της αποσφαλμάτωσης. H αποσφαλμάτωση είναι μια χρονοβόρα διαδικασία αλλά και πολύτιμο εργαλείο για την διόρθωση σφαλμάτων και την κατανόηση της εκτέλεσης των εντολών του προγράμματος.
Παράδειγμα Να δημιουργήσετε ένα πρόγραμμα για τον υπολογισμού των θερμοκρασιών μιας εβδομάδας. Συγκεκριμένα το πρόγραμμα θαδιαβάζει 7 θερμοκρασίεςκαιθα υπολογίζει την μεγαλύτερη και την μικρότερη τιμή καθώς και το μέσο όρο τους. Να γράψετε την λέξη "Δευτέρα" ώστε να πληκτρολογήσει ο χρήστης την θερμοκρασία για πρώτη ημέρα της εβδομάδας.
Ηαρχική οθόνη της εφαρμογής Αποθηκεύετε ητιμή της θερμοκρασία στην μεταβλητή της Δευτέρας και στο πεδίο της ημέρας φαίνεται ητρίτη Μόλις συμπληρωθεί το πλήθος των επτά θερμοκρασιών τότε υπολογίζονται και εμφανίζονται ημικρότερη, ημεγαλύτερη και ομέσος όρος των θερμοκρασιών. float wk1, wk2, wk3, wk4, wk5, wk6, wk7; float mesos = (wk1 + wk2 + wk3 + wk4 + wk5 + wk6 + wk7) / 7; Φανταστείτε να υπολογίσετε τα ανωτέρω μεγέθη για ένα μήνα ή ένα έτος. Χρειάζεστε έναν πιο ευέλικτο τρόπο αποθήκευσης των τιμών.
Δημιουργία πίνακα Σε δύο βήματα ΤύποςΔεδομένων [] ΟνομαΠίνακα; και πριν χρησιμοποιήσετε ένα πίνακα θα πρέπει να δημιουργήσετε με την εντολή new τις αντίστοιχες θέσεις που θέλετε να έχει ο πίνακας : ΟνομαΠίνακα = new ΤύποςΔεδομένων[ ΠλήθοςΣτοιχείων]; Παράδειγμα float [] Week; Week = new float[7];
Σε ένα βήμα Οι ανωτέρω δηλώσεις μπορεί να γίνουν και σε ένα βήμα ΤύποςΔεδομένων [] ΟνομαΠίνακα = new ΤύποςΔεδομένων[ ΠλήθοςΣτοιχείων]; Παράδειγμα float [] Week = new float[7];
Ο πίνακας Week καταλαμβάνει στην μνήμη του υπολογιστή επτά συνεχόμενες θέσεις, εκ των οποίων ηκάθε μια μπορεί να αποθηκεύσει ένα δεκαδικό αριθμό και ηαρίθμηση τους ξεκινά από την θέση 0 μέχρι και την θέση 6. 0 1 2 3 4 5 6 Week Για να αποδώσετε τις τιμές 8.5 και 9.35 στην πρώτη και τέταρτη θέση αντίστοιχα θα πρέπει να γράψετε : Week[0] = 8.5; Week[3] = 9.35;
Μπορείτε να δώσετε τιμές στις θέσεις του πίνακα με οποιαδήποτε σειρά, δηλαδή δεν είναι υποχρεωτικό να δώσετε τιμή στην θέση 0 πριν δώσετε τιμή στην θέση 1. Αντίστοιχα για να αποδώσετε σε μια μεταβλητή k τύπου float την τιμή της τρίτης θέσης του πίνακα θα πρέπει να γράψετε : k= Week[2]; Ηαναφορά των θέσεων του πίνακα είτε για ανάγνωση είτε για εγγραφή, με μια ακέραια τιμή μέσα στις αγκύλες που υποδηλώνει την θέση στο πίνακα - διευκολύνει την διαχείριση τους με την βοήθεια των επαναλήψεων αφού ηίδια λειτουργία (ενέργεια) υλοποιείται σε όλες τις θέσεις του πίνακα.
Στην υλοποίηση του προγράμματος θα δηλώσετε σαν καθολική μεταβλητή ένα μετρητή, ο οποίος θα χρησιμοποιηθεί σαν δείκτης στο πίνακα Week και με την έναρξη της εφαρμογής θα πάρει την τιμή 0 για να δηλώσετε ότι η θερμοκρασία που θα πληκτρολογήσετε θα αποδοθεί στην πρώτη ημέρα και κάθε φορά που θα πατάτε το πλήκτρο Επόμενη θα αυξάνει την τιμή του κατά 1 μέχρι και το 6 γιατί αυτή είναι η μέγιστη τιμή που μπορεί να λάβει στα πλαίσια του προγράμματος.
Η DisplayDay είναι μια συνάρτηση ή οποία δέχεται σαν παράμετρο μια ακέραια τιμή που αντιστοιχεί σε μια ημέρα της εβδομάδας και επιστρέφει το όνομα της αντίστοιχης ημέρας. if(day == 1) { grday = Deytera ; } else if(day == 2) { grday = Trith ; }
Στο σώμα της btnnext_click γίνεται έλεγχος αν η τιμή του μετρητή noday είναι μικρότερη από 7 και αν ναι τότε αποθηκεύει την τιμή της θερμοκρασίας στο πίνακα Week, αυξάνει το μετρητή κατά 1, καθαρίζει το πεδίο της θερμοκρασίας και εμφανίζει το όνομα της τρέχουσας ημέρας στο κουτί κειμένου txtday.
Βελτιστοποίηση του κώδικα
H C# - όπως και σχεδόν όλες οι γλώσσες προγραμματισμού - δεν επιτρέπει την μαζική απόδοση τιμών σε ένα πίνακα εκτός από την αρχικοποίηση του, όπου μέσα σε άγκιστρα δηλώνετε τις τιμές του πίνακα χωρίζοντας με κόμμα: Επιτρεπόμενη ενέργεια string []DayNames = new string[7];... DayNames[0] = "Δευτέρα"; DayNames[1] = "Τρίτη";... Μη Επιτρεπόμενη ενέργεια string []DayNames = new string[7];... DayNames = {"Δευτέρα","Τρίτη"};... Απόδοση τιμών μία προς μια στις θέσεις του πίνακα ΔΕΝ μπορείτε να κάνετε μαζική απόδοση τιμών εκτός από την στιγμή της αρχικοποίησης του πίνακα.
Δημιουργία πίνακα και μαζική απόδοση τιμών ΤύποςΔεδομένων [] ΟνομαΠίνακα = new ΤύποςΔεδομένων[ΠλήθοςΣτοιχείων] { τιμή_πρώτης_θέσης, τιμή_δεύτερης_θέσης,...};
Δημιουργία πίνακα και μαζική απόδοση τιμών Κατά την αρχικοποίηση του πίνακα με τιμές δεν είναι απαραίτητο να δηλώσετε το πλήθος των θέσεων αφού ηc# θα διαβάσει τις τιμές μέσα στα άγκιστρα και θα δημιουργήσει τις αντίστοιχες θέσεις στο πίνακα. ΤύποςΔεδομένων [] ΟνομαΠίνακα = { τιμή_πρώτης_θέσης, τιμή_δεύτερης_θέσης,...};
Στην DisplayDay αντί να χρησιμοποιήσετε την δήλωση switch θα μπορούσατε να χρησιμοποιήσετε ένα πίνακα που θα αρχικοποιηθεί με τα ονόματα των ημερών της εβδομάδας.
Οι εντολές για τον υπολογισμό της μικρότερης, της μεγαλύτερης καθώς και του μέσου όρου των τιμών του πίνακα. εμπεριέχονται μέσα στη btncalculate_click και επιπλέον αναφέρονται συγκεκριμένα μόνο στο πίνακα Week οπότε δεν είναι δυνατόν ηεπαναχρησιμοποίηση του κώδικα για τον υπολογισμό αυτών των μεγεθών σε ένα άλλο πίνακα με πραγματικές τιμές. Θα ήταν καλύτερα να δημιουργήσετε συναρτήσεις για τον υπολογισμό τους.
Πρώτη Πρακτική Θα μπορούσατε να κατασκευάσετε τρεις ξεχωριστές συναρτήσεις μια για τον υπολογισμό της μικρότερης τιμής, μια για τον υπολογισμό της μεγαλύτερης τιμής και μια για τον υπολογισμό του μέσου όρου των τιμών του πίνακα. Για την κατασκευή τους θα πρέπει να σκεφτείτε με τον ίδιο τρόπο αφού η υλοποίηση τους ομοιάζει αρκετά : 1. Το όνομα της συνάρτησης που θα χρησιμοποιήσετε για τον υπολογισμό της κάθε εργασίας. Για παράδειγμα τα ονόματα CalcMin, CalcMax και CalcAvg δηλώνουν με σαφήνεια τους υπολογισμούς που επιτελούνται στις αντίστοιχες συναρτήσεις. 2. Το πλήθος των παραμέτρων που χρειάζεται για να λειτουργήσει ομηχανισμός και στην προκειμένη περίπτωση είναι μόνο οπίνακας με τις τιμές των θερμοκρασιών.
3. Το είδος των παραμέτρων όπου στη συγκεκριμένη περίπτωση είναι ένας πίνακας με πραγματικές τιμές. 4. Το είδος του αποτελέσματος όπου και για τις τρεις συναρτήσεις είναι ένας πραγματικός αριθμός. Δεν χρειάζεται να γνωρίζετε το μέγεθος του πίνακα αφού η μέθοδος Length επιστρέφει το πλήθος των στοιχείων του πίνακα.
Η δημιουργία των συναρτήσεων CalcMin, CalcMax και CalcAvg μπορούν να χρησιμοποιηθούν σε οποιοδήποτε σημείο του προγράμματος και με οποιοδήποτε πίνακα πραγματικών αριθμών.... float [] pin = new float[50]; pin[0] = float.parse(textbox1.text);.. pin[49] = 67; float f = CalcMin(pin); Δήλωση πίνακα Αποθήκευση τιμών στο πίνακα Κάλεσμα της CalcMin με παράμετρο το πίνακα pin
Δεύτερη Πρακτική Θα μπορούσατε να κατασκευάσετε μία συνάρτηση για τον υπολογισμό της μικρότερης τιμής, της μεγαλύτερης τιμής και του μέσου όρου των τιμών του πίνακα, ταυτόχρονα. Όπως γνωρίζετε μέχρι τώρα, μια συνάρτηση μπορεί να επιστρέφει (με την return) ή όχι (είναι void) μια τιμή. Για να επιστρέψετε περισσότερες τιμές θα πρέπει να τις βάλετε στις παραμέτρους εισόδου με το πρόθεμα out ή ref
H δήλωση οut στις παραμέτρους εισόδου σημαίνει ότι οι συγκεκριμένες μεταβλητές θα πάρουν υποχρεωτικά τιμή μέσα στο σώμα της συνάρτησης και ότι αυτές τις τιμές θα τις διατηρήσουν και με το πέρας της εκτέλεσης της συνάρτησης.
Στις συναρτήσεις διακρίνουμε δύο τρόπους με τις οποίες τις καλούμε : Κλήση με τιμή (call by value) void CallByValue(int x) { x = 34; } private void button1_click(object sender, EventArgs e) { int y; Στο σώμα της CallByValue ητιμή για την x θα είναι 34 αλλά με το πέρας αυτής για την y = 5; y δεν έχει καμία επίπτωση αφού παραμένει 5 όπως και πριν από την κλήση της CallByValue(y); συνάρτησης. Άρα οι αλλαγές των μεταβλητών στο σώμα της συνάρτησης textbox1.text = y.tostring(); δεν έχουν επίπτωση για τις μεταβλητές } του προγράμματος που κάλεσε την συνάρτηση.
Κλήση με αναφορά (call by reference) void CallByRef(ref int x) { x = 34; } Τα ονόματα των μεταβλητών δεν έχουν καμία σημασία. Εκείνο που πρέπει να προσέχουμε είναι αν υπάρχει η λέξη ref ή out πριν από το όνομα της μεταβλητής. private void button1_click(object sender, EventArgs e) { int y; y = 5; CallByRef(ref y); } textbox1.text = y.tostring(); Προσοχή η λέξη ref πρέπει να υπάρχει και στη συνάρτηση και στην κλήση.
Κλήση με αναφορά (call by reference) Εναλλακτικά void CallByRef(out int x) { x = 34; } Ηδιαφορά με την ref είναι ότι : α) στην out δεν χρειάζεται ημεταβλητή να έχει πάρει τιμή και β) θα πρέπει υποχρεωτικά να πάρει τιμή μέσα στο σώμα της συνάρτησης. private void button1_click(object sender, EventArgs e) { int y; y = 5; CallByRef(out y); } textbox1.text = y.tostring(); Προσοχή η λέξη out πρέπει να υπάρχει και στη συνάρτηση και στην κλήση.
Αφού μπορείτε να αλλάξετε τις τιμές των μεταβλητών μετά την κλήση μιας συνάρτησης - με την χρήση των λέξεων ref ή out έχετε κατά συνέπεια την δυνατότητα από μια συνάρτηση να επιστρέψετε πολλά αποτελέσματα μόνο που οι μεταβλητές που θα αποθηκεύσουν το αποτέλεσμα θα πρέπει να περάσουν σαν είσοδοι στην συνάρτηση.
Δημιουργείστε μια συνάρτηση για τον υπολογισμό του αθροίσματος δύο ακεραίων αριθμών. Τοκάλεσμα της συνάρτησης θα πρέπει να γίνει voidcalcsumα(intx, inty, out intapot) { apot = x + y; } int CalcSumΒ(int x, int y) { return (x + y); } int apot; x = 3; CalcSumA(2,3,out apot); H apot έχει τιμή 5 Το κάλεσμα της συνάρτησης θα πρέπει να γίνει int apot; apot = CalcSumΒ(2,3); H apot έχει τιμή 5
Δημιουργείστε μια συνάρτηση για τον υπολογισμό της πρόσθεσης, αφαίρεσης και πολλαπλασιασμού μεταξύ δύο ακεραίων αριθμών. void CalcSumΑ(int x, int y, out int apot1, out int apot2, out int apot3) { } apot1 = x + y; apot2 = x - y; apot3 = x * y; Το κάλεσμα της συνάρτησης θα πρέπει να γίνει int x, y, z; CalcSumA(2,3,x, y, z); H x έχει τιμή 5, η y έχει -1, η z έχει 6
Στους πίνακες που έχουν στοιχεία δεν έχει σημασία αν χρησιμοποιήσουμε ref ή out γιατί πάντα η κλήση τους γίνεται με αναφορά : void CallByValue(int [] x) { x[0] = 34; x[1] = 23; } private void button1_click(object sender, EventArgs e) { int[] y = { 3, 7 }; CallByValue(y); } textbox1.text = y[0].tostring() + " " + y[1].tostring();
Στους πίνακες που δεν έχουν δημιουργηθεί τότε έχει σημασία αν χρησιμοποιήσουμε ref ή out. Για παράδειγμα να δημιουργήσετε μια συνάρτηση που δημιουργεί θέσεις για ένα πίνακα και τους αρχικοποιεί με συγκεκριμένη τιμή. void CallByValue(out int [] x, int n, int val) { x = new int[n]; for (int i = 0; i < n; i++) { x[i] = val; } } private void button1_click(object sender, EventArgs e) { int[] y; CallByValue(out y, 2, 104); } textbox1.text = y[0].tostring() + " " + y[1].tostring();