====== Πως μπορώ να τερματίσω την εκτέλεση εμφολευμένων βρόχων όπως τερματίζεται η εκτέλεση ενός βρόχου από την break ====== Ξέρουμε ότι στον παρακάτω κώδικα η ''break'' διακόπτει την εκτέλεση μόνο του εσώτερου βρόχου (εδώ του //for j//): for (int k = 0; k < 3; ++k) { int i=0; while (i < 10) { for (int j = 0; j < 5; ++j) { if (j==3) { break; } printf("%d ", q[i]+j); } printf("\n"); ++i; } } Στο μάθημα παρουσιάσαμε τη μέθοδο με ένα boolean flag: bool breakEverything = false; for (int k = 0; k < 3; ++k) { int i=0; while (i < 10) { for (int j = 0; j < 5; ++j) { if (j==3) { breakEverything = true; break; } printf("%d ", q[i]+j); } //////// Αυτό το break σπάει τον ενδιάμεσο βρόχο, //////// αλλά δεν επαναφέρει την μεταβλητή breakEverything //////// Εάν θέλαμε να σταματά μέχρι εδώ το break θα έπρεπε //////// να επαναφέραμε τη μεταβλητή breakEverything if (breakEverything/* == true*/) { break; } printf("\n"); ++i; } //////// Αυτό το break σπάει και τον τελευταίο βρόχο, οπότε //////// πρέπει να επαναφέρουμε τη μεταβλητή breakEverything if (breakEverything/* == true*/) { breakEverything = false; break; } } Εδώ υπάρχει ένα πρόσθετο πρόβλημα. Ο κώδικας σε κάθε βρόχο θα πρέπει να είναι διαφορετικός, ανάλογα εάν είναι ενδιάμεσος βρόχος ή τελικός. Και αυτό έχει και τη συνέπεια ότι το πόσοι βρόχοι θα διακοπούν, δεν είναι μεταβλητό, δηλαδή δεν μπορεί το εσωτερικό break να "αποφασίσει" κάποιες φορές να σπάσει 1,2 ή και τους 3 βρόχους. Ο παρακάτω κώδικας μας επιτρέπει να είναι μεταβλητό το πόσο "μακρυά θα πάει" η διακοπή αυτή. int breakExtend = 0; for (int k=0; k<3; ++k) { int i = 0; while (i < 10) { for (int j = 0; j < 5; ++j) { if (j == 3) { //////// Εδώ η μεταβλητή λέει πόσα ακόμα loops //////// θέλουμε να διακόψει η break breakExtend = 2; break; } printf("%d ", q[i] + j); } //////// Εδώ εάν η μεταβλητή είναι 0 (ή μικρότερη) δεν //////// γίνεται break, αν όμως όχι, τότε μειώνεται κατά //////// ένα η τιμή της και γίνεται και ένα ακόμα break if (breakExtend-- > 0) { break; } printf("\n"); ++i; } //////// Εδώ εάν η μεταβλητή είναι 0 (ή μικρότερη) δεν γίνεται //////// break, αν όμως όχι, τότε μειώνεται κατά ένα η τιμή της //////// και γίνεται και ένα ακόμα break if (breakExtend-- > 0) { break; } } Βλέπουμε ότι το με αυτό τον τρόπο μπορεί να επιλέξει ο κώδικας πόσα loops θα πρέπει να σπάσουν. Επίσης έχει το πρόσθετο πλεονέκτημα ότι ο κώδικας που μπαίνει σε κάθε βρόχο είναι ο ίδιος, δεν διαφέρει από βρόχο σε βρόχο.