Στόχοι: μετά από αυτό το κεφάλαιο θα μπορείτε να
- βρίσκετε τα εργαλεία του μαθήματος (site, Piazza, eclass, GitHub) και να ξέρετε πού να απευθύνετε μια ερώτηση·
- περιγράφετε πώς βαθμολογείται το μάθημα και γιατί οι ασκήσεις και το εργαστήριο μετράνε στην πράξη, και τι ισχύει για τη χρήση τεχνητής νοημοσύνης στις εργασίες·
- ορίζετε τι είναι υπολογιστής, προγραμματισμός, πρόγραμμα, αλγόριθμος και γλώσσα προγραμματισμού·
- εξηγείτε γιατί η ανθρώπινη γλώσσα δεν αρκεί για να δώσουμε εντολές σε έναν υπολογιστή (αμφισημία)·
- αναφέρετε λόγους για τους οποίους μαθαίνουμε C·
- διαβάζετε, γραμμή προς γραμμή, το πρόγραμμα Hello World και να το τρέχετε.
Προαπαιτούμενα: κανένα, αυτό είναι το πρώτο κεφάλαιο.
Χρόνος μελέτης: ~1 ώρα
Η πρώτη διάλεξη του μαθήματος «Εισαγωγή στον Προγραμματισμό» (K04) είναι κυρίως εισαγωγική: γνωρίζουμε το Τμήμα, τα διαδικαστικά του μαθήματος (ώρες, βαθμολογία, πρόοδος, εργαστήριο, εργαλεία, κώδικας τιμής) και τον σκοπό του, που είναι να γίνετε junior software developers με προοπτικές. Στη συνέχεια θέτουμε τα θεμέλια: τι είναι ένας υπολογιστής, τι σημαίνει προγραμματισμός, τι είναι ένα πρόγραμμα και πώς διαφέρει από έναν αλγόριθμο. Βλέπουμε γιατί χρειαζόμαστε ειδικές γλώσσες προγραμματισμού (η ανθρώπινη γλώσσα είναι γεμάτη αμφισημίες) και γιατί το μάθημα διδάσκεται σε C, μια γλώσσα δημοφιλή εδώ και δεκαετίες και από τις ταχύτερες και οικονομικότερες σε ενέργεια. Κλείνουμε με το πρώτο μας πρόγραμμα, το κλασικό Hello World.
Η διάλεξη ξεκινά με το ερώτημα «Γιατί να ασχοληθείς με τον προγραμματισμό το 2026;» και δίνει τέσσερις ενδεικτικούς λόγους:
Το Τμήμα Πληροφορικής και Τηλεπικοινωνιών του ΕΚΠΑ, σύμφωνα με τις διαφάνειες, βρίσκεται στα 250 καλύτερα πανεπιστήμια του κόσμου στην Επιστήμη Υπολογιστών (Computer Science) και έχει διακρίσεις σε πολλά επιστημονικά πεδία, από πρωτοβουλίες τόσο ερευνητών όσο και φοιτητών. Πάνω απ’ όλα, είναι ευκαιρία να συναναστραφείτε ιδιαίτερα ταλαντούχους συμφοιτητές.
Site. Όλο το υλικό (διαφάνειες, ασκήσεις, εργαστήρια) βρίσκεται στο progintro.github.io. Το μάθημα διδάσκεται σε δύο τμήματα (άρτιοι / περιττοί αριθμοί μητρώου), με διδάσκοντες τον Θανάση Αυγερινό και τον Τάκη Σταματόπουλο· η ύλη, το εργαστήριο, οι ασκήσεις και το διαγώνισμα είναι ίδια και για τα δύο.
Ώρες. Οι διαλέξεις γίνονται Δευτέρα και Παρασκευή 9πμ–11πμ, στο Αμφιθέατρο (άρτιοι) και στην Α2 (περιττοί). Ώρες γραφείου:
| Ημέρα | Ώρα | Αυγερινός | Σταματόπουλος |
|---|---|---|---|
| Δευτέρα | 11πμ–12μμ | Α40 | Α48 |
| Παρασκευή | 11πμ–12μμ | Α3 | Α48 |
Βαθμολογία. Ο τελικός βαθμός υπολογίζεται ως εξής:
Οι Γραπτές Εξετάσεις είναι η Τελική Εξέταση και, κατά το σχέδιο του μαθήματος, μια Πρόοδος (7 Δεκεμβρίου), και οι δύο γραπτές με κλειστά βιβλία. Η Πρόοδος μόνο βοηθάει:
\[\text{Γραπτές Εξετάσεις} = \max(\text{Τελική},\ 0.7 \cdot \text{Τελική} + 0.3 \cdot \text{Πρόοδος})\]Ισχύει και μια αναπροσαρμογή: αν ο βαθμός των Ασκήσεων είναι πάνω από 3 μονάδες μεγαλύτερος από τον βαθμό των Γραπτών Εξετάσεων, τότε ο βαθμός των Ασκήσεων γίνεται Γραπτές Εξετάσεις + 3. Οι Ασκήσεις (εργασίες για το σπίτι) υποβάλλονται online και η επίλυσή τους βοηθάει σημαντικά. Οι Προφορικές έχουν ερωτήσεις θεωρίας και ζωντανό γράψιμο κώδικα. Στο Εργαστήριο η παρουσία είναι υποχρεωτική για τους πρωτοετείς (μέχρι 2 απουσίες).
Μπορεί λοιπόν κανείς να περάσει χωρίς εργασίες και εργαστήριο; «In theory, theory and practice are the same. In practice, they are not.» Θεωρητικά ναι, στην πράξη όχι: όπως κανείς δεν μαθαίνει αναρρίχηση διαβάζοντας ένα εγχειρίδιο, έτσι και ο προγραμματισμός μαθαίνεται μόνο γράφοντας κώδικα.
Τεχνητή νοημοσύνη στις εργασίες; Μπορώ να χρησιμοποιήσω ChatGPT, Copilot, Claude κ.λπ. για να λύσω τις εργασίες; Όχι: το απαγορεύει ο κώδικας τιμής του μαθήματος. Η διάλεξη το στηρίζει με μια μελέτη του 2026 (Gao, Sun & Khan, Frontiers in Psychology): η τεχνητή νοημοσύνη βοηθάει όταν τη χρησιμοποιείς σαν προπονητή και όχι σαν δεκανίκι, ελέγχοντας τις απαντήσεις της, ενώ η υπερβολική εξάρτηση οδηγεί σε λιγότερη ανεξάρτητη σκέψη και ρηχότερη μάθηση. Η μάθηση δεν έχει συντομεύσεις.
Εργαστήριο. Γίνεται σε εβδομαδιαία βάση και ξεκινά την εβδομάδα της 5ης Οκτωβρίου. Γράφεστε στην εργαστηριακή ομάδα που σας ταιριάζει μέσω του eclass· αν δεν βρίσκετε θέση, θα ανοίξουν και άλλες.
Εργαλεία του μαθήματος. Χρειάζεστε:
Αν θέλετε, μπορείτε να έχετε υπολογιστή μαζί σας στο μάθημα, για να προγραμματίζετε ζωντανά.
Έχω μια ερώτηση, τι κάνω; Η διάλεξη βάζει δύο επιλογές: (Α) στέλνω email στον Αυγερινό ή στον Τάκη, ή (Β) ελέγχω αν έχει ήδη απαντηθεί στο FAQ ή στο Piazza και, μόνο αν δεν έχει απαντηθεί, ποστάρω καινούρια ερώτηση. Ο δρόμος του μαθήματος είναι το (Β), αφού γι’ αυτό υπάρχουν το FAQ και το Piazza: η απάντηση ωφελεί όλους και δεν επαναλαμβάνεται.
Εργαλεία φοιτητών. Πέρα από τα εργαλεία του μαθήματος, οι φοιτητές έχουν έναν Discord server της Σχολής και το DIT Coding Club.
Το μάθημα έχει τρεις στόχους:
Με άλλα λόγια, στο τέλος του εξαμήνου θέλουμε να είστε junior software developers με προοπτικές. Η ύλη χωρίζεται σε πέντε ενότητες, με τα εργαστήρια να τρέχουν παράλληλα και τις εργασίες (hw0, hw1, hw2 και ένα τελικό project) να κλείνουν τις ενότητες:
flowchart LR
A["Βασικά / Διαδικαστικά<br/>(γραμμή εντολών, μνήμη, git)"] --> B["Πρώτα Προγράμματα<br/>(τελεστές, ροή ελέγχου, είσοδος)"]
B --> C["Σύνθετα Προγράμματα<br/>(πίνακες, δείκτες, μνήμη)"]
C --> D["Αλγόριθμοι και Δομές<br/>(ταξινόμηση, δομές, λίστες, δέντρα)"]
D --> E["Προχωρημένα Θέματα<br/>(οργάνωση κώδικα)"]
B -.-> H0["hw0"]
C -.-> H1["hw1"]
D -.-> H2["hw2"]
E -.-> P["project"]
Σχήμα: οι ενότητες του μαθήματος και οι εργασίες που αντιστοιχούν σε καθεμία.
Στον χάρτη μαθημάτων του Τμήματος, το K04 είναι συνιστώμενο προαπαιτούμενο για τις Δομές Δεδομένων (K08) και τον Αντικειμενοστρεφή Προγραμματισμό (K10), και μέσω αυτών για μεγάλο μέρος του προγράμματος σπουδών (Λειτουργικά Συστήματα, Προγραμματισμός Συστήματος, Μεταγλωττιστές κ.ά.). Αν όλα αυτά ακούγονται πολλά: ένα βήμα τη φορά. Η καμπύλη Dunning-Kruger δείχνει ότι η αυτοπεποίθηση ενός αρχάριου συχνά ανεβαίνει απότομα («Peak of Mount Stupid»), πέφτει όταν συνειδητοποιεί πόσα δεν ξέρει («Valley of Despair») και μετά ανεβαίνει σταθερά όσο μεγαλώνει η πραγματική γνώση. Η απογοήτευση των πρώτων εβδομάδων είναι φυσιολογικό στάδιο, όχι ένδειξη ότι «δεν κάνετε».
Υπολογιστής (computer) είναι μια κατασκευή που έχει την ικανότητα να επεξεργάζεται ένα σύνολο από δεδομένα (data) που του δίνονται και να παράγει τα απαιτούμενα αποτελέσματα (results). Το είδος της επεξεργασίας το καθορίζει το πρόγραμμα με το οποίο τον έχουμε τροφοδοτήσει.
flowchart LR
D["Δεδομένα"] --> C["Υπολογιστής<br/>(εκτελεί το πρόγραμμα)"]
P["Πρόγραμμα"] --> C
C --> R["Αποτελέσματα"]
Σχήμα: ο υπολογιστής μετατρέπει δεδομένα σε αποτελέσματα, όπως ορίζει το πρόγραμμα.
Χρησιμοποιούμε υπολογιστές για δύο λόγους:
Πολλές εφαρμογές, όπως η πρόγνωση του καιρού, χρειάζονται και τα δύο ταυτόχρονα.
Οι σημειώσεις του μαθήματος συμπληρώνουν την εικόνα. Ένας υπολογιστής αποτελείται από την κεντρική μονάδα επεξεργασίας (CPU), τη μνήμη (memory) για προσωρινή αποθήκευση δεδομένων και προγραμμάτων, τη δευτερεύουσα μνήμη (δίσκοι) για μόνιμη αποθήκευση και τις μονάδες εισόδου/εξόδου (πληκτρολόγιο, οθόνη). Όλη η πληροφορία αποθηκεύεται ως δυαδικά ψηφία, bits (0 και 1), οργανωμένα σε bytes των 8 bits. Τα προγράμματα ενός υπολογιστή είναι το λογισμικό (software) του, ενώ η ίδια η συσκευή είναι το υλικό (hardware). Τη μνήμη και την αναπαράσταση των δεδομένων θα τις δούμε αναλυτικά στο Κεφάλαιο 2.
Προγραμματισμός (programming) είναι ο σαφής καθορισμός μιας διαδικασίας, σαν ένα σύνολο από εντολές (το πρόγραμμα), που περιγράφει λεπτομερώς τα βήματα που πρέπει να γίνουν για να επιλυθεί ένα πρόβλημα υπολογισμού.
Πρόγραμμα (program) είναι η καταγραφή της επίλυσης ενός προβλήματος. Κάθε εφαρμογή που χρησιμοποιείτε (ο browser, ένα παιχνίδι, το λειτουργικό σύστημα του κινητού σας) είναι πρόγραμμα. Όπως λέει ο Gusteau στο Ratatouille, «anyone can cook», και η διάλεξη το προσαρμόζει: οποιοσδήποτε μπορεί να προγραμματίσει, αλλά μόνο οι ατρόμητοι γίνονται σπουδαίοι.
Ποια η διαφορά με τον αλγόριθμο; Αλγόριθμος (algorithm) λέγεται μια πεπερασμένη σειρά ενεργειών, αυστηρά καθορισμένων και εκτελέσιμων σε πεπερασμένο χρόνο, που στοχεύουν στην επίλυση ενός προβλήματος. Η λέξη προέρχεται από το όνομα του Πέρση μαθηματικού Al-Khwarizmi (~820 μ.Χ.). Ο αλγόριθμος είναι η ιδέα της λύσης, ανεξάρτητη από γλώσσα· το πρόγραμμα είναι η διατύπωσή της σε μια συγκεκριμένη γλώσσα προγραμματισμού, ώστε να μπορεί να την εκτελέσει ένας υπολογιστής.
Γιατί δεν δίνουμε απλώς τις οδηγίες στα ελληνικά ή στα αγγλικά; Επειδή η ανθρώπινη γλώσσα έχει αμφισημίες (ambiguities). Το quiz της διάλεξης, «Ποιο είναι το πιο ψηλό βουνό του κόσμου;», έχει τρεις σωστές απαντήσεις, ανάλογα με το τι εννοούμε «ψηλό»:
| Ερμηνεία του «ψηλό» | Βουνό |
|---|---|
| μεγαλύτερο υψόμετρο από τη μέση στάθμη της θάλασσας (8.848 m) | Έβερεστ |
| πιο μακριά από το κέντρο της Γης | Τσιμποράσο (Chimborazo) |
| μεγαλύτερο ύψος από τη βάση ως την κορυφή (10.210 m) | Μάουνα Κέα (Mauna Kea) |
Οι αμφισημίες είναι δύο ειδών. Λεξιλογική αμφισημία (lexical ambiguity) έχουμε όταν μία λέξη έχει δύο ή περισσότερες σημασίες: στο «I saw her duck.» το duck είναι είτε «πάπια» είτε «έσκυψε». Συντακτική αμφισημία (syntactic ambiguity) έχουμε όταν μια πρόταση ή ακολουθία λέξεων επιδέχεται περισσότερες από μία ερμηνείες: το «The chicken is ready to eat.» σημαίνει είτε ότι το φαγητό είναι έτοιμο είτε ότι η κότα πεινάει.
Οι αμφισημίες είναι παντού, από την αρχαιότητα ως σήμερα. Ο χρησμός της Πυθίας «Ήξεις αφήξεις ου εν πολέμω θνήξεις» σημαίνει «θα πας, θα γυρίσεις, δεν θα πεθάνεις στον πόλεμο» ή «θα πας, δεν θα γυρίσεις, θα πεθάνεις στον πόλεμο», ανάλογα με το πού βάζεις το κόμμα: πριν ή μετά το «ου». Και σήμερα, ένα σύστημα τεχνητής νοημοσύνης που του ζητήθηκε να «λύσει ένα τεστ κυβερνοασφάλειας» βρήκε τις απαντήσεις παραβιάζοντας το Hugging Face, όπου ήταν αποθηκευμένες: η οδηγία δεν έλεγε πώς επιτρέπεται να λυθεί το τεστ.
Ένας υπολογιστής δεν μπορεί να «μαντέψει» τι εννοούμε. Γι’ αυτό επινοήσαμε τις γλώσσες προγραμματισμού. Γλώσσα προγραμματισμού (programming language) είναι μια γλώσσα που μας επιτρέπει να επικοινωνούμε εντολές στον υπολογιστή. Μια καλή γλώσσα προγραμματισμού δεν επιτρέπει αμφισημία: κάθε πρόγραμμα έχει ακριβώς μία σημασία. Ως bonus, η γλώσσα προγραμματισμού μαζί με τον υπολογιστή μπορεί να λύσει και αμφισημίες ανάμεσα σε προγραμματιστές: αν διαφωνείτε για το τι κάνει ένα κομμάτι κώδικα, το τρέχετε και βλέπετε.
Οι σημειώσεις διακρίνουν τις γλώσσες χαμηλού επιπέδου (γλώσσα μηχανής, assembly), που είναι κοντά στον επεξεργαστή, από τις γλώσσες υψηλού επιπέδου (C, Python, Java κ.ά.), που είναι κοντά στον τρόπο που σκεφτόμαστε. Από μια γλώσσα υψηλού επιπέδου χρειαζόμαστε μηχανισμούς για είσοδο και έξοδο, ακολουθίες βημάτων, αποθήκευση τιμών στη μνήμη, επιλογή με βάση συνθήκη, επανάληψη και «πακετάρισμα» συχνών λειτουργιών. Όλα αυτά τα μαθαίνουμε στη C τα επόμενα κεφάλαια.
Η C δημιουργήθηκε γύρω στο 1970 από τον Dennis Ritchie, ο οποίος μαζί με τον Ken Thompson δημιούργησε και το λειτουργικό σύστημα UNIX και τη γλώσσα B, την προκάτοχο της C. Τη μαθαίνουμε επειδή είναι:
Η C είναι επίσης το «αγωνιστικό» των γλωσσών. Σε μια σύγκριση πολλών γλωσσών στα ίδια προβλήματα (βλ. «Programming Language Shootout» στο «Διάβασμα»), με τιμές κανονικοποιημένες ως προς την καλύτερη γλώσσα (1.00 = η καλύτερη):
| Μέτρο | C | Rust | C++ | Java | Python |
|---|---|---|---|---|---|
| Ενέργεια | 1.00 (1η) | 1.03 | 1.34 | 1.98 | 75.88 |
| Χρόνος | 1.00 (1η) | 1.04 | 1.56 | 1.89 | 71.90 |
| Μνήμη | 1.17 (3η) | 1.54 | 1.34 | 6.01 | 2.80 |
Στη μνήμη η C έρχεται τρίτη, μετά την Pascal (1.00) και τη Go (1.05). Η Python, αν και σήμερα η πιο δημοφιλής γλώσσα, είναι περίπου 72 φορές πιο αργή από τη C σε αυτή τη σύγκριση. Η C σας δίνει ταχύτητα και έλεγχο, με αντίτιμο ότι πρέπει να καταλαβαίνετε τι κάνει ο υπολογιστής από κάτω.
Ο υπολογιστής δεν εκτελεί απευθείας κώδικα C. Γράφουμε το πρόγραμμα σε ένα αρχείο
κειμένου, το πηγαίο αρχείο (source file), π.χ. helloworld.c. Ο μεταγλωττιστής
(compiler) το μετατρέπει σε αντικειμενικό αρχείο (object file) σε γλώσσα μηχανής,
και ο συνδέτης (linker) ενώνει τα αντικειμενικά αρχεία με τις βιβλιοθήκες
(libraries) που χρειάζονται (π.χ. αυτή που περιέχει την printf) σε ένα
εκτελέσιμο αρχείο (executable), που μπορεί να τρέξει ο επεξεργαστής. Στο μάθημα
χρησιμοποιούμε τον μεταγλωττιστή gcc, που κάνει και τα δύο βήματα με μία εντολή.
flowchart LR
S["helloworld.c<br/>(πηγαίος κώδικας)"] -->|"μεταγλωττιστής"| O["helloworld.o<br/>(αντικειμενικό αρχείο)"]
O -->|"συνδέτης"| E["helloworld<br/>(εκτελέσιμο)"]
L["βιβλιοθήκες<br/>(π.χ. printf)"] --> E
E -->|"./helloworld"| R["Hello world"]
Σχήμα: μεταγλώττιση και σύνδεση ενός προγράμματος C.
Στη διάλεξη τρέξαμε το πρώτο πρόγραμμα σε έναν online compiler, μια ιστοσελίδα
που κάνει όλα τα παραπάνω για λογαριασμό σας, όπως το Sea
του μαθήματος. Από το επόμενο κεφάλαιο
(Κεφάλαιο 1) δουλεύουμε στη γραμμή εντολών, όπου καλούμε τον
gcc μόνοι μας.
Το πρώτο πρόγραμμα που γράφει κανείς σε μια νέα γλώσσα, κατά παράδοση, τυπώνει «Hello world». Στη C μοιάζει έτσι:
/* File: helloworld.c */
#include <stdio.h>
int main() {
printf("Hello world\n");
}
Κάθε γραμμή έχει ρόλο:
/* ... */ είναι σχόλιο (comment): ό,τι βρίσκεται ανάμεσα στο /* και στο */
αγνοείται από τον μεταγλωττιστή. Γράφουμε σχόλια για τους ανθρώπους που θα
διαβάσουν τον κώδικα.#include <stdio.h> είναι οδηγία προς τον προεπεξεργαστή (preprocessor) να
συμπεριλάβει εκεί τα περιεχόμενα του αρχείου επικεφαλίδας (header file)
stdio.h (standard input/output), που δηλώνει τις συναρτήσεις εισόδου/εξόδου, μεταξύ
αυτών και την printf.int main() { ... } ορίζει τη συνάρτηση (function) main. Κάθε πρόγραμμα C έχει
ακριβώς μία main, και από εκεί ξεκινά η εκτέλεση. Οι εντολές της βρίσκονται μέσα
στις αγκύλες { }. Για το int θα μιλήσουμε σε επόμενο κεφάλαιο.printf("Hello world\n"); καλεί τη συνάρτηση εξόδου printf, που τυπώνει τη
συμβολοσειρά (string) ανάμεσα στα διπλά εισαγωγικά (χωρίς τα εισαγωγικά). Το \n
είναι ειδική ακολουθία που σημαίνει αλλαγή γραμμής (newline). Η εντολή τελειώνει
με ;.Το εργαστήριο γράφει το ίδιο πρόγραμμα με μια επιπλέον γραμμή return 0; στο τέλος
της main. Και οι δύο μορφές είναι σωστές· τι σημαίνει η τιμή που επιστρέφει η main
θα το δούμε στο Κεφάλαιο 3.
Εφαρμόζει: «Η δομή του Hello World», «Από τον πηγαίο κώδικα στο εκτελέσιμο».
Η διάλεξη προτείνει να τρέξετε το πρόγραμμα αμέσως, χωρίς να εγκαταστήσετε τίποτα, σε έναν online compiler: το Sea, που τρέχει C μέσα στον browser, ή τον online compiler του Programiz (σύνδεσμοι στο «Διάβασμα»). Αντιγράψτε τον κώδικα της προηγούμενης ενότητας, πατήστε «Run» και στο παράθυρο εξόδου θα δείτε:
Hello world
Δοκιμάστε μικρές αλλαγές για να δείτε τι συμβαίνει: αλλάξτε το μήνυμα, βάλτε δύο
printf τη μία μετά την άλλη, ή αφαιρέστε το \n και δείτε πού πάει η επόμενη
έξοδος.
Εφαρμόζει: «Από τον πηγαίο κώδικα στο εκτελέσιμο».
Στο εργαστήριο (και από το επόμενο κεφάλαιο) γράφετε το πρόγραμμα σε ένα αρχείο με
έναν κειμενογράφο, το μεταγλωττίζετε με τον gcc και τρέχετε το εκτελέσιμο:
$ gcc -o helloworld helloworld.c
$ ./helloworld
Hello world
$
Η επιλογή -o helloworld δίνει όνομα στο εκτελέσιμο· χωρίς αυτήν, ο gcc το ονομάζει
a.out. Το ./ λέει στο shell να βρει το πρόγραμμα στον τρέχοντα κατάλογο.
Εφαρμόζει: «Αμφισημία και γλώσσες προγραμματισμού».
Η διάλεξη εξηγεί με ένα ανέκδοτο γιατί επινοήσαμε τις γλώσσες προγραμματισμού. Ο Joe λέει στον φίλο του, τον προγραμματιστή Charlie: «Go to the store and buy a loaf of bread. If they have eggs, buy a dozen.» Ο Charlie γυρίζει με 12 φραντζόλες ψωμί. Η φράση «buy a dozen» δεν λέει δώδεκα από τι:
flowchart TD
S["Πήγαινε στο μαγαζί"] --> Q{"Έχουν αυγά;"}
Q -->|"όχι"| B1["Αγόρασε 1 ψωμί"]
Q -->|"ναι (ερμηνεία του Joe)"| B2["Αγόρασε 1 ψωμί και 12 αυγά"]
Q -->|"ναι (ερμηνεία του Charlie)"| B3["Αγόρασε 12 ψωμιά"]
Σχήμα: η ίδια οδηγία, δύο διαφορετικά «προγράμματα».
Σε μια γλώσσα προγραμματισμού, όπως στη C, ο προγραμματιστής θα έπρεπε να γράψει ρητά τι αγοράζει και πόσο, οπότε η αμφισημία δεν θα μπορούσε να υπάρξει.
Η διάλεξη προτείνει πηγές εξάσκησης πέρα από τις ασκήσεις του μαθήματος:
Πριν από την επόμενη διάλεξη:
main, από την οποία ξεκινά η
εκτέλεση· η printf τυπώνει μια συμβολοσειρά και το \n αλλάζει γραμμή.| Ελληνικά | English | Σύντομος ορισμός |
|---|---|---|
| υπολογιστής | computer | Κατασκευή που επεξεργάζεται δεδομένα και παράγει αποτελέσματα |
| προγραμματισμός | programming | Σαφής καθορισμός διαδικασίας που λύνει πρόβλημα υπολογισμού |
| πρόγραμμα | program | Η καταγραφή της επίλυσης ενός προβλήματος, ως σύνολο εντολών |
| αλγόριθμος | algorithm | Πεπερασμένη σειρά αυστηρά καθορισμένων ενεργειών, εκτελέσιμων σε πεπερασμένο χρόνο, που λύνει ένα πρόβλημα |
| γλώσσα προγραμματισμού | programming language | Γλώσσα χωρίς αμφισημίες για εντολές σε υπολογιστή |
| αμφισημία | ambiguity | Όταν μια λέξη ή πρόταση έχει περισσότερες από μία σημασίες |
| λογισμικό / υλικό | software / hardware | Τα προγράμματα / η ίδια η συσκευή |
| αποσφαλμάτωση | debugging | Εντοπισμός και διόρθωση λαθών σε πρόγραμμα |
| πηγαίο αρχείο | source file | Αρχείο κειμένου με τον κώδικα, π.χ. helloworld.c |
| μεταγλωττιστής | compiler | Μετατρέπει πηγαίο κώδικα σε γλώσσα μηχανής (π.χ. gcc) |
| συνδέτης | linker | Ενώνει αντικειμενικά αρχεία και βιβλιοθήκες σε εκτελέσιμο |
| εκτελέσιμο | executable | Αρχείο που μπορεί να τρέξει ο επεξεργαστής |
| σχόλιο | comment | Κείμενο μέσα σε /* */ που αγνοεί ο μεταγλωττιστής |
| αρχείο επικεφαλίδας | header file | Αρχείο με δηλώσεις, π.χ. stdio.h |
| συμβολοσειρά | string | Κείμενο ανάμεσα σε διπλά εισαγωγικά, π.χ. "Hello world\n" |
| αλλαγή γραμμής | newline | Ο χαρακτήρας \n |
hello.c, Άσκηση 1 about.c;. printf("Hello world\n") χωρίς ; δεν μεταγλωττίζεται
(expected ';'). Διόρθωση: κάθε εντολή τελειώνει με ;.#include <stdio.h>. Ο μεταγλωττιστής δεν ξέρει την printf και
προειδοποιεί (ή σταματά) με μήνυμα για implicit declaration of function 'printf'.\n. Χωρίς αλλαγή γραμμής, η επόμενη έξοδος (ή το prompt του shell)
κολλάει στο τέλος του μηνύματος: Hello world$."..."· με μονά
'Hello' ή «έξυπνα» εισαγωγικά από κειμενογράφο εγγράφων ο κώδικας δεν
μεταγλωττίζεται.Main ή Printf δεν είναι
το ίδιο με main και printf.Από τα Kahoot των διαλέξεων: οι ερωτήσεις όπου μια λάθος απάντηση μάζεψε πολλές ψήφους, με το ποσοστό σωστών απαντήσεων.
#include <stdio.h> στο Hello World;6\n από το printf("Hello world\n");;8Ερωτήσεις που παίχτηκαν στις διαλέξεις, με το ποσοστό των φοιτητών που απάντησαν σωστά.
slides-lec00-ai-homeworkslides-lec00-ask-questionslides-lec00-bread-and-eggsslides-lec00-hello-worldslides-lec00-highest-mountainslides-lec00-pass-without-labsslides-lec00-program-vs-algorithmslides-lec00-programs-you-knowslides-lec00-why-programminglab-lab01-step2-compile-linklab-lab00-aboutslides-lecmake-build-pipelineΤην ταχύτητα στην επεξεργασία δεδομένων και τη μνήμη που διαθέτουν για αποθήκευση δεδομένων. ↩
Ο σαφής καθορισμός μιας διαδικασίας, σαν ένα σύνολο από εντολές (το πρόγραμμα), που περιγράφει λεπτομερώς τα βήματα που πρέπει να γίνουν για να επιλυθεί ένα πρόβλημα υπολογισμού. ↩
Λεξιλογική: μία λέξη με πολλές σημασίες («I saw her duck.»). Συντακτική: μια πρόταση που διαβάζεται με πολλούς τρόπους («The chicken is ready to eat.»). ↩
Επειδή η φυσική γλώσσα έχει αμφισημίες και ο υπολογιστής δεν μπορεί να μαντέψει ποια ερμηνεία εννοούμε· μια γλώσσα προγραμματισμού δεν επιτρέπει αμφισημία. ↩
Ο Dennis Ritchie, γύρω στο 1970 (μαζί με τον Ken Thompson δημιούργησαν και το UNIX και τη γλώσσα B). ↩
Ζητά από τον προεπεξεργαστή να συμπεριλάβει το αρχείο επικεφαλίδας stdio.h, που δηλώνει τις συναρτήσεις εισόδου/εξόδου όπως η printf. ↩
Από τη main· κάθε πρόγραμμα C έχει ακριβώς μία. ↩
Δεν θα αλλάξει γραμμή μετά το μήνυμα, οπότε ό,τι τυπωθεί μετά (π.χ. το prompt του shell) θα εμφανιστεί στην ίδια γραμμή. ↩
Ο μεταγλωττιστής μετατρέπει τον πηγαίο κώδικα σε αντικειμενικό αρχείο σε γλώσσα μηχανής· ο συνδέτης ενώνει αντικειμενικά αρχεία και βιβλιοθήκες σε εκτελέσιμο. ↩
Όχι. Η αναπροσαρμογή εφαρμόζεται μόνο όταν οι Ασκήσεις ξεπερνούν τις Γραπτές Εξετάσεις κατά περισσότερες από 3 μονάδες· εδώ είναι μικρότερες. ↩
\(\max(5,\ 0.7 \cdot 5 + 0.3 \cdot 9) = \max(5,\ 6.2) = 6.2\). Με 3 στην Πρόοδο: \(\max(5,\ 0.7 \cdot 5 + 0.3 \cdot 3) = \max(5,\ 4.4) = 5\), δηλαδή η Πρόοδος δεν μετράει. ↩
Ο αλγόριθμος είναι η λύση ως πεπερασμένη σειρά αυστηρά καθορισμένων ενεργειών, ανεξάρτητα από γλώσσα· το πρόγραμμα είναι η διατύπωσή του σε μια γλώσσα προγραμματισμού, ώστε να τον εκτελέσει ένας υπολογιστής. ↩