Μαθαίνοντας την JAVA – Μέρος 7

Post Pic
στις 02.11.09. Kατηγορίες Java με Κανένα Σχόλιο

Στο προηγούμενο βοήθημα μάθαμε περισσότερα για τις μεταβλητές και τις χρήσεις τους στα προγράμματα μας. Στο σημερινό βοήθημα, θα δούμε τους αριθμητικούς τελεστές και τους τελεστές αύξησης και μείωσης που υπάρχουν στη Java καθώς και τις ιδιαιτερότητες τους όπου αυτό χρειάζεται.

Οι Αριθμητικοί Τελεστές στη Java

Οι αριθμητικοί τελεστές που υπάρχουν στην Java, περιλαμβάνουν όλους τους γνωστούς τελεστές αριθμητικών πράξεων δηλαδή πρόσθεσης (+), αφαίρεσης (-), πολλαπλασιασμού (*), διαίρεσης (/) και υπολοίπου ή modulo (%). Ας δούμε αυτούς τους τελεστές στον πιο κάτω πίνακα.

lesson07-01

Χρησιμοποιώντας δηλαδή τους πιο πάνω τελεστές, μπορούμε να φτιάξουμε αριθμητικές προτάσεις και να δώσουμε τιμές στις μεταβλητές μας, κάπως έτσι:

int x
x = 5 + 5;

Μετά την εκτέλεση της πιο πάνω πρότασης, η τιμή της μεταβλητής x θα είναι 10.

Μπορούμε επίσης να εκτελέσουμε και πιο σύνθετες προτάσεις, οι οποίες να περιλαμβάνουν περισσότερους από ένα τελεστές, όπως για παράδειγμα:

Θέλουμε να υπολογίσουμε την τελική τιμή ενός προϊόντος, του οποίου η τιμή πώλησης χωρίς ΦΠΑ είναι 200 ευρώ. Το ποσοστό του ΦΠΑ είναι 19%.

double finalPrice;
finalPrice = 200 * (1 + 19/100);

Μετά την εκτέλεση της πιο πάνω πράξης, η τιμή της μεταβλητής finalPrice θα είναι 238.

Κατά την εκτέλεση αυτών των αριθμητικών προτάσεων, ισχύει απόλυτα η σειρά προτεραιότητας των τελεστών, ακριβώς όπως θα τους υπολογίζαμε και σε μια αριθμητική πράξη γράφοντας σε χαρτί.

Αυτό σημαίνει πως εκτελούνται πάντα με την εξής σειρά προτεραιότητας:

  • Πρώτα υπολογίζεται η τιμή μιας παρένθεσης
  • Πολλαπλασιασμός, διαίρεση και υπόλοιπο εκτελούνται πρώτα. Σε περίπτωση που μια πρόταση περιλαμβάνει περισσότερους από ένα τέτοιους τελεστές, τότε αρχίζουμε από τα αριστερά και πάμε προς τα δεξιά.
  • Προσθέσεις και αφαιρέσεις εκτελούνται στη συνέχεια έχοντας την ίδια προτεραιότητα μεταξύ τους, ενώ και πάλι σε περίπτωση που μια πρόταση περιλαμβάνει περισσότερους από ένα τέτοιους τελεστές, η εκτέλεση αρχίζει από τα αριστερά προς τα δεξιά.

Γι’ αυτό και έτσι η πρόταση μας 200 * (1 + 19/100) θα υπολογιστεί με την εξής σειρά:

Πρώτα θα υπολογιστεί το αποτέλεσμα του 19/100, μετά θα προστεθεί 1, και τέλος το αποτέλεσμα θα πολλαπλασιαστεί επί 200, και έτσι θα έχουμε το τελικό αποτέλεσμα  238 στη μεταβλητή μας.

Δύο τελεστές οι οποίοι χρειάζεται να αναλύσουμε λίγο περισσότερο, είναι ο τελεστής του υπολοίπου (%) και ο τελεστής της διαίρεσης (/). Τον πρώτο θα τον εξηγήσουμε καθώς πολλοί ίσως να μην γνωρίσουν τη συγκεκριμένη αλγεβρική έννοια, ενώ για τον δεύτερο χρειάζεται να αναφέρουμε μερικά πράγματα καθώς η λειτουργία του στη Java κρύβει κάποιες ιδιαιτερότητες.

Τελεστής Υπολοίπου

Όσοι γνωρίζετε τη σημασία του τελεστή υπολοίπου, μπορείτε να προσπεράσετε αυτό το μέρος.

