Δομές ελέγχου ροής: loop statements
Στο προηγούμενο κεφάλαιο, εξερευνήσαμε το switch
statement και μάθαμε πώς να εκτελούμε διαφορετικά τμήματα κώδικα ανάλογα με την τιμή μιας έκφρασης. Είδαμε ότι, μαζί με το if...else
statement, το switch
αποτελεί μέρος των conditional statements (δηλαδή, των statements που επιτρέπουν την υπό συνθήκη εκτέλεση κώδικα).
Σε αυτό το κεφάλαιο θα μιλήσουμε για μια άλλη μεγάλη κατηγορία των δομών ελέγχου ροής (control flow statements) που ονομάζονται βρόχοι επανάληψης (loop statements). Συγκεκριμένα, θα μάθουμε για τα for
, while
και do...while
statements.
Τι είναι τα loop statements;
Ας φανταστούμε ότι έχουμε να εκτελέσουμε μια διεργασία που πρέπει να επαναληφθεί πολλές φορές, από δεκάδες μέχρι, ενδεχομένως, και χιλιάδες φορες. Για παράδειγμα, ίσως χρειαστεί να τυπώσουμε ένα μήνυμα 100 φορές ή να πραγματοποιήσουμε έναν υπολογισμό για κάθε ένα από τα προϊόντα σε κάποιο ηλεκτρονικό κατάστημα. Αν έπρεπε, λοιπόν, να γράψουμε την ίδια εντολή 100 φορές στον κώδικά μας θα ήταν κουραστικό, θα ήταν πιο εύκολο να κάνουμε λάθη και ο κώδικάς μας θα γινόταν τεράστιος σε έκταση!
Εδώ έρχονται τα loop statements ή απλώς loops για να μας βοηθήσουν.
Τα loops είναι ένας μηχανισμός που μας παρέχουν οι γλώσσες προγραμματισμού. Είναι ένα κομμάτι κώδικα (statement) που εκτελεί μια συγκεκριμένη ομάδα διεργασιών–δηλαδή ένα block κώδικα–ξανά και ξανά, μέχρι να ικανοποιηθεί μια συγκεκριμένη συνθήκη.
Για να το απλοποιήσουμε σαν έννοια, ας το σκεφτούμε σαν μια επαναλαμβανόμενη οδηγία: “Κάνε αυτό, μετά κάνε το πάλι, και ξανά, μέχρι να συμβεί κάτι.” Αυτό μας επιτρέπει να γράφουμε πολύ λιγότερο κώδικα και να κάνουμε τον υπολογιστή να εκτελεί επαναλαμβανόμενες εργασίες με μεγάλη αποτελεσματικότητα.
Παράδειγμα
Όπως είδαμε, η ιδέα της επαναληπτικής εκτέλεσης διεργασιών είναι η βασική αρχή πίσω από τα loop statements. Αυτό σημαίνει ότι αντί να γράφουμε τον ίδιο κώδικα πολλές φορές, φράφουμε κώδικα μια φορά και λέμε στον υπολογιστή να τον εκτελέσει αυτόματα ξανά και ξανά.
Ας πάρουμε ένα απλό παράδειγμα στο οποίο θέλουμε να εκτυπώσουμε το μήνυμα "Καλημέρα!🌞"
τρεις φορες. Αυτό στην JavaScript μοιάζει κάπως έτσι:
1console.log("Καλημέρα!🌞");
2console.log("Καλημέρα!🌞");
3console.log("Καλημέρα!🌞");
Βλέπουμε ότι για να εκτελεστεί η διεργασία που εκτυπώνει το μήνυμα στην κονσόλα, θα πρέπει να επαναληφθεί στον κώδικά μας τρεις φορές.
Με ένα loop statement ο παραπάνω κώδικας θα μπορούσε να μετασχηματιστεί σε αυτό:
1// Αυτός είναι ένας βρόχος "for"
2for (let i = 0; i < 3; i++) {
3 // Αυτή η εντολή επαναλαμβάνεται
4 console.log("Καλημέρα!🌞");
5}
Βλέπουμε ότι για να εκτελεστεί η διεργασία που εκτυπώνει το μήνυμα στην κονσόλα, αρκεί να οριστεί στον κώδικά μας μία φορά και το loop statement θα αναλάβει να το εκτελέσει τρεις φορές ή όσες φορές του ζητήσουμε.
Γιατί είναι σημαντικά;
Τα loop statements είναι σημαντικά γιατί βελτιώνουν την αποδοτικότητα και την αναγνωσιμότητα του προγράμματός μας, καθιστώντας το πιο διαχειρίσιμο. Πιο συγκεκριμένα μας προσφέρουν:
- Εξοικονόμηση κώδικα: γράφουμε λιγότερο κώδικα, ο οποίος είναι πιο εύκολο να διαβαστεί και να συντηρηθεί.
- Αποφυγή λαθών: Όταν γράφουμε την ίδια εντολή πολλές φορές, αυξάνονται οι πιθανότητες να κάνουμε λάθη (πχ., ένα τυπογραφικό ή συντακτικό λάθος). Με την επανάληψη, γράφουμε την εντολή μία φορά. Σε περίπτωση που προκύψει κάποιο σφάλμα, τότε διορθώνουμε το πρόβληματικό σημείο στον κώδικα μία μόνο φορά.
- Ευελιξία: Αν κάποια στιγμή αποφασίσουμε ότι θέλουμε να εκτελέσουμε ένα block κώδικα περισσότερες ή λιγότερες φορές, με ένα loop statement απλά αλλάζουμε τον αριθμό των επαναλήψεων. Χωρίς loop statement, θα έπρεπε να προσθέσουμε ή να αφαιρέσουμε τις απαιτούμενες γραμμές κώδικα για τις αντίστοιχες επαναλήψεις.
- Αυτοματισμός: Οι υπολογιστές είναι φτιαγμένοι για επαναλαμβανόμενες διεργασίες. Οι βρόχοι τους επιτρέπουν να κάνουν ακριβώς αυτό, αφήνοντας εμάς να ασχοληθούμε με πιο ουσιαστικά προβλήματα.
Συνοπτικά, τα loop statements και η ιδέα της επανάληψης είναι από τα πιο θεμελιώδη εργαλεία στον προγραμματισμό, ανεξάρτητα από την γλώσσα προγραμματισμού που επιλέγουμε να χρησιμοποιήσουμε!
Βασικές αρχές λειτουργίας
Κάθε βρόχος επανάληψης βασίζεται σε τρεις συνιστώσες για να λειτουργήσει: την αρχικοποίηση, τη συνθήκη και την ενημέρωση. Η αρχικοποίηση ορίζει την αφετηρία του βρόχου, θέτοντας μια αρχική τιμή στον μετρητή μας. Στη συνέχεια, ελέγχεται η συνθήκη: όσο αυτή είναι αληθής (true
), οι εντολές μέσα στον βρόχο εκτελούνται.
Μόλις ολοκληρωθεί η εκτέλεση των εντολών, πραγματοποιείται η ενημέρωση, η οποία αλλάζει την τιμή του μετρητή (πχ., την αυξάνει ή τη μειώνει). Αυτό το βήμα είναι απαραίτητο για να διασφαλιστεί ότι η συνθήκη κάποια στιγμή θα γίνει ψευδής (false
), επιτρέποντας στον βρόχο να τερματίσει. Χωρίς σωστή ενημέρωση, ο βρόχος θα συνέχιζε να τρέχει επ’ αόριστον, οδηγώντας σε έναν άπειρο βρόχο.
Στη συνέχεια θα δούμε πως οι βασικές αρχές λειτουγίας εφαρμόζονται με μικρές διαφοροποιήσεις στα for
, while
και do...while
statements.
Το for
loop statement
Το for
statement είναι ίσως το πιο συχνά χρησιμοποιούμενο loop statement στον προγραμματισμό, ειδικά όταν γνωρίζουμε εκ των προτέρων το πόσες φορές θέλουμε να εκτελεστεί ένα block κώδικα. Είναι ιδανικό για επαναληπτικές διεργασίες που απαιτούν συγκεκριμένο αριθμό εκτελέσεων.
Σύνταξη
Η σύνταξη του for
loop statement είναι πολύ συγκεκριμένη και αποτελείται από τρία βασικά μέρη που βρίσκονται μέσα στις παρενθέσεις, χωρισμένα με ελληνικά ερωτηματικά (;
):
for (αρχικοποίηση; συνθήκη; ενημέρωση) {
// Ο κώδικας που θέλουμε να επαναληφθεί
}
Ας δούμε αναλυτικά τι κάνει το κάθε μέρος:
αρχικοποίηση: αυτό το κομμάτι εκτελείται μόνο μία φορά στην αρχή του βρόχου, πριν ξεκινήσει οποιαδήποτε επανάληψη. Συνήθως, εδώ δηλώνουμε και αρχικοποιούμε μια μεταβλητή που θα λειτουργήσει ως μετρητής (index) του βρόχου.
- Παράδειγμα:
let i = 0;
Ξεκινάμε τον μετρητή μας από το0
.
- Παράδειγμα:
συνθήκη: αυτό το μέρος ελέγχεται πριν από κάθε επανάληψη του βρόχου. Αν η συνθήκη είναι αληθής (
true
), τότε το block κώδικα μέσα στον βρόχο θα εκτελεστεί. Αν η συνθήκη γίνει ψευδής (false
), ο βρόχος τερματίζει και το πρόγραμμα συνεχίζει με τις εντολές που ακολουθούν μετά το βρόχο.- Παράδειγμα:
i < 5;
Ο βρόχος θα συνεχίσει να τρέχει όσο ο μετρητήςi
είναι μικρότερος του5
.
- Παράδειγμα:
ενημέρωση: αυτό το κομμάτι εκτελείται μετά από κάθε επανάληψη του βρόχου, αφού δηλαδή έχει εκτελεστεί το block κώδικα μέσα στο βρόχο. Συνήθως, εδώ αυξάνουμε ή μειώνουμε την τιμή του μετρητή.
- Παράδειγμα:
i++
Αυξάνουμε την τιμή τουi
κατά1
μετά από κάθε επανάληψη.
- Παράδειγμα:
Παραδείγματα
Ας δούμε ένα πλήρες παράδειγμα που εκτυπώνει τους αριθμούς από το 0
έως το 4
:
1for (let i = 0; i < 5; i++) {
2 // Αυτή η εντολή εκτελείται σε κάθε επανάληψη
3 console.log(i);
4}
Πώς λειτουργεί βήμα-βήμα:
let i = 0;
: ο μετρητήςi
αρχικοποιείται στην τιμή0
.i < 5;
: ελέγχεται αν το0
είναι μικρότερο του5
. Είναι αληθές, οπότε ο βρόχος συνεχίζει.console.log(i);
: εκτυπώνεται το0
.i++:
Το i αυξάνεται και γίνεται 1.- Επαναλαμβάνονται τα βήματα 2. εως 4. για άλλες τρείς φορές.
- Στην πέμπτη επανάληψη το expression
i++
αυξάνει τοi
που γίνεται5
. i < 5;
: ελέγχεται αν ισχύει η συνθήκη5 < 5
. Αυτό είναι ψευδές οπότε ο βρόχος σταματάει.
Τί να προσέξεις
Ενώ το for
loop είναι ένα πανίσχυρο εργαλείο, υπάρχουν μερικά λάθη που κάνουν συχνά τόσο αρχάριοι όσο και προχωρημένοι προγραμματιστές και είναι σημαντικό να τα προσέξουμε:
Άπειροι βρόχοι (infinite loops): Αυτό είναι ίσως το πιο συχνό λάθος. Ένα infinite loop συμβαίνει όταν η συνθήκη του βρόχου δεν γίνεται ποτέ ψευδής (false
). Αυτό σημαίνει ότι ο βρόχος συνεχίζει να τρέχει επ’ αόριστον, “κολλώντας” το πρόγραμμά που εκτελείται εκείνη την στιγμή ή ακόμα και ολόκληρο τον υπολογιστή (πχ., server). Συχνά οφείλεται στο ότι το βήμα ενημέρωσης δεν μεταβάλλει σωστά τον μετρητή ή η συνθήκη είναι λάθος διατυπωμένη. Το παρακάτω loop statement θα δημιουργήσει ένα infinite loop, επειδή η συνθήκη θα είναι για πάντα αληθής:
1for (let i = 0; i >= 0; i++) {
2 console.log("who wants to loop forever?");
3}
Off-by-One Errors (OBOE): Ένα off-by-one error (σφάλμα κατά ένα) συμβαίνει όταν ο βρόχος εκτελείται μία φορά παραπάνω ή μία φορά λιγότερο από όσες εκτιμούμε. Αυτό συχνά οφείλεται στη χρήση του λάθος τελεστή σύγκρισης στη συνθήκη (<
αντί για <=
, ή το αντίστροφο). Για παράδειγμα, αν σκοπός μας είναι να εκτυπώσουμε τους αριθμούς από το 1
έως το 5
, αρχικοποιόντας τον μετρητή με 1
, ο παρακάτω βρόχος θα εκτελεστεί μια φορά λιγότερη από αυτή που θέλουμε. Μπορείτε να μαντέψετε το γιατί;
1for (let i = 1; i < 5; i++) {
2 console.log(i);
3}
Η προσεκτική εξέταση της συνθήκης και του βήματος ενημέρωσης του μετρητή, είναι το κλειδί για να αποφεύγουμε αυτά τα κοινά προβλήματα.
Το while
loop statement
Το while
loop είναι άλλο loop statement που χρησιμοποιούμε κυρίως όταν δεν γνωρίζουμε εκ των προτέρων τον αριθμό επαναλήψεων που θα χρειαστεί να εκτελεστεί ο κώδικας. Είναι ιδανικό για σενάρια όπου η επανάληψη εξαρτάται από ένα γεγονός ή μια κατάσταση που περιμένουμε να αλλάξει, όπως η αναμονή για απάντηση από μια άλλη διεργασία.
Σύνταξη
Η σύνταξη του while
loop είναι πολύ απλή:
while (συνθήκη) {
// Ο κώδικας που θέλουμε να επαναληφθεί
}
- συνθήκη: αυτό είναι το μοναδικό και πιο σημαντικό μέρος του
while
loop. Είναι ένα epxression που γίνεται evaluate σεtrue
(αληθής) ήfalse
(ψευδής). Ο κώδικας μέσα στο block θα εκτελεστεί ξανά και ξανά, για όσο διάστημα η συνθήκη είναι αληθής. Μόλις η συνθήκη πάψει να είναι αληθής, ο βρόχος σταματάει να εκτελείται και το πρόγραμμα συνεχίζει με τις εντολές που ακολουθούν μετά τοwhile
statement.
Πιο αναλυτικά, το while
loop λειτουργεί ως εξής:
- Έλεγχος συνθήκης: Πριν από κάθε επανάληψη, ελέγχεται αν η συνθήκη είναι αληθής.
- Εκτέλεση κώδικα: Αν η συνθήκη είναι αληθής, το block κώδικα θα εκτελεστεί.
- Επανάληψη: Αφού εκτελεστεί ο κώδικας, το πρόγραμμα επιστρέφει στο βήμα 1. και ελέγχει ξανά τη συνθήκη.
- Τερματισμός: Αν η συνθήκη δεν είναι αληθής–είτε από την αρχή είτε γίνει false κατά τη διάρκεια εκτέλεσης–ο βρόχος τερματίζεται.
Είναι πάρα πολύ σημαντικό να διασφαλίσουμε ότι κάτι θα αλλάξει ώστε η συνθήκη να γίνει τελικά false
. Αν αυτό δεν συμβεί, τότε, όπως και στην περίπτωση του for
loop, θα προκύψει ένα infinite loop.
Παραδείγματα
Ας δούμε ένα παράδειγμα όπου χρησιμοποιούμε ένα while
loop για να εκτυπώσουμε τους αριθμούς από το 0
έως το 4
:
let count = 0; // Αρχικοποίηση του μετρητή πριν το loop
// Συνθήκη: όσο το 'count' είναι μικρότερο από 5
while (count < 5) {
console.log(count); // Εκτύπωση της τρέχουσας τιμής
count++; // Ενημέρωση: αύξηση του 'count' κατά 1
}
console.log("Ο βρόχος τελείωσε!");
Σε αυτό το παράδειγμα, αρχικά το count
είναι 0
. Η συνθήκη count < 5
είναι αληθής. Εκτυπώνεται το 0
, και μετά το count
γίνεται 1
. Αυτό συνεχίζεται μέχρι το count
να γίνει 5
. Τότε, η συνθήκη 5 < 5
παύει να είναι αληθής, και ο βρόχος σταματάει, εκτυπώνοντας το μήνυμα "Ο βρόχος τελείωσε!"
.
Πότε χρησιμοποιούμε while
αντί για for
Η επιλογή μεταξύ ενός while
loop και ενός for loop
εξαρτάται κυρίως από το αν γνωρίζουμε εκ των προτέρων τον ακριβή αριθμό των επαναλήψεων ή από το αν ο βρόχος πρέπει να συνεχίσει να τρέχει μέχρι να ικανοποιηθεί μια συγκεκριμένη συνθήκη.
Πιο συγκεκριμένα, χρησιμοποιούμε το while
loop όταν:
Ο αριθμός των επαναλήψεων δεν είναι γνωστός εκ των προτέρων. Αυτό είναι το βασικότερο κριτήριο. Το
while
loop είναι ιδανικό για σενάρια όπου η επανάληψη εξαρτάται από ένα γεγονός ή μια κατάσταση που μπορεί να αλλάξει οποιαδήποτε στιγμή. Για παράδειγμα, ένα παιχνίδι συνεχίζεται όσο ο παίκτης έχει “ζωές”.Η συνθήκη τερματισμού είναι πιο σημαντική από τον μετρητή. Αντί να μετράμε αυξάνωντας ή μειώνοντας έναν μετρητή, εφαρμόζουμε την λογική “όσο ισχύει η συνθήκη που με ενδιαφέρει, συνέχισε την εκτέλεση”.
Αντίθετα, χρησιμοποιούμε το for
loop όταν:
- Γνωρίζουμε ακριβώς πόσες φορές θέλουμε να γίνει η επανάληψη. Για παράδειγμα, αν θέλουμε να μετρήσουμε από το
1
έως το10
. Τοfor
loop “συγκεντρώνει” την αρχικοποίηση, τη συνθήκη και την ενημέρωση του μετρητή σε ένα σημείο, καθιστώντας το πιο ευανάγνωστο για τέτοιες περιπτώσεις.
Ενώ τεχνικά μπορούμε σχεδόν πάντα να μετατρέψουμε ένα for
loop σε while
και το αντίστροφο, η επιλογή του κατάλληλου statement κάνει τον κώδικά μας πιο ευανάγνωστο και πιο εύκολο στη συντήρηση.
Τί να προσέξεις
Όπως και με το for
loop, η μεγαλύτερη παγίδα όταν χρησιμοποιούμε ένα while
loop είναι οι άπειροι βρόχοι (infinite loops).
Infinite loops: ένα infinite loop συμβαίνει όταν η συνθήκη παραμένει συνεχώς αληθής (true
) και ποτέ δεν γίνεται ψευδής (false). Αυτό έχει ως αποτέλεσμα το πρόγραμμά μας να εκτελεί τον κώδικα μέσα στον βρόχο επ’ αόριστον, με τις συνέπειες που έχουμε αναφέρει ήδη.
Αλλαγή της συνθήκης: Για να αποφύγουμε έναν άπειρο βρόχο, είναι απολύτως απαραίτητο να υπάρχει κάπου μέσα στο block του βρόχου κάποια διεργασία που να επηρεάζει τη συνθήκη. Αυτή η αλλαγή θα πρέπει τελικά να καταστήσει τη συνθήκη ψευδή. Στο προηγούμενο μας παράδειγμα, η διεργασία που άλλαζε τη συνθήκη, καθιστώντας την ψευδή βρίσκεται στην γραμμή 5
:
1let count = 0;
2
3while (count < 5) {
4 console.log(count);
5 count++; // Ενημέρωση: αύξηση του 'count' κατά 1
6}
7
8console.log("Ο βρόχος τελείωσε!");
Για να αποφύγουμε τα παραπάνω προβλήματα, για κάθε while
loop που γράφουμε, θα πρέπει να απαντάμε στην ερώτηση: “Πώς θα σταματήσει αυτός ο βρόχος;” Αν δεν μπορούμε να δώσουμε απάντηση με βεβαιότητα, τότε είναι πολύ πιθανό να έχουμε δημιουργήσει έναν infinite loop.
Το do...while
loop statement
Το do...while
είναι ένα loop statement που μοιάζει πολύ με το while
loop, αλλά έχει μια σημαντική διαφορά: εγγυάται ότι ο κώδικας μέσα στον βρόχο θα εκτελεστεί τουλάχιστον μία φορά, ακόμα κι αν η συνθήκη είναι αρχικά ψευδής (false
).
Σύνταξη
Η σύνταξη του do...while
loop είναι η εξής:
do {
// Ο κώδικας που θέλουμε να επαναληφθεί
} while (συνθήκη);
do { ... }
: Αυτό το block κώδικα εκτελείται τουλάχιστον μια φορά και προηγείται του ελέγχου της συνθήκης.while (συνθήκη);
: Μετά την αρχική εκτέλεση τουdo
block, η συνθήκη αξιολογείται και ελέγχεται. Όσο η συνθήκη είναι αληθής (true
), ο βρόχος θα συνεχίσει να επαναλαμβάνεται, εκτελώντας ξανά τοdo
block και κατόπιν ελέγχοντας ξανά τη συνθήκη. Αν η συνθήκη είναι εκ των προτέρων ή γίνει ψευδής (false
), ο βρόχος τερματίζει.
Πότε χρησιμοποιούμε do...while
αντί για while
Η βασική διαφορά μεταξύ του do...while
και του “απλού” while
loop είναι το πότε ελέγχεται η συνθήκη:
Στο while
loop, η συνθήκη ελέγχεται στην αρχή του βρόχου. Αν η συνθήκη είναι αρχικά ψευδής, ο κώδικας μέσα στον βρόχο δεν θα εκτελεστεί ποτέ.
1let x = 10;
2
3// Η συνθήκη (10 < 5) είναι ψευδής από την αρχή
4while (x < 5) {
5 console.log("Αυτό δεν θα εμφανιστεί ποτέ (while loop)");
6 x++;
7}
8
9// Εμφανίζει: Έξω από το while loop. x = 10
10console.log(`Έξω από το while loop. x = ${x}`);
Στο do...while
loop, ο κώδικας μέσα στο do
block εκτελείται πριν ελεγχθεί η συνθήκη για πρώτη φορά. Αυτό σημαίνει ότι ο κώδικας θα “τρέξει” τουλάχιστον μία φορά, ανεξάρτητα από την αρχική τιμή της συνθήκης.
1let y = 10;
2
3do {
4 console.log(`Αυτό θα εμφανιστεί μία φορά! (do...while loop) y = ${y}`);
5 y++; // Το y γίνεται 11
6
7 // Η συνθήκη (11 < 5) είναι ψευδής,
8 // ο βρόχος σταματάει μετά την πρώτη εκτέλεση
9} while (y < 5);
10
11// Εμφανίζει: Έξω από το do...while loop. y = 11
12console.log(`Έξω από το do...while loop. y = ${y}`);
Όπως βλέπουμε στο παράδειγμα του do...while
, παρόλο που η συνθήκη (y < 5
) ήταν ψευδής όταν ελέγχθηκε για πρώτη φορά, ο κώδικας μέσα στο do
μπλοκ είχε ήδη προλάβει να εκτελεστεί μία φορά. Αυτή η συμπεριφορά καθιστά το do...while
loop ιδανικό για σενάρια όπου θέλουμε να εκτελέσουμε μια ενέργεια τουλάχιστον μία φορά πριν αποφασίσουμε αν χρειάζονται περαιτέρω επαναλήψεις.
Τα break
και continue
keywords
Η JavaScript (και οι περισσότερες γλώσσες προγραμματισμού) μας δίνει τη δυνατότητα να επηρεάσουμε την εκτέλεση των loop statements με δύο λέξεις-κλειδιά: το break
και το continue
. Αυτά τα keywords μας επιτρέπουν να τροποποιήσουμε τη συμπεριφορά ενός βρόχου σε συγκεκριμένες συνθήκες, δίνοντάς μας περισσότερο έλεγχο κατά την εκτέλεση τους. Τα break
και continue
χρησιμοποιούνται σε όλους τους τύπους loop statements.
break
: άμεσος τερματισμός και έξοδος από τον βρόχο
Η λέξη-κλειδί break
χρησιμοποιείται για να τερματίσει άμεσα την εκτέλεση του βρόχου στον οποίο βρίσκεται. Μόλις η διεργασία του προγράμματός μας συναντήσει ένα break
statement, ο βρόχος σταματάει αμέσως, και το πρόγραμμα συνεχίζει την εκτέλεσή του από την πρώτη εντολή που βρίσκεται αμέσως μετά τον βρόχο.
Για παράδειγμα, ας υποθέσουμε ότι ψάχνουμε έναν “μυστικό” αριθμό μέσα σε ένα εύρως τιμών. Μόλις τον βρούμε, δεν χρειάζεται να συνεχίσουμε την εκτέλεση του βρόχου.
1const secret = 5;
2
3for (let i = 1; i < 10; i++) {
4 console.log("Ελέγχω τον αριθμό: " + i);
5
6 if (i === secret) {
7 console.log("Ο μυστικός αριθμός είναι το: " + secret);
8 break; // Σταματάμε τον βρόχο αμέσως!
9 }
10}
11
12console.log("Συνέχεια προγράμματος");
Το παραπάνω απόσπασμα κώδικα θα τυπώσει τα παρακάτω μηνύματα στην κονσόλα μας:
- Ελέγχω τον αριθμό: 1
- Ελέγχω τον αριθμό: 2
- Ελέγχω τον αριθμό: 3
- Ελέγχω τον αριθμό: 4
- Ελέγχω τον αριθμό: 5
- Ο μυστικός αριθμός είναι το: 5
- Συνέχεια προγράμματος
Οι επαναλήψεις που υπολείπονται, από το 6
ως το 10
, δεν θα εκτελεστούν ποτέ λόγω του break
.
continue
: παράλειψη της τρέχουσας επανάληψης
Η λέξη-κλειδί continue
μας επιτρέπει να παραλείψουμε την εκτέλεση της τρέχουσας επανάληψης ενός βρόχου και να περάσουμε αμέσως στην επόμενη επανάληψη. Ο κώδικας που βρίσκεται μετά το continue
statement μέσα στο μπλοκ του βρόχου δεν θα εκτελεστεί μέχρι την επόμενη επανάληψη.
Ας δούμε ένα παράδειγμα όπου θα χρησιμοποιήσουμε ένα for
loop για να τυπώσουμε τους αριθμούς από το 1
έως το 10
, παραλείποντας τους μονούς αριθμούς:
1for (let i = 1; i <= 10; i++) {
2 // Ένας αριθμός είναι μονός αν το υπόλοιπο της διαίρεσής
3 // του με το 2 είναι 1. Ο τελεστής % δίνει το υπόλοιπο
4 // της διαίρεσης.
5 const remainder = i % 2;
6
7 if (remainder === 1) {
8 // Παραλείπουμε την υπόλοιπη επανάληψη για αυτόν τον μονό αριθμό
9 continue;
10 }
11
12 console.log("Ζυγός αριθμός: " + i);
13}
14
15console.log("Τέλος της εκτύπωσης ζυγών αριθμών.");
Το παραπάνω απόσπασμα κώδικα θα εμφανίσει τα παρακάτω μηνύματα στην κονσόλα μας:
- Ζυγός αριθμός: 2
- Ζυγός αριθμός: 4
- Ζυγός αριθμός: 6
- Ζυγός αριθμός: 8
- Ζυγός αριθμός: 10
- Τέλος της εκτύπωσης ζυγών αριθμών.
Ένθετοι βρόχοι (nested loops)
Μέχρι τώρα, έχουμε δει βρόχους που λειτουργούν ανεξάρτητα. Τι συμβαίνει όμως όταν χρειαζόμαστε να εκτελέσουμε έναν βρόχο μέσα σε έναν άλλο βρόχο; Εκεί ακριβώς μιλάμε για ένθετους βρόχους (nested loops) ή αλλιώς εμφωλευμένους βρόχους. Ένα nested loop είναι απλά ένα loop που βρίσκεται μέσα στο block ενός άλλου loop.
Πώς λειτουργούν;
Για να γινει πιο εύκολα κατανοητό, ας φανταστούμε για λίγο ένα ρολόι. Ο δείκτης των ωρών κινείται, και για κάθε ώρα, ο δείκτης των λεπτών κάνει μια πλήρη περιστροφή σε 60 βήματα. Αυτό είναι ένα παράδειγμα ένθετης λειτουργίας: το “εξωτερικό” loop (οι ώρες) ελέγχει το “εσωτερικό” loop (τα λεπτά).
Στον προγραμματισμό, ένα nested loop λειτουργεί ως εξής:
- Ο εξωτερικός βρόχος εκτελεί μία επανάληψη.
- Για κάθε μία από αυτές τις επαναλήψεις του εξωτερικού βρόχου, ο εσωτερικός βρόχος ολοκληρώνει όλες τις δικές του επαναλήψεις.
- Μόλις ο εσωτερικός βρόχος τελειώσει, ο εξωτερικός βρόχος προχωρά στην επόμενη επανάληψή του, και πάλι ο εσωτερικός βρόχος ξεκινά από την αρχή και ολοκληρώνει τις δικές του επαναλήψεις.
Παράδειγμα
Ας δούμε ένα απλό παράδειγμα με δύο nested for
loops για να εκτυπώσουμε έναν μικρό “πίνακα” πολλαπλασιασμού 2 x 2:
1for (let i = 1; i <= 2; i++) {
2 console.log("Εξωτερικός βρόχος: " + i);
3
4 for (let j = 1; j <= 2; j++) {
5 console.log(" Εσωτερικός βρόχος: " + j + ", Γινόμενο: " + i * j);
6 }
7}
Το παραπάνω παράδειγμα θα εκτυπώσει τα ακόλουθα μηνύματα:
- Εξωτερικός βρόχος: 1
- Εσωτερικός βρόχος: 1, Γινόμενο: 1
- Εσωτερικός βρόχος: 2, Γινόμενο: 2
- Εξωτερικός βρόχος: 2
- Εσωτερικός βρόχος: 1, Γινόμενο: 2
- Εσωτερικός βρόχος: 2, Γινόμενο: 4