C + + Tutorial για τη διαχείριση πλωτών και Ints

Ένα int είναι ένας ολόκληρος αριθμός όπως το 47 χωρίς ένα δεκαδικό σημείο. Δεν μπορείτε να έχετε 4,5 μωρά ή βρόχο 32,9 φορές. Μπορείτε να έχετε $ 25.76 εάν χρησιμοποιείτε ένα float. Έτσι, όταν δημιουργείτε το πρόγραμμά σας, πρέπει να αποφασίσετε ποιος τύπος θα χρησιμοποιηθεί.

Αυτό κάνουν μερικές γλώσσες δέσμης ενεργειών; Επειδή είναι αναποτελεσματική, τα επιπλέουν καταλαμβάνουν περισσότερη μνήμη και γενικά είναι πιο αργά από τα ints. Επίσης, δεν μπορείτε εύκολα να συγκρίνετε δύο πλωτήρες για να δείτε αν είναι ίσοι όπως εσείς μπορείτε με τα ints.

Για να χειριστείτε αριθμούς πρέπει να τα αποθηκεύσετε στη μνήμη. Επειδή η τιμή μπορεί εύκολα να αλλάξει, ονομάζεται μεταβλητή.

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

Θα παρατηρήσετε ότι η μεταβλητή Counter είναι ρυθμισμένη στο 0. Αυτή είναι μια προαιρετική προετοιμασία. Είναι μια πολύ καλή πρακτική να αρχικοποιήσετε τις μεταβλητές. Αν δεν αρχικοποιήσετε και στη συνέχεια τα χρησιμοποιήσετε σε κώδικα χωρίς να έχετε ρυθμίσει μια αρχική τιμή, η μεταβλητή θα ξεκινά με μια τυχαία τιμή που μπορεί να «σπάσει» τον κωδικό σας. Η τιμή θα είναι ό, τι ήταν στη μνήμη όταν φορτώθηκε το πρόγραμμα.

instagram viewer

Ποιος είναι ο μεγαλύτερος αριθμός που μπορεί να αποθηκεύσει ένα int;. Λοιπόν, εξαρτάται από τον τύπο του ΕΠΕΞΕΡΓΑΣΤΗΣ αλλά είναι γενικά αποδεκτό ως 32 bit. Επειδή μπορεί να κρατήσει σχεδόν όσες αρνητικές τιμές είναι θετικές, το εύρος των τιμών είναι +/- 2-32 έως 232 ή -2.147.483.648 έως +2.147.483.647.

Αυτό είναι για ένα υπογεγραμμένο int, αλλά υπάρχει και ένα χωρίς υπογραφή int που κρατά μηδέν ή θετικό. Έχει ένα εύρος από 0 έως 4.294.967.295. Απλά θυμήσου - τα μη υπογεγραμμένα μηνύματα δεν χρειάζονται ένα σημάδι (όπως + ή -1) μπροστά τους επειδή είναι πάντα θετικά ή 0.

Υπάρχει ένας συντομότερος τύπος int, που συμπτωματικά ονομάζεται σύντομο int που χρησιμοποιεί 16 bits (2 bytes). Αυτό ισχύει για αριθμούς στην περιοχή -32768 έως +32767. Εάν χρησιμοποιείτε ένα μεγάλο αριθμό κοιλοτήτων, μπορείτε να εξοικονομήσετε μνήμη με τη χρήση μικρών ιντσών. Δεν θα είναι καθόλου ταχύτερη, παρά το γεγονός ότι είναι το ήμισυ του μεγέθους. Οι επεξεργαστές 32 Bit λαμβάνουν τιμές από τη μνήμη σε μπλοκ των 4 bytes τη φορά. Π.χ. 32 bits (Εξ ου και το όνομα - CPU 32 Bit!). Επομένως, η λήψη των 16 bits απαιτεί ακόμα λήψη 32 bit.

Υπάρχει μεγαλύτερη κλήση 64 bit πολύ καιρό σε C. Ορισμένοι μεταγλωττιστές C ++, ενώ δεν υποστηρίζουν αυτόν τον τύπο, χρησιμοποιούν απευθείας ένα εναλλακτικό όνομα - π.χ. τόσο η Borland όσο και η Microsoft χρησιμοποιούν _int64. Αυτό έχει μια σειρά από -9223372036854775807 έως 9223372036854775807 (υπογραφή) και 0 έως 18446744073709551615 (χωρίς υπογραφή).

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

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

Βλέπω Σχετικά με την είσοδο και την έξοδο για λεπτομέρειες σχετικά με τον τρόπο λειτουργίας του cout και τον τρόπο χρήσης της ακρίβειας. Αυτό το παράδειγμα ορίζει την ακρίβεια εξόδου σε 8 ψηφία. Δυστυχώς τα πλωτά μπορούν να κρατήσουν μόνο 6 και ορισμένοι μεταγλωττιστές θα εκδώσουν μια προειδοποίηση για τη μετατροπή ενός διπλού σε ένα float. Όταν εκτελείται, αυτό εκτυπώνεται 567.89764

