🔀 Κεφάλαιο 3: Δομές Ελέγχου Ροής

if, else, switch - Ελέγχουμε τη ροή του προγράμματος!

3.1 Η Εντολή scanf()

💡 Τι κάνει η scanf();

Η εντολή scanf() χρησιμοποιείται για να διαβάζουμε δεδομένα από το πληκτρολόγιο (stdin - standard input stream).

Αντί να αναθέτουμε σταθερές τιμές στις μεταβλητές, μπορούμε να ζητάμε από τον χρήστη να δώσει τιμές!

Σύνταξη της scanf()

scanf("format_string", &μεταβλητή1, &μεταβλητή2, ...);

🔑 Βασικά Στοιχεία

  • Format String: Περιέχει προσδιοριστικά μετατροπής (%d, %f, %c, %s)
  • Τελεστής &: Δηλώνει τη διεύθυνση μνήμης της μεταβλητής
  • Προσδιοριστικά:
    • %d για int
    • %f για float
    • %lf για double
    • %c για char
    • %s για string

Παραδείγματα scanf()

📘 Παράδειγμα 1 - Διάβασμα Αριθμών

#include <stdio.h> int main() { int a, b; float s; printf("Δώσε 3 αριθμούς: "); scanf("%d %f %d", &a, &s, &b); printf("%d %d %.2f\n", b, a, s); return 0; }

💬 Εισαγωγή: 35 23.12 18

💬 Έξοδος: 18 35 23.12

📗 Παράδειγμα 2 - Διάβασμα Χαρακτήρα

#include <stdio.h> int main() { char x; // Διάβασμα χαρακτήρα scanf("%c", &x); printf("%c \n", x); return 0; }

⚠️ Προσοχή με τα Strings!

Η scanf() σταματάει να διαβάζει όταν βρει κενό χαρακτήρα (space)!

  • Για string ΧΩΡΙΣ κενά: scanf("%s", &str);
  • Για string ΜΕ κενά: scanf("%[^\n]", str);
// String με κενά char str[100]; scanf("%[^\n]", str); // Διαβάζει μέχρι το Enter

Τι Επιστρέφει η scanf();

Η scanf() επιστρέφει έναν ακέραιο αριθμό που δηλώνει πόσα δεδομένα διαβάστηκαν επιτυχώς.

int a; int result = scanf("%d", &a); // Επιστρέφει 1 int a, b; result = scanf("%d %d", &a, &b); // Επιστρέφει 2

Καθαρισμός Buffer (stdin)

🚨 Το Πρόβλημα: Το Enter Μένει στη Μνήμη (Buffer)

Όταν γράφεις κάτι στο πληκτρολόγιο και πατάς Enter, η C τοποθετεί όλους τους χαρακτήρες (μαζί με το '\n' στο τέλος) μέσα σε έναν ενδιάμεσο χώρο μνήμης, που λέγεται input buffer.

🔍 Παράδειγμα χωρίς καθάρισμα buffer

#include <stdio.h> int main() { int age; char gender; printf("Δώσε ηλικία: "); scanf("%d", &age); // Π.χ. γράφεις: 25 <Enter> printf("Δώσε φύλο (M/F): "); scanf("%c", &gender); // Προσπαθεί να διαβάσει χαρακτήρα printf("Ηλικία: %d, Φύλο: %c\n", age, gender); return 0; }

🧠 Τι συμβαίνει στη μνήμη:

  1. Γράφεις 25 και πατάς Enter - Το buffer τώρα έχει:
    ['2', '5', '\n']
  2. Η scanf("%d", &age) διαβάζει μόνο τους αριθμούς ('2' και '5') και αφήνει το '\n' στο buffer.
  3. Η επόμενη scanf("%c", &gender) πάει να διαβάσει χαρακτήρα. Βρίσκει το '\n' από πριν και το παίρνει για χαρακτήρα!
    👉 Άρα ο χρήστης δεν προλαβαίνει να δώσει φύλο, και φαίνεται σαν να "παραλείπεται" η είσοδος.

