4 #.Μάθημα Προγραμματισμού με τη C++




Σελίδα1 - ΒΡΟΧΟΙ

Οι βρόχοι αναγκάζουν ένα τμήμα κώδικα να επαναλαμβάνεται. Η επανάληψη συνεχίζεται όσο μία λογική συνθήκη είναι αληθής. Όταν η συνθήκη είναι ψευδής, ο βρόχος (κύκλος) τελειώνει και ο έλεγχος του προγράμματος συνεχίζεται παρακάτω. Στη C++ υπάρχουν τρία είδη βρόχων: ο βρόχος for, ο βρόχος while και ο βρόχος do.
Βρόχος for
Ο βρόχος for μοιάζει να είναι ο πιο κατανοητός από τους βρόχους της C++. Όλα τα στοιχεία ελέγχου του, είναι συγκεντρωμένα σε ένα μέρος και δεν είναι διάσπαρτα όπως στους άλλους βρόχους. Επίσης ο βρόχος for είναι μια βασική έννοια και υπάρχει σε όλες τις γλώσσες προγραμματισμού.
Αυτό που θα πρέπει να θυμάστε όμως, είναι σε ποιες περιπτώσεις κάνουμε χρήση αυτού του βρόχου. Ο βρόχος for χρησιμοποιείται όταν γνωρίζουμε από πριν τον αριθμό των επαναλήψεων. Όταν γνωρίζουμε πριν ακόμη μπούμε στον βρόχο, τον αριθμό των επαναλήψεων του κώδικα.
Ο βρόχος for συντάσσεται ως εξής:
Μετά τη δεσμευμένη λέξη for ακολουθούν μέσα σε παρένθεση οι οδηγίες εκτέλεσης του βρόχου. Μία μεταβλητή παίζει το ρόλο του μετρητή των επαναλήψεων. Είπαμε πως χρησιμοποιούμε τον βρόχο for όταν γνωρίζουμε πόσες φορές θα επαναλάβουμε κάτι. Έτσι η μεταβλητή-μετρητής λαμβάνει αρχική τιμή. Αυτή η εντολή εκτελείται μόνο την πρώτη φορά, στην αρχή του βρόχου. Ακολουθεί μία λογική συνθήκη. Όσο η λογική συνθήκη είναι αληθής ο βρόχος θα επαναλαμβάνει τις εντολές που περιέχει. Όταν η λογική συνθήκη γίνει ψευδής, ο έλεγχος του προγράμματος μεταπηδά έξω από το βρόχο και συνεχίζει με το υπόλοιπο πρόγραμμα. Ο εξέταση της λογικής συνθήκης γίνεται πριν ο έλεγχος του προγράμματος εισέλθει στο βρόχο. Η τελευταία παράμετρος μέσα στις παρενθέσεις είναι η αύξηση του μετρητή. Είδαμε ότι ο τελεστή ++ αυξάνει την τιμή της μεταβλητής κατά μία μονάδα.
Όταν θέλουμε ο βρόχος να εκτελεί περισσότερες από μία εντολές τότε αυτές τις εσωκλείουμε μέσα σε άγκιστρα.


Στο παραπάνω παράδειγμα ο μετρητής j λαμβάνει αρχική τιμή 0 και σε κάθε επανάληψη του βρόχου αυξάνεται κατά μία μονάδα. Η τελευταία φορά που η λογική συνθήκη (j<10) θα είναι αληθής και θα έχουμε επανάληψη των εντολών θα είναι για j ίσο με 9. Έτσι οι εντολές θα επαναληφθούν 10 φορές. Όταν το j γίνει 10 τότε η λογική συνθήκη (10<10) θα γίνει ψευδής και ο έλεγχος του προγράμματος θα βγει έξω από τον βρόχο, συνεχίζοντας με το υπόλοιπο πρόγραμμα.
Έτσι ο βρόχος εκτελέστηκε 10 φορές και η μεταβλητή-μετρητής διατρέχει τις τιμές από το 0 έως το 9. Εάν θέλαμε να τροποποιήσουμε τον βρόχο for έτσι ώστε ο μετρητής να διατρέχει τις τιμές από το 1 έως το 10, θα γράφαμε:
for (j=1; j<=10; j++)
   εντολή; 
