Κεφάλαιο 4: Βρόχοι και Πίνακες

Επανάληψη και Αποθήκευση Δεδομένων στη C

🎯 Στόχοι Κεφαλαίου

Σε αυτό το κεφάλαιο θα μάθεις:

  • Πώς να επαναλαμβάνεις εντολές με τους βρόχους for, while και do-while
  • Πότε να χρησιμοποιείς κάθε τύπο βρόχου
  • Την εντολή goto και γιατί να την αποφεύγεις
  • Πώς να αποθηκεύεις πολλές τιμές με πίνακες μιας διάστασης

4.1 Εισαγωγή στους Βρόχους

🔄 Τι είναι οι Βρόχοι;

Οι βρόχοι (loops) είναι δομές που μας επιτρέπουν να επαναλαμβάνουμε ένα κομμάτι κώδικα πολλές φορές.

Αντί να γράφουμε την ίδια εντολή 100 φορές, χρησιμοποιούμε έναν βρόχο που την εκτελεί 100 φορές αυτόματα!

📌 Οι 3 Βασικοί Τύποι Βρόχων στη C

  1. for - Όταν ξέρουμε πόσες επαναλήψεις θέλουμε
  2. while - Όταν δεν ξέρουμε πόσες επαναλήψεις θα χρειαστούν
  3. do-while - Όταν θέλουμε τουλάχιστον μία εκτέλεση

4.2 Ο Βρόχος for

🎯 Ο Βρόχος for

Ο βρόχος for χρησιμοποιείται όταν ξέρουμε εκ των προτέρων πόσες φορές θέλουμε να επαναληφθεί ο κώδικας.

