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

       
Σελίδα1 - ΕΠΙΛΟΓΗ ΔΡΟΜΟΥ, Η ΠΡΟΤΑΣΗ if

Ένα πρόγραμμα το οποίο θα εκτελεί κάθε φορά τις ίδιες εντολές, με την ίδια σειρά δεν είναι και πάρα πολύ χρήσιμο. Τα προγράμματα που δημιουργούμε θα πρέπει να αλληλεπιδρούν με το περιβάλλον και για διαφορετικά δεδομένα εισόδου να εμφανίζουν διαφορετικά δεδομένα εξόδου. Θα πρέπει λοιπόν να μπορούν να παίρνουν αποφάσεις εκτιμώντας μια συνθήκη και να επιλέγουν τον κατάλληλο «δρόμο». Όπου οι διαφορετικοί δρόμοι είναι διαφορετικές ομάδες εντολών.
Σε ένα πρόγραμμα μία απόφαση προκαλεί ένα άλμα προς ένα άλλο μέρος του προγράμματος, ανάλογα με την τιμή μιας παράστασης. Στη C++ οι αποφάσεις μπορούν να παρθούν με διάφορους τρόπους. Ο πιο σημαντικός είναι με την πρόταση if … else, που διαλέγει μεταξύ δύο εναλλακτικών καταστάσεων. Μία άλλη πρόταση απόφασης η switch, δημιουργεί κλάδους για πολλές ομάδες εντολών, ανάλογα με την τιμή μιας μεταβλητής.
Η ΠΡΟΤΑΣΗ if
Η πρόταση if είναι η απλούστερη μορφή απόφασης. Η δεσμευμένη λέξη if ακολουθείται από μία λογική συνθήκη σε παρενθέσεις.
(Είδαμε προηγουμένως ότι οι λογικές συνθήκες σχηματίζονται από τρία μέρη: δύο παραστάσεις στα άκρα και στη μέση έναν συγκριτικό τελεστή που συγκρίνει τις τιμές τους. Το αποτέλεσμα θα είναι είτε αλήθεια (true) είτε ψέμα (false). Δεν υπάρχει κάποιο άλλο ενδεχόμενο αποτέλεσμα και δεν είναι φυσικά δυνατόν να ισχύουν και τα δύο.)
if (Λογική Συνθήκη) εντολή;


Έτσι σε περίπτωση που η λογική συνθήκη είναι αληθής τότε θα εκτελεστεί η εντολή. Διαφορετικά ο έλεγχος του προγράμματος θα συνεχιστεί παρακάτω και από την εντολή if δεν θα εκτελεστεί καμία εντολή ως αποτέλεσμά της.
Για παράδειγμα:
if (x == 100)
   cout << "x is 100";
Έτσι εάν η μεταβλητή x φέρει την τιμή 100 τότε η λογική συνθήκη μέσα στην παρένθεση μετά τη λέξη if είναι αληθής. Επομένως η εντολή που ακολουθεί θα εκτελεστεί και το μήνυμα μέσα στα εισαγωγικά θα εμφανιστεί στην οθόνη. Σε περίπτωση που η μεταβλητή x δεν είναι 100, τότε η εντολή που ακολουθεί δεν θα εκτελεστεί και δεν θα εμφανιστεί το μήνυμα στην οθόνη.
Σε περίπτωση που θέλουμε με την επαλήθευση μιας λογικής συνθήκης να εκτελεστούν παραπάνω από μία εντολές, τότε τις περικλείουμε σε άγκιστρα:
if (Λογική Συνθήκη)
{
  εντολή1;
  εντολή2;
...
}
Τα άγκιστρα οριοθετούν ένα κομμάτι κώδικα. Είναι σαν ένα περιτύλιγμα να «πιάνει» και να ομαδοποιεί πολλές εντολές. Έτσι εάν η λογική συνθήκη είναι αληθής, το αποτέλεσμα θα είναι να εκτελεστούν όλες οι εντολές που βρίσκονται μέσα στα άγκιστρα.
if (x == 100)
{
  cout << "x is ";
  cout << x;
}
Είπαμε προηγουμένως ότι εάν η λογική συνθήκη είναι ψευδής τότε ο έλεγχος του προγράμματος θα μεταβιβαστεί μετά την εντολή if. Καμία από τις εντολές που ακολουθούν τη λογική συνθήκη δεν θα εκτελεστεί. Η εντολή if δεν θα επιφέρει τίποτα σε αυτή την περίπτωση.
Εάν θέλουμε όμως να γίνεται κάτι, όταν η λογική συνθήκη είναι ψευδής τότε αυτό θα το περιλάβουμε μετά τη λέξη else.
Έτσι η γενική μορφή της εντολής ελέγχου if είναι:
if (Λογική Συνθήκη)
  εντολή1;
else
  εντολή2;
Εάν η λογική συνθήκη είναι αληθής, θα εκτελεστεί μόνο η εντολή1 και το πρόγραμμα θα συνεχιστεί. Εάν η λογική συνθήκη είναι ψευδής τότε θα εκτελεστεί μόνο η εντολή2. Πχ.
if (x == 100)
  cout << "x is 100";
