7. Λογικές εκφράσεις και βρόγχοι

Οι λογικές εκφράσεις που χρησιμοποιούνται στις εντολές διακλάδωσης, παίρνουν δυο τιμές: HIGH ή LOW (true or false). Οι λογικές εκφράσεις σε αυτές τις εντολές αποτελούν την συνθήκη για τον έλεγχο της ροής του προγράμματος.

Μπορούμε να δημιουργήσουμε λογικές εκφράσεις με λογικές μεταβλητές, που συνδέονται μεταξύ τους με τους λογικούς τελεστές, όπως το λογικό «όχι» (!), το λογικό «και» (&&), και το λογικό «ή» (||). Για παράδειγμα θεωρούμε τις ακόλουθες λογικές μεταβλητές οι οποίες είναι αρχικοποιημένες με τις αντίστοιχες αρχικές τιμές τους.

boolean a, b, c;
a = false;
b = true;
c = true;

Με αυτές τις λογικές μεταβλητές ορίζουμε τις ακόλουθες λογικές εκφράσεις με την σημειωμένη λογική τιμή.

!a   // (συμπλήρωμα NOT) Αυτή η λογική έκφραση έχει τιμή “true”
a && b  // (λογικό AND) Αυτή η λογική έκφραση έχει τιμή “false”
a || c    // (λογικό OR) Αυτή η λογική έκφραση έχει τιμή “true”
(b && c) || a // Αυτή η λογική έκφραση έχει τιμή “true”

Λογικές εκφράσεις μπορούμε να σχηματίσουμε με τις συνήθης αριθμητικές μεταβλητές κάνοντας χρήση των σχεσιακών τελεστών, δηλαδή τους:

== είναι ίσο με
!= είναι διάφορο από
> είναι μεγαλύτερο από
< είναι μικρότερο από
>= είναι μεγαλύτερο ή ίσο από
<= είναι μικρότερο ή ίσο από

Ας δούμε τα ακόλουθα παραδείγματα. Ορίζουμε την μεταβλητή a τύπου int με τιμή:

int a = 5;

Οι ακόλουθες λογικές εκφράσεις που σχηματίζονται με με ένα συνδυασμό από μεταβλητές, αριθμητικές τιμές και σχεσιακούς τελεστές, έχουν τιμή “true” ή “false” όπως αναγράφονται δίπλα σε μορφή σχολίου

a == 4 // αυτή η έκφραση έχει τιμή false.
a != 6 // αυτή η έκφραση έχει τιμή true.
a > 10 // αυτή η έκφραση έχει τιμή false.
a < 15 // αυτή η έκφραση έχει τιμή true.
a >= 5 // αυτή η έκφραση έχει τιμή true.
a<=10 // αυτή η έκφραση έχει τιμή true.

Η εντολή διακλάδωσης if

Μια από τις εντολές διακλάδωσης είναι η εντολή if. Η πιο απλή μορφή της είναι η εξής:

if(condition) {
code block
}

Η λογική έκφραση condition εκτιμάται και αν έχει τιμή true (αληθής) εκτελούνται οι εντολές που είναι μέσα στο block, αλλιώς αν η λογική έκφραση έχει τιμή false (ψευδής) οι εντολές του block παρακάμπτονται.

Παράδειγμα:

int c = 2;
if(c == 10)  {
       Serial.println(“ The value is 10”)
}

Εδώ η μεταβλητή c έχει τιμή 2 που είναι διαφορετική από 10 και έτσι η λογική συνθήκη της if είναι ψευδής και έτσι παρακάμπτεται η εντολή μέσα στις αγκύλες. Πρέπει να προσέξουμε ότι το σύμβολο “=” είναι ο τελεστής εκχώρησης ενώ ο “==’ είναι ο λογικός τελεστής ισότητας.

