Αριθμητικές πράξεις.

Αυτο 15.06.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Chercher ΑυτοΟι περισσότερες επεμβάσεις σε πρωτόγονους τύπουςεκτελείται όχι χρησιμοποιώντας μεθόδους, αλλά χρησιμοποιώντας ειδικούς χαρακτήρες.

, κάλεσε

σημάδι λειτουργίας Χειριστής ανάθεσηςκαλείται μια σταθερά, μια άλλη μεταβλητή ή έκφραση (μεταβλητές ή/και σταθερές που χωρίζονται με σύμβολα τελεστή). λειτουργία ανάθεσηςκαι υποδεικνύεται με το σύμβολο " = ", για παράδειγμα: x = 3 ; y = x; z = x; Στη Java, είναι δυνατό να χρησιμοποιηθεί ο τελεστής εκχώρησης πολλές φορές σε μία έκφραση, για παράδειγμα: x1 = x2 = x3 = 0 ; Αυτή η λειτουργία εκτελείται από από δεξιά προς τα αριστερά, δηλαδή στη μεταβλητή x3 εκχωρείται πρώτα η τιμή 0, μετά η μεταβλητή x2 εκχωρείται η τιμή της μεταβλητής x3 (0) και τέλος η μεταβλητή x1 εκχωρείται η τιμή της μεταβλητής x2 (0). Οι πράξεις των οποίων τα ορίσματα είναι αριθμοί χωρίζονται σε δύο κατηγορίες: ενιαία(μοναδικά) σημάδια πράξεων με ένα όρισμα και δυάδικος(δυαδικό) με δύο ορίσματα.

Ενιαίες πράξεις

Οι ακόλουθοι unary τελεστές ορίζονται στην Java:
  • unary μείον " - " – αλλάζει το πρόσημο ενός αριθμού ή έκφρασης στο αντίθετο.
  • unary plus " + " – δεν εκτελεί καμία ενέργεια σε έναν αριθμό ή έκφραση.
  • συμπλήρωμα bitwise "~" (μόνο για ακέραιους αριθμούς) – αντιστρέφει όλα τα bit του πεδίου αριθμών (αλλάζει 0 σε 1 και 1 σε 0).
  • αύξηση "++" (μόνο για ακέραιους αριθμούς) – αυξάνει την τιμή της μεταβλητής κατά 1.
  • decrement " -- " (μόνο για ακέραιους αριθμούς) - μειώνει την τιμή της μεταβλητής κατά 1.
Παραδείγματα μοναδικών πράξεων " + " και " - ": int i = 3 , j, k; j= - i;// j = -3 k = + i; // k = 3 Παράδειγμα λειτουργίας συμπληρώματος bitwise: int a = 15 ; int b; b = ~a;// b = -16 Οι αριθμοί a και b είναι αριθμοί πληκτρολογήστε int, δηλ. αναπαριστώνται εσωτερικά από τον υπολογιστή ως υπογεγραμμένοι δυαδικοί ακέραιοι μήκους 32 bit, επομένως η δυαδική αναπαράσταση των αριθμών a και b θα μοιάζει με αυτό: a = 00000000 00000000 00000000 00001111 b = 111111111111αυτή η αναπαράσταση, όλα τα μηδενικά μπιτ στον αριθμό α αλλάζουν σε ένα μπιτ στο β και τα ένα μπιτ στο α αλλάζουν σε μηδενικά μπιτ. Η δεκαδική παράσταση του b είναι –16. Τα σημάδια λειτουργίας αύξησης και μείωσης μπορούν να τοποθετηθούν είτε πριν είτε μετά τη μεταβλητή. Αυτές οι επιλογές ονομάζονται ανάλογα πρόθεμαεπιστρέφει την τιμή του τελεστή του και μόνο μετά από αυτό υπολογίζει την αύξηση ή τη μείωση, για παράδειγμα: int x = 1, y, z; y = ++x; z= x++ ;

Στη μεταβλητή y θα εκχωρηθεί η τιμή 2 γιατί η τιμή του x πρώτα θα αυξηθεί κατά 1 και μετά το αποτέλεσμα θα εκχωρηθεί στη μεταβλητή y . Στη μεταβλητή z θα εκχωρηθεί η τιμή 1 επειδή στη μεταβλητή z θα εκχωρηθεί πρώτα μια τιμή και μετά η τιμή του x θα αυξηθεί κατά 1 . Και στις δύο περιπτώσεις, η νέα τιμή του x θα είναι 2. Θα πρέπει να σημειωθεί ότι στη Java, σε αντίθεση με τη γλώσσα C, οι πράξεις μείωσης και αύξησης μπορούν επίσης να εφαρμοστούν σε πραγματικές μεταβλητές (τύπος float και double).

Δυαδικά Σήματα Λειτουργίας χωρίζονται σε πράξεις με αριθμητικό αποτέλεσμα και σε πράξεις σύγκρισης, το αποτέλεσμα των οποίων είναι μια Boolean τιμή.:
  • Αριθμητικές δυαδικές πράξεις
  • Η Java ορίζει τα εξής
  • αριθμητικές δυαδικές πράξεις
  • προσθήκη "+";
  • αφαίρεση " - "; πολλαπλασιασμός " * ";διαίρεση "/";
