DAVID J. MALAN: Όπως ίσως γνωρίζετε, Οι θερμοκρασίες μετρώνται χρησιμοποιώντας διαφορετικές κλίμακες σε διαφορετικούς μέρη του κόσμου. Για παράδειγμα, 212 βαθμούς Fahrenheit είναι 100 βαθμούς Κελσίου και 32 βαθμούς Fahrenheit είναι 0 βαθμούς Κελσίου. Δεν θα ήταν ωραίο αν είχαμε έναν υπολογιστή πρόγραμμα που μας επέτρεψε να μετατρέψετε από, ας πούμε, Fahrenheit σε Κελσίου; Λοιπόν, μπορούμε να γράψουμε αυτό το πρόγραμμα. Ας ξεκινήσουμε με την πρώτη να περιλαμβάνει cs50.h, έτσι ώστε να μπορούμε να χρησιμοποιήσουμε μια συνάρτηση που ονομάζεται πάρετε πλωτήρα, ο οποίος, όπως get int, παίρνει ένα αριθμό από τον χρήστη, αλλά αυτή τη φορά μια Αριθμός κινητής υποδιαστολής - ένα με ένα δεκαδικό ψηφίο. Ας περιλαμβάνουν επίσης στάνταρ io.h έτσι ώστε να έχουμε πρόσβαση σε λειτουργίες όπως η εκτύπωση f. Και ας επίσης να κηρύξει κατά τον συνήθη τρόπο. Ας επόμενη προτρέπει το χρήστη για θερμοκρασία σε βαθμούς Φαρενάιτ. Ας δούμε τώρα πραγματικά να πάρει την θερμοκρασία αυτή από τον χρήστη, πρώτα από με την οποία μια μεταβλητή που ονομάζεται στ τύπου float. Ο πλωτήρας, πάλι, που σημαίνει ότι μια μεταβλητή που αποθηκεύει ένα Μιατιμήκινητήςυποδιαστολής, ένα με ένα δεκαδικό ψηφίο. Ας αναθέσει την επιστροφή αξία του get float. Και τότε ας κάνουμε ένα κομμάτι της αριθμητικής σε αυτό, το πρώτο που κηρύσσει μια άλλη float που ονομάζεται C για Κελσίου και κατάστημα στην C το αποτέλεσμα κάποιας κοινής αριθμητικής. 5.0 διαιρείται με 9,0 φορές F μείον 32,0. Ας τώρα να εκτυπώσετε το αποτέλεσμα του παρόντος υπολογισμού. τοις εκατό στ - σηματοδοτώντας ένα σύμβολο κράτησης θέσης για Μιατιμήκινητήςυποδιαστολής - κόμμα C για να εκτυπώσετε το θερμοκρασία σε βαθμούς Κελσίου. Ας σώσει την τελική μου. Συντάξτε με F έως C. Εκτελέστε το πρόγραμμα με dot κάθετος F έως C. Και ας προσπαθήσουμε αυτές τις κοινές θερμοκρασίες. 212 βαθμούς Φαρενάιτ είναι 100 βαθμούς Κελσίου. 32 βαθμούς Fahrenheit είναι 0 βαθμούς Κελσίου. Τώρα αφήνει να βελτιώσετε αυτό το πρόγραμμα λίγο λίγο με το να μην την εκτύπωση τόσο πολλά τα 0 μετά από αυτή την δεκαδικό ψηφίο. Για να το κάνετε αυτό, θα πάω να να επιστρέψετε στην γραμμή 11. Και όχι μόνο προσδιορίζει τοις εκατό f, Πάω να καθορίσετε αντί, ας πούμε, 0,1 f, ενημερώνοντας εκτύπωσης που μόνο στ θέλετε να εκτυπώσετε ένα Μιατιμήκινητήςυποδιαστολής σε μία τιμή μετά το δεκαδικό ψηφίο. Ας αποθηκεύσετε ξανά το πρόγραμμά μου. Επαναμεταγλωττίστε με make F έως C. Στη συνέχεια, ξανατρέχετε με dot κάθετο F έως C. Και ας επαναλάβετε με, ας πούμε, 212, που μου δίνει 100,0. Τώρα αξίζει να σημειωθεί ότι το έκανα κάτι πολύ σκόπιμα γραμμή 9. Παρατηρήστε πως έγραψα 5 είναι 5,0, 9 ως 9.0, και ακόμη και 32 ως 32,0. Λοιπόν, οι δύο πρώτες από αυτές τις τιμές ήταν πολύ σκοπίμως επέλεξε να τιμές κινητής υποδιαστολής, όχι μόνο επειδή συνέπειας με την υπόλοιπη του προγράμματός μου - το οποίο περιλαμβάνει σαφώς κυμαινόμενο τιμές σημείο - αλλά επειδή αποδεικνύεται ότι C, Αν διαιρέσει μια int int από ένα άλλο, το προκύπτουσα απάντηση που πρόκειται να πάρει είναι ίδια int, ακόμη και αν αυτό σημαίνει ότι πρέπει να πετάξουν τα πάντα μετά την υποδιαστολή. Με άλλα λόγια, αν μπορώ να αλλάξω αυτό το 5,0 έως 5 ή αυτό το 9,0 έως 9 και στη συνέχεια αποθηκεύστε πάλι το πρόγραμμά μου, recompile με τη μάρκα F σε C, και στη συνέχεια εκτελέστε ξανά με dot κάθετος F στο C και το είδος σε μία είσοδο, όπως 212, παρατηρήσετε ότι η απάντηση θα πάω να να πάρει αυτή τη φορά είναι πραγματικά εντελώς λάθος. 0.0 δεν είναι ο σωστός βαθμός στον Κελσίου και Φαρενάιτ 212. Λοιπόν, τι συμβαίνει; Λοιπόν, στη γραμμή 9, γιατί 5 είναι τώρα ακέραιος και επειδή 9 είναι τώρα ακέραιος, το αποτέλεσμα μαθηματικά θα πρέπει να είναι 0,5555 και ούτω καθεξής. Αλλά επειδή το αποτέλεσμα, σύμφωνα με την Κανόνες Γ, πρέπει να είναι int, ότι 0.5555 παίρνει ρίχνονται μακριά, αφήνοντας μας με μόλις 0. Έτσι, στο τέλος, καταλήγω πολλαπλασιάζοντας εντελώς τυχαία 0 φορές στ μείον 32.0, η οποία είναι δεν έχει σημασία τι πάντα θα μου δώσει 0. Έτσι, να έχετε κατά νου, κάθε φορά χρησιμοποιώντας τιμές κινητής υποδιαστολής σε εγγύτητα ints, ίσως όχι απαραίτητα πάρετε την απάντηση, έτσι ώστε να περιμένετε. Και γι 'αυτό προσέχετε να χρησιμοποιήσει, όπως έκανα και στην πρώτη περίπτωση, οι τιμές κινητής υποδιαστολής για να αποφευχθεί το οποιοδήποτε τέτοιου είδους ζητήματα.