Ο τελεστής του υπολοίπου, υπολογίζει το υπόλοιπο που απομένει μετά από μια ακέραιη διαίρεση. Δηλαδή για παράδειγμα το αποτέλεσμα της πράξης 7%4 είναι 3, ενώ το αποτέλεσμα της πράξης 17%5 είναι 2.

Πως γίνεται αυτό; Ας πάρουμε το πρώτο παράδειγμα, το 7%4. Το αποτέλεσμα της ακέραιης διαίρεσης του 7 με το 4 είναι 1, ενώ το υπόλοιπο που απομένει είναι 3. Το 3 θα είναι και η τιμή που θα πάρει η μεταβλητή μας μετά από μια τέτοια πράξη. Είναι απλά μαθηματικά, δεν νομίζω πως χρειάζεται να επεκταθώ περισσότερο.

Τελεστής Διαίρεσης

Ας δούμε τώρα τον τελεστή διαίρεσης στη Java, και την ιδιαιτερότητα που έχει.

Θα γίνουν όλα περισσότερο κατανοητά, αν ξεκινήσω με ένα παράδειγμα..

Ας υποθέσουμε πως έχουμε 30 σοκολάτες, τις οποίες θέλουμε να μοιράσουμε σε 4 παιδάκια.

Για να υπολογίσουμε πόσες σοκολάτες θα δώσουμε σε κάθε παιδί και πόσες θα μας περισσέψουν, μπορούμε να χρησιμοποιήσουμε τους τελεστές διαίρεσης και υπολοίπου ως εξής:

int chocolatesToEachKid, chocolatesLeft;
chocolatesToEachKid = 30/4;
chocolatesLeft = 30%4;

Μετά την εκτέλεση τον πιο πάνω εντολών, η τιμή της μεταβλητής chocolatesToEachKid θα είναι 7 (ως αποτέλεσμα της διαίρεσης 30/4) ενώ η τιμή της μεταβλητής chocolatesLeft θα είναι 2. Ίσως τώρα να διερωτάσαι γιατί το αποτέλεσμα της διαίρεσης 30/4 μας κάνει 7 και όχι 7.5 όπως κανονικά θα έπρεπε.

Η απάντηση είναι η εξής.

Στη Java, το ίδιο σύμβολο της διαίρεσης χρησιμοποιείτε για δύο μορφές διαιρέσεων. Χρησιμοποιείτε τόσο για την πραγματοποίηση διαιρέσεων ακεραίων, όσο και για την πραγματοποίηση διαιρέσεων πραγματικών αριθμών.

Θα μπορούσε να υπήρχαν ξεχωριστοί τελεστές για αυτές τις δύο μορφές διαιρέσεων, όμως ο ίδιος τελεστής (/) χρησιμοποιείτε και για τις δύο μορφές. Αυτό σημαίνει πως ο τελεστής της διαίρεσης είναι υπερφορτωμένος (overloaded). Περισσότερα για το overloading θα μάθουμε σε μελλοντικά βοηθήματα, όμως για τώρα αυτό που χρειάζεται να ξέρεις είναι πως το overloading πάει να πει πως ο ίδιος τελεστής (σε αυτή την περίπτωση ο τελεστής της διαίρεσης), μπορεί να συμπεριφέρεται διαφορετικά υπό ορισμένες περιστάσεις.

Έτσι όσο αφορά τον τελεστή της διαίρεσης, ο compiler της Java ξέρει πότε θα πραγματοποιήσει διαίρεση ακεραίων, και πότε διαίρεση πραγματικών αριθμών.

Πως όμως αποφασίζετε αυτό, και γιατί στο πιο πάνω παράδειγμα χρησιμοποιήθηκε η διαίρεση ακεραίων;

Αυτό αποφασίζετε ανάλογα με τις τιμές οι οποίες διαιρούνται (ή αν θέλεις, με τον τύπο των μεταβλητών που διαιρούνται). Αν τουλάχιστο μία από τις διαιρούμενες τιμές είναι πραγματικός αριθμός, τότε θα γίνει διαίρεση πραγματικών αριθμών και το αποτέλεσμα μας θα είναι πραγματικός αριθμός (έτσι θα πρέπει να έχουμε φροντίσει η μεταβλητή η οποία θα δεκτεί την τιμή η οποία θα προκύψει, να είναι σε θέση να πάρει τιμές με δεκαδικά). Εάν η διαίρεση γίνεται μεταξύ ακέραιων αριθμών (όπως στο πιο πάνω παράδειγμα), τότε θα γίνει διαίρεση ακεραίων, και το όποιο υπόλοιπο περισσέψει θα «χαθεί». Αυτός είναι ο λόγος που το αποτέλεσμα της διαίρεσης 30/4 θα είναι 7 και όχι 7.5 (Υπάρχει βέβαια κάποιος τρόπος με τον οποίο μπορούμε να «αναγκάσουμε» την Java να χρησιμοποιήσει όποιο τρόπο διαίρεσης επιθυμούμε, όμως αυτό είναι κάτι που θα μάθουμε στο μέλλον).

