Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων 1
Είσοδος/Έξοδος Είσοδος/Έξοδος ανάλογα με τον τύπο του προγράμματος Πρόγραμμα γραμμής εντολών από το τερματικό της γραμμής εντολών Πρόγραμμα οπτικού προγραμματισμού από γραφικά στοιχεία (input-box, output-label, ) Πρόγραμμα σε περιβάλλον φυλλομετρητή από γραφικά στοιχεία εισόδου/εξόδου αλλά και απλά στοιχεία HTML (Παράδειγμα1, Παράδειγμα2) έξοδος και στην κονσόλα (console) του φυλλομετρητή Είσοδος Πρόγραμμα Έξοδος 2
Μεταβλητές Κουτιά στη μνήμη που έχει παραχωρηθεί για την εκτέλεση του προγράμματος Ταυτοποιούνται από το όνομά τους Χαρακτηρίζονται από τον τύπο δεδομένων και την τιμή τους Βασική πράξη εκχώρησης (ή ανάθεσης) τιμής σε μεταβλητή: <όνομα_μεταβλητής> = <τιμή> 3
Τύποι μεταβλητών JS Γλώσσα με δυναμικούς τύπους μεταβλητών: ο τύπος της μεταβλητής δεν ορίζεται κατά τη δήλωσή της αλλάζει δυναμικά και καθορίζεται από τον τύπο της τιμής εκχώρησης Βασικοί (primitive) τύποι μεταβλητών αριθμός (number -- πραγματικός αριθμός διπλής ακρίβειας των 8 bytes) αλφαριθμητικό ή συμβολοσειρά (string) δυαδικής τιμής (boolean με τιμές true και false) O τελεστής typeof επιστρέφει ως αλφαριθμητικό τον τύπο μεταβλητών. 4
Τελεστές/Πράξεις και Προτεραιότητα Συνένωσης αλφαριθμητικών (+) Ανάθεσης (=, +=, -=, *=, /=) Αριθμητικές (+,-,*,/, %, **, ++x, --x, x++, x--) Συγκρίσεις (>, <, >=, <=, ==,!= αλλά και ===,!==) Λογικές (&&,,!) Προτεραιότητα πράξεων σε εκφράσεις Υψηλότερη προτεραιότητα έχουν οι παρενθέσεις Χαμηλότερη οι πράξεις ανάθεσης Πράξεις ίσης προτεραιότητας εκτελούνται από αριστερά προς τα δεξιά. Εκφράσεις εντός παρενθέσεων υπολογίζονται πλήρως πριν η τιμή τους χρησιμοποιηθεί στην υπόλοιπη έκφραση. 5
Μετατροπές μεταξύ τύπων (1/ 2) Στη JS (και σε άλλες γλώσσες με ασθενείς τύπους): επιτρέπεται η επιτυχής εκτέλεση μιας πράξης που οι όροι της δεν έχουν λογικά συμβατούς τύπους γίνεται έμμεσα μετατροπή τύπων ο τύπος του αποτελέσματος ορίζεται από κανόνες που αφορούν και τους δύο όρους μιας πράξης Πράξη + εάν τουλάχιστον ο ένας από τους 2 όρους είναι αλφαριθμητικό (συμβολοσειρά) μετατροπή του άλλου όρου σε αλφαριθμητικό και το αποτέλεσμα είναι συνένωση των 2 αλφαριθμητικών, αλλιώς η πράξη είναι η πρόσθεση αριθμών Πρόσθεση αριθμών και υπόλοιπες αριθμητικές πράξεις έμμεση μετατροπή των μή αριθμητικών όρων σε αριθμούς Συγκρίσεις εάν ο ένας από τους 2 όρους είναι αριθμός έμμεση μετατροπή του άλλου όρου σε αριθμό 6
Μετατροπές μεταξύ τύπων (2/2) Αλγόριθμος έμμεσης μετατροπής συμβολοσειράς σε αριθμό: εάν η συμβολοσειρά είναι αριθμητική μετατρέπεται στην αριθμητική τιμή της, αλλιώς εάν είναι η κενή συμβολοσειρά ή μόνο λευκοί χαρακτήρες, μετατρέπεται στην τιμή 0, αλλιώς μετατρέπεται σε NaN (Not a Number) Αριθμητική πράξη με NaN έχει ως αποτέλεσμα NaN Σύγκριση αριθμού με NaN επιστρέφει πάντα false Μετατροπή boolean σε αριθμό: false 0 true 1 Για να εξασφαλιστεί το σωστό αποτέλεσμα, οι μεταβλητές πρέπει να μετατρέπονται στο σωστό τύπο πριν από την πράξη. 7
Έλεγχος αριθμητικής (ή μη) συμβολοσειράςστη JS Σε πολλές περιπτώσεις χρειάζεται να ελεγχθεί κατά πόσο μια συμβολοσειρά είναι (ή όχι) αριθμός (π.χ. είσοδος αριθμού από το χρήστη). Σε πολλές γλώσσες προγραμματισμού (π.χ. VisualBasic) ο έλεγχος αυτός έχει υλοποιηθεί ως μια (καλά ορισμένη) συνάρτηση που δέχεται ως παράμετρο τη συμβολοσειρά και επιστρέφει αληθές, αν και μόνο αν αυτή είναι αριθμητική. Στη JavaScript δεν υπάρχει μια εκ των προτέρων ορισμένη συνάρτηση με αυτή τη λειτουργικότητα χρειάζεται επομένως να γραφεί μια συνθήκη c που θα δίνει true όταν η συμβολοσειρά είναι αριθμός και false αλλιώς. 8
Έλεγχος αριθμητικής (ή μη) συμβολοσειράς στη JS Έχοντας ως δεδομένη τη συμβολοσειρά strnum και λαμβάνοντας υπόψη ότι : ο αλγόριθμος έμμεσης μετατροπής συμβολοσειράς σε αριθμό μπορεί να εφαρμοστεί (άμεσα) με κλήση της συνάρτησης number Number(string) και η συνάρτηση boolean isnan(number) επιστρέφει true εάν το όρισμά της είναι NaN, η συνθήκη θα μπορούσε να είναι η εξής: var num = Number(strNum); var c =! isnan(num); δηλ. η c γίνεται αληθής όταν η Number() επιστρέφει αριθμό και ψευδής όταν η Number() επιστρέφει NaN. 9
Έλεγχος αριθμητικής (ή μη) συμβολοσειράς στη JS Επειδή η συνάρτηση boolean isfinite(string) όταν κληθεί με παράμετρο strnum, επιστρέφει true όταν η Number(strNum) επιστρέφει αριθμό και false όταν η Number(strNum) επιστρέφει NaN, ο κώδικας var num = Number(strNum); var c =! isnan(num); είναι ισοδύναμος με την εντολή var c = isfinite(strnum); 10
Έλεγχος αριθμητικής (ή μη) συμβολοσειράς στη JS Στο παρακάτω παράδειγμα-κώδικα: 1 var num = Number( 12.3 ); // num 12.3 2 num = Number( John ); // num NaN 3 num = Number( 12.3a ); // num NaN 4 num = Number( 12 3 ); // num NaN 5 num = Number( ); // num 0 6 num = Number( ) // num 0 η Number() δίνει σωστό αποτέλεσμα στις περιπτώσεις αλφαριθμητικών των εντολών 1-4, αλλά δίνει λάθος αποτέλεσμα (0 ενώ η συμβολοσειρά δεν είναι αριθμός) για τις 5, 6 11
Έλεγχος αριθμητικής (ή μη) συμβολοσειράς στη JS Εναλλακτικά, η μετατροπή συμβολοσειράς σε αριθμό μπορεί να γίνει με κλήση της συνάρτησης number parsefloat(string) Η parsefloat() δεν ακολουθεί τον αλγόριθμο έμμεσης μετατροπής συμβολοσειράς σε αριθμό. Παράδειγμα 1 var num = parsefloat( 12.3 ); // num 12.3 2 num = parsefloat( John ); // num NaN 3 num = parsefloat( 12.3a5 ); // num 12.3 4 num = parsefloat( 12 3 ); // num 12 5 num = parsefloat( ); // num NaN 6 num = parsefloat( ) // num NaN Η parsefloat() δίνει σωστό αποτέλεσμα στις περιπτώσεις αλφαριθμητικών των εντολών 1-2, 5-6, αλλά δίνει λάθος αποτέλεσμα για τις 3, 4 (επιστρέφει αριθμό ενώ θα έπρεπε να επιστρέφει NaN). 12
Έλεγχος αριθμητικής (ή μη) συμβολοσειράς στη JS Συνδυάζοντας το αποτέλεσμα των 2 συναρτήσεων μετατροπής, ως εξής: 1 var numn = Number(strNum); 2 var numpf = parsefloat(strnum); 3 var c =! isnan(numpf) &&!isnan(numn); η συνθήκη c γίνεται αληθής όταν και μόνο όταν και οι 2 συναρτήσεις επιστρέφουν αριθμό, αλλιώς (δηλ. αν τουλάχιστο μία από τις 2 επιστρέψει NaN) η συνθήκη είναι ψευδής, που είναι και το ζητούμενο σύμφωνα με τα παραδείγματα. Αντικαθιστώντας τη γραμμή 1 και τον έλεγχο!isnan(numn) στη γραμμή 3, με την ισοδύναμη κλήση της isfinite(), προκύπτει ο τελικός κώδικας ελέγχου: var num = parsefloat(strnum); var c =! isnan(num) && isfinite(strnum); 13
Σύνδεσμοι Παράδειγμα ελέγχου μετατροπής συμβολοσειράς σε αριθμό. Φροντιστήριο w3schools Εντολές Μεταβλητές Αριθμητικές Πράξεις Τύπος Δυαδικών Τιμών (τύπος boolean) Συγκρίσεις και Λογικοί Τελεστές 14