Τελεστές Αριθμητικοί, Συγκριτικοί και Λογικοί
Στην PASCAL υπάρχουν τριών ειδών τελεστές. Θα ξεκινήσουμε από τους βασικούς τελεστές και θα εμπλουτίζουμε σιγά-σιγά τις γνώσεις μας για αυτούς.
Τι είναι τελεστής(operator);
Είναι ένα ειδικό σύμβολο που χρησιμοποιούμε για να δηλώσουμε μια επεξεργασία.
Αριθμητικοί Τελεστές
Οι αριθμητικοί τελεστές της Pascal είναι οι εξής :
Τελεστής | Πράξη | Μοναδιαίος | Τύποι Τελεστέων | Αποτέλεσμα |
+ | Πρόσθεση | Ναι | real ή integer | real ή integer |
– | Αφαίρεση | Ναι | real ή integer | real ή integer |
* | Πολλαπλασιασμός | Όχι | real ή integer | real ή integer |
/ | Πραγματική διαίρεση | Όχι | real ή integer | real |
div | Πηλίκο ακέραιης διαίρεσης | Όχι | integer | integer |
mod | Υπόλοιπο ακέραιης διαίρεσης | Όχι | integer | integer |
Όλοι οι τελεστές είναι δυαδικοί (δέχονται 2 τελεστέους). Χρησιμοποιήσουμε τον τελεστή – για να δηλώσουμε έναν αρνητικό αριθμό και παρόμοια μπορούμε να χρησιμοποιήσουμε τον τελεστή + για να δηλώσουμε έναν θετικό αριθμό. Αυτοί οι 2 αριθμητικοί τελεστές εκτός από δυαδικοί είναι και μοναδιαίοι (δέχονται ένα τελεστέο).
Δεν είναι σωστό να χρησιμοποιούμε δύο τελεστές δίπλα-δίπλα, όπως εδώ :
some_real := 37.5 * –2;
Η Pascal θα μπερδευτεί γιατί δεν θα γνωρίζει αν θα πρέπει να κάνει πολλαπλασιασμό ή αφαίρεση. Για να αποφεύγουμε κάποιες τέτοιες αμφιβολίες, πρέπει να χρησιμοποιούμε παρενθέσεις, ως εξής :
some_real := 37.5 * (-2);
Προταιρεότητες
Ο υπολογιστής χρησιμοποιεί την εξής σειρά προτεραιότητας στις αριθμητικές πράξεις :
- Πολλαπλασιασμός
- Πραγματική διαίρεση
- Πηλίκο ακέραιης διαίρεσης
- Υπόλοιπο ακέραιης διαίρεσης
- Πρόσθεση
- Αφαίρεση
Οι υπολογισμοί σε μια αριθμητική έκφραση γίνονται σύμφωνα με τους εξής κανόνες προτεραιότητας :
- Πρώτα υπολογίζονται όλες οι εκφράσεις που βρίσκονται μέσα σε παρενθέσεις, ξεκινώντας από την πιο εσωτερική παρένθεση και συνεχίζοντας προς την πιο εξωτερική.
- Μετά γίνονται όλοι οι πολλαπλασιασμοί και οι διαιρέσεις, με σειρά από αριστερά προς τα δεξιά.
- Μετά γίνονται όλες οι προσθέσεις και οι αφαιρέσεις, με σειρά από αριστερά προς τα δεξιά.
Έτσι, για παράδειγμα, η τιμή της έκφρασης 3.5 * (2 + 3) θα είναι ίση με 17.5. Δηλαδή γίνεται πρώτα η πράξη της πρόσθεσης μέσα στην παρένθεση και μετά ο πολλαπλασιασμός ενώ η τιμή της έκφρασης 3.5 * 2 + 3 θα είναι ίση με 10.
Όπως φαίνεται στον παραπάνω πίνακα οι τελεστές div και mod εργάζονται μόνο με ακέραιες τιμές. Ο τελεστής / εργάζεται και με ακέραιες και με πραγματικές τιμές αλλά έχει πάντα ως αποτέλεσμα μια πραγματική τιμή. Οι υπόλοιποι τελεστές εργάζονται και με ακέραιες και με πραγματικές τιμές. Για τους τελεστές που δέχονται και ακέραιες και πραγματικές τιμές, το αποτέλεσμα θα είναι ακέραιος αριθμός μόνο αν όλοι οι τελεστέοι είναι ακέραιοι, ενώ θα είναι πραγματικός αριθμός αν έστω και ένας από τους τελεστέους είναι πραγματικός.
Έτσι, το αποτέλεσμα της παρακάτω πράξης
3857 + 68348 * 38 div 56834
θα είναι ακέραιος αριθμός (integer)
ενώ το αποτέλεσμα της παρακάτω πράξης
38573 div 34739 mod 372 + 35730 – 38834 + 1.1
θα είναι πραγματικός αριθμός, επειδή ο 1.1 είναι πραγματικός.
Συγκριτικοί Τελεστές
Με αυτούς μπορείς να φτιάχνεις συνθήκες ελέγχου π.χ. την If …. then …. else …
Οι συνθήκες που φτιάχνεις έχουν δυο πιθανά αποτελέσματα true ή false.
- = Ίσον
- <> Διάφορο
- < Μικρότερο
- > Μεγαλύτερο
- >= Μεγαλύτερο ίσο
- <= Μικρότερο ίσο
Λογικοί τελεστές (Boolean operators)
- AND λογικό ΚΑΙ
- OR λογικό Ή
- NOT αντιστρέφει την τιμή true σε false και την false σε true
Αυτοί οι τελεστές χρησιμοποιούνται εάν θέλουμε μία συνθήκη να ισχύει για έναν ή περισσότερους λόγους. Για παράδειγμα εάν θέλουμε να εκτελείται μία εντολή εάν το bmi είναι πάνω από 19 ΚΑΙ ΣΥΓΧΡΟΝΩΣ κάτω από το 25, γράφουμε αυτό:
if (bmi>19) and (bmi<25) then ...
Τελεστής Ανάθεσης- Εκχώρησης τιμής
:= Τελεστής Ανάθεσης- Εκχώρησης τιμής (assignment operator)
Ο τελευταίος αυτός τελεστής έχει τεράστια σημασία και δεν έχει καμία απολύτως σχέση με ισότητα!
Ο τελεστής αυτός παίρνει το περιεχόμενο που υπάρχει δεξιά του και το αναθέτει σε ότι υπάρχει αριστερά του.
ΔΕΝ ΦΤΙΑΧΝΕΙ ΣΕ ΚΑΜΙΑ ΠΕΡΙΠΤΩΣΗ ΣΥΝΘΗΚΕΣ!
Αναλυτικότερα για την εκχώρηση τιμών σε μεταβλητές είναι η επόμενη ενότητα.
Εκχωρήσεις
Εφόσον έχουμε δηλώσει μια μεταβλητή, μπορούμε να αποθηκεύσουμε κάποια τιμή σ’ αυτήν. Η διαδικασία απόδοσης τιμής σε μια μεταβλητή αποκαλείται εκχώρηση (assignment). Για να εκχωρήσουμε μια τιμή σε μια μεταβλητή, χρησιμοποιούμε την εξής σύνταξη :
όνομα_μεταβλητής := έκφραση;
Αντίθετα μ’ άλλες γλώσσες προγραμματισμού, όπου ο τελεστής εκχώρησης είναι απλά το σύμβολο =, η Pascal χρησιμοποιεί τα σύμβολα :=. Ένας βασικός λόγος για τη χρήση και του συμβόλου : στην εκχώρηση των τιμών είναι για να μην μπερδεύουν οι αρχάριοι χρήστες της γλώσσας την εκχώρηση τιμής με τη σύγκριση δύο τιμών.
Επίσης, ο συμβολισμός := θυμίζει το σχήμα του συμβόλου ß (βελάκι) και κάνει έτσι πιο κατανοητή την διαδικασία απόδοσης (εκχώρησης) μιας τιμής από τις πράξεις που γίνονται στο δεξί μέρος (έκφραση) και την καταχώρηση του αποτελέσματος στο αριστερό μέρος (μεταβλητή).
Η έκφραση (expression) μπορεί να είναι μία μόνο τιμή :
apotelesma := 385.385837;
ή μπορεί να είναι μια πολύπλοκη αριθμητική παράσταση :
apotelesma := 37573.5 * 37593 + 385.8 / 367.1;
Να θυμάμαι:
Η κάθε μεταβλητή μπορεί να πάρει μόνο τιμές του ίδιου τύπου δεδομένων μ’ αυτήν. Αυτό σημαίνει ότι δεν μπορούμε να εκχωρήσουμε μια πραγματική τιμή σε μια ακέραια μεταβλητή. Όμως, ορισμένοι τύποι δεδομένων είναι συμβατοί μ’ άλλους και στις περιπτώσεις αυτές μπορούμε να εκχωρήσουμε μια τιμή ενός κατώτερου τύπου δεδομένων σε μια μεταβλητή ενός ανώτερου τύπου δεδομένων.
Αυτό συμβαίνει συνήθως όταν εκχωρούμε ακέραιες τιμές σε πραγματικές μεταβλητές.
Για παράδειγμα, αν έχουμε την παρακάτω δήλωση μεταβλητών :
var
some_int : integer;
some_real : real;
Τότε, όταν εκτελεσθούν οι παρακάτω εντολές :
some_int := 375;
some_real := some_int;
η μεταβλητή some_real θα έχει την τιμή 375.0 ή 3.75e2.
Παράδειγμα κώδικα με χρήση μεταβλητής BOOLEAN:
program exBoolean; var exit: boolean; choice: char; begin writeln('Do you want to continue? '); writeln('Enter Y/y for yes, and N/n for no'); readln(choice); if(choice = 'n') then exit := true else exit := false; if (exit) then writeln('Good Bye!') else writeln('Please Continue'); readln; end.