📚 Περιεχόμενα Κεφαλαίου
3.1 Η Εντολή scanf()
💡 Τι κάνει η scanf();
Η εντολή scanf() χρησιμοποιείται για να διαβάζουμε δεδομένα από το πληκτρολόγιο (stdin - standard input stream).
Αντί να αναθέτουμε σταθερές τιμές στις μεταβλητές, μπορούμε να ζητάμε από τον χρήστη να δώσει τιμές!
Σύνταξη της scanf()
🔑 Βασικά Στοιχεία
- Format String: Περιέχει προσδιοριστικά μετατροπής (%d, %f, %c, %s)
- Τελεστής &: Δηλώνει τη διεύθυνση μνήμης της μεταβλητής
- Προσδιοριστικά:
- %d για int
- %f για float
- %lf για double
- %c για char
- %s για string
Παραδείγματα scanf()
📘 Παράδειγμα 1 - Διάβασμα Αριθμών
💬 Εισαγωγή: 35 23.12 18
💬 Έξοδος: 18 35 23.12
📗 Παράδειγμα 2 - Διάβασμα Χαρακτήρα
⚠️ Προσοχή με τα Strings!
Η scanf() σταματάει να διαβάζει όταν βρει κενό χαρακτήρα (space)!
- Για string ΧΩΡΙΣ κενά: scanf("%s", &str);
- Για string ΜΕ κενά: scanf("%[^\n]", str);
Τι Επιστρέφει η scanf();
Η scanf() επιστρέφει έναν ακέραιο αριθμό που δηλώνει πόσα δεδομένα διαβάστηκαν επιτυχώς.
Καθαρισμός Buffer (stdin)
🚨 Το Πρόβλημα: Το Enter Μένει στη Μνήμη (Buffer)
Όταν γράφεις κάτι στο πληκτρολόγιο και πατάς Enter, η C τοποθετεί όλους τους χαρακτήρες (μαζί με το '\n' στο τέλος) μέσα σε έναν ενδιάμεσο χώρο μνήμης, που λέγεται input buffer.
🔍 Παράδειγμα χωρίς καθάρισμα buffer
🧠 Τι συμβαίνει στη μνήμη:
- Γράφεις 25 και πατάς Enter - Το buffer τώρα έχει:
['2', '5', '\n']
- Η scanf("%d", &age) διαβάζει μόνο τους αριθμούς ('2' και '5') και αφήνει το '\n' στο buffer.
- Η επόμενη scanf("%c", &gender) πάει να διαβάσει χαρακτήρα. Βρίσκει το '\n' από πριν και το παίρνει για χαρακτήρα!
👉 Άρα ο χρήστης δεν προλαβαίνει να δώσει φύλο, και φαίνεται σαν να "παραλείπεται" η είσοδος.
✅ Η Λύση: Καθάρισε το buffer με getchar()
🔧 Διορθωμένο πρόγραμμα:
💡 Τι κάνει ο βρόχος:
Διαβάζει όλους τους χαρακτήρες που έχουν μείνει στο buffer μέχρι να βρει το Enter ('\n') ή το τέλος του αρχείου (EOF). Έτσι καθαρίζεται πλήρως το buffer, και η επόμενη scanf ξεκινά "καθαρή".
📘 Μικρό πείραμα για να το δεις
Αν βάλεις μέσα:
Και μετά κάνεις:
Θα δεις ότι ο χαρακτήρας είναι:
Ο αριθμός 10 είναι ο ASCII κώδικας για το '\n' (Enter)!
🧩 Περίληψη
| Πρόβλημα | Αιτία | Λύση |
|---|---|---|
| Η scanf("%c") "πηδάει" την είσοδο | Το '\n' μένει στο buffer | Χρησιμοποίησε while(getchar() != '\n'); |
| Η scanf() διαβάζει σκουπίδια | Παλιό input στο buffer | Καθάρισε με getchar() πριν την επόμενη είσοδο |
3.2 Τελεστές στη C
💡 Τι είναι οι Τελεστές;
Οι τελεστές (operators) είναι σύμβολα που χρησιμοποιούμε για να εκτελέσουμε πράξεις σε μεταβλητές και τιμές.
3.2.1 Τελεστής Εκχώρησης (=)
🔑 Ο Τελεστής =
Ο τελεστής = χρησιμοποιείται για την απόδοση τιμής σε μεταβλητές.
ΠΡΟΣΟΧΗ: Η εκχώρηση γίνεται ΠΑΝΤΑ από δεξιά προς αριστερά!
📘 Παραδείγματα Εκχώρησης
❌ ΛΑΘΟΣ Χρήση του =
Lvalue και Rvalue
- Rvalue (δεξιός τελεστέος): Πρέπει να έχει τιμή (μεταβλητή με τιμή ή σταθερά)
- Lvalue (αριστερός τελεστέος): Πρέπει να είναι μεταβλητή (όχι σταθερά!)
Αυτόματες Μετατροπές Τύπων
📘 Παράδειγμα Μετατροπών
💬 Έξοδος: 120 120 120.00 x
- Ακέραιος → Πραγματικός: Μετατροπή κανονική
- Πραγματικός → Ακέραιος: Κόβεται το δεκαδικό μέρος
- Ακέραιος → Char: Μετατροπή σε ASCII χαρακτήρα
3.2.2 Αριθμητικοί Τελεστές
🔢 Βασικοί Αριθμητικοί Τελεστές
- + Πρόσθεση
- - Αφαίρεση
- * Πολλαπλασιασμός
- / Διαίρεση
- % Υπόλοιπο (modulo)
Διαίρεση: Ακέραια vs Πραγματική
📘 Ακέραια Διαίρεση
📗 Πραγματική Διαίρεση
Τελεστής Modulo (%)
📘 Υπόλοιπο Διαίρεσης
ΠΡΟΣΟΧΗ: Το % λειτουργεί ΜΟΝΟ με ακεραίους!
⚠️ Έλεγχος Ζυγού/Μονού
Για έλεγχο αν αριθμός είναι περιττός:
3.2.3 Μοναδιαίοι Τελεστές (+ και -)
📘 Μοναδιαίοι Τελεστές
3.2.4 Τελεστές Αύξησης/Μείωσης (++ και --)
🔼 Τελεστής ++ (Αύξηση κατά 1)
- Προθεματικός: ++a → Πρώτα αυξάνει, μετά χρησιμοποιεί
- Επιθεματικός: a++ → Πρώτα χρησιμοποιεί, μετά αυξάνει
📘 Παράδειγμα ++
🔽 Τελεστής -- (Μείωση κατά 1)
Λειτουργεί όπως το ++, αλλά μειώνει!
3.2.5 Τελεστές Σύγκρισης
⚖️ Τελεστές Σύγκρισης
- == Ίσον
- != Διάφορο
- > Μεγαλύτερο
- < Μικρότερο
- >= Μεγαλύτερο ή ίσο
- <= Μικρότερο ή ίσο
💡 Αποτελέσματα Συγκρίσεων
Στη C, οι συγκρίσεις επιστρέφουν:
- 1 αν η συνθήκη είναι αληθής
- 0 αν η συνθήκη είναι ψευδής
📘 Παράδειγμα
🚨 ΜΗΝ Μπερδεύετε = με ==
- = → Εκχώρηση τιμής
- == → Έλεγχος ισότητας
3.2.6 Λογικοί Τελεστές
🔗 Λογικοί Τελεστές
- && Λογικό ΚΑΙ (AND)
- || Λογικό Ή (OR)
- ! Λογική Άρνηση (NOT)
Τελεστής && (AND)
Επιστρέφει αληθές (1) μόνο όταν ΟΛΕΣ οι συνθήκες είναι αληθείς.
Τελεστής || (OR)
Επιστρέφει αληθές (1) όταν ΤΟΥΛΑΧΙΣΤΟΝ ΜΙΑ συνθήκη είναι αληθής.
Τελεστής ! (NOT)
📘 Λογική Άρνηση
Χρήσιμο για συντομογραφίες:
📘 Παράδειγμα - Πλήρης Χρήση του ! (NOT)
💬 Έξοδος:
3.2.7 Συνδυαστικοί Τελεστές
⚡ Συνδυαστικοί Τελεστές
Συντομεύουν εκφράσεις της μορφής: a = a op b
| Συντομογραφία | Ισοδύναμο |
|---|---|
| a += b | a = a + b |
| a -= b | a = a - b |
| a *= b | a = a * b |
| a /= b | a = a / b |
| a %= b | a = a % b |
3.2.8 Τελεστής Κόμμα (,)
📘 Τελεστής Κόμμα
Εκτελεί πολλές εκφράσεις από αριστερά προς δεξιά.
3.2.9 Τελεστής sizeof()
💡 Τελεστής sizeof()
Επιστρέφει το μέγεθος σε bytes ενός τύπου δεδομένων ή μεταβλητής.
📘 Παράδειγμα sizeof()
💬 Έξοδος:
3.2.10 Προτεραιότητα Τελεστών
⚠️ Σειρά Εκτέλεσης
Όταν υπάρχουν πολλοί τελεστές, η σειρά εκτέλεσης είναι:
- Παρενθέσεις ( )
- Αριθμητικοί τελεστές (*, /, % πριν από +, -)
- Συγκριτικοί τελεστές (<, >, ==, !=)
- Λογικοί τελεστές (&&, ||)
| Προτεραιότητα | Τελεστές | Συσχέτιση |
|---|---|---|
| 1 (Υψηλότερη) | () [] ++ -- | Αριστερά → Δεξιά |
| 2 | ! ++ -- + - (μοναδιαίοι) sizeof | Δεξιά → Αριστερά |
| 3 | * / % | Αριστερά → Δεξιά |
| 4 | + - | Αριστερά → Δεξιά |
| 5 | < <= > >= | Αριστερά → Δεξιά |
| 6 | == != | Αριστερά → Δεξιά |
| 7 | && | Αριστερά → Δεξιά |
| 8 | || | Αριστερά → Δεξιά |
| 9 | = += -= *= /= %= | Δεξιά → Αριστερά |
| 10 (Χαμηλότερη) | , | Αριστερά → Δεξιά |
✅ Χρυσός Κανόνας
ΧΡΗΣΙΜΟΠΟΙΕΙΤΕ ΠΑΡΕΝΘΕΣΕΙΣ! Κάνουν τον κώδικα πιο ευανάγνωστο και αποφεύγουν λάθη!
3.3 Εισαγωγή στις Δομές Ελέγχου
💡 Τι είναι οι Δομές Ελέγχου;
Οι δομές ελέγχου (control structures) μάς επιτρέπουν να αλλάξουμε τη σειρά εκτέλεσης των εντολών στο πρόγραμμά μας, ανάλογα με συνθήκες που θέτουμε.
Χωρίς δομές ελέγχου, το πρόγραμμα θα εκτελούσε όλες τις εντολές μία προς μία, από πάνω προς τα κάτω. Με δομές ελέγχου, μπορούμε να κάνουμε το πρόγραμμα να παίρνει αποφάσεις!
Τύποι Δομών Ελέγχου
🔀 Οι 3 Βασικές Δομές
- Ακολουθιακή Δομή (Sequence)
Οι εντολές εκτελούνται μία μετά την άλλη, με τη σειρά που γράφονται - Δομή Επιλογής (Selection)
Το πρόγραμμα επιλέγει ποιες εντολές θα εκτελέσει βάσει μιας συνθήκης
➜ if, if-else, switch - Δομή Επανάληψης (Iteration)
Το πρόγραμμα επαναλαμβάνει εντολές πολλές φορές
➜ for, while, do-while (θα τις δούμε σε επόμενο μάθημα)
Πώς Λειτουργούν οι Συνθήκες;
Οι συνθήκες είναι λογικές εκφράσεις που αποτιμώνται σε true (αληθές) ή false (ψευδές).
📊 Αποτίμηση Συνθηκών στη C
Στη C, οι συνθήκες αποτιμώνται ως αριθμοί:
- 0 = false (ψευδές)
- Οποιοσδήποτε άλλος αριθμός (συνήθως 1) = true (αληθές)
3.4 Η Εντολή if
🎯 Η Απλή Εντολή if
Η εντολή if εκτελεί ένα κομμάτι κώδικα μόνο αν μια συνθήκη είναι αληθής.
Σύνταξη
Παραδείγματα
📘 Παράδειγμα 1 - Απλός Έλεγχος Ηλικίας
💬 Έξοδος:
📗 Παράδειγμα 2 - Έλεγχος Θετικού Αριθμού
⚠️ Προσοχή στα Άγκιστρα { }
- Αν η if έχει μόνο μία εντολή, τα άγκιστρα είναι προαιρετικά (αλλά συνιστάται να τα βάζετε πάντα!)
- Αν έχει περισσότερες από μία εντολές, τα άγκιστρα είναι υποχρεωτικά
3.5 Η Εντολή if-else
🎯 Η Εντολή if-else
Με το if-else μπορούμε να ορίσουμε δύο εναλλακτικές πορείες: μία αν η συνθήκη είναι αληθής και μία αν είναι ψευδής.
Σύνταξη
📘 Παράδειγμα - Έλεγχος Ζυγού/Μονού
3.6 Η Εντολή else-if
🎯 Η Εντολή else-if
Όταν έχουμε περισσότερες από δύο επιλογές, χρησιμοποιούμε το else if.
📘 Παράδειγμα - Βαθμολόγηση
3.7 Εμφωλευμένες Δομές if
🎯 Εμφωλευμένα if (Nested if)
Μπορούμε να βάλουμε μία δομή if μέσα σε άλλη δομή if.
📘 Παράδειγμα - Έλεγχος Εύρους
3.8 Ο Τελεστής Τριών Όρων (?:)
🎯 Ο Τριαδικός Τελεστής
Είναι μία συντομογραφία για απλές δομές if-else.
📘 Παράδειγμα - Εύρεση Μεγίστου
3.9 Η Εντολή switch-case
🎯 Η Εντολή switch
Η switch χρησιμοποιείται όταν θέλουμε να ελέγξουμε μια μεταβλητή για πολλές διαφορετικές τιμές.
📘 Παράδειγμα - Μενού Επιλογών
🚨 ΠΡΟΣΟΧΗ: Το break είναι ΚΡΙΣΙΜΟ!
Αν ξεχάσετε το break, η εκτέλεση θα συνεχίσει στο επόμενο case!
3.10 Σύγκριση if vs switch
| Χαρακτηριστικό | if-else | switch-case |
|---|---|---|
| Χρήση | Για οποιεσδήποτε συνθήκες | Για συγκεκριμένες σταθερές τιμές |
| Ευαναγνωσία | Καλή για λίγες επιλογές | Πολύ καλή για πολλές επιλογές |
| Ταχύτητα | Πιο αργή για πολλές επιλογές | Γρηγορότερη για πολλές επιλογές |
| Ευελιξία | Πολύ ευέλικτη | Περιορισμένη σε σταθερές |
❌ Συνηθισμένα Λάθη
- Ξεχασμένο break στο switch - Προκαλεί fall-through
- Χρήση = αντί για == - Το = είναι ανάθεση, το == είναι σύγκριση!
- Ξεχασμένα άγκιστρα - Για πολλές εντολές είναι απαραίτητα
- Λάθος λογική σε εμφωλευμένα if - Προσοχή στην εσοχή!
✅ Καλές Πρακτικές
- Πάντα βάζετε άγκιστρα, ακόμα και για μία εντολή
- Χρησιμοποιείτε σωστή εσοχή (indentation)
- Προτιμήστε switch για πολλές σταθερές τιμές
- Προτιμήστε if-else για πολύπλοκες συνθήκες
- Μην ξεχνάτε το break στο switch!
🎓 Τέλος Κεφαλαίου 3
Τώρα ξέρεις πώς να ελέγχεις τη ροή του προγράμματός σου!
Επόμενο Κεφάλαιο: Βρόχοι (Loops) - for, while, do-while