Η C όπως και οι υπόλοιπες γλώσσες προγραμματισμού, διαθέτουν εντολές για την επαναλαμβανόμενη εκτέλεση μπλοκ κώδικα μέσα σε ένα πρόγραμμα. Αυτή η διαδικασία επανάληψης προτάσεων, καλείται βρόγχος και οι προτάσεις που εκτελούνται αποτελούν το σώμα του βρόγχου.
Η C υποστηρίζει τρεις δομές επανάληψης, που υλοποιούνται με τις αντίστοιχες εντολές while, do – while και for. Αυτές οι δομές επανάληψης, είναι όμοιες μεταξύ τους, όπου η καθεμιά τους με ελάχιστες τροποποιήσεις μπορεί να υλοποιηθεί με μια από τις υπόλοιπες δομές επανάληψης.
Στην περίπτωση των δομών while, do – while και for, η επαναληπτική εκτέλεση των προτάσεων εξαρτάται από τον έλεγχο κάποιας συνθήκης. Ο έλεγχος αυτός στις δομές while και for γίνεται πριν από την εκτέλεση της κάθε επανάληψης των προτάσεων του βρόγχου και στη δομή do – while ο έλεγχος γίνεται μετά από την εκτέλεση των προτάσεων του βρόγχου.
Η εντολή while

Με την εντολή while μπορούμε να πετύχουμε επαναληπτική εκτέλεση μιας ή περισσότερων προτάσεων. Η επανάληψη ή μη επανάληψη των προτάσεων εξαρτάται από την τιμή μιας παράστασης συνθήκης. Η συνθήκη μπορεί να είναι οποιαδήποτε παράσταση που επιστρέφει μια αριθμητική τιμή. Αν η τιμή της είναι 0 θεωρείται ψευδής, διαφορετικά θεωρείται αληθής.
Το λογικό διάγραμμα του σχήματος δείχνει τη δομή της εντολής while, ενώ το συντακτικό της είναι το ακόλουθο:
while(συνθήκη) πρόταση;
ή
while(συνθήκη)
{
Προτάσεις βρόγχου;
}
Παράδειγμα: ο ακόλουθος βρόγχος while εκτελείται όσο η τιμή της μεταβλητής α είναι μεγαλύτερη από το 0,
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF; // Η θύρα Β σαν έξοδος
unsigned char a=20;
while(a>0)
{
PORTB=a;
--a;
}
while(1); // ατέρμον βρόγχος που σταματά τη ροή εκτέλεσης του προγράμματος.
}
Η εντολή do – while

Η εντολή do – while είναι παρόμοια με τη while, με τη διαφορά ότι ελέγχει την συνθήκη στο τέλος και όχι στην αρχή του βρόγχου. Η σύνταξη της do – while για μια απλή πρόταση είναι η εξής:
do
πρόταση;
while(συνθήκη);
Ενώ για μια σύνθετη πρόταση είναι η παρακάτω;
do
{
Προτάσεις του βρόγχου;
} while(συνθήκη);
Το λογικό διάγραμμα του σχήματος δείχνει τη δομή της do – while.
Σημείωση: οι προτάσεις μέσα στον βρόγχο do – while θα εκτελεστούν τουλάχιστον μια φορά ανεξάρτητα από την τιμή της συνθήκης. Όπως και στην εντολή while, η συνθήκη μπορεί να είναι οποιαδήποτε αριθμητική παράσταση.
Παράδειγμα: Στο πρόγραμμα που ακολουθεί, ο χρήστης εισάγει ένα αριθμό a στη θήρα C σε δυαδική μορφή. Οι προτάσεις του βρόγχου do – while εμφανίζουν την τιμή της μεταβλητής a στη θύρα Β και ακολούθως την μειώνουν κατά 1. Η επαναληπτική λειτουργία εκτελείται όσο η τιμή της μεταβλητής a είναι μεγαλύτερη από το μηδέν Π.χ αν ο χρήστης εισάγει τον αριθμό 5 στη θύρα C, ο βρόγχος θα εκτελεστεί 5 φορές. Ακόμα και αν ο χρήστης δώσει μηδενική τιμή, ο βρόγχος θα εκτελεστεί μια φορά.
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF; // Η θύρα Β σαν έξοδος
DDRC=0x00; // Η θύρα C σαν είσοδος
unsigned char a;
a=PINC;
do
{
PORTB=a;
--a;
} while(a>0);
while(1); // ατέρμον βρόγχος που σταματά τη ροή εκτέλεσης του προγράμματος.
}
Η εντολή for
Στους βρόγχους while και do – while δεν είναι καθορισμένο το πλήθος των επαναλήψεων. Για να μετράμε το πλήθος των επαναλήψεων θα πρέπει να χρησιμοποιήσουμε μια μεταβλητή σαν μετρητή.
Παράδειγμα: Στον κώδικα που ακολουθεί, προκαλεί το αναβόσβημα των LED που έχουμε συνδέσει στη θύρα Β ενός μικροελεγκτή AVR για 32 φορές. Η μεταβλητή i χρησιμοποιήται για την καταμέτρηση των επαναλήψεων,
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF;
int i = 1;
while(i<=32)
{
_delay_ms(1000);
PORTB=0x00;
_delay_ms(1000);
PORTB=0xFF;
i++;
}
}