✅ Η Λύση: Καθάρισε το buffer με getchar()

🔧 Διορθωμένο πρόγραμμα:

#include <stdio.h> int main() { int age; char gender; int ch; // μεταβλητή για προσωρινή αποθήκευση χαρακτήρων από το buffer printf("Δώσε ηλικία: "); scanf("%d", &age); /* * Η παρακάτω while χρησιμοποιείται για να "καθαρίσει" τον buffer εισόδου. * Μετά τη scanf("%d", &age), όταν ο χρήστης πατήσει Enter, * ο χαρακτήρας αλλαγής γραμμής ('\n') παραμένει μέσα στο buffer του stdin. * Αν δεν τον αφαιρέσουμε, η επόμενη scanf("%c", &gender) θα διαβάσει αυτόν * τον '\n' αντί για τον πραγματικό χαρακτήρα του φύλου. * * Η getchar() διαβάζει έναν-έναν τους χαρακτήρες από το standard input (stdin). * Εδώ τη χρησιμοποιούμε μέσα σε while ώστε να "τραβάει" και να αγνοεί όλους * τους χαρακτήρες μέχρι να βρει '\n' (δηλαδή το Enter) ή το EOF (τέλος αρχείου). */ while ((ch = getchar()) != '\n' && ch != EOF); printf("Δώσε φύλο (M/F): "); scanf("%c", &gender); printf("Ηλικία: %d, Φύλο: %c\n", age, gender); return 0; }

💡 Τι κάνει ο βρόχος:

while ((ch = getchar()) != '\n' && ch != EOF);

Διαβάζει όλους τους χαρακτήρες που έχουν μείνει στο buffer μέχρι να βρει το Enter ('\n') ή το τέλος του αρχείου (EOF). Έτσι καθαρίζεται πλήρως το buffer, και η επόμενη scanf ξεκινά "καθαρή".

📘 Μικρό πείραμα για να το δεις

Αν βάλεις μέσα:

printf("Δώσε ηλικία: "); scanf("%d", &age); printf("-> Μετά το scanf, μένει το Enter στο buffer!\n");

Και μετά κάνεις:

int c = getchar(); printf("Πρώτος χαρακτήρας που έμεινε: '%c' (κωδικός %d)\n", c, c);

Θα δεις ότι ο χαρακτήρας είναι:

Πρώτος χαρακτήρας που έμεινε: ' ' (κωδικός 10)

Ο αριθμός 10 είναι ο ASCII κώδικας για το '\n' (Enter)!

🧩 Περίληψη

Πρόβλημα Αιτία Λύση
Η scanf("%c") "πηδάει" την είσοδο Το '\n' μένει στο buffer Χρησιμοποίησε while(getchar() != '\n');
Η scanf() διαβάζει σκουπίδια Παλιό input στο buffer Καθάρισε με getchar() πριν την επόμενη είσοδο

3.2 Τελεστές στη C

💡 Τι είναι οι Τελεστές;

Οι τελεστές (operators) είναι σύμβολα που χρησιμοποιούμε για να εκτελέσουμε πράξεις σε μεταβλητές και τιμές.

3.2.1 Τελεστής Εκχώρησης (=)

🔑 Ο Τελεστής =

Ο τελεστής = χρησιμοποιείται για την απόδοση τιμής σε μεταβλητές.

ΠΡΟΣΟΧΗ: Η εκχώρηση γίνεται ΠΑΝΤΑ από δεξιά προς αριστερά!

📘 Παραδείγματα Εκχώρησης

int a, b, c; b = 10; // Η b παίρνει την τιμή 10 a = b = c = 10; // Όλες παίρνουν τιμή 10 y = t; // Η y παίρνει την τιμή της t

❌ ΛΑΘΟΣ Χρήση του =

