Περίληψη
Αυτό το μάθημα ανοίγει την πρώτη ενότητα του κύκλου μαθημάτων, αφιερωμένη στα πρώτα βήματα στον προγραμματισμό με C++. Εξηγεί σε τι χρησιμεύει η ενότητα: να οδηγήσει όποιον δεν έχει προγραμματίσει ποτέ από ένα πρόβλημα διατυπωμένο σε καθημερινή γλώσσα ως ένα πρόγραμμα που μεταγλωττίζεται, εκτελείται, διαβάζει δεδομένα και γράφει αποτελέσματα, ξέροντας τι έκανε κάθε εργαλείο στη διαδρομή· παρουσιάζει τα έξι μαθήματά της και το νήμα που τα ενώνει, από τον αλγόριθμο γραμμένο στα ελληνικά ως την κατάταξη των σφαλμάτων· διευκρινίζει το λίγο που θεωρείται γνωστό, δηλαδή την αριθμητική του σχολείου, τη συνήθεια να ακολουθεί κανείς γραπτές οδηγίες και τον χειρισμό αρχείων και φακέλων· διατυπώνει το πρόβλημα που λύνει η ενότητα, πώς ένας υπολογισμός που ξέρουμε να κάνουμε με το χέρι γίνεται διαδικασία που μια μηχανή εκτελεί χωρίς να κάνει λάθος και χωρίς να κουράζεται· και δείχνει πού οδηγεί, στις ενότητες που ακολουθούν και στον κύκλο μαθημάτων Προγραμματισμός σε C++ II.
Μαθησιακοί στόχοι
- Να περιγράφουμε τη σειρά των περιεχομένων της ενότητας και να εξηγούμε τι προσφέρει κάθε μάθημα σε εκείνο που ακολουθεί.
- Να αναγνωρίζουμε τις προαπαιτούμενες γνώσεις που προϋποθέτει ο κύκλος μαθημάτων (πράξεις με ακέραιους και δεκαδικούς, υπολογισμός πηλίκου και υπολοίπου, τήρηση γραπτών οδηγιών, αποθήκευση ενός αρχείου σε συγκεκριμένο φάκελο) και να τις επαναλαμβάνουμε αν χρειάζεται.
- Να εξηγούμε, με ένα παράδειγμα, τη διαδρομή που η ενότητα διδάσκει να διανύουμε: από τη διατύπωση στην προδιαγραφή, από την προδιαγραφή στον αλγόριθμο και από τον αλγόριθμο στο πρόγραμμα που μεταγλωττίζεται και εκτελείται.
- Να αναγνωρίζουμε τι αναμένεται να ξέρουμε να κάνουμε στο τέλος της ενότητας, και να το διακρίνουμε από όσα θα μάθουμε στις ενότητες που ακολουθούν.
Αρχική αξιολόγηση
Πριν διατρέξουμε την ενότητα, αξίζει να μετρήσουμε το σημείο εκκίνησης. Η αξιολόγηση αυτή είναι αυτοαξιολόγηση: δεν βαθμολογείται, και μοναδικός σκοπός της είναι να προσανατολίσει τη μελέτη. Επειδή αυτή είναι η πρώτη ενότητα του κύκλου μαθημάτων, δεν υπάρχουν ερωτήσεις για ενότητες που προηγήθηκαν· στη θέση τους, οι τρεις πρώτες ελέγχουν όσα ο κύκλος μαθημάτων θεωρεί γνωστά: το πηλίκο και το υπόλοιπο μιας ακέραιας διαίρεσης, τη σειρά των βημάτων μιας διαδικασίας και το όνομα, την επέκταση και τον φάκελο ενός αρχείου. Οι επτά που ακολουθούν αγγίζουν, με τη σειρά, τις κεντρικές ιδέες των έξι μαθημάτων της ενότητας. Όποιος δεν έχει προγραμματίσει ποτέ δεν πρέπει να περιμένει να τις απαντήσει σωστά, και αυτό δεν έχει σημασία: κάθε απάντηση, σωστή ή λανθασμένη, εξηγεί το ζήτημα και κατονομάζει το μάθημα που το πραγματεύεται. Οι ίδιες δεξιότητες μετρώνται ξανά στο τέλος, στο μάθημα της σύνθεσης.
Πριν ξεκινήσεις την ενότητα, μέτρησε το σημείο εκκίνησής σου. Είναι μια σύντομη αυτοαξιολόγηση: δεν βαθμολογείται και το αποτέλεσμα αποθηκεύεται μόνο στον περιηγητή σου.
Ερώτηση 1Από προηγούμενες ενότητεςΜοιράζονται 47 φύλλα σε 6 άτομα, σε ίσα ακέραια μερίδια, και όσα δεν φτάνουν για έναν πλήρη γύρο φυλάσσονται. Πόσα παίρνει κάθε άτομο και πόσα φυλάσσονται;
Είναι η διαίρεση με δεκαδικά, όχι η ακέραια: τα φύλλα δεν κόβονται, και η ερώτηση ζητά πόσα περισσεύουν.Η στρογγυλοποίηση του πηλίκου προς τα πάνω απαιτεί φύλλα που δεν υπάρχουν· το υπόλοιπο της ακέραιας διαίρεσης δεν είναι ποτέ αρνητικό όταν ο διαιρετέος και ο διαιρέτης είναι θετικοί.Συγχέει το υπόλοιπο με το δεκαδικό μέρος του πηλίκου: το υπόλοιπο μετριέται σε φύλλα, όχι σε κλάσματα γύρου.Είναι η ακέραια διαίρεση: το πηλίκο είναι ο μεγαλύτερος αριθμός πλήρων γύρων, και το υπόλοιπο ό,τι περισσεύει, που είναι πάντα μικρότερο από τον διαιρέτη. Ο κύκλος μαθημάτων τη χρησιμοποιεί από το πρώτο πρόγραμμα, και στη C++ έχει δικούς της τελεστές.Επανάληψη: Από το πρόβλημα στον αλγόριθμο
Ερώτηση 2Από προηγούμενες ενότητεςΓια να στείλουμε ένα συνημμένο αρχείο με ηλεκτρονικό ταχυδρομείο υπάρχουν τέσσερα βήματα: A, γράφουμε τη διεύθυνση του παραλήπτη· B, πατάμε «Αποστολή»· C, ανοίγουμε ένα νέο μήνυμα· D, επισυνάπτουμε το αρχείο. Ποια σειρά είναι η κατάλληλη;
Η σειρά της απαρίθμησης δεν είναι η σειρά της εκτέλεσης: με αυτήν, το μήνυμα θα στελνόταν πριν υπάρξει.Το αποτέλεσμα εξαρτάται από τη σειρά: ό,τι επισυνάπτεται μετά την αποστολή δεν φτάνει.Στέλνει το μήνυμα χωρίς παραλήπτη και χωρίς συνημμένο· τα βήματα που ακολουθούν δεν το αλλάζουν πια.Ορισμένα βήματα εξαρτώνται από άλλα (δεν μπορούμε να επισυνάψουμε σε μήνυμα που δεν ανοίχτηκε, ούτε να συμπληρώσουμε ένα που έχει ήδη σταλεί), και άλλα όχι. Η αναγνώριση αυτών των εξαρτήσεων είναι το πρώτο που απαιτεί η συγγραφή ενός αλγορίθμου.Επανάληψη: Από το πρόβλημα στον αλγόριθμο
Ερώτηση 3Από προηγούμενες ενότητεςΈνα αρχείο είναι αποθηκευμένο στη διαδρομή
C:\Users\ana\programas\suma.cpp. Ποιο είναι το όνομά του, ποια η επέκτασή του και σε ποιον φάκελο βρίσκεται;Συγχέει τον φάκελο που περιέχει το αρχείο με το ίδιο το αρχείο: το όνομα είναι το τελευταίο συστατικό της διαδρομής.Η επέκταση είναι μέρος του ονόματος· ορισμένα συστήματα την κρύβουν εξ ορισμού, και ο κύκλος μαθημάτων ζητά να εμφανίζεται, επειδή τοsuma.cppκαι τοsuma.exeείναι πολύ διαφορετικά αρχεία.ΤοC:είναι η μονάδα δίσκου όπου αρχίζει η διαδρομή, όχι επέκταση.Η διαδρομή απαριθμεί τους φακέλους από τη ρίζα ως το αρχείο· η επέκταση, ό,τι ακολουθεί την τελευταία τελεία του ονόματος, λέει τι είδους περιεχόμενο έχει: το.cppείναι πηγαίος κώδικας C++. Για να μεταγλωττιστεί, το τερματικό πρέπει να βρίσκεται σε αυτόν τον φάκελο ή να λάβει την πλήρη διαδρομή.Επανάληψη: Μεταγλώττιση, εκτέλεση και ρύθμιση
Ερώτηση 4Μια συνταγή λέει: «Αν η ζύμη είναι στεγνή, πρόσθεσε μια κουταλιά νερό και ζύμωσε· επανάλαβε ώσπου να μην είναι». Η ζύμη χρειάζεται ακριβώς τρεις κουταλιές για να πάψει να είναι στεγνή. Πόσες φορές ρωτάμε αν η ζύμη είναι στεγνή;
Δεν μετρά την ερώτηση της οποίας η απάντηση είναι «όχι», που επίσης γίνεται: χωρίς αυτήν, κανείς δεν θα ήξερε ότι πρέπει να σταματήσει να προσθέτει νερό.Συγχέει το κείμενο της διαδικασίας με την εκτέλεσή της: η συνθήκη είναι γραμμένη μία φορά, αλλά ελέγχεται σε κάθε γύρο.Μετρά τα διαστήματα ανάμεσα στις κουταλιές, όχι τις ερωτήσεις.Σε κάθε επανάληψη που ρωτά πριν ενεργήσει, η συνθήκη ελέγχεται μία φορά περισσότερο από όσες εκτελείται το σώμα: η τελευταία ερώτηση είναι εκείνη που επιτρέπει την έξοδο. Αν ακολουθήσουμε τη διαδικασία με το χέρι, μετρώντας, αυτό φαίνεται χωρίς αμφισημία.Επανάληψη: Από το πρόβλημα στον αλγόριθμο
Ερώτηση 5Ποια από αυτές τις οδηγίες μπορεί να την ακολουθήσει οποιοσδήποτε άνθρωπος, ή μια μηχανή, με ακριβώς τον ίδιο τρόπο;
Εξαρτάται από το γούστο όποιου την εκτελεί: δύο άνθρωποι θα την ακολουθούσαν με διαφορετικό τρόπο, και μια μηχανή δεν έχει γούστο.Δεν λέει πόσες φορές ούτε τι σημαίνει να γίνει καλά: η συνθήκη τερματισμού δεν μπορεί να ελεγχθεί.Δεν καθορίζει τους αριθμούς: το «μεγάλος» δεν είναι ποσότητα, και ο διαιρέτης θα μπορούσε να είναι μηδέν.Λέει ποια πράξη γίνεται, με ποιο δεδομένο και πού μένει το αποτέλεσμα· τίποτα δεν εξαρτάται από την κρίση όποιου την εκτελεί. Αυτή η σαφήνεια είναι μία από τις τρεις απαιτήσεις ενός αλγορίθμου.Επανάληψη: Από το πρόβλημα στον αλγόριθμο
Ερώτηση 6Ένα πρόγραμμα μεταγλωττίζεται χωρίς σφάλματα και χωρίς προειδοποιήσεις, εκτελείται σωστά με πολλά δεδομένα, και με ένα συγκεκριμένο σταματά με το μήνυμα «division by zero». Σε ποια στιγμή προέκυψε το σφάλμα;
Ο μεταγλωττιστής μεταφράζει το κείμενο, δεν το εκτελεί, και δεν γνωρίζει τα δεδομένα που θα γράψει ο χρήστης.Ο συνδέτης συγκεντρώνει τα μέρη του προγράμματος· δεν κάνει υπολογισμούς ούτε βλέπει δεδομένα.Με άλλα δεδομένα το ίδιο εκτελέσιμο λειτουργεί: το ελάττωμα βρίσκεται σε ό,τι κάνει το πρόγραμμα με αυτό το δεδομένο, όχι στα εργαλεία.Ό,τι εξαρτάται μόνο από το κείμενο του προγράμματος ανακαλύπτεται κατά τη μεταγλώττιση ή τη σύνδεση· ό,τι εξαρτάται από τα δεδομένα, μόνο κατά την εκτέλεση. Γι' αυτό ένα πρόγραμμα που μεταγλωττίζεται δεν είναι, μόνο γι' αυτό, απαλλαγμένο από σφάλματα.Επανάληψη: Προγράμματα, μεταγλωττιστές και C++
Ερώτηση 7Εγκαταστάθηκε το Visual Studio Code με την επέκτασή του για τη C++, και όταν ζητάμε
g++ --versionστο τερματικό, αυτό απαντά ότι δεν αναγνωρίζει τοg++. Ποιο είναι το πιθανότερο;Η επέκταση δεν περιέχει τον μεταγλωττιστή ούτε παρεμβαίνει σε ό,τι βρίσκει το τερματικό.Η εντολή του τερματικούg++ --versionδεν μεταγλωττίζει κανένα πρόγραμμα: ρωτά μόνο την έκδοση, και το τερματικό δεν βρήκε καν ποιον να ρωτήσει.Ο επεξεργαστής κειμένου είναι αδιάφορος: αυτό που λείπει είναι ο μεταγλωττιστής, σε οποιονδήποτε επεξεργαστή.Ο επεξεργαστής κειμένου δεν μεταγλωττίζει: καλεί έναν ξεχωριστό μεταγλωττιστή, που πρέπει να είναι εγκατεστημένος και να τον βρίσκει το τερματικό. Η επέκταση για τη C++ βοηθά στη γραφή του κώδικα, αλλά δεν φέρνει μεταγλωττιστή.Επανάληψη: Εγκατάσταση του περιβάλλοντος σε Windows, macOS και Linux
Ερώτηση 8Ο μεταγλωττιστής γράφει ένα μήνυμα που αρχίζει με
warning:και, παρ' όλα αυτά, παράγει το εκτελέσιμο. Τι σημαίνει;Αυτό θα ήταν σφάλμα (error:), και τότε δεν θα υπήρχε εκτελέσιμο.Το ότι λειτουργεί με τα δεδομένα που δοκιμάστηκαν δεν αποδεικνύει τίποτα για τα υπόλοιπα· μια προειδοποίηση που αγνοήθηκε είναι, συχνά, το σφάλμα του αύριο.Το εκτελέσιμο είναι κανονικό· αμφίβολο είναι ό,τι κάνει το πρόγραμμα στο σημείο που επισημάνθηκε.Ένα σφάλμα εμποδίζει να πάρουμε το εκτελέσιμο· μια προειδοποίηση το επιτρέπει, αλλά επισημαίνει ύποπτο κώδικα. Πολλές προειδοποιήσεις φανερώνουν πραγματικά ελαττώματα, και γι' αυτό ο κύκλος μαθημάτων απαιτεί προγράμματα που μεταγλωττίζονται χωρίς καμία.Επανάληψη: Μεταγλώττιση, εκτέλεση και ρύθμιση
Ερώτηση 9Πού αρχίζει η εκτέλεση ενός προγράμματος C++;
Η πρώτη γραμμή είναι συνήθως μια οδηγία#include, που επεξεργάζεται πριν από τη μεταγλώττιση και δεν εκτελείται.Η σειρά μέσα στο αρχείο δεν καθορίζει το σημείο εισόδου· το καθορίζει το όνομαmain.Το πρότυπο ορίζει το όνομα του σημείου εισόδου· δεν επιλέγεται στην εντολή μεταγλώττισης.Ηmainείναι το σημείο εισόδου: το σύστημα την καλεί όταν θέτει σε λειτουργία το πρόγραμμα, και το πρόγραμμα τερματίζει όταν τερματίσει εκείνη. Ένα πρόγραμμα χωρίςmainμεταγλωττίζεται, αλλά δεν συνδέεται.Επανάληψη: Ανατομία ενός προγράμματος
Ερώτηση 10Ένα πρόγραμμα δηλώνει
int age{};, εκτελείstd::cin >> age;για να διαβάσει μια ηλικία, και ο χρήστης γράφειabc. Τι συμβαίνει;Δεν σταματά: συνεχίζει σαν να είχε πάει καλά η ανάγνωση, και γι' αυτό το ελάττωμα είναι επικίνδυνο.Μια μεταβλητήintαποθηκεύει μόνο ακέραιους· τα γράμματα δεν μετατρέπονται σε αριθμό ούτε αποθηκεύονται.Η ανάγνωση δεν ξαναδοκιμάζει: αποτυγχάνει μία φορά και αφήνει τη ροή σε κατάσταση σφάλματος.Η ανάγνωση ενός ακεραίου αποτυγχάνει όταν συναντά ένα γράμμα· το πρότυπο ορίζει ότι η μεταβλητή παίρνει 0 και ότι οι αναγνώσεις που ακολουθούν δεν θα κάνουν τίποτα ώσπου να αντιμετωπιστεί το σφάλμα. Αν το πρόγραμμα δεν ελέγχει την ανάγνωση, γράφει ψευδή συμπεράσματα χωρίς κανένα σήμα.Επανάληψη: Είσοδος, έξοδος και σφάλματα
Τα περιεχόμενα της ενότητας
Η ενότητα έχει έξι μαθήματα, που διατρέχουν με τη σειρά τη διαδρομή από ένα πρόβλημα ως ένα πρόγραμμα που λειτουργεί. Καθένα προϋποθέτει εκείνο που προηγείται, και το πρώτο δεν προϋποθέτει τίποτα από τη γλώσσα.
- Από το πρόβλημα στον αλγόριθμο. Ο κύκλος μαθημάτων αρχίζει χωρίς κώδικα, επειδή ο αλγόριθμος προηγείται του προγράμματος. Το μάθημα διδάσκει πώς προδιαγράφουμε ένα πρόβλημα με την είσοδό του, την έξοδό του και τη σχέση ανάμεσά τους (την προσυνθήκη και τη μετασυνθήκη)· πώς περιγράφουμε έναν αλγόριθμο σε αριθμημένα βήματα, χωρίς αμφισημία· πώς τον εκτελούμε με το χέρι με έναν πίνακα ίχνους· πώς αναγνωρίζουμε σε αυτόν την ακολουθία, την απόφαση και την επανάληψη· και πώς αιτιολογούμε ότι μια επανάληψη τερματίζει, με μια ποσότητα που μειώνεται σε κάθε γύρο.
- Προγράμματα, μεταγλωττιστές και C++. Ένας αλγόριθμος γραμμένος για μια μηχανή είναι ένα πρόγραμμα, και ένα πρόγραμμα C++ δεν εκτελείται όπως γράφεται: ο προεπεξεργαστής, ο μεταγλωττιστής και ο συνδέτης το μετατρέπουν σε εκτελέσιμο αρχείο. Το μάθημα διατρέχει αυτά τα τρία στάδια, διακρίνει όσα ανακαλύπτονται κατά τη μεταγλώττιση από όσα εκδηλώνονται μόνο κατά την εκτέλεση, συγκρίνει το μοντέλο της μεταγλώττισης με εκείνο της διερμηνείας και τοποθετεί στον χρόνο τα πρότυπα της γλώσσας, ως τη C++23, εκείνο που χρησιμοποιεί ο κύκλος μαθημάτων, και τη C++26, της οποίας η υλοποίηση στους μεταγλωττιστές βρίσκεται σε εξέλιξη.
- Εγκατάσταση του περιβάλλοντος σε Windows, macOS και Linux. Τρεις πλήρεις οδηγοί, ένας για κάθε σύστημα, για να εγκαταστήσουμε έναν μεταγλωττιστή ικανό για C++23 και τον επεξεργαστή κειμένου Visual Studio Code με την επέκτασή του για τη C++, να ελέγξουμε ότι όλα λειτουργούν με ένα δοκιμαστικό πρόγραμμα και να λύσουμε τα συχνά προβλήματα: τον μεταγλωττιστή που το τερματικό δεν βρίσκει, την παλιά έκδοση και το πρότυπο που δεν ζητήθηκε.
- Μεταγλώττιση, εκτέλεση και ρύθμιση. Ο κύκλος εργασίας της επεξεργασίας, της αποθήκευσης, της μεταγλώττισης, της εκτέλεσης και της ανάγνωσης, από το τερματικό και από τον επεξεργαστή κειμένου, με την εντολή μεταγλώττισης του κύκλου μαθημάτων. Το μάθημα διακρίνει τα σφάλματα, που εμποδίζουν το εκτελέσιμο, από τις προειδοποιήσεις, που επισημαίνουν ύποπτο κώδικα· ενεργοποιεί τους ανιχνευτές (sanitizers), τον ανιχνευτή σφαλμάτων μνήμης, AddressSanitizer, και εκείνον της απροσδιόριστης συμπεριφοράς, UndefinedBehaviorSanitizer, που επιτηρούν το πρόγραμμα όσο τρέχει· και εξηγεί γιατί μια έξοδος δείχνει παράξενα σύμβολα αντί για ελληνικά γράμματα.
- Ανατομία ενός προγράμματος. Το ελάχιστο πρόγραμμα, κομμάτι κομμάτι: η οδηγία συμπερίληψης και οι κεφαλίδες, η συνάρτηση
mainκαι ο κωδικός εξόδου, ο χώρος ονομάτωνstd, οι εντολές, τα μπλοκ και τα σχόλια. Το μάθημα διδάσκει πώς διορθώνουμε τα σφάλματα δομής διαβάζοντας τα μηνύματα του μεταγλωττιστή από το πρώτο, και ορίζει τον οδηγό ύφους του κύκλου μαθημάτων. - Είσοδος, έξοδος και σφάλματα. Το πρόγραμμα επικοινωνεί με τον έξω κόσμο: γράφει με τις συναρτήσεις
std::printκαιstd::println, με προδιαγραφές μορφής για το πλάτος και τα δεκαδικά, και διαβάζει με τοstd::cin. Το μάθημα δείχνει τι συμβαίνει όταν η είσοδος δεν έχει την αναμενόμενη μορφή και πώς ελέγχεται η ανάγνωση, και κλείνει την ενότητα με την κατάταξη των σφαλμάτων ανάλογα με τη στιγμή τους: σφάλματα μεταγλώττισης, σύνδεσης, εκτέλεσης και λογικά σφάλματα.
Το νήμα που τα ενώνει είναι το ίδιο το πρόγραμμα. Το πρώτο μάθημα το συλλαμβάνει, το δεύτερο εξηγεί σε τι μετατρέπεται, το τρίτο εγκαθιστά τα εργαλεία που το μετατρέπουν, το τέταρτο διδάσκει πώς τα χρησιμοποιούμε και πώς ακούμε όσα λένε, το πέμπτο το ανατέμνει και το έκτο το βάζει να συνομιλεί με όποιον το χρησιμοποιεί. Αν αυτό ισχύει, στο τέλος της ενότητας ο φοιτητής ξέρει ακόμη πολύ λίγα για τη C++, αλλά ξέρει πώς δουλεύει κανείς με αυτήν, και αυτό είναι ό,τι προϋποθέτει το υπόλοιπο του κύκλου μαθημάτων.
Τι θεωρείται γνωστό
Ο κύκλος μαθημάτων δεν προϋποθέτει καμία εμπειρία στον προγραμματισμό. Προϋποθέτει, αντίθετα, τρεις δεξιότητες που αξίζει να επαναλάβουμε τώρα, αν η αρχική αξιολόγηση έδειξε κάποια αμφιβολία.
Η πρώτη είναι η αριθμητική του σχολείου: πράξεις με ακέραιους και με δεκαδικούς, τήρηση της σειράς των πράξεων (ο πολλαπλασιασμός και η διαίρεση πριν από την πρόσθεση και την αφαίρεση, εκτός αν υπάρχουν παρενθέσεις) και, πάνω απ' όλα, υπολογισμός του πηλίκου και του υπολοίπου μιας ακέραιας διαίρεσης. Αυτή η τελευταία είναι σημαντικότερη απ' ό,τι φαίνεται. Αν μοιράσουμε 47 φύλλα σε 6 άτομα, παίρνει το καθένα 7 και περισσεύουν 5, πράγμα που γράφεται , με το υπόλοιπο μικρότερο από τον διαιρέτη . Η C++ έχει έναν τελεστή για το πηλίκο και έναν άλλον για το υπόλοιπο, και ένα μεγάλο μέρος των υπολογισμών με ακέραιους (η μετατροπή δευτερολέπτων σε ώρες, ο διαχωρισμός των ψηφίων ενός αριθμού, η απόφαση αν ένας αριθμός είναι άρτιος) ανάγεται σε αυτούς. Όποιος θέλει να τη μελετήσει διεξοδικά τη βρίσκει, με την απόδειξή της, στον κύκλο μαθημάτων Άλγεβρα και γεωμετρία I: αριθμοί, συναρτήσεις και γεωμετρία του επιπέδου· εδώ αρκεί να ξέρουμε να την υπολογίζουμε.
Η δεύτερη είναι η συνήθεια να ακολουθούμε γραπτές οδηγίες κατά γράμμα και να αναγνωρίζουμε πότε μια οδηγία δεν αρκεί για να ξέρουμε τι να κάνουμε. Δεν πρόκειται για γνώση, αλλά για στάση: να διαβάζουμε «πρόσθεσε αλάτι κατά βούληση» και να προσέχουμε ότι αυτή η οδηγία εξαρτάται από όποιον την εκτελεί. Το πρώτο μάθημα της ενότητας μετατρέπει αυτή τη στάση σε μέθοδο.
Η τρίτη είναι ο βασικός χειρισμός ενός υπολογιστή: να δημιουργούμε έναν φάκελο, να αποθηκεύουμε σε αυτόν ένα αρχείο με ένα όνομα της επιλογής μας, να αναγνωρίζουμε την επέκταση του ονόματος (.cpp, .txt, .exe) και να ξέρουμε σε ποιον φάκελο βρίσκεται κάθε αρχείο. Αξίζει να ρυθμίσουμε από τώρα το σύστημα ώστε να εμφανίζει τις επεκτάσεις, που ορισμένα συστήματα, όπως τα Windows, κρύβουν εξ ορισμού: ο πηγαίος κώδικας suma.cpp και το εκτελέσιμο suma.exe είναι πολύ διαφορετικά αρχεία, και η σύγχυσή τους είναι πηγή παράλογων σφαλμάτων. Η ενότητα διδάσκει επίσης τη χρήση του τερματικού, ώστε δεν χρειάζεται να την ξέρουμε από πριν· αρκεί να είμαστε διατεθειμένοι να γράφουμε εντολές στο τερματικό αντί να πατάμε κουμπιά. Η εγκατάσταση προγραμμάτων απαιτεί, τέλος, να μπορούμε να την κάνουμε στον δικό μας υπολογιστή· το μάθημα της εγκατάστασης υποδεικνύει μια διαδικτυακή εναλλακτική για όποιον δεν μπορεί.
Δεν προϋποτίθενται αγγλικά. Τα μηνύματα του μεταγλωττιστή είναι στα αγγλικά, και ο κύκλος μαθημάτων διδάσκει πώς τα διαβάζουμε πεδίο προς πεδίο, ώστε όσα μετρούν από αυτά (το αρχείο, η γραμμή, το είδος του ελαττώματος) να γίνονται κατανοητά χωρίς να κατέχουμε τη γλώσσα. Ούτε προϋποτίθενται μαθηματικά πέρα από τα σχολικά: τα παραδείγματα χρησιμοποιούν τη διαίρεση, τους μέσους όρους, την προπαίδεια, τις ημερομηνίες και τις ώρες.
Το πρόβλημα που λύνει η ενότητα
Ένας υπολογισμός που ξέρουμε να κάνουμε με το χέρι δεν είναι ακόμη πρόγραμμα. Την απόσταση ανάμεσά τους διδάσκει η ενότητα να τη διανύουμε, και ένα απλό πρόβλημα επιτρέπει να τη μετρήσουμε.
Ένα χρονόμετρο καταγράφει τη διάρκεια κάθε δραστηριότητας ως αριθμό δευτερολέπτων, για παράδειγμα 7384, και θέλουμε να τη γράψουμε στη συνήθη μορφή ωρών, λεπτών και δευτερολέπτων, με τα λεπτά και τα δευτερόλεπτα πάντα με δύο ψηφία: 2:03:04. Με το χέρι, ο υπολογισμός είναι μια αλυσίδα διαιρέσεων: , από όπου προκύπτουν 2 ώρες και 184 δευτερόλεπτα· , από όπου προκύπτουν 3 λεπτά και 4 δευτερόλεπτα. Για μία διάρκεια γίνεται σε ένα λεπτό. Για τις χίλιες διάρκειες ενός αρχείου καταγραφής, αντίθετα, ο υπολογισμός με το χέρι είναι μακρύς και επιρρεπής σε σφάλματα, και η εργασία προσφέρεται για να την εκτελέσει μια μηχανή.
Ωστόσο, μια μηχανή δεν μπορεί να δεχτεί την παραπάνω εξήγηση. Δέχεται ένα κείμενο σε μια γλώσσα προγραμματισμού, και για να γράψουμε αυτό το κείμενο πρέπει να έχουμε λύσει πρώτα τρία ζητήματα που ο υπολογισμός με το χέρι άφηνε σιωπηρά. Το πρώτο είναι η προδιαγραφή: τι μπαίνει (ένας ακέραιος αριθμός δευτερολέπτων, μη αρνητικός), τι βγαίνει (τρεις ακέραιοι, οι ώρες, τα λεπτά και τα δευτερόλεπτα) και ποια σχέση τα συνδέει: αν είναι το σύνολο, , με και . Το δεύτερο είναι ο αλγόριθμος: τα ακριβή βήματα που, για κάθε αποδεκτή είσοδο, παράγουν αυτή την έξοδο.
- Η παίρνει την τιμή του πηλίκου του διά .
- Η παίρνει την τιμή του πηλίκου διά του υπολοίπου του διά .
- Η παίρνει την τιμή του υπολοίπου του διά .
- Γράφονται η , άνω και κάτω τελεία, η με δύο ψηφία, άνω και κάτω τελεία και η με δύο ψηφία.
Το τρίτο είναι η γραφή του αλγορίθμου σε C++, με την ακριβή μορφή που απαιτεί η γλώσσα, και η μετάφρασή του σε εκτελέσιμο με τα κατάλληλα εργαλεία. Το πρόγραμμα που ακολουθεί το κάνει. Περιέχει πολλά πράγματα που δεν έχουν εξηγηθεί ακόμη: τις μεταβλητές (μάθημα 2.1), τους τελεστές / και %, που δίνουν το πηλίκο και το υπόλοιπο της ακέραιας διαίρεσης (μάθημα 3.1), την ανάγνωση με το std::cin και τις προδιαγραφές μορφής (μάθημα 1.6)· η προδιαγραφή {:02} αυτού του προγράμματος, που γράφει έναν αριθμό σε δύο θέσεις συμπληρώνοντας με μηδενικά στα αριστερά, είναι μια παραλλαγή του πλάτους που διδάσκει εκείνο το μάθημα και που θα χρησιμοποιήσει το μάθημα 3.1. Προς το παρόν αρκεί να αναγνωρίσουμε σε αυτό τα τέσσερα βήματα του αλγορίθμου.
#include <iostream>#include <print>int main(){ int total{}; // οι μεταβλητές θα εξηγηθούν στο μάθημα 2.1 std::print("Διάρκεια σε δευτερόλεπτα: "); std::cin >> total; const int hours{total / 3600}; const int minutes{total % 3600 / 60}; const int seconds{total % 60}; std::println("{} s = {}:{:02}:{:02}", total, hours, minutes, seconds);}7384Διάρκεια σε δευτερόλεπτα: 7384 s = 2:03:04Οι γραμμές 9 έως 11 είναι τα βήματα 1 έως 3, και η γραμμή 12 είναι το βήμα 4. Το ότι το αποτέλεσμα συμπίπτει με εκείνο που υπολογίστηκε με το χέρι δεν είναι σύμπτωση, αλλά ο έλεγχος που αξίζει σε κάθε πρόγραμμα: να το δοκιμάζουμε πρώτα με ένα δεδομένο του οποίου την απάντηση γνωρίζουμε.
Το πρόγραμμα λύνει το πρόβλημα, αλλά η ενότητα διδάσκει επίσης να δυσπιστούμε απέναντί του. Αν ο χρήστης γράψει abc αντί για αριθμό, η ανάγνωση αποτυγχάνει, η μεταβλητή total μένει μηδέν και το πρόγραμμα γράφει, χωρίς κανένα σήμα συναγερμού, ότι η διάρκεια είναι 0:00:00: ένα ψευδές συμπέρασμα με όψη αληθινού. Αν γράψει μια αρνητική διάρκεια, η προδιαγραφή δεν λέει τι πρέπει να συμβεί, και το αποτέλεσμα στερείται νοήματος. Αν γραφτεί total / 360 αντί για total / 3600, το πρόγραμμα μεταγλωττίζεται, εκτελείται και δίνει λανθασμένο αποτέλεσμα, και κανένα εργαλείο δεν το επισημαίνει. Καθένα από αυτά τα ελαττώματα ανήκει σε διαφορετικό είδος σφάλματος, που ανακαλύπτεται σε διαφορετική στιγμή και αναζητείται με διαφορετικό τρόπο· το τελευταίο μάθημα της ενότητας τα κατατάσσει. Από αυτό έπεται ότι το πρόβλημα που λύνει η ενότητα δεν είναι μόνο να γράψουμε αυτό το πρόγραμμα, αλλά να ξέρουμε γιατί λειτουργεί, με ποια δεδομένα παύει να λειτουργεί και ποιο εργαλείο θα προειδοποιήσει, ή όχι, για κάθε ελάττωμα.
Επομένως, στο τέλος της ενότητας ο φοιτητής θα μπορεί να γράφει, να μεταγλωττίζει και να εκτελεί προγράμματα αυτού του είδους: λίγα δεδομένα εισόδου, μερικοί υπολογισμοί στη σειρά και μερικά αποτελέσματα γραμμένα με μορφοποίηση. Δεν θα μπορεί ακόμη να παίρνει αποφάσεις ούτε να επαναλαμβάνει εντολές σε C++ (αν και θα μπορεί σε έναν αλγόριθμο γραμμένο στα ελληνικά), ούτε να επιλέγει με κριτήριο τον τύπο κάθε δεδομένου· αυτά φέρνουν οι ενότητες που ακολουθούν.
Πού οδηγεί
Η ενότητα είναι το κατώφλι του κύκλου μαθημάτων. Όσα χρησιμοποιούνται σε αυτήν χωρίς εξήγηση εξηγούνται αργότερα, με την εξής σειρά. Η ενότητα 2, «Δεδομένα και τύποι», εξηγεί τις μεταβλητές και πώς αποθηκεύονται στη μνήμη, τα όρια των ακεραίων (και γιατί ένας σωστός υπολογισμός μπορεί να υπερχειλίσει), τη στρογγυλοποίηση των αριθμών με δεκαδικά και τις μετατροπές ανάμεσα σε τύπους. Η ενότητα 3, «Εκφράσεις και τελεστές», εξηγεί την αριθμητική της C++, με το πηλίκο και το υπόλοιπο των αρνητικών, τη λογική των συνθηκών και όσα το πρότυπο αφήνει απροσδιόριστα σε μια έκφραση. Η ενότητα 4, «Έλεγχος ροής», μεταφέρει στη C++ τις αποφάσεις και τις επαναλήψεις που το πρώτο μάθημα γράφει στα ελληνικά, και διδάσκει πώς αιτιολογούμε ότι ένας βρόχος είναι σωστός και τερματίζει. Η ενότητα 5 αναλύει τα προγράμματα σε συναρτήσεις· η 6 εισάγει τα σύνθετα δεδομένα (πίνακες, διανύσματα, δισδιάστατους πίνακες και εγγραφές), με τους αλγορίθμους αναζήτησης και ταξινόμησης και το κόστος τους· η 7 πραγματεύεται το κείμενο, την εύρωστη ανάγνωση της εισόδου και τα αρχεία· και η 8, τα προγράμματα πολλών αρχείων, τις συστηματικές δοκιμές και τον αποσφαλματωτή.
Μετά τον κύκλο μαθημάτων, ο Προγραμματισμός σε C++ II συνεχίζει με όσα αυτός αφήνει σκόπιμα έξω: τους δείκτες και τη δυναμική μνήμη, τις κλάσεις με μεθόδους, τα δικά μας templates, τις ανώνυμες συναρτήσεις και τις εξαιρέσεις. Κανένα από αυτά τα θέματα δεν είναι απαραίτητο για να λυθούν τα προβλήματα αυτού του κύκλου μαθημάτων, και η αναβολή τους επιτρέπει να συγκεντρωθούμε σε ό,τι ισχύει σε κάθε γλώσσα: να προδιαγράφουμε, να σχεδιάζουμε τον αλγόριθμο, να τον γράφουμε με σαφήνεια και να ελέγχουμε ότι είναι σωστός. Το μάθημα της σύνθεσης αυτής της ενότητας θα συγκεντρώσει ακριβώς αυτή τη διάκριση, ανάμεσα σε ό,τι είναι ίδιον της C++ και σε ό,τι θα μεταφερθεί σε οποιαδήποτε άλλη γλώσσα.
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας