🔍 Εκσφαλμάτωση λογικών λαθών στις δομές επιλογής
Στις δομές επιλογής μπορούν να εμφανιστούν λογικά λάθη που συνήθως σχετίζονται με:
- Τις συνθήκες που ελέγχονται.
- Τις ομάδες εντολών που εκτελούνται όταν η συνθήκη είναι αληθής ή ψευδής.
Συχνά, τα λανθασμένα αποτελέσματα οφείλονται σε λάθος τιμές από προηγούμενες εντολές, οι οποίες επηρεάζουν τη συνθήκη.
🧑🏫 Παράδειγμα 4 – Λογικά λάθη σε δομή επιλογής
Η εκφώνηση περιγράφει ένα πρόγραμμα που διαβάζει την ηλικία ενός επιβάτη και υπολογίζει την τιμή του εισιτηρίου ανάλογα με την ηλικία του. Εάν η ηλικία είναι πάνω από 18, ο επιβάτης πληρώνει κανονικό εισιτήριο 1€. Διαφορετικά, πληρώνει μισό εισιτήριο.
💻 Κώδικας Προγράμματος σε ΓΛΩΣΣΑ [5.7]
ΠΡΟΓΡΑΜΜΑ Αντίτιμο_εισιτηρίου ΣΤΑΘΕΡΕΣ Κανονικό_εισιτήριο = 1 ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: ηλικία ΠΡΑΓΜΑΤΙΚΕΣ: Αντίτιμο ΑΡΧΗ ΓΡΑΨΕ 'Δώσε ηλικία' ΔΙΑΒΑΣΕ ηλικία ΑΝ ηλικία > 18 ΤΟΤΕ Αντίτιμο <- Κανονικό_εισιτήριο ΑΛΛΙΩΣ Αντίτιμο <- 0.5*Κανονικό_εισιτήριο ΤΕΛΟΣ_ΑΝ ΓΡΑΨΕ 'Το αντίτιμο του εισιτηρίου είναι:', Αντίτιμο ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
❗ Απάντηση
Τιμές εισόδου για έλεγχο
| Α/Α | Τιμή εισόδου (Ηλικία) | Αναμενόμενο αποτέλεσμα (Αντίτιμο) | Αποτέλεσμα συνθήκης ηλικία > 18 | Τιμή μεταβλητής Αντίτιμο | Ορθότητα αποτελέσματος |
|---|---|---|---|---|---|
| 1 | 17 | 0.5 | ψευδής | 0.5 | Σωστό |
| 2 | 18 | 0.5 | ψευδής | 0.5 | Λάθος |
| 3 | 19 | 1 | αληθής | 1 | Σωστό |
Συμπέρασμα - Προτάσεις διόρθωσης
Το πρόγραμμα εμφανίζει λάθος αποτέλεσμα όταν η ηλικία είναι 18. Αυτό συμβαίνει γιατί η συνθήκη ηλικία > 18 πρέπει να γίνει ηλικία >= 18 για να καλύπτει σωστά την περίπτωση των 18 ετών.
💧 Παράδειγμα Χρέωσης Ύδρευσης
Ας δούμε ένα άλλο παράδειγμα για τον υπολογισμό χρέωσης ύδρευσης με βάση τα κυβικά που καταναλώθηκαν. Ο υπολογισμός γίνεται κλιμακωτά ανάλογα με την ποσότητα κατανάλωσης.
💻 Κώδικας Προγράμματος Χρέωσης Ύδρευσης
ΠΡΟΓΡΑΜΜΑ Χρέωση_ύδρευσης ΣΤΑΘΕΡΕΣ πάγιο = 8 ΜΕΤΑΒΛΗΤΕΣ ΠΡΑΓΜΑΤΙΚΕΣ: κυβικά, οφειλή ΑΡΧΗ ΓΡΑΨΕ 'Δώσε τα κυβικά που καταναλώθηκαν' ΔΙΑΒΑΣΕ κυβικά ΑΝ κυβικά < 0 ΤΟΤΕ ΓΡΑΨΕ 'Μη αποδεκτή τιμή.' ΑΛΛΙΩΣ_ΑΝ κυβικά < 10 ΤΟΤΕ οφειλή <- 8 + κυβικά*0.4 ΑΛΛΙΩΣ_ΑΝ κυβικά <= 20 ΤΟΤΕ οφειλή <- 8 + 10*0.4 + (κυβικά - 10)*0.5 ΑΛΛΙΩΣ οφειλή <- 8 + 10*0.4 + 10*0.5 + (κυβικά - 20)*0.6 ΤΕΛΟΣ_ΑΝ ΓΡΑΨΕ 'Οφειλή=', οφειλή ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Τιμές εισόδου και αποτελέσματα
| Α/Α | Τιμή εισόδου (κυβικά) | Αληθής συνθήκη (1η στη σειρά) | Αναμενόμενο αποτέλεσμα (Οφειλή) | Έξοδος προγράμματος | Ορθότητα αποτελέσματος |
|---|---|---|---|---|---|
| 1 | -1 | ΑΝ κυβικά < 0 | Μη αποδεκτή τιμή | Μη αποδεκτή τιμή | Σωστό |
| 2 | 0 | ΑΛΛΙΩΣ_ΑΝ κυβικά < 10 | 8 | 8 | Σωστό |
| 3 | 8 | ΑΛΛΙΩΣ_ΑΝ κυβικά < 10 | 8 + 8*0.4 = 8+3.2 = 11.2 | 11.2 | Σωστό |
| 4 | 10 | ΑΛΛΙΩΣ_ΑΝ κυβικά <= 20 | 8 + 10*0.4 = 12 | 12 | Σωστό |
| 5 | 15 | ΑΛΛΙΩΣ_ΑΝ κυβικά <= 20 | 12 + 5*0.5 = 14.5 | 14.5 | Σωστό |
| 6 | 20 | ΑΛΛΙΩΣ_ΑΝ κυβικά <= 20 | 12 + 10*0.5 = 17 | 17 | Σωστό |
| 7 | 21 | ΑΛΛΙΩΣ | 17 + 1*0.6 = 17.6 | 9.6 | Λάθος |
Συμπεράσματα - Προτάσεις διορθώσεων
Η τιμή εισόδου 21 οδηγεί σε λανθασμένο αποτέλεσμα. Η εντολή στην 18η γραμμή χρειάζεται διόρθωση.
Προτεινόμενη Διόρθωση [5.9]
οφειλή <- 8 + 10*0.4 + 10*0.5 + (κυβικά - 20)*0.6
Παρατήρηση:
Όταν η μεταβλητή κυβικά έχει τιμή 10, οι συνθήκες κυβικά < 10 και κυβικά <= 10 έχουν το ίδιο αποτέλεσμα.