| layout | chapter | |||
|---|---|---|---|---|
| chapter | 0 | |||
| lecture | 0 | |||
| title | Καλημέρα Κόσμε! | |||
| date | 2026-09-28 | |||
| part | A | |||
| slides | https://progintro.github.io/assets/pdf/lec00.pdf | |||
| next | 01-command-line | |||
| topics |
|
|||
| notes |
|
|||
| labs |
|
Στόχοι: μετά από αυτό το κεφάλαιο θα μπορείτε να
- βρίσκετε τα εργαλεία του μαθήματος (site, Piazza, eclass, GitHub) και να ξέρετε πού να απευθύνετε μια ερώτηση·
- περιγράφετε πώς βαθμολογείται το μάθημα και γιατί οι ασκήσεις και το εργαστήριο μετράνε στην πράξη, και τι ισχύει για τη χρήση τεχνητής νοημοσύνης στις εργασίες·
- ορίζετε τι είναι υπολογιστής, προγραμματισμός, πρόγραμμα, αλγόριθμος και γλώσσα προγραμματισμού·
- εξηγείτε γιατί η ανθρώπινη γλώσσα δεν αρκεί για να δώσουμε εντολές σε έναν υπολογιστή (αμφισημία)·
- αναφέρετε λόγους για τους οποίους μαθαίνουμε C·
- διαβάζετε, γραμμή προς γραμμή, το πρόγραμμα Hello World και να το τρέχετε.
Προαπαιτούμενα: κανένα, αυτό είναι το πρώτο κεφάλαιο.
Χρόνος μελέτης: ~1 ώρα
Η πρώτη διάλεξη του μαθήματος «Εισαγωγή στον Προγραμματισμό» (K04) είναι κυρίως εισαγωγική: γνωρίζουμε το Τμήμα, τα διαδικαστικά του μαθήματος (ώρες, βαθμολογία, πρόοδος, εργαστήριο, εργαλεία, κώδικας τιμής) και τον σκοπό του, που είναι να γίνετε junior software developers με προοπτικές. Στη συνέχεια θέτουμε τα θεμέλια: τι είναι ένας υπολογιστής, τι σημαίνει προγραμματισμός, τι είναι ένα πρόγραμμα και πώς διαφέρει από έναν αλγόριθμο. Βλέπουμε γιατί χρειαζόμαστε ειδικές γλώσσες προγραμματισμού (η ανθρώπινη γλώσσα είναι γεμάτη αμφισημίες) και γιατί το μάθημα διδάσκεται σε C, μια γλώσσα δημοφιλή εδώ και δεκαετίες και από τις ταχύτερες και οικονομικότερες σε ενέργεια. Κλείνουμε με το πρώτο μας πρόγραμμα, το κλασικό Hello World.
Η διάλεξη ξεκινά με το ερώτημα «Γιατί να ασχοληθείς με τον προγραμματισμό το 2026;» και δίνει τέσσερις ενδεικτικούς λόγους:
- Ευελιξία, θεματική και γεωγραφική: ο προγραμματισμός χρειάζεται σε κάθε επιστημονικό πεδίο και σε κάθε χώρα.
- Στην αιχμή των εξελίξεων: οι μεγάλες τεχνολογικές αλλαγές των τελευταίων δεκαετιών (προσωπικοί υπολογιστές, γονιδίωμα, διαδίκτυο) είναι σε μεγάλο βαθμό υπολογιστικές, και η πρόοδος επιταχύνεται.
- Πνευματικά απαιτητική δουλειά: κάθε πρόγραμμα είναι ένα μικρό πρόβλημα προς λύση.
- Cool.
Το Τμήμα Πληροφορικής και Τηλεπικοινωνιών του ΕΚΠΑ, σύμφωνα με τις διαφάνειες, βρίσκεται στα 250 καλύτερα πανεπιστήμια του κόσμου στην Επιστήμη Υπολογιστών (Computer Science) και έχει διακρίσεις σε πολλά επιστημονικά πεδία, από πρωτοβουλίες τόσο ερευνητών όσο και φοιτητών. Πάνω απ' όλα, είναι ευκαιρία να συναναστραφείτε ιδιαίτερα ταλαντούχους συμφοιτητές.
Site. Όλο το υλικό (διαφάνειες, ασκήσεις, εργαστήρια) βρίσκεται στο progintro.github.io. Το μάθημα διδάσκεται σε δύο τμήματα (άρτιοι / περιττοί αριθμοί μητρώου), με διδάσκοντες τον Θανάση Αυγερινό και τον Τάκη Σταματόπουλο· η ύλη, το εργαστήριο, οι ασκήσεις και το διαγώνισμα είναι ίδια και για τα δύο.
Ώρες. Οι διαλέξεις γίνονται Δευτέρα και Παρασκευή 9πμ–11πμ, στο Αμφιθέατρο (άρτιοι) και στην Α2 (περιττοί). Ώρες γραφείου:
| Ημέρα | Ώρα | Αυγερινός | Σταματόπουλος |
|---|---|---|---|
| Δευτέρα | 11πμ–12μμ | Α40 | Α48 |
| Παρασκευή | 11πμ–12μμ | Α3 | Α48 |
Βαθμολογία. Ο τελικός βαθμός υπολογίζεται ως εξής:
- πρωτοετείς: 50% Γραπτές Εξετάσεις + 20% Εργαστήριο + 15% Ασκήσεις + 15% Προφορικές·
- όλοι οι υπόλοιποι: 70% Γραπτές Εξετάσεις + 15% Ασκήσεις + 15% Προφορικές.
Οι Γραπτές Εξετάσεις είναι η Τελική Εξέταση και, κατά το σχέδιο του μαθήματος, μια Πρόοδος (7 Δεκεμβρίου), και οι δύο γραπτές με κλειστά βιβλία. Η Πρόοδος μόνο βοηθάει:
Ισχύει και μια αναπροσαρμογή: αν ο βαθμός των Ασκήσεων είναι πάνω από 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 στο Gmail·
- προσωπικό λογαριασμό στο GitHub, με ένα «cool αλλά και επαγγελματικό» ψευδώνυμο·
- τον ακαδημαϊκό σας λογαριασμό, μέσω του webadm.uoa.gr·
- εγγραφή στο Piazza, το φόρουμ επικοινωνίας του μαθήματος·
- εγγραφή σε τμήμα εργαστηρίου στο eclass·
- να συμπληρώσετε τη φόρμα του μαθήματος με τα στοιχεία σας.
Αν θέλετε, μπορείτε να έχετε υπολογιστή μαζί σας στο μάθημα, για να προγραμματίζετε ζωντανά.
Έχω μια ερώτηση, τι κάνω; Η διάλεξη βάζει δύο επιλογές: (Α) στέλνω email στον Αυγερινό ή στον Τάκη, ή (Β) ελέγχω αν έχει ήδη απαντηθεί στο FAQ ή στο Piazza και, μόνο αν δεν έχει απαντηθεί, ποστάρω καινούρια ερώτηση. Ο δρόμος του μαθήματος είναι το (Β), αφού γι' αυτό υπάρχουν το FAQ και το Piazza: η απάντηση ωφελεί όλους και δεν επαναλαμβάνεται.
Εργαλεία φοιτητών. Πέρα από τα εργαλεία του μαθήματος, οι φοιτητές έχουν έναν Discord server της Σχολής και το DIT Coding Club.
Το μάθημα έχει τρεις στόχους:
- εισαγωγή στις βασικές αρχές του προγραμματισμού και στην αλγοριθμική σκέψη·
- εμπειρία στη γραφή κώδικα και στην αποσφαλμάτωση (debugging) στη γλώσσα C·
- εξοικείωση με τα «εργαλεία της δουλειάς» (γραμμή εντολών, editor, μεταγλωττιστής, git).
Με άλλα λόγια, στο τέλος του εξαμήνου θέλουμε να είστε 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. Τη μαθαίνουμε επειδή είναι:
- απαραίτητη στο πρόγραμμα σπουδών: πάνω της χτίζουν πολλά επόμενα μαθήματα·
- δημοφιλής: σύμφωνα με τον δείκτη TIOBE, είναι από τις πιο δημοφιλείς γλώσσες εδώ και δεκαετίες (το γράφημα της διάλεξης δείχνει την C στις πρώτες θέσεις από το 2001 ως το 2025, ενώ πρόσφατα την έχει ξεπεράσει η Python)·
- χρησιμοποιείται παντού και (σχεδόν) για τα πάντα: λειτουργικά συστήματα, ενσωματωμένα συστήματα, μεταγλωττιστές, βάσεις δεδομένων.
Η 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, ο προγραμματιστής θα έπρεπε να γράψει ρητά τι αγοράζει και πόσο, οπότε η αμφισημία δεν θα μπορούσε να υπάρξει.
Η διάλεξη προτείνει πηγές εξάσκησης πέρα από τις ασκήσεις του μαθήματος:
- πρακτικά προβλήματα, σε επαφή με τη βιομηχανία: hackerrank.com, leetcode.com·
- ανταγωνιστικός προγραμματισμός και αλγόριθμοι (ή και μαθηματικά): adventofcode.com, codechef.com, codewars.com, topcoder.com, usaco.org, projecteuler.net·
- μαθήματα: Coursera, edX, Udacity, και πολλά άλλα με μια αναζήτηση.
Πριν από την επόμενη διάλεξη:
- διαβάστε τις σημειώσεις του κ. Σταματόπουλου μέχρι τη σελίδα 19 (βλ. «Διάβασμα»)·
- ολοκληρώστε τις εγγραφές στα εργαλεία του μαθήματος και γραφτείτε σε κάποιο εργαστήριο·
- αν θέλετε, φέρτε υπολογιστή μαζί σας·
- διαβάστε τα άρθρα για τις γλώσσες προγραμματισμού, τις γλωσσικές αμφισημίες και την ιστορία της C.
- Το μάθημα στοχεύει στις βασικές αρχές του προγραμματισμού και στην αλγοριθμική σκέψη, στη γραφή και αποσφαλμάτωση κώδικα σε C και στην εξοικείωση με τα εργαλεία της δουλειάς.
- Όλο το υλικό βρίσκεται στο progintro.github.io, και τα δύο τμήματα έχουν την ίδια ύλη, εργαστήριο, ασκήσεις και διαγώνισμα.
- Για τους πρωτοετείς ο βαθμός είναι 50% Γραπτές Εξετάσεις + 20% Εργαστήριο + 15% Ασκήσεις + 15% Προφορικές· η Πρόοδος μετράει μόνο αν ανεβάζει τον βαθμό, και ο βαθμός των Ασκήσεων δεν μπορεί να ξεπεράσει τις Γραπτές Εξετάσεις κατά περισσότερες από 3 μονάδες.
- Θεωρητικά μπορείτε να περάσετε χωρίς εργασίες και εργαστήριο, στην πράξη όχι: ο προγραμματισμός μαθαίνεται μόνο γράφοντας κώδικα. Τις εργασίες τις λύνετε μόνοι σας, χωρίς τεχνητή νοημοσύνη (κώδικας τιμής).
- Για ερωτήσεις ψάχνετε πρώτα στο FAQ και στο Piazza και ποστάρετε καινούρια ερώτηση μόνο αν δεν έχει ήδη απαντηθεί.
- Υπολογιστής είναι μια κατασκευή που επεξεργάζεται δεδομένα και παράγει αποτελέσματα· τον χρησιμοποιούμε για την ταχύτητα και τη μνήμη του.
- Προγραμματισμός είναι ο σαφής καθορισμός μιας διαδικασίας, ως σύνολο εντολών, που λύνει ένα πρόβλημα υπολογισμού· πρόγραμμα είναι η καταγραφή αυτής της λύσης, ενώ αλγόριθμος είναι η ίδια η λύση, ως πεπερασμένη σειρά αυστηρά καθορισμένων ενεργειών.
- Η ανθρώπινη γλώσσα έχει λεξιλογικές και συντακτικές αμφισημίες· μια καλή γλώσσα προγραμματισμού δεν επιτρέπει καμία.
- Μαθαίνουμε C γιατί είναι απαραίτητη στο πρόγραμμα σπουδών, δημοφιλής και χρησιμοποιείται παντού, και είναι από τις πιο γρήγορες και ενεργειακά αποδοτικές γλώσσες.
- Ο μεταγλωττιστής και ο συνδέτης μετατρέπουν τον πηγαίο κώδικα C σε εκτελέσιμο πρόγραμμα.
- Κάθε πρόγραμμα 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 |
- Διαφάνειες: Διάλεξη 0 (2026-27), σελ. 1–41. Γιατί προγραμματισμός: σελ. 3–6· διαδικαστικά, τεχνητή νοημοσύνη και εργαλεία: σελ. 7–19· σκοπός και περιεχόμενο: σελ. 20–22· υπολογιστής, προγραμματισμός και αλγόριθμος: σελ. 23–28· αμφισημία και γλώσσες: σελ. 29–32· η C: σελ. 33–36· Hello World: σελ. 37· εξάσκηση και επόμενη φορά: σελ. 38, 40. Οι διαφάνειες του 2025-26: Διάλεξη 0 (2025).
- Σημειώσεις: Οι διαφάνειες ζητούν τις σημειώσεις του κ. Σταματόπουλου μέχρι τη σελίδα 19 (K04):
- Κεφάλαιο 0: Εισαγωγή, ολόκληρο, ιδίως «Γενικά περί υπολογιστών», «Γενικά περί προγραμματισμού υπολογιστών», «Πώς να μάθουμε να προγραμματίζουμε;», «Η δομή του υπολογιστή», «Λογισμικό και γλώσσες προγραμματισμού», «Πώς κατασκευάζουμε εκτελέσιμο πρόγραμμα;» (K04, σελ. 1–17)
- Κεφάλαιο 1: Πρώτα προγράμματα σε C, ενότητα «Η γλώσσα προγραμματισμού C» (K04, σελ. 18), και για το Hello World η «Καλημέρα κόσμε της C» (K04, σελ. 19)
- Εργαστήριο: Εργαστήριο 0: Βήματα 1–2 (webmail, Piazza) για τα εργαλεία του μαθήματος, Βήμα 7
hello.c, Άσκηση 1about.c - Άλλα:
- Site του μαθήματος: progintro.github.io· κώδικας τιμής· FAQ· Piazza· eclass και εγγραφή σε εργαστηριακή ομάδα· webadm
- Online compilers: Sea, Programiz
- Φοιτητές: Discord της Σχολής· DIT Coding Club
- Al-Khwarizmi (Wikipedia)
- TIOBE index· Programming Language Shootout (Benchmarks Game)
- Wikipedia: Programming language, List of linguistic example sentences (γλωσσικές αμφισημίες)
- History of C and Applications
- Εξάσκηση: HackerRank, LeetCode, Advent of Code, CodeChef, Codewars, Topcoder, USACO, Project Euler
- Email αντί για Piazza. Ερωτήσεις για την ύλη ή τις ασκήσεις πάνε στο Piazza, αφού πρώτα ψάξετε αν έχουν ήδη απαντηθεί.
- «Θα παραλείψω τις ασκήσεις». Χάνετε το 15% του βαθμού και, κυρίως, την εξάσκηση που χρειάζονται οι Γραπτές και οι Προφορικές Εξετάσεις.
- «Θα λύσω τις ασκήσεις με ChatGPT». Παραβιάζει τον κώδικα τιμής, και στις Προφορικές θα σας ζητηθεί να γράψετε κώδικα ζωντανά, χωρίς βοήθεια.
- Ξεχασμένο
;.printf("Hello world\n")χωρίς;δεν μεταγλωττίζεται (expected ';'). Διόρθωση: κάθε εντολή τελειώνει με;. - Χωρίς
#include <stdio.h>. Ο μεταγλωττιστής δεν ξέρει τηνprintfκαι προειδοποιεί (ή σταματά) με μήνυμα γιαimplicit declaration of function 'printf'. - Ξεχασμένο
\n. Χωρίς αλλαγή γραμμής, η επόμενη έξοδος (ή το prompt του shell) κολλάει στο τέλος του μηνύματος:Hello world$. - Λάθος εισαγωγικά. Οι συμβολοσειρές θέλουν διπλά εισαγωγικά
"..."· με μονά'Hello'ή «έξυπνα» εισαγωγικά από κειμενογράφο εγγράφων ο κώδικας δεν μεταγλωττίζεται. - Κεφαλαία στα ονόματα. Η C ξεχωρίζει κεφαλαία και πεζά:
MainήPrintfδεν είναι το ίδιο μεmainκαιprintf.
Από τα Kahoot των διαλέξεων: οι ερωτήσεις όπου μια λάθος απάντηση μάζεψε πολλές ψήφους, με το ποσοστό σωστών απαντήσεων.
- Κ0.6 Έχω μια ερώτηση για το μάθημα (57% σωστές): Το 23% θα πόσταρε κατευθείαν στο Piazza με τίτλο «Ερώτηση»: το Piazza είναι το σωστό κανάλι, αλλά πρώτα ψάχνουμε αν έχει ήδη απαντηθεί, και ο τίτλος πρέπει να λέει τι ρωτάμε.
- Κ0.5 Το χαρακτηριστικό της C (61% σωστές): Το 27% διάλεξε «Γρήγορη/Αποδοτική»: η ταχύτητα είναι πράγματι ένα από τα πλεονεκτήματα της C, αλλά όχι το μόνο που τονίστηκε.
- Ε0.1 Ποιοι είναι οι δύο βασικοί λόγοι για τους οποίους χρησιμοποιούμε υπολογιστές;1
- Ε0.2 Δώστε τον ορισμό του προγραμματισμού που δίνει η διάλεξη.2
- Ε0.3 Τι διαφέρει η λεξιλογική από τη συντακτική αμφισημία; Δώστε ένα παράδειγμα από την καθεμία.3
- Ε0.4 Γιατί δεν μπορούμε να προγραμματίσουμε έναν υπολογιστή σε φυσική γλώσσα;4
- Ε0.5 Ποιος δημιούργησε τη C και περίπου πότε;5
- Ε0.6 Τι κάνει η γραμμή
#include <stdio.h>στο Hello World;6 - Ε0.7 Από ποια συνάρτηση ξεκινά η εκτέλεση ενός προγράμματος C, και πόσες τέτοιες συναρτήσεις έχει ένα πρόγραμμα;7
- Ε0.8 Τι θα αλλάξει στην έξοδο αν σβήσετε το
\nαπό τοprintf("Hello world\n");;8 - Ε0.9 Ποια είναι η δουλειά του μεταγλωττιστή και ποια του συνδέτη;9
- Ε0.10 Ένας πρωτοετής έχει 4 στις Ασκήσεις (με άριστα το 10) και 9 στις Γραπτές Εξετάσεις. Ισχύει η αναπροσαρμογή;10
- Ε0.11 Κάποιος γράφει 9 στην Πρόοδο και 5 στην Τελική Εξέταση. Ποιος είναι ο βαθμός του στις Γραπτές Εξετάσεις; Και αν είχε γράψει 3 στην Πρόοδο;11
- Ε0.12 Ποια η διαφορά ανάμεσα σε αλγόριθμο και πρόγραμμα;12
Ερωτήσεις που παίχτηκαν στις διαλέξεις, με το ποσοστό των φοιτητών που απάντησαν σωστά.
- Κ0.1 Τι κάνει η printf: 94% σωστές απαντήσεις
- Κ0.2 Εκτύπωση με νέα γραμμή: 86% σωστές απαντήσεις
- Κ0.3 Η φόρμα του μαθήματος: 85% σωστές απαντήσεις
- Κ0.4 Τα εργαλεία του μαθήματος: 82% σωστές απαντήσεις
- Κ0.5 Το χαρακτηριστικό της C: 61% σωστές απαντήσεις
- Κ0.6 Έχω μια ερώτηση για το μάθημα: 57% σωστές απαντήσεις
- Α0.1 Τεχνητή νοημοσύνη στις εργασίες;: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 12 · ★☆☆ · short-answer ·
slides-lec00-ai-homework - Α0.2 Έχω μια ερώτηση, τι κάνω;: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 17 · ★☆☆ · multiple-choice ·
slides-lec00-ask-question - Α0.3 Ψωμί και αυγά: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 31 · ★☆☆ · short-answer ·
slides-lec00-bread-and-eggs - Α0.4 Hello World σε online compiler: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 37 · ★☆☆ · tooling ·
slides-lec00-hello-world - Α0.5 Το πιο ψηλό βουνό του κόσμου: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 29 · ★☆☆ · short-answer ·
slides-lec00-highest-mountain - Α0.6 Περνάω χωρίς εργασίες και εργαστήριο;: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 11 · ★☆☆ · short-answer ·
slides-lec00-pass-without-labs - Α0.7 Πρόγραμμα και αλγόριθμος: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 25 · ★☆☆ · short-answer ·
slides-lec00-program-vs-algorithm - Α0.8 Παραδείγματα προγραμμάτων: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 27 · ★☆☆ · short-answer ·
slides-lec00-programs-you-know - Α0.9 Γιατί προγραμματισμός το 2026;: Διάλεξη 0: Καλημέρα Κόσμε!, διαφάνεια 5 · ★☆☆ · short-answer ·
slides-lec00-why-programming
- Α1.7 Μεταγλώττιση, σύνδεση και εκτέλεση: Εργαστήριο 1, Βήμα 2 · ★☆☆ · tooling ·
lab-lab01-step2-compile-link - Α2.9 Στοιχεία φοιτητή (Παλιό θέμα): Εργαστήριο 0, Άσκηση 1 · ★☆☆ · programming ·
lab-lab00-about - Α26.1 Τα στάδια του C build process: How to Make? (προσκεκλημένη διάλεξη), διαφάνεια 5 · ★☆☆ · short-answer ·
slides-lecmake-build-pipeline
Footnotes
-
Την ταχύτητα στην επεξεργασία δεδομένων και τη μνήμη που διαθέτουν για αποθήκευση δεδομένων. ↩
-
Ο σαφής καθορισμός μιας διαδικασίας, σαν ένα σύνολο από εντολές (το πρόγραμμα), που περιγράφει λεπτομερώς τα βήματα που πρέπει να γίνουν για να επιλυθεί ένα πρόβλημα υπολογισμού. ↩
-
Λεξιλογική: μία λέξη με πολλές σημασίες («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$, δηλαδή η Πρόοδος δεν μετράει. ↩
-
Ο αλγόριθμος είναι η λύση ως πεπερασμένη σειρά αυστηρά καθορισμένων ενεργειών, ανεξάρτητα από γλώσσα· το πρόγραμμα είναι η διατύπωσή του σε μια γλώσσα προγραμματισμού, ώστε να τον εκτελέσει ένας υπολογιστής. ↩