int a, b, c; a = b = 10 = c; // ΛΑΘΟΣ! Το 10 είναι σταθερά! 10 = a; // ΛΑΘΟΣ! Δεν μπορούμε να αλλάξουμε σταθερά!

Lvalue και Rvalue

  • Rvalue (δεξιός τελεστέος): Πρέπει να έχει τιμή (μεταβλητή με τιμή ή σταθερά)
  • Lvalue (αριστερός τελεστέος): Πρέπει να είναι μεταβλητή (όχι σταθερά!)

Αυτόματες Μετατροπές Τύπων

📘 Παράδειγμα Μετατροπών

int a, b; float c; char ch; a = b = c = ch = 120; printf("%d %d %.2f %c", a, b, c, ch);

💬 Έξοδος: 120 120 120.00 x

  • Ακέραιος → Πραγματικός: Μετατροπή κανονική
  • Πραγματικός → Ακέραιος: Κόβεται το δεκαδικό μέρος
  • Ακέραιος → Char: Μετατροπή σε ASCII χαρακτήρα

3.2.2 Αριθμητικοί Τελεστές

🔢 Βασικοί Αριθμητικοί Τελεστές

  • + Πρόσθεση
  • - Αφαίρεση
  • * Πολλαπλασιασμός
  • / Διαίρεση
  • % Υπόλοιπο (modulo)

Διαίρεση: Ακέραια vs Πραγματική

📘 Ακέραια Διαίρεση

int a = 3, b = 2; printf("%d", a/b); // Έξοδος: 1 (όχι 1.5!)

📗 Πραγματική Διαίρεση

int a = 3; float b = 2; printf("%.2f", a/b); // Έξοδος: 1.50

Τελεστής Modulo (%)

📘 Υπόλοιπο Διαίρεσης

int a = 3, b = 2; printf("%d", a%b); // Έξοδος: 1

ΠΡΟΣΟΧΗ: Το % λειτουργεί ΜΟΝΟ με ακεραίους!

⚠️ Έλεγχος Ζυγού/Μονού

Για έλεγχο αν αριθμός είναι περιττός:

// ❌ ΛΑΘΟΣ (δεν δουλεύει με αρνητικούς) if((n % 2) == 1) // ✅ ΣΩΣΤΟ if((n % 2) != 0)

3.2.3 Μοναδιαίοι Τελεστές (+ και -)

📘 Μοναδιαίοι Τελεστές

int a = +20; // Ο + δεν αλλάζει τίποτα a = -10; // Το - δίνει το αντίθετο int b = -(a-5); // Πρώτα a-5, μετά αντίστροφο -a; // ΔΕΝ αλλάζει το a (χρειάζεται ανάθεση!)

3.2.4 Τελεστές Αύξησης/Μείωσης (++ και --)

🔼 Τελεστής ++ (Αύξηση κατά 1)

  • Προθεματικός: ++a → Πρώτα αυξάνει, μετά χρησιμοποιεί
  • Επιθεματικός: a++ → Πρώτα χρησιμοποιεί, μετά αυξάνει

📘 Παράδειγμα ++

int a = 3, b; b = a++; // b=3, μετά a=4 printf("a=%d b=%d\n", a, b); // a=4 b=3 b = ++a; // Πρώτα a=5, μετά b=5 printf("a=%d b=%d\n", a, b); // a=5 b=5

🔽 Τελεστής -- (Μείωση κατά 1)

Λειτουργεί όπως το ++, αλλά μειώνει!

int a = 3, b; b = a--; // b=3, μετά a=2 b = --a; // Πρώτα a=1, μετά b=1

3.2.5 Τελεστές Σύγκρισης

⚖️ Τελεστές Σύγκρισης

  • == Ίσον
  • != Διάφορο
  • > Μεγαλύτερο
  • < Μικρότερο
  • >= Μεγαλύτερο ή ίσο
  • <= Μικρότερο ή ίσο

💡 Αποτελέσματα Συγκρίσεων

