Βρόγχοι Επαναλήψεων (Loops)

Άλλο ένα πολύ σημαντικό κεφάλαιο στον προγραμματισμό είναι οι βρόγχοι επανάληψης (loops). Όπως καταλαβαίνετε από τον τίτλο, έχει να κάνει με επαναληπτικές εκτελέσεις κώδικα. Οι βρόγχοι επαναλήψεως περικλείουν κώδικα, τον οποίο τον εκτελούν πολλαπλές φορές μέχρι να ισχύσει η συνθήκη που ορίστηκε στον συγκεκριμένο βρόγχο.

Τέτοια συνθήκη μπορεί να είναι π.χ. Να εκτελεστεί ο κώδικας 10 φορές. Μόλις φτάσει τις 10 φορές τότε να προχωρήσει στην εκτέλεση του υπολοίπου προγράμματος που έχουμε γράψει.

Υπάρχουν διάφορες εντολές βρόχων επαναλήψεως όπως η for, foreach, do/while και η while. Ορισμένες από αυτές θα τις δούμε αναλυτικά παρακάτω.

Για παράδειγμα, αν θέλαμε να τυπώσουμε 50 φορές το μήνυμα “Hello, World!”, θα έπρεπε να γράψουμε 50 φορές την εντολή echo (δηλ. 50 γραμμές κώδικα) όπως φαίνεται παρακάτω:

echo "Hello, World!";
echo "Hello, World!";
echo "Hello, World!";
...
echo "Hello, World!";

For

Με έναν βρόγχο επαναλήψεως μπορούμε με μόλις 3 γραμμές κώδικα να τυπώσουμε το μήνυμα “Hello, World!” όσες φορές θέλουμε. Ένα τυπικό παράδειγμα βρόγχου επαναλήψεως είναι το παρακάτω με την for:

1.  for (int $i=0; $i < 50; $i++) {
2.    echo "Hello, World!";
3.  }

Ο παραπάνω κώδικας θα τυπώσει 50 φορές το μήνυμα Hello, World!. Μπορούμε να το τυπώσουμε όσες φορές θέλουμε (αρκεί να μην το παρακάνουμε). Για να δούμε αναλυτικά τί ακριβώς κάνει.

Γραμμή 1: Θέτουμε την μεταβλητή $i η οποία είναι ο μετρητής μας και θα ισούται με 0. Δηλαδή θα ξεκινήσει να μετράει ο βρόγχος μας απο το 0. Στην συνέχεια το $i < 50 είναι η συνθήκη μας η οποία όσο είναι αληθής, θα εκτελείται ο βρόγχος μας. Συγκεκριμένα όσο η μεταβλητή μας $i είναι μικρότερη από 50, τότε θα εκτελείται ο κώδικας που βρίσκεται εντός της for μας. Τέλος, το $i++ είναι η αύξηση της τιμής της $i κατά μια μονάδα. Αν για παράδειγμα η τιμή της $i ειναι 0, θα γίνει 1, αν είναι 1 θα γίνει 2 κοκ.

Γραμμή 2: Υπάρχει ο κώδικας ο οποίος περικλείεται μέσα στον βρόγχο επαναλήψεως της for. Στον συγκεκριμένο βρόγχο περικλείεται ο κώδικας μιας μόνο γραμμής, της γραμμής 2. Ενδεχομένως θα μπορούσαμε να γράψουμε περισσότερες γραμμές κώδικα ο οποίος θα επαναλαμβάνεται εντός του βρόγχου επανάληψης. Χάριν ευκολίας, γράψαμε μόνο μια γραμμή κώδικα εντός του βρόγχου επαναλήψεως.

Για να κατανοήσουμε καλύτερα τον μετρητή $i, θα δούμε το παρακάτω παράδειγμα:

1.  for (int $i = 1; $i <= 10; $i++) {
2.    echo "value: $i <br>";
3.  }

Αποτέλεσμα:

value: 1
value: 2
value: 3
value: 4
value: 5
value: 6
value: 7
value: 8
value: 9
value: 10

Όπως διαπιστώνετε στο παραπάνω αποτέλεσμα, σε κάθε επανάληψη του κώδικα της γραμμής 2 (η οποία βρίσκεται εντός του βρόγχου επανάληψης), αυξάνεται κατά 1. Αυτός είναι ο σκοπός των βρόχων επαναλήψεως. Δηλαδή, εάν χρειάζεται να φτιάξουμε μια επαναλαμβανόμενη διαδικασία, να μην χρειάζεται να επαναλαμβάνουμε γραμμές κώδικα ξανά και ξανά.

Φανταστείτε, να τυπώναμε 500 φορές το μήνυμα Hello, World! στην οθόνη χωρίς βρόγχο επανάληψης. Θα γεμίζαμε με 500 γραμμές κώδικα. Ενώ τώρα με 3 γραμμές είμαστε καλυμμένοι καθώς μπορούμε να επαναλάβουμε συγκεκριμένες γραμμές κώδικα όσες φορές θέλουμε χωρίς να αυξηθεί ο όγκος του προγράμματός μας. Επιπλέον ο κώδικάς μας είναι πιο ευανάγνωστος αλλά και πιο ευέλικτος.

Άσκηση 1:

Να δημιουργηθεί πρόγραμμα το οποίο να εμφανίζει την προπαίδεια του 5 χρησιμοποιώντας τον βρόγχο επανάληψης for.

Λύση:

Όνομα αρχείου: propaideia.php