Εάν αλλάξετε την ακρίβεια στο 15, εκτυπώνεται ως 567.897644042969. Αρκετή διαφορά! Τώρα μετακινήστε το δεκαδικό σημείο δύο προς τα αριστερά, έτσι ώστε η τιμή να είναι 5.678976523 και επαναλάβετε το πρόγραμμα. Αυτή τη φορά εξάγει 5.67897653579712. Αυτό είναι ακριβέστερο αλλά ακόμα διαφορετικό.

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

Η σύνταξη λογισμικού ηλεκτρονικού υπολογιστή δεν θα ήταν πολύ χρήσιμη αν δεν μπορούσατε να κάνετε επιπλέον, αφαίρεση κλπ. Ακολουθεί το παράδειγμα 2.

Εκτός από την προσθήκη, μπορείτε να κάνετε αφαίρεση, πολλαπλασιασμό και διαίρεση. Απλά χρησιμοποιήστε + για προσθήκη, - για αφαίρεση, * για πολλαπλασιασμό και / για διαίρεση.

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

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

Χιλιάδες διαχωριστές είναι λίγο πιο περίπλοκοι. Αυτά ορίζονται από την τοποθεσία ενός υπολογιστή. Μια τοπική ρύθμιση περιέχει πληροφορίες σχετικές με τη χώρα σας - όπως σύμβολα νομισμάτων και δεκαδικά σημεία και χιλιάδες διαχωριστές. Στο Ηνωμένο Βασίλειο και τις ΗΠΑ, ο αριθμός 100.98 χρησιμοποιεί ένα δεκαδικό σημείο. ως δεκαδικό σημείο, ενώ σε ορισμένες ευρωπαϊκές χώρες είναι κόμμα, έτσι € 5,70 σημαίνει τιμή 5 ευρώ και 70 σεντ.

δημιουργεί ένα αντικείμενο mpunct που είναι μια αναφορά σε α moneypunct πρότυπο τάξη. Αυτό έχει πληροφορίες σχετικά με την καθορισμένη locale - στην περίπτωσή μας, το thousands_sep () η μέθοδος επιστρέφει τον χαρακτήρα που χρησιμοποιείται για διαχωριστικό χιλιάδων.

Σημείωση Φαίνεται ότι υπάρχουν διαφορές μεταξύ των διαφόρων μεταγλωττιστών ως προς τον τρόπο cout.imbue συμπεριφέρεται. Στο πλαίσιο του Visual C ++ 2005 Express Edition, περιλαμβάνονται αυτοί οι διαχωριστές. Αλλά ο ίδιος κώδικας με το Microsoft Visual C ++ 6.0 δεν έκανε!

Εάν χρησιμοποιείτε οποιαδήποτε από αυτές τις δύο μορφές μορφοποίησης μέσω του cout.setf έπειτα ακρίβεια() ορίζει τον αριθμό των δεκαδικών ψηφίων μετά το δεκαδικό ψηφίο (όχι τον συνολικό αριθμό των ψηφίων) αλλά χάνετε τη μορφοποίηση χιλιάδων. Επίσης, τα μηδενικά (όπως ενεργοποιήθηκαν από το ios_base:: showpoint ) ενεργοποιούνται αυτόματα χωρίς να χρειάζονται σημείωμα.

Θα περίμενες κάτι σαν τιμή 11.0909090909. Στην πραγματικότητα, η τιμή είναι 11. Γιατί είναι αυτό? επειδή η έκφραση στη δεξιά πλευρά (γνωστή ως rvalue) είναι ακέραιος / ακέραιος. Έτσι χρησιμοποιεί αριθμητική ακέραιη που ρίχνει μακριά το κλασματικό μέρος και εκχωρεί 11 στο f. Αλλαγή σε

Στο C, δεν υπάρχει τέτοιος τύπος σαν a bool. Οι εκφράσεις στο C βασίστηκαν σε ένα μηδέν που είναι ψευδές ή ένα μη μηδέν είναι αλήθεια. Στον τύπο C ++ bool μπορεί να πάρει τις αξίες αληθής ή ψευδής. Αυτές οι τιμές εξακολουθούν να είναι ισοδύναμες με 0 και 1. Κάπου στον μεταγλωττιστή θα έχει ένα

Ή τουλάχιστον ενεργεί με αυτόν τον τρόπο! Οι δύο παρακάτω γραμμές είναι έγκυρες χωρίς να χυτεύονται τόσο πίσω από τις σκηνές, οι bulls μετατρέπονται σιωπηρά σε ints και μπορούν ακόμη και να αυξηθούν ή να μειωθούν αν και αυτή είναι πολύ κακή πρακτική.

Το if θα εξακολουθεί να κάνει το αν η κακή μεταβλητή είναι μηδενική αλλά είναι κακός κώδικας και πρέπει να αποφευχθεί. Καλές πρακτικές είναι η χρήση τους όπως προορίζονται. αν (! v) είναι έγκυρο C ++, αλλά προτιμώ το πιο σαφές αν (v! = 0). Αυτό, όμως, είναι θέμα γεύσης, όχι α πρέπει να κάνω διευθυντικός.

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