Περίληψη
Αυτό το μάθημα ανοίγει τη δεύτερη ενότητα του κύκλου μαθημάτων, αφιερωμένη στα δεδομένα και στους τύπους τους. Εξηγεί σε τι χρησιμεύει η ενότητα: να διδάξει ότι κάθε δεδομένο ενός προγράμματος ζει στη μνήμη με έναν τύπο που ορίζει ποιες τιμές μπορεί να πάρει, πόσο χώρο πιάνει και ποιες πράξεις δέχεται, και ότι τα όρια αυτά έχουν παρατηρήσιμες συνέπειες· παρουσιάζει τα τέσσερα μαθήματά της και το νήμα που τα ενώνει, από τη μεταβλητή ως κελί με όνομα και τιμή ως τις μετατροπές μεταξύ τύπων και τις σταθερές· υπενθυμίζει όσα η ενότητα θεωρεί γνωστά από την πρώτη, δηλαδή να γράφει κανείς, να μεταγλωττίζει και να εκτελεί ένα πρόγραμμα που διαβάζει και γράφει· διατυπώνει το πρόβλημα που λύνει η ενότητα, το πρόβλημα ενός προγράμματος φαινομενικά σωστού του οποίου οι λογαριασμοί δεν συμπίπτουν με εκείνους των μαθηματικών, αρχίζοντας από το άθροισμα , που σε έναν υπολογιστή δεν δίνει ακριβώς · και δείχνει πού οδηγεί, στις ενότητες που ακολουθούν και στον κύκλο μαθημάτων Προγραμματισμός σε C++ II.
Μαθησιακοί στόχοι
- Να περιγράφουμε τη σειρά των περιεχομένων της ενότητας και να εξηγούμε τι προσφέρει κάθε μάθημα σε εκείνο που ακολουθεί.
- Να θυμόμαστε όσα χρειάζονται από την ενότητα 1 (τον κύκλο μεταγλώττισης και εκτέλεσης, την έξοδο με μορφοποίηση, την ανάγνωση με
std::cinκαι την ανάγνωση των μηνυμάτων του μεταγλωττιστή) και να τα επαναλαμβάνουμε, αν χρειάζεται. - Να εξηγούμε, με ένα παράδειγμα, γιατί ένας αριθμός ενός προγράμματος δεν είναι αριθμός των μαθηματικών, και να προαναγγέλλουμε γιατί το δεν είναι ακριβώς σε έναν υπολογιστή.
- Να αναγνωρίζουμε τι αναμένεται να ξέρουμε να κάνουμε στο τέλος της ενότητας, και να το διακρίνουμε από όσα θα μάθουμε στις ενότητες που ακολουθούν.
Αρχική αξιολόγηση
Πριν διατρέξουμε την ενότητα, αξίζει να μετρήσουμε το σημείο εκκίνησης. Η αξιολόγηση αυτή είναι αυτοαξιολόγηση: δεν βαθμολογείται, και μοναδικός σκοπός της είναι να προσανατολίσει τη μελέτη. Οι τέσσερις πρώτες ερωτήσεις ελέγχουν όσα η ενότητα θεωρεί γνωστά από την πρώτη: την παρακολούθηση μιας διαδικασίας βήμα προς βήμα, τη γραφή ενός αριθμού με δύο δεκαδικά ψηφία, τη στρογγυλοποίηση και την ανάγνωση ενός μηνύματος σφάλματος. Οι έξι που ακολουθούν αγγίζουν, με τη σειρά των μαθημάτων, τις κεντρικές ιδέες της ενότητας. Κανείς δεν είναι υποχρεωμένος να τις απαντήσει σωστά ακόμη, και σε μία από αυτές το «δεν το ξέρω ακόμη» είναι τίμια απάντηση: κάθε απάντηση, σωστή ή λανθασμένη, εξηγεί το ζήτημα και κατονομάζει το μάθημα που το πραγματεύεται. Οι ίδιες δεξιότητες μετρώνται ξανά στο τέλος, στο μάθημα της σύνθεσης.
Πριν ξεκινήσεις την ενότητα, μέτρησε το σημείο εκκίνησής σου. Είναι μια σύντομη αυτοαξιολόγηση: δεν βαθμολογείται και το αποτέλεσμα αποθηκεύεται μόνο στον περιηγητή σου.
Ερώτηση 1Από προηγούμενες ενότητεςΜια διαδικασία λέει: «1. Η παίρνει την τιμή 17. 2. Η παίρνει την τιμή . 3. Η παίρνει την τιμή ». Πόσο κάνει η στο τέλος;
Υποθέτει ότι κάθε βήμα ξεκινά από την αρχική τιμή· το δεύτερο ξεκινά από την τιμή που άφησε το πρώτο.Διαβάζει το «παίρνει την τιμή» ως μαθηματική ισότητα· είναι εντολή που αντικαθιστά την τιμή της .Συγχέει μια μεταβλητή με μια σταθερά: η τιμή μιας μεταβλητής αλλάζει κάθε φορά που της ανατίθεται άλλη.Κάθε βήμα ξεκινά από την τιμή που έχει η εκείνη τη στιγμή, όχι από την αρχική. Η εκτέλεση της διαδικασίας με το χέρι, με την τιμή κάθε μεταβλητής μετά από κάθε βήμα, είναι ο πίνακας ίχνους της ενότητας 1, και το μάθημα 2.1 τον κάνει το εργαλείο με το οποίο συλλογιζόμαστε για την κατάσταση ενός προγράμματος.Επανάληψη: Από το πρόβλημα στον αλγόριθμο
Ερώτηση 2Από προηγούμενες ενότητεςΤι γράφει η εντολή
std::println("{:.2f}", 2.0 / 3);;Νομίζει ότι η προδιαγραφή μορφής αποκόπτει· στρογγυλοποιεί στο πλησιέστερο δεκαδικό.Αγνοεί την προδιαγραφή μορφής: αυτή είναι η γραφή χωρίς.2f.Νομίζει ότι η διαίρεση είναι ακέραια· με το2.0, που έχει δεκαδικά, η διαίρεση είναι πραγματική.Η προδιαγραφή.2fγράφει τον αριθμό με δύο δεκαδικά ψηφία, στρογγυλοποιώντας: το γράφεται0.67. Η αποθηκευμένη τιμή δεν αλλάζει· αλλάζει μόνο η γραφή της.Επανάληψη: Είσοδος, έξοδος και σφάλματα
Ερώτηση 3Από προηγούμενες ενότητεςΘέλουμε να γράψουμε το με δύο δεκαδικά ψηφία, στρογγυλοποιώντας. Τι παίρνουμε;
Αποκόπτει αντί να στρογγυλοποιεί: απορρίπτει το τρίτο ψηφίο χωρίς να το κοιτάξει.Στρογγυλοποιεί σε ένα δεκαδικό, όχι σε δύο.Αυξάνει το δεύτερο δεκαδικό ψηφίο περισσότερο απ’ όσο πρέπει: το βρίσκεται μεταξύ του και του , και η στρογγυλοποίηση διαλέγει έναν από αυτούς τους δύο.Στρογγυλοποίηση σε δύο δεκαδικά σημαίνει να επιλέξουμε τον πλησιέστερο αριθμό με δύο δεκαδικά: το είναι πιο κοντά στο παρά στο . Το μάθημα 2.3 θα δείξει ότι ο υπολογιστής στρογγυλοποιεί με τον ίδιο τρόπο, αλλά στη βάση 2, και ότι γι’ αυτό σχεδόν κανένας αριθμός με δεκαδικά δεν αποθηκεύεται ακριβώς.Επανάληψη: Είσοδος, έξοδος και σφάλματα
Ερώτηση 4Από προηγούμενες ενότητεςΈνα πρόγραμμα έχει στη γραμμή 5
const int pages{12}και στη γραμμή 6std::println("{}", pages);. Ο μεταγλωττιστής γράφει6:5: error: expected ',' or ';' before 'std'. Πού βρίσκεται το ελάττωμα;Η γραμμή 6 είναι σωστή· ο μεταγλωττιστής τη δείχνει επειδή εκεί αντιλήφθηκε την έλλειψη.Τοstdαναγνωρίζεται· το μήνυμα λέει ότι περίμενε ένα ερωτηματικό πριν από αυτό.Το μήνυμα λέειerror, όχιwarning: δεν υπάρχει εκτελέσιμο αρχείο.Ο μεταγλωττιστής ανακαλύπτει την έλλειψη όταν συναντά κάτι που δεν μπορεί να ακολουθεί τη δήλωση, στην αρχή της γραμμής 6, και δείχνει εκείνο το σημείο. Αν η γραμμή που δείχνει είναι σωστή, το ελάττωμα βρίσκεται συνήθως στο τέλος της γραμμής που προηγείται.Επανάληψη: Ανατομία ενός προγράμματος
Ερώτηση 5Ένα πρόγραμμα δηλώνει
int a{2};καιint b{7};, και έπειτα εκτελείa = b;καιb = 10;. Πόσο κάνει ηaστο τέλος;Νομίζει ότι η ανάθεση δένει τις δύο μεταβλητές, σαν να ήταν ηaάλλο όνομα τηςb· απλώς αντιγράφει την τιμή.Διαβάζει τοa = bανάποδα, σαν να αντέγραφε τηνaστηb· η τιμή πηγαίνει από τα δεξιά προς τα αριστερά.Προσθέτει τις δύο τιμές· η ανάθεση αντικαθιστά, δεν συσσωρεύει.Η ανάθεσηa = bαντιγράφει στηνaτην τιμή που έχει ηbεκείνη τη στιγμή· από εκεί και πέρα, ηaκαι ηbείναι ανεξάρτητα κελιά, και η αλλαγή τηςbδεν αλλάζει τηνa.Επανάληψη: Μεταβλητές και μνήμη
Ερώτηση 6Πώς γράφεται ο αριθμός 13 στη βάση 2;
Είναι τίμια απάντηση: το μάθημα 2.2 διδάσκει πώς γράφεται ένας αριθμός στη βάση 2 και πώς διαβάζεται, και η τελική αξιολόγηση θα το ρωτήσει ξανά.Διαβάζει τα υπόλοιπα των διαδοχικών διαιρέσεων με τη σειρά που εμφανίζονται· διαβάζονται από το τελευταίο προς το πρώτο.Αθροίζει λάθος τα βάρη: .Στη βάση 2 κάθε θέση ζυγίζει το διπλάσιο από εκείνη που βρίσκεται στα δεξιά της, και τα ψηφία είναι μόνο 0 και 1. Το μάθημα 2.2 το διδάσκει, επειδή κάθε ακέραιος ενός προγράμματος αποθηκεύεται έτσι.Επανάληψη: Οι ακέραιοι και η αναπαράστασή τους
Ερώτηση 7Ένας
int4 byte αποθηκεύει το , τη μέγιστη τιμή του, και το πρόγραμμα του προσθέτει 1. Τι μπορούμε να πούμε;Αγνοεί το όριο της αναπαράστασης: αυτός ο αριθμός δεν χωρά σε ένανint4 byte.Έτσι συμπεριφέρονται οι μη προσημασμένοι ακέραιοι, των οποίων η αριθμητική είναι αριθμητική υπολοίπων· για τους προσημασμένους ακεραίους, το πρότυπο δεν το εγγυάται.Ο μεταγλωττιστής δεν γνωρίζει τις τιμές που θα έχει το πρόγραμμα κατά την εκτέλεση, εκτός αν είναι σταθερές· σχεδόν πάντα μεταγλωττίζει χωρίς να πει τίποτα.Ένας ακέραιος ενός προγράμματος έχει σταθερό πλήθος bit και, μαζί τους, πεπερασμένο εύρος τιμών. Η έξοδος από το εύρος τιμών ενός προσημασμένου ακεραίου παραβιάζει την προϋπόθεση της πρόσθεσης· ο ανιχνευτής (sanitizer) του κύκλου μαθημάτων σταματά το πρόγραμμα, και χωρίς αυτόν το πρόγραμμα μπορεί να γράψει οτιδήποτε. Το μάθημα 2.2 το μελετά.Επανάληψη: Οι ακέραιοι και η αναπαράστασή τους
Ερώτηση 8Έχει το πεπερασμένη δεκαδική παράσταση;
Το είναι προσέγγιση: , όχι 1.Όσα κι αν γραφτούν, περισσεύει πάντα ένα υπόλοιπο· το ανάπτυγμα είναι περιοδικό, όχι πεπερασμένο.Είναι ιδιότητα του αριθμού και της βάσης, όχι του οργάνου· η αριθμομηχανή δείχνει μόνο μια προσέγγιση.Ένα ανάγωγο κλάσμα έχει πεπερασμένη δεκαδική παράσταση αν και μόνο αν ο παρονομαστής του δεν έχει άλλους πρώτους παράγοντες εκτός από το 2 και το 5, εκείνους της βάσης 10. Στη βάση 2 η συνθήκη είναι αυστηρότερη: ο παρονομαστής πρέπει να είναι δύναμη του 2, και γι’ αυτό το δεν έχει πεπερασμένη δυαδική παράσταση. Το μάθημα 2.3 αντλεί από αυτό τις συνέπειές του.Επανάληψη: Οι αριθμοί κινητής υποδιαστολής
Ερώτηση 9Τι γράφει το
std::println("{}", 0.1 + 0.2);;Υποθέτει ότι ο υπολογιστής προσθέτει ακριβείς δεκαδικούς· προσθέτει δυαδικές προσεγγίσεις.Συγχέει την προεπιλεγμένη γραφή με την προδιαγραφή{:.2f}, που στρογγυλοποιεί σε δύο δεκαδικά.Το άθροισμα δύοdoubleείναι θεμιτό· εκείνο που εκπλήσσει είναι το αποτέλεσμά του, όχι η γραφή του.Ούτε το ούτε το αποθηκεύονται ακριβώς στο δυαδικό, και το άθροισμα των προσεγγίσεών τους δεν είναι η προσέγγιση του . Ηstd::printlnγράφει τη συντομότερη παράσταση που προσδιορίζει την αποθηκευμένη τιμή, και αυτή η παράσταση αποκαλύπτει τη διαφορά. Το μάθημα 2.3 εξηγεί ψηφίο προς ψηφίο από πού προκύπτει.Επανάληψη: Οι αριθμοί κινητής υποδιαστολής
Ερώτηση 10Ένα πρόγραμμα δηλώνει
const double ratio{7 / 2};και γράφει τηratio. Τι εμφανίζεται;Νομίζει ότι ο τύπος της μεταβλητής αποφασίζει πώς γίνεται η διαίρεση· το αποφασίζει ο τύπος των τελεσταίων.Νομίζει ότι η ακέραια διαίρεση στρογγυλοποιεί· απορρίπτει το δεκαδικό μέρος.Η τιμή 3 είναι σταθερή και παριστάνεται ακριβώς σε ένανdouble: δεν υπάρχει απώλεια, και τα άγκιστρα το επιτρέπουν.Η διαίρεση7 / 2γίνεται μεταξύ ακεραίων και δίνει το ακέραιο πηλίκο, 3· μόνο μετά το 3 αυτό μετατρέπεται σεdouble. Το ποια διαίρεση γίνεται αποφασίζεται μέσα στην πράξη, σύμφωνα με τον τύπο των τελεσταίων, και όχι κατά την αποθήκευση του αποτελέσματος. Το μάθημα 2.4 διδάσκει πού μπαίνει η μετατροπή για να πάρουμε 3,5.Επανάληψη: Χαρακτήρες, λογικές τιμές, μετατροπές και σταθερές
Φόρτωση του περιεχομένου…
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας