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

Μια λογική μεταβλητή ή λογική έκφραση, ορίζεται σαν εκείνη που μπορεί να πάρει μια από τις δυο λογικές τιμές “true” ή “false”. Ένας άλλος τρόπος για να εκφράσουμε τις λογικές τιμές είναι με “0” ή “1” αντίστοιχα.

Για παράδειγμα θεωρήστε τις κάτωθι μεταβλητές με τις τιμές τους:

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

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

!a // Αυτή η λογική έκφραση έχει τιμή true
a && b // Αυτή η λογική έκφραση έχει τιμή false
b && c // Αυτή η λογική έκφραση έχει τιμή true
(a && b) || c // Αυτή η λογική έκφραση έχει τιμή 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 a = 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 εκτιμάται πρώτα η συνθήκη, πριν εισέλθει στο 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 να σταματήσει την εκτέλεση μέσα σε ένα βρόγχο και να κατευθυνθεί στην αρχή του βρόγχου και την εκ νέου εκτίμηση της συνθήκης.