Μπορούμε να γράψουμε πολλές εντολές if διαδοχικά στη σειρά. Αυτό έχει σαν αποτέλεσμα να εκτελεστεί το block εντολών που επιθυμούμε βάσει την λογική έκφραση που αληθεύει.

Παράδειγμα:

int x = 5;
if(x==5) {
             Serial.println(“The value is 5”);
}
if(x<10) {
            Serial.println(“The value is less than 100”);
}
if(x>10){
            Serial.println(“The value is more than 100”);
}

Η συνθήκη της πρώτης if του παραδείγματος έχει τιμή true επομένως εκτελείται το πρώτο block εντολών μετά από αυτή. Όμοια για την δεύτερη if η συνθήκη της έχει τη λογική τιμή true επομένως εκτελούνται και οι εντολές του δεύτερου block. Παρακάτω η συνθήκη της τρίτης if έχει τιμή false άρα δεν εκτελούνται οι εντολές του block που ακολουθούνται από αυτή.

Στην εντολή διακλάδωσης που παρουσιάσαμε προηγουμένως, το block εντολών εκτελείται όταν η συνθήκη (λογική έκφραση) έχει τιμή true.

Υπάρχει και μια άλλη μορφή if που όταν η συνθήκη έχει τιμή false να εκτελείται ένα άλλο block εντολών εκείνο μετά το else.

Δηλαδή:

if(condition) {
block1
} else {
block2
}

Παράδειγμα

int a=5;
if(a<0) {
        Serial.println(“The number is negative”);
}
else {
        Serial.println(“The number is positive”);
}

Εδώ η συνθήκη μέσα στην if έχει τιμή false και έτσι δεν εκτελούνται οι εντολές που ακολουθούν μέσα στο πρώτο block. Επειδή η συνθήκη της if έχει τιμή false εκτελούνται οι εντολές του block ακριβώς μετά την else. Δηλαδή σε αυτό το παράδειγμα θα προβληθεί στο Serial Monitor το μήνυμα “The number is positive”

Επίσης μπορούμε μετά την αρχική if να βάλουμε πολλές εντολές else if όπως φαίνεται ακολούθως:

if(condition1) {
block1
} else if(condition2){
block2
}else if(contition3){
block3
} else {
block4
}

Αν η έκφραση condition1 είναι αληθής εκτελούνται οι εντολές του block1. Αν όχι και η έκφραση condition2 είναι αληθής εκτελούνται οι εντολές του block2. Αν οι λογικές εκφράσεις condition1 και condition2 είναι ψευδής και η έκφραση condition3 είναι αληθής εκτελείται το block3. Αν όλες οι λογικές εκφράσεις είναι ψευδής, εκτελείται το block εντολών του else δηλαδή το block4. Σημείωση: κατά την εκτέλεση αυτού του δενδροειδούς if else μόνο ένα block εντολών εκτελείται και στη συνέχεια η ροή του προγράμματος πηγαίνει έξω και από αυτή την δενδροειδή εντολή if – else.

Βρόγχοι εντολών

Πολλές φορές στον προγραμματισμό χρειάζεται να εκτελείται ένα block κώδικα επαναλαμβανόμενα, ξανά και ξανά, σε όλη τη διάρκεια που μια συνθήκη (λογική έκφραση) να έχει τιμή true. Αυτό μπορεί να γίνει με τις εξής εντολές: while, do – while και for.

Στον προγραμματισμό Arduino, το block κώδικα μέσα στη συνάρτηση loop() εκτελείται ξανά και ξανά, χωρίς να υπάρχει συνθήκη ελέγχου, σε αντίθεση με τις εντολές while, do – while και for.

Ο βρόγχος while

Η βασική μορφή του βρόγχου while είναι η εξής:

while (condition) {
code block
}

όταν η ροή του προγράμματος φτάσει σε αυτή την εντολή, εκτιμάται η συνθήκη (condition) και αν είναι true εκτελείται το block κώδικα και μετά ξαναεκτιμάται η συνθήκη. Αν είναι true ξαναεκτελείται το block κώδικα, έπειτα ξαναεκτημάται η συνθήκη και αν π.χ είναι false σταματά να εκτελείται το block κώδικα και η ροή του προγράμματος πάει στην επόμενη εντολή.

Παράδειγμα

void setup() {
           Serial.begin(9600);
            int counter = 1;
            while (counter < 11) {
                 Serial.print(“The counter value is “);
                 Serial.println(counter);
                 counter = counter + 1;
              }
              Serial.println(“ The loop  has ended”);
}
void loop() {
}

Ανεβάζουμε το πρόγραμμα στο Arduino και το τρέχουμε. Ανοίγουμε το Serial Monitor και βλέπουμε να εκτυπώνονται δέκα αριθμημένες προτάσεις.

Ο βρόγχος do – while

Στην εντολή while εκτιμάται πρώτα η συνθήκη, πριν η CPU εισέλθει στο block εντολών. Υπάρχουν περιπτώσεις που θα θέλαμε να εκτελέστει το block εντολών, πριν εκτιμηθεί η συνθήκη. Αυτό μπορεί να γίνει με την εντολή do – while, όπως φαίνεται παρακάτω:

do {
code block
}while (condition)

Εδώ ο κώδικας μέσα στο block θα τρέξει υποχρεωτικά μια φορά, έστω κι αν η συνθήκη ήταν αρχικά false

Παράδειγμα

void setup() {
       Serial.begin(9600);
       int counter = 1;
       do   {
             Serial.print(“The value of the counter is “);
             Serial.println(counter);
             counter = counter + 1;
       }while (counter < 1);
      }
void loop() {
}

Εδώ η συνθήκη μέσα στη while είναι πάντα false, αλλά επειδή χρησιμοποιούμε την εντολή do – while, το block εντολών εκτελείται τουλάχιστον μια φορά, πριν εκτιμηθεί η συνθήκη μέσα στη do – while.

Ο βρόγχος for

Μια άλλη εντολή που χρησιμοποιεί βρόγχο είναι η for, όπου η βασική της μορφή είναι η ακόλουθη:

for(statment1; condition; statment2) {
code block
}

Η πρώτη παράμετρος στη κεφαλίδα της for είναι μια εντολή που εκτελείται μια φορά στην αρχή πριν το block κώδικα αρχίζει να εκτελείται. Στην συνέχεια εκτιμάται η συνθήκη και αν είναι true εκτελείται το block κώδικα. Έπειτα εκτελείται η τρίτη εντολή μέσα στη κεφαλίδα της for. Εκτιμάται ξανά η συνθήκη που υπάρχει στην κεφαλίδα της for. Αν είναι true εκτελείται το block κώδικα και αν είναι false παρακάμπτεται το block κώδικα και η ροή εκτέλεσης συνεχίζεται με την επόμενη εντολή.

Παράδειγμα

void setup() {
        Serial.begin(9600);
        int counter;
        for (counter=0; counter < 14;  counter++) {
           Serial.print(“The counter value is “);
           Serial.println(counter);
     }
     Serial.println(“This is the end of the loop”);
}
void loop () {
}

Όταν ανεβάσουμε στο Arduino και τρέξουμε τον κώδικα αυτό θα δούμε στο Serial Monitor δεκατέσσερις αριθμημένες όμοιες προτάσεις.

Οι εντολές break και continue

Χρησιμοποιούμε την εντολή break όταν θέλουμε η ροή εκτέλεσης του προγράμματος να φύγει από ένα βρόγχο, πριν η συνθήκη τερματίσει τον βρόγχο.

Αντί η ροή πηδήξει έξω από ένα βρόγχο, η εντολή continue λέει στο Arduino να σταματήσει την εκτέλεση μέσα σε ένα βρόγχο και να κατευθυνθεί στην αρχή του βρόγχου και την εκ νέου εκτίμηση της συνθήκης.