Το επόμενο παράδειγμα εμφανίζει στην οθόνη τους αριθμούς από το ένα έως το δέκα:
#include <iostream>
void main()
{
  int j;
  for (j=1; j<=10; j++)
     cout<<j << endl;
}
Χρησιμοποιούμε τον βρόχο for διότι γνωρίζουμε από πριν ότι θα επαναλάβουμε μία εντολή 10 φορές. Έτσι βάζουμε τη μεταβλητή j να είναι η μεταβλητή-μετρητής του βρόχου και να διατρέξει τις τιμές από το 1 έως το 10. Σε κάθε επανάληψη εμφανίζουμε την τιμή του j στην οθόνη.
Στο επόμενο παράδειγμα θα εμφανίσουμε τους αριθμούς από το 1 έως το 10 υψωμένους στην τρίτη δύναμη.
#include <iostream>
void main()
{
  int j;
  for (j=1; j<=10; j++)
  {
     int kivos = j * j * j ;
     cout << kivos << endl;
  }
}
Σε αυτή την περίπτωση ο βρόχος for επαναλαμβάνει περισσότερες από μία εντολές, γι΄ αυτό και τις εσωκλείουμε σε άγκιστρα. Παρατηρείστε επίσης την ακέραια μεταβλητή kivos η οποία δηλώθηκε μέσα στο σώμα του βρόχου. Όταν μιλούσαμε για τις μεταβλητές είχαμε αναφέρει την εμβέλεια των μεταβλητών. Η μεταβλητή kivos δηλώθηκε μέσα στο σώμα του βρόχου, για αυτό και η εμβέλειά της είναι μόνο μέσα στο σώμα του βρόχου. Δεν μπορούμε να την χρησιμοποιήσουμε έξω από αυτόν. Αυτό είναι συχνά καλό για τους προγραμματιστές, γιατί μπορούν να χρησιμοποιούν σε διαφορετικούς βρόχους τα ίδια ονόματα μεταβλητών, εφόσον αυτές είναι «τοπικές» μόνο μέσα στους βρόχους.
Επίσης πολλοί προγραμματιστές δηλώνουν τις μεταβλητές ακριβώς στο σημείο που τις χρησιμοποιούν. Έτσι μη σας φανεί περίεργο μία τέτοια διατύπωση:
for (int j=1; j<=10; j++)
Επίσης η αλλαγή από επανάληψη σε επανάληψη δεν είναι απαραίτητο να αυξάνει τη μεταβλητή του βρόχου, μπορεί κάλλιστα να την μειώνει. Το επόμενο παράδειγμα υπολογίζει το παραγοντικό ενός αριθμού που δίνει ο χρήστης:
#include <iostream>
void main()
{
  int n;
  long parag = 1;
  cout << "Δώσε έναν ακέραιο αριθμό: ";
  cin >> n ;
  for (int j=n; j>0; j--)
  {
    parag = parag * j ;
  }
  cout << "Το παραγοντικό είναι: "<< parag ;
}

Όπως βλέπουμε η μεταβλητή του βρόχου j σε αυτή την περίπτωση μειώνεται. Επίσης η μεταβολή από επανάληψη σε επανάληψη θα μπορούσε να γίνεται σε μια άλλη μεταβλητή ώστε να οδηγήσει κάποτε τη λογική συνθήκη στο να πάρει ψευδή τιμή, αλλά αυτό είναι κάτι που δεν θα το εξετάσουμε προς το παρόν.