Στη C, οι συγκρίσεις επιστρέφουν:

  • 1 αν η συνθήκη είναι αληθής
  • 0 αν η συνθήκη είναι ψευδής

📘 Παράδειγμα

int a = 3; printf("%d\n", a < 12); // Έξοδος: 1 (true) printf("%d\n", a > 12); // Έξοδος: 0 (false)

🚨 ΜΗΝ Μπερδεύετε = με ==

  • = → Εκχώρηση τιμής
  • == → Έλεγχος ισότητας
if (a = 10) // ❌ ΛΑΘΟΣ! (εκχώρηση) if (a == 10) // ✅ ΣΩΣΤΟ! (σύγκριση)

3.2.6 Λογικοί Τελεστές

🔗 Λογικοί Τελεστές

  • && Λογικό ΚΑΙ (AND)
  • || Λογικό Ή (OR)
  • ! Λογική Άρνηση (NOT)

Τελεστής && (AND)

Επιστρέφει αληθές (1) μόνο όταν ΟΛΕΣ οι συνθήκες είναι αληθείς.

(10 == 10) && (5 > 3) // true (και οι δύο αληθείς) (10 != 10) && (5 > 3) // false (η πρώτη ψευδής)

Τελεστής || (OR)

Επιστρέφει αληθές (1) όταν ΤΟΥΛΑΧΙΣΤΟΝ ΜΙΑ συνθήκη είναι αληθής.

(10 == 10) || (3 > 5) // true (η πρώτη αληθής) (10 != 10) || (3 > 5) // false (και οι δύο ψευδείς)

Τελεστής ! (NOT)

📘 Λογική Άρνηση

int a = 1821; printf("%d\n", a); // Έξοδος: 1821 printf("%d\n", !a); // Έξοδος: 0 printf("%d\n", !!a); // Έξοδος: 1

Χρήσιμο για συντομογραφίες:

if (a == 0) ≡ if (!a) if (a != 0) ≡ if (a)

📘 Παράδειγμα - Πλήρης Χρήση του ! (NOT)

#include <stdio.h> int main() { // Δηλώνουμε μία ακέραια μεταβλητή και της δίνουμε τιμή 5 int a = 5; /* * Στην C, κάθε μηδενική τιμή (0) θεωρείται ψευδής (false) * και κάθε μη μηδενική τιμή θεωρείται αληθής (true). * Επομένως, η παρακάτω if(a) θα εκτελεστεί, αφού το a = 5 ≠ 0. */ if (a) printf("a != 0\n"); // Εκτυπώνεται γιατί η συνθήκη είναι αληθής else printf("a == 0\n"); // Δεν εκτελείται (το a δεν είναι 0) /* * Το !a είναι ο λογικός τελεστής NOT (άρνηση). * Αν το a είναι μηδέν, τότε !a = 1 (true) * Αν το a είναι διαφορετικό από μηδέν, τότε !a = 0 (false) * Εδώ το a = 5, άρα !a = 0 → η if(!a) είναι ψευδής, εκτελείται το else. */ if (!a) printf("a == 0\n"); // Δεν εκτελείται, γιατί a ≠ 0 else printf("a != 0\n"); // Εκτυπώνεται, γιατί !a είναι false // Τέλος προγράμματος return 0; }

💬 Έξοδος:

a != 0 a != 0

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 Τελεστής Κόμμα (,)

📘 Τελεστής Κόμμα

Εκτελεί πολλές εκφράσεις από αριστερά προς δεξιά.

int a = 8, b = 3; a += 2, b += 5, printf("a=%d b=%d", a, b); // Έξοδος: a=10 b=8

3.2.9 Τελεστής sizeof()

💡 Τελεστής sizeof()

Επιστρέφει το μέγεθος σε bytes ενός τύπου δεδομένων ή μεταβλητής.

📘 Παράδειγμα sizeof()