Τελεστές Αύξησης και Μείωσης

Βέβαια, μια μεταβλητή στη Java, δεν μπορεί να χρησιμοποιηθεί μόνο στο αριστερό μέρος μιας πράξης. Μπορεί να χρησιμοποιηθεί εξίσου και στο δεξί.

Δηλαδή, εάν είχαμε δηλωμένη μια μεταβλητή με το όνομα x, της οποία θα θέλαμε να αυξήσουμε την τιμή κατά 1 μονάδα, τότε ο κώδικας μας θα ήταν ο εξής:

x = x + 1;

Με την πιο πάνω εντολή, η τιμή του x αυξήθηκε κατά 1 μονάδα. Μπορούμε όμως πιο εύκολα και γρήγορα να χρησιμοποιήσουμε την εξής συντομογραφία η οποία είναι διαθέσιμη στη Java και κάνει ακριβώς το ίδιο πράγμα:

x++;

Με τον ίδιο τρόπο, γράφοντας x–; παίρνουμε το ίδιο αποτέλεσμα σαν η εντολή να ήταν x = x -1;

Μπορούμε επίσης να κάνουμε και το εξής:

y = x++;

Με αυτό τον τρόπο, αυτό που γίνεται είναι το εξής, το y παίρνει την αρχική τιμή του x, και το x αυξάνεται κατά 1 μονάδα. Έτσι εάν το x ήταν 5, μετά την εκτέλεση του πιο πάνω, θα είχε γίνει 6, ενώ το y θα είχε πάρει προηγουμένως την τιμή 5.

Τα ++  και τα — μπορούν να χρησιμοποιηθούν όχι μόνο πίσω, αλλά και μπροστά από μια μεταβλητή, έτσι ακολουθώντας τον ίδιο τρόπο σκέψης, με την εντολή:

y = ++x;

θα συμβεί το εξής, η τιμή του x πρώτα θα αυξηθεί κατά μια μονάδα, και στη συνέχεια θα δοθεί η νέα τιμή στο y. Έτσι x και y θα έχουν την ίδια τιμή.

Ακόμη μια συντομογραφία που υπάρχει στην Java είναι η:

y += x;

και είναι η συντομογραφία για το

y = y + x;

Ανάλογες συντομογραφίες υπάρχουν για όλους τους τελεστές αριθμητικών πράξεων.

Αυτές οι συντομογραφίες χρησιμοποιούνται συχνά από τους προγραμματιστές, και θα τις χρησιμοποιούμε και εμείς στα προγράμματα μας. Ας τις δούμε όμως όλες μαζί στον πιο κάτω πίνακα.

lesson07-02

lesson07-03

Αυτά για σήμερα.

Την επόμενη φορά, θα μάθουμε πώς να τυπώνουμε τις τιμές των μεταβλητών μας στην οθόνη του υπολογιστή, έτσι ώστε να είμαστε σε θέση να παρουσιάζουμε δεδομένα στον χρήστη. Αυτό θα είναι το εύκολο μέρος. Το μεγαλύτερο κομμάτι θα το αναλώσουμε για να γράψουμε και να εξηγήσουμε το δεύτερο μας πρόγραμμα το οποίο θα περιλαμβάνει όλα όσα μάθαμε μέχρι σήμερα.

Θα τα πούμε και πάλι πάρα πολύ σύντομα.

Tags: , , , ,

MZinas { Προσωπική Ιστοσελίδα / Άρθρα Στο GreekTuts }
Ο Michel βρίσκεται στο παρα πέντε της απόκτησης Πτυχίου Πληροφορικής. Ασχολείται εδώ και χρόνια με τους υπολογιστές και διατηρεί ιστοσελίδα μέσα απο την οποία δίνει λύσεις σε βασικά προβλήματα που μπορεί να αντιμετωπίσει κάποιος χρησιμοποιώντας τους. Απο τον Σεπτέμβριο του 2009 είναι εξωτερικός συνεργάτης του GreekTuts.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>