Σελίδα2 - Βρόχος while
Τονίσαμε ότι ο βρόχος for χρησιμοποιείται όταν ξέρουμε τον αριθμό των επαναλήψεων. Τι γίνεται όμως όταν θέλουμε να επαναλαμβάνονται κάποιες εντολές, χωρίς να ξέρουμε από πριν τον αριθμό των επαναλήψεων; Σε αυτές τις περιπτώσεις χρησιμοποιούμε τους βρόχους while και do. Οι δύο αυτοί βρόχοι βασίζονται σε μία λογική συνθήκη, ο έλεγχος της οποίας καθορίζει εάν θα επαναλάβουν ακόμη έναν κύκλο ή όχι. Η διαφορά τους έγκειται στο ότι ο βρόχος while κάνει τον έλεγχο πριν ξεκινήσει το σώμα του, ενώ ο βρόχος do στο τέλος.
Ο βρόχος while συντάσσεται ως εξής:
Για να επαναλάβει τις εντολές του ο βρόχος while ελέγχει τη λογική συνθήκη και εάν αυτή είναι αληθής τότε εισέρχεται στο σώμα του και επαναλαμβάνει τις εντολές που του έχουμε ορίσει. Όταν εκτελέσει όλες τις εντολές του ο έλεγχος μεταβιβάζεται πάλι στην αρχή και επανεξετάζεται η λογική συνθήκη. Όσο η λογική συνθήκη παραμένει αληθής ο βρόχος θα επαναλαμβάνεται ξανά και ξανά. Όταν η λογική συνθήκη γίνει ψευδής τότε ο έλεγχος του προγράμματος δεν θα ξαναμπεί στο σώμα του βρόχου, αλλά θα συνεχίσει με το υπόλοιπο πρόγραμμα μετά από αυτόν.
Στο επόμενο παράδειγμα ζητάμε από τον χρήστη να δώσει έναν ακέραιο αριθμό και τον εμφανίζουμε στην οθόνη. Ο βρόχος σταματά όταν ο χρήστης δώσει το 0. Σε αυτή την περίπτωση δεν γνωρίζουμε πόσες φορές θα εκτελεστεί ο βρόχος. Όσο ο χρήστης επιμένει να μην δίνει για είσοδο το 0 ο βρόχος θα εκτελείται ξανά και ξανά. Επειδή δεν γνωρίζουμε τον αριθμό των επαναλήψεων δεν μπορούμε να χρησιμοποιήσουμε το βρόχο for. Επίσης η επανάληψη των εντολών βασίζεται σε μια λογική συνθήκη. Αυτό μας υποδεικνύει τη χρησιμοποίηση βρόχου while για την επανάληψη:
#include <iostream>
void main()
{
  int n = 1;
  cout << "Για τέλος δώσε 0 "<< endl;
  while (n != 0)
  {
   cout << "Δώσε έναν ακέραιο αριθμό: ";
   cin >> n ;
   cout << "Πληκτρολόγησες: "<<n <<endl;
  }
}
Ο βρόχος while όπως και ο βρόχος do που θα εξετάσουμε στη συνέχεια μοιάζουν με μια απλοποιημένη έκδοση του βρόχου for. Περιέχουν μια λογική συνθήκη, όμως δεν περιέχουν κάποια εντολή απόδοσης αρχικής τιμής ή αύξησης. Ωστόσο τα πράγματα δεν είναι ακριβώς έτσι:
Θα πρέπει οι μεταβλητές που παίρνουν μέρος στη λογική συνθήκη να έχουν δηλωθεί και να έχουν λάβει τιμή, πριν από την εκτίμηση της λογικής συνθήκης.
Θα πρέπει μέσα στο βρόχο να υπάρχει μια τέτοια εντολή, η οποία να αλλάζει την τιμή κάποιας μεταβλητής που συμμετέχει στη λογική συνθήκη, έτσι ώστε να αντιστρέψει τη λογική τιμή της συνθήκης και ο βρόχος κάποτε να τερματιστεί. Ειδάλλως ο βρόχος δεν θα τερματίζεται ποτέ!
Ο βρόχος while ελέγχει τη λογική συνθήκη και απαιτεί αυτή να είναι αληθής ώστε να εκτελέσει τις εντολές του. Εάν η λογική συνθήκη είναι εξ αρχής ψευδής τότε δεν θα εκτελεστεί ούτε μία φορά.

Σελίδα3 - Βρόχος do
Όπως προαναφέρθηκε σε ένα βρόχο while η λογική συνθήκη ελέγχεται στην αρχή. Εάν αυτή είναι ψευδής τότε το σώμα του βρόχου δεν εκτελείται καθόλου. Σε μερικές περιπτώσεις όμως θέλουμε να εξασφαλίσουμε ότι το σώμα του βρόχου θα εκτελεστεί έστω και μία φορά, ανεξάρτητα από την τιμή της λογικής συνθήκης. Σε αυτή την περίπτωση χρησιμοποιούμε τον βρόχο do, ο οποίος βάζει τον έλεγχο της λογικής συνθήκης στο τέλος του βρόχου.
Ο βρόχος do συντάσσεται ως εξής:

Πρώτα η δεσμευμένη λέξη do σηματοδοτεί την έναρξη του βρόχου. Έπειτα ακολουθεί το σώμα του βρόχου, το οποίο εάν αποτελείται από περισσότερες από μία εντολές περικλείεται μέσα σε άγκιστρα. Στο τέλος υπάρχει η λέξη while με τη λογική συνθήκη που ελέγχει μέσα σε παρενθέσεις. Να δώσετε προσοχή στο ερωτηματικό που υπάρχει στο τέλος το οποίο σηματοδοτεί το τέλος της πρότασης.
Όσο η λογική συνθήκη είναι αληθής, ο βρόχος θα εκτελεί τις εντολές του. Όταν η λογική συνθήκη είναι ψευδής, ο έλεγχος του προγράμματος θα συνεχίσει παρακάτω.
Όπως βλέπετε ο έλεγχος της λογικής συνθήκης με τη δεσμευμένη λέξη while γίνεται στο τέλος του βρόχου. Αυτό εξασφαλίζει την εκτέλεση του βρόχου έστω και για μια φορά, ακόμα και όταν η λογική συνθήκη είναι ψευδής.
Δεν θα πρέπει να παραλείψετε να γράψετε μία τέτοια εντολή μέσα στο σώμα του βρόχου, που να οδηγεί τη λογική συνθήκη σε ψευδή τιμή ώστε να τερματιστεί κάποτε ο βρόχος. Αυτό το τονίσαμε και στην παρουσίαση του βρόχου while.
Εάν γράψουμε το προηγούμενο παράδειγμα, με βρόχο do:
#include <iostream>
void main()
{
 int n ;
 cout << "Για τέλος δώσε 0 "<< endl;
 do
 {
   cout << "Δώσε έναν ακέραιο αριθμό: ";
   cin >> n ;
   cout << "Πληκτρολόγησες: "<<n <<endl;
 }
 while (n != 0);
}

Δώστε προσοχή στη μη αρχικοποίηση της μεταβλητής n, σε αντίθεση με το προηγούμενο παράδειγμα. Στο βρόχο while, η μεταβλητή που συμμετέχει στη λογική συνθήκη θα πρέπει να έχει ήδη λάβει τιμή, ώστε να εκτιμηθεί η συνθήκη ως αληθής ή ψευδής.

Σελίδα4 - Μεταπήδηση του ελέγχου
Εντολή break
Η εντολή break προκαλεί έξοδο από ένα βρόχο. Χρησιμοποιείται για να τερματίζει έναν βρόχο πριν από το φυσικό τέλος του.
Στο επόμενο παράδειγμα ένας βρόχος for ξεκινά να εμφανίσει στην οθόνη τους αριθμούς από το 10 έως το 1. Όταν φτάνει όμως στο 3 η εντολή break μέσα στο if προκαλεί την έξοδο από το βρόχο.
// break example
#include <iostream.h>
void main ()
{
 int n;
 for (n=10; n>0; n--)
 {
   cout << n << endl;
   if (n==3)
   {
    cout<<"Αντίστροφη μέτρηση διακόπηκε";
    break;
   }
 }
}
Εντολή continue
Η εντολή continue προκαλεί τη διακοπή εκτέλεσης των εντολών του βρόχου και τη μεταβίβαση του ελέγχου του προγράμματος στην εξέταση της λογικής συνθήκης, ώστε να εκτελεστεί η επόμενη επανάληψη.
Στο επόμενο παράδειγμα ο βρόχος for εμφανίζει τους αριθμούς από το 10 έως το 1. Όταν φτάνει όμως στο 3, η εντολή continue μέσα στο if αναγκάζει τον έλεγχο να μεταβεί στην αρχή του βρόχου και τη συνέχισή του με την επόμενη επανάληψη. Έτσι το 3 δεν εμφανίζεται στην οθόνη.
// continue example
#include <iostream.h>
void main ()
{
  for (int n=10; n>0; n--)
  {
    if (n==3) continue;
    cout << n << endl;
  }
  cout << "Τέλος";
}