====== Πως μπορώ να τερματίσω την εκτέλεση εμφολευμένων βρόχων όπως τερματίζεται η εκτέλεση ενός βρόχου από την 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 θα πρέπει να σπάσουν. Επίσης έχει το πρόσθετο πλεονέκτημα ότι ο κώδικας που μπαίνει σε κάθε βρόχο είναι ο ίδιος, δεν διαφέρει από βρόχο σε βρόχο.