Η εντολή for ενσωματώνει όλα τα στοιχεία του προηγούμενου παραδείγματος και είναι ο καταλληλότερος τρόπος για την επαναληπτική εκτέλεση προτάσεων για συγκεκριμένο αριθμό φορών. Η κλασική χρήση της εντολής for προϋποθέτει τη χρήση μιας μεταβλητής από την τιμή της οποίας εξαρτάται η επαναληπτική εκτέλεση του βρόγχου. Η μεταβλητή αυτή παίρνει μια αρχική τιμή και μετά από κάθε εκτέλεση του βρόγχου αυξάνεται ή μειώνεται. Η επαναληπτική διαδικασία σταματά όταν η τιμή της μεταβλητής ξεπεράσει τη μέγιστη (ή ελάχιστη) τιμή που έχει οριστεί.
Η εντολή for είναι ίσως η εντολή που χρησιμοποιείται πιο συχνά για επαναληπτικές διαδικασίες. Το συντακτικό της εντολής for είναι το εξής:
for(πρόταση_πριν; συνθήκη; πρόταση_μετά;)
πρόταση_βρόγχου;
Ή για σύνθετη πρόταση βρόγχου
for(πρόταση_πριν; συνθήκη; πρόταση_μετά;)
{
προτάσεις;
}
Η λειτουργία της for γίνεται κατανοητή από το διάγραμμα ροής του σχήματος.
Η πρόταση_πριν εκτελείται μια μόνο φορά στην αρχή του βρόγχου. Μετά ελέγχεται η συνθήκη. Αν είναι αληθής εκτελούνται μια φορά οι προτάσεις του βρόγχου for και αμέσως μετά η πρόταση_μετά. Έπειτα ελέγχεται πάλι η συνθήκη κ.ο.κ. Η επαναληπτική εκτέλεση των προτάσεων του βρόγχου θα σταματήσει όταν η συνθήκη γίνει ψευδής και ο έλεγχος του προγράμματος μεταφέρεται στην πρόταση αμέσως μετά από την for.
Παράδειγμα: Στο ακόλουθο πρόγραμμα η μεταβλητή i χρησιμοποιείται σαν μεταβλητή του βρόγχου for. Οκτώ LED είναι συνδεμένα στη θύρα Β ενός AVR μικροελεγκτή, και αναβοσβήνουν για 32 φορές.
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF;
int i;
for(i=1; i<=32; i++)
{
_delay_ms(1000);
PORTB=0x00;
_delay_ms(1000);
PORTB=0xFF;
}
while(1);
}
Στην αρχή η μεταβλητή i παίρνει τιμή 1 (i=1). Το πρόγραμμα ελέγχει αν η παράσταση i<=32 είναι αληθής. Αν είναι αληθής (είναι i<=32) εκτελεί τις εντολές του βρόγχου μια φορά και στη συνέχεια εκτελεί την πρόταση i++ αυξάνοντας το i κατά 1.
Μετά η διαδικασία συνεχίζεται και πάλι με τον έλεγχο της λογικής παράστασης κ.ο.κ.
Αν είναι ψευδής (δεν είναι i<=32) ο βρόγχος τερματίζεται και η ροή εκτέλεσης του προγράμματος πηγαίνει στην επόμενη εντολή της for που εδώ είναι ο ατέρμον βρόγχος while(1); ο οποίος προκαλεί το σταμάτημα του προγράμματος.
Στον ορισμό μιας εντολής for μπορούμε να χρησιμοποιήσουμε τον τελεστή κόμμα (,) όταν θέλουμε να χρησιμοποιήσουμε περισσότερες από μια παραστάσεις στον ορισμό της for, όπως φαίνεται στο ακόλουθο πρόγραμμα:
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF;
DDRC=0xFF;
int i,j;
for(i=1,j=9; i!=j; ++i,--j)
{
PORTB=i;
PORTC=j;
_delay_ms(1000);
}
while(1);
}
Το πρόγραμμα θα εμφανίσει τα ακόλουθα αποτελέσματα:
PORTB PORTC
-------------
0x01 0x09
0x02 0x08
0x03 0x07
0x04 0x06
Σε αυτό το πρόγραμμα η πρόταση i=1,j=9; θα εκτελεστεί μια φορά, η οποία θα καταχωρήσει στη μεταβλητή i την τιμή 0x01 και στη j την τιμή 0x09. Πριν την εκτέλεση του κάθε βρόγχου, το πρόγραμμα θα ελέγξει αν το i είναι διάφορο του j. Αν είναι θα εκτελέσει τις εντολές του βρόγχου και θα εμφανίσει τις τιμές των i και j.
Μετά από την εκτέλεση του βρόγχου, το πρόγραμμα θα εκτελέσει την πρόταση ++i, – -j η οποία αυξάνει το i κατά 1 και μειώνει το j κατά 1. Στη συνέχεια ελέγχεται η συνθήκη και ο βρόγχος θα σταματήσει να εκτελείται όταν το i γίνει ίσο με το j.
Η εντολή break
Κατά τον προγραμματισμό κάποιες φορές χρειάζεται να διακόψουμε την επαναληπτική εκτέλεση ενός βρόγχου πριν αυτός ολοκληρωθεί. Για παράδειγμα, στο ακόλουθο απόσπασμα κώδικα, ο μικροελεγκτής παίρνει συνεχώς αριθμούς από τη θύρα Β και τους στέλνει στη θύρα C και σταματά όταν ο αριθμός είναι ίσος με το μηδέν.
do
{
a=PINB;
PORTC=a;
} while(a!=0);
Ακόμα και όταν δοθεί στη θύρα Β ο αριθμός 0, πριν σταματήσει ο βρόγχος αυτός ο αριθμός θα σταλεί στη θύρα C. Συνήθως όμως θέλουμε η επαναληπτική λειτουργία να σταματάει άμεσα. Αυτό γίνεται με τη χρήση της εντολής break όπως φαίνεται στη συνέχεια.
do
{
a=PINB;
if(a==0) break;
PORTC=a;
} while(a!=0);
Όταν η τιμή της μεταβλητής a πάρει την τιμή μηδέν η επαναληπτική διαδικασία των εντολών διακόπτεται με την χρήση της break; Το προηγούμενο απόσπασμα κώδικα μπορεί να γραφεί με τον βρόγχο while ως εξής:
while(1)
{
a=PINB;
if(a==0) break;
PORTC=a
}
Η εντολή break διακόπτει την εκτέλεση μιας επαναληπτικής διαδικασίας και μεταφέρει τον έλεγχο του προγράμματος αμέσως μετά από μια επαναληπτική δομή while, do – while ή for.
Η εντολή break χρησιμοποιείται στην εντολή switch όταν θέλουμε να τερματίσουμε την εκτέλεση των προτάσεων μιας case. Η break χρησιμοποιείται για τον τερματισμό ενός βρόγχου while, do – while ή for.
Η εντολή continue
Η εντολή continue έχει παρόμοια λειτουργία με την break με τη διαφορά ότι δεν τερματίζει το βρόγχο όπως κάνει η break αλλά επιβάλλει την εκτέλεση της επόμενης επανάληψης παραλείποντας τις ενδιάμεσες εντολές
Η εντολή continue μεταφέρει τον έλεγχο του προγράμματος αμέσως μετά την τελευταία πρόταση του βρόγχου αλλά πριν από το τέλος του (δεξιό άγκιστρο). Στην συνέχεια εφόσον ικανοποιείται η συνθήκη εκτελείται κανονικά η επόμενη επανάληψη του βρόγχου. Έτσι παραλείπεται η εκτέλεση των προτάσεων από την εντολή continue μέχρι το τέλος του βρόγχου.
Στο ακόλουθο απόσπασμα κώδικα φαίνεται μια επαναληπτική διαδικασία με την εντολή while στην οποία διαβάζεται η τιμή από τη θύρα Β και όσο αυτή η τιμή είναι μικρότερη από 32 στέλνεται στη θύρα C.
while(1)
{
a=PINB;
if(a>=32) continue;
PORTC=a;
}