<html>
<body>

<h1>ΠΡΟΠΑΙΔΕΙΑ</h1>
<?php

for($x = 1; $x <= 10; $x++)
{
  $r = $x * 5;
  echo $x . ' x 5' . ' = ' . $r . '<br>';
}

?>
</body>
</html>

Nested Loops (Βρόγχος μέσα σε βρόγχο)

Τα nested loops είναι βρόγχος επαναλήψεως μέσα σε βρόγχο επαναλήψεως ή πιο απλά είναι μια loop μέσα σε μια άλλη loop, ή ακόμα καλύτερα είναι μια for μέσα σε μια άλλη for. Η συγκεκριμένη μεθοδολογία είναι ιδιαίτερα χρήσιμη όταν θέλουμε να επεξεργαστούμε πολυεπίπεδα δεδομένα (multi-dimensional data).

Όταν χρησιμοποιούμε nested loops, η πρώτη loop αρχικοποιεί τις επαναλήψεις, ενώ η εσωτερική loop εκτελείται μέχρι την ολοκλήρωσή της και μετά ξανά πηγαίνει από την αρχή μέχρι η κύρια loop να ολοκληρωθεί. Εάν σας μπέρδεψα λιγάκι, το παρακάτω παράδειγμα της προπαίδειας θα ξεκαθαρίσει το τοπίο.

<html>
<body>

<h1>ΠΡΟΠΑΙΔΕΙΑ 1</h1>
<?php

for($x = 1; $x <= 10; $x++)
{
  for($y = 1; $y <= 10; $y++)
  {
    $r = $x * $y;
    echo $x . ' x ' . $y . ' = ' . $r . '<br>';
  }
  echo '<br>';
}

?>

</body>
</html>

While

Στα προηγούμενα παραδείγματα είδαμε τον βρόγχο επαναλήψεως for, ενώ σε αυτό το παράδειγμα θα γνωρίσουμε έναν διαφορετικό βρόγχο επαναλήψεως, την while. Η while διαφέρει από την for ως προς την συνθήκη. Συγκεκριμένα η while συντάσσεται κάπως έτσι:

1. while (συνθήκη) 
2. {
3.   εντολές
4. }

Όπως βλέπετε στο παραπάνω παράδειγμα, θέτουμε τη συνθήκη στη γραμμή 1 και εφόσον είναι αληθής (true), τότε εκτελούνται οι εντολές εντός της while. Θα εκτελείται ο κώδικας που βρίσκεται εντός της while μέχρι η συνθήκη της γραμμής 1 να γίνει ψευδής (false).

Πάμε να δούμε έναν βρόγχο χρησιμοποιώντας την while, ο οποίος εκτελείται κανονικά μέχρι η συνθήκη να γίνει ψευδής.

Όνομα αρχείου: while_loop.php

1. <?php
2. $x = 0;
3.
4. while($x <= 5) 
5. {
6.    echo "The number is: $x <br>";
7.    $x++;
8. }
9. ?>

Όπως βλέπετε, το παραπάνω παράδειγμα εκτελείται κανονικά τερματίζοντας την επανάληψη του κώδικα που βρίσκεται εντός της while (γραμμές 6 & 7) όταν η τιμή της μεταβλητής $x γίνει μεγαλύτερη από 5. Στο συγκεκριμένο παράδειγμα ο βρόγχος επαναλήψεως δεν εκτελείται στο άπειρο, αλλά για πέντε επαναλήψεις ικανοποιώντας τη συνθήκη που τέθηκε.

Πάμε να δούμε ένα παράδειγμα ενός infinite loop το οποίο δημιουργήθηκε κατά λάθος γράφοντας τη συνθήκη η οποία δεν πρόκειται να τερματίσει ποτέ.

Όνομα αρχείου: while_infinite.php

<?php
$x = 0;

while($x <= 5) 
{
   echo "The number is: $x <br>";
}
?>

Στο παραπάνω παράδειγμα, η μεταβλητή $x δεν αυξάνεται κατά μια μονάδα, συνεπώς για πάντα η $x θα ισούται με 0 και θα ικανοποιείται η συνθήκη της while που λέει να επαναλαμβάνεται για όσο η $x θα είναι μικρότερη ή ίση από 5.

Do…while

Άλλη μια loop είναι η do/while. Η διαφορά με τις άλλες loops είναι οτι ο έλεγχος της συνθήκης γίνεται στο τέλος. Συγκεκριμένα ο κώδικας που βρίσκεται εντός της do...while θα εκτελεστεί τουλάχιστον μια φορά είτε ισχύει, είτε δεν ισχύει η συνθήκη που βρίσκεται στην while. Δείτε το παρακάτω παράδειγμα και θα καταλάβετε.

Όνομα αρχείου: dowhile.php

<?php
$i = 0;

do 
{
   echo $i;
} 
while ($i < 1);
?>

Αποτέλεσμα: 0

Στο παραπάνω παράδειγμα εμφανίζει απλώς το 0. Αυτό συμβαίνει γιατί η $i περιέχει την τιμή 0 και ο έλεγχος που πραγματοποιείται στην συνθήκη της while η $i είναι μικρότερη απο 1. Εφόσον ικανοποιείται η συνθήκη δεν επαναλαμβάνεται η loop μας. Όμως, παρατηρούμε οτι ο κώδικας που βρίσκεται εντός της do...while εκτελείται τουλάχιστον μια φορά εμφανίζοντας την τιμή της μεταβλητής $i.