else
  cout << "x is not 100";
Φυσικά εάν θέλουμε με την εκτίμηση της λογικής συνθήκης να εκτελούνται πολλές εντολές μαζί, τότε θα τις εσωκλείσουμε μέσα σε άγκιστρα.
Ένθετα if…else
Πολλές φορές χρειάζεται να ελέγξουμε ένα εύρος τιμών για μια μεταβλητή και δεν είμαστε ικανοποιημένοι με τις δύο περιπτώσεις (true ή false) της λογικής συνθήκης. Έτσι τοποθετούμε προτάσεις if…else μέσα στην αρχική πρόταση. Το ακόλουθο παράδειγμα ελέγχει την τιμή της μεταβλητής x:
if (x > 0)
  cout << "x is positive";
else if (x < 0)
  cout << "x is negative";
else
  cout << "x is 0";
Εάν η λογική συνθήκη είναι ψευδής, δηλαδή το x δεν είναι μεγαλύτερο από 0, τότε εφαρμόζουμε ένα δεύτερο έλεγχο με μία νέα πρόταση if. Έτσι εάν το x είναι μικρότερο από 0 θα εμφανιστεί το κατάλληλο μήνυμα. Εάν δεν ισχύει ούτε η δεύτερη συνθήκη, δηλαδή το x δεν είναι ούτε μεγαλύτερο από 0 ούτε μικρότερο από 0, τότε προφανώς θα είναι 0. Έτσι με το τελευταίο else δεν χρειάζεται να κάνουμε νέο έλεγχο.
Θα πρέπει να θυμηθείτε από τα προηγούμενα ότι όταν μία λογική συνθήκη εκτιμηθεί (ως true ή false) και εκτελεστούν οι κατάλληλες εντολές, ο έλεγχος του προγράμματος συνεχίζεται μετά το τέλος της πρότασης if, (δηλαδή μετά τις εντολές του else). Έτσι και στην περίπτωση των ένθετων προτάσεων if, όταν μία λογική συνθήκη εκτιμηθεί ως αληθής, θα εκτελεστούν οι εντολές που αντιστοιχούν σε αυτή και ο έλεγχος θα βγει έξω από όλες τις ένθετες προτάσεις if.
Αντιστοίχιση του else
Υπάρχει ένας κίνδυνος με τις ένθετες προτάσεις if: μπορεί από απροσεξία να αντιστοιχίσετε ένα else σε λάθος if. Ο κανόνας που θα πρέπει να θυμάστε ώστε να μην συμβεί κάτι τέτοιο είναι: το else αντιστοιχίζεται με το τελευταίο if που δεν έχει δικό του else.
Το τελευταίο παράδειγμα θα μπορούσα να το γράψω με την εξής μορφή:
if (x > 0)
  cout << "x is positive";
else
    if (x < 0)
      cout << "x is negative";
    else
      cout << "x is 0";
ώστε να μπορέσετε να καταλάβετε ότι το τελευταίο else αντιστοιχίζεται στο τελευταίο if και όχι στο πρώτο.
Το επόμενο παράδειγμα ζητά από τον χρήστη τρεις τιμές τις οποίες αποθηκεύει στις μεταβλητές a, b και c. Στη συνέχεια ελέγχει εάν οι τρεις μεταβλητές έχουν την ίδια τιμή.
#include <iostream>
void main()
{
//Δήλωση μεταβλητών
int a, b, c; //Μεταβλητή τύπου float
//προτροπή εισαγωγής δεδομένων
cout<< "Δώστε a, b και c "<<endl;

cin>> a >> b >> c ; //εισαγωγή δεδομένων
if (a==b)
   if (b==c)
      cout<< "τα a, b και c είναι ίδια";
else
      cout<< "τα a και b είναι διαφορετικά";
}
Παρατηρήστε την λάθος αντιστοίχιση του τελευταίου else. Μη σας μπερδεύει που το τοποθέτησα κάτω από το πρώτο if, στο δεύτερο ανήκει. Το μήνυμα «τα a και b είναι διαφορετικά» εμφανίζεται όταν το b είναι διαφορετικό του c. Όμως για να φτάσει ο έλεγχος στο δεύτερο if, σημαίνει πως η λογική συνθήκη του πρώτου if είναι αληθής (δηλαδή a ίσο με b).
Εάν επιθυμούμε να αντιστοιχίσουμε το else στην πρώτη πρόταση if, τότε θα τοποθετήσουμε τις εντολές που ακολουθούν την πρώτη λογική συνθήκη μέσα σε άγκιστρα:
if (a==b)
{
   if (b==c)
     cout<< "τα a, b και c είναι ίδια";
}
else
   cout<< "τα a και b είναι διαφορετικά";
Τώρα το else αντιστοιχίζεται στην πρώτη πρόταση if. Τα άγκιστρα κάνουν ότι υπάρχει μέσα τους, να είναι αόρατο για το else που ακολουθεί.