Περίληψη
Αυτό το μάθημα αποτελεί την αρχική ενότητα του κύκλου μαθημάτων και εκθέτει ολόκληρο το πρόγραμμα σπουδών του. Δηλώνει τον σκοπό του κύκλου, που είναι ο ίδιος ο προγραμματισμός και όχι μια γλώσσα· εξηγεί γιατί οι θεμελιώδεις αρχές του διδάσκονται σε C++, μια γλώσσα που δεν κρύβει τη μηχανή, και όχι σε μια γλώσσα με ηπιότερη καμπύλη μάθησης· επισημαίνει σε ποιους φοιτητές απευθύνεται, το λίγο που θεωρεί γνωστό και τους κύκλους μαθημάτων στους οποίους οδηγεί· διατυπώνει τους επτά γενικούς μαθησιακούς στόχους και τις ενότητες που συμβάλλουν στον καθένα· περιγράφει τις οκτώ ενότητες περιεχομένου και τα μαθήματα που τις απαρτίζουν· εκτιμά τον συνολικό φόρτο εργασίας που απαιτεί ο κύκλος, την κατανομή του ανά ενότητα, έναν προτεινόμενο ρυθμό μελέτης και τις πιστωτικές μονάδες του· εξηγεί πώς είναι φτιαγμένα τα μαθήματά του και, τέλος, δίνει συμβουλές για τον τρόπο μελέτης του, για τη χρήση βοηθών τεχνητής νοημοσύνης και για τον έλεγχο εκδόσεων.
Μαθησιακοί στόχοι
- Να περιγράφει τη σειρά των οκτώ ενοτήτων του κύκλου και να εξηγεί τι προσφέρει η καθεμιά στις επόμενες.
- Να διατυπώνει τους επτά γενικούς μαθησιακούς στόχους του κύκλου και να αναγνωρίζει ποιες ενότητες συμβάλλουν στον καθένα.
- Να εξηγεί με ένα παράδειγμα γιατί ο κύκλος διδάσκει τις θεμελιώδεις αρχές του προγραμματισμού σε C++ και όχι σε μια γλώσσα που κρύβει τους τύπους και τη μνήμη.
- Να υπολογίζει, με βάση τις εκτιμώμενες ώρες ανά ενότητα, τον φόρτο που απαιτεί ο κύκλος ή ένα μέρος του, και να σχεδιάζει με αυτόν έναν προσωπικό ρυθμό μελέτης.
Σκοπός
Ο κύκλος μαθημάτων διδάσκει πώς γράφει κανείς σωστά προγράμματα από το μηδέν: πώς μετατρέπει ένα πρόβλημα διατυπωμένο με λόγια σε μια ακριβή ακολουθία εντολών, πώς επιλέγει να αναπαραστήσει τα δεδομένα, πώς κατευθύνει τη σειρά με την οποία εκτελείται ό,τι γράφτηκε και πώς οργανώνει τον κώδικα σε συναρτήσεις με σαφή διεπαφή. Αν αυτό ισχύει, το αντικείμενό του δεν είναι μια γλώσσα, αλλά ο ίδιος ο προγραμματισμός: να σκέφτεται κανείς έναν αλγόριθμο, να αναπαριστά τα δεδομένα, να αποσυνθέτει ένα πρόβλημα και να συλλογίζεται για την ορθότητα και το κόστος όσων γράφει. Γι’ αυτό ονομάζεται «Θεμελιώδεις αρχές του προγραμματισμού», και γι’ αυτό κάθε κατασκευή της C++ παρουσιάζεται μαζί με το πρόβλημα που λύνει και με τον τρόπο που συλλογιζόμαστε γι’ αυτήν, και ποτέ ως κατάλογος σύνταξης.
Η C++ είναι, επομένως, το όργανο του κύκλου και όχι ο σκοπός του. Ωστόσο, ένα όργανο δεν είναι αδιάφορο για όσα μαθαίνονται με αυτό, και η επιλογή του συγκεκριμένου, που με την πρώτη ματιά φαίνεται η δυσκολότερη, είναι σκόπιμη· η επόμενη παράγραφος την αιτιολογεί. Αξίζει όμως να προαναγγείλουμε την πιο ορατή συνέπειά της: κάθε σύνθεση ενότητας περιέχει μια σταθερή παράγραφο, «Όσα ισχύουν σε κάθε γλώσσα», που χωρίζει όσα μάθαμε από τη μορφή τους στη C++ και λέει πώς εκφράζονται, ή τι αλλάζει, σε άλλες γλώσσες. Από αυτό έπεται ότι ο φοιτητής που θα ολοκληρώσει τον κύκλο δεν θα ξέρει μόνο να γράφει σε C++, αλλά και να αναγνωρίζει σε οποιαδήποτε γλώσσα τις ίδιες ιδέες με άλλο ένδυμα.
Γιατί C++ και όχι μια πιο φιλική γλώσσα
Υπάρχουν γλώσσες με ομαλότερη καμπύλη μάθησης, όπως η Python, στις οποίες ένα πρώτο χρήσιμο πρόγραμμα γράφεται σε λίγες γραμμές, χωρίς δήλωση τύπων, χωρίς μεταγλώττιση και χωρίς να αναρωτιέται κανείς πού ζει ένα δεδομένο. Αν ο σκοπός ήταν να γράφει κανείς γρήγορα προγράμματα που λειτουργούν, αυτός θα ήταν ο δρόμος. Ο σκοπός αυτού του κύκλου μαθημάτων, αντίθετα, είναι να κατανοήσει κανείς τι κάνει ένα πρόγραμμα, και γι’ αυτό ταιριάζει μια γλώσσα που δεν κρύβει τη μηχανή. Η C++ αναγκάζει να δει κανείς έξι πράγματα που οι πιο βολικές γλώσσες επιλύουν σιωπηλά:
- Οι τύποι. Κάθε δεδομένο δηλώνεται με έναν τύπο, που ορίζει ποιες τιμές μπορεί να πάρει, πόσο χώρο καταλαμβάνει και ποιες πράξεις δέχεται· ο μεταγλωττιστής απορρίπτει ό,τι δεν ταιριάζει πριν εκτελεστεί οτιδήποτε.
- Η μεταγλώττιση. Η συγγραφή, η μεταγλώττιση, η σύνδεση και η εκτέλεση είναι διαφορετικές στιγμές, και κάθε σφάλμα ανήκει σε μία από αυτές· το να ξέρει κανείς σε ποια είναι η μισή διόρθωση.
- Η μνήμη. Μια μεταβλητή είναι ένα κελί μνήμης με όνομα, με διάρκεια ζωής και εμβέλεια· μια αναφορά είναι ένα άλλο όνομα για την ίδια θέση, και μια αναφορά σε μια θέση που δεν υπάρχει πια είναι πραγματικό σφάλμα.
- Το κόστος της αντιγραφής. Η μεταβίβαση ενός διανύσματος σε μια συνάρτηση μπορεί να το αντιγράψει ολόκληρο· η επιλογή ανάμεσα σε τιμή και αναφορά είναι απόφαση εκείνου που προγραμματίζει, και όχι της μηχανής.
- Τα όρια των αριθμών. Ένας ακέραιος 32 bit δεν ξεπερνά το , και ένας αριθμός κινητής υποδιαστολής δεν αποθηκεύει το με ακρίβεια.
- Η απροσδιόριστη συμπεριφορά. Ό,τι δεν ορίζει το πρότυπο (η έξοδος από τα όρια ενός πίνακα, η υπερχείλιση ενός προσημασμένου ακεραίου, η ανάγνωση μιας μη αρχικοποιημένης μεταβλητής) δεν προκαλεί εγγυημένο σφάλμα, αλλά οτιδήποτε· γι’ αυτό ο κύκλος μεταγλωττίζει πάντα με προειδοποιήσεις και με ανιχνευτές (sanitizers).
Το παράδειγμα που ακολουθεί το δείχνει σε μικρή κλίμακα. Το πρόγραμμα υπολογίζει τα παραγοντικά από το έως το σε μια μεταβλητή τύπου int. Στην Python, της οποίας οι ακέραιοι μεγαλώνουν χωρίς όριο, ο ίδιος υπολογισμός θα τύπωνε χωρίς παράπονο · στη C++, το γινόμενο του επί δεν χωράει σε έναν int, και ο ανιχνευτής απροσδιόριστης συμπεριφοράς, με τον οποίο ο κύκλος μεταγλωττίζει όλα τα παραδείγματά του, σταματά το πρόγραμμα στην ακριβή γραμμή:
#include <print>int main(){ int factorial{1}; for (int n{1}; n <= 15; ++n) { factorial = factorial * n; // χωράει το γινόμενο σε int; std::println("{}! = {}", n, factorial); }}1! = 12! = 23! = 64! = 245! = 1206! = 7207! = 50408! = 403209! = 36288010! = 362880011! = 3991680012! = 479001600main.cpp:7:31: runtime error: signed integer overflow: 479001600 * 13 cannot be represented in type 'int'Το πρόγραμμα τερμάτισε με κωδικό 1.
Αν αυτό ισχύει, η γλώσσα μάς ανάγκασε να θέσουμε ένα ερώτημα που η άλλη θα είχε κρύψει: πόσο χωράει στον τύπο που επιλέξαμε και τι κάνουμε όταν δεν χωράει. Καμία από τις δύο απαντήσεις δεν είναι καλύτερη αφηρημένα· αυτό που μετράει είναι να ξέρουμε ότι το ερώτημα υπάρχει. Το μάθημα Οι ακέραιοι και η αναπαράστασή τους το απαντά, και η παράγραφος για την απροσδιόριστη συμπεριφορά κάθε σύνθεσης επανέρχεται σε αυτό.
Από αυτό έπεται μια ασυμμετρία, που είναι ο βαθύτερος λόγος της επιλογής. Όποιος μαθαίνει τις θεμελιώδεις αρχές σε C++ καταλαβαίνει έπειτα τι κάνουν γι’ αυτόν οι πιο βολικές γλώσσες: τον συλλέκτη απορριμμάτων, τους ακεραίους χωρίς όριο, τον έλεγχο των ορίων στην πρόσβαση με δείκτη, τη σιωπηρή μετατροπή των τύπων. Όποιος μαθαίνει πρώτα σε μία από αυτές, αντίθετα, αφήνει αυτά τα στρώματα αθέατα και σκοντάφτει πάνω τους αργότερα, όταν ένα πραγματικό πρόγραμμα αποτυγχάνει για μία από τις αιτίες που η γλώσσα τού είχε κρύψει. Επομένως, ο δρόμος που επιλέγει ο κύκλος είναι πιο απαιτητικός στην αρχή, αλλά πιο μεταβιβάσιμος: όσα μαθαίνονται εδώ ισχύουν σε κάθε γλώσσα, ενώ όσα μαθαίνονται σε μια γλώσσα που τα κρύβει δεν ισχύουν πάντα εδώ.
Ωστόσο, η C++ είναι μεγάλη γλώσσα, και ένας κύκλος θεμελιωδών αρχών πρέπει να αντισταθεί στον πειρασμό να τη διδάξει ολόκληρη. Αυτός ο πρώτος κύκλος περιορίζεται στον δομημένο προγραμματισμό (δεδομένα, εκφράσεις, έλεγχος ροής, ακολουθίες, κείμενο και συναρτήσεις) στο πρότυπο C++23, με τις σύγχρονες μορφές του: την έξοδο με τη std::println, τις ακολουθίες με τα std::array και std::vector, το κείμενο με το std::string, τους αλγορίθμους της βιβλιοθήκης στη μορφή τους με ranges. Αφήνει για τον Προγραμματισμό σε C++ II ό,τι απαιτεί αυτή τη βάση: τους δείκτες και τη δυναμική μνήμη, τις κλάσεις με μεθόδους, τα δικά μας templates, τις ανώνυμες συναρτήσεις και τις εξαιρέσεις.
Σε ποιους απευθύνεται και προαπαιτούμενες γνώσεις
Ο κύκλος μαθημάτων απευθύνεται σε όποιον δεν έχει προγραμματίσει ποτέ, από οποιοδήποτε πρόγραμμα σπουδών και από το πρώτο έτος: σε φοιτητές πληροφορικής που χρειάζονται στέρεη βάση πριν από τους κύκλους μαθημάτων δομών δεδομένων και συστημάτων, σε φοιτητές μηχανικής και θετικών επιστημών που χρειάζονται να υπολογίζουν με υπολογιστή χωρίς να τον εμπιστεύονται τυφλά, και σε φοιτητές μαθηματικών που θέλουν να δουν τους αλγορίθμους τους να γίνονται προγράμματα που εκτελούνται.
Είναι κύκλος επιπέδου 1, χωρίς προαπαιτούμενα και αυτοτελής. Προϋποθέτει μόνο δύο πράγματα: τη σχολική αριθμητική, με την ακέραια διαίρεση και το υπόλοιπό της, και τον στοιχειώδη χειρισμό ενός υπολογιστή (δημιουργία φακέλου, αποθήκευση αρχείου, άνοιγμα προγράμματος). Ό,τι χρησιμοποιεί από τη δυαδική αναπαράσταση, από τον συλλογισμό κατά περιπτώσεις, από τη λογική των συνθηκών ή από την επαγωγή το διδάσκει στο σημείο όπου το χρειάζεται: το δυαδικό σύστημα, στο μάθημα για τους ακεραίους· τους νόμους του Ντε Μόργκαν, στο μάθημα για τις σχέσεις και τη λογική· την επαγωγή, στο μάθημα για την αναδρομή. Οι παραπομπές σε άλλους κύκλους του ιστότοπου που εμφανίζονται στα μαθήματα είναι, επομένως, εμβαθύνσεις και όχι προαπαιτούμενα.
Πού οδηγεί
Από τα παραπάνω προκύπτει η θέση του κύκλου στον ιστότοπο. Δεν έχει προαπαιτούμενα και είναι στόχος δύο προγραμμάτων σπουδών, «Πληροφορική και Υπολογισμός» και «Επιστήμες μηχανικού», επειδή και στα δύο ο προγραμματισμός είναι ταυτόχρονα εργαλείο και αντικείμενο. Γι’ αυτό ενδείκνυται να είναι ένας από τους πρώτους κύκλους αυτών των προγραμμάτων, μαζί με το LaTeX για την ακαδημαϊκή γραφή και τη Μαθηματική λογική I: προτασιακή λογική.
Έχει έναν συμπληρωματικό κύκλο, που μπορεί να παρακολουθηθεί πριν, παράλληλα ή μετά. Η Μαθηματική λογική I: προτασιακή λογική μελετά ως θεωρία ό,τι εδώ χρησιμοποιείται ως πράξη: τις σύνθετες συνθήκες, τους πίνακες αληθείας και τους νόμους του Ντε Μόργκαν της ενότητας 3, και την ιδέα της απόδειξης ότι μια διαδικασία είναι σωστή, που σε αυτόν τον κύκλο παίρνει τη μορφή της αναλλοίωτης ενός βρόχου και της επαγωγής σε μια αναδρομή. Η Άλγεβρα και γεωμετρία I, από την πλευρά της, αποδεικνύει τα αποτελέσματα για τους αριθμούς που ο κύκλος προγραμματίζει: την ευκλείδεια διαίρεση, τον αλγόριθμο του Ευκλείδη, τα συστήματα αρίθμησης και τον κανόνα του Χόρνερ. Και το LaTeX για την ακαδημαϊκή γραφή διδάσκει, στο μάθημά του Ομαδική συγγραφή, τον έλεγχο εκδόσεων με το Git, που αυτός ο κύκλος συνιστά να χρησιμοποιείται από το πρώτο πρόγραμμα.
Ωστόσο, ο κύκλος αφήνει σκόπιμα έξω ό,τι απαιτεί τη βάση του. Η προβλεπόμενη συνέχειά του είναι ο Προγραμματισμός σε C++ II, που θα πραγματευτεί τους δείκτες και τη δυναμική μνήμη, τις κλάσεις και τα αντικείμενα, τα templates, τις ανώνυμες συναρτήσεις, τις εξαιρέσεις και την πρότυπη βιβλιοθήκη σε βάθος. Επομένως ο κύκλος δεν είναι ένα πρώτο τμήμα ενός εγχειριδίου C++, αλλά ένας πλήρης κύκλος θεμελιωδών αρχών, που μπορεί να κλείσει εδώ· όποιος συνεχίσει, αντίθετα, θα βρει στον κύκλο II την ίδια πειθαρχία εφαρμοσμένη σε προγράμματα των οποίων το μέγεθος δεν επιτρέπει πια να την παραλείψει κανείς.
Γενικοί μαθησιακοί στόχοι
Οι στόχοι που ακολουθούν περιγράφουν τι πρέπει να μπορεί να κάνει ένας φοιτητής που ολοκληρώνει τον κύκλο. Καθένας διατυπώνεται ως παρατηρήσιμη επίδοση, ώστε να μπορεί να ελεγχθεί με μια συγκεκριμένη εργασία· κάθε μάθημα περιεχομένου δηλώνει με τη σειρά του τους δικούς του στόχους, που εξυπηρετούν έναν ή περισσότερους από τους γενικούς, και το μάθημα ολοκλήρωσης δείχνει σε ποιες ενότητες και μαθήματα δουλεύεται ο καθένας. Οι επτά στόχοι αριθμούνται, ώστε να μπορούν να μνημονεύονται.
- Στόχος 1. Να λύνει προβλήματα με προγράμματα: να προδιαγράφει τι εισέρχεται και τι εξέρχεται, να σχεδιάζει έναν αλγόριθμο, να τον εκτελεί με το χέρι, και να τον γράφει, να τον μεταγλωττίζει, να τον εκτελεί και να τον αποσφαλματώνει, ερμηνεύοντας τα μηνύματα και τις προειδοποιήσεις του μεταγλωττιστή.
- Στόχος 2. Να επιλέγει τον κατάλληλο τύπο για κάθε δεδομένο και να συλλογίζεται για τα όρια της αναπαράστασής του: το εύρος τιμών των ακεραίων, την υπερχείλιση, τη στρογγυλοποίηση της κινητής υποδιαστολής και την κωδικοποίηση του κειμένου.
- Στόχος 3. Να κατασκευάζει σωστές εκφράσεις, γνωρίζοντας την προτεραιότητα, τις μετατροπές τύπου, τις παρενέργειες και ό,τι το πρότυπο αφήνει απροσδιόριστο.
- Στόχος 4. Να σχεδιάζει τον έλεγχο ροής με σωστές αποφάσεις και βρόχους, που τερματίζουν, και να αιτιολογεί την ορθότητά τους με μια αναλλοίωτη.
- Στόχος 5. Να αποσυνθέτει ένα πρόβλημα σε συναρτήσεις με σαφείς διεπαφές, να επιλέγει πώς θα μεταβιβάζονται οι παράμετροι, και να λύνει προβλήματα με αναδρομή.
- Στόχος 6. Να αναπαριστά και να επεξεργάζεται σύνθετα δεδομένα (ακολουθίες, δισδιάστατους πίνακες, εγγραφές, κείμενο και αρχεία) με τους βασικούς αλγορίθμους και με την πρότυπη βιβλιοθήκη, εκτιμώντας το κόστος τους.
- Στόχος 7. Να οργανώνει μεγαλύτερα προγράμματα σε πολλά αρχεία, να τα προδιαγράφει με μια προσυνθήκη και μια μετασυνθήκη, να τα δοκιμάζει συστηματικά και να επιχειρηματολογεί για την ορθότητά τους.
Πέντε στόχοι έχουν τη δική τους ενότητα: ο 2, την ενότητα των δεδομένων και των τύπων· ο 3, των εκφράσεων· ο 4, του ελέγχου ροής· ο 5, των συναρτήσεων· και ο 6, των σύνθετων δεδομένων, που προεκτείνεται στην ενότητα του κειμένου και των αρχείων, όπου ο στόχος 2 επανεμφανίζεται με την κωδικοποίηση UTF-8. Οι άλλοι δύο, αντίθετα, διατρέχουν ολόκληρο τον κύκλο. Ο στόχος 1 έχει ως κύρια την πρώτη ενότητα, που διδάσκει τον κύκλο εργασίας της προδιαγραφής, της συγγραφής, της μεταγλώττισης και της εκτέλεσης, και το μάθημα για την αποσφαλμάτωση της τελευταίας· ασκείται όμως σε όλες, επειδή κάθε πρόγραμμα του κύκλου μεταγλωττίζεται, εκτελείται και διορθώνεται. Ο στόχος 7 έχει ως κύρια την τελευταία ενότητα, των μεγαλύτερων προγραμμάτων· αρχίζει όμως στον οδηγό ύφους της πρώτης, συνεχίζει στις σταθερές της δεύτερης, παίρνει μορφή στις συμβάσεις της πέμπτης, που από τότε συνοδεύουν κάθε συνάρτηση, και στις αναλλοίωτες της τέταρτης και της έκτης. Από αυτό έπεται ότι η επίτευξή τους δεν μπορεί να αποδοθεί σε μία μόνο ενότητα, και ότι αξίζει να καλλιεργούνται σε όλη τη διάρκεια του κύκλου.
Περιεχόμενα
Ο κύκλος οργανώνεται σε δέκα ενότητες: αυτή την παρουσίαση, οκτώ ενότητες περιεχομένου και μια ολοκλήρωση. Κάθε ενότητα περιεχομένου ανοίγει με ένα εισαγωγικό μάθημα, που παρουσιάζει τα μαθήματά της, όσα θεωρεί γνωστά και το πρόβλημα που λύνει, και αρχίζει με μια αρχική αξιολόγηση· κλείνει με ένα μάθημα σύνθεσης, που ανασυνθέτει την αλυσίδα των εννοιών της ενότητας, ξεχωρίζει όσα ισχύουν σε κάθε γλώσσα από τη μορφή τους στη C++, συγκεντρώνει την απροσδιόριστη συμπεριφορά της ενότητας, επαναλαμβάνει σε μια τελική αξιολόγηση τις δεξιότητες της αρχικής και προτείνει προκλήσεις μεγαλύτερης δυσκολίας από εκείνη των προβλημάτων των μαθημάτων.
Ενότητα 0. Παρουσίαση του μαθήματος
Αποτελείται από αυτό το μάθημα, που ορίζει τον σκοπό, την επιλογή της γλώσσας, τους γενικούς στόχους, τα περιεχόμενα, τον φόρτο και τον σχεδιασμό του κύκλου.
Ενότητα 1. Πρώτα βήματα
Στόχος της είναι να οδηγήσει τον φοιτητή από ένα πρόβλημα διατυπωμένο με λόγια σε ένα πρόγραμμα που μεταγλωττίζεται, εκτελείται, διαβάζει δεδομένα και γράφει αποτελέσματα, γνωρίζοντας τι έκανε κάθε εργαλείο στη διαδρομή. Αρχίζει χωρίς κώδικα, επειδή ο αλγόριθμος προηγείται του προγράμματος· στο τέλος, ο φοιτητής ξέρει ακόμη λίγα για τη C++, ξέρει όμως πώς δουλεύει κανείς με αυτήν.
- Πρώτα βήματα στη C++: εισαγωγή.
- Από το πρόβλημα στον αλγόριθμο: η προδιαγραφή των εισόδων και των εξόδων, τα αριθμημένα βήματα, η εκτέλεση με το χέρι και ο πίνακας ίχνους, η ακολουθία, η απόφαση και η επανάληψη.
- Προγράμματα, μεταγλωττιστές και C++: η προεπεξεργασία, η μεταγλώττιση και η σύνδεση· οι μεταγλωττιζόμενες γλώσσες απέναντι στις διερμηνευόμενες· τα πρότυπα της γλώσσας.
- Εγκατάσταση του περιβάλλοντος σε Windows, macOS και Linux: οι τρεις πλήρεις οδηγοί, ο μεταγλωττιστής, το Visual Studio Code και η επέκτασή του για τη C++, η επαλήθευση και τα συχνά προβλήματα.
- Μεταγλώττιση, εκτέλεση και ρύθμιση: οι επιλογές του κύκλου, τα σφάλματα και οι προειδοποιήσεις, οι ανιχνευτές, η εργασία δόμησης (build task) του επεξεργαστή κειμένου και η κωδικοποίηση της κονσόλας.
- Ανατομία ενός προγράμματος: η συμπερίληψη, η
main, οι εντολές, τα μπλοκ, τα σχόλια και ο οδηγός ύφους του κύκλου. - Είσοδος, έξοδος και σφάλματα: το
std::cin, ηstd::printlnκαι οι προδιαγραφές μορφής, η είσοδος που δεν είναι η αναμενόμενη και η ταξινόμηση των σφαλμάτων. - Πρώτα βήματα στη C++: σύνθεση και προκλήσεις.
Ενότητα 2. Δεδομένα και τύποι
Στόχος της είναι να διδάξει ότι κάθε δεδομένο ζει στη μνήμη με έναν τύπο που ορίζει ποιες τιμές μπορεί να πάρει, πόσο χώρο καταλαμβάνει και ποιες πράξεις δέχεται, και ότι ένας αριθμός του προγράμματος δεν είναι αριθμός των μαθηματικών, αλλά μια αναπαράσταση με όρια.
- Δεδομένα και τύποι: εισαγωγή.
- Μεταβλητές και μνήμη: η δήλωση και η αρχικοποίηση με άγκιστρα, η ανάθεση, το ίχνος της κατάστασης, τα ονόματα και η μη αρχικοποιημένη μεταβλητή.
- Οι ακέραιοι και η αναπαράστασή τους: οι βάσεις 2 και 16, το εύρος τιμών κάθε τύπου, το συμπλήρωμα ως προς δύο και η υπερχείλιση με πρόσημο και χωρίς πρόσημο.
- Οι αριθμοί κινητής υποδιαστολής: γιατί το δεν είναι ακριβές, η συσσωρευμένη στρογγυλοποίηση, η σύγκριση με ανοχή, το άπειρο και ο μη αριθμός (NaN).
- Χαρακτήρες, λογικές τιμές, μετατροπές και σταθερές: ο κωδικός ενός χαρακτήρα, οι έμμεσες και οι ρητές μετατροπές, η απόρριψη των μετατροπών που χάνουν πληροφορία, τα
const,constexprκαιauto. - Δεδομένα και τύποι: σύνθεση και προκλήσεις.
Ενότητα 3. Εκφράσεις και τελεστές
Στόχος της είναι να διδάξει την κατασκευή εκφράσεων των οποίων η τιμή μπορεί να προβλεφθεί με βεβαιότητα: ποια πράξη γίνεται πρώτη, τι τύπου είναι το αποτέλεσμα, ποιες παρενέργειες έχει και ποιες εκφράσεις στερούνται νοήματος. Η ενότητα δεν έχει ακόμη αποφάσεις ούτε βρόχους: οι συνθήκες αποτιμώνται και τυπώνονται.
- Εκφράσεις και τελεστές: εισαγωγή.
- Αριθμητικές πράξεις: το πηλίκο και το υπόλοιπο με αρνητικούς, το δέντρο μιας έκφρασης, η προτεραιότητα, η προσεταιριστικότητα και ο τύπος του αποτελέσματος.
- Σχέσεις και λογική: οι σύνθετες συνθήκες, η άρνησή τους με τους νόμους του Ντε Μόργκαν, η αποτίμηση βραχυκύκλωσης και το σφάλμα του
1 < x < 5. - Ανάθεση, παρενέργειες και απροσδιόριστη συμπεριφορά: η τιμή και η επίδραση μιας έκφρασης, οι αυξήσεις, η σειρά αποτίμησης και ο κατάλογος όσων δεν ορίζει το πρότυπο.
- Bit και μαθηματική βιβλιοθήκη: οι τελεστές bit, οι ολισθήσεις, οι μάσκες, η
<cmath>και οι σταθερές της<numbers>. - Εκφράσεις και τελεστές: σύνθεση και προκλήσεις.
Ενότητα 4. Έλεγχος ροής
Στόχος της είναι να διδάξει τον έλεγχο της σειράς εκτέλεσης με αποφάσεις και βρόχους, και τον συλλογισμό για την ορθότητά τους: ότι κάθε περίπτωση εξυπηρετείται, ότι κάθε βρόχος κάνει ό,τι πρέπει και ότι τερματίζει. Πραγματοποιεί όσα προανήγγειλε το πρώτο μάθημα του κύκλου: την απόφαση και την επανάληψη, γραμμένες τώρα και επαληθευμένες.
- Έλεγχος ροής: εισαγωγή.
- Αποφάσεις: τα αλυσιδωτά και τα εμφωλευμένα
ifκαιelse, οι ξένες και οι εξαντλητικές περιπτώσεις, τοswitchμεenum classκαι οι παγίδες του. - Βρόχοι:
while,doκαιfor, το ίχνος ενός βρόχου, η μετατροπή ανάμεσα στις μορφές του και οι εμφωλευμένοι βρόχοι. - Σχεδίαση σωστών βρόχων: τα μοτίβα του μετρητή, του αθροιστή, του μεγίστου και του φρουρού, η αναλλοίωτη, ο τερματισμός και μια πρώτη επαφή με τον αποσφαλματωτή.
- Αριθμητικοί αλγόριθμοι: ο έλεγχος πρώτου, ο αλγόριθμος του Ευκλείδη, η αλλαγή βάσης, ο κανόνας του Χόρνερ και η μέθοδος της διχοτόμησης, ο καθένας με την αιτιολόγησή του.
- Έλεγχος ροής: σύνθεση και προκλήσεις.
Ενότητα 5. Συναρτήσεις
Στόχος της είναι να διδάξει την αποσύνθεση ενός προβλήματος σε μέρη με όνομα, το καθένα με μια διεπαφή και μια σύμβαση, και την επίλυση προβλημάτων με αναδρομή. Μετατρέπει τα μακροσκελή προγράμματα της ενότητας 4 σε προγράμματα φτιαγμένα από μέρη που επαληθεύονται ένα ένα.
- Συναρτήσεις: εισαγωγή.
- Συναρτήσεις: η δήλωση, ο ορισμός και η κλήση, η στοίβα κλήσεων, η προσυνθήκη και η μετασυνθήκη, και η συνάρτηση που δεν επιστρέφει τιμή.
- Παράμετροι και εμβέλεια: η μεταβίβαση με τιμή, με αναφορά και με σταθερή αναφορά, τα πολλαπλά αποτελέσματα με δομημένες δεσμεύσεις, η εμβέλεια και η διάρκεια ζωής των μεταβλητών.
- Σχεδίαση με συναρτήσεις: η σταδιακή εκλέπτυνση, η διεπαφή πριν από το σώμα, ο κανόνας «μία συνάρτηση, μία εργασία» και η υπερφόρτωση.
- Αναδρομή: η βασική και η αναδρομική περίπτωση, η ορθότητα και ο τερματισμός με επαγωγή, η στοίβα και το κόστος της αναδρομής.
- Συναρτήσεις: σύνθεση και προκλήσεις.
Ενότητα 6. Σύνθετα δεδομένα
Στόχος της είναι να διδάξει την αναπαράσταση συλλογών δεδομένων και την επεξεργασία τους με τους βασικούς αλγορίθμους, γραμμένους με το χέρι και παρμένους από τη βιβλιοθήκη, εκτιμώντας πόσο κοστίζουν. Οδηγεί από το μεμονωμένο δεδομένο στη συλλογή, και από το ερώτημα «είναι σωστό;» στο ερώτημα «πόσο κοστίζει;».
- Σύνθετα δεδομένα: εισαγωγή.
- Πίνακες σταθερού μεγέθους: το
std::array, η διάσχιση με δείκτες και μεforεύρους, ο δείκτης μέσα στα όρια και οι πίνακες της C ως αντίθεση. - Διανύσματα: το
std::vector, η ανάγνωση μιας σειράς άγνωστου μήκους, η συσσώρευση, το φιλτράρισμα και ο μετασχηματισμός, το μέγεθος και η χωρητικότητα. - Το κόστος ενός αλγορίθμου: η καταμέτρηση των κυρίαρχων πράξεων, οι τάξεις αύξησης και η μέτρηση του χρόνου.
- Αναζήτηση και ταξινόμηση: η γραμμική και η δυαδική αναζήτηση, η ταξινόμηση με επιλογή και με εισαγωγή με τις αναλλοίωτές τους, και οι αλγόριθμοι της βιβλιοθήκης.
- Δισδιάστατοι πίνακες: οι πίνακες δύο διαστάσεων, η διάσχισή τους κατά γραμμές και κατά στήλες, ο ανάστροφος, το γινόμενο και ο πίνακας σε ένα μονοδιάστατο διάνυσμα.
- Εγγραφές: το
struct, οι καθορισμένοι αρχικοποιητές, οι εγγραφές ως παράμετροι και η ταξινόμηση κατά ένα πεδίο. - Σύνθετα δεδομένα: σύνθεση και προκλήσεις.
Ενότητα 7. Κείμενο και αρχεία
Στόχος της είναι να διδάξει τον χειρισμό του κειμένου ως δεδομένου και να κάνει ένα πρόγραμμα να διαβάζει και να γράφει αρχεία χωρίς να καταρρέει μπροστά σε μια κακοσχηματισμένη είσοδο. Στο τέλος, ο φοιτητής μπορεί να γράφει προγράμματα που επεξεργάζονται πραγματικά δεδομένα, μαζί με τόνους και σφάλματα.
- Κείμενο και αρχεία: εισαγωγή.
- Συμβολοσειρές: το
std::stringκαι οι πράξεις του, τοnpos, οι όψειςstd::string_viewκαι οι συμβολοσειρές της C ως αντίθεση. - Το κείμενο δεν είναι ASCII: η κωδικοποίηση UTF-8, τα byte και οι χαρακτήρες, και οι πράξεις που σπάνε το κείμενο.
- Σωστή ανάγνωση της εισόδου: το
std::getline, η κατάσταση της ροής, η ανάκαμψη μετά από ένα άκυρο δεδομένο και η επικύρωση με τοstd::from_chars. - Αρχεία κειμένου: το άνοιγμα, η ανάγνωση γραμμή προς γραμμή, η εγγραφή, η προσάρτηση και η επεξεργασία ενός αρχείου τιμών χωρισμένων με κόμματα.
- Κείμενο και αρχεία: σύνθεση και προκλήσεις.
Ενότητα 8. Μεγαλύτερα προγράμματα
Στόχος της είναι να διδάξει την οργάνωση, την επαλήθευση και την αποσφαλμάτωση προγραμμάτων που δεν χωρούν πια σε ένα αρχείο ούτε στο μυαλό. Ολοκληρώνει τη διαδρομή που άνοιξε το πρώτο μάθημα: προδιαγραφή, κατασκευή, επαλήθευση· η σύνθεσή της τελειώνει με μια τελική εργασία που συγκεντρώνει ολόκληρο τον κύκλο μαθημάτων.
- Μεγαλύτερα προγράμματα: εισαγωγή.
- Πολλά αρχεία και δικές μας βιβλιοθήκες: η κεφαλίδα και η υλοποίηση, οι φρουροί συμπερίληψης, ο κανόνας του ενός ορισμού και η χωριστή μεταγλώττιση.
- Δοκιμές προγραμμάτων: οι περιπτώσεις δοκιμής με βάση την προδιαγραφή, οι αυτοματοποιημένες δοκιμές, τα
assertκαιstatic_assert. - Αποσφαλμάτωση προγραμμάτων: ο αποσφαλματωτής του Visual Studio Code, τα σημεία διακοπής, η στοίβα κλήσεων και μια συστηματική στρατηγική για τον εντοπισμό ενός σφάλματος.
- Μεγαλύτερα προγράμματα: σύνθεση και προκλήσεις.
Ενότητα 9. Ολοκλήρωση του μαθήματος
Αποτελείται από το μάθημα Τελικός απολογισμός του Προγραμματισμού σε C++ I, που υπενθυμίζει τους επτά γενικούς στόχους, δείχνει σε ένα σχήμα σε ποιες ενότητες και μαθήματα δουλεύεται ο καθένας, συγκεντρώνει ανά στόχο την πρώτη προσπάθεια των τελικών αξιολογήσεων και δείχνει πού συνεχίζεται η μελέτη.
Φόρτος εργασίας και πιστωτικές μονάδες
Ο φόρτος ενός κύκλου μαθημάτων δεν μετριέται με τις ώρες διδασκαλίας, που σε έναν ασύγχρονο κύκλο δεν υπάρχουν, αλλά με τη συνολική εργασία του φοιτητή: ανάγνωση, γραφή και μεταγλώττιση των παραδειγμάτων, επίλυση προβλημάτων και επανάληψη. Η εκτίμηση ακολουθεί την ίδια μέθοδο σε όλους τους κύκλους του ιστότοπου: μετρά τον χρόνο ανάγνωσης του κειμένου κάθε μαθήματος, μαζί με τον κώδικα των παραδειγμάτων του, με εκατό λέξεις το λεπτό, είκοσι λεπτά ανά λυμένο πρόβλημα, τριάντα πέντε ανά προτεινόμενο πρόβλημα, σαράντα πέντε ανά πρόκληση και δώδεκα ανά αρχική ή τελική αξιολόγηση, και προσθέτει ένα περιθώριο ενός δεκάτου για την επανάληψη.
Αποτελέσματα
Τα μαθήματα του κύκλου περιέχουν συνολικά λυμένα προβλήματα, προτεινόμενα προβλήματα και προκλήσεις, καθώς και δεκαέξι αξιολογήσεις ενότητας και εβδομήντα σύντομες ασκήσεις που ο ιστότοπος ελέγχει αμέσως. Ο εκτιμώμενος φόρτος ανά ενότητα, στρογγυλευμένος στην ώρα, είναι ο εξής:
- Ενότητα 0, παρουσίαση του μαθήματος: ώρα.
- Ενότητα 1, πρώτα βήματα: ώρες.
- Ενότητα 2, δεδομένα και τύποι: ώρες.
- Ενότητα 3, εκφράσεις και τελεστές: ώρες.
- Ενότητα 4, έλεγχος ροής: ώρες.
- Ενότητα 5, συναρτήσεις: ώρες.
- Ενότητα 6, σύνθετα δεδομένα: ώρες.
- Ενότητα 7, κείμενο και αρχεία: ώρες.
- Ενότητα 8, μεγαλύτερα προγράμματα: ώρες.
- Ενότητα 9, ολοκλήρωση του μαθήματος: λιγότερο από ώρα.
Το σύνολο είναι περίπου ώρες εργασίας του φοιτητή. Αξίζει να διαβαστεί αυτός ο αριθμός ως αυτό που είναι: μια εκτίμηση για φοιτητή που γράφει και μεταγλωττίζει όλα τα παραδείγματα και λύνει όλα τα προβλήματα και τις προκλήσεις. Όποιος έχει ήδη προγραμματίσει σε άλλη γλώσσα θα χρειαστεί αρκετά λιγότερο στις πρώτες ενότητες· όποιος δεν έχει εγκαταστήσει ποτέ πρόγραμμα ούτε έχει διαβάσει μήνυμα σφάλματος μπορεί να χρειαστεί περισσότερο, κυρίως στην ενότητα 1, που είναι επίσης, μαζί με εκείνη των σύνθετων δεδομένων, η πιο εκτενής.
Ωστόσο, ο αριθμός είναι ονομαστικός: είναι αυτός που ορίζει τις πιστωτικές μονάδες του κύκλου, και προϋποθέτει ανάγνωση με σταθερό ρυθμό και τρία τέταρτα της ώρας ανά πρόκληση. Όσο δεν έχει μετρηθεί με πραγματικούς φοιτητές, αξίζει να συνοδεύεται από ένα ρεαλιστικό εύρος. Αν η ανάγνωση προχωρούσε με τον μισό από τον υποτιθέμενο ρυθμό, όπως συμβαίνει όταν κάθε παράδειγμα γράφεται με το χέρι, μεταγλωττίζεται και τροποποιείται για να φανεί τι αλλάζει, και κάθε πρόκληση απαιτούσε εβδομήντα πέντε λεπτά αντί για σαράντα πέντε, η ίδια μέθοδος θα έδινε περίπου ώρες. Επομένως, ο αναμενόμενος φόρτος βρίσκεται ανάμεσα σε περίπου και περίπου ώρες. Το ανώτερο άκρο είναι ένα συνετό φράγμα, όχι μέτρηση· το εύρος θα διορθωθεί όταν γίνει γνωστός ο χρόνος που διαθέτουν όσοι μελετούν τον κύκλο, και ως τότε οι πιστωτικές μονάδες υπολογίζονται με τον ονομαστικό αριθμό.
Προτεινόμενος ρυθμός
Για να ονομάσει τους ρυθμούς, αυτό το πρόγραμμα σπουδών χρησιμοποιεί το ίδιο κριτήριο με τα άλλα προγράμματα σπουδών του ιστότοπου: πλήρης φοίτηση είναι εκείνη ενός ακαδημαϊκού έτους πιστωτικών μονάδων, περίπου ωρών κατανεμημένων σε περίπου σαράντα εβδομάδες, δηλαδή περίπου ωρών την εβδομάδα, και μερική φοίτηση είναι το μισό, περίπου ώρες την εβδομάδα. Από αυτό έπεται ένας συνιστώμενος ρυθμός ενός εξαμήνου δεκαέξι εβδομάδων, με περίπου ώρες μελέτης την εβδομάδα, λίγο λιγότερο από το ένα τρίτο της πλήρους φοίτησης· με το ρεαλιστικό εύρος, από έως ώρες την εβδομάδα. Αυτό το εξάμηνο μπορεί να μοιραστεί με τη Μαθηματική λογική I: προτασιακή λογική, της οποίας οι πίνακες αληθείας και η ιδέα της απόδειξης αναγνωρίζονται στις συνθήκες και στις αναλλοίωτες αυτού του κύκλου.
Ένας εντατικός ρυθμός, περίπου ωρών την εβδομάδα, δηλαδή μερική φοίτηση, ολοκληρώνει τον κύκλο σε εννέα ή δέκα εβδομάδες. Ένας πιο χαλαρός ρυθμός, περίπου ωρών την εβδομάδα, τον απλώνει σε δύο εξάμηνα, που μοιράζονται σχεδόν στη μέση: οι ενότητες 0 έως 4, από τον αλγόριθμο έως τον έλεγχο ροής, καταλαμβάνουν περίπου ώρες, και οι ενότητες 5 έως 9, από τις συναρτήσεις έως την τελική εργασία, περίπου . Η τομή είναι φυσική: στο τέλος της ενότητας 4, ο φοιτητής γράφει ήδη πλήρη προγράμματα σε μία μόνο main, και το δεύτερο μισό τον διδάσκει να τα οργανώνει.
Πιστωτικές μονάδες
Οι πιστωτικές μονάδες αυτού του ιστότοπου μετρούν τον συνολικό φόρτο εργασίας που απαιτεί ένας κύκλος από όποιον τον μελετά (την ανάγνωση, τα προβλήματα, τις προκλήσεις και την επανάληψη), και όχι τις ώρες διδασκαλίας. Μία πιστωτική μονάδα αντιστοιχεί σε περίπου ώρες εργασίας, και ένα έτος πλήρους φοίτησης σε πιστωτικές μονάδες, δηλαδή σε περίπου ώρες· είναι το ίδιο κριτήριο με το οποίο η προηγούμενη παράγραφος ονομάζει τους ρυθμούς μελέτης.
Ωστόσο, αν διαιρέσουμε τις εκτιμώμενες ώρες με , προκύπτει 6,8, που στρογγυλεύεται σε . Αν δεχτούμε για την πιστωτική μονάδα ένα εύρος από έως ώρες εργασίας, ο αριθμός των πιστωτικών μονάδων του κύκλου φράσσεται μεταξύ 6,3 και 7,5:
Επομένως, ο κύκλος έχει πιστωτικές μονάδες, λίγο περισσότερο από το ένα ένατο ενός έτους πλήρους φοίτησης. Ο αριθμός δεν είναι αβλεψία: ο κύκλος διαρκεί όσο πρέπει για να διδάξει τις θεμελιώδεις αρχές, και δεν περικόπηκε για να χωρέσει σε έναν στρογγυλό αριθμό πιστωτικών μονάδων.
Η χρησιμότητά τους είναι πρακτική: επιτρέπουν να συγκρίνει κανείς μεταξύ τους τον φόρτο των κύκλων του ιστότοπου και να αποφασίσει πόσους συμφέρει να μελετά ταυτόχρονα χωρίς να υπερβαίνει τον διαθέσιμο χρόνο. Με μερική φοίτηση επί ένα εξάμηνο δεκαέξι εβδομάδων, δηλαδή με περίπου ώρες, μπορεί κανείς, για παράδειγμα, να αναλάβει κύκλους που αθροίζουν περίπου πιστωτικές μονάδες· με πλήρη φοίτηση στο ίδιο εξάμηνο, περίπου .
Αυτές οι πιστωτικές μονάδες είναι ένα μέτρο του ίδιου του ιστότοπου για τον προγραμματισμό της μελέτης: δεν αντιστοιχούν σε κανένα επίσημο σύστημα πιστωτικών μονάδων ούτε συνεπάγονται ακαδημαϊκή αναγνώριση από κανένα ίδρυμα.
Σχεδιασμός του κύκλου
Μορφή
Ο κύκλος είναι ασύγχρονος, διαδικτυακός και με αυτόνομο ρυθμό: δεν έχει ημερομηνίες, ζωντανές συνεδρίες ούτε προθεσμίες, και κάθε φοιτητής προχωρά με την ταχύτητα που του επιτρέπουν η προετοιμασία και ο χρόνος του. Θα προσφερθεί στις δεκατέσσερις γλώσσες του ιστότοπου. Τα αναγνωριστικά των προγραμμάτων είναι στα αγγλικά και ίδια σε όλες τις εκδοχές· τα σχόλια και τα μηνύματα που εμφανίζουν τα προγράμματα, αντίθετα, είναι στη γλώσσα της σελίδας, ώστε κάθε εκδοχή να μεταγλωττίζεται και να εκτελείται με τη δική της έξοδο. Τα μαθήματα δηλώνουν ποια άλλα μαθήματα αξίζει να έχουν μελετηθεί πριν, ώστε η συνιστώμενη σειρά να είναι ρητή.
Η δομή ενός μαθήματος
Όλα τα μαθήματα περιεχομένου ακολουθούν την ίδια δομή. Αρχίζουν με μια περίληψη και με έναν κατάλογο δικών τους μαθησιακών στόχων, διατυπωμένων ως παρατηρήσιμες επιδόσεις. Ακολουθεί η έκθεση, της οποίας ο πυρήνας είναι τα προγράμματα. Κάθε πλήρες πρόγραμμα του κύκλου μεταγλωττίστηκε, πριν από την κατασκευή του ιστότοπου, με το πρότυπο C++23, με όλες τις προειδοποιήσεις ενεργοποιημένες και με τους ανιχνευτές σφαλμάτων μνήμης και απροσδιόριστης συμπεριφοράς, και εκτελέστηκε· ό,τι δημοσιεύεται κάτω από τον κώδικα είναι η πραγματική του έξοδος, ή τα πραγματικά μηνύματα του μεταγλωττιστή όταν αυτό που διδάσκεται είναι ένα σφάλμα ή μια προειδοποίηση, ή η πραγματική αναφορά του ανιχνευτή όταν το πρόγραμμα διαπράττει απροσδιόριστη συμπεριφορά. Αν αυτό ισχύει, καμία έξοδος του κύκλου δεν είναι γραμμένη με το χέρι: ο ιστότοπος ελέγχει κατά την κατασκευή του ότι κάθε πρόγραμμα έχει αποθηκευμένη την έξοδο της τρέχουσας εκδοχής του, και δεν θα δημοσιευόταν αν έλειπε σε κάποιο. Άλλα σχήματα κινούν βήμα προς βήμα ό,τι συλλογίζεται το κείμενο: τις θέσεις της μνήμης με το όνομα και την τιμή τους, τη στοίβα κλήσεων, τη διάσχιση ενός βρόχου, τα bit ενός αριθμού.
Κάθε μάθημα κλείνει με τρία λυμένα προβλήματα, με τη λύση τους βήμα προς βήμα, και τρία προτεινόμενα προβλήματα, το καθένα με μια διπλωμένη υπόδειξη και, έπειτα, την απάντηση, που μερικές φορές συνοδεύεται από μια αναλυτική λύση την οποία αξίζει να ανοίξει κανείς μόνο αφού έχει γράψει τη δική του. Τα προβλήματα απαιτούν μια ιδέα, ποτέ τη μηχανική επανάληψη ενός παραδείγματος, και χρησιμοποιούν μόνο όσα έχουν διδαχθεί ως εκείνο το μάθημα. Κάθε μάθημα περιλαμβάνει επιπλέον δύο σύντομες ασκήσεις που ο ιστότοπος ελέγχει αμέσως: στη μία προβλέπεται η ακριβής έξοδος ενός προγράμματος, και στην άλλη συμπληρώνεται ή διορθώνεται ένα απόσπασμα. Αξίζει να ξέρει κανείς τι κάνει και τι δεν κάνει αυτός ο έλεγχος: ο ιστότοπος δεν μεταγλωττίζει τον κώδικα του φοιτητή, αλλά ελέγχει με μοτίβα ότι το ουσιώδες είναι παρόν και ότι το σφάλμα που αναζητείται έχει εξαφανιστεί. Επομένως, μια άσκηση που εγκρίθηκε στον ιστότοπο πρέπει ακόμη να μεταγλωττιστεί και να εκτελεστεί στον δικό μας υπολογιστή, που είναι ο μόνος οριστικός κριτής.
Τα εισαγωγικά μαθήματα και τα μαθήματα σύνθεσης έχουν δική τους δομή. Η εισαγωγή παρουσιάζει την ενότητα, τα μαθήματά της και το νήμα που τα ενώνει, όσα θεωρεί γνωστά και το πρόβλημα που λύνει, και περιέχει την αρχική αξιολόγηση. Η σύνθεση ανασυνθέτει την αλυσίδα των εννοιών της ενότητας, με το μάθημα όπου θεμελιώνεται κάθε κρίκος και ό,τι χρησιμοποιεί ο καθένας· περιέχει δύο σταθερές παραγράφους, «Όσα ισχύουν σε κάθε γλώσσα» και «Η απροσδιόριστη συμπεριφορά της ενότητας», την τελική αξιολόγηση και έξι προκλήσεις (δέκα στην τελευταία ενότητα, της οποίας η τελική εργασία αναλύεται σε στάδια), την καθεμιά με υπόδειξη, απάντηση και, όταν ο συλλογισμός το αξίζει, μια διπλωμένη αναλυτική λύση.
Ο αναγνώστης φωνής
Κάθε μάθημα μπορεί να ακουστεί φωναχτά με τον αναγνώστη του ιστότοπου, που χρησιμοποιεί τις φωνές της ίδιας της συσκευής: το κείμενο διαβάζεται όπως είναι γραμμένο, ο κώδικας που παρατίθεται μέσα σε αυτό προφέρεται με νόημα και τα παραδείγματα κώδικα αναγγέλλονται, χωρίς να διαβάζονται χαρακτήρα προς χαρακτήρα. Αυτό επιτρέπει την επανάληψη της έκθεσης μακριά από την οθόνη· τα προγράμματα, αντίθετα, ζητούν πάντα τον επεξεργαστή κειμένου.
Αξιολόγηση
Ο κύκλος δεν βαθμολογεί: η αξιολόγησή του είναι διαμορφωτική και στηρίζεται στην αυτοαξιολόγηση. Τα προτεινόμενα προβλήματα επιτρέπουν να ελέγξει κανείς την επίτευξη των στόχων κάθε μαθήματος, και οι προκλήσεις εκείνη των στόχων κάθε ενότητας· σε όλα αυτά, ο τελικός κριτής είναι ο μεταγλωττιστής, με τις προειδοποιήσεις και τους ανιχνευτές του, επειδή ένα πρόγραμμα που μεταγλωττίζεται χωρίς προειδοποιήσεις, περνά τις περιπτώσεις δοκιμής του και δεν αφυπνίζει κανέναν ανιχνευτή είναι μια δοκιμή που δεν σηκώνει αντίρρηση, αν και, όπως διδάσκει το μάθημα για τις δοκιμές, όχι μια απόδειξη.
Σε αυτά προστίθενται οι αξιολογήσεις ενότητας. Η αρχική, στην εισαγωγή, είναι μια σύντομη αυτοαξιολόγηση που μετρά το σημείο εκκίνησης· η τελική, στη σύνθεση και πριν από τις προκλήσεις, μετρά ό,τι επιτεύχθηκε και συγκρίνεται με την αρχική. Και οι δύο διορθώνονται στον ίδιο τον περιηγητή: κάθε απάντηση λαμβάνει μια εξήγηση, κάθε τυπικό σφάλμα μια παρατήρηση που το προσδιορίζει, και κάθε ερώτηση παραπέμπει στο μάθημα που αξίζει να επαναληφθεί. Καμία τους δεν βαθμολογεί ούτε πιστοποιεί, και τα αποτελέσματά τους αποθηκεύονται μόνο στον περιηγητή του φοιτητή· η επικύρωση των δεξιοτήτων που αποκτήθηκαν θα γίνει αργότερα σε άλλη πλατφόρμα. Ο τελικός απολογισμός συγκεντρώνει την πρώτη προσπάθεια κάθε τελικής αξιολόγησης σε ένα προφίλ ανά γενικό στόχο.
Οι βοηθοί τεχνητής νοημοσύνης
Υπάρχουν σήμερα βοηθοί τεχνητής νοημοσύνης ικανοί να γράψουν σε δευτερόλεπτα τη λύση σχεδόν οποιουδήποτε προβλήματος αυτού του κύκλου. Αξίζει να πούμε με σαφήνεια ποια θέση τους αναλογεί, και ο λόγος είναι ο ίδιος που αιτιολογεί όλα τα υπόλοιπα: ο κύκλος δεν εκπαιδεύει στην παραγωγή προγραμμάτων, αλλά σε μια ικανότητα, εκείνη του να σκέφτεται κανείς ένα πρόβλημα ώσπου να το μετατρέψει σε σωστό πρόγραμμα. Αν αυτό ισχύει, η ανάθεση της άσκησης σε έναν βοηθό ακυρώνει την άσκηση, όπως ακριβώς η ματιά στην απάντηση ενός προβλήματος πριν από την προσπάθεια το μετατρέπει σε ανάγνωση. Το πρόγραμμα που προκύπτει μπορεί να είναι σωστό· όποιος το παραδίδει, όμως, δεν έχει μάθει να το γράφει, και δεν θα ξέρει να το κάνει όταν ο βοηθός σφάλλει, που είναι ακριβώς τότε που χρειάζεται περισσότερο.
Από αυτό έπεται ένας κανόνας χρήσης, και όχι μια απαγόρευση. Ένας βοηθός χρησιμεύει για να εξηγήσει ένα μήνυμα σφάλματος που δεν γίνεται κατανοητό, για να προτείνει περιπτώσεις δοκιμής που δεν είχαν σκεφτεί, για να συγκρίνει μια δική μας λύση, ήδη ολοκληρωμένη, με μια άλλη, ή για να διευκρινίσει μια ιδέα της έκθεσης από άλλη οπτική. Δεν χρησιμεύει για να γράφει τις ασκήσεις, τα προβλήματα ή τις προκλήσεις. Και σε όλες τις περιπτώσεις ισχύει μια αρχή που αφορά κάθε ξένο κώδικα, είτε προέρχεται από βοηθό, είτε από φόρουμ, είτε από συμφοιτητή: διαβάζεται, δοκιμάζεται και κατανοείται πριν γίνει δεκτός. Ένας βοηθός μπορεί να παραγάγει κώδικα που μεταγλωττίζεται και φαίνεται σωστός, αλλά που διαπράττει απροσδιόριστη συμπεριφορά ή χρησιμοποιεί μια παλιά μορφή της γλώσσας· ο φοιτητής που θα έχει κάνει τον κύκλο θα ξέρει να το αναγνωρίσει, ενώ εκείνος που θα έχει αναθέσει τον κύκλο σε άλλον, όχι.
Πώς να μελετήσετε αυτόν τον κύκλο
Ο κύκλος είναι σχεδιασμένος για να μελετάται με τη σειρά. Κάθε ενότητα προϋποθέτει τις προηγούμενες: οι εκφράσεις γράφονται με τους τύπους της δεύτερης ενότητας, οι βρόχοι με τις εκφράσεις της τρίτης, οι συναρτήσεις ενθυλακώνουν τους βρόχους της τέταρτης, και τα σύνθετα δεδομένα επεξεργάζονται με συναρτήσεις· η παράλειψη ενός μαθήματος αναγκάζει, αργά ή γρήγορα, να επιστρέψει κανείς σε αυτό.
Ο κύριος κανόνας είναι ένας μόνο: να γράφεται και να μεταγλωττίζεται κάθε παράδειγμα. Ο προγραμματισμός δεν μαθαίνεται με την ανάγνωση, αλλά γράφοντας, μεταγλωττίζοντας και διαβάζοντας τι απαντά ο μεταγλωττιστής. Γι’ αυτό, ο φοιτητής εγκαθιστά το δικό του περιβάλλον ακολουθώντας το μάθημα Εγκατάσταση του περιβάλλοντος σε Windows, macOS και Linux, και αναπαράγει κάθε πρόγραμμα στο Visual Studio Code του, με τις επιλογές που το μάθημα Μεταγλώττιση, εκτέλεση και ρύθμιση διδάσκει να ορίζει· όποιος χρησιμοποιεί υπολογιστή στον οποίο δεν μπορεί να εγκαταστήσει προγράμματα διαθέτει, προσωρινά, έναν διαδικτυακό μεταγλωττιστή, που περιγράφει το μάθημα της εγκατάστασης. Αξίζει να γράφονται τα παραδείγματα με το χέρι αντί να αντιγράφονται, επειδή το χέρι συγκρατεί ό,τι το μάτι προσπερνά· αξίζει να προβλέπεται η έξοδος κάθε προγράμματος πριν από την εκτέλεσή του, επειδή η διαφορά ανάμεσα σε ό,τι προβλέφθηκε και σε ό,τι προέκυψε είναι ακριβώς ό,τι μένει να μάθει κανείς· και αξίζει να διαβάζεται κάθε προειδοποίηση του μεταγλωττιστή ως ερώτημα που αξίζει απάντηση, και όχι ως θόρυβος που ανέχεται κανείς. Αφού ένα πρόγραμμα λειτουργήσει, αξίζει επιπλέον να τροποποιηθεί σκόπιμα (να σβηστεί ένα ερωτηματικό, να αλλάξει ένας τύπος, να βγει κανείς έξω από ένα διάνυσμα) και να διαβαστεί τι λένε ο μεταγλωττιστής ή ο ανιχνευτής, επειδή κάθε σφάλμα που προκλήθηκε είναι ένα σφάλμα που θα αναγνωριστεί αργότερα.
Κάθε ενότητα έχει δύο σημεία ελέγχου. Η αρχική αξιολόγηση, στην εισαγωγή, είναι το σημείο εκκίνησης: αξίζει να απαντηθεί πριν από τη μελέτη της ενότητας, χωρίς να συμβουλευτεί κανείς τίποτα, και να σημειωθούν τα μαθήματα στα οποία παραπέμπουν τα σφάλματα. Η τελική αξιολόγηση, στη σύνθεση και πριν από τις προκλήσεις, είναι η αντιπαραβολή: απαντιέται στο τέλος των μαθημάτων, επίσης χωρίς βοηθήματα, και συγκρίνεται με την αρχική. Και στις δύο μετράει η πρώτη προσπάθεια, που είναι αυτή που συγκρίνεται και αυτή που συγκεντρώνει το προφίλ του τελικού απολογισμού. Στα προτεινόμενα προβλήματα και στις προκλήσεις, αξίζει να ανοίγεται η υπόδειξη μόνο όταν η προσπάθεια έχει εξαντληθεί, και η απάντηση μόνο στο τέλος, για επαλήθευση. Ένα πρόβλημα του οποίου η απάντηση κοιτάχτηκε πριν μεταγλωττιστεί η δική μας λύση δεν έχει λυθεί, αλλά διαβαστεί.
Έλεγχος εκδόσεων
Τέλος, αξίζει να φυλάσσεται η εργασία του κύκλου με ένα σύστημα ελέγχου εκδόσεων από το πρώτο πρόγραμμα. Το Git καταγράφει κάθε κατάσταση ενός φακέλου εργασίας, επιτρέπει την επιστροφή σε οποιαδήποτε από αυτές και δείχνει τι άλλαξε ανάμεσα σε δύο· για όποιον προγραμματίζει, αυτό σημαίνει ότι μπορεί να πειραματίζεται χωρίς φόβο να χάσει ό,τι λειτουργούσε, και να εντοπίζει, συγκρίνοντας εκδοχές, την αλλαγή που εισήγαγε ένα σφάλμα, κάτι που μεταφέρει στην ιστορία του προγράμματος τη διχοτόμηση που διδάσκει το μάθημα για την αποσφαλμάτωση. Ο κύκλος δεν διδάσκει το Git, επειδή ένας άλλος κύκλος του ιστότοπου το κάνει ήδη: το μάθημα Ομαδική συγγραφή, του κύκλου LaTeX για την ακαδημαϊκή γραφή, εξηγεί την ελάχιστη ροή εργασίας, ποια αρχεία φυλάσσονται και ποια εξαιρούνται, και πώς επιλύεται μια σύγκρουση. Ό,τι ισχύει εκεί για τις πηγές ενός εγγράφου ισχύει εξίσου για τις πηγές ενός προγράμματος· αρκεί να εξαιρεθούν, αντί για τα βοηθητικά αρχεία του LaTeX, τα εκτελέσιμα και τα αντικειμενικά αρχεία που αναπαράγει η μεταγλώττιση.
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας