User Tools

Site Tools


qna:misc:good-practices:multiple-loop-break

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

qna/misc/good-practices/multiple-loop-break.txt · Last modified: 2021/04/03 22:39 by xallos