υπολογίζοντας το υπόλοιπο της διαίρεσης των ακεραίων "%" (επιστρέφει το υπόλοιπο της διαίρεσης του πρώτου αριθμού με το δεύτερο και το αποτέλεσμα θα έχει το ίδιο πρόσημο με το μέρισμα), για παράδειγμα, το αποτέλεσμα της πράξης 5%3 θα είναι ίσο με 2 και το αποτέλεσμα της πράξης (-7) %(-4) θα είναι ίσο με -3. ΣΕ Λειτουργία Java: μπορεί επίσης να χρησιμοποιηθεί για πραγματικές μεταβλητές (float ή double type). Δυαδικά παραδείγματα // αριθμητικές πράξεις int x = 7, x1, x2, x3, x4, x5; x1 = x + 10 ; // x1 = 17 x2 = x – 8 ;// x2 = -1 x3 = x2 * x;

// x3 = -7 x4 = x/ 4 ;

  • // x4 = 1 (κατά τη διαίρεση ακεραίων
  • κλασματικό μέρος απορρίπτεται) x5 = x% 4 απορρίπτεται)// x5 = 3 (υπόλοιπο διαίρεσης
  • κλασματικό μέρος απορρίπτεται)// 7 επί 4) απορρίπτεται)Λειτουργίες bitwise
  • κλασματικό μέρος απορρίπτεται)Οι λειτουργίες bitwise αντιμετωπίζουν τις ακατέργαστες αριθμητικές τιμές ως πεδία bit και εκτελούν τις ακόλουθες λειτουργίες σε αυτές: απορρίπτεται)ρύθμιση bit in
  • εγώ<< ";
  • δεξιά μετατόπιση των bit του πρώτου πεδίου τελεστέου από τον αριθμό των bit που καθορίζεται από τον δεύτερο τελεστή (το bit του αριθμού δεν αλλάζει) – μετατόπιση bit προς τα δεξιά, λαμβάνοντας υπόψη το σύμβολο " >>".
  • μετατόπιση προς τα δεξιά των δυαδικών ψηφίων του πεδίου του πρώτου τελεστή από τον αριθμό των δυαδικών ψηφίων που καθορίζονται από τον δεύτερο τελεστή (μετατοπίζεται επίσης το bit πρόσημου του αριθμού) - μετατόπιση κατά bit προς τα δεξιά χωρίς να ληφθεί υπόψη το " >>> "σημάδι.
Παραδείγματα πράξεων bitwise:
  1. Bitwise ΚΑΙ

    int x = 112 ; int y = 94 ;
  2. int z;

    z = x & y; // z=80: 00000000 00000000 00000000 01010000 Bitwise Ή int x = 112 ;// x: 00000000 00000000 00000000 01110000 int y = 94 ;
  3. // y: 00000000 00000000 00000000 01011110

    z = x & y; // z=80: 00000000 00000000 00000000 01010000 Bitwise Ή int x = 112 ; int z; z = x |
  4. y;

    // z = 126: 00000000 00000000 00000000 01111110 Αποκλειστική κατά bitwise OR int z;<< 2 ; z = x^y;
  5. // z = 46: 00000000 00000000 00000000 00101110

    Αριστερά μετατόπιση βάσει πινακίδας int x = 31, z;
  6. // x: 00000000 00000000 00000000 00011111

    z = x // z = 124: 00000000 00000000 00000000 01111100Δεξιά μετατόπιση με πινακίδα int x = - 17, z;

z = x >> 2 ;

// z = -5: 11111111 11111111 11111111 11111011 Δεξιά μετατόπιση χωρίς να λαμβάνεται υπόψη το σημάδι int x = - 17, z;
  1. // x: 11111111 11111111 11111111 11101111
  2. z = x >>> 2 ;
  3. // z = 1073741819
  4. // z: 00111111 11111111 11111111 11111011
  5. Συνδυασμένες λειτουργίες
  6. Στην Java, για δυαδικές αριθμητικές πράξεις μπορείτε να χρησιμοποιήσετε
  7. σε συνδυασμό
  8. (σύνθετα) σήματα τελεστή: λειτουργία αναγνωριστικού = έκφραση Αυτό ισοδυναμεί με την ακόλουθη πράξη: αναγνωριστικό = έκφραση λειτουργίας αναγνωριστικού Παραδείγματα:
  9. Η έκφραση x += b σημαίνει x = x + b.<<= b означает x = x << b .
  10. Η έκφραση x -= b σημαίνει x = x - b .
  11. Η έκφραση x *= b σημαίνει x = x * b .

Η έκφραση x /= b σημαίνει x = x / b.

Η έκφραση x %= b σημαίνει x = x % b .
  • Η έκφραση x &= b σημαίνει x = x & b .
  • Η έκφραση x |= b σημαίνει x = x | σι.
  • " < " (меньше) " <= " (меньше или равно)