printf("int: %d bytes\n", sizeof(int)); printf("float: %d bytes\n", sizeof(float)); printf("double: %d bytes\n", sizeof(double)); printf("char: %d bytes\n", sizeof(char));

💬 Έξοδος:

int: 4 bytes float: 4 bytes double: 8 bytes char: 1 bytes

3.2.10 Προτεραιότητα Τελεστών

⚠️ Σειρά Εκτέλεσης

Όταν υπάρχουν πολλοί τελεστές, η σειρά εκτέλεσης είναι:

  1. Παρενθέσεις ( )
  2. Αριθμητικοί τελεστές (*, /, % πριν από +, -)
  3. Συγκριτικοί τελεστές (<, >, ==, !=)
  4. Λογικοί τελεστές (&&, ||)
Προτεραιότητα Τελεστές Συσχέτιση
1 (Υψηλότερη) () [] ++ -- Αριστερά → Δεξιά
2 ! ++ -- + - (μοναδιαίοι) sizeof Δεξιά → Αριστερά
3 * / % Αριστερά → Δεξιά
4 + - Αριστερά → Δεξιά
5 < <= > >= Αριστερά → Δεξιά
6 == != Αριστερά → Δεξιά
7 && Αριστερά → Δεξιά
8 || Αριστερά → Δεξιά
9 = += -= *= /= %= Δεξιά → Αριστερά
10 (Χαμηλότερη) , Αριστερά → Δεξιά

✅ Χρυσός Κανόνας

ΧΡΗΣΙΜΟΠΟΙΕΙΤΕ ΠΑΡΕΝΘΕΣΕΙΣ! Κάνουν τον κώδικα πιο ευανάγνωστο και αποφεύγουν λάθη!

3.3 Εισαγωγή στις Δομές Ελέγχου

💡 Τι είναι οι Δομές Ελέγχου;

Οι δομές ελέγχου (control structures) μάς επιτρέπουν να αλλάξουμε τη σειρά εκτέλεσης των εντολών στο πρόγραμμά μας, ανάλογα με συνθήκες που θέτουμε.

Χωρίς δομές ελέγχου, το πρόγραμμα θα εκτελούσε όλες τις εντολές μία προς μία, από πάνω προς τα κάτω. Με δομές ελέγχου, μπορούμε να κάνουμε το πρόγραμμα να παίρνει αποφάσεις!

Τύποι Δομών Ελέγχου

🔀 Οι 3 Βασικές Δομές

  1. Ακολουθιακή Δομή (Sequence)
    Οι εντολές εκτελούνται μία μετά την άλλη, με τη σειρά που γράφονται
  2. Δομή Επιλογής (Selection)
    Το πρόγραμμα επιλέγει ποιες εντολές θα εκτελέσει βάσει μιας συνθήκης
    if, if-else, switch
  3. Δομή Επανάληψης (Iteration)
    Το πρόγραμμα επαναλαμβάνει εντολές πολλές φορές
    for, while, do-while (θα τις δούμε σε επόμενο μάθημα)

Πώς Λειτουργούν οι Συνθήκες;

Οι συνθήκες είναι λογικές εκφράσεις που αποτιμώνται σε true (αληθές) ή false (ψευδές).

📊 Αποτίμηση Συνθηκών στη C

Στη C, οι συνθήκες αποτιμώνται ως αριθμοί:

  • 0 = false (ψευδές)
  • Οποιοσδήποτε άλλος αριθμός (συνήθως 1) = true (αληθές)
// Παραδείγματα συνθηκών int age = 25; age > 18 // true (1) age == 25 // true (1) age < 18 // false (0) age != 30 // true (1)

3.4 Η Εντολή if

🎯 Η Απλή Εντολή if

Η εντολή if εκτελεί ένα κομμάτι κώδικα μόνο αν μια συνθήκη είναι αληθής.

Σύνταξη