for (αρχικοποίηση; συνθήκη; ενημέρωση) { // Κώδικας που επαναλαμβάνεται }

📋 Τα 3 Μέρη του for

  1. Αρχικοποίηση - Εκτελείται μία φορά στην αρχή
  2. Συνθήκη - Ελέγχεται πριν από κάθε επανάληψη
  3. Ενημέρωση - Εκτελείται μετά από κάθε επανάληψη

📘 Παράδειγμα 1 - Εκτύπωση Αριθμών 1-10

#include <stdio.h> int main() { /* * Βρόχος for που εκτυπώνει τους αριθμούς από 1 έως 10 * * Αρχικοποίηση: int i = 1 → Ξεκινάμε από το 1 * Συνθήκη: i <= 10 → Συνεχίζουμε όσο το i είναι μικρότερο ή ίσο με 10 * Ενημέρωση: i++ → Αυξάνουμε το i κατά 1 μετά από κάθε επανάληψη */ for (int i = 1; i <= 10; i++) { printf("%d ", i); } printf("\n"); return 0; }

Αποτέλεσμα: 1 2 3 4 5 6 7 8 9 10

📘 Παράδειγμα 2 - Υπολογισμός Αθροίσματος

#include <stdio.h> int main() { // Μεταβλητή που θα κρατήσει το άθροισμα int sum = 0; /* * Υπολογίζουμε το άθροισμα των αριθμών από 1 έως 100 * Σε κάθε επανάληψη προσθέτουμε το i στο sum */ for (int i = 1; i <= 100; i++) { sum = sum + i; // Ή sum += i; } printf("Το άθροισμα των αριθμών 1-100 είναι: %d\n", sum); return 0; }

Αποτέλεσμα: Το άθροισμα των αριθμών 1-100 είναι: 5050

📘 Παράδειγμα 3 - Πολλαπλασιασμοί του 5

#include <stdio.h> int main() { // Εκτυπώνουμε τα πρώτα 10 πολλαπλάσια του 5 printf("Πολλαπλάσια του 5:\n"); for (int i = 1; i <= 10; i++) { printf("5 x %d = %d\n", i, 5 * i); } return 0; }

Αποτέλεσμα:

Πολλαπλάσια του 5:
5 x 1 = 5
5 x 2 = 10
...
5 x 10 = 50

⚠️ Προσοχή: Άπειροι Βρόχοι!

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

#include <stdio.h> int main() { // ΛΑΘΟΣ! Άπειρος βρόχος for (int i = 1; i >= 0; i++) { printf("Αυτό δε θα σταματήσει ποτέ!\n"); } return 0; }

4.3 Ο Βρόχος while

🎯 Ο Βρόχος while

Ο βρόχος while συνεχίζει να εκτελείται όσο η συνθήκη είναι αληθής.

Χρησιμοποιείται όταν δεν ξέρουμε πόσες επαναλήψεις θα χρειαστούν.

while (συνθήκη) { // Κώδικας που επαναλαμβάνεται }

📘 Παράδειγμα 1 - Μέτρημα με while

#include <stdio.h> int main() { // Αρχικοποιούμε τον μετρητή int i = 1; /* * Όσο το i είναι μικρότερο ή ίσο με 5, * εκτέλεσε τον κώδικα μέσα στα άγκιστρα */ while (i <= 5) { printf("Επανάληψη %d\n", i); i++; // Πολύ σημαντικό! Αυξάνουμε το i } printf("Ο βρόχος τελείωσε!\n"); return 0; }

📘 Παράδειγμα 2 - Μαντέψτε τον Αριθμό

#include <stdio.h> int main() { // Ο αριθμός που πρέπει να βρει ο χρήστης int secret = 42; int guess; printf("Μάντεψε έναν αριθμό από 1 έως 100!\n"); /* * Συνεχίζουμε να ζητάμε αριθμό μέχρι ο χρήστης * να βρει το σωστό */ scanf("%d", &guess); while (guess != secret) { if (guess < secret) { printf("Πολύ μικρός! Δοκίμασε ξανά: "); } else { printf("Πολύ μεγάλος! Δοκίμασε ξανά: "); } scanf("%d", &guess); } printf("Μπράβο! Βρήκες τον αριθμό!\n"); return 0; }

📘 Παράδειγμα 3 - Διπλασιασμός Αριθμού

#include <stdio.h> int main() { int number = 1; /* * Διπλασιάζουμε τον αριθμό μέχρι να γίνει * μεγαλύτερος από 1000 */ printf("Διπλασιασμοί:\n"); while (number <= 1000) { printf("%d\n", number); number = number * 2; // Διπλασιάζουμε } return 0; }

Αποτέλεσμα: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512

4.4 Ο Βρόχος do-while

🎯 Ο Βρόχος do-while

Ο βρόχος do-while είναι παρόμοιος με τον while, αλλά εκτελείται τουλάχιστον μία φορά γιατί η συνθήκη ελέγχεται στο τέλος.

do { // Κώδικας που επαναλαμβάνεται } while (συνθήκη);

🔍 Διαφορά while vs do-while

  • while: Ελέγχει τη συνθήκη πριν εκτελεστεί ο κώδικας
  • do-while: Ελέγχει τη συνθήκη μετά την εκτέλεση του κώδικα

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

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

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

#include <stdio.h> int main() { int age; /* * Ζητάμε την ηλικία του χρήστη και συνεχίζουμε να ζητάμε * μέχρι να δώσει έγκυρη τιμή (0-120) */ do { printf("Δώσε την ηλικία σου (0-120): "); scanf("%d", &age); if (age < 0 || age > 120) { printf("Μη έγκυρη ηλικία! Δοκίμασε ξανά.\n"); } } while (age < 0 || age > 120); printf("Η ηλικία σου είναι: %d\n", age); return 0; }

4.5 Σύγκριση Βρόχων

Χαρακτηριστικό for while do-while
Χρήση Γνωστός αριθμός επαναλήψεων Άγνωστος αριθμός επαναλήψεων Τουλάχιστον μία εκτέλεση
Έλεγχος συνθήκης Στην αρχή Στην αρχή Στο τέλος
Ελάχιστες εκτελέσεις 0 φορές 0 φορές 1 φορά
Συντομία κώδικα Πιο συνοπτικός Πιο ευέλικτος Για ειδικές περιπτώσεις

💡 Πότε να χρησιμοποιείς κάθε βρόχο

  • Χρησιμοποίησε for για μέτρημα ή όταν ξέρεις τις επαναλήψεις
  • Χρησιμοποίησε while όταν δεν ξέρεις πόσες επαναλήψεις χρειάζονται
  • Χρησιμοποίησε do-while όταν πρέπει να εκτελεστεί κάτι τουλάχιστον μία φορά

4.6 Εμφωλευμένοι Βρόχοι

🎯 Εμφωλευμένοι Βρόχοι

Μπορούμε να βάλουμε έναν βρόχο μέσα σε άλλον βρόχο. Αυτό λέγεται εμφώλευση (nesting).

📐 Μορφοποίηση Εξόδου με printf

Στην εντολή:

printf("%4d", i * j);

το %4d σημαίνει: Εμφάνισε έναν ακέραιο αριθμό (d) μέσα σε πεδίο πλάτους 4 χαρακτήρων.

🔹 Αναλυτικά:

  • Το d δηλώνει ότι θα εκτυπωθεί ένας ακέραιος (decimal integer)
  • Ο αριθμός 4 πριν από το d σημαίνει "κράτα 4 θέσεις για αυτόν τον αριθμό"
  • Αν ο αριθμός έχει λιγότερα ψηφία, το printf προσθέτει κενά από αριστερά για να συμπληρωθεί το πλάτος

📘 Παραδείγματα μορφοποίησης:

printf("%4d", 2); // θα εμφανίσει: " 2" printf("%4d", 12); // θα εμφανίσει: " 12" printf("%4d", 1234); // θα εμφανίσει: "1234"

📘 Παράδειγμα 1 - Πολλαπλασιαστικός Πίνακας

#include <stdio.h> int main() { printf("Πολλαπλασιαστικός Πίνακας:\n\n"); /* * Εξωτερικός βρόχος: Κάθε σειρά του πίνακα * Εσωτερικός βρόχος: Κάθε στήλη της σειράς */ for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { printf("%4d", i * j); } printf("\n"); // Νέα γραμμή μετά από κάθε σειρά } return 0; }

Αποτέλεσμα:

   1   2   3   4   5
   2   4   6   8  10
   3   6   9  12  15
   4   8  12  16  20
   5  10  15  20  25

📘 Παράδειγμα 2 - Σχήμα Αστεριών

#include <stdio.h> int main() { /* * Δημιουργούμε ένα τρίγωνο από αστεράκια * Η κάθε γραμμή έχει τόσα * όσο ο αριθμός της γραμμής */ for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i; j++) { printf("* "); } printf("\n"); } return 0; }

Αποτέλεσμα:

* 
* * 
* * * 
* * * * 
* * * * *

4.7 Εντολές break και continue

🎯 Οι Εντολές break και continue

  • break - Σταματάει αμέσως τον βρόχο
  • continue - Πηγαίνει στην επόμενη επανάληψη

Η Εντολή break

📘 Παράδειγμα - Εύρεση Αριθμού

#include <stdio.h> int main() { /* * Ψάχνουμε για τον αριθμό 7 * Όταν τον βρούμε, σταματάμε με break */ for (int i = 1; i <= 10; i++) { if (i == 7) { printf("Βρήκα το 7! Σταματάω.\n"); break; // Έξοδος από τον βρόχο } printf("%d ", i); } printf("\nΤέλος προγράμματος.\n"); return 0; }

Αποτέλεσμα: 1 2 3 4 5 6 Βρήκα το 7! Σταματάω.

Η Εντολή continue

📘 Παράδειγμα - Παράλειψη Αρτίων

#include <stdio.h> int main() { /* * Εκτυπώνουμε μόνο τους περιττούς αριθμούς * Αγνοούμε τους άρτιους με continue */ printf("Περιττοί αριθμοί: "); for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { continue; // Πήγαινε στην επόμενη επανάληψη } printf("%d ", i); } printf("\n"); return 0; }

Αποτέλεσμα: Περιττοί αριθμοί: 1 3 5 7 9

4.8 Η Εντολή goto

⚠️ Η Εντολή goto

Η εντολή goto επιτρέπει το άλμα σε οποιοδήποτε σημείο του προγράμματος.

ΠΡΟΣΟΧΗ: Η χρήση του goto θεωρείται κακή πρακτική και πρέπει να αποφεύγεται!

goto ετικέτα; ... ετικέτα: // κώδικας

📘 Παράδειγμα - Χρήση goto (ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ!)

#include <stdio.h> int main() { int i = 1; start: // Ετικέτα (label) printf("%d ", i); i++; if (i <= 5) { goto start; // Πήγαινε στην ετικέτα start } printf("\n"); return 0; }

❌ Γιατί να ΑΠΟΦΕΥΓΕΙΣ το goto

  1. Δημιουργεί δύσκολο στην κατανόηση κώδικα
  2. Οδηγεί σε "σπαγγέτι κώδικα" (spaghetti code)
  3. Δυσκολεύει το debugging
  4. Τα ίδια μπορούν να γίνουν με βρόχους και συναρτήσεις

✅ Αντί για goto, χρησιμοποίησε:

  • Βρόχους (for, while, do-while)
  • Εντολές break και continue
  • Συναρτήσεις (θα τις μάθουμε αργότερα)

4.9 Πίνακες Μιας Διάστασης

🎯 Τι είναι Πίνακας;

Ένας πίνακας (array) είναι μια συλλογή από πολλές μεταβλητές του ίδιου τύπου, αποθηκευμένες συνεχόμενα στη μνήμη.

Αντί να δηλώσεις 100 ξεχωριστές μεταβλητές, δηλώνεις έναν πίνακα με 100 θέσεις!

τύπος όνομα[μέγεθος];

📋 Βασικά Στοιχεία Πινάκων

  • Οι θέσεις αριθμούνται από 0 μέχρι μέγεθος-1
  • Όλα τα στοιχεία έχουν τον ίδιο τύπο
  • Το μέγεθος πρέπει να είναι σταθερό

📘 Παράδειγμα 1 - Δήλωση και Αρχικοποίηση

#include <stdio.h> int main() { // Δήλωση πίνακα με 5 ακέραιους int numbers[5]; // Αρχικοποίηση κάθε θέσης numbers[0] = 10; numbers[1] = 20; numbers[2] = 30; numbers[3] = 40; numbers[4] = 50; // Εμφάνιση των στοιχείων printf("Τα στοιχεία του πίνακα:\n"); for (int i = 0; i < 5; i++) { printf("numbers[%d] = %d\n", i, numbers[i]); } return 0; }

📘 Παράδειγμα 2 - Αρχικοποίηση κατά τη Δήλωση

#include <stdio.h> int main() { /* * Μπορούμε να αρχικοποιήσουμε τον πίνακα όταν τον δηλώνουμε * Αν δώσουμε λιγότερες τιμές, οι υπόλοιπες θέσεις μηδενίζονται */ int scores[5] = {85, 92, 78, 95, 88}; // Υπολογισμός μέσου όρου int sum = 0; for (int i = 0; i < 5; i++) { sum += scores[i]; } float average = sum / 5.0; printf("Μέσος όρος βαθμών: %.2f\n", average); return 0; }

📘 Παράδειγμα 3 - Εισαγωγή Δεδομένων από Χρήστη

#include <stdio.h> int main() { int numbers[5]; // Διάβασμα αριθμών από τον χρήστη printf("Δώσε 5 αριθμούς:\n"); for (int i = 0; i < 5; i++) { printf("Αριθμός %d: ", i + 1); scanf("%d", &numbers[i]); } // Εύρεση του μεγαλύτερου int max = numbers[0]; for (int i = 1; i < 5; i++) { if (numbers[i] > max) { max = numbers[i]; } } printf("Ο μεγαλύτερος αριθμός είναι: %d\n", max); return 0; }

🚨 ΠΡΟΣΟΧΗ: Υπέρβαση Ορίων!

Αν προσπαθήσεις να προσπελάσεις θέση εκτός των ορίων του πίνακα, θα προκληθεί σφάλμα!

int arr[5]; arr[5] = 10; // ΛΑΘΟΣ! Οι θέσεις είναι 0-4 arr[10] = 20; // ΛΑΘΟΣ! Εκτός ορίων

Καλές Πρακτικές με Πίνακες

  • Πάντα να ελέγχεις τα όρια του πίνακα
  • Αρχικοποίησε τους πίνακες πριν τη χρήση
  • Χρησιμοποίησε σταθερές για το μέγεθος του πίνακα
  • Χρησιμοποίησε βρόχους για διάσχιση πινάκων

❌ Συνηθισμένα Λάθη με Πίνακες

  1. Υπέρβαση ορίων - Πρόσβαση εκτός του μεγέθους
  2. Μη αρχικοποίηση - Χρήση χωρίς αρχικές τιμές
  3. Λάθος δείκτες - Ξεχάσματε ότι αρχίζουν από 0

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

Συγχαρητήρια! Τώρα ξέρεις:

  • ✓ Πώς να επαναλαμβάνεις εντολές με βρόχους
  • ✓ Πότε να χρησιμοποιείς for, while και do-while
  • ✓ Πώς να αποθηκεύεις πολλές τιμές με πίνακες

Επόμενο Κεφάλαιο: Συναρτήσεις (Functions)

Μπάρδης Γιώργος

Τμήμα Ψηφιακών Συστημάτων - Πανεπιστήμιο Πελοποννήσου