Η έκφραση x ^= b σημαίνει x = x ^ b . Έκφραση xΗ έκφραση x >>= b σημαίνει x = x >> b . Η έκφραση x >>>= b σημαίνει x = x >>> b .Λειτουργίες σύγκρισης == Η Java ορίζει τους ακόλουθους τελεστές σύγκρισης: = ". Η χρήση του συμβόλου " = " κατά τη σύγκριση δύο τιμών είτε προκαλεί σφάλμα μεταγλώττισης είτε οδηγεί σε εσφαλμένο αποτέλεσμα. Παραδείγματα πράξεων σύγκρισης: boolean isEqual, isNonEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual;< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

int x1 = 5, x2 = 5, x3 = 3, x4 = 7;

isEqual = x1 == x2;// isEqual = true isNonEqual = x1 != x2; // isNonEqual = false isGreater = x1 > x3;// isGreater = true // isGreaterOrEqual = true isGreaterOrEqual = x2 >= x3;
  • isLess = x3
  • Λειτουργίες Boolean
  • Λειτουργίες Boolean
  • εκτελούνται σε μεταβλητές Boolean και το αποτέλεσμά τους είναι επίσης μια τιμή τύπου
boolean . Οι ακόλουθες λειτουργίες Boolean ορίζονται στην Java:άρνηση "!" – αντικατάσταση του false με true ή αντίστροφα.< 5 ; // isInRange = false isValid = x >ΚΑΙ λειτουργία "&" – το αποτέλεσμα είναι αληθές μόνο εάν και οι δύο τελεστές είναι αληθείς, διαφορετικά το αποτέλεσμα είναι ψευδές.

Ή λειτουργία "|" - το αποτέλεσμα είναι αληθές μόνο εάν τουλάχιστον ένας από τους τελεστές είναι αληθής, διαφορετικά το αποτέλεσμα είναι ψευδές.

Η υπό όρους πράξη γράφεται με τη μορφή έκφραση-1?έκφραση-2:έκφραση-3. Σε αυτήν την περίπτωση, πρώτα αξιολογείται η έκφραση έκφραση-1, η οποία θα πρέπει να δώσει μια τιμή Boole, και στη συνέχεια, εάν η έκφραση-1 είναι αληθής, η έκφραση-2 αξιολογείται και επιστρέφεται ως αποτέλεσμα της πράξης, ή (εάν έκφραση-1 είναι ψευδής), αξιολογείται και, ως αποτέλεσμα της λειτουργίας, επιστρέφεται η έκφραση-3. Παράδειγμα λειτουργίας υπό όρους: x= n> 1 ? 0 : 1 ;

Στη μεταβλητή x θα εκχωρηθεί η τιμή 0 εάν n>1 (η έκφραση n>1 είναι αληθής) ή 1 εάν n≤1 (η έκφραση n>1 είναι ψευδής).

Αρχαιότητα λειτουργίας
Οι πράξεις στις εκφράσεις εκτελούνται από αριστερά προς τα δεξιά, ωστόσο, σύμφωνα με την προτεραιότητά τους. Άρα οι πράξεις πολλαπλασιασμού στην παράσταση y = x + z* 5;<= 5 ) ;

θα εκτελεστεί πριν από την πράξη πρόσθεσης επειδή η προτεραιότητα της πράξης πολλαπλασιασμού είναι μεγαλύτερη από την προτεραιότητα της πράξης πρόσθεσης. Οι προτεραιότητες των λειτουργιών (με σειρά φθίνουσας προτεραιότητας) στην Java δίνονται στον πίνακα. 1.