if (συνθήκη) { // κώδικας που θα εκτελεστεί // αν η συνθήκη είναι αληθής }
Έλεγχος Συνθήκης
Αν TRUE: Εκτέλεση Κώδικα
Συνέχεια Προγράμματος

Παραδείγματα

📘 Παράδειγμα 1 - Απλός Έλεγχος Ηλικίας

#include <stdio.h> int main() { int age = 20; if (age >= 18) { printf("Είσαι ενήλικας!\n"); } printf("Τέλος προγράμματος\n"); return 0; }

💬 Έξοδος:

Είσαι ενήλικας! Τέλος προγράμματος

📗 Παράδειγμα 2 - Έλεγχος Θετικού Αριθμού

#include <stdio.h> int main() { int number; printf("Δώσε έναν αριθμό: "); scanf("%d", &number); if (number > 0) { printf("Ο αριθμός %d είναι θετικός!\n", number); } return 0; }

⚠️ Προσοχή στα Άγκιστρα { }

  • Αν η if έχει μόνο μία εντολή, τα άγκιστρα είναι προαιρετικά (αλλά συνιστάται να τα βάζετε πάντα!)
  • Αν έχει περισσότερες από μία εντολές, τα άγκιστρα είναι υποχρεωτικά
// Χωρίς άγκιστρα (μόνο 1 εντολή) if (age >= 18) printf("Ενήλικας\n"); // Με άγκιστρα (καλύτερη πρακτική!) if (age >= 18) { printf("Ενήλικας\n"); }

3.5 Η Εντολή if-else

🎯 Η Εντολή if-else

Με το if-else μπορούμε να ορίσουμε δύο εναλλακτικές πορείες: μία αν η συνθήκη είναι αληθής και μία αν είναι ψευδής.

Σύνταξη

if (συνθήκη) { // κώδικας αν η συνθήκη είναι αληθής } else { // κώδικας αν η συνθήκη είναι ψευδής }

📘 Παράδειγμα - Έλεγχος Ζυγού/Μονού

#include <stdio.h> int main() { int number; printf("Δώσε έναν αριθμό: "); scanf("%d", &number); if (number % 2 == 0) { printf("%d είναι ζυγός!\n", number); } else { printf("%d είναι μονός!\n", number); } return 0; }

3.6 Η Εντολή else-if

🎯 Η Εντολή else-if

Όταν έχουμε περισσότερες από δύο επιλογές, χρησιμοποιούμε το else if.

📘 Παράδειγμα - Βαθμολόγηση

#include <stdio.h> int main() { int grade; printf("Δώσε βαθμό (0-100): "); scanf("%d", &grade); if (grade >= 90) { printf("Άριστα! (A)\n"); } else if (grade >= 80) { printf("Πολύ Καλά! (B)\n"); } else if (grade >= 70) { printf("Καλά! (C)\n"); } else if (grade >= 60) { printf("Μέτρια (D)\n"); } else { printf("Απορρίπτεται (F)\n"); } return 0; }

3.7 Εμφωλευμένες Δομές if

🎯 Εμφωλευμένα if (Nested if)

Μπορούμε να βάλουμε μία δομή if μέσα σε άλλη δομή if.

📘 Παράδειγμα - Έλεγχος Εύρους

#include <stdio.h> int main() { int age; printf("Πόσο χρονών είσαι; "); scanf("%d", &age); if (age >= 18) { printf("Είσαι ενήλικας.\n"); if (age >= 65) { printf("Δικαιούσαι έκπτωση τρίτης ηλικίας!\n"); } } else { printf("Είσαι ανήλικος.\n"); } return 0; }

3.8 Ο Τελεστής Τριών Όρων (?:)

🎯 Ο Τριαδικός Τελεστής

Είναι μία συντομογραφία για απλές δομές if-else.

μεταβλητή = (συνθήκη) ? τιμή_αν_αληθής : τιμή_αν_ψευδής;

📘 Παράδειγμα - Εύρεση Μεγίστου

#include <stdio.h> int main() { // Δηλώνουμε δύο ακέραιες μεταβλητές και τους δίνουμε αρχικές τιμές int a = 10, b = 20; int max; // Μεταβλητή που θα κρατήσει τη μεγαλύτερη τιμή /* * Ο τριαδικός (ternary) τελεστής στη C έχει τη μορφή: * (συνθήκη) ? τιμή_αν_αληθής : τιμή_αν_ψευδής * * Αν η συνθήκη είναι αληθής (true), τότε η παράσταση παίρνει * την πρώτη τιμή (μετά το ?). * Αν είναι ψευδής (false), παίρνει τη δεύτερη (μετά το :). * * Εδώ ελέγχουμε αν το a είναι μεγαλύτερο από το b: * - Αν το a > b → max = a * - Αλλιώς (δηλ. a <= b) → max = b */ max = (a > b) ? a : b; // Εμφάνιση του αποτελέσματος στην οθόνη printf("Ο μεγαλύτερος είναι: %d\n", max); // Τέλος προγράμματος return 0; }

3.9 Η Εντολή switch-case

🎯 Η Εντολή switch

Η switch χρησιμοποιείται όταν θέλουμε να ελέγξουμε μια μεταβλητή για πολλές διαφορετικές τιμές.

switch (μεταβλητή) { case τιμή1: // κώδικας για τιμή1 break; case τιμή2: // κώδικας για τιμή2 break; default: // κώδικας αν καμία τιμή δεν ταιριάζει }

📘 Παράδειγμα - Μενού Επιλογών

#include <stdio.h> int main() { int choice; printf("--- Μενού ---\n"); printf("1. Νέο Παιχνίδι\n"); printf("2. Φόρτωση\n"); printf("3. Ρυθμίσεις\n"); printf("4. Έξοδος\n"); printf("Επιλογή: "); scanf("%d", &choice); switch (choice) { case 1: printf("Ξεκινάει νέο παιχνίδι...\n"); break; case 2: printf("Φορτώνει παιχνίδι...\n"); break; case 3: printf("Άνοιγμα ρυθμίσεων...\n"); break; case 4: printf("Αντίο!\n"); break; default: printf("Μη έγκυρη επιλογή!\n"); } return 0; }

🚨 ΠΡΟΣΟΧΗ: Το break είναι ΚΡΙΣΙΜΟ!

Αν ξεχάσετε το break, η εκτέλεση θα συνεχίσει στο επόμενο case!

3.10 Σύγκριση if vs switch

Χαρακτηριστικό if-else switch-case
Χρήση Για οποιεσδήποτε συνθήκες Για συγκεκριμένες σταθερές τιμές
Ευαναγνωσία Καλή για λίγες επιλογές Πολύ καλή για πολλές επιλογές
Ταχύτητα Πιο αργή για πολλές επιλογές Γρηγορότερη για πολλές επιλογές
Ευελιξία Πολύ ευέλικτη Περιορισμένη σε σταθερές

❌ Συνηθισμένα Λάθη

  1. Ξεχασμένο break στο switch - Προκαλεί fall-through
  2. Χρήση = αντί για == - Το = είναι ανάθεση, το == είναι σύγκριση!
  3. Ξεχασμένα άγκιστρα - Για πολλές εντολές είναι απαραίτητα
  4. Λάθος λογική σε εμφωλευμένα if - Προσοχή στην εσοχή!

Καλές Πρακτικές

  • Πάντα βάζετε άγκιστρα, ακόμα και για μία εντολή
  • Χρησιμοποιείτε σωστή εσοχή (indentation)
  • Προτιμήστε switch για πολλές σταθερές τιμές
  • Προτιμήστε if-else για πολύπλοκες συνθήκες
  • Μην ξεχνάτε το break στο switch!

🎓 Τέλος Κεφαλαίου 3

Τώρα ξέρεις πώς να ελέγχεις τη ροή του προγράμματός σου!

Επόμενο Κεφάλαιο: Βρόχοι (Loops) - for, while, do-while