Η απόφαση της απόφασης |
Πώς θα μπορούσαμε να παράγουμε ένα μόνο μήνυμα στο πρόγραμμα γιά την τιμή 2 του μετρητή; Θα πρέπει, εάν αληθεύει η πρώτη συνθήκη, να μην εκτελείται καθόλου η δεύτερη πρόταση if. Αυτό μπορεί να επιτευχθεί με την ενσωμάτωση της δεύτερης πρότασης if σε έναν κλάδο else έτσι ώστε να εκτελεσθεί μόνον εάν η πρώτη συνθήκη δεν επαληθευτεί. Πρόκειται γιά μιά αρκετά συνηθισμένη δομή πολυεπίπεδου if που χρησιμοποιείται γιά τη λήψη σύνθετων αποφάσεων της μορφής 'Αν Α τότε Β αλλοιώς άν Γ τότε Δ ...'. Το πολυεπίπεδο if-else παρουσιάζεται με τη βοήθεια του προγράμματος που είναι αποθηκευμένο στο αρχείο NESTIF.C. Να σημειωθεί οτι οχι μόνο ο κλάδος else αλλά και ο κλάδος if θα μπορούσε να περιέχει μιά νέα πρόταση if, και οι νέες προτάσεις if να περιέχουν νέα if, κ.ο.κ οδηγώντας σε οσοδήποτε πολύπλοκα δένδρα αποφάσεων. Η εκτέλεση του νέου προγράμματος διαφέρει από τη προηγούμενη κατά μία γραμμή. Data is now 0, which is less than 5 Data is now 1, which is less than 5 Data is now equal to 2 Data is now 3, which is less than 5 Data is now 4, which is less than 5 Data is now 5, which is greater than 4 Data is now 6, which is greater than 4 Data is now 7, which is greater than 4 Data is now 8, which is greater than 4 Data is now 9, which is greater than 4 |
Το ξεκρέμαστο ELSE |
Ένα κλασσικό πρόβλημα στη μετάφραση πολυεπίπεδων if-else είναι η ορθή σύνδεση ενός κλάδου else με τον αντίστοιχο κλάδο if. Το πρόβλημα αυτό είναι γνωστό στη βιβλιογραφία ως 'το ξεκρέμαστο (dangling) else'. Ο γενικός κανόνας είναι οτι όταν υπάρχουν πολλαπλές προτάσεις if τότε ένας κλάδος else συνδέεται με το πλησιέστερο προηγούμενο κλάδο if εκτός εάν οι οριοθέτες (αγκύλες) ορίζουν διαφορετικά. Ας επιστρέψουμε στο πρόγραμμα IFELSE.C και στη δομή του σώματος της επανάληψης που φαίνεται στο αριστερό τμήμα του σχήματος που ακολουθεί. Σύμφωνα με το γενικό κανόνα ο κλάδος else συνδέεται με το δεύτερο if, το οποίο εκτελείται ακολουθιακά μετά το τέλος του πρώτου if. Άν τώρα η αγκύλη που οριοθετεί τη σύνθετη πρόταση του πρώτου if μετατεθεί (σημειώνεται με το σχόλιο /* ** */) τότε στη δομή του κεντρικού τμήματος ο κλάδος else συνδέεται με το πρώτο if ενώ το δεύτερο if εντάσσεται στην σύνθετη πρόταση του πρώτου if. Η νέα μετάθεση της αγκύλης στο τέλος οδηγεί στη δομή που φαίνεται στο αριστερό άκρο του σχήματος. Ο κλάδος else έχει συνδεθεί πάλι με το δεύτερο if αλλά τώρα ολόκληρη η πρόταση if-else εντάσσεται στην σύνθετη πρόταση του πρώτου if. Η μεταβολή κλάδου ακολουθεί σύμφωνα. Αντίθετα, στη δομή του κεντρικού τμήματος if (έκφραση) { if (έκφραση) { if (έκφραση) { πρόταση; πρόταση; πρόταση; ... ... ... πρόταση; πρόταση; πρόταση; } /* ** */ if (έκφραση) { if (έκφραση) { if (έκφραση) { πρόταση; πρόταση; πρόταση; ... ... ... πρόταση; πρόταση; πρόταση; } } } } /* ** */ else { else { else { πρόταση; πρόταση; πρόταση; ... ... ... πρόταση; πρόταση; πρόταση; } } } } /* ** */ Παρόμοιους πειραματισμούς μπορεί κανείς να πραγματοποιήσει μετακινώντας αντίστοιχα και τη λέξη κλειδί else στο πρόγραμμα NESTIF.C και εξετάζοντας διάφορους συνδυασμούς πολυεπίπεδων if-else. |
![]() |
![]() |
![]() |