Οι παρενθέσεις αυξάνουν την προτεραιότητα των πράξεων που βρίσκονται μέσα σε αυτές. Έτσι, αν εισάγετε παρενθέσεις στην παραπάνω παράσταση: y = (x + z) * 5 ; τότε θα εκτελεστεί πρώτα η πράξη πρόσθεσης και μετά η πράξη πολλαπλασιασμού. Μερικές φορές οι παρενθέσεις χρησιμοποιούνται απλώς για να κάνουν μια έκφραση πιο ευανάγνωστη, για παράδειγμα: (x > 1 ) && (xΜετατροπή και χύτευση κατά την εκτέλεση εργασιών Οι πράξεις ανάθεσης και οι αριθμητικές εκφράσεις μπορούν να χρησιμοποιούν κυριολεκτικά, μεταβλητές και εκφράσεις διαφόρων τύπων, για παράδειγμα: double y; byte x; y = x + 5 ;® Αυτό το παράδειγμα προσθέτει τη μεταβλητή byte x στο int literal 5 και εκχωρεί το αποτέλεσμα στη διπλή μεταβλητή y. Στην Java, όπως και στη γλώσσα C, οι μετατροπές τύπων κατά την αξιολόγηση παραστάσεων μπορούν να εκτελεστούν αυτόματα ή χρησιμοποιώντας έναν τελεστή τύπου cast. Ωστόσο, οι κανόνες για τη μετάδοση τύπων είναι ελαφρώς διαφορετικοί από τους κανόνες της γλώσσας C και είναι γενικά πιο αυστηροί από ό,τι στη γλώσσα C Κατά την εκτέλεση μιας λειτουργίας ανάθεσης, η μετατροπή τύπου λαμβάνει χώρα αυτόματα εάν® διευρυνόμενος μετασχηματισμός® (διεύρυνση μετατροπής) και® δύο τύποι είναι συμβατοί® . Οι επεκτεινόμενοι μετασχηματισμοί είναι μετασχηματισμοί. Για τη διεύρυνση των μετατροπών, οι αριθμητικοί τύποι, συμπεριλαμβανομένων των ακεραίων και κινητής υποδιαστολής, είναι συμβατοί μεταξύ τους. Ωστόσο, οι αριθμητικοί τύποι δεν είναι συμβατοί με τους τύπους char και boolean. Οι τύποι char και boolean είναι επίσης ασυμβίβαστοι μεταξύ τους. Η Java εκτελεί επίσης αυτόματη μετατροπή τύπων όταν αποθηκεύει μια κυριολεκτική ακέραια σταθερά (η οποία είναι προεπιλεγμένη σε int) σε μια μεταβλητή τύπου byte, short ή long (ωστόσο, εάν το literal έχει τιμή εκτός του εύρους των έγκυρων τιμών για αυτόν τον τύπο, εκδίδεται ένα μήνυμα σφάλματος: πιθανή απώλεια ακρίβειας). Εάν η μετατροπή είναι μια μετατροπή στένωσης, δηλαδή, εκτελείται διπλή μετατροπή byte ¬ σύντομο ¬ char ¬ int ¬ long ¬ float ¬ διπλή μετατροπή, τότε μια τέτοια μετατροπή μπορεί να οδηγήσει σε απώλεια της ακρίβειας του αριθμού ή σε παραμόρφωσή του. Επομένως, κατά τη διάρκεια του περιορισμού των μετατροπών, κατά τη μεταγλώττιση ενός προγράμματος, εμφανίζεται ένα διαγνωστικό μήνυμα σχετικά με την ασυμβατότητα τύπου και δεν δημιουργούνται αρχεία κλάσης. Αυτό το μήνυμα θα εκδοθεί επίσης εάν προσπαθήσετε να μετατρέψετε μια έκφραση τύπου byte ή short σε μια μεταβλητή τύπου char . Εάν εξακολουθεί να είναι απαραίτητο να πραγματοποιηθούν τέτοιες μετατροπές, χρησιμοποιείται η λειτουργία τύπου cast, η οποία έχει την ακόλουθη μορφή: ( μετατροπή τύπου) έννοια, Πού μετατροπή τύπουκαθορίζει τον τύπο στον οποίο πρέπει να μετατραπούν τα δεδομένα έννοια, για παράδειγμα, ως αποτέλεσμα της εκτέλεσης των τελεστών: byte x = 71 ; σύμβολο char = (char ) x;η μεταβλητή συμβόλων θα λάβει την τιμή " G ". Εάν μια τιμή κινητής υποδιαστολής έχει εκχωρηθεί σε έναν ακέραιο τύπο, τότε (αν η τιμή κινητής υποδιαστολής έχει κλασματικό μέρος) λαμβάνει χώρα επίσης μια μετατροπή ρητού τύπου περικοπή , τότε το αποτέλεσμα του μετασχηματισμού θα είναι το υπόλοιπο της διαίρεσης της τιμής με το μέτρο του εύρους του εκχωρημένου τύπου (για αριθμούς byte τύπου, ο συντελεστής του εύρους θα είναι ίσος με 256, για συντομία - 65536, για int – 4294967296 και για μεγάλο χρονικό διάστημα – 18446744073709551616). Για παράδειγμα, ως αποτέλεσμα της εκτέλεσης του τελεστή byte x = (byte ) 514 ; (περικοπή) αριθμοί. Άρα, ως αποτέλεσμα της εκτέλεσης του τελεστή int x = (int) 77.85;

η μεταβλητή x θα πάρει την τιμή 77 . Εάν η εκχωρηθείσα τιμή είναι εκτός του εύρους μετατροπή τύπουΣύνδεσμος στο πρώτο

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

java.util.Scanner

. Ας το κάνουμε αυτό χρησιμοποιώντας το παράδειγμα μιας απλής εργασίας από τον πολύ χρήσιμο ιστότοπο e-olimp.com

Εργο

Εισαγάγετε έναν αριθμό από την τυπική ροή. Υποθέτοντας ότι αυτός είναι ένας θετικός διψήφιος ακέραιος, εκτυπώστε κάθε ψηφίο του ξεχωριστά (χωρισμένο με κενό διάστημα) σε τυπική έξοδο. Η σειρά των αριθμών δεν πρέπει να αλλάξει. Δοκιμές
10 1 0
99 9 9
54 5 4

Ο αλγόριθμος δεν υποθέτει συγκεκριμένες περιπτώσεις. Κάνουμε τρεις δοκιμές - τον μικρότερο αριθμό στο αποδεκτό εύρος, τον μεγαλύτερο και κάποια τιμή στη μέση του εύρους.

Είσοδος Εξοδοςγια την εισαγωγή δεδομένων σε ακέραια μορφή. Και ας υπολογίσουμε και τους δύο αριθμούς του.

Εκτύπωση των ψηφίων ενός διψήφιου ακέραιου αριθμού

Ιάβα

class Main( public static void main (String args) ρίχνει java.lang.Exception ( java.util.Scanner i = new java.util.Scanner(System.in); int n = i.nextInt(); System.out. println(n / 10 + " " + n % 10 ) )

Κύρια τάξη (

δημόσιο στατικό κενό main (String args) ρίχνει java. lang. Εξαίρεση(

Ιάβα. χρησιμότητα. Scanner i = νέα java. χρησιμότητα. Σαρωτής (System.in);

int n = i . nextInt();

Σύστημα. έξω . println (n/10 + " " + n % 10 );

Εξηγήσεις

  1. Περιγραφή μιας μεταβλητής απορρίπτεται)τύπος μετατροπή τύπουκαι να του εκχωρήσετε αμέσως την τιμή ενός νέου αντικειμένου αυτής της κλάσης. Ο κατασκευαστής φτιάχνει ένα αντικείμενο Ερευνητής«α από τυπική είσοδο. Εκείνοι. απορρίπτεται)γίνεται υπερκατασκευή στο τυπικό ρεύμα εισόδου. Αυτό μας επιτρέπει να διαβάζουμε έναν ακέραιο αντί να διαβάζουμε απλώς μια μέθοδο ανάγνωση() ένα byte τη φορά.
  2. Χρησιμοποιώντας τη μέθοδο nextInt() διαβάστε την ακολουθία αριθμών και μετατρέψτε την σε ακέραιο. Αποθηκεύουμε τον αριθμό στη μεταβλητή n.
  3. n/ 10 είναι ο αριθμός των δεκάδων σε έναν αριθμό. Οι δεκάδες θα είναι δέκα φορές λιγότερες από τον ίδιο τον αριθμό. Εκτελείται διαίρεση ακέραιων αριθμών - διαίρεση ολόκληρου.
  4. n% 10 - υπολογίστε το υπόλοιπο της διαίρεσης με το δέκα - ο αριθμός των μονάδων είναι το δεξιότερο ψηφίο του αριθμού.
  5. n/ 10 + » » + n% 10 - εισαγάγετε μια συμβολοσειρά διαστήματος μεταξύ δύο ακεραίων. Σε αυτήν την περίπτωση, οι αριθμοί μετατρέπονται επίσης σε αναπαράσταση συμβολοσειράς και συγχωνεύονται και οι τρεις συμβολοσειρές - που ονομάζεται συνένωση συμβολοσειρών. Έτσι λειτουργεί η λειτουργία «+» με δεδομένα συμβολοσειράς.

Επιτάχυνση I/O

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

Επιτάχυνση I/O

Ιάβα

εισαγωγή java.io.*; εισαγωγή java.util.*; class Main ( static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static PrintWriter out = new PrintWriter(System.out); static int nextInt() ρίχνει IOException (in.nextToken(); (int)in.nval; ) )

εισαγωγή java. io. * ;

εισαγωγή java. χρησιμότητα. * ;

Κύρια τάξη (

static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System. in)));

static PrintWriter out = νέο PrintWriter (System . out ) ;

static int nextInt() ρίχνει IOException (

Με σειρά προτεραιότητας, οι τελεστές μονού ακολουθούνται από τους αριθμητικούς τελεστές. Αυτή η ομάδα περιλαμβάνει τους τέσσερις πιο συνηθισμένους τελεστές: πρόσθεση, αφαίρεση, πολλαπλασιασμό, διαίρεση. Και όχι μόνο αυτοί. Υπάρχει επίσης ένας τελεστής διαίρεσης modulo, ο οποίος συμβολίζεται με το σύμβολο %. Οι αριθμητικοί τελεστές χωρίζονται σε δύο ομάδες. Η πρώτη ομάδα υψηλότερης προτεραιότητας περιέχει *, /, %. Στη δεύτερη, αντίστοιχα, + και -.

Πολλαπλασιασμός και διαίρεση (* και /)

Οι τελεστές * και / εκτελούν πολλαπλασιασμό και διαίρεση σε όλους τους αρχέγονους αριθμούς και τους χαρακτήρες. Όταν διαιρείται με το μηδέν, εμφανίζεταιΑριθμητική Εξαίρεση.

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

Εάν πολλαπλασιάσετε ή διαιρέσετε δύο αριθμούς, το αποτέλεσμα υπολογίζεται χρησιμοποιώντας ακέραια αριθμητική και αποθηκεύεται είτε σε int είτε σε long. Εάν οι αριθμοί είναι πολύ μεγάλοι, τότε το αποτέλεσμα θα είναι μεγαλύτερο από τον μέγιστο αριθμό που μπορεί να αναπαρασταθεί σε αυτούς τους αριθμούς. Αυτό σημαίνει ότι το αποτέλεσμα δεν θα μπορεί να κωδικοποιηθεί σωστά από τον υπολογιστή και δεν θα έχει νόημα. Για παράδειγμα, ο τύπος byte χρησιμοποιείται για την αναπαράσταση αριθμών στην περιοχή -128 έως 127. Αν πολλαπλασιάσουμε το 64 και το 4, το αποτέλεσμα 256, το οποίο έχει εννέα χαρακτήρες στη δυαδική σημείωση 100000000, θα κωδικοποιηθεί ως 0 επειδή το byte χρησιμοποιεί μόνο 8 χαρακτήρες .

Ας εξετάσουμε τη διαίρεση. Εάν διαιρέσετε σε ακέραιους αριθμούς, το αποτέλεσμα πρέπει να είναι ακέραιος. Αυτό σημαίνει ότι το κλασματικό μέρος θα χαθεί. Για παράδειγμα, το 7/4 μας δίνει 1,75, αλλά στην αριθμητική ακέραιο θα ήταν 1.

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

1. int a = 12345, b = 234567, c, d;
2. μακρύς e, f;
3.
4. c = a * b / b; // πρέπει να ισούται με a=12345
5. d = a / b * b; // θα πρέπει επίσης να ισούται με a=12345
6. System.out.println("a είναι " + a +
7. "\nb είναι " + b +
8. "\nc είναι " + c +
9. "\nd είναι " + d);
10.
11. e = (μακρύ)a * b / b;
12. f = (μακρύ)a / b * b;
13.System.out.println(
14. "\ne είναι " + e +
15. "\nf είναι " + f);

Το αποτέλεσμα αυτού του τμήματος θα παράγει τα εξής:

Το Α είναι 12345
b είναι 234567
c είναι -5965
d είναι 0
e είναι 12345
f είναι 0

Μην σας μπερδεύουν οι αριθμητικές τιμές σε αυτό το παράδειγμα. Το σημαντικό είναι ότι όταν κάναμε πρώτα τον πολλαπλασιασμό, είχαμε μια υπερχείλιση (c είναι -5965) όταν την κωδικοποιήσαμε σε τύπο int. Ωστόσο, μπορούμε να έχουμε το σωστό αποτέλεσμα αν το κωδικοποιήσουμε σε μεγαλύτερο τύπο, όπως long . Και στις δύο περιπτώσεις, η εφαρμογή της διαίρεσης πρώτα θα είναι καταστροφική για το αποτέλεσμα, ανεξάρτητα από το μήκος του τύπου της.

Υποδιαίρεση %

Το αποτέλεσμα της διαίρεσης modulo είναι το υπόλοιπο της διαίρεσης. Για παράδειγμα, το 7/4 είναι 1 με υπόλοιπο 3. Επομένως, 7%4 = 3. Συνήθως οι τελεστές είναι ακέραιου τύπου, αλλά μερικές φορές ο τελεστής εφαρμόζεται σε αριθμούς κινητής υποδιαστολής. Θα πρέπει επίσης να γνωρίζετε ορισμένα χαρακτηριστικά αυτού του τελεστή όταν οι τελεστές είναι αρνητικοί.

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

17%5 = ? 17-5=12>5; 12-5=7>5; 7-5=2<5. Значит 17%5 = 2

21%7? 21-7=14>7; 14-7=7=7; 7-7=0<7. Значит 21%7 = 0

7.6%2.9? 7.6-2.9=4.7>2.9; 4.7-2.9=1.8<2.9. Значит 7.6%2.9=1.8

Σημείωση: το πρόσημο του αποτελέσματος (θετικό ή αρνητικό) καθορίζεται εξ ολοκλήρου από το πρόσημο του αριστερού τελεστή, δηλαδή το μέρισμα.

Όταν η διαίρεση συντελεστών εκτελείται σε κλασματικούς αριθμούς, η ουσία αυτής της λειτουργίας είναι να αφαιρέσουμε τον διαιρέτη πολλές φορές. Το αποτέλεσμα μπορεί επίσης να είναι ένας κλασματικός αριθμός.

Ένας απλός κανόνας για τους αρνητικούς τελεστές είναι: αφήστε το πρόσημο μείον από τους τελεστές, κάντε τη διαίρεση με τους θετικούς τελεστές και, στη συνέχεια, προσθέστε το αποτέλεσμα με ένα πρόσημο μείον εάν ο αριστερός τελεστής (το μέρισμα) ήταν αρνητικός.

Η διαίρεση αρθρώσεων, όπως και η κανονική διαίρεση, μπορεί να δημιουργήσει μια ArithmeticException εάν ο διαιρέτης (ο τελεστής δεξιά) ισούται με μηδέν.

Τελευταία ενημέρωση: 30/10/2018

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

Οι αριθμητικές πράξεις περιλαμβάνουν αριθμούς. Η Java έχει δυαδικές αριθμητικές πράξεις (που εκτελούνται σε δύο τελεστές) και μονοαριθμητικές πράξεις (εκτελούνται σε έναν τελεστή). Οι δυαδικές λειτουργίες περιλαμβάνουν τα ακόλουθα:

    λειτουργία πρόσθεσης δύο αριθμών:

    Int a = 10; int b = 7; int c = a + b; // 17 int d = 4 + b; // 11

    λειτουργία αφαίρεσης δύο αριθμών:

    Int a = 10; int b = 7; int c = a - b; // 3 int d = 4 - a; // -6

    λειτουργία πολλαπλασιασμού δύο αριθμών

    Int a = 10; int b = 7; int c = a * b; // 70 int d = b * 5; // 35

    λειτουργία διαίρεσης δύο αριθμών:

    Int a = 20; int b = 5; int c = a / b; // 4 διπλό d = 22,5 / 4,5; // 5.0

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

    Διπλό k = 10 / 4; // 2 System.out.println(k);

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

    Διπλό k = 10,0 / 4; // 2.5 System.out.println(k);

    λαμβάνοντας το υπόλοιπο κατά τη διαίρεση δύο αριθμών:

    Int a = 33; int b = 5; int c = a % b; // 3 int d = 22% 4; // 2 (22 - 4*5 = 2)

Υπάρχουν επίσης δύο μονομερείς αριθμητικές πράξεις που εκτελούνται σε έναν μόνο αριθμό: ++ (αύξηση) και -- (μείωση). Κάθε μια από τις λειτουργίες έχει δύο ποικιλίες: πρόθεμα και μετάθεμα:

    ++ (αύξηση προθέματος)

    Περιλαμβάνει αύξηση μιας μεταβλητής κατά ένα, για παράδειγμα z=++y (πρώτα η τιμή της μεταβλητής y αυξάνεται κατά 1 και μετά η τιμή της εκχωρείται στη μεταβλητή z)

    Int a = 8; int b = ++a; System.out.println(a); // 9 System.out.println(b); // 9

    ++ (αύξηση postfix)

    Αντιπροσωπεύει επίσης μια αύξηση σε μια μεταβλητή κατά ένα, για παράδειγμα z=y++ (πρώτα η τιμή της μεταβλητής y εκχωρείται στη μεταβλητή z και στη συνέχεια η τιμή της μεταβλητής y αυξάνεται κατά 1)

    Int a = 8; int b = a++; System.out.println(a); // 9 System.out.println(b); // 8

    -- (μείωση προθέματος)

    μείωση μιας μεταβλητής κατά ένα, για παράδειγμα, z=--y (πρώτα η τιμή της μεταβλητής y μειώνεται κατά 1 και μετά η τιμή της εκχωρείται στη μεταβλητή z)

    Int a = 8; int b = --a; System.out.println(a); // 7 System.out.println(b); // 7

    -- (μείωση postfix)

    z=y-- (πρώτα η τιμή της μεταβλητής y εκχωρείται στη μεταβλητή z και μετά η τιμή της μεταβλητής y μειώνεται κατά 1)

    Int a = 8; int b = a--; System.out.println(a); // 7 System.out.println(b); // 8

Προτεραιότητα αριθμητικών πράξεων

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

++ (αύξηση), -- (μείωση)

* (πολλαπλασιασμός), / (διαίρεση), % (υπόλοιπο διαίρεσης)

+ (προσθήκη), - (αφαίρεση)

Η προτεραιότητα των πράξεων θα πρέπει να λαμβάνεται υπόψη κατά την εκτέλεση ενός συνόλου αριθμητικών παραστάσεων:

Int a = 8; int b = 7; int c = a + 5 * ++b; System.out.println(c); // 48

Πρώτα θα εκτελεστεί η λειτουργία αύξησης ++b, η οποία έχει μεγαλύτερη προτεραιότητα - θα αυξήσει την τιμή της μεταβλητής b και θα την επιστρέψει ως αποτέλεσμα. Στη συνέχεια εκτελείται ο πολλαπλασιασμός 5 * ++b και μόνο στο τέλος γίνεται η πρόσθεση a + 5 * ++b

Οι παρενθέσεις σας επιτρέπουν να επαναπροσδιορίσετε τη σειρά των υπολογισμών:

Int a = 8; int b = 7; int c = (a + 5) * ++b; System.out.println(c); // 104

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

Συνεταιρισμός λειτουργιών

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

    Αριστεροί τελεστές, οι οποίοι εκτελούνται από αριστερά προς τα δεξιά

    Δεξιά συσχετιζόμενοι τελεστές, οι οποίοι εκτελούνται από τα δεξιά προς τα αριστερά

Έτσι, ορισμένες πράξεις, όπως ο πολλαπλασιασμός και η διαίρεση, έχουν την ίδια προτεραιότητα. Ποιο θα είναι τότε το αποτέλεσμα στην έκφραση:

Int x = 10 / 5 * 2;

Πρέπει να ερμηνεύσουμε αυτήν την έκφραση ως (10 / 5) * 2 ή ως 10 / (5 * 2); Εξάλλου, ανάλογα με την ερμηνεία, θα έχουμε διαφορετικά αποτελέσματα.

Δεδομένου ότι όλοι οι αριθμητικοί τελεστές (εκτός από το πρόθεμα αύξησης και μείωσης) είναι αριστεροσυσχετιστικοί, δηλαδή εκτελούνται από αριστερά προς τα δεξιά. Επομένως, η έκφραση 10 / 5 * 2 πρέπει να ερμηνευτεί ως (10 / 5) * 2, δηλαδή το αποτέλεσμα θα είναι 4.

Πράξεις κινητής υποδιαστολής

Θα πρέπει να σημειωθεί ότι οι αριθμοί κινητής υποδιαστολής δεν είναι κατάλληλοι για οικονομικούς και άλλους υπολογισμούς όπου τα σφάλματα στρογγυλοποίησης μπορεί να είναι κρίσιμα. Για παράδειγμα:

Διπλό d = 2,0 - 1,1; System.out.println(d);

Σε αυτή την περίπτωση, η μεταβλητή d δεν θα είναι ίση με 0,9, όπως θα μπορούσε να υποθέσει κανείς αρχικά, αλλά 0,8999999999999999. Αυτά τα σφάλματα ακρίβειας προκύπτουν επειδή σε χαμηλό επίπεδο, το δυαδικό σύστημα χρησιμοποιείται για την αναπαράσταση αριθμών κινητής υποδιαστολής, αλλά δεν υπάρχει δυαδική αναπαράσταση για τον αριθμό 0,1, ούτε για άλλες κλασματικές τιμές. Επομένως, σε τέτοιες περιπτώσεις, συνήθως χρησιμοποιείται η κλάση BigDecimal, η οποία σας επιτρέπει να παρακάμψετε τέτοιες καταστάσεις.

1. Βασικές αριθμητικές πράξεις

Ο παρακάτω πίνακας παραθέτει τις βασικές αριθμητικές πράξεις που χρησιμοποιούνται στη γλώσσα Java:

Ας δούμε μερικούς κανόνες για την εργασία με αριθμητικές πράξεις:

  • Οι εκφράσεις αξιολογούνται από αριστερά προς τα δεξιά, εκτός εάν προστεθούν παρενθέσεις ή έχουν προτεραιότητα ορισμένες πράξεις.
  • Οι τελεστές *, /, και % έχουν μεγαλύτερη προτεραιότητα από το + και -.

Παράδειγμα 1: Αριθμητικές πράξεις σε ακέραιες τιμές

Για παράδειγμα, σε αυτόν τον κώδικα, οι μεταβλητές ένα int b; σιθα έχει διαφορετικές έννοιες:

Δημόσια κλάση BasicIntMath ( δημόσιο στατικό κενό main (String args) ( int a = 4 + 5 - 2 * 3; int b = 4 + (5 - 2) * 3; System.out.println("a = " + a) System.out.println("b = " + β) )

Αποτέλεσμα εκτέλεσης:

A = 3 b = 13

  • Η μονομερής αφαίρεση αλλάζει το πρόσημο του μοναδικού τελεστή της.
  • Ο τελεστής μονής πρόσθεσης απλώς επιστρέφει την τιμή του τελεστή του. Κατ 'αρχήν, δεν είναι απαραίτητο, αλλά είναι δυνατό.

Παράδειγμα 2. Μοναδικές πράξεις πρόσθεσης και αφαίρεσης

δημόσια κλάση UnarySignOperation ( δημόσιο στατικό κενό main(String args) ( double a = -6; double b = +6; System.out.println(a); System.out.println(b); ) )
  • Όταν εκτελείται μια λειτουργία διαίρεσης σε έναν ακέραιο τύπο δεδομένων, το αποτέλεσμά της δεν θα περιέχει κλασματική συνιστώσα.

Παράδειγμα 3: Διαίρεση ακεραίων

δημόσια κλάση IntDivision ( δημόσιο static void main (String args) ( int a = 16 / 5; System.out.println(a); ) )

Το αποτέλεσμα της εκτέλεσης αυτού του προγράμματος:

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

Παράδειγμα 4. Αριθμητικές πράξεις σε μεταβλητές τύπου απανθρακώνω

δημόσια κλάση BasicCharMath1 ( δημόσιο στατικό κενό main(String args) (char c = "n"; System.out.println(c); System.out.println(c + 1); System.out.println(c / 5) ) )

Αποτέλεσμα εκτέλεσης:

Ν 111 22

Παράδειγμα 5. Αριθμητικές πράξεις σε μεταβλητές τύπου απανθρακώνω

δημόσια κλάση BasicCharMath2 ( δημόσιο στατικό κενό main (String args) ( char c1 = "1"; char c2 = "\u0031"; char c3 = 49; System.out.println(c1 + c2 + c3); ) )

Αποτέλεσμα εκτέλεσης:

    Ο τελεστής διαίρεσης modulo συμβολίζεται με το σύμβολο %. Αυτός ο τελεστής επιστρέφει το υπόλοιπο όταν ο πρώτος αριθμός διαιρεθεί με τον δεύτερο. Κατά τη διαίρεση ενός ακέραιου, το αποτέλεσμα θα είναι επίσης ένας ακέραιος.

Παράδειγμα 6. Διαίρεση Modulo

δημόσια κλάση DivisionByModule ( δημόσιο στατικό κενό main(String args) ( int a = 6 % 5; double b = 6,2 % 5,0; System.out.println(a); System.out.println(b); ) )

Αποτέλεσμα εκτέλεσης:

1 1.2000000000000002

2. Σύνθετες αριθμητικές πράξεις με ανάθεση

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

A = a + 4;

Στη Java, αυτή η λειτουργία μπορεί να γραφτεί ως εξής:

A += 4;

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

Παράδειγμα 5: Σύνθετες αριθμητικές πράξεις με ανάθεση

δημόσια κλάση CompoundOperations ( δημόσιο στατικό κενό main (String args) ( int a = 1; int b = 2; int c = 3; a += 3; b *= 2; c += a * b; System.out.println (α) System.out.println(b);

Συνιστούμε να διαβάσετε

Κορυφή