Περίληψη
Αυτό το μάθημα ανοίγει την όγδοη και τελευταία ενότητα του κύκλου μαθημάτων, αφιερωμένη στα μεγαλύτερα προγράμματα. Εξηγεί τον σκοπό της: να οργανώνουμε, να επαληθεύουμε και να αποσφαλματώνουμε προγράμματα που δεν χωρούν πια σε ένα αρχείο ούτε στο μυαλό· παρουσιάζει τα τρία μαθήματά της και το νήμα που τα ενώνει, το οποίο κλείνει τον κύκλο που άνοιξε στο πρώτο μάθημα (προδιαγραφή, κατασκευή, επαλήθευση)· θυμίζει όσα η ενότητα θεωρεί γνωστά, δηλαδή ολόκληρο τον κύκλο μαθημάτων· διατυπώνει το πρόβλημα που λύνει η ενότητα, εκείνο ενός προγράμματος ενός μόνο αρχείου που λειτουργεί με τα δεδομένα με τα οποία δοκιμάστηκε και αποσιωπά ένα σφάλμα στο όριο της προδιαγραφής του· προαναγγέλλει τη διαφορά ανάμεσα στη δοκιμή και την απόδειξη· και δείχνει πού οδηγεί, στην τελική εργασία και στον κύκλο μαθημάτων Προγραμματισμός σε C++ II.
Μαθησιακοί στόχοι
- Να περιγράφει τη σειρά των περιεχομένων της ενότητας και να εξηγεί τι προσφέρει κάθε μάθημα στο επόμενο.
- Να θυμάται, με ένα παράδειγμα, τη διαφορά ανάμεσα στη δήλωση και τον ορισμό μιας συνάρτησης, τη σύμβαση που την προσδιορίζει και τα στάδια (μεταγλώττιση και σύνδεση) που μετατρέπουν πολλά αρχεία σε ένα πρόγραμμα.
- Να προλαμβάνει, με ένα παράδειγμα, τη διαφορά ανάμεσα στη δοκιμή ενός προγράμματος με μερικές περιπτώσεις και την απόδειξη ότι είναι σωστό για όλες τις αποδεκτές.
- Να αναγνωρίζει τι αναμένεται να ξέρει να κάνει στο τέλος της ενότητας και του κύκλου μαθημάτων και να το διακρίνει από όσα θα μάθει στον κύκλο μαθημάτων Προγραμματισμός σε C++ II.
Αρχική αξιολόγηση
Πριν διατρέξουμε την ενότητα, αξίζει να μετρήσουμε το σημείο εκκίνησης. Η αξιολόγηση αυτή δεν βαθμολογείται: προσανατολίζει τη μελέτη. Οι επτά πρώτες ερωτήσεις ελέγχουν όσα η ενότητα θεωρεί γνωστά (τη δήλωση και τον ορισμό, την προσυνθήκη, τη σύμβαση μιας συνάρτησης της ενότητας 6, τα μηνύματα του συνδέτη, τις περιπτώσεις μιας δυαδικής αναζήτησης, τον πίνακα ίχνους και την ανάγνωση έξω από ένα διάνυσμα)· οι τρεις που ακολουθούν αγγίζουν, με τη σειρά των μαθημάτων, τις κεντρικές ιδέες της ενότητας, και σε αυτές το «Δεν το ξέρω ακόμη» είναι τίμια απάντηση. Κάθε απάντηση εξηγεί το ζήτημα και κατονομάζει το μάθημα που το πραγματεύεται· οι ίδιες δεξιότητες μετρώνται ξανά στο μάθημα της σύνθεσης.
Πριν ξεκινήσεις την ενότητα, μέτρησε το σημείο εκκίνησής σου. Είναι μια σύντομη αυτοαξιολόγηση: δεν βαθμολογείται και το αποτέλεσμα αποθηκεύεται μόνο στον περιηγητή σου.
Ερώτηση 1Από προηγούμενες ενότητεςΤι κάνει η γραμμή
int gcd(int a, int b);γραμμένη πριν από τηmain;Συγχέει δήλωση και ορισμό: χωρίς σώμα δεν υπάρχει τίποτα να εκτελεστεί, και καμία συνάρτηση δεν εκτελείται επειδή είναι γραμμένη, αλλά όταν καλείται.Συγχέει τη δήλωση με την κλήση: μια κλήση δεν περιέχει τους τύπους των παραμέτρων.Αγνοεί ότι στον μεταγλωττιστή αρκεί η υπογραφή για να ελέγξει μια κλήση· την έλλειψη του σώματος, αν δεν το γράψει κανείς, την ανακαλύπτει ο συνδέτης, όχι ο μεταγλωττιστής.Μια δήλωση αρκεί για να ελέγξει ο μεταγλωττιστής κάθε κλήση· ο ορισμός, με το σώμα, μπορεί να βρίσκεται πιο κάτω ή σε άλλο αρχείο. Ολόκληρο το μάθημα Πολλά αρχεία και δικές μας βιβλιοθήκες στηρίζεται σε αυτόν τον διαχωρισμό: η κεφαλίδα δηλώνει, το αρχείο υλοποίησης ορίζει.Επανάληψη: Συναρτήσεις
Ερώτηση 2Από προηγούμενες ενότητεςΗ συνάρτηση
toBase(n, base)έχει την προσυνθήκη «n >= 0και2 <= base <= 10». Ποιος πρέπει να την εξασφαλίσει;Συγχέει την προσυνθήκη με την επικύρωση των εισόδων: η επικύρωση είναι έργο του συνόρου του προγράμματος, όχι κάθε συνάρτησης.Πιστεύει ότι τα σχόλια επαληθεύονται· ο μεταγλωττιστής τα απορρίπτει.Δεν βλέπει ότι η σύμβαση μοιράζει υποχρεώσεις· χωρίς αυτήν, κανείς δεν ξέρει ποιος έκανε λάθος όταν κάτι αστοχεί.Η προσυνθήκη είναι το μέρος της σύμβασης που δεσμεύει όποιον καλεί· σε αντάλλαγμα, η συνάρτηση εγγυάται τη μετασυνθήκη της. Αν η προσυνθήκη παραβιαστεί, η συνάρτηση δεν υπόσχεται τίποτα. Το μάθημα Δοκιμές προγραμμάτων θα διδάξει πώς ελέγχεται μεassertόσο το πρόγραμμα αναπτύσσεται.Επανάληψη: Συναρτήσεις
Ερώτηση 3Από προηγούμενες ενότητεςΗ συνάρτηση
binarySearch(values, target)του μαθήματος 6.4 επιστρέφει μια θέση τουtargetήvalues.size()αν δεν υπάρχει. Ποια είναι η προσυνθήκη της;Με το κενό διάνυσμα ο βρόχος δεν κάνει κανέναν γύρο και η συνάρτηση επιστρέφει 0, που είναι τοvalues.size(): η περίπτωση καλύπτεται από τη μετασυνθήκη.Η συνάρτηση αναφέρει την απουσία· αν απαιτούσε την παρουσία, θα ήταν άχρηστη.Με επαναλήψεις η συνάρτηση επιστρέφει μία από τις θέσεις της τιμής, πράγμα που η μετασυνθήκη επιτρέπει.Κάθε γύρος απορρίπτει το μισό διάστημα συγκρίνοντας με το κεντρικό στοιχείο, και αυτό ισχύει μόνο αν το διάνυσμα είναι ταξινομημένο. Με αταξινόμητα δεδομένα η συνάρτηση απαντά, χωρίς καμία προειδοποίηση, κάτι ψευδές. Η προσυνθήκη γράφεται στη σύμβαση, όπου τη βλέπει όποιος καλεί.Επανάληψη: Αναζήτηση και ταξινόμηση
Ερώτηση 4Από προηγούμενες ενότητεςΈνα πρόγραμμα μεταγλωττίζεται χωρίς σφάλματα και, κατά τη δόμηση του εκτελέσιμου, εμφανίζεται
undefined reference to `tetrahedral(int)'. Ποιο στάδιο απέτυχε;Δεν διακρίνει τα μηνύματα του μεταγλωττιστή, που αναφέρουν ένα αρχείο και μια γραμμή, από εκείνα του συνδέτη, που αναφέρουν αντικειμενικά αρχεία και ονόματα.Το πρόγραμμα δεν πρόλαβε να υπάρξει: χωρίς εκτελέσιμο δεν υπάρχει εκτέλεση.Ένα#includeπου λείπει προκαλείwas not declared in this scopeκατά τη μεταγλώττιση, όχι αυτό το μήνυμα.Ο μεταγλωττιστής δέχτηκε κάθε κλήση επειδή είδε μια δήλωση· ο συνδέτης αναζήτησε τον ορισμό σε όλα τα αντικειμενικά αρχεία και στις βιβλιοθήκες και δεν τον βρήκε. Το μάθημα Πολλά αρχεία και δικές μας βιβλιοθήκες εξηγεί τις συνήθεις αιτίες: ένα αρχείο που δεν μεταγλωττίστηκε ή μια δήλωση αντιγραμμένη με άλλον τύπο.Επανάληψη: Προγράμματα, μεταγλωττιστές και C++
Ερώτηση 5Από προηγούμενες ενότητεςΠοιο από αυτά τα σύνολα περιπτώσεων δοκιμάζει καλύτερα μια δυαδική αναζήτηση;
Συγχέει την ποσότητα με την κάλυψη: δεν δοκιμάζει ποτέ την απουσία ούτε τα όρια, όπου συνήθως βρίσκονται τα σφάλματα.Μια περίπτωση που ήδη πέρασε είναι εκείνη με τη μικρότερη πιθανότητα να αποκαλύψει κάτι νέο.Είναι άπειρα, ή αστρονομικά πολλά μέσα στα όρια του τύπου: η δοκιμή απαιτεί επιλογή.Κάθε περίπτωση ασκεί ένα διαφορετικό όριο του διαστήματος : το διάστημα που είναι κενό από την αρχή, εκείνο που περιορίζεται σε ένα στοιχείο, τα άκρα και τους τρεις τρόπους να μην υπάρχει η τιμή. Η επιλογή των περιπτώσεων από την προδιαγραφή, κατά περιοχές και όρια, είναι το θέμα του μαθήματος Δοκιμές προγραμμάτων.Επανάληψη: Αναζήτηση και ταξινόμηση
Ερώτηση 6Από προηγούμενες ενότητεςΠόσο κάνουν τα
aκαιbμετά απόint a{0}; int b{1}; for (int i{0}; i < 4; ++i) { const int t{a + b}; a = b; b = t; };Μετράει έναν γύρο παραπάνω: μεi < 4το σώμα εκτελείται τέσσερις φορές, όχι πέντε.Μετράει έναν γύρο λιγότερο, το συμμετρικό σφάλμα κατά ένα.Ξεχνά ότι τοtκρατά το άθροισμα που υπολογίστηκε πριν αλλάξει τοa: στον τελευταίο γύρο τοaπαίρνει το 3 τουb, αλλά τοbπαίρνει εκείνο το άθροισμα, το 5, και όχι τη νέα τιμή τουa.Ο πίνακας ίχνους, γύρο προς γύρο, δίνει : τέσσερις γύροι, με τοiαπό 0 έως 3. Είναι ο πίνακας που ο αποσφαλματωτής συμπληρώνει για λογαριασμό εκείνου που προγραμματίζει, και το μάθημα Αποσφαλμάτωση προγραμμάτων τον χρησιμοποιεί για να κρίνει την κατάσταση σε κάθε σημείο διακοπής.Επανάληψη: Βρόχοι
Ερώτηση 7Από προηγούμενες ενότητεςΓιατί το
std::vector<int> v{1, 2}; std::println("{}", v[2]);σταματά με τις επιλογές του κύκλου μαθημάτων και, όταν μεταγλωττίζεται μόνο με-O2, χωρίς τους ανιχνευτές, μπορεί να γράψει έναν οποιονδήποτε αριθμό;Πιστεύει ότι η βελτιστοποίηση επισκευάζει σφάλματα· μόνο αφαιρεί ελέγχους και υποθέτει ότι το πρόγραμμα δεν παραβιάζει το πρότυπο.Αντιστρέφει το αποτέλεσμα: ο έλεγχος που σταματά το πρόγραμμα είναι εκείνος της βιβλιοθήκης χωρίς βελτιστοποίηση.Είναι το σφάλμα κατά ένα των δεικτών: οι δείκτες ενός διανύσματος δύο στοιχείων είναι 0 και 1.Ο δείκτης 2 δεν υπάρχει σε ένα διάνυσμα δύο στοιχείων. Ό,τι παρατηρείται εξαρτάται από τον μεταγλωττιστή και τις επιλογές, και γι’ αυτό οι δοκιμές εκτελούνται με όλους τους ελέγχους ενεργούς, όπως διδάσκει το μάθημα Δοκιμές προγραμμάτων.Επανάληψη: Διανύσματα
Ερώτηση 8Μια κεφαλίδα με φρουρούς συμπερίληψης ορίζει (όχι μόνο δηλώνει) τη
double scale(double x), χωρίςinline, και τη συμπεριλαμβάνουν τοmain.cppκαι τοreport.cpp. Τι συμβαίνει κατά τη δόμηση του προγράμματος;Πιστεύει ότι οι φρουροί δρουν ανάμεσα σε αρχεία· δρουν μέσα σε κάθε μονάδα μετάφρασης.Συγχέει το αρχείο που μεταγλωττίζεται με ολόκληρο το πρόγραμμα: μέσα σε κάθε αρχείο υπάρχει ένας μόνο ορισμός.Είναι τίμια απάντηση: το μάθημα 8.1 το δείχνει με το πραγματικό μήνυμα του συνδέτη.Οι φρουροί εμποδίζουν μια κεφαλίδα να μπει δύο φορές στο ίδιο αρχείο, αλλά κάθε.cppμεταγλωττίζεται χωριστά και παίρνει το δικό του αντίγραφο του ορισμού: ο συνδέτης βρίσκει δύο. Είναι ο κανόνας του ενός ορισμού, από το μάθημα Πολλά αρχεία και δικές μας βιβλιοθήκες.Επανάληψη: Πολλά αρχεία και δικές μας βιβλιοθήκες
Ερώτηση 9Μια συνάρτηση περνά πεντακόσιες αυτοματοποιημένες δοκιμές επιλεγμένες με προσοχή. Τι μπορεί να ισχυριστεί κανείς;
Συγχέει την αφθονία με την απόδειξη· ένα σφάλμα σε ένα όριο που δεν άγγιξε καμία περίπτωση επιβιώνει από οποιονδήποτε αριθμό εσωτερικών περιπτώσεων.Οι περιπτώσεις δεν είναι τυχαίο δείγμα των πιθανών σφαλμάτων, και η συχνότητα των επιτυχιών δεν μετρά την πιθανότητα να είναι σωστό το πρόγραμμα.Είναι τίμια απάντηση: το μάθημα 8.2 αρχίζει από αυτή την ερώτηση.Μια δοκιμή μπορεί να δείξει την παρουσία ενός σφάλματος, ποτέ την απουσία του: ο ισχυρισμός της ορθότητας για όλες τις περιπτώσεις απαιτεί ένα επιχείρημα, όπως η αναλλοίωτη του μαθήματος 4.3, όχι έναν κατάλογο περιπτώσεων. Οι καλά επιλεγμένες δοκιμές κάνουν απίθανο να περάσει ένα κοινό σφάλμα, και γι’ αυτό αξίζουν τόσο. Το μάθημα Δοκιμές προγραμμάτων αναπτύσσει αυτή τη διάκριση.Επανάληψη: Δοκιμές προγραμμάτων
Ερώτηση 10Ένα σημείο διακοπής βρίσκεται στη γραμμή
total += k;, μέσα σε έναν βρόχο, και το πρόγραμμα σταματά εκεί για τρίτη φορά. Τι δείχνει η επισημασμένη γραμμή;Συγχέει τη στάση με το βήμα που έχει ήδη γίνει.Συγχέει το σημείο όπου σταματά το πρόγραμμα, που το επιλέγει όποιος αποσφαλματώνει, με την αιτία της αστοχίας.Είναι τίμια απάντηση: το μάθημα 8.3 πραγματεύεται τα σημεία διακοπής και τα βήματα.Ο αποσφαλματωτής σταματά πριν από τη σημειωμένη γραμμή· η τιμή τουtotalπου δείχνει είναι εκείνη των δύο γύρων που προηγήθηκαν. Αν συγχυστεί αυτό, οι πίνακες ίχνους βγαίνουν μετατοπισμένοι κατά μία σειρά. Το μάθημα Αποσφαλμάτωση προγραμμάτων το αναπτύσσει.Επανάληψη: Αποσφαλμάτωση προγραμμάτων
Φόρτωση του περιεχομένου…
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας